Browse Source

Added user auth scaffold and prepare families action forms

pull/3/head
Nafies Luthfi 9 years ago
parent
commit
2247bb5ff2
  1. 2
      app/Http/Controllers/Auth/RegisterController.php
  2. 28
      app/Http/Controllers/HomeController.php
  3. 9
      app/User.php
  4. 3
      composer.json
  5. 96
      composer.lock
  6. 11
      config/app.php
  7. 4
      config/database.php
  8. 68
      resources/views/auth/login.blade.php
  9. 46
      resources/views/auth/passwords/email.blade.php
  10. 76
      resources/views/auth/passwords/reset.blade.php
  11. 98
      resources/views/auth/register.blade.php
  12. 96
      resources/views/home.blade.php
  13. 80
      resources/views/layouts/app.blade.php
  14. 5
      routes/web.php
  15. 0
      storage/app/.gitignore
  16. 0
      storage/app/public/.gitignore
  17. 0
      storage/framework/.gitignore
  18. 0
      storage/framework/cache/.gitignore
  19. 0
      storage/framework/sessions/.gitignore
  20. 0
      storage/framework/testing/.gitignore
  21. 0
      storage/framework/views/.gitignore
  22. 0
      storage/logs/.gitignore
  23. 25
      tests/Feature/ManageUserFamiliesTest.php
  24. 1
      tests/TestCase.php

2
app/Http/Controllers/Auth/RegisterController.php

