diff --git a/app/Http/Controllers/ClientPortal/TaskController.php b/app/Http/Controllers/ClientPortal/TaskController.php new file mode 100644 index 000000000000..1319bda3d6ff --- /dev/null +++ b/app/Http/Controllers/ClientPortal/TaskController.php @@ -0,0 +1,34 @@ +user()->preferredLocale() + ); + + return render('tasks.index'); + } +} diff --git a/app/Http/Livewire/TasksTable.php b/app/Http/Livewire/TasksTable.php new file mode 100644 index 000000000000..9a741ed49dd7 --- /dev/null +++ b/app/Http/Livewire/TasksTable.php @@ -0,0 +1,39 @@ +where('client_id', auth('contact')->user()->client->id) + ->whereNotNull('invoice_id') + ->orderBy($this->sort_field, $this->sort_asc ? 'asc' : 'desc') + ->paginate($this->per_page); + + return render('components.livewire.tasks-table', [ + 'tasks' => $query, + ]); + } +} diff --git a/app/Http/Requests/ClientPortal/Tasks/ShowTasksRequest.php b/app/Http/Requests/ClientPortal/Tasks/ShowTasksRequest.php new file mode 100644 index 000000000000..de4aa00fd991 --- /dev/null +++ b/app/Http/Requests/ClientPortal/Tasks/ShowTasksRequest.php @@ -0,0 +1,30 @@ +user('contact')->client->getSetting('enable_client_portal_tasks'); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + // + ]; + } +} diff --git a/app/Http/ViewComposers/PortalComposer.php b/app/Http/ViewComposers/PortalComposer.php index fd0ebd4d6804..13daffd3ae81 100644 --- a/app/Http/ViewComposers/PortalComposer.php +++ b/app/Http/ViewComposers/PortalComposer.php @@ -82,9 +82,7 @@ class PortalComposer $data[] = ['title' => ctrans('texts.subscriptions'), 'url' => 'client.subscriptions.index', 'icon' => 'calendar']; if (auth()->user('contact')->client->getSetting('enable_client_portal_tasks')) { - $data[] = ['title' => ctrans('texts.tasks'), 'url' => 'client.dashboard', 'icon' => 'clock']; - - // TODO: Update when 'tasks' module is available in client portal. + $data[] = ['title' => ctrans('texts.tasks'), 'url' => 'client.tasks.index', 'icon' => 'clock']; } return $data; diff --git a/resources/views/portal/ninja2020/components/livewire/tasks-table.blade.php b/resources/views/portal/ninja2020/components/livewire/tasks-table.blade.php new file mode 100644 index 000000000000..db25d31225b8 --- /dev/null +++ b/resources/views/portal/ninja2020/components/livewire/tasks-table.blade.php @@ -0,0 +1,67 @@ +
+
+
+ + +
+
+
+
+ + + + + + + + + + @forelse($tasks as $task) + + + + + + @empty + + + + @endforelse + +
+ + {{ ctrans('texts.description') }} + + + + {{ ctrans('texts.status') }} + + + + {{ ctrans('texts.duration') }} + +
+ {{ \Illuminate\Support\Str::limit($task->description, 80) }} + + {{ optional($task->status)->name }} + + {{ \Carbon\CarbonInterval::seconds($task->calcDuration())->cascade()->forHumans() }} +
+ {{ ctrans('texts.no_results') }} +
+
+
+
+ @if($tasks->total() > 0) + + @endif + {{ $tasks->links('portal/ninja2020/vendor/pagination') }} +
+
diff --git a/resources/views/portal/ninja2020/tasks/index.blade.php b/resources/views/portal/ninja2020/tasks/index.blade.php new file mode 100644 index 000000000000..783e325a25b3 --- /dev/null +++ b/resources/views/portal/ninja2020/tasks/index.blade.php @@ -0,0 +1,8 @@ +@extends('portal.ninja2020.layout.app') +@section('meta_title', ctrans('texts.tasks')) + +@section('body') +
+ @livewire('tasks-table') +
+@endsection diff --git a/routes/client.php b/routes/client.php index 9e6d921cc606..8a71dc200a7c 100644 --- a/routes/client.php +++ b/routes/client.php @@ -54,7 +54,7 @@ Route::group(['middleware' => ['auth:contact', 'locale', 'check_client_existence Route::get('payment_methods/{payment_method}/verification', 'ClientPortal\PaymentMethodController@verify')->name('payment_methods.verification'); Route::post('payment_methods/{payment_method}/verification', 'ClientPortal\PaymentMethodController@processVerification'); - Route::resource('payment_methods', 'ClientPortal\PaymentMethodController')->except(['edit', 'update']); + Route::resource('payment_methods', 'ClientPortal\PaymentMethodController')->except(['edit', 'update']); Route::match(['GET', 'POST'], 'quotes/approve', 'ClientPortal\QuoteController@bulk')->name('quotes.bulk'); Route::get('quotes', 'ClientPortal\QuoteController@index')->name('quotes.index')->middleware('portal_enabled'); @@ -76,6 +76,8 @@ Route::group(['middleware' => ['auth:contact', 'locale', 'check_client_existence Route::resource('subscriptions', 'ClientPortal\SubscriptionController')->middleware('portal_enabled')->only(['index']); + Route::resource('tasks', 'ClientPortal\TaskController')->only(['index']); + Route::post('upload', 'ClientPortal\UploadController')->name('upload.store'); Route::get('logout', 'Auth\ContactLoginController@logout')->name('logout'); });