From d22480dcb84d14b20c7604fb584f3541fb7b26f3 Mon Sep 17 00:00:00 2001 From: Juan Pablo Vial Date: Mon, 12 May 2025 19:44:16 -0400 Subject: [PATCH] User edit and delete --- app/resources/routes/api/admin/users.php | 6 +- app/resources/views/admin/users.blade.php | 125 ++++++++++++++++++++-- 2 files changed, 121 insertions(+), 10 deletions(-) diff --git a/app/resources/routes/api/admin/users.php b/app/resources/routes/api/admin/users.php index b05b43d..4160b5c 100644 --- a/app/resources/routes/api/admin/users.php +++ b/app/resources/routes/api/admin/users.php @@ -2,5 +2,9 @@ use Incoviba\Controller\API\Admin\Users; $app->group('/users', function($app) { - $app->post('/add[/]', Users::class . ':add'); + $app->post('/add[/]', [Users::class, 'add']); +}); +$app->group('/user/{user_id}', function($app) { + $app->post('/edit[/]', [Users::class, 'edit']); + $app->delete('[/]', [Users::class, 'delete']); }); diff --git a/app/resources/views/admin/users.blade.php b/app/resources/views/admin/users.blade.php index cf98844..d0339bf 100644 --- a/app/resources/views/admin/users.blade.php +++ b/app/resources/views/admin/users.blade.php @@ -14,15 +14,15 @@ - + @foreach($users as $user) - + {{ $user->name }} - - @@ -50,6 +50,10 @@ +
+ + +
@@ -62,6 +66,45 @@
+ @endsection @include('layout.body.scripts.cryptojs') @@ -74,12 +117,20 @@ return [passphrase, encrypted.toString()].join('') } $(document).ready(function () { - $('#create-user-modal').modal({ + const $createUserModal = $('#create-user-modal') + $createUserModal.modal({ onApprove: function() { + const form = document.querySelector('#create-user-modal form') + const password = form.querySelector('[name="password"]').value + const password_confirmation = form.querySelector('[name="password_confirmation"]').value + if (password !== password_confirmation) { + alert('Las contraseñas no coinciden') + return + } const url = '{{$urls->api}}/admin/users/add' const method = 'post' - const body = new FormData(document.querySelector('#create-user-modal form')) - body.set('password', encryptPassword(body.get('password'))) + const body = new FormData(form) + body.set('password', encryptPassword(password)) fetchAPI(url, {method, body}).then(response => { if (!response) { return; @@ -92,8 +143,64 @@ }) } }) - $('#create-user-button').on('click', function () { - $('#create-user-modal').modal('show') + const $editUserModal = $('#edit-user-modal') + $editUserModal.modal({ + onApprove: function() { + const form = document.querySelector('#edit-user-modal form') + const user_id = form.querySelector('[name="id"]').value + const old_password = form.querySelector('[name="old_password"]').value + const password = form.querySelector('[name="password"]').value + const password_confirmation = form.querySelector('[name="password_confirmation"]').value + if (password !== password_confirmation) { + alert('Las nuevas contraseñas no coinciden') + return + } + const url = `{{$urls->api}}/admin/user/${user_id}/edit` + const method = 'post' + const body = new FormData(form) + body.set('old_password', encryptPassword(old_password)) + body.set('password', encryptPassword(password)) + if (form.querySelector('[name="force"]').checked) { + body.set('force', 'true') + } + fetchAPI(url, {method, body}).then(response => { + if (!response) { + return; + } + response.json().then(result => { + if (result.success) { + location.reload() + } + }) + }) + } + }) + document.getElementById('create-user-modal').addEventListener('submit', event => { + $createUserModal.modal('show') + }) + document.querySelectorAll('.button.edit').forEach(button => { + button.addEventListener('click', clickEvent => { + const user_id = clickEvent.currentTarget.dataset.user + $editUserModal.find('input[name="id"]').val(user_id) + $editUserModal.modal('show') + }) + }) + document.querySelectorAll('.button.remove').forEach(button => { + button.addEventListener('click', clickEvent => { + const user_id = clickEvent.currentTarget.dataset.user + const url = `{{$urls->api}}/admin/user/${user_id}` + const method = 'delete' + fetchAPI(url, {method}).then(response => { + if (!response) { + return; + } + response.json().then(result => { + if (result.success) { + location.reload() + } + }) + }) + }) }) });