Bladeren bron

feat: reset password

Muhammad Iqbal Afandi 3 jaren geleden
bovenliggende
commit
5cbd1023fd

+ 8
- 0
app/Http/Controllers/UserController.php Bestand weergeven

35
                     'name' => $user->name,
35
                     'name' => $user->name,
36
                     'username' => $user->username,
36
                     'username' => $user->username,
37
                     'role' => $user->role->name,
37
                     'role' => $user->role->name,
38
+                    'role_id' => $user->role_id,
38
                     'status' => $user->status
39
                     'status' => $user->status
39
                 ])
40
                 ])
40
         ]);
41
         ]);
185
 
186
 
186
         return back()->with('success', __('messages.success.update.change_password'));
187
         return back()->with('success', __('messages.success.update.change_password'));
187
     }
188
     }
189
+
190
+    public function resetPassword(User $user)
191
+    {
192
+        $user->update(['password' => bcrypt('12345678')]);
193
+
194
+        return back()->with('success', __('passwords.reset'));
195
+    }
188
 }
196
 }

+ 3
- 2
public/js/resources_js_pages_Users_Edit_vue.js Bestand weergeven

1271
             icon: "pi pi-trash",
1271
             icon: "pi pi-trash",
1272
             "class": "p-button-outlined p-button-danger",
1272
             "class": "p-button-outlined p-button-danger",
1273
             onClick: $setup.onDeleteUser
1273
             onClick: $setup.onDeleteUser
1274
-          })) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_10, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppButtonLink"], {
1274
+          })) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_10, [$props.user.role_id !== 1 ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)($setup["AppButtonLink"], {
1275
+            key: 0,
1275
             label: "Blokir",
1276
             label: "Blokir",
1276
             icon: "pi pi-ban",
1277
             icon: "pi pi-ban",
1277
             method: "delete",
1278
             method: "delete",
1279
             href: _ctx.route('users.block', $props.user.id)
1280
             href: _ctx.route('users.block', $props.user.id)
1280
           }, null, 8
1281
           }, null, 8
1281
           /* PROPS */
1282
           /* PROPS */
1282
-          , ["href"]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1283
+          , ["href"])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1283
             label: "Simpan",
1284
             label: "Simpan",
1284
             "class": "p-button-outlined",
1285
             "class": "p-button-outlined",
1285
             icon: "pi pi-check",
1286
             icon: "pi pi-check",

+ 55
- 14
public/js/resources_js_pages_Users_Index_vue.js Bestand weergeven

322
 /* harmony import */ var _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @inertiajs/inertia-vue3 */ "./node_modules/@inertiajs/inertia-vue3/dist/index.js");
322
 /* harmony import */ var _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @inertiajs/inertia-vue3 */ "./node_modules/@inertiajs/inertia-vue3/dist/index.js");
323
 /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash */ "./node_modules/lodash/lodash.js");
323
 /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash */ "./node_modules/lodash/lodash.js");
324
 /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_3__);
324
 /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_3__);
325
-/* harmony import */ var _tableHeader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tableHeader */ "./resources/js/pages/Users/tableHeader.js");
326
-/* harmony import */ var _components_useSearchText__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/useSearchText */ "./resources/js/components/useSearchText.js");
327
-/* harmony import */ var _layouts_DashboardLayout_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/layouts/DashboardLayout.vue */ "./resources/js/layouts/DashboardLayout.vue");
328
-/* harmony import */ var _components_AppButtonLink_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/components/AppButtonLink.vue */ "./resources/js/components/AppButtonLink.vue");
329
-/* harmony import */ var _components_AppPagination_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/components/AppPagination.vue */ "./resources/js/components/AppPagination.vue");
325
+/* harmony import */ var primevue_useconfirm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! primevue/useconfirm */ "./node_modules/primevue/useconfirm/useconfirm.esm.js");
326
+/* harmony import */ var _tableHeader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tableHeader */ "./resources/js/pages/Users/tableHeader.js");
327
+/* harmony import */ var _components_useSearchText__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/components/useSearchText */ "./resources/js/components/useSearchText.js");
328
+/* harmony import */ var _layouts_DashboardLayout_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/layouts/DashboardLayout.vue */ "./resources/js/layouts/DashboardLayout.vue");
329
+/* harmony import */ var _components_AppButtonLink_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/components/AppButtonLink.vue */ "./resources/js/components/AppButtonLink.vue");
330
+/* harmony import */ var _components_AppPagination_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/components/AppPagination.vue */ "./resources/js/components/AppPagination.vue");
331
+
330
 
332
 
331
 
333
 
332
 
334
 
347
     expose();
349
     expose();
348
     var props = __props;
350
     var props = __props;
349
 
351
 
