Browse Source

Added user management, auth and user lang files

pull/6/head
Nafies Luthfi 9 years ago
parent
commit
a5e7b0a5fb
  1. 82
      app/Http/Controllers/UsersController.php
  2. 2
      app/User.php
  3. 14
      database/factories/ModelFactory.php
  4. 28
      resources/lang/id/auth.php
  5. 28
      resources/lang/id/user.php
  6. 1
      resources/views/layouts/partials/top-nav.blade.php
  7. 38
      resources/views/users/index.blade.php
  8. 38
      resources/views/users/partials/forms.blade.php
  9. 5
      routes/web.php
  10. 2
      tests/Feature/Cart/SearchProductsTest.php
  11. 114
      tests/Feature/ManageUsersTest.php

82
app/Http/Controllers/UsersController.php

@ -0,0 +1,82 @@
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
class UsersController extends Controller
{
public function index(Request $request)
{
$editableUser = null;
$users = User::get();
if (in_array($request->get('action'), ['edit', 'delete']) && $request->has('id')) {
$editableUser = User::find($request->get('id'));
}
return view('users.index', compact('users', 'editableUser'));
}
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required|max:60',
'username' => 'required|max:30',
'password' => 'nullable|between:5,15',
]);
$newUserData = $request->only('name','username');
if ($request->has('password'))
$newUserData['password'] = $request->get('password');
else
$newUserData['password'] = 'rahasia';
$user = User::create($newUserData);
flash(trans('user.created'), 'success');
return redirect()->route('users.index');
}
public function update(Request $request, $userId)
{
$this->validate($request, [
'name' => 'required|max:60',
'username' => 'required|max:30|unique:users,username,' . $request->segment(2),
'password' => 'nullable|between:5,15',
]);
$userData = $request->only('name','username');
if ($request->has('password'))
$userData['password'] = $request->get('password');
User::findOrFail($userId)->update($userData);
flash(trans('user.updated'), 'success');
return redirect()->route('users.index');
}
public function destroy(Request $request, User $user)
{
$this->validate($request, [
'user_id' => 'required|exists:users,id|not_exists:transactions,user_id',
], [
'user_id.not_exists' => trans('user.undeleted'),
]);
if ($request->get('user_id') == $user->id && $user->delete()) {
flash(trans('user.deleted'), 'success');
return redirect()->route('users.index');
}
flash(trans('user.undeleted'), 'error');
return back();
}
}

2
app/User.php

@ -15,7 +15,7 @@ class User extends Authenticatable
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
'name', 'username', 'password',
];
/**

14
database/factories/ModelFactory.php

@ -28,3 +28,17 @@ $factory->define(App\Unit::class, function (Faker\Generator $faker) {
'name' => $faker->name,
];
});
/* @var \Illuminate\Database\Eloquent\Factory $factory */
$factory->define(App\Transaction::class, function (Faker\Generator $faker) {
return [
'user_id' => function() {
return factory(App\User::class)->create()->id;
},
'invoice_no' => str_random(5),
'items' => [],
'customer' => [],
'payment' => 1000,
'total' => 1000,
];
});

28
resources/lang/id/auth.php

@ -0,0 +1,28 @@
<?php
return [
'failed' => 'Identitas tersebut tidak cocok dengan data kami.',
'throttle' => 'Terlalu banyak usaha masuk. Silahkan coba lagi dalam :seconds detik.',
'username' => 'Username',
'password' => 'Password',
'login' => 'Login',
'remember_me' => 'Ingat Login Saya',
'logout' => 'Keluar',
'profile' => 'Profil Saya',
'register' => 'Buat Akun Baru',
'have_an_account' => 'Saya sudah punya Akun',
'need_account' => 'Belum punya Akun?',
'change_password' => 'Ganti Password',
'forgot_password' => 'Lupa Password?',
'reset_password' => 'Reset Password',
'password_confirmation' => 'Ulangi Password',
'old_password' => 'Password Lama',
'new_password' => 'Password Baru',
'new_password_confirmation' => 'Ulangi Password Baru',
'send_reset_password_link' => 'Kirim Link Reset Password',
'old_password_failed' => 'Password lama tidak cocok!',
'old_password_success' => 'Password berhasil diubah!',
'welcome_please_login' => 'Selamat datang, silakan login',
'welcome' => 'Selamat datang kembali :name.',
];

28
resources/lang/id/user.php

