From cffa0e509aa083a7a1ed85850f5e8ec611464a60 Mon Sep 17 00:00:00 2001 From: ajikamaludin Date: Sun, 18 Sep 2022 16:42:29 +0700 Subject: [PATCH] oke dah , kurang share , reminder send mail sama calender --- .gitignore | 1 + app/Http/Controllers/DocumentController.php | 165 +++++++++++ app/Http/Controllers/GeneralController.php | 19 ++ app/Http/Middleware/HandleInertiaRequests.php | 3 + app/Models/Document.php | 10 + config/filesystems.php | 2 +- ...22_09_18_034528_create_documents_table.php | 1 + resources/js/Components/InputFile.jsx | 31 ++ resources/js/Components/TextInput.jsx | 29 +- resources/js/Icons.jsx | 15 + resources/js/Layouts/AuthenticatedLayout.jsx | 16 +- resources/js/Pages/Dashboard.jsx | 37 +-- resources/js/Pages/Document/Detail.jsx | 170 +++++++++++ resources/js/Pages/Document/DocStatusItem.jsx | 9 + resources/js/Pages/Document/Form.jsx | 278 ++++++++++++++++++ resources/js/Pages/Document/Index.jsx | 162 ++++++++++ resources/js/Pages/Document/ModalFilter.jsx | 103 +++++++ resources/js/Pages/User/Index.jsx | 21 +- resources/js/utils.js | 17 ++ resources/views/app.blade.php | 1 + routes/web.php | 17 +- 21 files changed, 1063 insertions(+), 44 deletions(-) create mode 100644 app/Http/Controllers/DocumentController.php create mode 100644 app/Http/Controllers/GeneralController.php create mode 100644 resources/js/Components/InputFile.jsx create mode 100644 resources/js/Icons.jsx create mode 100644 resources/js/Pages/Document/Detail.jsx create mode 100644 resources/js/Pages/Document/DocStatusItem.jsx create mode 100644 resources/js/Pages/Document/Form.jsx create mode 100644 resources/js/Pages/Document/Index.jsx create mode 100644 resources/js/Pages/Document/ModalFilter.jsx create mode 100644 resources/js/utils.js diff --git a/.gitignore b/.gitignore index 38e5b25..7f25105 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ /public/build /public/hot /public/storage +/public/documents /storage/*.key /vendor .env diff --git a/app/Http/Controllers/DocumentController.php b/app/Http/Controllers/DocumentController.php new file mode 100644 index 0000000..23d9f08 --- /dev/null +++ b/app/Http/Controllers/DocumentController.php @@ -0,0 +1,165 @@ +orderBy('created_at'); + + if ($request->q != null || $request->q != '') { + $query->where('no_doc', 'like', '%'.$request->q.'%') + ->orWhere('company_name', 'like', '%'.$request->q.'%') + ->orWhere('pic_name', 'like', '%'.$request->q.'%') + ->orWhere('email', 'like', '%'.$request->q.'%'); + } + + if ($request->department_id != ''){ + $query->where('department_id', $request->department_id); + } + + if ($request->status != ''){ + $query->where('status', $request->status); + } + + if ($request->type_doc_id != ''){ + $query->where('type_doc_id', $request->type_doc_id); + } + + return inertia('Document/Index', [ + 'docs' => $query->paginate(10), + 'types' => TypeDoc::all(), + 'departments' => Department::all(), + ]); + } + + public function create() + { + return inertia('Document/Form', [ + 'types' => TypeDoc::all(), + 'departments' => Department::all(), + ]); + } + + public function store(Request $request) + { + $request->validate([ + 'no_doc' => 'required|string', + 'company_name' => 'required|string', + 'first_person_name' => 'required|string', + 'second_person_name' => 'required|string', + 'start_date' => 'required|date', + 'end_date' => 'required|date', + 'type_doc_id' => 'required|exists:type_docs,id', + 'department_id' => 'required|exists:departments,id', + 'pic_name' => 'required|string', + 'email' => 'required|email', + // 'document' => 'required|file', + 'note' => 'nullable', + 'status' => 'required|numeric', + ]); + + $lastDocs = Document::orderBy('created_at', 'desc')->first(); + $lastDocs = $lastDocs ? $lastDocs : Document::make(['no' => 0]); + $docs = Document::make([ + 'no' => $lastDocs->no + 1, + 'no_doc' => $request->no_doc, + 'company_name' => $request->company_name, + 'first_person_name' => $request->first_person_name, + 'second_person_name' => $request->second_person_name, + 'start_date' => $request->start_date, + 'end_date' => $request->end_date, + 'pic_name' => $request->pic_name, + 'email' => $request->email, + 'note' => $request->note, + 'type_doc_id' => $request->type_doc_id, + 'department_id' => $request->department_id, + 'status' => $request->status, + 'user_id' => auth()->user()->id, + ]); + + // $file = $request->file('document'); + // $file->store('documents', 'public'); + $docs->document = ''; + + $docs->save(); + + return redirect()->route('docs.index') + ->with('message', ['type' => 'success', 'message' => 'The data has beed saved']); + } + + public function edit(Document $doc) + { + return inertia('Document/Form', [ + 'types' => TypeDoc::all(), + 'departments' => Department::all(), + 'doc' => $doc + ]); + } + + public function update(Request $request, Document $doc) + { + $request->validate([ + 'no_doc' => 'required|string', + 'company_name' => 'required|string', + 'first_person_name' => 'required|string', + 'second_person_name' => 'required|string', + 'start_date' => 'required|date', + 'end_date' => 'required|date', + 'type_doc_id' => 'required|exists:type_docs,id', + 'department_id' => 'required|exists:departments,id', + 'pic_name' => 'required|string', + 'email' => 'required|email', + 'document' => 'nullable|file', + 'note' => 'nullable', + 'status' => 'required|numeric', + ]); + + + $doc->fill([ + 'no_doc' => $request->no_doc, + 'company_name' => $request->company_name, + 'first_person_name' => $request->first_person_name, + 'second_person_name' => $request->second_person_name, + 'start_date' => $request->start_date, + 'end_date' => $request->end_date, + 'pic_name' => $request->pic_name, + 'email' => $request->email, + 'note' => $request->note, + 'type_doc_id' => $request->type_doc_id, + 'department_id' => $request->department_id, + 'status' => $request->status, + ]); + + $file = $request->file('document'); + if($file != null) { + $file->store('documents', 'public'); + $doc->document = $file->hashName(); + } + + $doc->save(); + + return redirect()->route('docs.index') + ->with('message', ['type' => 'success', 'message' => 'The data has beed saved']); + } + + public function show(Document $doc) + { + return inertia('Document/Detail', [ + 'doc' => $doc->load(['department', 'type', 'creator']), + 'doc_url' => asset('document/'.$doc->document), + ]); + } + + public function destroy(Document $doc) + { + $doc->delete(); + return redirect()->back(); + } +} diff --git a/app/Http/Controllers/GeneralController.php b/app/Http/Controllers/GeneralController.php new file mode 100644 index 0000000..1430fa4 --- /dev/null +++ b/app/Http/Controllers/GeneralController.php @@ -0,0 +1,19 @@ + Document::where('status', Document::ACTIVE)->count(), + 'count_update' => Document::where('status', Document::UPDATE)->count(), + 'count_expired' => Document::where('status', Document::EXPIRED)->count(), + 'count_total' => Document::count() + ]); + } +} diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php index 404f383..b0cb9ab 100644 --- a/app/Http/Middleware/HandleInertiaRequests.php +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -43,6 +43,9 @@ class HandleInertiaRequests extends Middleware 'location' => $request->url(), ]); }, + 'flash' => [ + 'message' => fn () => $request->session()->get('message') + ], ]); } } diff --git a/app/Models/Document.php b/app/Models/Document.php index fafa758..d271834 100644 --- a/app/Models/Document.php +++ b/app/Models/Document.php @@ -23,9 +23,19 @@ class Document extends Model 'email', 'note', 'document', + 'status', 'user_id', ]; + protected $cast = [ + 'start_date' => 'date', + 'end_date' => 'date' + ]; + + public const ACTIVE = 0; + public const UPDATE = 1; + public const EXPIRED = 2; + public function department() { return $this->belongsTo(Department::class, 'department_id'); diff --git a/config/filesystems.php b/config/filesystems.php index e9d9dbd..8fbf4bd 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -38,7 +38,7 @@ return [ 'public' => [ 'driver' => 'local', - 'root' => storage_path('app/public'), + 'root' => base_path('public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', 'throw' => false, diff --git a/database/migrations/2022_09_18_034528_create_documents_table.php b/database/migrations/2022_09_18_034528_create_documents_table.php index 30736fd..1c03aa6 100644 --- a/database/migrations/2022_09_18_034528_create_documents_table.php +++ b/database/migrations/2022_09_18_034528_create_documents_table.php @@ -29,6 +29,7 @@ return new class extends Migration $table->text('note'); $table->string('document'); $table->foreignId('user_id')->constrained(); + $table->smallInteger('status')->default(0); $table->timestamps(); }); } diff --git a/resources/js/Components/InputFile.jsx b/resources/js/Components/InputFile.jsx new file mode 100644 index 0000000..d560f35 --- /dev/null +++ b/resources/js/Components/InputFile.jsx @@ -0,0 +1,31 @@ +import React from "react"; + + +export default function InputFile({ file, isError, inputRef, handleChange }) { + return ( +
+ +
{ + console.log(inputRef.current.click()) + }} + > + Pilih File +
+ handleChange(e)} + /> +
+ ) +} \ No newline at end of file diff --git a/resources/js/Components/TextInput.jsx b/resources/js/Components/TextInput.jsx index d8d6476..86d379a 100644 --- a/resources/js/Components/TextInput.jsx +++ b/resources/js/Components/TextInput.jsx @@ -9,6 +9,8 @@ export default function TextInput({ required, isFocused, handleChange, + isError, + readOnly = false }) { const input = useRef(); @@ -18,20 +20,37 @@ export default function TextInput({ } }, []); + if (type === "textarea") { + return ( + + ) + } return ( -
+
handleChange(e)} + readOnly={readOnly} />
); diff --git a/resources/js/Icons.jsx b/resources/js/Icons.jsx new file mode 100644 index 0000000..635fc99 --- /dev/null +++ b/resources/js/Icons.jsx @@ -0,0 +1,15 @@ +export const IconMenu = () => { + return ( + + + + ) +} + +export const IconFilter = () => { + return ( + + + + ) +} \ No newline at end of file diff --git a/resources/js/Layouts/AuthenticatedLayout.jsx b/resources/js/Layouts/AuthenticatedLayout.jsx index 9fc3eca..cff6b4b 100644 --- a/resources/js/Layouts/AuthenticatedLayout.jsx +++ b/resources/js/Layouts/AuthenticatedLayout.jsx @@ -1,23 +1,29 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import ApplicationLogo from '@/Components/ApplicationLogo'; import Dropdown from '@/Components/Dropdown'; -import { ToastContainer } from 'react-toastify' +import { ToastContainer, toast } from 'react-toastify' import ResponsiveNavLink from '@/Components/ResponsiveNavLink'; import { Link } from '@inertiajs/inertia-react'; import MenuItem from '@/Components/SidebarMenuItem'; -export default function Authenticated({ auth, children }) { +export default function Authenticated({ auth, children, flash }) { const [showingNavigationDropdown, setShowingNavigationDropdown] = useState(false); + useEffect(() => { + if (flash.message !== null) { + toast(flash.message.message, {type: flash.message.type}) + } + }, [flash]) + return ( -
+