| 599 | {{{ |
| 600 | // Folders view |
| 601 | Route::group(['middleware' => 'permission:view_all_folders'], function () { |
| 602 | Route::get("/folders", "Dashboard\FoldersController@index")->name("dashboard.folders.index"); |
| 603 | Route::get('/folders/{id}/files', 'Dashboard\FoldersController@files')->name('dashboard.folders.files'); |
| 604 | }); |
| 605 | |
| 606 | // Folders manage |
| 607 | Route::group(['middleware' => 'permission:manage_all_folders'], function () { |
| 608 | Route::get("/folders/create", "Dashboard\FoldersController@create")->name("dashboard.folders.create"); |
| 609 | Route::post("/folders/store", "Dashboard\FoldersController@store")->name("dashboard.folders.store"); |
| 610 | Route::post("/folders/{id}/upload", "Dashboard\FoldersController@uploadFiles")->name("dashboard.folders.uploadFiles"); |
| 611 | }); |
| 612 | }}} |
| 613 | ''Рути за управување со фолдери'' |
| 614 | Рутата со име dashboard.folders.files се користи за приказ на сите датотеки за одреден фолдер според query параметарот кој што е id од избраниот фолдер. Рутите create и store се користат за креирање на нов фолдер додека рутата uploadFiles за прикачување на нови датотеки во веќе креиран фолдер. |
| 615 | |
| 616 | |
| 617 | {{{ |
| 618 | public function index(Request $request) |
| 619 | { |
| 620 | $deptName = ""; |
| 621 | $deptCode = ""; |
| 622 | |
| 623 | if ($request->query('id')) { |
| 624 | $deptName = Department::find($request->query('id'))->getOriginal('name'); |
| 625 | $deptCode = Department::find($request->query('id'))->getOriginal('code'); |
| 626 | $foldersInDeptSort = Folder::with('department')->when($request->has('id'), function ($query) use ($request) { |
| 627 | $query->where('department_id', $request->query('id')); |
| 628 | }); |
| 629 | |
| 630 | if ($request->query('sort') == 'newest') { |
| 631 | $folders = $foldersInDeptSort->orderBy('created_at', 'desc')->paginate(12); |
| 632 | } |
| 633 | else if ($request->query('sort') == 'name') { |
| 634 | $folders = $foldersInDeptSort->orderBy('name', 'asc')->paginate(12); |
| 635 | } |
| 636 | else if ($request->query('sort') == 'no_of_files') { |
| 637 | $folders = $foldersInDeptSort->orderBy('no_of_files', 'desc')->paginate(12); |
| 638 | } |
| 639 | else if($request->query('sort') == 'count'){ |
| 640 | $total = $foldersInDeptSort->folder->files->count(); |
| 641 | $folders = $foldersInDeptSort->orderBy($total, 'asc')->paginate(12); |
| 642 | } |
| 643 | else { |
| 644 | $folders = Folder::where('department_id', $request->query('id'))->paginate(12); |
| 645 | } |
| 646 | } else { |
| 647 | if ($request->query('sort') == 'newest') { |
| 648 | $folders = Folder::orderBy('created_at', 'desc')->paginate(12); |
| 649 | } |
| 650 | else if ($request->query('sort') == 'name') { |
| 651 | $folders = Folder::orderBy('name', 'asc')->paginate(12); |
| 652 | } |
| 653 | else if ($request->query('sort') == 'no_of_files') { |
| 654 | $folders = Folder::orderBy('no_of_files', 'desc')->paginate(12); |
| 655 | } |
| 656 | else if ($request->query('sort') == 'recent') { |
| 657 | $folders = Folder::orderBy('created_at', 'desc')->paginate(12); |
| 658 | } else if ($request->query('search')) { |
| 659 | |
| 660 | $result = collect(); |
| 661 | $queries = explode(" ", $request->search); |
| 662 | foreach ($queries as $query) { |
| 663 | $result->push(Folder::where("arch_id", "like", "%{$query}%")->orWhere("name", "like", "%{$query}%")->get()); |
| 664 | } |
| 665 | $result = $result->flatten(); |
| 666 | $folders = $result; |
| 667 | } else { |
| 668 | $folders = Folder::paginate(12); |
| 669 | } |
| 670 | } |
| 671 | |
| 672 | $departments = Department::all(); |
| 673 | |
| 674 | $diskTotal = disk_total_space('/'); |
| 675 | $diskTotalSize = $diskTotal / 1073741824; |
| 676 | |
| 677 | $diskFree = disk_free_space('/'); |
| 678 | $used = $diskTotal - $diskFree; |
| 679 | |
| 680 | $diskUsedSize = $used / 1073741824; |
| 681 | $diskUse1 = round(100 - (($diskUsedSize / $diskTotalSize) * 100)); |
| 682 | $diskUse = round(100 - ($diskUse1)) . '%'; |
| 683 | |
| 684 | return view("dashboard.folders.index")->with([ |
| 685 | "folders" => $folders, |
| 686 | "currentUser" => auth()->user(), |
| 687 | "departments" => $departments, |
| 688 | "docsCount" => Department::withCount('folder')->get(), |
| 689 | "totalDocs" => Folder::all()->count(), |
| 690 | "diskTotal" => $diskTotal, |
| 691 | "diskTotalSize" => $diskTotalSize, |
| 692 | "diskUse" => $diskUse, |
| 693 | "diskUsedSize" => $diskUsedSize, |
| 694 | "deptName" => $deptName, |
| 695 | "deptCode" => $deptCode, |
| 696 | "fileTypes" => '.' . implode(',.', explode(',', FileType::find('1')->mimes)) |
| 697 | ]); |
| 698 | |
| 699 | } |
| 700 | }}} |
| 701 | ''Метод од контролерот FoldersController за приказ на фолдери''\\ |
| 702 | За разлика од другите index методи тука дополнително правам сортирање по query параметри и ги подредувам фолдерите според селекцијата која ја прави во интерфејсот. Сите податоци се прикажуваат и полнат на истата страница и со таа цел пред да ја враќам колекцијата и да ја прикажам на фронтенд ги правам сите можни проверки за сортирање. Исто така, освен сортирање на главната страница со сите фолдери правам и сортирање на фолдери од еден оддел кога пристапува корисникот до избран оддел преку навигацискиот панел. Исто така правам калкукација на тоа колку простор е зафатен во дискот на сервер преку функцијата disk_total_space која ја враќа вкупната зафатеност на дискот или одредена партиција каде што работи апликацијата. Преку фунцијата paginate() која како параметар прима број на објекти по страница Laravel креира страници кои што исто така преку query параметри прават филтрирање и ги листаат објектите по даден број во различни страници. \\ |
| 703 | |
| 704 | |
| 705 | {{{ |
| 706 | public function create() |
| 707 | { |
| 708 | return view("dashboard.folders.create")->with([ |
| 709 | "departments" => Department::all() |
| 710 | ]); |
| 711 | } |
| 712 | |
| 713 | public function store(FolderRequest $request) |
| 714 | { |
| 715 | $folder = new Folder(); |
| 716 | |
| 717 | $existingFolder = Folder::where(['department_id' => $request->department, 'name' => $request->name, 'arch_id' => $request->arch_id])->count(); |
| 718 | |
| 719 | $existingFolderName = Folder::where(['department_id' => $request->department, 'name' => $request->name])->get(); |
| 720 | $existingFolderArchId = Folder::where(['department_id' => $request->department, 'arch_id' => $request->arch_id])->get(); |
| 721 | |
| 722 | if($existingFolder > 0) { |
| 723 | $folder->version = $existingFolder + 1; |
| 724 | } |
| 725 | |
| 726 | //dd($existingFolderName, $existingFolderArchId); |
| 727 | |
| 728 | if(($existingFolderName->isNotEmpty() && $existingFolderArchId->isEmpty()) || ($existingFolderName->isEmpty() && $existingFolderArchId->isNotEmpty())) { |
| 729 | Alert::flash("Can't create another version since folder name or archive ID is different", "error"); |
| 730 | |
| 731 | return redirect()->route("dashboard.folders.index"); |
| 732 | } |
| 733 | |
| 734 | $department = Department::find($request->department); |
| 735 | |
| 736 | $user = auth()->user(); |
| 737 | |
| 738 | $folder->user()->associate($user); |
| 739 | $folder->department()->associate($department); |
| 740 | $folder->department()->increment('no_of_folders'); |
| 741 | |
| 742 | $folder->arch_id = $request->arch_id; |
| 743 | $folder->name = $request->name; |
| 744 | $folder->note = $request->note; |
| 745 | |
| 746 | $location = $folder->department->location . DIRECTORY_SEPARATOR . $request->name; |
| 747 | |
| 748 | if (!Storage::disk('local')->has($location)) { |
| 749 | Storage::disk('local')->makeDirectory($location); |
| 750 | } |
| 751 | |
| 752 | $users = User::all(); |
| 753 | |
| 754 | $folder->location = $location; |
| 755 | |
| 756 | $folder->save(); |
| 757 | |
| 758 | if ($request->has('file_item')) { |
| 759 | foreach ($request->file_item as $file) { |
| 760 | $fileName = $folder->name . '-' . uniqid() . '.' . $file->getClientOriginalExtension(); |
| 761 | $file->storeAs($location . DIRECTORY_SEPARATOR, $fileName); |
| 762 | $newFile = new File(); |
| 763 | $newFile->name = $fileName; |
| 764 | $newFile->location = $location . DIRECTORY_SEPARATOR . $fileName; |
| 765 | $newFile->folder()->associate($folder); |
| 766 | $newFile->folder()->increment('no_of_files'); |
| 767 | $newFile->save(); |
| 768 | } |
| 769 | } |
| 770 | |
| 771 | Alert::flash("New folder created successfully"); |
| 772 | |
| 773 | return redirect()->route("dashboard.folders.index"); |
| 774 | } |
| 775 | }}} |
| 776 | ''Потребни методи за креирање на нов фолдер'' |
| 777 | Начинот на креирање на фолдер е идентичен со тој на оддел. За разлика од првиот тука при креирање на избор потребно е фолдерот да има асоциран оддел како и архивски број според избраниот оддел кој што автоматски ќе му биде препопулиран по избор. Исто така дополнително има можност за прикачување на датотеки кои ќе бидат асоцирани со ново креираниот фолдер. Во кодот може да се забележи дека се проверува дали постои фолдер во база со исто име или архивски број. Доколку постои само едното се враќа порака за грешка и доколку се исти двете полиња се креира нова верзија за веќе постоечкиот фолдер. За секој нов фолдер се креира папка на сервер според локацијата на одделот и во неја ги зачувувам сите додадени датотеки. Архивскиот број се состои од: "код од одделот" + "/" + "внесува корисникот". Истата логика се валидира во класата FolderRequest на следниот начин: |
| 778 | |
| 779 | |
| 780 | {{{ |
| 781 | public function rules() |
| 782 | { |
| 783 | $rules = [ |
| 784 | "arch_id" => [ |
| 785 | "required", |
| 786 | function ($attribute, $value, $fail) { |
| 787 | |
| 788 | try { |
| 789 | $arch_id = $this->request->get('arch_id'); |
| 790 | |
| 791 | $deptCode = explode('/', $arch_id)[0]; |
| 792 | $archNum = explode('/', $arch_id)[1]; |
| 793 | |
| 794 | if (empty($archNum)) { |
| 795 | $fail("Please enter folders Archive ID"); |
| 796 | } |
| 797 | |
| 798 | if ($deptCode != Department::find($this->request->get('department'))->code) { |
| 799 | $fail("Folder Archive ID field format is invalid"); |
| 800 | } |
| 801 | } |
| 802 | catch (\Exception $e) { |
| 803 | $fail("Please enter folders Archive ID"); |
| 804 | } |
| 805 | } |
| 806 | ], |
| 807 | "name" => "required|min:2|max:30", |
| 808 | "department" => "required|integer|exists:departments,id", |
| 809 | ]; |
| 810 | |
| 811 | $mimes = FileType::find("1")->mimes; |
| 812 | $maxSize = FileType::find("1")->max_size; |
| 813 | |
| 814 | if ($this->isMethod("patch")) { |
| 815 | $fileRules = [ |
| 816 | "file_item.*" => "mimes:{$mimes}|max:{$maxSize}" |
| 817 | ]; |
| 818 | } |
| 819 | |
| 820 | else { |
| 821 | $fileRules = [ |
| 822 | "file_item.*" => "mimes:{$mimes}|max:{$maxSize}" |
| 823 | ]; |
| 824 | } |
| 825 | |
| 826 | $rules = array_merge( |
| 827 | $rules, |
| 828 | $fileRules, |
| 829 | ); |
| 830 | |
| 831 | return $rules; |
| 832 | } |
| 833 | }}} |
| 834 | ''Валидација на полињата за креирање на нов фолдер''\\ |
| 835 | Тука може да е забележи дека се прави валидација на архивскиот број со цел да се провери дали е тој правилно внесен т.е. дали се состои од кодот на одделот како и внесениот број од страна на корисникот и доколку не е се фрла исклучок. Валидација на низата од датотеки се прави според внесените валидациски правила од страна на администраторот.\\ |
| 836 | |
| 837 | |
| 838 | |
| 839 | |
| 840 | |
| 841 | |
| 842 | |
| 843 | |
| 844 | |
| 845 | |