@ -0,0 +1,28 @@
<?php
return [
// Labels
'uset' => 'User',
'list' => 'Daftar User',
'search' => 'Cari User',
'not_found' => 'User tidak ditemukan',
'empty' => 'Belum ada User',
'back_to_index' => 'Kembali ke daftar User',
// Actions
'create' => 'Input User Baru',
'created' => 'Input User baru telah berhasil.',
'show' => 'Detail User',
'edit' => 'Edit User',
'update' => 'Update User',
'updated' => 'Update data User telah berhasil.',
'delete' => 'Hapus User',
'delete_confirm' => 'Anda yakin akan menghapus User ini?',
'deleted' => 'Hapus data User telah berhasil.',
'undeleted' => 'Data User gagal dihapus.',
'undeleteable' => 'Data User tidak dapat dihapus.',
// Attributes
'name' => 'Nama User',
'username' => 'Username',
];

1
resources/views/layouts/partials/top-nav.blade.php

@ -53,6 +53,7 @@
</a>
<ul class="dropdown-menu" role="menu">
<li>{{ link_to_route('users.index', trans('user.list')) }}</li>
<li>
<a href="{{ route('logout') }}"
onclick="event.preventDefault();

38
resources/views/users/index.blade.php

@ -0,0 +1,38 @@
@extends('layouts.app')
@section('title', trans('user.list'))
@section('content')
<h3 class="page-header">{{ trans('user.list') }}</h3>
<div class="row">
<div class="col-md-8">
<div class="panel panel-default table-responsive">
<table class="table table-condensed">
<thead>
<tr>
<th class="text-center">{{ trans('app.table_no') }}</th>
<th>{{ trans('user.name') }}</th>
<th>{{ trans('user.username') }}</th>
<th class="text-center">{{ trans('app.action') }}</th>
</tr>
</thead>
<tbody>
@foreach($users as $key => $user)
<tr>
<td class="text-center">{{ 1 + $key }}</td>
<td>{{ $user->name }}</td>
<td>{{ $user->username }}</td>
<td class="text-center">
{!! link_to_route('users.index', trans('app.edit'), ['action' => 'edit', 'id' => $user->id], ['id' => 'edit-user-' . $user->id]) !!} |
{!! link_to_route('users.index', trans('app.delete'), ['action' => 'delete', 'id' => $user->id], ['id' => 'del-user-' . $user->id]) !!}
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
<div class="col-md-4">@include('users.partials.forms')</div>
</div>
@endsection

38
resources/views/users/partials/forms.blade.php

@ -0,0 +1,38 @@
@if (! Request::has('action'))
{{ link_to_route('users.index', trans('user.create'), ['action' => 'create'], ['class' => 'btn btn-success pull-right']) }}
@endif
@if (Request::get('action') == 'create')
{!! Form::open(['route' => 'users.store']) !!}
{!! FormField::text('name', ['label' => trans('user.name'), 'required' => true]) !!}
{!! FormField::text('username', ['label' => trans('user.username'), 'required' => true]) !!}
{!! FormField::password('password', ['label' => trans('auth.password'), 'info' => ['text' => 'Kosongkan jika menggunakan password default: <strong>rahasia</strong>']]) !!}
{!! Form::submit(trans('user.create'), ['class' => 'btn btn-success']) !!}
{{ link_to_route('users.index', trans('app.cancel'), [], ['class' => 'btn btn-default']) }}
{!! Form::close() !!}
@endif
@if (Request::get('action') == 'edit' && $editableUser)
{!! Form::model($editableUser, ['route' => ['users.update', $editableUser->id],'method' => 'patch']) !!}
{!! FormField::text('name', ['label' => trans('user.name'), 'required' => true]) !!}
{!! FormField::text('username', ['label' => trans('user.username'), 'required' => true]) !!}
{!! FormField::password('password', ['label' => trans('auth.password'), 'info' => ['text' => 'Isi untuk mengganti password.']]) !!}
{!! Form::submit(trans('user.update'), ['class' => 'btn btn-success']) !!}
{{ link_to_route('users.index', trans('app.cancel'), [], ['class' => 'btn btn-default']) }}
{!! Form::close() !!}
@endif
@if (Request::get('action') == 'delete' && $editableUser)
<div class="panel panel-default">
<div class="panel-heading"><h3 class="panel-title">{{ trans('user.delete') }}</h3></div>
<div class="panel-body">
<label class="control-label">{{ trans('user.name') }}</label>
<p>{{ $editableUser->name }}</p>
<p>{{ $editableUser->username }}</p>
{!! $errors->first('user_id', '<span class="form-error small">:message</span>') !!}
<hr>
{{ trans('user.delete_confirm') }}
</div>
<div class="panel-footer">
{!! FormField::delete(['route'=>['users.destroy',$editableUser->id]], trans('app.delete_confirm_button'), ['class'=>'btn btn-danger'], ['user_id'=>$editableUser->id]) !!}
{{ link_to_route('users.index', trans('app.cancel'), [], ['class' => 'btn btn-default']) }}
</div>
</div>
@endif

