Skip to content

Commit

Permalink
Merge pull request #50 from lolibrary/ISSUE-24-public-closet-wishlist
Browse files Browse the repository at this point in the history
Issue #24 - public closet and wishlist
  • Loading branch information
momijizukamori authored Sep 9, 2023
2 parents bee92c0 + b8135d0 commit b90dd23
Show file tree
Hide file tree
Showing 12 changed files with 241 additions and 80 deletions.
13 changes: 7 additions & 6 deletions app/Http/Controllers/ProfileController.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,9 @@ public function __construct()
public function profile()
{
$user = Auth::user();
$isOwner = true;

return view('profile.index', compact('user'));
return view('profile.index', compact('user', 'isOwner'));
}

/**
Expand Down Expand Up @@ -72,6 +73,9 @@ public function update(Request $request)
$user->password = Hash::make($validatedData['password']);
}

$user->public_closet = $request->has('public_closet') == '1' ? '1' : '0';
$user->public_wishlist = $request->has('public_wishlist') == '1' ? '1' : '0';

$user->save();

return redirect('profile')->with('status', $status);
Expand All @@ -86,9 +90,8 @@ public function update(Request $request)
public function closet(Request $request)
{
$user = Auth::user();
$items = $user->closet($request->input('order'))->paginate(24);

return view('profile.closet', compact('user', 'items'));
return redirect()->route('public_closet', ['username' => $user->username]);
}

/**
Expand All @@ -100,8 +103,6 @@ public function closet(Request $request)
public function wishlist(Request $request)
{
$user = Auth::user();
$items = $user->wishlist($request->input('order'))->paginate(24);

return view('profile.wishlist', compact('user', 'items'));
return redirect()->route('public_wishlist', ['username' => $user->username]);
}
}
61 changes: 61 additions & 0 deletions app/Http/Controllers/PublicProfileController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PublicProfileController extends Controller
{
/**
* Construct a new Public Profile Controller.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth.owner');
}


/**
* Get a given user's closet (owned items).
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function closet(Request $request)
{
$requestedUser = $request->get('requestedUser');
$isOwner = $request->get('isOwner');

if (empty($requestedUser) || (!$isOwner && !$requestedUser->public_closet)) {
abort(404);
}

$items = $requestedUser->closet($request->input('order'))->paginate(24);

$user = $requestedUser;
return view('profile.closet', compact('user', 'items', 'isOwner'));
}

/**
* Get a given user's wishlist (favourited items).
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function wishlist(Request $request)
{
$requestedUser = $request->get('requestedUser');
$isOwner = $request->get('isOwner');

if (empty($requestedUser) || (!$isOwner && !$requestedUser->public_wishlist)) {
abort(404);
}

$items = $requestedUser->wishlist($request->input('order'))->paginate(24);

$user = $requestedUser;
return view('profile.wishlist', compact('user', 'items', 'isOwner'));
}
}
1 change: 1 addition & 0 deletions app/Http/Kernel.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ class Kernel extends HttpKernel
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'auth.owner' => \App\Http\Middleware\CheckIfOwnerIsLoggedIn::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
Expand Down
24 changes: 24 additions & 0 deletions app/Http/Middleware/CheckIfOwnerIsLoggedIn.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

namespace App\Http\Middleware;

use App\Models\User;
use Closure;
use Illuminate\Support\Facades\Auth;

class CheckIfOwnerIsLoggedIn
{
public function handle($request, Closure $next)
{
$currentUser = Auth::user();
$username = $request->route('username');
$requestedUser = User::where('username', $username)->first();
$isOwner = (
!empty($currentUser) && !empty($requestedUser)
&& $currentUser->id == $requestedUser->id
);
$request->attributes->add(['isOwner' => $isOwner, 'requestedUser' => $requestedUser]);

return $next($request);
}
}
33 changes: 33 additions & 0 deletions database/migrations/0056____add_public_wishlist_closet_flags.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddPublicWishlistClosetFlags extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->tinyInteger('public_wishlist')->unsigned()->default(0);
$table->tinyInteger('public_closet')->unsigned()->default(0);
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['public_wishlist', 'public_closet']);
});
}
}
6 changes: 6 additions & 0 deletions resources/lang/en/ui.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@
'pw_reset_btn' => 'Send Password Reset Link',
'pw_no_change' => "Leave this blank if you don't want to change your password.",
'username_txt' => 'To change your username, <a class="text-info" href="#" data-toggle="tooltip" title="Changing username is not currently supported, sorry!">click here</a>',
'public_closet' => 'Make closet public?',
'public_wishlist' => 'Make wishlist public?',
],

'blog' => [
Expand Down Expand Up @@ -77,8 +79,10 @@
'removed' => 'Removed ":item" from your wishlist',
'stargazers' => 'Stargazer|Stargazers',
'title' => 'Wishlist',
'owner_title' => ":user's Wishlist",
'remove' => 'Remove from Wishlist',
'empty' => 'There are no items in your wishlist.',
'empty_guest' => "There are no items in :user's wishlist",
'add' => 'Why not <a href=":link">search for some items to add</a>?',
],

Expand All @@ -87,8 +91,10 @@
'removed' => 'Removed ":item" from your closet',
'owners' => 'Owner|Owners',
'title' => 'Closet',
'owner_title' => ":user's Closet",
'remove' => 'Remove from Closet',
'empty' => 'There are no items in your closet.',
'empty_guest' => "There are no items in :user's closet",
'add' => 'Why not <a href=":link">search for some items to add</a>?',
],

Expand Down
4 changes: 2 additions & 2 deletions resources/views/components/navbar/dropdown.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
<i class="fal fa-fw fa-user"></i> {{ __('Profile') }}
</a>

<a class="dropdown-item" href="{{ route('wishlist') }}">
<a class="dropdown-item" href="{{ route('public_wishlist', ['username' => Auth::user()->username]) }}">
<i class="fal fa-fw fa-star"></i> {{ __('Wishlist') }}
</a>

<a class="dropdown-item" href="{{ route('closet') }}">
<a class="dropdown-item" href="{{ route('public_closet', ['username' => Auth::user()->username]) }}">
<i class="fal fa-fw fa-tags"></i> {{ __('Closet') }}
</a>

Expand Down
74 changes: 41 additions & 33 deletions resources/views/profile/closet.blade.php
Original file line number Diff line number Diff line change
@@ -1,54 +1,62 @@
@extends('profile.layout', ['title' => __('ui.closet.title')])
@extends('profile.layout', ['title' => __('ui.closet.owner_title', ['user' => $user->username])])

@section('profile')
@if ($items->count() > 0)
<div class="row">
@foreach ($items as $item)
<div class="col-lg-4 col-md-6 col-sm-6 p-2">
@component('items.card', ['item' => $item, 'type' => 'small'])
<form action="{{ route('items.closet', $item) }}" method="post">
@csrf
<input type="hidden" name="_method" value="put">
@if ($isOwner)
<form action="{{ route('items.closet', $item) }}" method="post">
@csrf
<input type="hidden" name="_method" value="put">

<button class="btn btn-outline-danger btn-block rounded-0"
style="border: none; border-top: 1px solid rgba(0, 0, 0, 0.125);"
type="submit">
{{ __('ui.closet.remove') }}
</button>
</form>
<button class="btn btn-outline-danger btn-block rounded-0"
style="border: none; border-top: 1px solid rgba(0, 0, 0, 0.125);"
type="submit">
{{ __('ui.closet.remove') }}
</button>
</form>
@endif
@endcomponent
</div>
@endforeach
</div>

{{ $items->links() }}
@else
<div class="text-center mt-5">
<p class="h2">{{ __('ui.closet.empty') }}</p>
<p class="lead">@lang('ui.closet.add', ['link' => route('search')])</p>
</div>
<div class="row pt-5">
<div class="col-4">
<div class="card bg-light text-muted">
<div class="card-body shadow-sm d-flex justify-content-center align-items-center">
<i class="fal fa-plus-circle fa-5x"></i>
</div>
@if ($isOwner)
<div class="text-center mt-5">
<p class="h2">{{ __('ui.closet.empty') }}</p>
<p class="lead">@lang('ui.closet.add', ['link' => route('search')])</p>
</div>
</div>
<div class="col-4">
<div class="card bg-light text-muted">
<div class="card-body shadow-sm d-flex justify-content-center align-items-center">
<i class="fal fa-plus-circle fa-5x"></i>
<div class="row pt-5">
<div class="col-4">
<div class="card bg-light text-muted">
<div class="card-body shadow-sm d-flex justify-content-center align-items-center">
<i class="fal fa-plus-circle fa-5x"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="card bg-light text-muted">
<div class="card-body shadow-sm d-flex justify-content-center align-items-center">
<i class="fal fa-plus-circle fa-5x"></i>
<div class="col-4">
<div class="card bg-light text-muted">
<div class="card-body shadow-sm d-flex justify-content-center align-items-center">
<i class="fal fa-plus-circle fa-5x"></i>
</div>
</div>
</div>
<div class="col-4">
<div class="card bg-light text-muted">
<div class="card-body shadow-sm d-flex justify-content-center align-items-center">
<i class="fal fa-plus-circle fa-5x"></i>
</div>
</div>
</div>
</div>
</div>
</div>
@else
<div class="text-center mt-5">
<p class="h2">{{ __('ui.closet.empty_guest', ['user' => $user->username]) }}</p>
</div>
@endif
@endif
@endsection
8 changes: 8 additions & 0 deletions resources/views/profile/index.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,14 @@
<input type="password" class="form-control" id="profile-password-confirm" placeholder="{{ __('ui.auth.pw') }}" name="password_confirmation">
<small class="form-text text-muted">{{ __('ui.auth.pw_no_change') }}</small>
</div>
<div class="form-group form-check">
<input type="checkbox" class="form-check-input" name="public_wishlist" id="public-wishlist" value="1" @if ($user->public_wishlist) checked @endif/>
<label for="public-wishlist" class="form-check-label">{{ __('ui.auth.public_wishlist') }}</label>
</div>
<div class="form-group form-check">
<input type="checkbox" class="form-check-input" name="public_closet" id="public-closet" value="1" @if ($user->public_closet) checked @endif/>
<label for="public-closet" class="form-check-label">{{ __('ui.auth.public_closet') }}</label>
</div>

<div class="row">
<div class="col-sm-6 offset-sm-3 col-md-4 offset-md-4">
Expand Down
21 changes: 15 additions & 6 deletions resources/views/profile/layout.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,29 @@
<div class="text-center m-4">
<img src="{{ cdn_link('categories/other.svg') }}" alt="" style="max-height: 150px; max-width: 150px" class="img-thumbnail circle">
</div>
<div class="text-center m-4">
{{ $user->username }}
</div>

<div class="list-group">
<a href="{{ route('profile') }}" class="list-group-item list-group-item-action @if (Route::is('profile')) active @endif">
<i class="fal fa-fw fa-user"></i>
{{ __('ui.profile') }}
</a>
<a href="{{ route('wishlist') }}" class="list-group-item list-group-item-action @if (Route::is('wishlist')) active @endif">
@if ($isOwner)
<a href="{{ route('profile') }}" class="list-group-item list-group-item-action @if (Route::is('profile')) active @endif">
<i class="fal fa-fw fa-user"></i>
{{ __('ui.profile') }}
</a>
@endif
@if ($isOwner || $user->public_wishlist)
<a href="{{ route('public_wishlist', ['username' => $user->username]) }}" class="list-group-item list-group-item-action @if (Route::is('public_wishlist')) active @endif">
<i class="fal fa-fw fa-star"></i>
{{ __('ui.wishlist.title') }}
</a>
<a href="{{ route('closet') }}" class="list-group-item list-group-item-action @if (Route::is('closet')) active @endif">
@endif
@if ($isOwner || $user->public_closet)
<a href="{{ route('public_closet', ['username' => $user->username]) }}" class="list-group-item list-group-item-action @if (Route::is('public_closet')) active @endif">
<i class="fal fa-fw fa-tags"></i>
{{ __('ui.closet.title') }}
</a>
@endif
</div>
</div>
<div class="col-md-8">
Expand Down
Loading

0 comments on commit b90dd23

Please sign in to comment.