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