diff --git a/laravel_app/app/Http/Controllers/ProjectController.php b/laravel_app/app/Http/Controllers/ProjectController.php index 8ff8289..d36bfbf 100644 --- a/laravel_app/app/Http/Controllers/ProjectController.php +++ b/laravel_app/app/Http/Controllers/ProjectController.php @@ -12,9 +12,13 @@ public function index() return view('projects.index'); } - public function show(Project $project,?string $currentTab = null) + public function show(string $projectName,?string $currentTab = null) { - return $currentTab ? view('projects.show', compact(['project', 'currentTab'])) : redirect(route('project.show', [$project->id, 'download'])); + if($project = Project::firstWhere('name',$projectName)) { + $availableTabs = ['downloads', 'mosaics', 'reports', 'mailings', 'settings']; + return in_array($currentTab, $availableTabs) ? view('projects.show', compact(['project', 'currentTab'])) : redirect(route('project.show', [$projectName, 'downloads'])); + } + return abort(404); } } diff --git a/laravel_app/app/Livewire/Projects/Menu.php b/laravel_app/app/Livewire/Projects/Menu.php new file mode 100644 index 0000000..293ba21 --- /dev/null +++ b/laravel_app/app/Livewire/Projects/Menu.php @@ -0,0 +1,19 @@ +project = $project; + $this->resetFormData(); + } + + + + public function showMailingDetailsModal(ProjectMailing $mailing) + { + $this->formData = $mailing->toArray(); + $this->formData['attachments'] = $mailing->attachments->toArray(); + + $this->formData['recipients'] = $mailing->recipients->toArray(); + $this->mailingDetailsModal = true; + } + + public function closeMailingDetailsModal() + { + $this->mailingDetailsModal = false; + $this->resetFormData(); + } + + private function resetFormData() + { + $this->formData = [ + 'subject' => '', + 'message' => '', + 'created_at' => '', + 'attachments' => [], + 'recipients' => [], + ]; + } + + 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'); + } + + public function render() + { + $query = $this->project + ->mailings() + ->orderBy('created_at', 'desc'); + + $query = $this->applySearch($query); + + $mailings = $query->paginate(10, pageName: 'mailingPage'); + return view('livewire.projects.tabs.mailings', [ + 'mailings' => $mailings, + ]); + } +} diff --git a/laravel_app/app/Livewire/Projects/Tabs/Mosaic.php b/laravel_app/app/Livewire/Projects/Tabs/Mosaic.php new file mode 100644 index 0000000..36591ee --- /dev/null +++ b/laravel_app/app/Livewire/Projects/Tabs/Mosaic.php @@ -0,0 +1,100 @@ + '', + 'year' => '', + ]; + public $showCreateModal = false; + + public $search = ""; + + public function mount(Project $project) + { + $this->path = $project->download_path; + } + public function saveMosaic() + { + $this->validate([ + 'formData.year' => 'required', + 'formData.week' => 'required', + ]); + + $mosaic = $this->project->mosaics()->updateOrCreate([ + 'name' => sprintf('Week %s, %s', $this->formData['week'], $this->formData['year']), + 'year' => $this->formData['year'], + 'week' => $this->formData['week'], + ], [ + 'path' => $this->project->getMosaicPath(), + ]); + + ProjectMosiacGeneratorJob::dispatch($mosaic); + + $this->showCreateModal = false; + } + + public function openCreateMosiacsModal() + { + $this->showCreateModal = true; + } + + public function getDateRangeProperty() + { + if (empty($this->formData['week']) || strlen($this->formData['year']) !== 4) { + return 'Invalid week or year'; + } + $begin = now() + ->setISODate($this->formData['year'], $this->formData['week']) + ->startOfWeek(); + $end = now() + ->setISODate($this->formData['year'], $this->formData['week']) + ->endOfWeek(); + return $begin->format('Y-m-d').' - '.$end->format('Y-m-d'); + } + + 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; + } + + public function update($property) + { + if ($property === 'search') { + $this->resetPage('mosaicPage'); + } + } + public function placeholder() + { + return view('livewire.projects.mosaic-manager-placeholder'); + } + + public function render() + { + $query = $this->project->mosaics() + ->orderBy('year', 'desc') + ->orderBy('week', 'desc'); + $query = $this->applySearch($query); + $mosaics = $query->paginate(10, pageName: 'mosaicPage'); + + return view('livewire.projects.tabs.mosaic', [ + 'mosaics' => $mosaics + ]); + } +} diff --git a/laravel_app/app/Livewire/Projects/Tabs/Report.php b/laravel_app/app/Livewire/Projects/Tabs/Report.php new file mode 100644 index 0000000..f820ff5 --- /dev/null +++ b/laravel_app/app/Livewire/Projects/Tabs/Report.php @@ -0,0 +1,107 @@ + '$refresh']; + + public function openCreateReportModal() + { + $this->resetFormData(); + $this->showReportModal = true; + } + private function resetFormData() + { + $this->formData['week'] = now()->weekOfYear; + $this->formData['year'] = now()->year; + } + + 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)], + ]); + + $newReport = Project::find($this->project_id) + ->reports()->create([ + 'name' => 'Report for week '.$this->formData['week'].' of '.$this->formData['year'], + 'week' => $this->formData['week'], + 'year' => $this->formData['year'], + 'path' => 'reports/week_'.$this->formData['week'].'_'.$this->formData['year'].'.docx', + ]); + + ProjectReportGeneratorJob::dispatch($newReport); + $this->dispatch('refresh'); + + $this->showReportModal = false; + + } + + public function getDateRangeProperty() + { + if (empty($this->formData['week']) || strlen($this->formData['year']) !== 4) { + return 'Invalid week or year'; + } + // @TODO dit moet gecorrigeerd voor de project settings; + $begin = now() + ->setISODate($this->formData['year'], $this->formData['week']) + ->startOfWeek(); + $end = now() + ->setISODate($this->formData['year'], $this->formData['week']) + ->endOfWeek(); + return $begin->format('Y-m-d').' - '.$end->format('Y-m-d'); + } + + public function deleteReport(ProjectReport $report) + { + $report->deleteMe(); + $this->dispatch('refresh'); + } + + 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; + } + + public function placeholder() + { + return view('livewire.projects.report-manager-placeholder'); + } + + public function render() + { + $query = Project::find($this->project_id) + ->reports() + ->orderBy('year', 'desc') + ->orderBy('week', 'desc'); + $query = $this->applySearch($query); + $reports = $query->paginate(10, pageName: 'reportPage'); + + return view('livewire.projects.tabs.report') + ->with(compact('reports')); + } +} diff --git a/laravel_app/resources/views/components/project-manager-grid.blade.php b/laravel_app/resources/views/components/project-manager-grid.blade.php index 8cd867f..49221c0 100644 --- a/laravel_app/resources/views/components/project-manager-grid.blade.php +++ b/laravel_app/resources/views/components/project-manager-grid.blade.php @@ -21,7 +21,7 @@ @foreach ($projectManager->projects->sortBy('name') as $project)
- {{ $project->name }} + {{ $project->name }}
- - - - +
+ +
+ @switch($currentTab) + @case('downloads') + + @break + @case('mosaics') + + @break + @case('reports') + + @break + @case('mailings') + + @break + @default +
Menu Component not found.
+ @endswitch
-
-
- -
-
- -
-
- -
-
- -
-
diff --git a/laravel_app/routes/web.php b/laravel_app/routes/web.php index 99ac0d9..a917898 100644 --- a/laravel_app/routes/web.php +++ b/laravel_app/routes/web.php @@ -29,7 +29,7 @@ Route::get('/dashboard', function () { return view('dashboard'); })->name('dashboard'); - Route::get('/projects/{project}/{currentTab?}', [\App\Http\Controllers\ProjectController::class, 'show'])->name('project.show'); + Route::get('/projects/{projectName}/{currentTab?}', [\App\Http\Controllers\ProjectController::class, 'show'])->name('project.show'); Route::get('/projects/{projectReport}/download', [\App\Http\Controllers\ProjectReportController::class, 'download'])->name('project.report.download'); Route::get('/projects', [\App\Http\Controllers\ProjectController::class, 'index'])->name('project'); });