350
-    var _useSearchText = (0,_components_useSearchText__WEBPACK_IMPORTED_MODULE_5__.useSearchText)(props),
352
+    var _useSearchText = (0,_components_useSearchText__WEBPACK_IMPORTED_MODULE_6__.useSearchText)(props),
351
         search = _useSearchText.search;
353
         search = _useSearchText.search;
352
 
354
 
353
     (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(search, function () {
355
     (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(search, function () {
357
         preserveState: true
359
         preserveState: true
358
       });
360
       });
359
     });
361
     });
362
+    var resetConfirm = (0,primevue_useconfirm__WEBPACK_IMPORTED_MODULE_4__.useConfirm)();
363
+
364
+    var onResetPassword = function onResetPassword(data) {
365
+      resetConfirm.require({
366
+        message: "Yakin mereset kata sandi (".concat(data.name, ") ?"),
367
+        header: 'Reset Kata Sandi',
368
+        acceptLabel: 'Iya',
369
+        rejectLabel: 'Tidak',
370
+        accept: function accept() {
371
+          _inertiajs_inertia__WEBPACK_IMPORTED_MODULE_1__.Inertia.put(route('users.reset-password', data.id));
372
+        },
373
+        reject: function reject() {
374
+          resetConfirm.close();
375
+        }
376
+      });
377
+    };
378
+
360
     var __returned__ = {
379
     var __returned__ = {
361
       props: props,
380
       props: props,
362
       search: search,
381
       search: search,
382
+      resetConfirm: resetConfirm,
383
+      onResetPassword: onResetPassword,
363
       watch: vue__WEBPACK_IMPORTED_MODULE_0__.watch,
384
       watch: vue__WEBPACK_IMPORTED_MODULE_0__.watch,
364
       Inertia: _inertiajs_inertia__WEBPACK_IMPORTED_MODULE_1__.Inertia,
385
       Inertia: _inertiajs_inertia__WEBPACK_IMPORTED_MODULE_1__.Inertia,
365
       Head: _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.Head,
386
       Head: _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.Head,
366
       pickBy: lodash__WEBPACK_IMPORTED_MODULE_3__.pickBy,
387
       pickBy: lodash__WEBPACK_IMPORTED_MODULE_3__.pickBy,
367
-      tableHeader: _tableHeader__WEBPACK_IMPORTED_MODULE_4__["default"],
368
-      useSearchText: _components_useSearchText__WEBPACK_IMPORTED_MODULE_5__.useSearchText,
369
-      DashboardLayout: _layouts_DashboardLayout_vue__WEBPACK_IMPORTED_MODULE_6__["default"],
370
-      AppButtonLink: _components_AppButtonLink_vue__WEBPACK_IMPORTED_MODULE_7__["default"],
371
-      AppPagination: _components_AppPagination_vue__WEBPACK_IMPORTED_MODULE_8__["default"]
388
+      useConfirm: primevue_useconfirm__WEBPACK_IMPORTED_MODULE_4__.useConfirm,
389
+      tableHeader: _tableHeader__WEBPACK_IMPORTED_MODULE_5__["default"],
390
+      useSearchText: _components_useSearchText__WEBPACK_IMPORTED_MODULE_6__.useSearchText,
391
+      DashboardLayout: _layouts_DashboardLayout_vue__WEBPACK_IMPORTED_MODULE_7__["default"],
392
+      AppButtonLink: _components_AppButtonLink_vue__WEBPACK_IMPORTED_MODULE_8__["default"],
393
+      AppPagination: _components_AppPagination_vue__WEBPACK_IMPORTED_MODULE_9__["default"]
372
     };
394
     };
