diff --git a/app/Comment.php b/app/Comment.php deleted file mode 100644 index d072d8e1..00000000 --- a/app/Comment.php +++ /dev/null @@ -1,51 +0,0 @@ - 'array', - ]; - - /** - * The attributes that are mass assignable. - * - * @var array - */ - protected $fillable = ['user_id', 'role_id', 'body', 'meta', 'commentable_id', 'commentable_type']; - - /** - * Morph to the commentable model. - * - * @return MorphTo - */ - public function commentable(): MorphTo - { - return $this->morphTo(); - } - - /** - * Get the user that owns the comment. - * - * @return BelongsTo - */ - public function user(): BelongsTo - { - return $this->belongsTo(User::class); - } - -} diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 6b06294c..72b74c99 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -41,7 +41,7 @@ public function index() $data['user'] = User::find(auth()->user()->id); - $data['areas'] = Area::with('projects.project_owner.user')->get(); + $data['areas'] = Area::with('project_area.project.project_owner.user')->get(); $data['otherprojects'] = Project::doesntHave('project_area')->get(); diff --git a/app/Http/Controllers/ProgramAreaController.php b/app/Http/Controllers/ProgramAreaController.php index f406b80f..58789c52 100644 --- a/app/Http/Controllers/ProgramAreaController.php +++ b/app/Http/Controllers/ProgramAreaController.php @@ -54,12 +54,12 @@ public function show($id) $program_areas = Area::all(); if ($user = Auth::user()) { if ($user->hasRole(['Administrator', 'Program administrator', 'Spider'])) { - $projects = Project::with('project_owner.user', 'areas')->whereHas('project_area', function ($query) use ($id){ + $projects = Project::with('project_owner.user', 'project_area.area')->whereHas('project_area', function ($query) use ($id){ return $query->where('area_id', '=', $id);})->get(); return view('project.index', ['projects' => $projects, 'user' => $user, 'program_areas' => $program_areas]); } elseif ($user->hasRole(['Partner'])) { $id = ProjectPartner::where('partner_id', $user->id)->pluck('project_id'); - $projects = Project::with('project_owner.user', 'areas')->whereIn('id', $id)->latest()->get(); + $projects = Project::with('project_owner.user', 'project_area.area')->whereIn('id', $id)->latest()->get(); return view('project.index', ['projects' => $projects, 'user' => $user, 'program_areas' => $program_areas]); } diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php index b648f7c7..5326f24e 100644 --- a/app/Http/Controllers/ProjectController.php +++ b/app/Http/Controllers/ProjectController.php @@ -23,7 +23,6 @@ use App\ProjectUpdate; use App\Services\ACLHandler; use App\User; -use App\Http\Requests\UpdateProjectRequest; use Carbon\Carbon; use Illuminate\Contracts\Foundation\Application; use Illuminate\Contracts\View\Factory; @@ -33,10 +32,6 @@ use Illuminate\View\View; use Swaggest\JsonDiff\Exception; use Swaggest\JsonDiff\JsonDiff; -use App\Notifications\ProjectAccepted; -use App\Notifications\ProjectRejected; -use App\Notifications\ProjectChangeAccepted; -use App\Notifications\ProjectChangeRejected; class ProjectController extends Controller { @@ -202,11 +197,11 @@ public function show(Project $project) } $aggregated_outpus = $project->aggregated_outputs(); - foreach ($aggregated_outpus ?? [] as $ao) { + foreach ($aggregated_outpus as $ao) { $os = json_decode($ao->target); $valuesum = 0; $target = 0; - foreach ($os ?? [] as $o) { + foreach ($os as $o) { $o = $outputs->first(function($item) use ($o) { return $item->id == $o; }); @@ -278,9 +273,9 @@ public function edit(Project $project) 'activities' => $project->activities, 'outputs' => $project->submitted_outputs(), 'aggregated_outputs' => $project->aggregated_outputs(), - 'project_areas' => $project->areas()->get(), + 'project_areas' => $project->project_area, 'areas' => Area::all(), - 'old_pa' => $project->areas()->get()->pluck('id')->toArray(), + 'old_pa' => $project->project_area->pluck('area_id')->toArray(), 'users' => User::all(), 'old_users' => ProjectOwner::where('project_id', $project->id)->pluck('user_id')->toArray(), 'partners' => ProjectPartner::where('project_id', $project->id)->pluck('partner_id')->toArray(), @@ -300,105 +295,224 @@ public function edit(Project $project) /** * Update the specified resource in storage. * - * @param UpdateProjectRequest $request * @param Project $project * * @return RedirectResponse */ - public function update(UpdateProjectRequest $request, Project $project) + public function update(Request $request, Project $project) { - // if request not valid, redirect back to form with errors - if (!$request->validated()) { - return redirect()->back()->withErrors($request->errors()); + if ($user = Auth::user()) { + if (!$user->hasRole(['Administrator']) && !$user->hasPermissionTo('project-' . $project->id . '-edit')) { + abort(403); + } } - // Add or Update project. - if ($request->has('new_project')) { - $project = new Project(['name' => $request->name]); - if (Auth::user()->hasRole('Partner')) { - $project->object_type = 'project_add_request'; - } - $project->save(); - $project->project_owner()->create(['user_id' => Auth::id() ?? 1]); - $acl = new ACLHandler($project, Auth::user()); - $acl->setNewProjectPermissions(); + request()->validate([ + 'project_name' => 'required', + 'user_id' => 'required', + ]); + $project->name = request('project_name'); + $project->description = request('project_description'); + $project->start = Carbon::createFromFormat('d-m-Y', request('project_start') ?? null)->format('Y-m-d'); + if (request('project_end')) { + $project->end = Carbon::createFromFormat('d-m-Y', request('project_end'))->format('Y-m-d'); + } + $project->currency = request('project_currency') ?? null; + $project->cumulative = request('project_cumulative'); + $id = $project->save(); + + //Update Program Area + foreach (ProjectArea::where('project_id', $project->id)->get() as $old_pa) { + ProjectArea::find($old_pa->id)->delete(); + } + if (request('project_area')) { + foreach (request('project_area') as $project_area) { + $new_pa = new ProjectArea(); + if ($project->id) { + $new_pa->project_id = $project->id; + } else { + $new_pa->project_id = $id; + } + $new_pa->area_id = $project_area; + $new_pa->save(); + } } - if (Auth::user()->hasRole('Partner') && $project->object_type == 'project') { - $original_project = $project; - $project = $project->replicate(); - $project->object_id = $original_project->id; - $project->object_type = 'project_change_request'; - $project->save(); - $project->project_owner()->create(['user_id' => Auth::id() ?? 1]); - $acl = new ACLHandler($project, Auth::user()); - $acl->setNewProjectPermissions(); + //Set project reminders + if (count($request->project_reminder ?? []) > 0) { + foreach ($request->project_reminder as $key => $reminder) { + ProjectReminder::where('project_id', $project->id)->delete(); + } + foreach ($request->project_reminder as $key => $reminder) { + ProjectReminder::updateOrCreate([ + 'project_id' => $project->id, + 'set' => Carbon::createFromFormat('d-m-Y', $request->project_reminder_date[$key])->format('Y-m-d') + ], + [ + 'name' => $request->project_reminder_name[$key], + 'reminder' => $request->project_reminder[$key], + 'reminder_due_days' => $request->project_reminder_due_days[$key] + ]); + } } - $project->update($request->all()); + //Create permissions for a new project + if (request('new_project') == 1) { + //Adds the logged in user as project owner + $owner = new ProjectOwner(); + $owner->project_id = $project->id; + $owner->user_id = Auth::id() ?? 1; + $owner->save(); - $project->project_area()->sync($request->input('project_area', [])); + //Logged in user can Read, Edit and Delete project + $user = Auth::user(); + $acl = new ACLHandler($project, $user); + $acl->setNewProjectPermissions(); + } - // Managing project reminders - $reminders = $request->collect('reminders'); // Get reminders from request - $reminders_to_remove = $project->reminders->pluck('id')->diff($reminders->pluck('id')); // Get reminders to remove - $reminders->each( - function ($reminder) use ($project) { - $project->reminders()->updateOrCreate( ['id' => $reminder['id'] ?? null], $reminder); + //Activities + //Request from form --> this should later be refactored + $activity_array['id'] = request('activity_id') ?? null; + $activity_array['name'] = request('activity_name'); + $activity_array['description'] = request('activity_description') ?? null; + $activity_array['template'] = request('activity_template') ?? null; + $activity_array['start'] = request('activity_start'); + $activity_array['end'] = request('activity_end'); + $activity_array['name'] = request('activity_name'); + $activity_array['budget'] = request('activity_budget'); + $activity_array['priority'] = request('activity_priority'); + //Email reminder + //$activity_array['reminder'] = request('activity_reminder'); + //$activity_array['reminder_due_days'] = request('activity_reminder_due_days'); + //Outputs + $output_array['id'] = request('output_id') ?? null; + $output_array['indicator'] = request('output_indicator'); + $output_array['status'] = request('output_status') ?? null; + $output_array['target'] = request('output_target'); + //Outcomes + $outcome_array['id'] = request('outcome_id') ?? null; + $outcome_array['name'] = request('outcome_name'); + + //Remove deleted activities + foreach (Activity::where('project_id', $project->id)->get() as $a) { + if (!$activity_array['id'] || !in_array($a->id, $activity_array['id'])) { + Activity::findOrFail($a->id)->delete(); + } + } + + if (!empty($activity_array['id'])) { + foreach ($activity_array['id'] as $key => $id) { + $data = array(); + $data['title'] = $activity_array['name'][$key]; + $data['description'] = $activity_array['description'][$key]; + $data['template'] = $activity_array['template'][$key]; + //Transform dates from datepicker into the right format before saving to database + $data['start'] = Carbon::createFromFormat('d-m-Y', $activity_array['start'][$key])->format('Y-m-d'); + $data['end'] = Carbon::createFromFormat('d-m-Y', $activity_array['end'][$key])->format('Y-m-d'); + $data['budget'] = $activity_array['budget'][$key]; + //$data['reminder'] = $activity_array['reminder'][$key]; + //$data['reminder_due_days'] = $activity_array['reminder_due_days'][$key]; + $data['project_id'] = $project->id; + $data['priority'] = $activity_array['priority'][$key]; + if ($id) { + Activity::where('id', $id)->update($data); + //Log activity update + activity() + ->causedBy(Auth::user()) + ->performedOn(Activity::find($id)) + ->log('ActivityUpdate'); + } else { + $newactivity = Activity::create($data); + //Log new activity + activity() + ->causedBy(Auth::user()) + ->performedOn(Activity::find($newactivity->id)) + ->log('NewActivity'); + } } - ); - $project->reminders()->whereIn('id', $reminders_to_remove)->delete(); // Delete reminders to remove + } - // Manage activities - $activities = $request->collect('activities'); // Get all activities from the request and remove duplicates and null values. - $activities_to_remove = $project->activities->pluck('id')->diff($activities->pluck('id')); // Get all activities that are not in the request and remove them from the project. - $activities->each( - function ($activity) use ($project) { - $project->activities()->updateOrCreate(['id' => $activity['id'] ?? null], $activity); - } - ); - $project->activities()->whereIn('id', $activities_to_remove)->delete(); // Delete activities. + // Remove deleted outputs + foreach ($project->submitted_outputs() as $o) { + if (!$output_array['id'] || !in_array($o->id, $output_array['id'])) { + Output::findOrFail($o->id)->delete(); + } + } - // Manage outputs - $outputs = $request->collect('outputs'); // Get all outputs from the request. - $outputs_to_remove = $project->outputs->pluck('id')->diff($outputs->pluck('id')); // Get all outputs that are not in the request. - $outputs->each( - function ($output) use ($project) { - $output['target'] = $output['status'] == 'aggregated' ? json_encode([$output['target']]): $output['target']; - $project->outputs()->updateOrCreate(['id' => $output['id'] ?? null], $output); + if (!empty($output_array['id'])) { + foreach ($output_array['id'] as $key => $id) { + $data = array(); + $data['indicator'] = $output_array['indicator'][$key]; + $data['status'] = $output_array['status'][$key]; + $data['target'] = $output_array['status'][$key] == 'aggregated' ? json_encode($output_array['target'][$id]): $output_array['target'][$key]; + $data['status'] = $output_array['status'][$key]; + $data['project_id'] = $project->id; + if ($id && $id < 1637934025084) { + Output::where('id', $id)->update($data); + //Log output update + activity() + ->causedBy(Auth::user()) + ->performedOn(Output::find($id)) + ->log('OutputUpdate'); + } else { + $newoutput = Output::create($data); + //Log new output + activity() + ->causedBy(Auth::user()) + ->performedOn(Output::find($newoutput->id)) + ->log('NewOutput'); + } + } } - ); - $project->outputs()->whereIn('id', $outputs_to_remove)->delete(); // Delete outputs. + // Remove deleted outcomes + foreach ($project->outcomes as $o) { + if (!$outcome_array['id'] || !in_array($o->id, $outcome_array['id'])) { + Outcome::findOrFail($o->id)->delete(); + } + } - // Manage outcomes - $outcomes = $request->collect('outcomes'); // Get all outcomes from the request. - $outcomes_to_remove = $project->outcomes->pluck('id')->diff($outcomes->pluck('id')); // Get all outcomes that are not in the request. - $outcomes->each( - function ($outcome) use ($project) { - $outcome['user_id'] = Auth::id(); - $project->outcomes()->updateOrCreate(['id' => $outcome['id'] ?? null], $outcome); + if (!empty($outcome_array['id'])) { + foreach ($outcome_array['id'] as $key => $id) { + $data = array(); + $data['name'] = $outcome_array['name'][$key]; + $data['project_id'] = $project->id; + $data['user_id'] = Auth::user()->id; + if ($id) { + Outcome::where('id', $id)->update($data); + //Log outcome update + activity() + ->causedBy(Auth::user()) + ->performedOn(Outcome::find($id)) + ->log('OutcomeUpdate'); + } else { + $newoutcome = Outcome::create($data); + //Log new outcome + activity() + ->causedBy(Auth::user()) + ->performedOn(Outcome::find($newoutcome->id)) + ->log('NewOutcome'); + } + } } - ); - $project->outcomes()->whereIn('id', $outcomes_to_remove)->delete(); // Delete outcomes. // Update Project managers and partners $project_owners = ProjectOwner::where('project_id', $project->id)->get(); $project_partners = ProjectPartner::where('project_id', $project->id)->get(); + //Erase existing owners + foreach ($project_owners as $project_owner) { + $owner = ProjectOwner::find($project_owner->id); + $user = User::find($owner->user_id); + $user->revokePermissionTo('project-' . $project->id . '-list'); + $user->revokePermissionTo('project-' . $project->id . '-edit'); + $user->revokePermissionTo('project-' . $project->id . '-update'); + $user->revokePermissionTo('project-' . $project->id . '-delete'); + $owner->delete(); + } //Store new managers if ($request->user_id) { - //Erase existing owners - foreach ($project_owners as $project_owner) { - $owner = ProjectOwner::find($project_owner->id); - $user = User::find($owner->user_id); - $user->revokePermissionTo('project-' . $project->id . '-list'); - $user->revokePermissionTo('project-' . $project->id . '-edit'); - $user->revokePermissionTo('project-' . $project->id . '-update'); - $user->revokePermissionTo('project-' . $project->id . '-delete'); - $owner->delete(); - } foreach ($request->user_id as $owner) { $new_owner = new ProjectOwner(); $new_owner->project_id = $project->id; @@ -409,19 +523,18 @@ function ($outcome) use ($project) { $user->givePermissionTo('project-' . $project->id . '-list', 'project-' . $project->id . '-edit', 'project-' . $project->id . '-update', 'project-' . $project->id . '-delete'); } } - + //Erase existing partners + if ($project_partners) { + foreach ($project_partners as $project_partner) { + $partner = ProjectPartner::find($project_partner->id); + $user = User::find($partner->partner_id); + $user->revokePermissionTo('project-' . $project->id . '-list'); + $user->revokePermissionTo('project-' . $project->id . '-update'); + $partner->delete(); + } + } //Store new partners if ($request->partner_id) { - //Erase existing partners - if ($project_partners) { - foreach ($project_partners as $project_partner) { - $partner = ProjectPartner::find($project_partner->id); - $user = User::find($partner->partner_id); - $user->revokePermissionTo('project-' . $project->id . '-list'); - $user->revokePermissionTo('project-' . $project->id . '-update'); - $partner->delete(); - } - } foreach ($request->partner_id as $partner) { $new_partner = new ProjectPartner(); $new_partner->project_id = $project->id; @@ -429,22 +542,9 @@ function ($outcome) use ($project) { $new_partner->save(); //Give specific project permissions to partner $user = User::find($partner); - $user->givePermissionTo('project-' . $project->id . '-list', 'project-' . $project->id . '-update', 'project-' . $project->id . '-edit'); - } - } - // If user logged in as partner, give him permission to edit project - if (Auth::user()->hasRole('Partner')) { - if ($project->project_owner()->count() == 0) { - $project->project_owner()->create(['user_id' => 1]); + $user->givePermissionTo('project-' . $project->id . '-list', 'project-' . $project->id . '-update'); } - $new_partner = new ProjectPartner(); - $new_partner->project_id = $project->id; - $new_partner->partner_id = Auth::user()->id; - $new_partner->save(); - Auth::user()->givePermissionTo('project-' . $project->id . '-list', 'project-' . $project->id . '-update', 'project-' . $project->id . '-edit'); } - - $project->refresh(); // Save to history $history = new ProjectHistory(); @@ -458,80 +558,6 @@ function ($outcome) use ($project) { return redirect()->route('project_show', $project); } - public function accept(Project $project) - { - if ( !Auth::check() || !Auth::user()->hasRole(['Administrator', 'Spider']) || !Auth::user()->hasPermissionTo('project-' . $project->id . '-update')) { - abort(403); - } - if ($project->object_type == 'project') { - abort( response('Request error', 400) ); - } - - if ($project->object_type == 'project_change_request') { - $mainProject = $project->main ?? Project::find($project->object_id); - $mainProject->object_type = 'project_history'; - $mainProject->object_id = $project->id; - $mainProject->save(); - $project->object_type = 'project'; - $project->object_id = null; - $project->save(); - $project->refresh(); - $project->project_partner->each(function ($partner) use ($project) { - $partner->user->notify(new ProjectChangeAccepted($project)); - }); - - } elseif ($project->object_type == 'project_add_request') { - $project->object_type = 'project'; - $project->save(); - $project->refresh(); - $project->project_partner->each(function ($partner) use ($project) { - $partner->user->notify(new ProjectAccepted($project)); - }); - - } else { - abort( response('Request error', 400) ); - } - - $project->comments()->create([ - 'user_id' => Auth::user()->id, - 'body' => sprintf('Project accepted by %s at %s and a notification has been sent to the partners.', Auth::user()->name, Carbon::now()->format('d-m-Y H:i:s')), - ]); - - return redirect()->route('project_show', $project)->with('success', 'Project accepted and a notification has been sent to the partners.'); - - } - - public function reject(Project $project) - { - if ( !Auth::check() || !Auth::user()->hasRole(['Administrator', 'Spider']) || !Auth::user()->hasPermissionTo('project-' . $project->id . '-update')) { - abort(403); - } - if ($project->object_type == 'project') { - abort( response('Request error', 400) ); - } - - if ($project->object_type == 'project_change_request') { - $project->project_partner->each(function ($partner) use ($project) { - $partner->user->notify(new ProjectChangeRejected($project)); - }); - - } elseif ($project->object_type == 'project_add_request') { - $project->project_partner->each(function ($partner) use ($project) { - $partner->user->notify(new ProjectRejected($project)); - }); - } else { - abort( response('Request error', 400) ); - } - - $project->comments()->create([ - 'user_id' => Auth::user()->id, - 'body' => sprintf('Project rejected by %s at %s and a notification has been sent to the partners.', Auth::user()->name, Carbon::now()->format('d-m-Y H:i:s')), - ]); - - return redirect()->route('project_show', $project)->with('success', 'Project rejected and a notification has been sent to the partners.'); - - } - public function write_update(Project $project) { if ($user = Auth::user()) { diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index ed6ac1db..f5c8892e 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -40,10 +40,6 @@ public function filterSearch($q = null, Request $request): array $years = request('year') ? explode(',', request('year')) : null; $filter = request('my') ? explode(',', request('my')) : array(); - if (in_array('requested', $filter)) { - $projects = Project::withoutGlobalScopes()->OfType('project_add_request')->get(); - } - // Prefilter presets if ($filter) { $projects = $this->filter($projects, $filter); @@ -151,7 +147,7 @@ public function filter($projects, $filter) foreach ($projects as $key => $project) { $ok = false; $user = Auth::user(); - if (in_array('owned', $filter) || in_array('requested', $filter)) { + if (in_array('owned', $filter)) { if ($user->hasRole(['Administrator', 'Program administrator', 'Spider'])) { foreach ($project->managers() as $manager) { if ($manager->id == $user->id) { @@ -170,7 +166,7 @@ public function filter($projects, $filter) $ok = true; } if (!$ok) { - unset($projects[$key]); + unset($projects[$key]); } } return $projects; diff --git a/app/Http/Livewire/Comments.php b/app/Http/Livewire/Comments.php deleted file mode 100644 index 9d7a1f05..00000000 --- a/app/Http/Livewire/Comments.php +++ /dev/null @@ -1,104 +0,0 @@ -comments = $project->comments; - $this->project = $project; - } - - public function addComment() - { - $validated = $this->validate([ - 'comment' => 'required|max:255', - ]); - - $comment = Comment::create([ - 'body' => $this->comment, - 'meta' => [ 'ip' => request()->ip(), 'user_agent' => request()->userAgent() ], - 'user_id' => auth()->id(), - 'commentable_id' => $this->project->id, - 'commentable_type' => Project::class, - ]); - - $this->project->project_partner->each(function ($partner) use ($comment) { - $partner->user->notify(new NewComment($comment, $this->project)); - }); - - $this->project->project_owner->each(function ($owner) use ($comment) { - $owner->user->notify(new NewComment($comment, $this->project)); - }); - - $this->comments->push($comment); - $this->comment = ''; - session()->flash('message', 'Comment successfully added.'); - } - - public function removeComment(Comment $comment) - { - $comment->delete(); - $this->comments = $this->comments->where('id', '!=', $comment->id); - } - - public function editComment(Comment $comment) - { - $this->editingCommentId = $comment->id; - $this->editingCommentBody = $comment->body; - } - - public function updateComment() - { - $validated = $this->validate([ - 'editingCommentBody' => 'required|max:255', - ]); - - $comment = Comment::find($this->editingCommentId); - $comment->update([ - 'body' => $this->editingCommentBody, - ]); - - $this->comments = $this->comments->map(function ($comment) { - if ($comment->id === $this->editingCommentId) { - $comment->body = $this->editingCommentBody; - } - - return $comment; - }); - - $this->editingCommentId = null; - $this->editingCommentBody = null; - // Flash a message, add comment id to session. - session()->flash('message', sprintf('Comment %s successfully updated.', $comment->id)); - } - - public function cancelEdit() - { - $this->editingCommentId = null; - $this->editingCommentBody = null; - } - - public function resetErrors() - { - $this->resetErrorBag(); - $this->resetValidation(); - } - - public function render() - { - return view('livewire.comments'); - } -} diff --git a/app/Http/Requests/UpdateProjectRequest.php b/app/Http/Requests/UpdateProjectRequest.php deleted file mode 100644 index 128b8118..00000000 --- a/app/Http/Requests/UpdateProjectRequest.php +++ /dev/null @@ -1,77 +0,0 @@ -route('project') && Auth::user()->hasPermissionTo('project-' . $this->route('project')->id . '-edit'); - $new_project_check = ( $this->request->has('new_project') && Auth::user()->hasRole(['Partner']) ) || Auth::user()->hasRole(['Administrator']); - - return Auth::check() && ($new_project_check || $permission_check); - } - - /** - * Get the validation rules that apply to the request. - * - * @return array - */ - public function rules() - { - return [ - 'name' => 'required|min:10', - 'description' => 'required|min:15', - 'activities.*.title' => 'required|min:4', - 'activities.*.description' => 'required|min:4', - 'activities.*.start' => 'required|date', - 'activities.*.end' => 'required|date', - 'activities.*.budget' => 'required|numeric', - ]; - } - - /** - * Get the error messages for the defined validation rules. - * - * @return array - */ - public function messages() - { - return [ - 'name.required' => 'Project name is required', - 'name.min' => 'Project name must be at least 25 characters', - 'description.required' => 'Project description is required', - 'description.min' => 'Project description must be at least 25 characters', - 'activities.*.title.required' => 'Activity title is required', - 'activities.*.title.min' => 'Activity title must be at least 25 characters', - 'activities.*.description.required' => 'Activity description is required', - 'activities.*.description.min' => 'Activity description must be at least 25 characters', - 'activities.*.start.required' => 'Activity start date is required', - 'activities.*.start.date' => 'Activity start date must be a valid date', - 'activities.*.end.required' => 'Activity end date is required', - 'activities.*.end.date' => 'Activity end date must be a valid date', - 'activities.*.budget.required' => 'Activity budget is required', - 'activities.*.budget.numeric' => 'Activity budget must be a number', - ]; - } - - /** - * Handle a failed authorization attempt. - * - * @return void - */ - protected function failedAuthorization() - { - return redirect()->route('project_edit', $this->route('project'))->withErrors(['You are not authorized to edit this project.']); - } - -} diff --git a/app/Notifications/NewComment.php b/app/Notifications/NewComment.php deleted file mode 100644 index 9f119efb..00000000 --- a/app/Notifications/NewComment.php +++ /dev/null @@ -1,64 +0,0 @@ -comment = $comment; - $this->project = $project; - } - - /** - * Get the notification's delivery channels. - * - * @param mixed $notifiable - * @return array - */ - public function via($notifiable) - { - return ['mail']; - } - - /** - * Get the mail representation of the notification. - * - * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage - */ - public function toMail($notifiable) - { - return (new MailMessage) - ->subject(sprintf('New comment on your project (%s)', $this->project->name)) - ->line(sprintf('%s has posted a new comment on your project %s', $this->comment->user->name, $this->project->name)) - ->action('View project', $this->project->link) - ->line('You are receiving this email because you are the partner of this project.'); - - } - - /** - * Get the array representation of the notification. - * - * @param mixed $notifiable - * @return array - */ - public function toArray($notifiable) - { - return [ - // - ]; - } -} diff --git a/app/Notifications/ProjectAccepted.php b/app/Notifications/ProjectAccepted.php deleted file mode 100644 index 52d74c56..00000000 --- a/app/Notifications/ProjectAccepted.php +++ /dev/null @@ -1,67 +0,0 @@ -project = $project; - } - - /** - * Get the notification's delivery channels. - * - * @param mixed $notifiable - * @return array - */ - public function via($notifiable) - { - return ['mail']; - } - - /** - * Get the mail representation of the notification. - * - * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage - */ - public function toMail($notifiable) - { - return (new MailMessage) - ->subject(sprintf('Project `%s` Accepted', $this->project->name)) - ->greeting(sprintf('Hello %s!', $notifiable->name)) - ->line(sprintf('Your project `%s` has been accepted.', $this->project->name)) - ->line('You can view your project by clicking the button below.') - ->action('View Project', $this->project->link) - ->line('If you have any questions, please contact us or leave a comment on the project page.'); - - } - - /** - * Get the array representation of the notification. - * - * @param mixed $notifiable - * @return array - */ - public function toArray($notifiable) - { - return [ - // - ]; - } -} diff --git a/app/Notifications/ProjectChangeAccepted.php b/app/Notifications/ProjectChangeAccepted.php deleted file mode 100644 index aebb9519..00000000 --- a/app/Notifications/ProjectChangeAccepted.php +++ /dev/null @@ -1,64 +0,0 @@ -project = $project; - } - - /** - * Get the notification's delivery channels. - * - * @param mixed $notifiable - * @return array - */ - public function via($notifiable) - { - return ['mail']; - } - - /** - * Get the mail representation of the notification. - * - * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage - */ - public function toMail($notifiable) - { - return (new MailMessage) - ->subject(sprintf('Project `%s` Change Accepted', $this->project->name)) - ->greeting(sprintf('Hello %s!', $notifiable->name)) - ->line(sprintf('Your changes on project `%s` have been accepted.', $this->project->name)) - ->line('You can view your project by clicking the button below.') - ->action('View Project', $this->project->link) - ->line('If you have any questions, please contact us or leave a comment on the project page.'); - } - - /** - * Get the array representation of the notification. - * - * @param mixed $notifiable - * @return array - */ - public function toArray($notifiable) - { - return [ - // - ]; - } -} diff --git a/app/Notifications/ProjectChangeRejected.php b/app/Notifications/ProjectChangeRejected.php deleted file mode 100644 index 56bc3290..00000000 --- a/app/Notifications/ProjectChangeRejected.php +++ /dev/null @@ -1,64 +0,0 @@ -project = $project; - } - - /** - * Get the notification's delivery channels. - * - * @param mixed $notifiable - * @return array - */ - public function via($notifiable) - { - return ['mail']; - } - - /** - * Get the mail representation of the notification. - * - * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage - */ - public function toMail($notifiable) - { - return (new MailMessage) - ->subject(sprintf('Project `%s` Changes Rejected', $this->project->name)) - ->greeting(sprintf('Hello %s!', $notifiable->name)) - ->line(sprintf('Your changes on project `%s` have been rejected.', $this->project->name)) - ->line('You can view your project by clicking the button below.') - ->action('View Project', $this->project->link) - ->line('If you have any questions, please contact us or leave a comment on the project page.'); - } - - /** - * Get the array representation of the notification. - * - * @param mixed $notifiable - * @return array - */ - public function toArray($notifiable) - { - return [ - // - ]; - } -} diff --git a/app/Notifications/ProjectRejected.php b/app/Notifications/ProjectRejected.php deleted file mode 100644 index 0b442e7c..00000000 --- a/app/Notifications/ProjectRejected.php +++ /dev/null @@ -1,64 +0,0 @@ -project = $project; - } - - /** - * Get the notification's delivery channels. - * - * @param mixed $notifiable - * @return array - */ - public function via($notifiable) - { - return ['mail']; - } - - /** - * Get the mail representation of the notification. - * - * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage - */ - public function toMail($notifiable) - { - return (new MailMessage) - ->subject(sprintf('Project `%s` Rejected', $this->project->name)) - ->greeting(sprintf('Hello %s!', $notifiable->name)) - ->line(sprintf('Your project `%s` has been rejected.', $this->project->name)) - ->line('You can view your project by clicking the button below.') - ->action('View Project', $this->project->link) - ->line('If you have any questions, please contact us or leave a comment on the project page.'); - } - - /** - * Get the array representation of the notification. - * - * @param mixed $notifiable - * @return array - */ - public function toArray($notifiable) - { - return [ - // - ]; - } -} diff --git a/app/Project.php b/app/Project.php index 87ca7acd..3b91aeb6 100644 --- a/app/Project.php +++ b/app/Project.php @@ -6,14 +6,10 @@ use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; -use Illuminate\Database\Eloquent\Relations\BelongsTo; -use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Relations\HasMany; -use Illuminate\Database\Eloquent\Relations\MorphMany; use Illuminate\Support\Facades\URL; use Nicolaslopezj\Searchable\SearchableTrait; use Spatie\Activitylog\Traits\LogsActivity; -use App\Scopes\ObjectType; class Project extends Model { @@ -21,7 +17,7 @@ class Project extends Model use SearchableTrait; //protected $fillable = ['name', 'description', 'template', 'start', 'end', 'currency', 'cumulative', 'status', 'project_area_id']; -->refactored<-- - protected $fillable = ['name', 'description', 'template', 'start', 'end', 'currency', 'cumulative', 'state', 'object_type', 'object_id']; + protected $fillable = ['name', 'description', 'template', 'start', 'end', 'currency', 'cumulative', 'state']; protected $dates = ['start', 'end']; //protected static $logAttributes = ['name', 'description', 'template', 'start', 'end', 'currency', 'cumulative', 'status', 'project_area_id']; -->refactored<-- protected static $logAttributes = ['name', 'description', 'template', 'start', 'end', 'currency', 'cumulative', 'state']; @@ -37,26 +33,11 @@ class Project extends Model protected $appends = ['link', 'type']; - /** - * Get the reminders for the project. - * - * @return HasMany - */ - public function reminders() - { - return $this->hasMany(ProjectReminder::class); - } - public function activities(): HasMany { return $this->hasMany(Activity::class); } - /** - * Get the project's outputs. - * - * @return HasMany - */ public function outputs(): HasMany { return $this->hasMany(Output::class); @@ -74,20 +55,16 @@ public function histories(): HasMany public function submitted_outputs(): Collection { - return $this->outputs()->get()->filter( - function ($output) { - return $output->status == 'custom' || $output->status == 'default'; - } - ); + return $this->outputs()->get()->filter(function ($output) { + return $output->status == 'custom' || $output->status == 'default'; + }); } public function aggregated_outputs(): Collection { - return $this->outputs()->get()->filter( - function ($output) { - return $output->status == 'aggregated'; - } - ); + return $this->outputs()->get()->filter(function ($output) { + return $output->status == 'aggregated'; + }); } @@ -109,9 +86,9 @@ public function pending_updates(): Collection return $this->project_updates()->where('status', 'submitted')->get(); } - public function project_area(): BelongsToMany + public function project_area(): HasMany { - return $this->BelongsToMany(Area::class, 'project_areas', 'project_id', 'area_id'); + return $this->hasMany(ProjectArea::class); } public function managers(): Collection @@ -134,36 +111,17 @@ public function areas(): BelongsToMany return $this->belongsToMany(Area::class, 'project_areas'); } - public function change_request(): HasOne - { - return $this->HasOne(self::class, 'object_id')->withoutGlobalScope(ObjectType::class)->where('object_type', 'project_change_request'); - } - - public function main(): BelongsTo - { - return $this->belongsTo(self::class, 'object_id')->withoutGlobalScope(ObjectType::class)->where('object_type', 'project'); - } - - /** - * Get the comments for the project. - */ - public function comments(): MorphMany - { - return $this->morphMany(Comment::class, 'commentable'); - } - - public function getCurrencySymbol(): string { switch ($this->currency) { - case "USD": - return '$'; - case "EUR": - return '€'; - case "GBP"; - return '£'; - default: - return 'kr'; + case "USD": + return '$'; + case "EUR": + return '€'; + case "GBP"; + return '£'; + default: + return 'kr'; } } @@ -206,13 +164,6 @@ public function status(): string $completed++; } } - if($this->object_type == 'project_change_request') { - return 'pendingreview'; - } - - if ($this->object_type == 'project_add_request') { - return 'pendingreview'; - } if ($delayedhigh) { // Delayed @@ -239,39 +190,68 @@ public function status(): string } } - public function wrapJson() + public + function wrapJson() { foreach ($this->outputs as $i => $o) { if (!$o->status) { $this->outputs->forget($i); } + $o->makeHidden('updated_at'); + $o->makeHidden('created_at'); + $o->makeHidden('project_id'); + } + foreach ($this->activities as $a) { + $a->makeHidden('updated_at'); + $a->makeHidden('created_at'); + $a->makeHidden('project_id'); + $a->makeHidden('deleted_at'); + } + foreach ($this->outcomes as $o) { + $o->makeHidden('updated_at'); + $o->makeHidden('created_at'); + $o->makeHidden('user_id'); + $o->makeHidden('project_id'); } - $this->makeHidden(['updated_at', 'created_at', 'type', 'link']); - $this->outputs->makeHidden(['updated_at', 'created_at', 'project_id']); - $this->activities->makeHidden(['updated_at', 'created_at', 'project_id', 'deleted_at']); - $this->outcomes->makeHidden(['updated_at', 'created_at', 'project_id', 'user_id']); - $this->project_updates->makeHidden(['updated_at', 'created_at', 'project_id']); foreach ($this->project_updates as $pu) { + $pu->makeHidden('project_id'); + $pu->makeHidden('updated_at'); + $pu->makeHidden('created_at'); $pu->user = User::find($pu->user_id)->name; - $pu->makeHidden(['updated_at', 'created_at', 'project_id']); - $pu->activity_updates->makeHidden(['updated_at', 'created_at']); - $pu->outcome_updates->makeHidden(['updated_at', 'created_at']); - $pu->output_updates->makeHidden(['updated_at', 'created_at']); - } - $this->areas->makeHidden(['updated_at', 'created_at', 'pivot']); - $this->project_owner->makeHidden(['updated_at', 'created_at', 'id']); - $this->project_owner->each( - function ($po) { - $po->name = User::find($po->user_id)->name; + foreach ($pu->activity_updates as $au) { + $au->makeHidden('updated_at'); + $au->makeHidden('created_at'); } - ); - $this->project_partner->makeHidden(['updated_at', 'created_at', 'id']); - $this->project_partner->each( - function ($p) { - $p->name = User::find($p->partner_id)->name; + foreach ($pu->outcome_updates as $ou) { + $ou->makeHidden('updated_at'); + $ou->makeHidden('created_at'); } - ); - + foreach ($pu->output_updates as $ou) { + $ou->makeHidden('updated_at'); + $ou->makeHidden('created_at'); + } + } + foreach ($this->areas as $a) { + $a->makeHidden('updated_at'); + $a->makeHidden('created_at'); + $a->makeHidden('pivot'); + } + foreach ($this->project_owner as $po) { + $po->makeHidden('updated_at'); + $po->makeHidden('created_at'); + $po->makeHidden('id'); + $po->name = User::find($po->user_id)->name; + } + foreach ($this->project_partner as $p) { + $p->makeHidden('updated_at'); + $p->makeHidden('created_at'); + $p->makeHidden('id'); + $p->name = USer::find($p->partner_id)->name; + } + $this->makeHidden('updated_at'); + $this->makeHidden('created_at'); + $this->makeHidden('type'); + $this->makeHidden('link'); $json = $this->toJson(JSON_PRETTY_PRINT); $previous = $this->histories()->orderBy('id', 'desc')->first()->data ?? null; if ($json != $previous) { @@ -282,44 +262,24 @@ function ($p) { public function getNextProjectUpdateDate() { - $lastprojectupdate = $this->project_updates->sortBy('end')->last( - function ($pu) { - return $pu->end; - } - ); + $lastprojectupdate = $this->project_updates->sortBy('end')->last(function ($pu) { + return $pu->end; + }); return $lastprojectupdate ? $lastprojectupdate->end->addDay()->format('d/m/Y') : Carbon::now()->format('d/m/Y'); } - public function getLinkAttribute(): string + public + function getLinkAttribute(): string { return $this->attributes['link'] = URL::to('/') . '/project/' . $this->id; } - public function getTypeAttribute(): string + public + function getTypeAttribute(): string { return 'project'; } - /** - * The "booted" method of the model. - * - * @return void - */ - protected static function booted() - { - static::addGlobalScope(new ObjectType); - } +} - /** - * Scope a query to only include projects of a given type. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param mixed $type - * @return \Illuminate\Database\Eloquent\Builder - */ - public function scopeOfType($query, $type = 'project') - { - return $query->where('object_type', $type); - } -} diff --git a/app/ProjectArea.php b/app/ProjectArea.php index 9d55aaad..2c512c73 100644 --- a/app/ProjectArea.php +++ b/app/ProjectArea.php @@ -9,7 +9,7 @@ class ProjectArea extends Model public function project() { - return $this->hasMany(Project::class); + return $this->belongsTo(Project::class); } public function area() diff --git a/app/ProjectReminder.php b/app/ProjectReminder.php index 332a85dd..b9541509 100644 --- a/app/ProjectReminder.php +++ b/app/ProjectReminder.php @@ -7,14 +7,5 @@ class ProjectReminder extends Model { protected $fillable = ['project_id', 'name', 'reminder', 'reminder_due_days', 'set']; - protected $cast = ['reminder_due_days' => 'integer']; protected $dates = ['set']; - - /** - * Get the project that owns the reminder. - */ - public function project() - { - return $this->belongsTo(Project::class); - } } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index e5080a87..3a816d81 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -30,11 +30,9 @@ class RouteServiceProvider extends ServiceProvider */ public function boot() { - parent::boot(); + // - Route::bind('project', function($id) { - return \App\Project::withoutGlobalScopes()->findOrFail($id); - }); + parent::boot(); } /** diff --git a/app/Scopes/ObjectType.php b/app/Scopes/ObjectType.php deleted file mode 100644 index bae21412..00000000 --- a/app/Scopes/ObjectType.php +++ /dev/null @@ -1,23 +0,0 @@ -where('object_type', 'project'); - } -} \ No newline at end of file diff --git a/composer.json b/composer.json index afc48be4..fa1a227a 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,7 @@ "spatie/laravel-permission": "^3.17", "spatie/laravel-searchable": "^1.9", "swaggest/json-diff": "^3.8", - "uabookstores/laravel-shibboleth": "3.4" + "uabookstores/laravel-shibboleth": "^3.3" }, "require-dev": { "barryvdh/laravel-ide-helper": "^2.7", diff --git a/composer.lock b/composer.lock index 78cb0219..37266052 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "fceb0f36c5ddb6f3bfb6ee09404ef26c", + "content-hash": "7e46f2cc1fcd068fb6c3b66fed4a15b5", "packages": [ { "name": "asm89/stack-cors", @@ -56,6 +56,10 @@ "cors", "stack" ], + "support": { + "issues": "https://github.com/asm89/stack-cors/issues", + "source": "https://github.com/asm89/stack-cors/tree/1.3.0" + }, "time": "2019-12-24T22:41:47+00:00" }, { @@ -102,6 +106,10 @@ "brick", "math" ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.9.3" + }, "funding": [ { "url": "https://github.com/BenMorel", @@ -183,6 +191,10 @@ "dot", "notation" ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.1" + }, "time": "2021-08-13T13:06:58+00:00" }, { @@ -258,6 +270,10 @@ "redis", "xcache" ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" + }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -363,6 +379,10 @@ "sqlserver", "sqlsrv" ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/2.13.9" + }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -416,6 +436,10 @@ ], "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" + }, "time": "2022-05-02T15:47:09+00:00" }, { @@ -492,6 +516,10 @@ "event system", "events" ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/1.1.x" + }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -579,6 +607,10 @@ "uppercase", "words" ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.4" + }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -651,6 +683,10 @@ "parser", "php" ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.3" + }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -716,6 +752,10 @@ "cron", "schedule" ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.1" + }, "funding": [ { "url": "https://github.com/dragonmantank", @@ -780,6 +820,10 @@ "validation", "validator" ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" + }, "funding": [ { "url": "https://github.com/egulias", @@ -840,6 +884,10 @@ "proxy", "trusted proxy" ], + "support": { + "issues": "https://github.com/fideloper/TrustedProxy/issues", + "source": "https://github.com/fideloper/TrustedProxy/tree/4.4.1" + }, "time": "2020-10-22T13:48:01+00:00" }, { @@ -908,6 +956,10 @@ "crossdomain", "laravel" ], + "support": { + "issues": "https://github.com/fruitcake/laravel-cors/issues", + "source": "https://github.com/fruitcake/laravel-cors/tree/1.0" + }, "funding": [ { "url": "https://github.com/barryvdh", @@ -962,6 +1014,10 @@ "Result-Type", "result" ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.4" + }, "funding": [ { "url": "https://github.com/GrahamCampbell", @@ -1078,6 +1134,10 @@ "rest", "web service" ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.4.5" + }, "funding": [ { "url": "https://github.com/GrahamCampbell", @@ -1158,6 +1218,10 @@ "keywords": [ "promise" ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.1" + }, "funding": [ { "url": "https://github.com/GrahamCampbell", @@ -1269,6 +1333,10 @@ "uri", "url" ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.4.0" + }, "funding": [ { "url": "https://github.com/GrahamCampbell", @@ -1452,6 +1520,10 @@ "framework", "laravel" ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, "time": "2022-06-21T14:38:31+00:00" }, { @@ -1507,6 +1579,10 @@ "laravel", "serializable" ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, "time": "2022-05-16T17:09:47+00:00" }, { @@ -1572,6 +1648,10 @@ "laravel", "oauth" ], + "support": { + "issues": "https://github.com/laravel/socialite/issues", + "source": "https://github.com/laravel/socialite" + }, "time": "2022-03-10T15:26:19+00:00" }, { @@ -1636,6 +1716,10 @@ "laravel", "psysh" ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.7.2" + }, "time": "2022-03-23T12:38:24+00:00" }, { @@ -1694,6 +1778,9 @@ "laravel", "ui" ], + "support": { + "source": "https://github.com/laravel/ui/tree/v3.4.6" + }, "time": "2022-05-20T13:38:08+00:00" }, { @@ -1741,6 +1828,10 @@ } ], "description": "Yet another clock abstraction", + "support": { + "issues": "https://github.com/lcobucci/clock/issues", + "source": "https://github.com/lcobucci/clock/tree/2.0.x" + }, "funding": [ { "url": "https://github.com/lcobucci", @@ -1811,6 +1902,10 @@ "JWS", "jwt" ], + "support": { + "issues": "https://github.com/lcobucci/jwt/issues", + "source": "https://github.com/lcobucci/jwt/tree/4.1.5" + }, "funding": [ { "url": "https://github.com/lcobucci", @@ -1902,6 +1997,13 @@ "md", "parser" ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, "funding": [ { "url": "https://www.colinodell.com/sponsor", @@ -1982,6 +2084,12 @@ "nested", "schema" ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, "funding": [ { "url": "https://www.colinodell.com/sponsor", @@ -2080,6 +2188,10 @@ "sftp", "storage" ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/1.1.9" + }, "funding": [ { "url": "https://offset.earth/frankdejonge", @@ -2128,6 +2240,10 @@ } ], "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0" + }, "funding": [ { "url": "https://github.com/frankdejonge", @@ -2210,6 +2326,10 @@ "tumblr", "twitter" ], + "support": { + "issues": "https://github.com/thephpleague/oauth1-client/issues", + "source": "https://github.com/thephpleague/oauth1-client/tree/v1.10.1" + }, "time": "2022-04-15T14:02:14+00:00" }, { @@ -2273,6 +2393,10 @@ } ], "description": "A front-end framework for Laravel.", + "support": { + "issues": "https://github.com/livewire/livewire/issues", + "source": "https://github.com/livewire/livewire/tree/v2.10.5" + }, "funding": [ { "url": "https://github.com/livewire", @@ -2369,6 +2493,10 @@ "logging", "psr-3" ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.7.0" + }, "funding": [ { "url": "https://github.com/Seldaek", @@ -2425,6 +2553,10 @@ "shibboleth", "single sign-on" ], + "support": { + "issues": "https://github.com/mrclay/shibalike/issues", + "source": "https://github.com/mrclay/shibalike/tree/1.0.0" + }, "time": "2014-08-24T05:06:41+00:00" }, { @@ -2473,6 +2605,10 @@ "session", "single sign-on" ], + "support": { + "issues": "https://github.com/mrclay/UserlandSession/issues", + "source": "https://github.com/mrclay/UserlandSession/tree/master" + }, "time": "2014-05-25T01:38:09+00:00" }, { @@ -2536,6 +2672,10 @@ "jwt", "token" ], + "support": { + "issues": "https://github.com/namshi/jose/issues", + "source": "https://github.com/namshi/jose/tree/master" + }, "time": "2016-12-05T07:27:31+00:00" }, { @@ -2618,6 +2758,11 @@ "datetime", "time" ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, "funding": [ { "url": "https://opencollective.com/Carbon", @@ -2686,6 +2831,10 @@ "config", "nette" ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.2.2" + }, "time": "2021-10-15T11:40:02+00:00" }, { @@ -2767,6 +2916,10 @@ "utility", "validation" ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v3.2.7" + }, "time": "2022-01-24T11:29:14+00:00" }, { @@ -2813,6 +2966,10 @@ "search", "searchable" ], + "support": { + "issues": "https://github.com/nicolaslopezj/searchable/issues", + "source": "https://github.com/nicolaslopezj/searchable/tree/master" + }, "time": "2020-03-30T12:30:18+00:00" }, { @@ -2865,6 +3022,10 @@ "parser", "php" ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" + }, "time": "2022-05-31T20:59:12+00:00" }, { @@ -2926,6 +3087,10 @@ "serialization", "serialize" ], + "support": { + "issues": "https://github.com/opis/closure/issues", + "source": "https://github.com/opis/closure/tree/3.6.3" + }, "time": "2022-01-27T09:35:39+00:00" }, { @@ -3016,6 +3181,10 @@ "jwt", "laravel" ], + "support": { + "issues": "https://github.com/PHP-Open-Source-Saver/jwt-auth/issues", + "source": "https://github.com/PHP-Open-Source-Saver/jwt-auth" + }, "time": "2022-04-22T06:31:30+00:00" }, { @@ -3073,6 +3242,10 @@ "php", "type" ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.8.1" + }, "funding": [ { "url": "https://github.com/GrahamCampbell", @@ -3127,6 +3300,10 @@ "container-interop", "psr" ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, "time": "2021-11-05T16:50:12+00:00" }, { @@ -3173,6 +3350,10 @@ "psr", "psr-14" ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, "time": "2019-01-08T18:20:26+00:00" }, { @@ -3222,6 +3403,9 @@ "psr", "psr-18" ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, "time": "2020-06-29T06:28:15+00:00" }, { @@ -3274,6 +3458,9 @@ "request", "response" ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, "time": "2019-04-30T12:38:16+00:00" }, { @@ -3324,6 +3511,9 @@ "request", "response" ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, "time": "2016-08-06T14:39:51+00:00" }, { @@ -3371,6 +3561,9 @@ "psr", "psr-3" ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, "time": "2021-05-03T11:20:27+00:00" }, { @@ -3419,6 +3612,9 @@ "psr-16", "simple-cache" ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, "time": "2017-10-23T01:57:42+00:00" }, { @@ -3491,6 +3687,10 @@ "interactive", "shell" ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.11.5" + }, "time": "2022-05-27T18:03:49+00:00" }, { @@ -3531,6 +3731,10 @@ } ], "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, "time": "2019-03-08T08:55:37+00:00" }, { @@ -3596,6 +3800,10 @@ "queue", "set" ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/1.2.2" + }, "funding": [ { "url": "https://github.com/ramsey", @@ -3690,6 +3898,10 @@ "identifier", "uuid" ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.2.3" + }, "funding": [ { "url": "https://github.com/ramsey", @@ -3776,6 +3988,10 @@ "spatie", "user" ], + "support": { + "issues": "https://github.com/spatie/laravel-activitylog/issues", + "source": "https://github.com/spatie/laravel-activitylog/tree/3.17.0" + }, "funding": [ { "url": "https://spatie.be/open-source/support-us", @@ -3854,6 +4070,10 @@ "security", "spatie" ], + "support": { + "issues": "https://github.com/spatie/laravel-permission/issues", + "source": "https://github.com/spatie/laravel-permission/tree/3.18.0" + }, "funding": [ { "url": "https://github.com/spatie", @@ -3916,6 +4136,10 @@ "laravel-searchable", "spatie" ], + "support": { + "issues": "https://github.com/spatie/laravel-searchable/issues", + "source": "https://github.com/spatie/laravel-searchable/tree/1.11.0" + }, "funding": [ { "url": "https://spatie.be/open-source/support-us", @@ -3961,6 +4185,10 @@ } ], "description": "JSON diff/rearrange/patch/pointer library for PHP", + "support": { + "issues": "https://github.com/swaggest/json-diff/issues", + "source": "https://github.com/swaggest/json-diff/tree/v3.8.3" + }, "time": "2021-09-25T22:09:03+00:00" }, { @@ -4022,6 +4250,10 @@ "mail", "mailer" ], + "support": { + "issues": "https://github.com/swiftmailer/swiftmailer/issues", + "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0" + }, "funding": [ { "url": "https://github.com/fabpot", @@ -4115,6 +4347,9 @@ "console", "terminal" ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.4.9" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -4178,6 +4413,9 @@ ], "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v5.4.3" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -4196,7 +4434,7 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.1", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", @@ -4242,6 +4480,9 @@ ], "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -4260,16 +4501,16 @@ }, { "name": "symfony/error-handler", - "version": "v5.4.9", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "c116cda1f51c678782768dce89a45f13c949455d" + "reference": "438ef3e5e6481244785da3ce8cf8f4e74e7f2822" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/c116cda1f51c678782768dce89a45f13c949455d", - "reference": "c116cda1f51c678782768dce89a45f13c949455d", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/438ef3e5e6481244785da3ce8cf8f4e74e7f2822", + "reference": "438ef3e5e6481244785da3ce8cf8f4e74e7f2822", "shasum": "" }, "require": { @@ -4310,6 +4551,9 @@ ], "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v5.4.19" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -4324,20 +4568,20 @@ "type": "tidelift" } ], - "time": "2022-05-21T13:57:48+00:00" + "time": "2023-01-01T08:32:19+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.4.9", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" + "reference": "abf49cc084c087d94b4cb939c3f3672971784e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/abf49cc084c087d94b4cb939c3f3672971784e0c", + "reference": "abf49cc084c087d94b4cb939c3f3672971784e0c", "shasum": "" }, "require": { @@ -4392,6 +4636,9 @@ ], "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.19" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -4406,11 +4653,11 @@ "type": "tidelift" } ], - "time": "2022-05-05T16:45:39+00:00" + "time": "2023-01-01T08:32:19+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.1", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", @@ -4468,6 +4715,9 @@ "interoperability", "standards" ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -4528,6 +4778,9 @@ ], "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.4.8" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -4546,16 +4799,16 @@ }, { "name": "symfony/http-foundation", - "version": "v5.4.9", + "version": "v5.4.20", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "6b0d0e4aca38d57605dcd11e2416994b38774522" + "reference": "d0435363362a47c14e9cf50663cb8ffbf491875a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6b0d0e4aca38d57605dcd11e2416994b38774522", - "reference": "6b0d0e4aca38d57605dcd11e2416994b38774522", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d0435363362a47c14e9cf50663cb8ffbf491875a", + "reference": "d0435363362a47c14e9cf50663cb8ffbf491875a", "shasum": "" }, "require": { @@ -4567,8 +4820,11 @@ "require-dev": { "predis/predis": "~1.0", "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/mime": "^4.4|^5.0|^6.0" + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" }, "suggest": { "symfony/mime": "To use the file extension guesser" @@ -4598,6 +4854,9 @@ ], "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.4.20" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -4612,20 +4871,20 @@ "type": "tidelift" } ], - "time": "2022-05-17T15:07:29+00:00" + "time": "2023-01-29T11:11:52+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.4.9", + "version": "v5.4.20", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "34b121ad3dc761f35fe1346d2f15618f8cbf77f8" + "reference": "aaeec341582d3c160cc9ecfa8b2419ba6c69954e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/34b121ad3dc761f35fe1346d2f15618f8cbf77f8", - "reference": "34b121ad3dc761f35fe1346d2f15618f8cbf77f8", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/aaeec341582d3c160cc9ecfa8b2419ba6c69954e", + "reference": "aaeec341582d3c160cc9ecfa8b2419ba6c69954e", "shasum": "" }, "require": { @@ -4707,6 +4966,9 @@ ], "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v5.4.20" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -4721,20 +4983,20 @@ "type": "tidelift" } ], - "time": "2022-05-27T07:09:08+00:00" + "time": "2023-02-01T08:18:48+00:00" }, { "name": "symfony/mime", - "version": "v5.4.9", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "2b3802a24e48d0cfccf885173d2aac91e73df92e" + "reference": "a858429a9c704edc53fe057228cf9ca282ba48eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/2b3802a24e48d0cfccf885173d2aac91e73df92e", - "reference": "2b3802a24e48d0cfccf885173d2aac91e73df92e", + "url": "https://api.github.com/repos/symfony/mime/zipball/a858429a9c704edc53fe057228cf9ca282ba48eb", + "reference": "a858429a9c704edc53fe057228cf9ca282ba48eb", "shasum": "" }, "require": { @@ -4748,15 +5010,16 @@ "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4" + "symfony/mailer": "<4.4", + "symfony/serializer": "<5.4.14|>=6.0,<6.0.14|>=6.1,<6.1.6" }, "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1", + "egulias/email-validator": "^2.1.10|^3.1|^4", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/dependency-injection": "^4.4|^5.0|^6.0", "symfony/property-access": "^4.4|^5.1|^6.0", "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.2|^6.0" + "symfony/serializer": "^5.4.14|~6.0.14|^6.1.6" }, "type": "library", "autoload": { @@ -4787,6 +5050,9 @@ "mime", "mime-type" ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.4.19" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -4801,20 +5067,20 @@ "type": "tidelift" } ], - "time": "2022-05-21T10:24:18+00:00" + "time": "2023-01-09T05:43:46+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", "shasum": "" }, "require": { @@ -4829,7 +5095,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4866,6 +5132,9 @@ "polyfill", "portable" ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -4880,7 +5149,7 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-iconv", @@ -4946,6 +5215,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.26.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -4964,16 +5236,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "433d05519ce6990bf3530fba6957499d327395c2" + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", - "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", "shasum": "" }, "require": { @@ -4985,7 +5257,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5024,6 +5296,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5038,20 +5313,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8" + "reference": "639084e360537a19f9ee352433b84ce831f3d2da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", + "reference": "639084e360537a19f9ee352433b84ce831f3d2da", "shasum": "" }, "require": { @@ -5065,7 +5340,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5108,6 +5383,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5122,20 +5400,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", "shasum": "" }, "require": { @@ -5147,7 +5425,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5189,6 +5467,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5203,20 +5484,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "shasum": "" }, "require": { @@ -5231,7 +5512,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5269,6 +5550,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5283,7 +5567,7 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php56", @@ -5334,6 +5618,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php56/tree/v1.20.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5352,16 +5639,16 @@ }, { "name": "symfony/polyfill-php72", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2" + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", "shasum": "" }, "require": { @@ -5370,7 +5657,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5407,6 +5694,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5421,20 +5711,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", "shasum": "" }, "require": { @@ -5443,7 +5733,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5483,6 +5773,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5497,20 +5790,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", "shasum": "" }, "require": { @@ -5519,7 +5812,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5563,6 +5856,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5577,7 +5873,7 @@ "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php81", @@ -5639,6 +5935,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5698,6 +5997,9 @@ ], "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.4.8" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5785,6 +6087,9 @@ "uri", "url" ], + "support": { + "source": "https://github.com/symfony/routing/tree/v5.4.8" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5803,16 +6108,16 @@ }, { "name": "symfony/service-contracts", - "version": "v2.5.1", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c" + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/24d9dc654b83e91aa59f9d167b131bc3b5bea24c", - "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", "shasum": "" }, "require": { @@ -5865,6 +6170,9 @@ "interoperability", "standards" ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5879,20 +6187,20 @@ "type": "tidelift" } ], - "time": "2022-03-13T20:07:29+00:00" + "time": "2022-05-30T19:17:29+00:00" }, { "name": "symfony/string", - "version": "v5.4.9", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99" + "reference": "0a01071610fd861cc160dfb7e2682ceec66064cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/985e6a9703ef5ce32ba617c9c7d97873bb7b2a99", - "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99", + "url": "https://api.github.com/repos/symfony/string/zipball/0a01071610fd861cc160dfb7e2682ceec66064cb", + "reference": "0a01071610fd861cc160dfb7e2682ceec66064cb", "shasum": "" }, "require": { @@ -5948,6 +6256,9 @@ "utf-8", "utf8" ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.19" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5962,7 +6273,7 @@ "type": "tidelift" } ], - "time": "2022-04-19T10:40:37+00:00" + "time": "2023-01-01T08:32:19+00:00" }, { "name": "symfony/translation", @@ -6042,6 +6353,9 @@ ], "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v5.4.9" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -6060,16 +6374,16 @@ }, { "name": "symfony/translation-contracts", - "version": "v2.5.1", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "1211df0afa701e45a04253110e959d4af4ef0f07" + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/1211df0afa701e45a04253110e959d4af4ef0f07", - "reference": "1211df0afa701e45a04253110e959d4af4ef0f07", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe", + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe", "shasum": "" }, "require": { @@ -6117,6 +6431,9 @@ "interoperability", "standards" ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -6131,20 +6448,20 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.4.9", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "af52239a330fafd192c773795520dc2dd62b5657" + "reference": "2944bbc23f5f8da2b962fbcbf7c4a6109b2f4b7b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/af52239a330fafd192c773795520dc2dd62b5657", - "reference": "af52239a330fafd192c773795520dc2dd62b5657", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2944bbc23f5f8da2b962fbcbf7c4a6109b2f4b7b", + "reference": "2944bbc23f5f8da2b962fbcbf7c4a6109b2f4b7b", "shasum": "" }, "require": { @@ -6203,6 +6520,9 @@ "debug", "dump" ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.4.19" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -6217,7 +6537,7 @@ "type": "tidelift" } ], - "time": "2022-05-21T10:24:18+00:00" + "time": "2023-01-16T10:52:33+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -6266,6 +6586,10 @@ ], "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.4" + }, "time": "2021-12-08T09:12:39+00:00" }, { @@ -6398,6 +6722,10 @@ "env", "environment" ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.1" + }, "funding": [ { "url": "https://github.com/GrahamCampbell", @@ -6456,6 +6784,10 @@ "clean", "php" ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/1.6.1" + }, "funding": [ { "url": "https://www.paypal.me/moelleken", @@ -6532,6 +6864,10 @@ "check", "validate" ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, "time": "2022-06-03T18:03:27+00:00" } ], @@ -6614,6 +6950,10 @@ "phpstorm", "sublime" ], + "support": { + "issues": "https://github.com/barryvdh/laravel-ide-helper/issues", + "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.12.3" + }, "funding": [ { "url": "https://fruitcake.nl", @@ -6673,6 +7013,9 @@ "email": "mike.vanriel@naenius.com" } ], + "support": { + "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.0.6" + }, "time": "2018-12-13T10:34:14+00:00" }, { @@ -6726,6 +7069,10 @@ "regex", "regular expression" ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.0.0" + }, "funding": [ { "url": "https://packagist.com", @@ -6792,6 +7139,10 @@ "constructor", "instantiate" ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -6861,6 +7212,10 @@ "flare", "reporting" ], + "support": { + "issues": "https://github.com/facade/flare-client-php/issues", + "source": "https://github.com/facade/flare-client-php/tree/1.9.1" + }, "funding": [ { "url": "https://github.com/spatie", @@ -6939,6 +7294,12 @@ "laravel", "page" ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/facade/ignition/issues", + "source": "https://github.com/facade/ignition" + }, "time": "2022-02-23T18:31:24+00:00" }, { @@ -6988,6 +7349,10 @@ "flare", "ignition" ], + "support": { + "issues": "https://github.com/facade/ignition-contracts/issues", + "source": "https://github.com/facade/ignition-contracts/tree/1.0.2" + }, "time": "2020-10-16T08:27:54+00:00" }, { @@ -7049,6 +7414,10 @@ "throwable", "whoops" ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.14.5" + }, "funding": [ { "url": "https://github.com/denis-sokolov", @@ -7105,6 +7474,10 @@ "faker", "fixtures" ], + "support": { + "issues": "https://github.com/fzaninotto/Faker/issues", + "source": "https://github.com/fzaninotto/Faker/tree/v1.9.2" + }, "abandoned": true, "time": "2020-12-11T09:56:16+00:00" }, @@ -7153,6 +7526,10 @@ "keywords": [ "test" ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, "time": "2020-07-09T08:09:16+00:00" }, { @@ -7221,6 +7598,10 @@ "test double", "testing" ], + "support": { + "issues": "https://github.com/mockery/mockery/issues", + "source": "https://github.com/mockery/mockery/tree/1.5.0" + }, "time": "2022-01-20T13:18:17+00:00" }, { @@ -7270,6 +7651,10 @@ "object", "object graph" ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + }, "funding": [ { "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", @@ -7345,6 +7730,10 @@ "php", "symfony" ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, "funding": [ { "url": "https://www.paypal.com/paypalme/enunomaduro", @@ -7415,6 +7804,10 @@ } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, "time": "2021-07-20T11:28:43+00:00" }, { @@ -7462,6 +7855,10 @@ } ], "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, "time": "2022-02-21T01:04:05+00:00" }, { @@ -7511,6 +7908,10 @@ "reflection", "static analysis" ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, "time": "2020-06-27T09:03:43+00:00" }, { @@ -7564,29 +7965,38 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, "time": "2021-10-19T17:43:47+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.6.1", + "version": "1.6.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "77a32518733312af16a44300404e945338981de3" + "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", - "reference": "77a32518733312af16a44300404e945338981de3", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d", + "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", + "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { "ext-tokenizer": "*", - "psalm/phar": "^4.8" + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" }, "type": "library", "extra": { @@ -7610,7 +8020,11 @@ } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2022-03-15T21:29:03+00:00" + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.2" + }, + "time": "2022-10-14T12:47:21+00:00" }, { "name": "phpspec/prophecy", @@ -7673,6 +8087,10 @@ "spy", "stub" ], + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" + }, "time": "2021-12-08T12:19:24+00:00" }, { @@ -7740,6 +8158,10 @@ "testing", "xunit" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -7796,6 +8218,10 @@ "filesystem", "iterator" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -7855,6 +8281,10 @@ "keywords": [ "process" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -7910,6 +8340,10 @@ "keywords": [ "template" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -7965,6 +8399,10 @@ "keywords": [ "timer" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -8059,6 +8497,10 @@ "testing", "xunit" ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.21" + }, "funding": [ { "url": "https://phpunit.de/sponsors.html", @@ -8115,6 +8557,10 @@ ], "description": "Library for parsing CLI options", "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -8167,6 +8613,10 @@ ], "description": "Collection of value objects that represent the PHP code units", "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -8218,6 +8668,10 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -8288,6 +8742,10 @@ "compare", "equality" ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -8341,6 +8799,10 @@ ], "description": "Library for calculating the complexity of PHP code units", "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -8403,6 +8865,10 @@ "unidiff", "unified diff" ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -8462,6 +8928,10 @@ "environment", "hhvm" ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -8535,6 +9005,10 @@ "export", "exporter" ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -8595,6 +9069,10 @@ "keywords": [ "global state" ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -8648,6 +9126,10 @@ ], "description": "Library for counting the lines of code in PHP source code", "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -8701,6 +9183,10 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -8752,6 +9238,10 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -8811,6 +9301,10 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -8862,6 +9356,10 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -8914,6 +9412,10 @@ ], "description": "Collection of value objects that represent the types of the PHP type system", "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.0.0" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -8963,6 +9465,10 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -9009,6 +9515,10 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, "funding": [ { "url": "https://github.com/theseer", diff --git a/database/migrations/2022_12_01_122736_project_add_object_type_enum.php b/database/migrations/2022_12_01_122736_project_add_object_type_enum.php deleted file mode 100644 index 77cf9325..00000000 --- a/database/migrations/2022_12_01_122736_project_add_object_type_enum.php +++ /dev/null @@ -1,44 +0,0 @@ -enum( - 'object_type', - [ - 'project', - 'project_history', - 'project_add_request', - 'project_change_request', - ] - )->default('project')->after('id'); - $table->unsignedBigInteger('object_id')->nullable()->after('object_type'); - - $table->index('object_type'); - $table->foreign('object_id')->references('id')->on('projects'); - } - ); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - $table->dropColumn('object_type'); - } -} diff --git a/database/migrations/2022_12_13_093313_create_comments_table.php b/database/migrations/2022_12_13_093313_create_comments_table.php deleted file mode 100644 index 5e936b03..00000000 --- a/database/migrations/2022_12_13_093313_create_comments_table.php +++ /dev/null @@ -1,43 +0,0 @@ -id(); - $table->foreignId('user_id')->constrained(); - $table->text('body')->nullable(); - $table->json('meta')->nullable(); - $table->morphs('commentable'); - $table->timestamps(); - } - ); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table( - 'comments', function (Blueprint $table) { - $table->dropForeign(['user_id']); - $table->dropMorphs('commentable'); - } - ); - Schema::dropIfExists('comments'); - } -} diff --git a/resources/views/home/search.blade.php b/resources/views/home/search.blade.php index 7b4a552f..4b03cec2 100644 --- a/resources/views/home/search.blade.php +++ b/resources/views/home/search.blade.php @@ -15,7 +15,6 @@ @if (Auth::user()->hasRole(['Administrator', 'Program administrator', 'Spider'])) @endif - - -
- - -
- - - @else -
- user -
-
-
{{ $comment->user->name }} (@if($comment->user->hasRole('Partner')) Partner @else SPIDER @endif)
-
{{ $comment->created_at->diffForHumans() }}
-
{{ $comment->body }}
-
- @if (!auth()->user()->hasRole('Partner')) -
- - -
- @endif -
-
- @endif -
- @endforeach - @if ($comments->count() == 0) -
- No comments yet. -
- @endif -
-
- -
- -
- -
-
- @error('comment') - - @enderror - @if (session()->has('message') && session('message') == 'Comment added successfully.') - - @endif -
-
- - - diff --git a/resources/views/project/action_links.blade.php b/resources/views/project/action_links.blade.php index b316f15a..3f365cd8 100644 --- a/resources/views/project/action_links.blade.php +++ b/resources/views/project/action_links.blade.php @@ -1,36 +1,17 @@ -@php - $btnClass = 'btn btn-outline-secondary btn-sm mb-1'; - $spanClass = 'd-none d-sm-inline-block'; -@endphp - -@if (Auth::user()->hasRole('Partner')) - @can('project-' . $project->id . '-edit') - {{ $project->object_type == 'project' ? $project->change_request ? 'Edit change request' : 'Add change request' : 'Edit' }} - - History - @endcan - -@elseif (Auth::user()->hasRole(['Spider', 'Administrator'])) - @can('project-' . $project->id . '-edit') - @if ($project->change_request && $project->change_request->id) - Review change request - @endif - Edit - - History - - @if(in_array($project->object_type, ['project_add_request', 'project_change_request'])) - Reject - Accept - @endif - @endcan - -@endif - -@if (auth()->user()->can('project-' . $project->id . '-update') && $project->object_type == 'project') - Write an update - All updates -@endif -@can('project-' . $project->id . '-delete') - Delete +@can('project-'.$project->id.'-edit') + Edit + History +@endcan +@can('project-'.$project->id.'-update') + Write an update + All updates +@endcan +@can('project-'.$project->id.'-delete') + Delete @endcan diff --git a/resources/views/project/activity_form.blade.php b/resources/views/project/activity_form.blade.php index df4ba521..cd0410a7 100644 --- a/resources/views/project/activity_form.blade.php +++ b/resources/views/project/activity_form.blade.php @@ -1,51 +1,46 @@ -@php - $key = Str::random(10); -@endphp
- @if ($activity) - - @endif -
-
-
-
-
-
-
-
-
-
- + class="form-control form-control-sm mediumEditor collapsed"> + @if ($activity){{$activity->template}}@endif
@@ -108,30 +104,30 @@ class="far fa-trash-alt"> weekStart: 1 }); $('#activities_list div.col-lg-6:last-child input.datepicker').datepicker("setDate", new Date()); - $('input[name="activities[{{$key}}][start]"]').on('change', function () { - $(this).closest('.card-body').find('input[name="activities[{{$key}}][end]"]').datepicker("setStartDate", $(this).val()); - var end = new Date($(this).closest('.card-body').find('input[name="activities[{{$key}}][end]"]').datepicker("getDate")); + $('input[name="activity_start[]"]').on('change', function () { + $(this).closest('.card-body').find('input[name="activity_end[]"]').datepicker("setStartDate", $(this).val()); + var end = new Date($(this).closest('.card-body').find('input[name="activity_end[]"]').datepicker("getDate")); var start = new Date($(this).datepicker("getDate")); if (new Date($(this).datepicker("getDate")) > end) { - $(this).closest('.card-body').find('input[name="activities[{{$key}}][end]"]').datepicker("setDate", $(this).val()); + $(this).closest('.card-body').find('input[name="activity_end[]"]').datepicker("setDate", $(this).val()); } }); $(function () { $('[data-toggle="tooltip"]').tooltip() }) @if ($index) - $('#activities_list div.col-lg-6:last-child').find('input[name="activities[{{$key}}][name]"]').val($('#activities_list div.col-lg-6:nth-child(' + {{$index}} + ')').find('input[name="activities[{{$key}}][name]"]').val()); - $('#activities_list div.col-lg-6:last-child').find('textarea[name="activities[{{$key}}][description]"]').text($('#activities_list div.col-lg-6:nth-child(' + {{$index}} + ')').find('textarea[name="activities[{{$key}}][description]"]').text()); - $('#activities_list div.col-lg-6:last-child').find('input[name="activities[{{$key}}][start]"]').datepicker("setDate", $('#activities_list div.col-lg-6:nth-child(' + {{$index}} + ')').find('input[name="activities[{{$key}}][start]"]').datepicker("getDate")); - $('#activities_list div.col-lg-6:last-child').find('input[name="activities[{{$key}}][end]"]').datepicker("setDate", $('#activities_list div.col-lg-6:nth-child(' + {{$index}} + ')').find('input[name="activities[{{$key}}][end]"]').datepicker("getDate")); - //$('#activities_list div.col-lg-6:last-child').find('select[name="activities[{{$key}}][reminder]"]').val($('#activities_list div.col-lg-6:nth-child('+{{$index}}+')').find('select[name="activities[{{$key}}][reminder]"]').val()).change(); - //$('#activities_list div.col-lg-6:last-child').find('input[name="activities[{{$key}}][reminder_due_days]"]').val($('#activities_list div.col-lg-6:nth-child('+{{$index}}+')').find('input[name="activities[{{$key}}][reminder_due_days]"]').val()); - //$('#activities_list div.col-lg-6:last-child').find('select[name="activities[{{$key}}][reminder]"]').val($('#activities_list div.col-lg-6:nth-child('+{{$index}}+')').find('select[name="activities[{{$key}}][reminder]"]').val()).change(); - $('#activities_list div.col-lg-6:last-child').find('select[name="activities[{{$key}}][priority]"]').val($('#activities_list div.col-lg-6:nth-child(' + {{$index}} + ')').find('select[name="activities[{{$key}}][priority]"]').val()).change(); - $('#activities_list div.col-lg-6:last-child').find('input[name="activities[{{$key}}][budget]"]').val($('#activities_list div.col-lg-6:nth-child(' + {{$index}} + ')').find('input[name="activities[{{$key}}][budget]"]').val()); - $('#activities_list div.col-lg-6:last-child').find('input[name="activities[{{$key}}][budget]"]').val($('#activities_list div.col-lg-6:nth-child(' + {{$index}} + ')').find('input[name="activities[{{$key}}][budget]"]').val()); - $('#activities_list div.col-lg-6:last-child textarea[id="activities[{{$key}}][template]"]').html($('#activities_list div.col-lg-6:nth-child(' + {{$index}} + ')').find('#activities[{{$key}}][template]').val()); + $('#activities_list div.col-lg-6:last-child').find('input[name="activity_name[]"]').val($('#activities_list div.col-lg-6:nth-child(' + {{$index}} + ')').find('input[name="activity_name[]"]').val()); + $('#activities_list div.col-lg-6:last-child').find('textarea[name="activity_description[]"]').text($('#activities_list div.col-lg-6:nth-child(' + {{$index}} + ')').find('textarea[name="activity_description[]"]').text()); + $('#activities_list div.col-lg-6:last-child').find('input[name="activity_start[]"]').datepicker("setDate", $('#activities_list div.col-lg-6:nth-child(' + {{$index}} + ')').find('input[name="activity_start[]"]').datepicker("getDate")); + $('#activities_list div.col-lg-6:last-child').find('input[name="activity_end[]"]').datepicker("setDate", $('#activities_list div.col-lg-6:nth-child(' + {{$index}} + ')').find('input[name="activity_end[]"]').datepicker("getDate")); + //$('#activities_list div.col-lg-6:last-child').find('select[name="activity_reminder[]"]').val($('#activities_list div.col-lg-6:nth-child('+{{$index}}+')').find('select[name="activity_reminder[]"]').val()).change(); + //$('#activities_list div.col-lg-6:last-child').find('input[name="activity_reminder_due_days[]"]').val($('#activities_list div.col-lg-6:nth-child('+{{$index}}+')').find('input[name="activity_reminder_due_days[]"]').val()); + //$('#activities_list div.col-lg-6:last-child').find('select[name="activity_reminder[]"]').val($('#activities_list div.col-lg-6:nth-child('+{{$index}}+')').find('select[name="activity_reminder[]"]').val()).change(); + $('#activities_list div.col-lg-6:last-child').find('select[name="activity_priority[]"]').val($('#activities_list div.col-lg-6:nth-child(' + {{$index}} + ')').find('select[name="activity_priority[]"]').val()).change(); + $('#activities_list div.col-lg-6:last-child').find('input[name="activity_budget[]"]').val($('#activities_list div.col-lg-6:nth-child(' + {{$index}} + ')').find('input[name="activity_budget[]"]').val()); + $('#activities_list div.col-lg-6:last-child').find('input[name="activity_budget[]"]').val($('#activities_list div.col-lg-6:nth-child(' + {{$index}} + ')').find('input[name="activity_budget[]"]').val()); + $('#activities_list div.col-lg-6:last-child textarea[id="activity_template"]').html($('#activities_list div.col-lg-6:nth-child(' + {{$index}} + ')').find('#activity_template').val()); @endif - var editor = new MediumEditor('#activities_list #activities[{{$key}}][template]', {placeholder: {text: "Activity template"}}); + var editor = new MediumEditor('#activities_list #activity_template', {placeholder: {text: "Activity template"}}); @endif diff --git a/resources/views/project/form.blade.php b/resources/views/project/form.blade.php index 19f5b1af..56deff2c 100644 --- a/resources/views/project/form.blade.php +++ b/resources/views/project/form.blade.php @@ -8,18 +8,6 @@
- @if($errors->any()) -
-
- @foreach($errors->all() as $error) - - @endforeach -
-
- @endif - @empty($project->id)
@@ -35,29 +23,29 @@ title="Here you add basic information about the project">
- +
- - @error('name') -
{{ $errors->first('name') }}
+ value="{{ old('project_name', empty($project) ? '' : $project->name) }}"> + @error('project_name') +
{{ $errors->first('project_name') }}
@enderror
-
- @error('description') + class="form-control mediumEditor form-control-sm @error('project_description') is-danger @enderror" + name="project_description" id="project_description" + >{!! old('project_description', empty($project) ? '' : $project->description) !!} + @error('project_description')
- {{ $errors->first('description') }} + {{ $errors->first('project_description') }}
@enderror
@@ -73,28 +61,28 @@ class="form-control mediumEditor form-control-sm @error('description') is-danger
- +
-
- +
-
-
- + - - + - @@ -229,12 +223,12 @@ class="fas fa-info-circle fa-1x"> @foreach ($aggregated_outputs as $aggregated_output) - class="form-control form-control-sm"> - - +
- @if (!Auth::user()->hasRole('Partner')) -
-
- - -
-
- -
- -
+
+
+ + +
+
+ +
+
-
- -
- -
+
+
+ +
+
- +
-
- -
- - - @include('project.invite_form') -
+
+ +
+ + + @include('project.invite_form')
- @endif +
@@ -385,11 +377,9 @@ class="fas fa-info-circle fa-1x"> li: '
  • ' } }); - $('.generalMediumEditor, .mediumEditor').css('min-height', '60px').css('height', 'auto'); - var editor = new MediumEditor('.mediumEditor[id*="activities"]', {placeholder: {text: "Activity template"}}); - var editor = new MediumEditor('.mediumEditor#description', {placeholder: {text: "Describe the project"}}); - var generalEditor = new MediumEditor('.generalMediumEditor'); + var editor = new MediumEditor('.mediumEditor#activity_template', {placeholder: {text: "Activity template"}}); + var editor = new MediumEditor('.mediumEditor#project_description', {placeholder: {text: "Describe the project"}}); $(document).ready(function () { $(document).on('click', '.collapseEditor', function () { @@ -407,7 +397,7 @@ class="fas fa-info-circle fa-1x"> }); $('.currency').each(function () { - $(this).text($('#currency option:selected').text()); + $(this).text($('#project_currency option:selected').text()); }); $('input[name="output_indicator[]"]').focusout(function () { $(this).tooltip('hide'); @@ -445,20 +435,20 @@ class="fas fa-info-circle fa-1x"> $(document).on('click', '.add-outputs', function () { $('#outputs_table').closest('.card').show(); let html = ''; - let timestamp = Date.now(); html += ''; - html += ''; - html += ''; - html += ''; + html += ''; + html += ''; + html += ''; + html += ''; html += ''; $('#outputs_table').append(html); $(function () { $('[data-toggle="tooltip"]').tooltip() }) - $('input[name="outputs['+timestamp+'][indicator]"]').focusout(function () { + $('input[name="output_indicator[]"]').focusout(function () { $(this).tooltip('hide'); }); - $('input[name="outputs['+timestamp+'][indicator]"]').on('keyup', function () { + $('input[name="output_indicator[]"]').on('keyup', function () { if (this.value.length > 250) { $(this).tooltip('show'); } else { @@ -472,10 +462,11 @@ class="fas fa-info-circle fa-1x"> let html = ''; let timestamp = Date.now(); html += ''; - html += ''; - html += ''; - html += ''; - html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; $('#aggregated_outputs_table').append(html); $(function () { $('[data-toggle="tooltip"]').tooltip() @@ -521,9 +512,9 @@ class="fas fa-info-circle fa-1x"> $(document).on('click', '.add-outcomes', function () { $('#outcomes_table').closest('.card').show(); let html = ''; - let timestamp = Date.now(); html += ''; - html += ''; + html += ''; + html += ''; html += ''; $('#outcomes_table').append(html); $(function () { @@ -540,9 +531,9 @@ class="fas fa-info-circle fa-1x"> } }); - $('#currency').on('change', function () { + $('#project_currency').on('change', function () { $('.currency').each(function () { - $(this).text($('#currency option:selected').text()); + $(this).text($('#project_currency option:selected').text()); }); }); $("form").submit(function () { @@ -564,10 +555,10 @@ class="fas fa-info-circle fa-1x"> } // Add extra confirmation on empty fields let confirmation = ''; - if (!$('textarea[name=description]').text().trim()) { + if (!$('textarea[name=project_description]').text().trim()) { confirmation += '\nDescription field is empty'; } - if (!$("#end").val()) { + if (!$("#project_end").val()) { confirmation += '\nProject end date field is empty'; } $('#activities_list .medium-editor-element').each(function (index) { diff --git a/resources/views/project/outcome_update.blade.php b/resources/views/project/outcome_update.blade.php index a0879029..62b05ff7 100644 --- a/resources/views/project/outcome_update.blade.php +++ b/resources/views/project/outcome_update.blade.php @@ -4,7 +4,7 @@
    - {!!$outcome->name!!} + {{$outcome->name}} @if (isset($show) && $show && Auth::user()->hasRole(['Spider', 'Administrator'])) @if($outcome->completed()) Completed on {{$outcome->completed()->format('d/m/Y')}} @@ -28,7 +28,7 @@ @foreach(json_decode($outcome_update->outputs, true) as $output)
    - {!!\App\Output::find($output)->indicator!!} + {{\App\Output::find($output)->indicator}} {{$outcome_update->calculateOutputValue($output)}}
    @@ -52,7 +52,7 @@ class="custom-select" multiple="multiple" required> @foreach($outcome->project->outputs as $output) - + @endforeach
    @@ -60,11 +60,12 @@ class="custom-select"
    - +
    + placeholder="Describe the outcome completion summary">@if($outcome_update) {{$outcome_update->summary}} @endif
    diff --git a/resources/views/project/outcomes.blade.php b/resources/views/project/outcomes.blade.php index 0c9a076d..17124326 100644 --- a/resources/views/project/outcomes.blade.php +++ b/resources/views/project/outcomes.blade.php @@ -60,7 +60,7 @@ class="badge ml-2 badge-light font-100">{{$output['value']}} class="custom-select" multiple="multiple" required> @foreach($project->outputs as $output) - + @endforeach
    diff --git a/resources/views/project/reminder_form.blade.php b/resources/views/project/reminder_form.blade.php index 69177e72..550a5166 100644 --- a/resources/views/project/reminder_form.blade.php +++ b/resources/views/project/reminder_form.blade.php @@ -1,27 +1,21 @@ -@php - $key = Str::random(10); -@endphp
    - @if ($reminder) - - @endif -
    + value="{{ old('project_reminder_name', empty($reminder->name) ? '' : $reminder->name) }}">
    -
    -
    -
    - - @if($errors->any()) -
    -
    - @foreach($errors->all() as $error) - - @endforeach -
    -
    - @endif - - @if(session()->has('success')) -
    -
    - -
    -
    - @endif -

    Return back

    @include('project.action_links')

    @@ -222,7 +200,7 @@ class="badge badge-light font-100">{{count($a->comments)}} @if (count($a->commen @foreach ($outputs as $o)
    - {!! $o->indicator !!} + {{$o->indicator}} @if (Auth::user()->hasRole(['Spider', 'Administrator'])) {{$o->valuesum}} @if ($o->status == 'custom') (unplanned) @else / {{$o->target}} @endif @@ -244,8 +222,6 @@ class="badge badge-light font-100">{{count($a->comments)}} @if (count($a->commen @else The project has no outputs. @endif - @livewire('comments', ['project' => $project, 'comments' => $project->comments]) -