diff --git a/config/vuefilemanager.php b/config/vuefilemanager.php index 6dfff8d1..099cce35 100644 --- a/config/vuefilemanager.php +++ b/config/vuefilemanager.php @@ -62,6 +62,6 @@ return [ ], 'paginate' => [ - 'perPage' => 50 + 'perPage' => 15 ] ]; diff --git a/src/Domain/Browsing/Controllers/BrowseFolderController.php b/src/Domain/Browsing/Controllers/BrowseFolderController.php index 0d42c906..774bbbac 100644 --- a/src/Domain/Browsing/Controllers/BrowseFolderController.php +++ b/src/Domain/Browsing/Controllers/BrowseFolderController.php @@ -2,7 +2,6 @@ namespace Domain\Browsing\Controllers; use Str; -use Illuminate\Http\Request; use Domain\Files\Models\File; use Domain\Folders\Models\Folder; use Illuminate\Support\Facades\Auth; @@ -11,25 +10,40 @@ use Domain\Folders\Resources\FolderResource; class BrowseFolderController { public function __invoke( - Request $request, string $id, ): array { $root_id = Str::isUuid($id) ? $id : null; + $folderQuery = [ + 'parent_id' => $root_id, + 'team_folder' => false, + 'user_id' => Auth::id(), + 'deleted_at' => null + ]; + + $fileQuery = [ + 'parent_id' => $root_id, + 'user_id' => Auth::id(), + 'deleted_at' => null + ]; + + list($foldersTake, $foldersSkip, $filesTake, $filesSkip, $totalItemsCount) = getRecordsCount($folderQuery, $fileQuery); + $folders = Folder::with(['parent:id,name', 'shared:token,id,item_id,permission,is_protected,expire_in']) - ->where('parent_id', $root_id) - ->where('team_folder', false) - ->where('user_id', Auth::id()) + ->where($folderQuery) ->sortable() + ->skip($foldersSkip) + ->take($foldersTake) ->get(); - + $files = File::with(['parent:id,name', 'shared:token,id,item_id,permission,is_protected,expire_in']) - ->where('parent_id', $root_id) - ->where('user_id', Auth::id()) + ->where($fileQuery) ->sortable() + ->skip($filesSkip) + ->take($filesTake) ->get(); - - list($data, $paginate, $links) = groupPaginate($request, $folders, $files); + + list($data, $paginate, $links) = groupPaginate($folders, $files, $totalItemsCount); return [ 'data' => $data, diff --git a/src/Support/helpers.php b/src/Support/helpers.php index 23152911..d263a980 100644 --- a/src/Support/helpers.php +++ b/src/Support/helpers.php @@ -5,12 +5,12 @@ use ByteUnits\Metric; use App\Users\Models\User; use Illuminate\Support\Arr; use Illuminate\Support\Str; -use Illuminate\Http\Request; use Domain\Files\Models\File; use Domain\Sharing\Models\Share; use Domain\Folders\Models\Folder; use Illuminate\Support\Collection; use Domain\Settings\Models\Setting; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Http; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\QueryException; @@ -1157,13 +1157,13 @@ if (! function_exists('replace_occurrence')) { * Group paginate of Foldes and Files */ function groupPaginate( - Request $request, ?Collection $folders = null, - ?Collection $files = null + ?Collection $files = null, + int $totalItemsCount ) : array { $perPage = config('vuefilemanager.paginate.perPage'); - $currentPage = $request->get('page') === 'all' ? 1 : (int)$request->get('page'); + $currentPage = request()->input('page') === 'all' ? 1 : (int)request()->input('page'); // Collect Folders with Files $entries = collect([ @@ -1171,20 +1171,11 @@ if (! function_exists('replace_occurrence')) { $files ? json_decode((new FilesCollection($files))->toJson(), true) : null, ])->collapse(); - if($request->input('page') === 'all') { - // If is page set to 'all' return all records - $groupPaginate = $entries; - } else { - // Paginate grouped Folders and Files - $groupPaginate = $entries->forPage($currentPage, $perPage)->values(); - } - - $uri = $request->fullUrl(); - - $lastPage = ceil(count($entries) / $perPage); + $uri = request()->fullUrl(); + $lastPage = ceil($totalItemsCount / $perPage); return [ - $groupPaginate, + $entries, [ 'currentPage' => $currentPage, 'from' => 1, @@ -1192,7 +1183,7 @@ if (! function_exists('replace_occurrence')) { 'path' => $uri, 'perPage' => $perPage, 'to' => $perPage, - 'total' => count($entries), + 'total' => $totalItemsCount, ], [ 'first' => $uri . '&page=' . 1, @@ -1202,6 +1193,62 @@ if (! function_exists('replace_occurrence')) { ] ]; } - } + if(! function_exists('getRecordsCount')) { + /** + * Get count of items from the Database + */ + function getRecordsCount ( + array $folderQuery, + array $fileQuery + ) : array { + + $perPage = config('vuefilemanager.paginate.perPage'); + $currentPage = request()->input('page') === 'all' ? 1 : (int)request()->input('page'); + + $foldersSkip = 0; + $foldersTake = 0; + $filesSkip = 0; + $filesTake = 0; + + $foldersCount = DB::table('folders') + ->where($folderQuery) + ->count(); + + $filesCount = DB::table('files') + ->where($fileQuery) + ->count(); + + $totalItemsCount = $foldersCount + $filesCount; + + if(request()->input('page') !== 'all') { + + // Folders pages + if($foldersCount >= $currentPage * $perPage) { + $foldersTake = $perPage; + $foldersSkip = ($currentPage - 1) * $perPage; + } + + // Mixed page + if($foldersCount < $currentPage * $perPage && ceil($currentPage) === ceil($foldersCount / $perPage) ) { + $foldersSkip = ($currentPage - 1) * $perPage; + $foldersTake = $foldersCount - $foldersSkip; + $filesTake = ($currentPage * $perPage) - $foldersCount; + $filesSkip = 0; + } + + // Files pages + if($currentPage > ceil($foldersCount / $perPage)) { + $filesTake = $perPage; + $filesSkip = ((ceil($foldersCount / $perPage) * $perPage) - $foldersCount) + ($currentPage - (ceil($foldersCount / $perPage)) -1) * $perPage; + } + } else { + $foldersTake = $foldersCount; + $filesTake = $filesCount; + } + + return [$foldersTake, $foldersSkip, $filesTake, $filesSkip, $totalItemsCount]; + } + } + } }