373
     Object.defineProperty(__returned__, '__isScriptSetup', {
395
     Object.defineProperty(__returned__, '__isScriptSetup', {
374
       enumerable: false,
396
       enumerable: false,
981
   "class": "col-12 md:col-4 flex flex-column md:flex-row justify-content-end"
1003
   "class": "col-12 md:col-4 flex flex-column md:flex-row justify-content-end"
982
 };
1004
 };
983
 function render(_ctx, _cache, $props, $setup, $data, $options) {
1005
 function render(_ctx, _cache, $props, $setup, $data, $options) {
1006
+  var _component_ConfirmDialog = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("ConfirmDialog");
1007
+
984
   var _component_InputText = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("InputText");
1008
   var _component_InputText = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("InputText");
985
 
1009
 
986
   var _component_Column = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Column");
1010
   var _component_Column = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Column");
987
 
1011
 
1012
+  var _component_Button = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Button");
1013
+
988
   var _component_DataTable = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("DataTable");
1014
   var _component_DataTable = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("DataTable");
989
 
1015
 
1016
+  var _directive_tooltip = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveDirective)("tooltip");
1017
+
990
   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"], {
1018
   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"], {
991
     title: "Daftar User"
1019
     title: "Daftar User"
992
   }), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["DashboardLayout"], null, {
1020
   }), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["DashboardLayout"], null, {
993
     "default": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1021
     "default": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
994
-      return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_DataTable, {
1022
+      return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_ConfirmDialog), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_DataTable, {
995
         responsiveLayout: "scroll",
1023
         responsiveLayout: "scroll",
996
         columnResizeMode: "expand",
1024
         columnResizeMode: "expand",
997
         value: $props.users.data,
1025
         value: $props.users.data,
1031
           )), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Column, null, {
1059
           )), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Column, null, {
1032
             body: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (_ref) {
1060
             body: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (_ref) {
1033
               var data = _ref.data;
1061
               var data = _ref.data;
1034
-              return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppButtonLink"], {
1062
+              return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppButtonLink"], {
1035
                 icon: "pi pi-pencil",
1063
                 icon: "pi pi-pencil",
1036
                 "class": "p-button-icon-only p-button-rounded p-button-text",
1064
                 "class": "p-button-icon-only p-button-rounded p-button-text",
1037
                 href: _ctx.route('users.edit', data.id)
1065
                 href: _ctx.route('users.edit', data.id)
1038
               }, null, 8
1066
               }, null, 8
1039
               /* PROPS */
1067
               /* PROPS */
1040
-              , ["href"])];
1068
+              , ["href"]), [[_directive_tooltip, 'Ubah User', void 0, {
1069
+                bottom: true
1070
+              }]]), data.role_id !== 1 ? (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)(((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_Button, {
1071
+                key: 0,
1072
+                icon: "pi pi-key",
1073
+                "class": "p-button-icon-only p-button-rounded p-button-text",
1074
+                onClick: function onClick($event) {
1075
+                  return $setup.onResetPassword(data);
1076
+                }
1077
+              }, null, 8
1078
+              /* PROPS */
1079
+              , ["onClick"])), [[_directive_tooltip, 'Reset Kata Sandi', void 0, {
1080
+                bottom: true
1081
+              }]]) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true)];
1041
             }),
1082
             }),
1042
             _: 1
1083
             _: 1
1043
             /* STABLE */
1084
             /* STABLE */

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

58513
 /******/ 		// This function allow to reference async chunks
58513
 /******/ 		// This function allow to reference async chunks
58514
 /******/ 		__webpack_require__.u = (chunkId) => {
58514
 /******/ 		__webpack_require__.u = (chunkId) => {
58515
 /******/ 			// return url for filenames based on template
58515
 /******/ 			// return url for filenames based on template
58516
-/******/ 			return "js/" + chunkId + ".js?id=" + {"node_modules_chart_js_auto_auto_esm_js":"9296b829a7757dee","resources_js_pages_Auth_Login_vue":"cb7d9267c0b9275e","resources_js_pages_Customers_Index_vue":"efe10709977e56ba","resources_js_pages_Dashboards_Index_vue":"a565c1bfb1fb63b9","resources_js_pages_Purchases_Index_vue":"72cc6e7458a3c247","resources_js_pages_Sales_Index_vue":"bb75c1753cd4dfae","resources_js_pages_StockProducts_Index_vue":"8360688f3422c96f","resources_js_pages_Suppliers_Index_vue":"1c1d93b70b6e91ff","resources_js_pages_Users_Create_vue":"aff43d9484b673e5","resources_js_pages_Users_Edit_vue":"36baa4decc0ecd9c","resources_js_pages_Users_Index_vue":"91e95659c4fcc5be","resources_js_pages_Users_Show_vue":"f3f98d81ef28f6d1","resources_js_pages_Users_tableHeader_js":"48f19bd820caf015"}[chunkId] + "";
58516
+/******/ 			return "js/" + chunkId + ".js?id=" + {"node_modules_chart_js_auto_auto_esm_js":"9296b829a7757dee","resources_js_pages_Auth_Login_vue":"cb7d9267c0b9275e","resources_js_pages_Customers_Index_vue":"efe10709977e56ba","resources_js_pages_Dashboards_Index_vue":"a565c1bfb1fb63b9","resources_js_pages_Purchases_Index_vue":"72cc6e7458a3c247","resources_js_pages_Sales_Index_vue":"bb75c1753cd4dfae","resources_js_pages_StockProducts_Index_vue":"8360688f3422c96f","resources_js_pages_Suppliers_Index_vue":"1c1d93b70b6e91ff","resources_js_pages_Users_Create_vue":"aff43d9484b673e5","resources_js_pages_Users_Edit_vue":"3583ea5c3f44678e","resources_js_pages_Users_Index_vue":"7ca9635e398fbaa7","resources_js_pages_Users_Show_vue":"f3f98d81ef28f6d1","resources_js_pages_Users_tableHeader_js":"48f19bd820caf015"}[chunkId] + "";
58517
 /******/ 		};
58517
 /******/ 		};