@ -63,7 +63,9 @@ class RegisterController extends Controller
protected function create(array $data)
{
return User::create([
'nickname' => $data['nickname'],
'name' => $data['name'],
'gender_id' => $data['gender_id'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);

28
app/Http/Controllers/HomeController.php

@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HomeController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('home', ['currentUser' => auth()->user()]);
}
}

9
app/User.php

@ -31,6 +31,15 @@ class User extends Authenticatable
'password', 'remember_token',
];
protected $appends = [
'gender',
];
public function getGenderAttribute()
{
return $this->gender_id == 1 ? 'Laki-laki' : 'Perempuan';
}
public function setFather(User $father)
{
if ($father->gender_id === 1) {

3
composer.json

@ -7,7 +7,8 @@
"require": {
"php": ">=5.6.4",
"laravel/framework": "5.4.*",
"laravel/tinker": "~1.0"
"laravel/tinker": "~1.0",
"luthfi/formfield": "^0.1.6"
},
"require-dev": {
"fzaninotto/faker": "~1.4",

96
composer.lock

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"content-hash": "94fcb27cd278a47e83dea7f310cfe69e",
"content-hash": "27fbe283b6f1d75a727cf51cee225967",
"packages": [
{
"name": "dnoegel/php-xdg-base-dir",
@ -428,6 +428,60 @@
"time": "2017-06-01T16:31:26+00:00"
},
{
"name": "laravelcollective/html",
"version": "v5.4.8",
"source": {
"type": "git",
"url": "https://github.com/LaravelCollective/html.git",
"reference": "9b8f51e7a2368911c896f5d42757886bae0717b5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/LaravelCollective/html/zipball/9b8f51e7a2368911c896f5d42757886bae0717b5",
"reference": "9b8f51e7a2368911c896f5d42757886bae0717b5",
"shasum": ""
},
"require": {
"illuminate/http": "5.4.*",
"illuminate/routing": "5.4.*",
"illuminate/session": "5.4.*",
"illuminate/support": "5.4.*",
"illuminate/view": "5.4.*",
"php": ">=5.6.4"
},
"require-dev": {
"illuminate/database": "5.4.*",
"mockery/mockery": "~0.9.4",
"phpunit/phpunit": "~5.4"
},
"type": "library",
"autoload": {
"psr-4": {
"Collective\\Html\\": "src/"
},
"files": [
"src/helpers.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Taylor Otwell",
"email": "taylorotwell@gmail.com"
},
{
"name": "Adam Engebretson",
"email": "adam@laravelcollective.com"
}
],
"description": "HTML and Form Builders for the Laravel Framework",
"homepage": "http://laravelcollective.com",
"time": "2017-05-22T06:35:07+00:00"
},
{
"name": "league/flysystem",
"version": "1.0.40",
"source": {
@ -511,6 +565,46 @@
"time": "2017-04-28T10:15:08+00:00"
},
{
"name": "luthfi/formfield",
"version": "0.1.6",
"source": {
"type": "git",
"url": "https://github.com/nafiesl/FormField.git",
"reference": "dfbbae8f86f6d332a9f548ad6cebc77e2c66810f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nafiesl/FormField/zipball/dfbbae8f86f6d332a9f548ad6cebc77e2c66810f",
"reference": "dfbbae8f86f6d332a9f548ad6cebc77e2c66810f",
"shasum": ""
},
"require": {
"illuminate/support": "5.3.* || 5.4.*",
"laravelcollective/html": "5.3.* || 5.4.*"
},
"require-dev": {
"orchestra/testbench": "~3.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Luthfi\\FormField\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nafies Luthfi",
"email": "nafiesl@gmail.com"
}
],
"description": "Form Field helper class for Laravel 5.3 with Twitter Bootstrap",
"time": "2017-06-16T03:22:15+00:00"
},
{
"name": "monolog/monolog",
"version": "1.23.0",
"source": {

11
config/app.php

@ -64,7 +64,7 @@ return [
|
*/
'timezone' => 'UTC',
'timezone' => 'Asia/Makassar',
/*
|--------------------------------------------------------------------------
@ -77,7 +77,7 @@ return [
|
*/
'locale' => 'en',
'locale' => 'id',
/*
|--------------------------------------------------------------------------
@ -120,7 +120,7 @@ return [
|
*/
'log' => env('APP_LOG', 'single'),
'log' => env('APP_LOG', 'daily'),
'log_level' => env('APP_LOG_LEVEL', 'debug'),
@ -167,6 +167,7 @@ return [
* Package Service Providers...
*/
Laravel\Tinker\TinkerServiceProvider::class,
Luthfi\FormField\FormFieldServiceProvider::class,
/*
* Application Service Providers...
@ -226,6 +227,10 @@ return [
'Validator' => Illuminate\Support\Facades\Validator::class,
'View' => Illuminate\Support\Facades\View::class,
'FormField' => Luthfi\FormField\FormFieldFacade::class,
'Form' => Collective\Html\FormFacade::class,
'Html' => Collective\Html\HtmlFacade::class,
],
];

4
config/database.php

@ -47,8 +47,8 @@ return [
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,

68
resources/views/auth/login.blade.php

@ -0,0 +1,68 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Login</div>
<div class="panel-body">
<form class="form-horizontal" role="form" method="POST" action="{{ route('login') }}">
{{ csrf_field() }}
<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
<label for="email" class="col-md-4 control-label">E-Mail Address</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required autofocus>
@if ($errors->has('email'))
<span class="help-block">
<strong>{{ $errors->first('email') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
<label for="password" class="col-md-4 control-label">Password</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control" name="password" required>
@if ($errors->has('password'))
<span class="help-block">
<strong>{{ $errors->first('password') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<div class="checkbox">
<label>
<input type="checkbox" name="remember" {{ old('remember') ? 'checked' : '' }}> Remember Me
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-md-8 col-md-offset-4">
<button type="submit" class="btn btn-primary">
Login
</button>
<a class="btn btn-link" href="{{ route('password.request') }}">
Forgot Your Password?
</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection

46
resources/views/auth/passwords/email.blade.php

@ -0,0 +1,46 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Reset Password</div>
<div class="panel-body">
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
<form class="form-horizontal" role="form" method="POST" action="{{ route('password.email') }}">
{{ csrf_field() }}
<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
<label for="email" class="col-md-4 control-label">E-Mail Address</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required>
@if ($errors->has('email'))
<span class="help-block">
<strong>{{ $errors->first('email') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<button type="submit" class="btn btn-primary">
Send Password Reset Link
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection

76
resources/views/auth/passwords/reset.blade.php

@ -0,0 +1,76 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Reset Password</div>
<div class="panel-body">
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
<form class="form-horizontal" role="form" method="POST" action="{{ route('password.request') }}">
{{ csrf_field() }}
<input type="hidden" name="token" value="{{ $token }}">
<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
<label for="email" class="col-md-4 control-label">E-Mail Address</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control" name="email" value="{{ $email or old('email') }}" required autofocus>
@if ($errors->has('email'))
<span class="help-block">
<strong>{{ $errors->first('email') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
<label for="password" class="col-md-4 control-label">Password</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control" name="password" required>
@if ($errors->has('password'))
<span class="help-block">
<strong>{{ $errors->first('password') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group{{ $errors->has('password_confirmation') ? ' has-error' : '' }}">
<label for="password-confirm" class="col-md-4 control-label">Confirm Password</label>
<div class="col-md-6">
<input id="password-confirm" type="password" class="form-control" name="password_confirmation" required>
@if ($errors->has('password_confirmation'))
<span class="help-block">
<strong>{{ $errors->first('password_confirmation') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<button type="submit" class="btn btn-primary">
Reset Password
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection

98
resources/views/auth/register.blade.php

@ -0,0 +1,98 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Register</div>
<div class="panel-body">
<form class="form-horizontal" role="form" method="POST" action="{{ route('register') }}">
{{ csrf_field() }}
<div class="form-group{{ $errors->has('nickname') ? ' has-error' : '' }}">
<label for="nickname" class="col-md-4 control-label">Nickname</label>
<div class="col-md-6">
<input id="nickname" type="text" class="form-control" name="nickname" value="{{ old('nickname') }}" required autofocus>
@if ($errors->has('nickname'))
<span class="help-block">
<strong>{{ $errors->first('nickname') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group{{ $errors->has('name') ? ' has-error' : '' }}">
<label for="name" class="col-md-4 control-label">Name</label>
<div class="col-md-6">
<input id="name" type="text" class="form-control" name="name" value="{{ old('name') }}" required>
@if ($errors->has('name'))
<span class="help-block">
<strong>{{ $errors->first('name') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
<label for="email" class="col-md-4 control-label">E-Mail Address</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required>
@if ($errors->has('email'))
<span class="help-block">
<strong>{{ $errors->first('email') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group{{ $errors->has('gender_id') ? ' has-error' : '' }}">
<label for="gender_id" class="col-md-4 control-label">Gender</label>
<div class="col-md-6">
{!! FormField::radios('gender_id', [1 => 'Laki-laki', 2 => 'Perempuan'], ['label' => false]) !!}
</div>
</div>
<div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
<label for="password" class="col-md-4 control-label">Password</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control" name="password" required>
@if ($errors->has('password'))
<span class="help-block">
<strong>{{ $errors->first('password') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group">
<label for="password-confirm" class="col-md-4 control-label">Confirm Password</label>
<div class="col-md-6">
<input id="password-confirm" type="password" class="form-control" name="password_confirmation" required>
</div>
</div>
<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<button type="submit" class="btn btn-primary">
Register
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection

96
resources/views/home.blade.php

@ -0,0 +1,96 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<div class="panel panel-default">
<div class="panel-heading">Profile</div>
<div class="panel-body">
<table class="table table-condensed">
<tbody>
<tr>
<th>Nama Panggilan</th>
<td>{{ $currentUser->nickname }}</td>
</tr>
<tr>
<th>Nama</th>
<td>{{ $currentUser->name }}</td>
</tr>
<tr>
<th>Jenis Kelamin</th>
<td>{{ $currentUser->gender }}</td>
</tr>
<tr>
<th>Ayah</th>
<td>
@if ($currentUser->father_id)
{{ $currentUser->father->name }}
@else
{{ Form::open() }}
<div class="input-group">
{{ Form::text('set_father', null, ['class' => 'form-control input-sm']) }}
<span class="input-group-btn">
{{ Form::submit('update', ['class' => 'btn btn-info btn-sm']) }}
</span>
</div>
{{ Form::close() }}
@endif
</td>
</tr>
<tr>
<th>Ibu</th>
<td>
@if ($currentUser->mother_id)
{{ $currentUser->mother->name }}
@else
{{ Form::open() }}
<div class="input-group">
{{ Form::text('set_mother', null, ['class' => 'form-control input-sm']) }}
<span class="input-group-btn">
{{ Form::submit('update', ['class' => 'btn btn-info btn-sm', 'id' => 'set_father_button']) }}
</span>
</div>
{{ Form::close() }}
@endif
</td>
</tr>
<tr>
<th colspan="2">Anak-Anak</th>
</tr>
<tr>
<td colspan="2">
<ul class="list-group">
@foreach($currentUser->childs as $child)
<li class="list-group-item">
{{ $child->nickname }} ({{ $child->gender }})
</li>
@endforeach
<li class="list-group-item">
{{ Form::open() }}
<div class="row">
<div class="col-md-4">
{!! FormField::text('add_child_name', ['label' => 'Nama Anak']) !!}
</div>
<div class="col-md-5">
{!! FormField::radios('add_child_gender_id', [1 => 'Laki-laki', 2 => 'Perempuan'], ['label' => 'Jenis Kelamin Anak']) !!}
</div>
<div class="col-md-3">
<br>
{{ Form::submit('Tambah Anak', ['class' => 'btn btn-success btn-sm']) }}
</div>
</div>
{{ Form::close() }}
</li>
</ul>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
@endsection

80
resources/views/layouts/app.blade.php

@ -0,0 +1,80 @@
<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ config('app.name', 'Laravel') }}</title>
<!-- Styles -->
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
</head>
<body>
<div id="app">
<nav class="navbar navbar-default navbar-static-top">
<div class="container">
<div class="navbar-header">
<!-- Collapsed Hamburger -->
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#app-navbar-collapse">
<span class="sr-only">Toggle Navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<!-- Branding Image -->
<a class="navbar-brand" href="{{ url('/') }}">
{{ config('app.name', 'Laravel') }}
</a>
</div>
<div class="collapse navbar-collapse" id="app-navbar-collapse">
<!-- Left Side Of Navbar -->
<ul class="nav navbar-nav">
&nbsp;
</ul>
<!-- Right Side Of Navbar -->
<ul class="nav navbar-nav navbar-right">
<!-- Authentication Links -->
@if (Auth::guest())
<li><a href="{{ route('login') }}">Login</a></li>
<li><a href="{{ route('register') }}">Register</a></li>
@else
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
{{ Auth::user()->name }} <span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="{{ route('logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
Logout
</a>
<form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
</form>
</li>
</ul>
</li>
@endif
</ul>
</div>
</div>
</nav>
@yield('content')
</div>
<!-- Scripts -->
<script src="{{ asset('js/app.js') }}"></script>
</body>
</html>

5
routes/web.php

@ -14,3 +14,8 @@
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
Route::get('/profile', 'HomeController@index')->name('profile');

0
storage/app/.gitignore

0
storage/app/public/.gitignore

0
storage/framework/.gitignore

0
storage/framework/cache/.gitignore

0
storage/framework/sessions/.gitignore

0
storage/framework/testing/.gitignore

0
storage/framework/views/.gitignore

0
storage/logs/.gitignore

25
tests/Feature/ManageUserFamiliesTest.php

@ -0,0 +1,25 @@
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;
class ManageUserFamiliesTest extends TestCase
{
use DatabaseMigrations;
/** @test */
public function user_can_update_their_family_members()
{
$user = $this->loginAsUser();
$this->visit(route('profile'));
$this->seePageIs(route('profile'));
$this->see($user->nickname);
$this->seeElement('input', ['name' => 'set_father']);
$this->seeElement('input', ['name' => 'set_mother']);
$this->seeElement('input', ['name' => 'add_child_name']);
$this->seeElement('input', ['name' => 'add_child_gender_id']);
}
}

1
tests/TestCase.php

@ -2,6 +2,7 @@
namespace Tests;
use App\User;
use Laravel\BrowserKitTesting\TestCase as BaseTestCase;
abstract class TestCase extends BaseTestCase

Loading…
Cancel
Save