forked from eatvio/eatvio-infra
Merge pull request 'main' (#10) from alex_chevski/eatvio:main into main
Plan updating
This commit is contained in:
@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
|
||||
use App\Models\Plan;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\PlanComment;
|
||||
|
||||
class PlanController extends Controller
|
||||
{
|
||||
@@ -65,16 +66,16 @@ class PlanController extends Controller
|
||||
// $options1 = $this->unserializeOptions($plan->packet1_options);
|
||||
// $options2 = $this->unserializeOptions($plan->packet2_options);
|
||||
// $options3 = $this->unserializeOptions($plan->packet2_options);
|
||||
$options1 = $plan->packet1_options;
|
||||
$options2 = $plan->packet2_options;
|
||||
$options3 = $plan->packet2_options;
|
||||
// $options1 = $plan->packet1_options;
|
||||
// $options2 = $plan->packet2_options;
|
||||
// $options3 = $plan->packet2_options;
|
||||
|
||||
return view('plan/show',
|
||||
[
|
||||
'plan' => $plan,
|
||||
'options1' => $options1,
|
||||
'options2' => $options2,
|
||||
'options3' => $options3
|
||||
// 'options1' => $options1,
|
||||
// 'options2' => $options2,
|
||||
// 'options3' => $options3,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
40
app/Livewire/Plan/Accordion.php
Normal file
40
app/Livewire/Plan/Accordion.php
Normal file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
namespace App\Livewire\Plan;
|
||||
|
||||
use App\Models\Plan;
|
||||
use Livewire\Component;
|
||||
|
||||
class Accordion extends Component
|
||||
{
|
||||
public Plan $plan;
|
||||
public $accordionState = ['options1' => false, 'options2' => false, 'options3' => false];
|
||||
public $options1;
|
||||
public $options2;
|
||||
public $options3;
|
||||
|
||||
public function mount(Plan $plan): void
|
||||
{
|
||||
$this->plan = $plan;
|
||||
$this->options1 = $plan->packet1_options;
|
||||
$this->options2 = $plan->packet2_options;
|
||||
$this->options3 = $plan->packet3_options;
|
||||
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
return view('livewire.plan.accordion');
|
||||
}
|
||||
|
||||
public function toggleAccordionState($optionName)
|
||||
{
|
||||
$this->accordionState[$optionName] = !$this->accordionState[$optionName];
|
||||
|
||||
|
||||
// 1. Если у нас 1 true все остальные делать false(чтобы закрывать остальные вкладки у которых не true)
|
||||
// a. у нас есть ключ у которого будет true
|
||||
// b. проходим по всем ключам accordionState и все кроме true делаем false
|
||||
array_map(fn($key) => $key === $optionName ?: $this->accordionState[$key] = false, array_keys($this->accordionState));
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,7 @@ use Livewire\Component;
|
||||
use App\Models\Plan;
|
||||
use App\Models\PlanComment;
|
||||
use App\Models\User;
|
||||
use Livewire\Attributes\Validate;
|
||||
|
||||
class Create extends Component
|
||||
{
|
||||
@@ -21,6 +22,11 @@ class Create extends Component
|
||||
|
||||
public function save()
|
||||
{
|
||||
$this->validate([
|
||||
'body' => 'required|min:10',
|
||||
'grade' => 'required',
|
||||
]);
|
||||
|
||||
$comment = new PlanComment();
|
||||
$comment->grade = $this->grade;
|
||||
$comment->body = $this->body;
|
||||
|
||||
@@ -8,6 +8,7 @@ use App\Models\Plan;
|
||||
class Show extends Component
|
||||
{
|
||||
public Plan $plan;
|
||||
public array $tabpanelState = ['positive' => 'positive', 'negative' => false];
|
||||
|
||||
protected $listeners = ['commentAdded' => '$refresh'];
|
||||
|
||||
@@ -15,4 +16,9 @@ class Show extends Component
|
||||
{
|
||||
return view('livewire.plan.comment.show');
|
||||
}
|
||||
|
||||
public function toggleTabpanelState($tabpanelName)
|
||||
{
|
||||
array_map(fn($key) => $key === $tabpanelName ? $this->tabpanelState[$tabpanelName] = $tabpanelName : $this->tabpanelState[$key] = false, array_keys($this->tabpanelState));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
use Laracasts\Presenter\PresentableTrait;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use App\Models\PlanLike;
|
||||
use App\Presenters\PlanPresenter;
|
||||
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||
use CyrildeWit\EloquentViewable\InteractsWithViews;
|
||||
use CyrildeWit\EloquentViewable\Contracts\Viewable;
|
||||
use CyrildeWit\EloquentViewable\InteractsWithViews;
|
||||
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Laracasts\Presenter\PresentableTrait;
|
||||
|
||||
class Plan extends Model implements Viewable
|
||||
{
|
||||
@@ -18,7 +19,6 @@ class Plan extends Model implements Viewable
|
||||
use InteractsWithViews;
|
||||
use PresentableTrait;
|
||||
|
||||
|
||||
protected $withCount = [
|
||||
'likes',
|
||||
'comments'
|
||||
@@ -31,10 +31,8 @@ class Plan extends Model implements Viewable
|
||||
'packet3_options' => 'array',
|
||||
];
|
||||
|
||||
|
||||
protected $presenter = PlanPresenter::class;
|
||||
|
||||
|
||||
public function author()
|
||||
{
|
||||
return $this->belongsToMany(User::class, 'plan_author', 'plan_id', 'user_id');
|
||||
@@ -63,12 +61,12 @@ class Plan extends Model implements Viewable
|
||||
{
|
||||
$result = [];
|
||||
for ($i = 1; $i <= $this->packets_count; $i++) {
|
||||
$key = "packet" . $i . "_options";
|
||||
$key = 'packet' . $i . '_options';
|
||||
|
||||
// $data = $this->unserializeOptionsObj($this->$key);
|
||||
$data = $this->$key;
|
||||
if (!is_null($data)) {
|
||||
$result = array_merge($result, data_get($data, "items", []));
|
||||
$result = array_merge($result, data_get($data, 'items', []));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,7 +79,7 @@ class Plan extends Model implements Viewable
|
||||
$data = $this->type;
|
||||
|
||||
return new Attribute(
|
||||
get: fn () => array_keys($data),
|
||||
get: fn() => array_keys($data),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -89,18 +87,18 @@ class Plan extends Model implements Viewable
|
||||
{
|
||||
$result = 0;
|
||||
for ($i = 1; $i <= $this->packets_count; $i++) {
|
||||
$key = "packet" . $i . "_options";
|
||||
$key = 'packet' . $i . '_options';
|
||||
// dd($this->$key);
|
||||
// $data = $this->unserializeOptionsObj($this->$key);
|
||||
$data = $this->$key;
|
||||
if (!is_null($data)) {
|
||||
$curPrice = (int)data_get($data, "price", 0);
|
||||
$result = $curPrice > $result ? $curPrice : $result ;
|
||||
$curPrice = (int) data_get($data, 'price', 0);
|
||||
$result = $curPrice > $result ? $curPrice : $result;
|
||||
}
|
||||
}
|
||||
|
||||
return new Attribute(
|
||||
get: fn () => $result,
|
||||
get: fn() => $result,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -128,4 +126,14 @@ class Plan extends Model implements Viewable
|
||||
}
|
||||
return json_decode(stripslashes($str), true);
|
||||
}
|
||||
|
||||
public function scopeByNegative(Builder $query)
|
||||
{
|
||||
return static::comments()->where('grade', '<=', '3');
|
||||
}
|
||||
|
||||
public function scopeByPositive(Builder $query)
|
||||
{
|
||||
return static::comments()->where('grade', '>', '3');
|
||||
}
|
||||
}
|
||||
|
||||
28
database/factories/PlanCommentFactory.php
Executable file
28
database/factories/PlanCommentFactory.php
Executable file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Factories;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
use App\Models\User;
|
||||
use App\Models\Plan;
|
||||
|
||||
/**
|
||||
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\PlanComment>
|
||||
*/
|
||||
class PlanCommentFactory extends Factory
|
||||
{
|
||||
/**
|
||||
* Define the model's default state.
|
||||
*
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function definition(): array
|
||||
{
|
||||
|
||||
return [
|
||||
'grade' => $this->faker->randomDigit(),
|
||||
'body' => $this->faker->text(),
|
||||
];
|
||||
|
||||
}
|
||||
}
|
||||
38
database/seeders/PlanCommentSeeder.php
Executable file
38
database/seeders/PlanCommentSeeder.php
Executable file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Models\Plan;
|
||||
use App\Models\PlanComment;
|
||||
use App\Models\User;
|
||||
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class PlanCommentSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
if (User::count() > 0 && Plan::count() > 0) {
|
||||
$comments = PlanComment::factory()->count(5)->make();
|
||||
|
||||
$comments->each(function ($comment) {
|
||||
$comment->author()->associate(
|
||||
User::inRandomOrder()
|
||||
->first()
|
||||
->id
|
||||
);
|
||||
|
||||
$comment->plan()->associate(
|
||||
Plan::inRandomOrder()
|
||||
->first()
|
||||
->id
|
||||
);
|
||||
|
||||
$comment->saveOrFail();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -145,3 +145,4 @@ $isDiary = Str::of($curUrl)->test('/\/diary/');
|
||||
<x-toaster-hub />
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
99
resources/views/livewire/plan/accordion.blade.php
Normal file
99
resources/views/livewire/plan/accordion.blade.php
Normal file
@@ -0,0 +1,99 @@
|
||||
<div class="settings__price" data-spollers data-one-spoller>
|
||||
<div class="settings__price-item">
|
||||
<button type="button" @class([
|
||||
'settings__price-btn',
|
||||
'_active' => $accordionState['options1'],
|
||||
]) wire:click='toggleAccordionState("options1","options2", "options3")' data-spoller>
|
||||
<strong>
|
||||
{{ $options1['price'] ?? '0' }} ₽
|
||||
</strong>
|
||||
{{ $options1['short'] ?? '' }}
|
||||
</button>
|
||||
<div class="settings__price-body" @style(['display: none' => !$accordionState['options1'], 'display: block' => $accordionState['options1']])>
|
||||
<div class="settings__price-desc">
|
||||
{{ $options1['description'] ?? '' }}
|
||||
</div>
|
||||
|
||||
@isset($options1['items'])
|
||||
@foreach ($options1['items'] as $item)
|
||||
<ul class="settings__price-list">
|
||||
<li>
|
||||
{{ $item }}
|
||||
<span class="settings__price-icon icon-check-square"></span>
|
||||
{{-- <span class="settings__price-icon">-</span> --}}
|
||||
</li>
|
||||
</ul>
|
||||
@endforeach
|
||||
@endisset
|
||||
<button type="button" class="settings__price-bid btn btn-green">Заказать за
|
||||
{{ $options1['price'] ?? '0' }}₽</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if ($plan->packets_count == 3)
|
||||
<div class="settings__price-item">
|
||||
<button type="button" @class([
|
||||
'settings__price-btn',
|
||||
'_active' => $accordionState['options2'],
|
||||
]) wire:click='toggleAccordionState("options2")' data-spoller>
|
||||
<strong>
|
||||
{{ $options2['price'] ?? '0' }} ₽
|
||||
</strong>
|
||||
{{ $options2['short'] ?? '' }}
|
||||
</button>
|
||||
<div class="settings__price-body" @style(['display: none' => !$accordionState['options2'], 'display: block' => $accordionState['options2']])>
|
||||
<div class="settings__price-desc">
|
||||
{{ $options2['description'] ?? '' }}
|
||||
</div>
|
||||
|
||||
@isset($options2['items'])
|
||||
@foreach ($options2['items'] as $item)
|
||||
<ul class="settings__price-list">
|
||||
<li>
|
||||
{{ $item }}
|
||||
<span class="settings__price-icon icon-check-square"></span>
|
||||
{{-- <span class="settings__price-icon">-</span> --}}
|
||||
</li>
|
||||
</ul>
|
||||
@endforeach
|
||||
@endisset
|
||||
<button type="button" class="settings__price-bid btn btn-green">Заказать за
|
||||
{{ $options2['price'] ?? '0' }}
|
||||
₽</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="settings__price-item">
|
||||
<button type="button" @class([
|
||||
'settings__price-btn',
|
||||
'_active' => $accordionState['options3'],
|
||||
]) wire:click='toggleAccordionState("options3")'
|
||||
data-spoller>
|
||||
<strong>
|
||||
{{ $options3['price'] ?? '0' }} ₽
|
||||
</strong>
|
||||
{{ $options3['short'] ?? '' }}
|
||||
</button>
|
||||
<div class="settings__price-body" @style(['display: none' => !$accordionState['options3'], 'display: block' => $accordionState['options3']])>
|
||||
<div class="settings__price-desc">
|
||||
{{ $options3['description'] ?? '' }}
|
||||
</div>
|
||||
|
||||
@isset($options3['items'])
|
||||
@foreach ($options3['items'] as $item)
|
||||
<ul class="settings__price-list">
|
||||
<li>
|
||||
{{ $item }}
|
||||
<span class="settings__price-icon icon-check-square"></span>
|
||||
{{-- <span class="settings__price-icon">-</span> --}}
|
||||
</li>
|
||||
</ul>
|
||||
@endforeach
|
||||
@endisset
|
||||
<button type="button" class="settings__price-bid btn btn-green">Заказать за
|
||||
{{ $options3['price'] ?? '0' }}
|
||||
₽</button>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
@@ -1,24 +1,18 @@
|
||||
<div class="container px-0 mb-4 --mw-1000 --bg_white --radius fs-4_5">
|
||||
<div class="d-sm-flex justify-content-between align-items-centerr ps-2 pe-3 pt-2">
|
||||
<textarea wire:model="body" id="plan-comment-textarea" class="form-control h-100 --no_border --no_resize" placeholder="Введите свой комментарий"></textarea>
|
||||
<div class="h-100 ps-2 pt-3 pb-4 pb-sm-0 --stars --no_wrap">
|
||||
<a href="#sg1" wire:click.prevent="$set('grade', 1)">
|
||||
<svg id="sg1" @class(['yellow-star-filter' => $grade >= 1]) width="24" height="24"><use xlink:href="#StarIcon"></use></svg>
|
||||
</a>
|
||||
<a href="#sg2" wire:click.prevent="$set('grade', 2)">
|
||||
<svg id="sg2" @class(['yellow-star-filter' => $grade >= 2]) width="24" height="24"><use xlink:href="#StarIcon"></use></svg>
|
||||
</a>
|
||||
<a href="#sg3" wire:click.prevent="$set('grade', 3)">
|
||||
<svg id="sg3" @class(['yellow-star-filter' => $grade >= 3]) width="24" height="24"><use xlink:href="#StarIcon"></use></svg>
|
||||
</a>
|
||||
<a href="#sg4" wire:click.prevent="$set('grade', 4)">
|
||||
<svg id="sg4" @class(['yellow-star-filter' => $grade >= 4]) width="24" height="24"><use xlink:href="#StarIcon"></use></svg>
|
||||
</a>
|
||||
<a href="#sg5" wire:click.prevent="$set('grade', 5)">
|
||||
<svg id="sg5" @class(['yellow-star-filter' => $grade >= 5]) width="24" height="24"><use xlink:href="#StarIcon"></use></svg>
|
||||
</a>
|
||||
|
||||
<a href="#sg1" wire:click.prevent="save" class="ms-3"><svg width="24" height="24"><use xlink:href="#SendPlainIcon"></use></svg></a>
|
||||
<form class="reviews__form">
|
||||
<textarea wire:model="body" class="textarea textarea-white" placeholder="Введите отзыв"></textarea>
|
||||
<div class="reviews__form-column">
|
||||
<div class="reviews__form-rate star-rating">
|
||||
<input wire:click="$set('grade', 5)" type="radio" name="rate" id="rate-5" value="5" class="star-rating__input hidden" hidden>
|
||||
<label class="star-rating__label" for="rate-5"></label>
|
||||
<input wire:click="$set('grade',4)" type="radio" name="rate" id="rate-4" value="4" class="star-rating__input hidden" hidden>
|
||||
<label class="star-rating__label" for="rate-4"></label>
|
||||
<input wire:click="$set('grade',3)" type="radio" name="rate" id="rate-3" value="3" class="star-rating__input hidden" hidden>
|
||||
<label class="star-rating__label" for="rate-3"></label>
|
||||
<input wire:click="$set('grade',2)" type="radio" name="rate" id="rate-2" value="2" class="star-rating__input hidden" hidden>
|
||||
<label class="star-rating__label" for="rate-2"></label>
|
||||
<input wire:click="$set('grade',1)" type="radio" name="rate" id="rate-1" value="1" class="star-rating__input hidden" hidden>
|
||||
<label class="star-rating__label" for="rate-1"></label>
|
||||
</div>
|
||||
<button wire:click.prevent="save" type="button" class="btn btn-primary">Оставь отзыв</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -1,59 +1,89 @@
|
||||
<div class="container px-0 mb-4 --mw-1000 reviews">
|
||||
@php
|
||||
$positivComments = $plan->comments()->where('grade', '>', '3');
|
||||
$negativeComments = $plan->comments()->where('grade', '<=', '3');
|
||||
$positiveCommmentsCount = $positivComments->count();
|
||||
$negativeCommentsCount = $negativeComments->count();
|
||||
@endphp
|
||||
<ul class="nav nav-tabs mb-3" id="myTab" role="tablist">
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link active" id="positive-tab" data-bs-toggle="tab" data-bs-target="#positive" type="button" role="tab" aria-controls="positive" aria-selected="true">Положительные<span class="ms-2">{{ $positiveCommmentsCount }}</span></button>
|
||||
</li>
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link" id="negative-tab" data-bs-toggle="tab" data-bs-target="#negative" type="button" role="tab" aria-controls="negative" aria-selected="false">Негативные<span class="ms-2">{{ $negativeCommentsCount }}</span></button>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane fade show active" id="positive" role="tabpanel" aria-labelledby="positive-tab">
|
||||
@foreach($positivComments->get() as $comment)
|
||||
<div class="d-sm-flex justify-content-between flex-wrap flex-sm-nowrap mb-3 p-3 --bg_white --shadow --radius">
|
||||
<div class="d-flex align-items-center">
|
||||
<a href="#" class="d-none d-sm-block"><img src="{{ $comment->author->profile_photo_url }}" width="60px" height="60px" class="--radius_100"></a>
|
||||
<div class="flex-grow-1 mx-sm-3">
|
||||
<a href="#" class="--f_bold --f_main">{{ $comment->author->name }}</a>
|
||||
<small class="d-block mt-1 mb-3 mb-sm-0">{{ $comment->body }}</small>
|
||||
$positivComments = $plan->byPositive();
|
||||
|
||||
$negativeComments = $plan->byNegative();
|
||||
|
||||
$positiveCommmentsCount = $positivComments->count();
|
||||
|
||||
$negativeCommentsCount = $negativeComments->count();
|
||||
|
||||
@endphp
|
||||
|
||||
<div class="reviews__tabs tabs">
|
||||
<div class="tablist" role="tablist" aria-labelledby="label">
|
||||
<button wire:click='toggleTabpanelState("positive")' class="tab" role="tab" type="button" id="tab-1"
|
||||
aria-selected="{{ $tabpanelState['positive'] ? 'true' : 'false' }}"
|
||||
aria-controls="tabpanel-1">Положительные {{ $positiveCommmentsCount }}</button>
|
||||
<button wire:click='toggleTabpanelState("negative")' class="tab" role="tab" type="button" id="tab-2" aria-selected="{{$tabpanelState['negative'] ? 'true' : 'false'}}"
|
||||
aria-controls="tabpanel-2" tabindex="-1">Негативные {{ $negativeCommentsCount }}</button>
|
||||
</div>
|
||||
|
||||
<div @class([
|
||||
'tabpanel',
|
||||
'tabpanel--hidden' => $tabpanelState['negative']
|
||||
]) role="tabpanel" id="tabpanel-1" tabindex="0" aria-labelledby="tab-1">
|
||||
@foreach ($positivComments->get() as $comment)
|
||||
<div class="reviews__items">
|
||||
<div class="review">
|
||||
<div class="review__thumb">
|
||||
<img src="{{ $comment->author->profile_photo_url }}" class="cover-image" alt="user">
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex d-sm-block align-items-center lh-1">
|
||||
<div class="d-flex align-items-center">
|
||||
<svg width="15" height="14" class="mx-2"><use xlink:href="#GoldStar"></use></svg>
|
||||
<span class="--f_bold --f_light_gold">{{ $comment->grade }}</span>
|
||||
<div class="review__content">
|
||||
<div class="review__name">
|
||||
{{ $comment->author->name }}
|
||||
</div>
|
||||
<blockquote class="review__quote">
|
||||
{{ $comment->body }}
|
||||
</blockquote>
|
||||
</div>
|
||||
<div class="review__info">
|
||||
<div class="review__programm">
|
||||
{{ $plan->name }}
|
||||
</div>
|
||||
<div class="review__rate icon-star">
|
||||
{{ $comment->grade }}
|
||||
</div>
|
||||
{{-- @livewire('plan.comment.upvote', ['comment' => $comment]) --}}
|
||||
</div>
|
||||
@livewire('plan.comment.upvote', ['comment' => $comment])
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
<div class="tab-pane fade" id="negative" role="tabpanel" aria-labelledby="negative-tab">
|
||||
@foreach($negativeComments->get() as $comment)
|
||||
<div class="d-sm-flex justify-content-between flex-wrap flex-sm-nowrap mb-3 p-3 --bg_white --shadow --radius">
|
||||
<div class="d-flex align-items-center">
|
||||
<a href="#" class="d-none d-sm-block"><img src="{{ $comment->author->profile_photo_url }}" width="60px" height="60px" class="--radius_100"></a>
|
||||
<div class="flex-grow-1 mx-sm-3">
|
||||
<a href="#" class="--f_bold --f_main">{{ $comment->author->name }}</a>
|
||||
<small class="d-block mt-1 mb-3 mb-sm-0">{{ $comment->body }}</small>
|
||||
|
||||
|
||||
<div @class([
|
||||
'tabpanel',
|
||||
'tabpanel--hidden' => $tabpanelState['positive']
|
||||
]) role="tabpanel" id="tabpanel-1" tabindex="0" aria-labelledby="tab-1">
|
||||
@foreach ($negativeComments->get() as $comment)
|
||||
<div class="reviews__items">
|
||||
<div class="review">
|
||||
<div class="review__thumb">
|
||||
<img src="{{ $comment->author->profile_photo_url }}" class="cover-image" alt="user">
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex d-sm-block align-items-center lh-1">
|
||||
<div class="d-flex align-items-center">
|
||||
<svg width="15" height="14" class="mx-2"><use xlink:href="#GoldStar"></use></svg>
|
||||
<span class="--f_bold --f_light_gold">{{ $comment->grade }}</span>
|
||||
<div class="review__content">
|
||||
<div class="review__name">
|
||||
{{ $comment->author->name }}
|
||||
</div>
|
||||
<blockquote class="review__quote">
|
||||
{{ $comment->body }}
|
||||
</blockquote>
|
||||
</div>
|
||||
<div class="review__info">
|
||||
<div class="review__programm">
|
||||
{{ $plan->name }}
|
||||
</div>
|
||||
<div class="review__rate icon-star">
|
||||
{{ $comment->grade }}
|
||||
</div>
|
||||
{{-- @livewire('plan.comment.upvote', ['comment' => $comment]) --}}
|
||||
</div>
|
||||
@livewire('plan.comment.upvote', ['comment' => $comment])
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -373,8 +373,6 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
<div class="diet__services">
|
||||
<div class="diet__services-caption">
|
||||
<div class="diet__services-title title">
|
||||
|
||||
@@ -6,151 +6,121 @@
|
||||
$authorPhoto = $plan->present()->getAuthorPhoto;
|
||||
|
||||
$image = Storage::url($plan->image);
|
||||
$planViewsCount = views($plan)->unique()->count();
|
||||
$planViewsCount = views($plan)
|
||||
->unique()
|
||||
->count();
|
||||
@endphp
|
||||
@section('main_section')
|
||||
<section class="py-5" id="main">
|
||||
<div class="container d-flex justify-content-between align-items-center mb-4 ps-4 pe-3 py-3 --bg_white --shadow --radius --mw-1000">
|
||||
<a href="{{ route('plan.index', ['author' => $author->id]) }}" class="d-flex align-items-center --f_bold --f_main"><svg width="17" height="16" class="me-2"><use xlink:href="#GoBack"></use></svg><span class="d-none d-md-inline">Планы питания консультанта</span></a>
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="d-none d-md-flex me-3 align-items-center">
|
||||
<a href={{ route("profile.show", ['user' => $author]) }} class="me-2 text-nowrap --f_bold --f_main">
|
||||
<span class="me-2 text-nowrap --f_bold">{{ $author->name }}</span>
|
||||
<img src="{{ $authorPhoto }}" width="42px" height="42px" class="--radius_100" style="height: 42px;">
|
||||
<section class="page" id="main">
|
||||
<section class="settings">
|
||||
<div class="settings__container container-sm">
|
||||
|
||||
<div class="settings__header">
|
||||
<a href="" class="settings__back icon-arrow-short-left">
|
||||
<span>Планы питания консультанта</span>
|
||||
</a>
|
||||
</div>
|
||||
<a href="#" class="btn btn-lg btn-primary btn-block w-100 ps-4 pe-sm-4 --f_bold" target="_blank" style="max-width: 180px;">
|
||||
<svg width="20" height="20" class="me-3"><use xlink:href="#WhiteChat"></use></svg>НАПИСАТЬ</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="container mb-5 --mw-1000">
|
||||
<div class="row justify-content-between flex-lg-nowrap">
|
||||
<div class="col-lg-7 me-lg-4 mb-4 mb-lg-0 px-3 pt-3 pb-4 --bg_white --shadow --radius">
|
||||
<div class="d-flex justify-content-between align-items-center mb-2 --f_bold">
|
||||
<div class="h5 mb-0 --f_bold">{{ $plan->name }}</div>
|
||||
<div class="d-flex align-items-center">
|
||||
<svg width="20" height="14" class="me-2"><use xlink:href="#Eye_Black"></use></svg><span class="me-3 fs-5">{{ $planViewsCount }}</span>
|
||||
<svg width="16" height="14" class="me-2"><use xlink:href="#Heart_Black"></use></svg>@livewire('plan.like-count', ['plan' => $plan])
|
||||
<svg width="14" height="14" class="me-2"><use xlink:href="#CommentIcon"></use></svg><span class="me-3 fs-5">{{ $plan->comments_count }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<img src="{{ $image }}" class="w-100">
|
||||
|
||||
<div class="d-md-flex justify-content-between align-items-center my-3 px-3 py-1 bg_lightest_blue --radius">
|
||||
<table class="table table-sm-block --no_border me-5 mb-0 fs-4_5"><tbody>
|
||||
<tr>
|
||||
<td class="text-start ps-0 p-1">Время прохождения плана:</td>
|
||||
<td class="text-start p-1 --f_bold">{{ $plan->duration }} дней</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-start ps-0 p-1">Проходят план:</td>
|
||||
<td class="text-start p-1 --f_bold">2 пользователя</td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
{{-- <a href="#" class="d-none d-md-inline"><svg width="24" height="21" class="me-1"><use xlink:href="#HeartPath"></use></svg></a> --}}
|
||||
</div>
|
||||
|
||||
<div class="fs-4_5">{!! $plan->details !!}</div>
|
||||
|
||||
<div class="d-flex mt-4 align-items-center justify-content-between --f_bold">
|
||||
<a href="#plan-comment-textarea" class="d-flex align-items-center --f_main"><small>
|
||||
<svg width="21" height="20" class="me-1"><use xlink:href="#ActionComment"></use></svg>
|
||||
Комментировать
|
||||
</small></a>
|
||||
|
||||
@livewire('plan.like', ['plan' => $plan])
|
||||
|
||||
<a href="#" class="d-flex align-items-center --f_main"><small>
|
||||
<svg width="21" height="22" class="me-1"><use xlink:href="#Share"></use></svg>
|
||||
<span class="d-none d-sm-inline">Поделится</span>
|
||||
</small></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col px-0 flex-grow-1">
|
||||
<div class="accordion" id="collapsedPlans">
|
||||
<div class="accordion-item mb-3 --bg_white --shadow --radius overflow-hidden">
|
||||
<div class="accordion-header" id="headingOne">
|
||||
<div class="accordion-button d-flex align-items-center fs-4" type="button" data-bs-toggle="collapse" data-bs-target="#collapsedPlan1" aria-expanded="true" aria-controls="collapsedPlan1">
|
||||
<div class="me-3 --f_bold">{{ $options1['price'] ?? '0' }} ₽</div>
|
||||
<div>{{ $options1['short'] ?? ''}}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapsedPlan1" class="accordion-collapse collapse show" aria-labelledby="collapsedPlan1" data-bs-parent="#collapsedPlans">
|
||||
<div class="accordion-body fs-4_5">
|
||||
<p>{{ $options1['description'] ?? '' }}</p>
|
||||
@isset($options1['items'])
|
||||
<ul class="checks -reverse --sber">
|
||||
@foreach($options1['items'] as $item)
|
||||
<li>{{ $item }}</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
@endisset
|
||||
<a href="#" class="btn btn-lg btn-success btn-block w-100 py-2 fs-4 --f_bolder">Заказать за {{ $options1['price'] ?? '0' }} ₽</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if($plan->packets_count == 3)
|
||||
<div class="accordion-item mb-3 --bg_white --shadow --radius overflow-hidden">
|
||||
<div class="accordion-header" id="headingOne">
|
||||
<div class="accordion-button collapsed d-flex align-items-center fs-4" type="button" data-bs-toggle="collapse" data-bs-target="#collapsedPlan2" aria-expanded="true" aria-controls="collapsedPlan2">
|
||||
<div class="me-3 --f_bold">{{ $options2['price'] ?? '0' }} ₽</div>
|
||||
<div>{{ $options2['short'] ?? '' }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapsedPlan2" class="accordion-collapse collapse" aria-labelledby="collapsedPlan2" data-bs-parent="#collapsedPlans">
|
||||
<div class="accordion-body fs-4_5">
|
||||
<p>{{ $options2['description'] ?? '' }}</p>
|
||||
@isset($options2['items'])
|
||||
<ul class="checks -reverse --sber">
|
||||
@foreach($options2['items'] as $item)
|
||||
<li>{{ $item }}</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
@endisset
|
||||
<a href="#" class="btn btn-lg btn-success btn-block w-100 py-2 fs-4 --f_bolder">Заказать за {{ $options2['price'] ?? '0' }} ₽</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="accordion-item --bg_white --shadow --radius overflow-hidden">
|
||||
<div class="accordion-header" id="headingOne">
|
||||
<div class="accordion-button collapsed d-flex align-items-center fs-4" type="button" data-bs-toggle="collapse" data-bs-target="#collapsedPlan3" aria-expanded="true" aria-controls="collapsedPlan3">
|
||||
<div class="me-3 --f_bold">{{ $options3['price'] ?? '0' }} ₽</div>
|
||||
<div>{{ $options3['short'] ?? '' }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapsedPlan3" class="accordion-collapse collapse" aria-labelledby="collapsedPlan3" data-bs-parent="#collapsedPlans">
|
||||
<div class="accordion-body fs-4_5">
|
||||
<p>{{ $options3['description'] ?? '' }}</p>
|
||||
@isset($options3['items'])
|
||||
<ul class="checks -reverse --sber">
|
||||
@foreach($options3['items'] as $item)
|
||||
<li>{{ $item }}</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
@endisset
|
||||
<a href="#" class="btn btn-lg btn-success btn-block w-100 py-2 fs-4 --f_bolder">Заказать за {{ $options3['price'] ?? '0' }} ₽</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="settings__actions">
|
||||
<div class="settings__action setting__person">
|
||||
<div class="settings__person-content">
|
||||
<a href="{{ route('profile.show', ['user' => $author]) }}" class="setting__person-name">
|
||||
{{ $author->name }}
|
||||
</a>
|
||||
</div>
|
||||
<a href="" class="settings__person-thumb">
|
||||
<img src="{{ $authorPhoto }}" alt="thumb">
|
||||
</a>
|
||||
</div>
|
||||
<a href="" class="settings__action btn btn-md btn-primary icon-message-square">
|
||||
<span>Написать</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="container px-0 mb-4 --mw-1000">
|
||||
<div class="h4 mb-4 --f_grey">ОТЗЫВЫ</div>
|
||||
</div>
|
||||
|
||||
@livewire('plan.comment.show', ['plan' => $plan])
|
||||
@livewire('plan.comment.create', ['plan' => $plan, 'user' => Auth::user()])
|
||||
</section>
|
||||
<div class="settings__plans">
|
||||
<div class="settings__plans-body">
|
||||
<div class="settings__plans-announcement announcement">
|
||||
<div class="announcement__header">
|
||||
<div class="announcement__header-title title">
|
||||
{{ $plan->name }}
|
||||
</div>
|
||||
<div class="announcement__header-stats">
|
||||
<div class="announcement__header-stat icon-eye-fill">{{ $planViewsCount }}</div>
|
||||
<div class="announcement__header-stat icon-heart-fill">@livewire('plan.like-count', ['plan' => $plan])</div>
|
||||
<div class="announcement__header-stat icon-message-square">{{ $plan->comments_count }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="announcement__image">
|
||||
<img src="{{ $image }}" class="cover-image" alt="announcement">
|
||||
</div>
|
||||
|
||||
|
||||
<div class="announcement__details">
|
||||
<div class="announcement__details-rows">
|
||||
<div class="announcement__details-row">
|
||||
<div class="announcement__details-caption">
|
||||
Время прохождения плана:
|
||||
</div>
|
||||
<div class="announcement__details-value">
|
||||
{{ $plan->duration }} дней
|
||||
</div>
|
||||
</div>
|
||||
<div class="announcement__details-row">
|
||||
<div class="announcement__details-caption">
|
||||
Проходят план:
|
||||
</div>
|
||||
<div class="announcement__details-value">
|
||||
2 пользователя
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button type="button" class="announcement__details-btn icon-heart"></button>
|
||||
</div>
|
||||
|
||||
<p class="announcement__desc">
|
||||
{{ $plan->details }}
|
||||
</p>
|
||||
|
||||
{{-- @livewire('plan.like', ['plan' => $plan]) --}}
|
||||
|
||||
<div class="announcement__footer">
|
||||
<button type="button"
|
||||
class="announcement__footer-action icon-message-square">Комментировать</button>
|
||||
<button type="button" class="announcement__footer-action icon-heart">Нравится</button>
|
||||
<button type="button" class="announcement__footer-action icon-share">Поделится</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@livewire('plan.accordion', ['plan' => $plan])
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<section class="reviews">
|
||||
<div class="reviews__container">
|
||||
<h2 class="reviews__title title">
|
||||
ОТЗЫВЫ
|
||||
</h2>
|
||||
|
||||
@livewire('plan.comment.show', ['plan' => $plan])
|
||||
@livewire('plan.comment.create', ['plan' => $plan, 'user' => Auth::user()])
|
||||
</div>
|
||||
|
||||
|
||||
</section>
|
||||
</section>
|
||||
@endsection
|
||||
|
||||
@push('jq_scripts')
|
||||
<script src="/js/bootstrap.min.js"></script>
|
||||
<script src="/js/bootstrap.bundle.min.js"></script>
|
||||
{{-- <script src="js/app.min.js"></script> --}}
|
||||
<script src="/js/bootstrap.min.js"></script>
|
||||
<script src="/js/bootstrap.bundle.min.js"></script>
|
||||
@endpush
|
||||
|
||||
Reference in New Issue
Block a user