24 changed files with 641 additions and 7 deletions
-
2app/Http/Controllers/Auth/RegisterController.php
-
28app/Http/Controllers/HomeController.php
-
9app/User.php
-
3composer.json
-
96composer.lock
-
11config/app.php
-
4config/database.php
-
68resources/views/auth/login.blade.php
-
46resources/views/auth/passwords/email.blade.php
-
76resources/views/auth/passwords/reset.blade.php
-
98resources/views/auth/register.blade.php
-
96resources/views/home.blade.php
-
80resources/views/layouts/app.blade.php
-
5routes/web.php
-
0storage/app/.gitignore
-
0storage/app/public/.gitignore
-
0storage/framework/.gitignore
-
0storage/framework/cache/.gitignore
-
0storage/framework/sessions/.gitignore
-
0storage/framework/testing/.gitignore
-
0storage/framework/views/.gitignore
-
0storage/logs/.gitignore
-
25tests/Feature/ManageUserFamiliesTest.php
-
1tests/TestCase.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()]); |
||||
|
} |
||||
|
} |
||||
@ -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 |
||||
@ -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 |
||||
@ -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 |
||||
@ -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 |
||||
@ -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 |
||||
@ -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"> |
||||
|
|
||||
|
</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> |
||||
@ -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']); |
||||
|
} |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue