[fix] placeholder gone, change search requests, report tab didn't have a pendin g message.
This commit is contained in:
parent
1b47aaf168
commit
43cbf913c9
|
|
@ -19,15 +19,16 @@ class BuildReports extends Command
|
|||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Command description';
|
||||
protected $description = 'Builds reports for all the projects';
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
|
||||
// TODO schedule all the project if mail
|
||||
Project::find(1)->schedule();
|
||||
Project::all()->each(function (Project $project) {
|
||||
$project->schedule();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
use App\Models\Project;
|
||||
use App\Models\ProjectReport;
|
||||
use App\Rules\AllMosaicsPresentRule;
|
||||
use Illuminate\Database\Query\Builder;
|
||||
use Livewire\Attributes\Lazy;
|
||||
use Livewire\Component;
|
||||
use Livewire\WithPagination;
|
||||
|
|
@ -85,14 +86,13 @@ public function deleteReport(ProjectReport $report)
|
|||
$this->dispatch('refresh');
|
||||
}
|
||||
|
||||
private function applySearch($query)
|
||||
private function applySearch(Builder $query)
|
||||
{
|
||||
if ($this->search) {
|
||||
$query->where('name', 'like', '%'.$this->search.'%');
|
||||
$query->orWhere('year', 'like', '%'.$this->search.'%');
|
||||
$query->orWhere('week', 'like', '%'.$this->search.'%');
|
||||
}
|
||||
return $query;
|
||||
return $query->when($this->search !== '', function ($q){
|
||||
$q->where('name', 'like', '%'.$this->search.'%')
|
||||
->orWhere('year', 'like', '%'.$this->search.'%')
|
||||
->orWhere('week', 'like', '%'.$this->search.'%');
|
||||
});
|
||||
}
|
||||
|
||||
public function placeholder()
|
||||
|
|
|
|||
|
|
@ -71,15 +71,9 @@ public function saveDownloads()
|
|||
|
||||
private function applySearch($query)
|
||||
{
|
||||
if ($this->search) {
|
||||
$query->where('name', 'like', '%' . $this->search . '%');
|
||||
}
|
||||
return $query;
|
||||
}
|
||||
|
||||
public function placeholder()
|
||||
{
|
||||
return view('livewire.projects.download-manager-placeholder');
|
||||
return $query->when($this->search !== '', function ($q){
|
||||
$q->where('name', 'like', '%'.$this->search.'%');
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ class Mailings extends Component
|
|||
{
|
||||
use WithPagination;
|
||||
|
||||
public $project;
|
||||
public Project $project;
|
||||
public $mailingDetailsModal = false;
|
||||
|
||||
public $formData = [
|
||||
|
|
@ -57,15 +57,9 @@ private function resetFormData()
|
|||
|
||||
private function applySearch($query)
|
||||
{
|
||||
if ($this->search) {
|
||||
$query->where('subject', 'like', '%'.$this->search.'%');
|
||||
}
|
||||
return $query;
|
||||
}
|
||||
|
||||
public function placeholder()
|
||||
{
|
||||
return view('livewire.projects.mailing-manager-placeholder');
|
||||
return $query->when($this->search !== '', function ($q){
|
||||
$q->where('subject', 'like', '%'.$this->search.'%');
|
||||
});
|
||||
}
|
||||
|
||||
public function render()
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ class Mosaic extends Component
|
|||
{
|
||||
use WithPagination;
|
||||
|
||||
public $project;
|
||||
public Project $project;
|
||||
|
||||
public $formData = [
|
||||
'week' => '',
|
||||
|
|
@ -66,12 +66,11 @@ public function getDateRangeProperty()
|
|||
|
||||
private function applySearch($query)
|
||||
{
|
||||
if ($this->search) {
|
||||
$query->where('name', 'like', '%' . $this->search . '%');
|
||||
$query->orWhere('year', 'like', '%' . $this->search . '%');
|
||||
$query->orWhere('week', 'like', '%' . $this->search . '%');
|
||||
}
|
||||
return $query;
|
||||
return $query->when($this->search !== '', function ($q){
|
||||
$q->where('name', 'like', '%'.$this->search.'%')
|
||||
->orWhere('year', 'like', '%' . $this->search . '%')
|
||||
->orWhere('week', 'like', '%' . $this->search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
public function update($property)
|
||||
|
|
@ -80,10 +79,6 @@ public function update($property)
|
|||
$this->resetPage('mosaicPage');
|
||||
}
|
||||
}
|
||||
public function placeholder()
|
||||
{
|
||||
return view('livewire.projects.mosaic-manager-placeholder');
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ class Report extends Component
|
|||
use WithPagination;
|
||||
|
||||
public $formData = [];
|
||||
public $project_id;
|
||||
public Project $project;
|
||||
|
||||
public $search = "";
|
||||
|
||||
|
|
@ -38,10 +38,10 @@ public function saveProjectReport()
|
|||
$this->validate([
|
||||
'formData.week' => ['required', 'integer', 'min:1', 'max:53'],
|
||||
'formData.year' => 'required|integer|min:2020|max:'.now()->addYear()->year,
|
||||
'formData' => [new AllMosaicsPresentRule($this->project_id)],
|
||||
'formData' => [new AllMosaicsPresentRule($this->project->id)],
|
||||
]);
|
||||
|
||||
$newReport = Project::find($this->project_id)
|
||||
$newReport = Project::find($this->project->id)
|
||||
->reports()->create([
|
||||
'name' => 'Report for week '.$this->formData['week'].' of '.$this->formData['year'],
|
||||
'week' => $this->formData['week'],
|
||||
|
|
@ -79,22 +79,23 @@ public function deleteReport(ProjectReport $report)
|
|||
|
||||
private function applySearch($query)
|
||||
{
|
||||
if ($this->search) {
|
||||
$query->where('name', 'like', '%'.$this->search.'%');
|
||||
$query->orWhere('year', 'like', '%'.$this->search.'%');
|
||||
$query->orWhere('week', 'like', '%'.$this->search.'%');
|
||||
}
|
||||
return $query;
|
||||
return $query->when($this->search !== '', function ($q){
|
||||
$q->where('name', 'like', '%'.$this->search.'%')
|
||||
->orWhere('year', 'like', '%'.$this->search.'%')
|
||||
->orWhere('week', 'like', '%'.$this->search.'%');
|
||||
});
|
||||
// if ($this->search) {
|
||||
// $query->where('name', 'like', '%'.$this->search.'%');
|
||||
// $query->orWhere('year', 'like', '%'.$this->search.'%');
|
||||
// $query->orWhere('week', 'like', '%'.$this->search.'%');
|
||||
// }
|
||||
// return $query;
|
||||
}
|
||||
|
||||
public function placeholder()
|
||||
{
|
||||
return view('livewire.projects.report-manager-placeholder');
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
$query = Project::find($this->project_id)
|
||||
$query = Project::find($this->project->id)
|
||||
->reports()
|
||||
->orderBy('year', 'desc')
|
||||
->orderBy('week', 'desc');
|
||||
|
|
|
|||
|
|
@ -230,6 +230,10 @@ public function hasPendingDownload(): bool
|
|||
{
|
||||
return $this->downloads()->statusPending()->count() > 0;
|
||||
}
|
||||
public function hasPendingReport(): bool
|
||||
{
|
||||
return $this->reports()->statusPending()->count() > 0;
|
||||
}
|
||||
|
||||
public function hasPendingMosaic(): bool
|
||||
{
|
||||
|
|
|
|||
|
|
@ -0,0 +1,168 @@
|
|||
<tr>
|
||||
<td class="whitespace-nowrap px-3 py-4 text-sm text-gray-500">
|
||||
{{ $report->created_at->diffForHumans() }}
|
||||
</td>
|
||||
|
||||
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6 lg:pl-8">{{ $report->name }}</td>
|
||||
<td class="whitespace-nowrap px-3 py-4 text-sm text-gray-500">
|
||||
@if($report->status == \App\Enums\Status::Pending)
|
||||
<x-badge status="pending" wire:poll.1s=""></x-badge>
|
||||
@else
|
||||
<x-badge :status="$report->status"></x-badge>
|
||||
@endif
|
||||
</td>
|
||||
<td class="py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6 lg:pr-8 flex justify-end">
|
||||
<x-menu>
|
||||
<x-menu.button>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
|
||||
stroke="currentColor" class="w-6 h-6">
|
||||
<path stroke-linecap="round" stroke-linejoin="round"
|
||||
d="M6.75 12a.75.75 0 11-1.5 0 .75.75 0 011.5 0zM12.75 12a.75.75 0 11-1.5 0 .75.75 0 011.5 0zM18.75 12a.75.75 0 11-1.5 0 .75.75 0 011.5 0z"/>
|
||||
</svg>
|
||||
</x-menu.button>
|
||||
|
||||
<x-menu.items>
|
||||
<x-menu.close>
|
||||
<x-menu.item wire:click="download">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
|
||||
stroke="currentColor" class="w-4 h-4">
|
||||
<path stroke-linecap="round" stroke-linejoin="round"
|
||||
d="m20.25 7.5-.625 10.632a2.25 2.25 0 0 1-2.247 2.118H6.622a2.25 2.25 0 0 1-2.247-2.118L3.75 7.5m8.25 3v6.75m0 0-3-3m3 3 3-3M3.375 7.5h17.25c.621 0 1.125-.504 1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125Z"/>
|
||||
</svg>
|
||||
|
||||
Download
|
||||
</x-menu.item>
|
||||
</x-menu.close>
|
||||
|
||||
<x-dialog>
|
||||
<x-dialog.open>
|
||||
<x-menu.close>
|
||||
<x-menu.item>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor" class="w-4 h-4">
|
||||
<path stroke-linecap="round" stroke-linejoin="round"
|
||||
d="M9 3.75H6.912a2.25 2.25 0 0 0-2.15 1.588L2.35 13.177a2.25 2.25 0 0 0-.1.661V18a2.25 2.25 0 0 0 2.25 2.25h15A2.25 2.25 0 0 0 21.75 18v-4.162c0-.224-.034-.447-.1-.661L19.24 5.338a2.25 2.25 0 0 0-2.15-1.588H15M2.25 13.5h3.86a2.25 2.25 0 0 1 2.012 1.244l.256.512a2.25 2.25 0 0 0 2.013 1.244h3.218a2.25 2.25 0 0 0 2.013-1.244l.256-.512a2.25 2.25 0 0 1 2.013-1.244h3.859M12 3v8.25m0 0-3-3m3 3 3-3"/>
|
||||
</svg>
|
||||
|
||||
Create Mail
|
||||
</x-menu.item>
|
||||
</x-menu.close>
|
||||
</x-dialog.open>
|
||||
|
||||
<x-dialog.panel wire:model="createMailingModal">
|
||||
<form wire:submit="createMailing" class="flex flex-col gap-4">
|
||||
<h2 class="text-3xl font-bold mb-1">@lang('Create report email')</h2>
|
||||
|
||||
<hr class="w-[75%]">
|
||||
|
||||
<label class="flex flex-col gap-2">
|
||||
@lang('Recipients')
|
||||
@foreach($mailingForm->recipients as $recipient)
|
||||
<span
|
||||
class="inline-flex items-center gap-x-1.5 rounded-md bg-gray-100 px-2 py-1 text-xs font-medium text-gray-600">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
|
||||
class="w-4 h-4">
|
||||
<path stroke-linecap="round" stroke-linejoin="round"
|
||||
d="M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z"/>
|
||||
</svg>
|
||||
|
||||
|
||||
[{{ $recipient['name'] }}] {{ $recipient['email'] }}
|
||||
</span>
|
||||
@endforeach
|
||||
|
||||
</label>
|
||||
|
||||
<label class="flex flex-col gap-2">
|
||||
@lang('Subject')
|
||||
<input autofocus wire:model="mailingForm.subject"
|
||||
class="px-3 py-2 border font-normal rounded-lg border-slate-300 read-only:opacity-50 read-only:cursor-not-allowed">
|
||||
@error('mailingForm.subject')
|
||||
<div class="text-sm text-red-500 font-normal">{{ $message }}</div>@enderror
|
||||
</label>
|
||||
|
||||
<label class="flex flex-col gap-2">
|
||||
@lang('Content')
|
||||
<textarea wire:model="mailingForm.message" rows="5"
|
||||
class="px-3 py-2 border font-normal rounded-lg border-slate-300 read-only:opacity-50 read-only:cursor-not-allowed"></textarea>
|
||||
@error('mailingForm.message')
|
||||
<div class="text-sm text-red-500 font-normal">{{ $message }}</div>@enderror
|
||||
</label>
|
||||
|
||||
<label class="flex flex-col gap-2">
|
||||
@lang('Report')
|
||||
<span
|
||||
class="inline-flex items-center gap-x-1.5 rounded-md bg-gray-100 px-2 py-1 text-xs font-medium text-gray-600">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
|
||||
class="w-4 h-4">
|
||||
<path stroke-linecap="round" stroke-linejoin="round"
|
||||
d="M13.19 8.688a4.5 4.5 0 0 1 1.242 7.244l-4.5 4.5a4.5 4.5 0 0 1-6.364-6.364l1.757-1.757m13.35-.622 1.757-1.757a4.5 4.5 0 0 0-6.364-6.364l-4.5 4.5a4.5 4.5 0 0 0 1.242 7.244"/>
|
||||
</svg>
|
||||
|
||||
{{ $report->name }}
|
||||
</span>
|
||||
|
||||
</label>
|
||||
|
||||
<x-dialog.footer>
|
||||
<x-dialog.close>
|
||||
<button type="button"
|
||||
class="text-center rounded-xl bg-slate-300 text-slate-800 px-6 py-2 font-semibold">
|
||||
Cancel
|
||||
</button>
|
||||
</x-dialog.close>
|
||||
<x-dialog.close>
|
||||
<button type="submit"
|
||||
class="text-center rounded-xl bg-blue-500 text-white px-6 py-2 font-semibold disabled:cursor-not-allowed disabled:opacity-50">
|
||||
Save
|
||||
</button>
|
||||
</x-dialog.close>
|
||||
</x-dialog.footer>
|
||||
</form>
|
||||
</x-dialog.panel>
|
||||
</x-dialog>
|
||||
|
||||
<x-dialog>
|
||||
<x-dialog.open>
|
||||
<x-menu.item>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor"
|
||||
class="w-4 h-4">
|
||||
<path fill-rule="evenodd"
|
||||
d="M8.75 1A2.75 2.75 0 006 3.75v.443c-.795.077-1.584.176-2.365.298a.75.75 0 10.23 1.482l.149-.022.841 10.518A2.75 2.75 0 007.596 19h4.807a2.75 2.75 0 002.742-2.53l.841-10.52.149.023a.75.75 0 00.23-1.482A41.03 41.03 0 0014 4.193V3.75A2.75 2.75 0 0011.25 1h-2.5zM10 4c.84 0 1.673.025 2.5.075V3.75c0-.69-.56-1.25-1.25-1.25h-2.5c-.69 0-1.25.56-1.25 1.25v.325C8.327 4.025 9.16 4 10 4zM8.58 7.72a.75.75 0 00-1.5.06l.3 7.5a.75.75 0 101.5-.06l-.3-7.5zm4.34.06a.75.75 0 10-1.5-.06l-.3 7.5a.75.75 0 101.5.06l.3-7.5z"
|
||||
clip-rule="evenodd"/>
|
||||
</svg>
|
||||
|
||||
Delete
|
||||
</x-menu.item>
|
||||
</x-dialog.open>
|
||||
|
||||
|
||||
<x-dialog.panel>
|
||||
<div class="flex flex-col gap-6">
|
||||
<h2 class="font-semibold text-3xl">Are you sure you?</h2>
|
||||
<h2 class="text-lg text-slate-700">This operation is permanent and can not be reversed.</h2>
|
||||
<x-dialog.footer>
|
||||
<x-dialog.close>
|
||||
<button type="button"
|
||||
class="text-center rounded-xl bg-slate-300 text-slate-800 px-6 py-2 font-semibold">
|
||||
Cancel
|
||||
</button>
|
||||
</x-dialog.close>
|
||||
|
||||
<x-dialog.close>
|
||||
<button wire:click="$parent.deleteReport('{{ $report->id }}')" type="button"
|
||||
class="text-center rounded-xl bg-red-500 text-white px-6 py-2 font-semibold disabled:cursor-not-allowed disabled:opacity-50">
|
||||
Delete
|
||||
</button>
|
||||
</x-dialog.close>
|
||||
</x-dialog.footer>
|
||||
</div>
|
||||
</x-dialog.panel>
|
||||
</x-dialog>
|
||||
</x-menu.items>
|
||||
</x-menu>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
|
|
@ -24,7 +24,7 @@ class="rounded-md bg-indigo-600 px-3 py-2 justify-center text-center text-sm fon
|
|||
</div>
|
||||
<div class="mt-8 flow-root">
|
||||
<div class="relative">
|
||||
<div class="overflow-x-auto sm:-mx-6 lg:-mx-8">
|
||||
<div class="">
|
||||
<div class="inline-block min-w-full py-2 align-middle">
|
||||
<table class="min-w-full divide-y divide-gray-300">
|
||||
<thead>
|
||||
|
|
@ -67,7 +67,6 @@ class="px-3 py-3.5 text-right pr-4 sm:pr-8 lg:pr-8 text-sm font-semibold text-gr
|
|||
{{ $downloads->links('livewire.pagination') }}
|
||||
</div>
|
||||
</div>
|
||||
{{-- <div wire:loading class="absolute inset-0 bg-white opacity-75"></div>--}}
|
||||
</div>
|
||||
</div>
|
||||
<x-download-create-modal :manager="$this"/>
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="mt-8 ">
|
||||
<div class="overflow-x-auto sm:-mx-6 lg:-mx-8">
|
||||
<div class="">
|
||||
<div class="inline-block min-w-full py-2 align-middle mb-10">
|
||||
<div class="">
|
||||
<table class="min-w-full divide-y divide-gray-300">
|
||||
|
|
@ -52,7 +52,6 @@ class="text-indigo-600 hover:text-indigo-900">Show
|
|||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="absolute inset-0 bg-white opacity-75" wire:loading></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pt-4 flex justify-between items-center">
|
||||
|
|
@ -62,9 +61,10 @@ class="text-indigo-600 hover:text-indigo-900">Show
|
|||
|
||||
{{ $mailings->links('livewire.pagination') }}
|
||||
</div>
|
||||
|
||||
|
||||
<x-modal wire:model.live="mailingDetailsModal">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<x-modal wire:model="mailingDetailsModal">
|
||||
<x-form-modal submit="saveProject">
|
||||
<x-slot name="title">
|
||||
{{ __('Mailing') }}
|
||||
|
|
@ -129,8 +129,5 @@ class="mt-1 block w-full"
|
|||
</x-form-modal>
|
||||
</x-modal>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -63,7 +63,6 @@ class="px-3 py-3.5 text-right text-sm font-semibold text-gray-900 sm:pr-8 lg:pr-
|
|||
|
||||
{{ $mosaics->links('livewire.pagination') }}
|
||||
</div>
|
||||
<div class="absolute inset-0 bg-white opacity-75" wire:loading></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
<div class="px-4 sm:px-6 lg:px-8">
|
||||
<div class="m-2">
|
||||
<div class="">
|
||||
<div class="sm:flex sm:flex-col sm:items-center">
|
||||
<div class="w-full flex justify-between my-4">
|
||||
<h1 class="text-base font-semibold leading-6 text-gray-900">Reports</h1>
|
||||
<p class="mt-2 text-sm text-gray-700"></p>
|
||||
@if($project->hasPendingReport())
|
||||
<p class="text-base text-gray-700 animate-pulse"> Pending reports for this project: {{ $project->reports()->statusPending()->count() }}</p>
|
||||
@endif
|
||||
</div>
|
||||
<div class="mt-4 md:mt-0 flex flex-col md:flex md:justify-between md:flex-row w-full gap-2">
|
||||
<x-search></x-search>
|
||||
|
|
@ -14,7 +16,7 @@ class="flex justify-center rounded-md bg-indigo-600 px-3 py-2 text-center text-s
|
|||
</div>
|
||||
</div>
|
||||
<div class="mt-8 flow-root">
|
||||
<div class="-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8">
|
||||
<div class="">
|
||||
<div class="relative">
|
||||
<div class="inline-block min-w-full py-2 align-middle mb-10">
|
||||
<table class="min-w-full divide-y divide-gray-300">
|
||||
|
|
@ -46,10 +48,8 @@ class="py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 sm:pl-6 lg
|
|||
<div class="text-gray-700 text-sm">
|
||||
Results: {{ \Illuminate\Support\Number::format($reports->total()) }}
|
||||
</div>
|
||||
|
||||
{{ $reports->links('livewire.pagination') }}
|
||||
</div>
|
||||
<div class="absolute inset-0 bg-white opacity-75" wire:loading></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
<livewire:projects.tabs.mosaic :project="$project"></livewire:projects.tabs.mosaic>
|
||||
@break
|
||||
@case('reports')
|
||||
<livewire:projects.tabs.report :project_id="$project->id"></livewire:projects.tabs.report>
|
||||
<livewire:projects.tabs.report :project="$project"></livewire:projects.tabs.report>
|
||||
@break
|
||||
@case('mailings')
|
||||
<livewire:projects.tabs.mailings :project="$project"></livewire:projects.tabs.mailings>
|
||||
|
|
|
|||
Loading…
Reference in a new issue