5
routes/web.php

@ -53,6 +53,11 @@ Route::group(['middleware' => 'auth'], function () {
Route::resource('units', 'UnitsController', ['except' => ['create', 'show', 'edit']]);
/*
* Users Routes
*/
Route::resource('users', 'UsersController', ['except' => ['create', 'show', 'edit']]);
/*
* Transactions Routes
*/
Route::get('transactions', ['as' => 'transactions.index', 'uses' => 'TransactionsController@index']);

2
tests/Feature/Cart/SearchProductsTest.php

@ -15,7 +15,7 @@ class SearchProductsTest extends TestCase
/** @test */
public function retrieving_product_list_by_ajax_post_request()
{
$this->disableExceptionHandling();
// $this->disableExceptionHandling();
factory(Product::class)->create(['name' => 'Hemaviton']);
factory(Product::class)->create(['name' => 'Zee']);
$product1 = factory(Product::class)->create(['name' => 'Bisolvon 1', 'cash_price' => 2000, 'credit_price' => 2100]);

114
tests/Feature/ManageUsersTest.php

@ -0,0 +1,114 @@
<?php
namespace Tests\Feature;
use App\User;
use App\Transaction;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Tests\BrowserKitTestCase;
class ManageUsersTest extends BrowserKitTestCase
{
use DatabaseMigrations;
/** @test */
public function user_can_see_user_list()
{
$user1 = factory(User::class)->create(['name' => 'Testing 123']);
$user2 = factory(User::class)->create(['name' => 'Testing 456']);
$this->loginAsUser();
$this->visit(route('users.index'));
$this->see($user1->name);
$this->see($user2->name);
}
/** @test */
public function user_can_create_a_user()
{
$this->loginAsUser();
$this->visit(route('users.index'));
$this->click(trans('user.create'));
$this->seePageIs(route('users.index', ['action' => 'create']));
$this->type('User 1', 'name');
$this->type('username', 'username');
$this->type('rahasia', 'password');
$this->press(trans('user.create'));
$this->see(trans('user.created'));
$this->seePageIs(route('users.index'));
$this->seeInDatabase('users', [
'name' => 'User 1',
'username' => 'username',
]);
}
/** @test */
public function user_can_edit_a_user()
{
$this->loginAsUser();
$user = factory(User::class)->create();
$this->visit(route('users.index'));
$this->click('edit-user-'.$user->id);
$this->seePageIs(route('users.index', ['action' => 'edit', 'id' => $user->id]));
$this->type('User 1', 'name');
$this->type('username', 'username');
$this->press(trans('user.update'));
$this->see(trans('user.updated'));
$this->seePageIs(route('users.index'));
$this->seeInDatabase('users', [
'id' => $user->id,
'name' => 'User 1',
'username' => 'username',
]);
}
/** @test */
public function user_can_delete_a_user()
{
$this->loginAsUser();
$user = factory(User::class)->create();
$this->visit(route('users.index'));
$this->click('del-user-'.$user->id);
$this->seePageIs(route('users.index', ['action' => 'delete', 'id' => $user->id]));
$this->seeInDatabase('users', [
'id' => $user->id,
]);
$this->press(trans('app.delete_confirm_button'));
$this->dontSeeInDatabase('users', [
'id' => $user->id,
]);
}
/** @test */
public function user_can_not_delete_a_user_that_has_product()
{
$this->loginAsUser();
$product = factory(Transaction::class)->create();
$userId = $product->user_id;
$this->visit(route('users.index'));
$this->click('del-user-'.$userId);
$this->seePageIs(route('users.index', ['action' => 'delete', 'id' => $userId]));
$this->press(trans('app.delete_confirm_button'));
$this->see(trans('user.undeleted'));
$this->seePageIs(route('users.index', ['action' => 'delete', 'id' => $userId]));
$this->seeInDatabase('users', [
'id' => $userId,
]);
}
}
Loading…
Cancel
Save