58518
 /******/ 	})();
58518
 /******/ 	})();
58519
 /******/ 	
58519
 /******/ 	

+ 1
- 0
resources/js/pages/Users/Edit.vue Bestand weergeven

105
                 class="col-12 md:col-6 flex flex-column md:flex-row justify-content-center md:justify-content-end"
105
                 class="col-12 md:col-6 flex flex-column md:flex-row justify-content-center md:justify-content-end"
106
               >
106
               >
107
                 <AppButtonLink
107
                 <AppButtonLink
108
+                  v-if="user.role_id !== 1"
108
                   label="Blokir"
109
                   label="Blokir"
109
                   icon="pi pi-ban"
110
                   icon="pi pi-ban"
110
                   method="delete"
111
                   method="delete"

+ 29
- 0
resources/js/pages/Users/Index.vue Bestand weergeven

3
 import { Inertia } from '@inertiajs/inertia'
3
 import { Inertia } from '@inertiajs/inertia'
4
 import { Head } from '@inertiajs/inertia-vue3'
4
 import { Head } from '@inertiajs/inertia-vue3'
5
 import { pickBy } from 'lodash'
5
 import { pickBy } from 'lodash'
6
+import { useConfirm } from 'primevue/useconfirm'
6
 import tableHeader from './tableHeader'
7
 import tableHeader from './tableHeader'
7
 import { useSearchText } from '@/components/useSearchText'
8
 import { useSearchText } from '@/components/useSearchText'
8
 import DashboardLayout from '@/layouts/DashboardLayout.vue'
9
 import DashboardLayout from '@/layouts/DashboardLayout.vue'
21
     preserveState: true,
22
     preserveState: true,
22
   })
23
   })
23
 })
24
 })
25
+
26
+const resetConfirm = useConfirm()
27
+
28
+const onResetPassword = (data) => {
29
+  resetConfirm.require({
30
+    message: `Yakin mereset kata sandi (${data.name}) ?`,
31
+    header: 'Reset Kata Sandi',
32
+    acceptLabel: 'Iya',
33
+    rejectLabel: 'Tidak',
34
+    accept: () => {
35
+      Inertia.put(route('users.reset-password', data.id))
36
+    },
37
+    reject: () => {
38
+      resetConfirm.close()
39
+    },
40
+  })
41
+}
24
 </script>
42
 </script>
25
 
43
 
26
 <template>
44
 <template>
27
   <Head title="Daftar User" />
45
   <Head title="Daftar User" />
28
 
46
 
29
   <DashboardLayout>
47
   <DashboardLayout>
48
+    <ConfirmDialog></ConfirmDialog>
49
+
30
     <DataTable
50
     <DataTable
31
       responsiveLayout="scroll"
51
       responsiveLayout="scroll"
32
       columnResizeMode="expand"
52
       columnResizeMode="expand"
73
           <AppButtonLink
93
           <AppButtonLink
74
             icon="pi pi-pencil"
94
             icon="pi pi-pencil"
75
             class="p-button-icon-only p-button-rounded p-button-text"
95
             class="p-button-icon-only p-button-rounded p-button-text"
96
+            v-tooltip.bottom="'Ubah User'"
76
             :href="route('users.edit', data.id)"
97
             :href="route('users.edit', data.id)"
77
           />
98
           />
99
+
100
+          <Button
101
+            v-if="data.role_id !== 1"
102
+            icon="pi pi-key"
103
+            class="p-button-icon-only p-button-rounded p-button-text"
104
+            v-tooltip.bottom="'Reset Kata Sandi'"
105
+            @click="onResetPassword(data)"
106
+          />
78
         </template>
107
         </template>
79
       </Column>
108
       </Column>
80
     </DataTable>
109
     </DataTable>

+ 5
- 0
routes/web.php Bestand weergeven

25
 
25
 
26
     Route::get('/dashboards', DashboardController::class);
26
     Route::get('/dashboards', DashboardController::class);
27
 
27
 
28
+    Route::put('/users/reset-password/{user}', [UserController::class, 'resetPassword'])
29
+        ->name('users.reset-password');
30
+
28
     Route::delete('/users/block/{user}', [UserController::class, 'block'])
31
     Route::delete('/users/block/{user}', [UserController::class, 'block'])
29
         ->name('users.block');
32
         ->name('users.block');
33
+
30
     Route::post('/users/change-password/{user}', [UserController::class, 'changePassword'])
34
     Route::post('/users/change-password/{user}', [UserController::class, 'changePassword'])
31
         ->name('users.change-password');
35
         ->name('users.change-password');
36
+
32
     Route::resource('/users', UserController::class);
37
     Route::resource('/users', UserController::class);
33
 
38
 
34
     Route::resource('/customers', CustomerController::class);
39
     Route::resource('/customers', CustomerController::class);