Browse Source

Add user photo upload on user profile

Add nullable photo_path column on users table
Restructure user profile page
Restructure user profile edit page
pull/8/head
Nafies Luthfi 8 years ago
parent
commit
5f77e300bc
  1. 34
      app/Http/Controllers/UsersController.php
  2. 1
      database/migrations/2014_10_12_000000_create_users_table.php
  3. BIN
      public/images/icon_user_1.png
  4. BIN
      public/images/icon_user_2.png
  5. 4
      resources/lang/en/user.php
  6. 4
      resources/lang/id/user.php
  7. 24
      resources/views/users/edit.blade.php
  8. 7
      resources/views/users/partials/profile.blade.php
  9. 6
      resources/views/users/show.blade.php
  10. 1
      routes/web.php
  11. 21
      tests/Feature/UsersProfileTest.php

34
app/Http/Controllers/UsersController.php

@ -5,6 +5,7 @@ namespace App\Http\Controllers;
use App\Couple;
use App\User;
use Illuminate\Http\Request;
use Storage;
class UsersController extends Controller
{
@ -56,7 +57,7 @@ class UsersController extends Controller
'usersMariageList' => $usersMariageList,
'malePersonList' => $malePersonList,
'femalePersonList' => $femalePersonList,
'allMariageList' => $allMariageList
'allMariageList' => $allMariageList,
]);
}
@ -137,10 +138,11 @@ class UsersController extends Controller
$user->dob = $request->get('dob');
$user->dod = $request->get('dod');
if ($request->get('dod'))
if ($request->get('dod')) {
$user->yod = substr($request->get('dod'), 0, 4);
else
} else {
$user->yod = $request->get('yod');
}
$user->phone = $request->get('phone');
$user->address = $request->get('address');
@ -166,4 +168,30 @@ class UsersController extends Controller
{
//
}
/**
* Upload users photo.
*
* @param \Illuminate\Http\Request $request
* @param \App\User $user
*
* @return \Illuminate\Http\Response
*/
public function photoUpload(Request $request, User $user)
{
$request->validate([
'photo' => 'required|image|max:200',
]);
$storage = env('APP_ENV') == 'testing' ? 'avatars' : 'public';
if (Storage::disk($storage)->exists($user->photo_path)) {
Storage::disk($storage)->delete($user->photo_path);
}
$user->photo_path = $request->photo->store('images', $storage);
$user->save();
return back();
}
}

1
database/migrations/2014_10_12_000000_create_users_table.php

@ -29,6 +29,7 @@ class CreateUsersTable extends Migration
$table->string('address')->nullable();
$table->string('city')->nullable();
$table->string('phone')->nullable();
$table->string('photo_path')->nullable();
$table->unsignedInteger('manager_id')->nullable();
$table->rememberToken();
$table->timestamps();

BIN
public/images/icon_user_1.png

After

Width: 280  |  Height: 280  |  Size: 10 KiB

BIN
public/images/icon_user_2.png

After

Width: 280  |  Height: 280  |  Size: 11 KiB

4
resources/lang/en/user.php

@ -45,4 +45,8 @@ return [
'city' => 'City',
'phone' => 'Phone',
'manager' => 'Manager',
// Photo
'reupload_photo' => 'Re-upload Photo',
'update_photo' => 'Update Photo',
];

4
resources/lang/id/user.php

@ -45,4 +45,8 @@ return [
'city' => 'Kota',
'phone' => 'Telp.',
'manager' => 'Pengelola',
// Photo
'reupload_photo' => 'Upload ulang Foto',
'update_photo' => 'Update Foto',
];

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

