MyAd.php
<?php
namespace AppLivewire;
use AppModelsEstate;
use Auth;
use LivewireComponent;
class MyAd extends Component
{
public $active = [];
public $fail = [];
public $archive = [];
public $note = [];
public $moderation = [];
public $user_id;
public $search;
public function mount()
{
$this->user_id = Auth::guard('web')->id();
$this->listAd();
}
public function render()
{
return view('livewire.my-ad');
}
private function listAd(): void
{
if ($this->search != '') {
$estates = Estate::where('user_id', $this->user_id)->where('id', 'like', $this->search)->orderBy('id', 'desc');
} else {
$estates = Estate::where('user_id', $this->user_id)->orderBy('id', 'desc');
}
$this->active = (clone $estates)->where('status', Estate::STATUS_ACTIVE)->get();
$this->fail = (clone $estates)->where('status', Estate::STATUS_FAIL)->get();
$this->archive = (clone $estates)->where('status', Estate::STATUS_ARCHIVE)->get();
$this->note = (clone $estates)->where('status', Estate::STATUS_NOTE)->get();
$this->moderation = (clone $estates)->whereIn('status', [Estate::STATUS_NEW, Estate::STATUS_UPDATE])->get();
}
public function searchAd()
{
$this->listAd();
}
}
my-ad.blade.php
@php
$activeTab = '#adv1';
if (count($active) > 0 && count($note) == 0 && count($moderation) == 0) {
$activeTab = '#adv1';
} else if (count($moderation) > 0) {
$activeTab = '#adv5';
} else if (count($active) == 0 && count($note) > 0 && count($moderation) == 0) {
$activeTab = '#adv4';
} else if (count($active) == 0 && count($note) == 0 && count($moderation) == 0 && count($fail) == 0) {
$activeTab = '#adv1';
} else if (count($active) == 0 && count($note) == 0 && count($moderation) == 0 && count($fail) > 0) {
$activeTab = '#adv2';
} else if (count($active) == 0 && count($note) == 0 && count($moderation) == 0 && count($fail) == 0 && count($archive) > 0) {
$activeTab = '#adv3';
}
@endphp
<div class="right-board">
<div class="caption-h-btn mobile-wrap">
<h1>@lang('app.Мои объявления')</h1>
<div class="small-search-field">
<i class="ico-search"></i>
<input type="text" wire:model="search" wire:keydown.enter="searchAd()"
placeholder="@lang('app.Поиск объявлений')">
</div>
</div>
<div class="tab-wrapper">
<div class="overflow-scroll-box">
<ul class="head-tab like-button2 white-space-nowrap">
<li><a href="#adv1"
@if ($activeTab == '#adv1') class="active" @endif>@lang('app.Активные') {{count($active)}}</a>
</li>
<li><a href="#adv2"
@if ($activeTab == '#adv2') class="active" @endif>@lang('app.Отклоненные') {{count($fail)}}</a>
</li>
<li><a href="#adv3"
@if ($activeTab == '#adv3') class="active" @endif>@lang('app.Архив') {{count($archive)}}</a></li>
<li><a href="#adv4"
@if ($activeTab == '#adv4') class="active" @endif>@lang('app.Черновики') {{count($note)}}</a>
</li>
<li><a href="#adv5"
@if ($activeTab == '#adv5') class="active" @endif>@lang('app.На модерации') {{count($moderation)}}</a>
</li>
</ul>
</div>
<div class="body-tab {{$activeTab == '#adv1' ? 'active' : ''}}" id="adv1">
@foreach($active as $item)
<div class="box-board-border">
@include('inc.ad_profile', ['item' => $item])
</div>
@endforeach
@if (count($active) == 0)
<p class="clean-tab-text">@lang('app.У вас нет добавленных объявлений')</p>
@endif
</div>
<div class="body-tab {{$activeTab == '#adv2' ? 'active' : ''}}" id="adv2">
@foreach ($fail as $item)
<div class="box-board-border">
@include('inc.ad_profile', ['item' => $item])
</div>
@endforeach
</div>
<div class="body-tab {{$activeTab == '#adv3' ? 'active' : ''}}" id="adv3">
@foreach ($archive as $item)
<div class="box-board-border" wire:id="my-ad-{{$item->id}}">
@include('inc.ad_profile', ['item' => $item])
</div>
@endforeach
</div>
<div class="body-tab {{$activeTab == '#adv4' ? 'active' : ''}}" id="adv4">
@foreach ($note as $item)
<div class="box-board-border">
@include('inc.ad_profile', ['item' => $item])
</div>
@endforeach
</div>
<div class="body-tab {{$activeTab == '#adv5' ? 'active' : ''}}" id="adv5">
@foreach ($moderation as $item)
<div class="box-board-border">
@include('inc.ad_profile', ['item' => $item])
</div>
@endforeach
</div>
</div>
</div>
ad-profile.blade.php
<div class="one-adv-board {{$item->status == AppModelsEstate::STATUS_ARCHIVE ? 'old' : ''}}">
@if($item->status == AppModelsEstate::STATUS_ARCHIVE)
<div class="status-board-adv">@lang('app.В архиве')</div>
@endif
<div class="top-part">
<div class="box-img"><img src="{{$item->getCover()}}" alt="img"></div>
<div class="description">
<div class="des-number">
<div class="price">{{$item->formatPrice()}}
<div class="old-price">{{$item->priceByMetr()}}</div>
</div>
<div class="number-adv">@lang('app.Номер объявления:') {{$item->id}}</div>
</div>
<p>{{$item->title}}</p>
</div>
</div>
@if ($item->status == AppModelsEstate::STATUS_ACTIVE)
<hr>
<div class="statistic">
<div class="one-stat">
<div class="number">{{AppModelsAnalytic::getData([AppModelsAnalytic::TYPE_SHOW_IN_SEARCH, AppModelsAnalytic::TYPE_SHOW_IN_HOME, AppModelsAnalytic::TYPE_SHOW_IN_AD], $item->id)}}</div>
@lang('app.Показов в поиске')
</div>
<div class="one-stat">
<div class="number">{{AppModelsAnalytic::getData([AppModelsAnalytic::TYPE_VIEW], $item->id, [now()->modify("-30days")->format("Y-m-d"), now()->format("Y-m-d")])}}</div>
@lang('app.Просмотр за месяц')
</div>
<div class="one-stat">
<div class="number">{{AppModelsAnalytic::getData([AppModelsAnalytic::TYPE_SHOW_IN_SEARCH, AppModelsAnalytic::TYPE_SHOW_IN_HOME, AppModelsAnalytic::TYPE_SHOW_IN_AD], $item->id, [now()->format("Y-m-d"), now()->format("Y-m-d")])}}</div>
@lang('app.Показов сегодня')
</div>
<div class="one-stat">
<div class="number">{{AppModelsAnalytic::getData([AppModelsAnalytic::TYPE_ADD_TO_FAVORITE], $item->id)}}</div>
@lang('app.Добавили в избранное')
</div>
</div>
<hr>
<div class="list-buttons-board">
<a href="#" class="active">@lang('app.Продать быстрее с риелтором')</a>
<a href="#promoteAd-{{$item->id}}" class="btn-change-modal"><i
class="ico-trending-up"></i><span>@lang('app.Продвинуть')</span></a>
<a href="{{AppModelsMenu::makeLink('item', ['id' => $item->id])}}" target="_blank"><i
class="ico-external-link"></i><span>@lang('app.Открыть')</span></a>
<a href="{{AppModelsMenu::makeLink('ad-edit', ['id' => $item->id])}}"><i
class="ico-edit-3"></i><span>@lang('app.Редактировать')</span></a>
<a href="#moveAnnouncement-{{$item->id}}" class="btn-change-modal"><i
class="ico-x-octagon"></i><span>@lang('app.Снять с публикации')</span></a>
</div>
@else
@php
switch ($item->status) {
case AppModelsEstate::STATUS_FAIL:
$buttons = [['icon' => 'ico-edit-3', 'title' => __('app.Редактировать'), 'link' => AppModelsMenu::makeLink('ad-edit', ['id' => $item->id])], ['icon' => 'ico-trash-2', 'title' => __('app.Удалить'), 'prop' => 'wire:click.prevent=removeAd('.$item->id.') wire:confirm="'. __('app.Вы действительно хотите удалить объявление?').'"']];
if (!is_null($item->reject_reason)) {
$reason = AppModelsEstateRejectReason::find($item->reject_reason);
$content = '<ul class="list-statuses">
<li class="status-search gray">'.$reason->t('text').'</li>
</ul>
<hr>';
} else {
$content = '<hr>';
}
break;
case AppModelsEstate::STATUS_ARCHIVE:
$buttons = [['icon' => 'ico-corner-up-left', 'title' => __('app.Восстановить'), 'prop' => 'wire:click.prevent=moveToActive('.$item->id.')', 'modal' => 'fromArchive'], ['icon' => 'ico-trash-2', 'title' => __('app.Удалить'), 'prop' => 'wire:click.prevent=removeAd('.$item->id.') wire:confirm="'. __('app.Вы действительно хотите удалить объявление?').'"']];
$content = '';
break;
case AppModelsEstate::STATUS_NOTE:
$prompt = __('app.Вы действительно хотите удалить объявление?');
$buttons = [
[
'icon' => 'ico-edit-3',
'title' => __('app.Редактировать'),
'link' => AppModelsMenu::makeLink('ad-edit', ['id' => $item->id])
],
[
'icon' => 'ico-trash-2',
'title' => __('app.Удалить'),
'prop' => 'wire:click.prevent=removeAd('.$item->id.') wire:confirm="'.$prompt.'"'
]
];
break;
case AppModelsEstate::STATUS_UPDATE:
case AppModelsEstate::STATUS_NEW:
$buttons = [
[
'icon' => 'ico-edit-3',
'title' => __('app.Редактировать'),
'link' => AppModelsMenu::makeLink('ad-edit', ['id' => $item->id])
],
];
break;
default:
$content = '';
$buttons = [];
break;
}
@endphp
<hr>
{!! $content ?? '' !!}
<div class="list-buttons-board">
@foreach($buttons as $button)
@if (isset($button['modal']) && $button['modal'] == 'fromArchive' && $item->active_to < now()->format("Y-m-d H:i:s"))
<livewire:return-ad template="mini" wire:key="return-ad-{{$item->id}}" :estate_id="$item->id"/>
@else
<a href="{!! $button['link'] ?? '' !!}" {!! $button['prop'] ?? '' !!}><i
class="{{$button['icon']}}"></i><span>{{$button['title']}}</span></a>
@endif
@endforeach
</div>
@endif
<div class="wrapper-custom-modal size3 without-scroll" id="promoteAd-{{$item->id}}">
<livewire:service :estate_id="$item->id" wire:key="service-{{$item->id}}" view="service-big"/>
<div class="close-modal-bg"></div>
</div>
<div class="wrapper-custom-modal size2" id="moveAnnouncement-{{$item->id}}">
<div class="modal-custom">
<div class="caption-modal">
@lang('app.Перенести объявления в архив')
<div class="close-btn-style close-btn-modal"><i class="ico-close-l"></i></div>
</div>
<div class="gray-style-1 mb-16">
@lang('app.Объявления хранятся в архиве бесплатно. Все данные по нему будут сохранены и вы сможете опубликовать его повторно.')
</div>
<a href="#" wire:click.prevent="moveToArchive({{$item->id}})"
class="btn-dark inline secondary">@lang('app.Перенести в архив')</a>
</div>
<div class="close-modal-bg"></div>
</div>
</div>
when I enter the ad id and press enter, I get an error:
Uncaught Snapshot missing on Livewire component with id:
I noticed 2 points. The first – if you enter such an id that does not exist, then nothing is displayed (which is correct) and there is no error. the impression is that the error occurs because one element is missing.
The second point: if I deduce that
<div class="body-tab {{$activeTab == '#adv4' ? 'active' : ''}}" id="adv4">
@foreach ($note as $item)
<div class="box-board-border">
{{$item->id}}
</div>
@endforeach
</div>
There is no mistake either. i tried adding wire:key, wire:id, :key – all the same