resetFormData(); } public function editProject(Project $project) { $this->showProjectModal = true; $this->loadFormData($project); } public function editMailSettings(Project $project) { $this->showMailSettingsModal = true; $this->loadFormData($project); } private function loadFormData(Project $project) { $this->formData = $project->toArray(); $this->pivot_json_path = $this->formData['pivot_json_path']; $this->span_json_path = $this->formData['span_json_path']; $this->harvest_json_path = $this->formData['harvest_json_path']; $this->formData['pivot_json_path'] = null; $this->formData['span_json_path'] = null; $this->formData['harvest_json_path'] = null; $this->formData['boundingBoxes'] = $project->boundingBoxes->toArray(); $this->formData['mail_recipients'] = $project->emailRecipients->toArray() ?: [ [ 'name' => '', 'email' => '', ] ]; } public function openCreateProjectModal() { $this->resetFormData(); $this->showProjectModal = true; } public function saveProject() { $this->resetErrorBag(); dd($this->validateForm()); Project::saveWithFormData($this->formData); $this->resetFormData(); $this->showProjectModal = false; $this->dispatch('saved'); } public function saveMailSettings() { $this->resetErrorBag(); $this->validateEmailSettingsForm(); Project::saveWithFormData($this->formData); $this->resetFormData(); $this->showMailSettingsModal = false; $this->dispatch('saved'); } public function addBoundingBox() { $this->formData['boundingBoxes'][] = [ 'name' => '', 'top_left_latitude' => '', 'top_left_longitude' => '', 'bottom_right_latitude' => '', 'bottom_right_longitude' => '', ]; } public function addEmailRecipient() { $this->formData['mail_recipients'][] = [ 'name' => '', 'email' => '', ]; } public function deleteBoundingBox($index) { if (array_key_exists('id', $this->formData['boundingBoxes'][$index])) { ProjectBoundingBox::whereId($this->formData['boundingBoxes'][$index]['id'])->delete(); } unset($this->formData['boundingBoxes'][$index]); $this->formData['boundingBoxes'] = array_values($this->formData['boundingBoxes']); $this->dispatch('saved'); } public function deleteEmailRecipient($index) { if (array_key_exists('id', $this->formData['mail_recipients'][$index])) { ProjectEmailRecipient::whereId($this->formData['mail_recipients'][$index]['id'])->delete(); } unset($this->formData['mail_recipients'][$index]); $this->formData['mail_recipients'] = array_values($this->formData['mail_recipients']); $this->dispatch('saved'); } /** * Confirm that the given Project should be deleted. * * @param int $reportId * @return void */ public function confirmReportDeletion($reportId) { $this->confirmingReportDeletion = true; $this->reportIdBeingDeleted = $reportId; } /** * Delete the project * * @return void */ public function deleteProject() { Project::whereId($this->reportIdBeingDeleted)->first()->delete(); $this->resetFormData(); $this->confirmingReportDeletion = false; } /** * Get the current user of the application. * * @return mixed */ public function getProjectsProperty() { return Project::all(); } public function render() { return view('livewire.project-manager'); } private function resetFormData() { $this->formData = [ 'name' => '', 'pivot_json_path' => '', 'span_json_path' => '', 'harvest_json_path' => '', 'boundingBoxes' => [], 'mail_subject' => '', 'mail_template' => '', 'mail_frequency' => '', 'mail_day' => '', 'mail_recipients' => [], ]; $this->pivotFiles = []; $this->spanFiles = []; $this->harvestDataFiles = []; $this->addBoundingBox(); $this->addEmailRecipient(); } private function validateForm() { $projectIdentifier = $this->formData['id'] ?? null; return Validator::make([ 'name' => $this->formData['name'], 'pivot_file' => $this->pivotFiles[0] ?? null, 'span_file' => $this->spanFiles[0] ?? null, 'harvest_file' => $this->harvestDataFiles[0] ?? null, 'boundingBoxes' => $this->formData['boundingBoxes'], ], [ 'name' => [ 'required', Rule::unique('projects')->ignore($projectIdentifier), 'string', 'max:255' ], 'pivot_file.extension' => ['sometimes',function ($attribute, $value, $fail) { if($value != 'json'){ $fail('Not a json file'); } }], 'span_file' => ['sometimes',function ($attribute, $value, $fail) { if($value != 'json'){ $fail('Not a json file'); } }], 'harvest_file' => ['sometimes',new HarvestFile], 'boundingBoxes' => ['required', 'array', 'min:1'], 'boundingBoxes.*.name' => ['required', 'string', 'max:255'], 'boundingBoxes.*.top_left_latitude' => ['required', 'string'], 'boundingBoxes.*.top_left_longitude' => ['required', 'string'], 'boundingBoxes.*.bottom_right_latitude' => ['required', 'string'], 'boundingBoxes.*.bottom_right_longitude' => ['required', 'string'], ])->validate(); } private function validateEmailSettingsForm() { Validator::make([ 'mail_template' => $this->formData['mail_template'], 'mail_subject' => $this->formData['mail_subject'], 'mail_frequency' => $this->formData['mail_frequency'], 'mail_day' => $this->formData['mail_day'], 'mail_recipients' => $this->formData['mail_recipients'], ], [ 'mail_template' => ['required', 'string',], 'mail_subject' => ['required', 'string',], 'mail_frequency' => ['required', 'string',], 'mail_day' => ['required', 'string',], 'mail_recipients' => ['required', 'array', 'min:1'], 'mail_recipients.*.name' => ['required', 'string', 'max:255'], 'mail_recipients.*.email' => ['required', 'email'], ])->validateWithBag('saveEmailSettingsForm'); } }