@ -7,12 +7,19 @@
</div>
{{ trans('user.edit') }} {{ $user->profileLink() }}
</h2>
{{ Form::model($user, ['route' => ['users.update', $user->id], 'method' =>'patch', 'autocomplete' => 'off']) }}
<div class="row">
{{ Form::model($user, ['route' => ['users.update', $user->id], 'method' =>'patch', 'autocomplete' => 'off']) }}
<div class="col-md-4">
<div class="panel panel-default">
<div class="panel-heading"><h3 class="panel-title">{{ trans('user.edit') }}</h3></div>
<div class="panel-body">
<div class="text-center">
@if ($user->photo_path && is_file(public_path('storage/'.$user->photo_path)))
{{ Html::image('storage/'.$user->photo_path, $user->name, ['style' => 'max-width:100%']) }}
@else
{{ Html::image('images/icon_user_'.$user->gender_id.'.png', $user->name, ['style' => 'max-width:100%']) }}
@endif
</div>
{!! FormField::text('name', ['label' => trans('user.name')]) !!}
{!! FormField::text('nickname', ['label' => trans('user.nickname')]) !!}
<div class="row">
@ -35,8 +42,6 @@
{!! FormField::text('phone', ['label' => trans('app.phone'), 'placeholder' => trans('app.example').' 081234567890']) !!}
</div>
</div>
</div>
<div class="col-md-4">
<div class="panel panel-default">
<div class="panel-heading"><h3 class="panel-title">{{ trans('app.login_account') }}</h3></div>
<div class="panel-body">
@ -44,11 +49,18 @@
{!! FormField::text('password', ['label' => trans('auth.password'), 'placeholder' => '******', 'value' => '']) !!}
</div>
</div>
</div>
</div>
<div class="pull-right">
<div class="text-right">
{{ Form::submit(trans('app.update'), ['class' => 'btn btn-primary']) }}
{{ link_to_route('users.show', trans('app.cancel'), [$user->id], ['class' => 'btn btn-default']) }}
</div>
</div>
{{ Form::close() }}
<div class="col-md-4">
{{ Form::open(['route' => ['users.photo-upload', $user], 'method' => 'patch', 'files' => true]) }}
{!! FormField::file('photo', ['required' => true, 'label' => __('user.reupload_photo'), 'info' => ['text' => 'Format jpg, maks: 200 Kb.', 'class' => 'warning']]) !!}
{!! Form::submit(__('user.update_photo'), ['class' => 'btn btn-success']) !!}
{{ link_to_route('users.show', trans('app.cancel'), [$user], ['class' => 'btn btn-default']) }}
{{ Form::close() }}
</div>
</div>
@endsection

7
resources/views/users/partials/profile.blade.php

@ -1,5 +1,12 @@
<div class="panel panel-default">
<div class="panel-heading"><h3 class="panel-title">{{ trans('user.profile') }}</h3></div>
<div class="panel-body text-center">
@if ($user->photo_path && is_file(public_path('storage/'.$user->photo_path)))
{{ Html::image('storage/'.$user->photo_path, $user->name, ['style' => 'max-width:100%']) }}
@else
{{ Html::image('images/icon_user_'.$user->gender_id.'.png', $user->name, ['style' => 'max-width:100%']) }}
@endif
</div>
<table class="table">
<tbody>
<tr>

6
resources/views/users/show.blade.php

@ -4,13 +4,13 @@
@section('user-content')
<div class="row">
<div class="col-md-6">
<div class="col-md-4">
@include('users.partials.profile')
@include('users.partials.siblings')
</div>
<div class="col-md-6">
<div class="col-md-8">
@include('users.partials.parent-spouse')
@include('users.partials.childs')
@include('users.partials.siblings')
</div>
</div>
@endsection

1
routes/web.php

@ -30,6 +30,7 @@ Route::get('users/{user}/edit', 'UsersController@edit')->name('users.edit');
Route::patch('users/{user}', 'UsersController@update')->name('users.update');
Route::get('users/{user}/chart', 'UsersController@chart')->name('users.chart');
Route::get('users/{user}/tree', 'UsersController@tree')->name('users.tree');
Route::patch('users/{user}/photo-upload', 'UsersController@photoUpload')->name('users.photo-upload');
Route::get('users/{user}/marriages', 'UserMarriagesController@index')->name('users.marriages');

21
tests/Feature/UsersProfileTest.php

@ -4,6 +4,7 @@ namespace Tests\Feature;
use App\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Storage;
use Tests\TestCase;
class UsersProfileTest extends TestCase
@ -55,6 +56,26 @@ class UsersProfileTest extends TestCase
}
/** @test */
public function user_can_upload_their_own_photo()
{
Storage::fake('avatars');
$user = $this->loginAsUser();
$this->visit(route('users.edit', $user->id));
$this->assertNull($user->photo_path);
$this->attach(public_path('images/icon_user_1.png'), 'photo');
$this->press(trans('user.update_photo'));
$this->seePageIs(route('users.edit', $user));
$user = $user->fresh();
$this->assertNotNull($user->photo_path);
Storage::disk('avatars')->assertExists($user->photo_path);
}
/** @test */
public function guest_can_search_users_profile()
{
$this->visit(route('users.search'));

Loading…
Cancel
Save