From 1ccc93456163e8019d48b92102f8bcb9a80a2a0b Mon Sep 17 00:00:00 2001 From: Kamil Niemczycki Date: Sat, 29 Jul 2023 00:34:32 +0200 Subject: [PATCH] - add cv management --- .../Controllers/Dashboard/CVController.php | 95 +++++++++++++ app/Http/Requests/CVRequest.php | 23 ++++ app/Http/Resources/CVCollection.php | 17 +++ app/Http/Resources/CVInfoCollection.php | 17 +++ app/Http/Resources/CVInfoResource.php | 21 +++ app/Http/Resources/FullCVCollection.php | 17 +++ app/Http/Resources/FullCVResource.php | 29 ++++ resources/js/Pages/CV/ConfirmDelete.vue | 37 +++++ resources/js/Pages/CV/Create.vue | 113 ++++++++++++++++ resources/js/Pages/CV/Edit.vue | 126 ++++++++++++++++++ resources/js/Pages/CV/Index.vue | 96 +++++++++++++ resources/js/Pages/CV/Show.vue | 124 +++++++++++++++++ resources/js/Share/Layout/App.vue | 5 +- routes/web.php | 20 +++ tailwind.config.js | 5 +- 15 files changed, 741 insertions(+), 4 deletions(-) create mode 100644 app/Http/Controllers/Dashboard/CVController.php create mode 100644 app/Http/Requests/CVRequest.php create mode 100644 app/Http/Resources/CVCollection.php create mode 100644 app/Http/Resources/CVInfoCollection.php create mode 100644 app/Http/Resources/CVInfoResource.php create mode 100644 app/Http/Resources/FullCVCollection.php create mode 100644 app/Http/Resources/FullCVResource.php create mode 100644 resources/js/Pages/CV/ConfirmDelete.vue create mode 100644 resources/js/Pages/CV/Create.vue create mode 100644 resources/js/Pages/CV/Edit.vue create mode 100644 resources/js/Pages/CV/Index.vue create mode 100644 resources/js/Pages/CV/Show.vue diff --git a/app/Http/Controllers/Dashboard/CVController.php b/app/Http/Controllers/Dashboard/CVController.php new file mode 100644 index 0000000..79fe4f8 --- /dev/null +++ b/app/Http/Controllers/Dashboard/CVController.php @@ -0,0 +1,95 @@ + new FullCVCollection(CV::all()), + ]); + } + + public function show(CV $cv): InertiaResponse + { + return inertia('CV/Show', [ + 'cv' => new FullCVResource($cv), + 'cvInfo' => new CVInfoCollection($cv->info()->orderByDesc('id')->get()), + ]); + } + + public function create(): InertiaResponse + { + return inertia('CV/Create'); + } + + public function store(CVRequest $request): RedirectResponse + { + CV::query() + ->create([ + 'token' => Str::random(50), + 'recipient' => $request->get('recipient'), + 'email' => $request->get('email'), + 'phone_number' => $request->get('phone_number'), + 'locations' => ($locations = $request->get('locations')) === [''] ? [] : $locations, + 'mission' => ($mission = $request->get('mission')) === [''] ? [] : $mission, + 'rodo' => ($rodo =$request->get('rodo')) === '' ? null : $rodo, + 'position' => $request->get('position'), + ]); + return redirect() + ->route('admin.cv.store') + ->with('success', 'Utworzono nowe CV dla firmy ' . $request->get('recipient')); + } + + public function edit(CV $cv): InertiaResponse + { + return inertia('CV/Edit', [ + 'cv' => new FullCVResource($cv), + ]); + } + + public function update(CVRequest $request, CV $cv): RedirectResponse + { + $cv->update([ + 'recipient' => $request->get('recipient'), + 'email' => $request->get('email'), + 'phone_number' => $request->get('phone_number'), + 'locations' => ($locations = $request->get('locations')) === [''] ? [] : $locations, + 'mission' => ($mission = $request->get('mission')) === [''] ? [] : $mission, + 'rodo' => ($rodo =$request->get('rodo')) === '' ? null : $rodo, + 'position' => $request->get('position'), + ]); + return redirect() + ->back() + ->with('success', 'Zaktualizowano CV dla firmy ' . $request->get('recipient')); + } + + public function delete(CV $cv): InertiaResponse + { + return inertia('CV/ConfirmDelete', compact('cv')); + } + + public function destroy(CV $cv): RedirectResponse + { + $name = $cv->recipient; + $cv->delete(); + + return redirect() + ->route('admin.cv.index') + ->with('info', 'Usunięto CV dla firmy "'. $name .'"'); + } +} diff --git a/app/Http/Requests/CVRequest.php b/app/Http/Requests/CVRequest.php new file mode 100644 index 0000000..4b91c83 --- /dev/null +++ b/app/Http/Requests/CVRequest.php @@ -0,0 +1,23 @@ + 'required|string', + 'email' => 'required|email', + 'phone_number' => 'required|string', + 'locations' => 'required|array', + 'mission' => 'nullable|string', + 'rodo' => 'nullable|string', + 'position' => 'required|string', + ]; + } +} diff --git a/app/Http/Resources/CVCollection.php b/app/Http/Resources/CVCollection.php new file mode 100644 index 0000000..cb2b124 --- /dev/null +++ b/app/Http/Resources/CVCollection.php @@ -0,0 +1,17 @@ + $this->collection, + ]; + } +} diff --git a/app/Http/Resources/CVInfoCollection.php b/app/Http/Resources/CVInfoCollection.php new file mode 100644 index 0000000..b6111ad --- /dev/null +++ b/app/Http/Resources/CVInfoCollection.php @@ -0,0 +1,17 @@ + $this->collection, + ]; + } +} diff --git a/app/Http/Resources/CVInfoResource.php b/app/Http/Resources/CVInfoResource.php new file mode 100644 index 0000000..810cd9b --- /dev/null +++ b/app/Http/Resources/CVInfoResource.php @@ -0,0 +1,21 @@ + $this->id, + 'ip' => $this->ip, + 'created_at' => $this->created_at->format('d-m-Y H:i:s'), + ]; + } +} diff --git a/app/Http/Resources/FullCVCollection.php b/app/Http/Resources/FullCVCollection.php new file mode 100644 index 0000000..ab49796 --- /dev/null +++ b/app/Http/Resources/FullCVCollection.php @@ -0,0 +1,17 @@ + $this->collection, + ]; + } +} diff --git a/app/Http/Resources/FullCVResource.php b/app/Http/Resources/FullCVResource.php new file mode 100644 index 0000000..99187bf --- /dev/null +++ b/app/Http/Resources/FullCVResource.php @@ -0,0 +1,29 @@ + $this->id, + 'token' => $this->token, + 'email' => $this->email, + 'recipient' => $this->recipient, + 'phone' => new PhoneResource($this->resource), + 'locations' => $this->locations, + 'views' => $this->resource->info()->select('id')->get()->count(), + 'registeredViews' => $this->views, + 'mission' => explode(PHP_EOL, $this->mission ?? '', 5), + 'rodo' => $this->rodo, + 'position' => $this->position, + ]; + } +} diff --git a/resources/js/Pages/CV/ConfirmDelete.vue b/resources/js/Pages/CV/ConfirmDelete.vue new file mode 100644 index 0000000..a70305e --- /dev/null +++ b/resources/js/Pages/CV/ConfirmDelete.vue @@ -0,0 +1,37 @@ + + + diff --git a/resources/js/Pages/CV/Create.vue b/resources/js/Pages/CV/Create.vue new file mode 100644 index 0000000..6c40137 --- /dev/null +++ b/resources/js/Pages/CV/Create.vue @@ -0,0 +1,113 @@ + + + diff --git a/resources/js/Pages/CV/Edit.vue b/resources/js/Pages/CV/Edit.vue new file mode 100644 index 0000000..e00d84c --- /dev/null +++ b/resources/js/Pages/CV/Edit.vue @@ -0,0 +1,126 @@ + + + diff --git a/resources/js/Pages/CV/Index.vue b/resources/js/Pages/CV/Index.vue new file mode 100644 index 0000000..28c9316 --- /dev/null +++ b/resources/js/Pages/CV/Index.vue @@ -0,0 +1,96 @@ + + + diff --git a/resources/js/Pages/CV/Show.vue b/resources/js/Pages/CV/Show.vue new file mode 100644 index 0000000..3c8591c --- /dev/null +++ b/resources/js/Pages/CV/Show.vue @@ -0,0 +1,124 @@ + + + diff --git a/resources/js/Share/Layout/App.vue b/resources/js/Share/Layout/App.vue index ecf89f4..47563fe 100644 --- a/resources/js/Share/Layout/App.vue +++ b/resources/js/Share/Layout/App.vue @@ -26,8 +26,9 @@ defineProps({ >KamilCraft diff --git a/routes/web.php b/routes/web.php index 0fef0cb..a9b369e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -7,6 +7,26 @@ use Illuminate\Support\Facades\Route; Route::name('admin.')->group(function () { Route::namespace('Dashboard')->middleware('auth')->group(function () { Route::get('', 'AdminPanelController')->name('home'); + Route::name('cv.')->prefix('cv')->group(function () { + Route::get('', 'CVController@index') + ->name('index'); + Route::get('create', 'CVController@create') + ->name('create'); + Route::post('', 'CVController@store') + ->name('store'); + Route::get('{cv}', 'CVController@show') + ->name('show'); + Route::post('', 'CVController@store') + ->name('store'); + Route::get('{cv}/edit', 'CVController@edit') + ->name('edit'); + Route::put('{cv}', 'CVController@update') + ->name('update'); + Route::get('{cv}/delete', 'CVController@delete') + ->name('delete'); + Route::delete('{cv}/delete', 'CVController@destroy') + ->name('destroy'); + }); Route::name('category.')->prefix('category')->group(function () { Route::get('create', 'CategoryController@create') ->name('create'); diff --git a/tailwind.config.js b/tailwind.config.js index c22a863..73cbb0b 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -10,10 +10,11 @@ module.exports = { fontFamily: { 'arial': ['Arial', 'sans-serif'], 'roboto': ['Roboto', 'sans-serif'], - 'thasadith': ['Thasadith', 'sans-serif'] + 'thasadith': ['Thasadith', 'sans-serif'], }, colors: { - 'logo-green': 'rgb(var(--color-logo-green) / )' + 'logo-green': 'rgb(var(--color-logo-green) / )', + 'kamilcraft-green': 'rgb(var(--color-logo-green) / )', } }, },