Browse Source

Add replacement user selection on user deletion dialog

Available user selection must be same gender with deleted user
pull/16/head
Nafies Luthfi 8 years ago
parent
commit
7320893924
  1. 36
      app/Http/Controllers/UsersController.php
  2. 4
      resources/lang/id/user.php
  3. 6
      resources/lang/id/validation.php
  4. 44
      resources/views/users/edit.blade.php
  5. 117
      tests/Feature/UsersDeletionTest.php

36
app/Http/Controllers/UsersController.php

@ -2,6 +2,7 @@
namespace App\Http\Controllers;
use DB;
use Storage;
use App\User;
use App\Couple;
@ -106,7 +107,12 @@ class UsersController extends Controller
{
$this->authorize('edit', $user);
return view('users.edit', compact('user'));
$replacementUsers = [];
if (request('action') == 'delete') {
$replacementUsers = User::where('gender_id', $user->gender_id)->pluck('nickname', 'id');
}
return view('users.edit', compact('user', 'replacementUsers'));
}
/**
@ -170,6 +176,34 @@ class UsersController extends Controller
{
$this->authorize('delete', $user);
if ($request->has('replace_delete_button')) {
$attributes = $request->validate([
'replacement_user_id' => 'required|exists:users,id',
], [
'replacement_user_id.required' => __('validation.user.replacement_user_id.required'),
]);
DB::beginTransaction();
$oldUserId = $user->id;
DB::table('users')->where('father_id', $oldUserId)->update([
'father_id' => $attributes['replacement_user_id'],
]);
DB::table('users')->where('mother_id', $oldUserId)->update([
'mother_id' => $attributes['replacement_user_id'],
]);
DB::table('users')->where('manager_id', $oldUserId)->update([
'manager_id' => $attributes['replacement_user_id'],
]);
$user->delete();
DB::commit();
return redirect()->route('users.show', $attributes['replacement_user_id']);
}
request()->validate([
'user_id' => 'required',
]);

4
resources/lang/id/user.php

@ -58,4 +58,8 @@ return [
'childs_count' => 'Jumlah Anak',
'managed_user' => 'Jumlah User Dikelola',
'managed_couple' => 'Jumlah Pasangan Dikelola',
'replacement' => 'User Pengganti',
'replace_confirm' => 'Anda yakin mengganti dan menghapus user ini?',
'replace_delete_text' => 'Anda memilih user lain sebagai pengganti?',
'replace_delete_button' => 'Ganti dan Hapus User',
];

6
resources/lang/id/validation.php

@ -99,9 +99,9 @@ return [
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
'user' => [
'replacement_user_id' => [
'required' => 'Wajib dipilih.',
],
],

44
resources/views/users/edit.blade.php

@ -14,21 +14,37 @@
<tr><td>{{ __('user.gender') }}</td><td>{{ $user->gender }}</td></tr>
<tr><td>{{ __('user.father') }}</td><td>{{ $user->father_id ? $user->father->name : '' }}</td></tr>
<tr><td>{{ __('user.mother') }}</td><td>{{ $user->mother_id ? $user->mother->name : '' }}</td></tr>
<tr><td>{{ __('user.childs_count') }}</td><td>{{ $user->childs()->count() }}</td></tr>
<tr><td>{{ __('user.spouses_count') }}</td><td>{{ $user->marriages()->count() }}</td></tr>
<tr><td>{{ __('user.managed_user') }}</td><td>{{ $user->managedUsers()->count() }}</td></tr>
<tr><td>{{ __('user.managed_couple') }}</td><td>{{ $user->managedCouples()->count() }}</td></tr>
<tr><td>{{ __('user.childs_count') }}</td><td>{{ $dependentCount = $user->childs()->count() }}</td></tr>
<tr><td>{{ __('user.spouses_count') }}</td><td>{{ $dependentCount += $user->marriages()->count() }}</td></tr>
<tr><td>{{ __('user.managed_user') }}</td><td>{{ $dependentCount += $user->managedUsers()->count() }}</td></tr>
<tr><td>{{ __('user.managed_couple') }}</td><td>{{ $dependentCount += $user->managedCouples()->count() }}</td></tr>
</table>
</div>
<div class="panel-body">{{ __('user.delete_confirm') }}</div>
<div class="panel-footer">
{!! FormField::delete(
['route' => ['users.destroy', $user]],
__('user.delete_confirm_button'),
['class'=>'btn btn-danger'],
['user_id' => $user->id]
) !!}
{{ link_to_route('users.edit', __('app.cancel'), [$user], ['class' => 'btn btn-default']) }}
@if ($dependentCount)
{{ __('user.replace_delete_text') }}
{{ Form::open([
'route' => ['users.destroy', $user],
'method' => 'delete',
'onsubmit' => 'return confirm("'.__('user.replace_confirm').'")',
]) }}
{!! FormField::select('replacement_user_id', $replacementUsers, [
'label' => false,
'placeholder' => __('user.replacement'),
]) !!}
{{ Form::submit(__('user.replace_delete_button'), [
'name' => 'replace_delete_button',
'class' => 'btn btn-danger',
]) }}
{{ link_to_route('users.edit', __('app.cancel'), [$user], ['class' => 'btn btn-default pull-right']) }}
{{ Form::close() }}
@else
{!! FormField::delete(
['route' => ['users.destroy', $user]],
__('user.delete_confirm_button'),
['class' => 'btn btn-danger'],
['user_id' => $user->id]
) !!}
{{ link_to_route('users.edit', __('app.cancel'), [$user], ['class' => 'btn btn-default']) }}
@endif
</div>
</div>
</div>

117
tests/Feature/UsersDeletionTest.php

@ -29,4 +29,121 @@ class UsersDeletionTest extends TestCase
'id' => $user->id,
]);
}
/** @test */
public function manager_can_delete_a_user_the_replace_childs_father_id()
{
$manager = $this->loginAsUser();
$oldUser = factory(User::class)->create([
'gender_id' => 1,
'manager_id' => $manager->id,
]);
$oldUserChild = factory(User::class)->create(['father_id' => $oldUser->id]);
$replacementUser = factory(User::class)->create([
'gender_id' => 1,
'manager_id' => $manager->id,
]);
$this->visit(route('users.edit', $oldUser));
$this->seeElement('a', ['id' => 'del-user-'.$oldUser->id]);
$this->click('del-user-'.$oldUser->id);
$this->seePageIs(route('users.edit', [$oldUser, 'action' => 'delete']));
$this->see(__('user.replace_delete_text'));
$this->submitForm(__('user.replace_delete_button'), [
'replacement_user_id' => $replacementUser->id,
]);
$this->dontSeeInDatabase('users', [
'id' => $oldUser->id,
]);
$this->dontSeeInDatabase('users', [
'father_id' => $oldUser->id,
]);
$this->seeInDatabase('users', [
'id' => $oldUserChild->id,
'father_id' => $replacementUser->id,
]);
}
/** @test */
public function manager_can_delete_a_user_the_replace_childs_mother_id()
{
$manager = $this->loginAsUser();
$oldUser = factory(User::class)->create([
'gender_id' => 2,
'manager_id' => $manager->id,
]);
$oldUserChild = factory(User::class)->create(['mother_id' => $oldUser->id]);
$replacementUser = factory(User::class)->create([
'gender_id' => 2,
'manager_id' => $manager->id,
]);
$this->visit(route('users.edit', $oldUser));
$this->seeElement('a', ['id' => 'del-user-'.$oldUser->id]);
$this->click('del-user-'.$oldUser->id);
$this->seePageIs(route('users.edit', [$oldUser, 'action' => 'delete']));
$this->see(__('user.replace_delete_text'));
$this->submitForm(__('user.replace_delete_button'), [
'replacement_user_id' => $replacementUser->id,
]);
$this->dontSeeInDatabase('users', [
'id' => $oldUser->id,
]);
$this->dontSeeInDatabase('users', [
'mother_id' => $oldUser->id,
]);
$this->seeInDatabase('users', [
'id' => $oldUserChild->id,
'mother_id' => $replacementUser->id,
]);
}
/** @test */
public function manager_can_delete_a_user_the_replace_childs_manager_id()
{
$manager = $this->loginAsUser();
$oldUser = factory(User::class)->create([
'gender_id' => 1,
'manager_id' => $manager->id,
]);
$oldUserManagedUser = factory(User::class)->create(['manager_id' => $oldUser->id]);
$replacementUser = factory(User::class)->create([
'gender_id' => 1,
'manager_id' => $manager->id,
]);
$this->visit(route('users.edit', $oldUser));
$this->seeElement('a', ['id' => 'del-user-'.$oldUser->id]);
$this->click('del-user-'.$oldUser->id);
$this->seePageIs(route('users.edit', [$oldUser, 'action' => 'delete']));
$this->see(__('user.replace_delete_text'));
$this->submitForm(__('user.replace_delete_button'), [
'replacement_user_id' => $replacementUser->id,
]);
$this->dontSeeInDatabase('users', [
'id' => $oldUser->id,
]);
$this->dontSeeInDatabase('users', [
'manager_id' => $oldUser->id,
]);
$this->seeInDatabase('users', [
'id' => $oldUserManagedUser->id,
'manager_id' => $replacementUser->id,
]);
}
}
Loading…
Cancel
Save