Bläddra i källkod

feat: reset password

Muhammad Iqbal Afandi 3 år sedan
förälder
incheckning
5cbd1023fd

+ 8
- 0
app/Http/Controllers/UserController.php Visa fil

@@ -35,6 +35,7 @@ class UserController extends Controller
35 35
                     'name' => $user->name,
36 36
                     'username' => $user->username,
37 37
                     'role' => $user->role->name,
38
+                    'role_id' => $user->role_id,
38 39
                     'status' => $user->status
39 40
                 ])
40 41
         ]);
@@ -185,4 +186,11 @@ class UserController extends Controller
185 186
 
186 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 Visa fil

@@ -1271,7 +1271,8 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1271 1271
             icon: "pi pi-trash",
1272 1272
             "class": "p-button-outlined p-button-danger",
1273 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 1276
             label: "Blokir",
1276 1277
             icon: "pi pi-ban",
1277 1278
             method: "delete",
@@ -1279,7 +1280,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1279 1280
             href: _ctx.route('users.block', $props.user.id)
1280 1281
           }, null, 8
1281 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 1284
             label: "Simpan",
1284 1285
             "class": "p-button-outlined",
1285 1286
             icon: "pi pi-check",

+ 55
- 14
public/js/resources_js_pages_Users_Index_vue.js Visa fil

@@ -322,11 +322,13 @@ __webpack_require__.r(__webpack_exports__);
322 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 323
 /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash */ "./node_modules/lodash/lodash.js");
324 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,7 +349,7 @@ __webpack_require__.r(__webpack_exports__);
347 349
     expose();
348 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 353
         search = _useSearchText.search;
352 354
 
353 355
     (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(search, function () {
@@ -357,18 +359,38 @@ __webpack_require__.r(__webpack_exports__);
357 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 379
     var __returned__ = {
361 380
       props: props,
362 381
       search: search,
382
+      resetConfirm: resetConfirm,
383
+      onResetPassword: onResetPassword,
363 384
       watch: vue__WEBPACK_IMPORTED_MODULE_0__.watch,
364 385
       Inertia: _inertiajs_inertia__WEBPACK_IMPORTED_MODULE_1__.Inertia,
365 386
       Head: _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.Head,
366 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 395
     Object.defineProperty(__returned__, '__isScriptSetup', {
374 396
       enumerable: false,
@@ -981,17 +1003,23 @@ var _hoisted_5 = {
981 1003
   "class": "col-12 md:col-4 flex flex-column md:flex-row justify-content-end"
982 1004
 };
983 1005
 function render(_ctx, _cache, $props, $setup, $data, $options) {
1006
+  var _component_ConfirmDialog = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("ConfirmDialog");
1007
+
984 1008
   var _component_InputText = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("InputText");
985 1009
 
986 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 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 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 1019
     title: "Daftar User"
992 1020
   }), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["DashboardLayout"], null, {
993 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 1023
         responsiveLayout: "scroll",
996 1024
         columnResizeMode: "expand",
997 1025
         value: $props.users.data,
@@ -1031,13 +1059,26 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1031 1059
           )), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Column, null, {
1032 1060
             body: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (_ref) {
1033 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 1063
                 icon: "pi pi-pencil",
1036 1064
                 "class": "p-button-icon-only p-button-rounded p-button-text",
1037 1065
                 href: _ctx.route('users.edit', data.id)
1038 1066
               }, null, 8
1039 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 1083
             _: 1
1043 1084
             /* STABLE */

+ 1
- 1
public/js/vue.js Visa fil

@@ -58513,7 +58513,7 @@ module.exports = JSON.parse('{"name":"axios","version":"0.21.4","description":"P
58513 58513
 /******/ 		// This function allow to reference async chunks
58514 58514
 /******/ 		__webpack_require__.u = (chunkId) => {
58515 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 Visa fil

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

+ 29
- 0
resources/js/pages/Users/Index.vue Visa fil

@@ -3,6 +3,7 @@ import { watch } from 'vue'
3 3
 import { Inertia } from '@inertiajs/inertia'
4 4
 import { Head } from '@inertiajs/inertia-vue3'
5 5
 import { pickBy } from 'lodash'
6
+import { useConfirm } from 'primevue/useconfirm'
6 7
 import tableHeader from './tableHeader'
7 8
 import { useSearchText } from '@/components/useSearchText'
8 9
 import DashboardLayout from '@/layouts/DashboardLayout.vue'
@@ -21,12 +22,31 @@ watch(search, () => {
21 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 42
 </script>
25 43
 
26 44
 <template>
27 45
   <Head title="Daftar User" />
28 46
 
29 47
   <DashboardLayout>
48
+    <ConfirmDialog></ConfirmDialog>
49
+
30 50
     <DataTable
31 51
       responsiveLayout="scroll"
32 52
       columnResizeMode="expand"
@@ -73,8 +93,17 @@ watch(search, () => {
73 93
           <AppButtonLink
74 94
             icon="pi pi-pencil"
75 95
             class="p-button-icon-only p-button-rounded p-button-text"
96
+            v-tooltip.bottom="'Ubah User'"
76 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 107
         </template>
79 108
       </Column>
80 109
     </DataTable>

+ 5
- 0
routes/web.php Visa fil

@@ -25,10 +25,15 @@ Route::middleware(['auth', 'verified'])->group(function () {
25 25
 
26 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 31
     Route::delete('/users/block/{user}', [UserController::class, 'block'])
29 32
         ->name('users.block');
33
+
30 34
     Route::post('/users/change-password/{user}', [UserController::class, 'changePassword'])
31 35
         ->name('users.change-password');
36
+
32 37
     Route::resource('/users', UserController::class);
33 38
 
34 39
     Route::resource('/customers', CustomerController::class);