';
echo '
';
echo '
';
if ($subfolder_count > 0) {
echo '
';
display_folders($folder_id, $client_id, $indent + 1);
echo '
';
}
echo '';
}
}
// ---------------------------------------------
// DATA LOAD
// view=1 (thumbs) uses original files-only query
// view=0 (list) loads ALL files+documents, merges, sorts in PHP
// ---------------------------------------------
$items = [];
$num_rows = [0];
if ($view == 1) {
// Thumbnail view - only image files, similar to original behavior
$query_images = "AND (file_ext LIKE 'JPG' OR file_ext LIKE 'jpg' OR file_ext LIKE 'JPEG' OR file_ext LIKE 'jpeg' OR file_ext LIKE 'png' OR file_ext LIKE 'PNG' OR file_ext LIKE 'webp' OR file_ext LIKE 'WEBP')";
if ($get_folder_id == 0 && isset($_GET["q"])) {
$sql = mysqli_query(
$mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM files
LEFT JOIN users ON file_created_by = user_id
WHERE file_client_id = $client_id
AND file_archived_at IS NULL
AND (file_name LIKE '%$q%' OR file_ext LIKE '%$q%' OR file_description LIKE '%$q%')
$query_images
ORDER BY file_name ASC
LIMIT $record_from, $record_to"
);
} else {
$sql = mysqli_query(
$mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM files
LEFT JOIN users ON file_created_by = user_id
WHERE file_client_id = $client_id
AND file_folder_id = $folder_id
AND file_archived_at IS NULL
AND (file_name LIKE '%$q%' OR file_ext LIKE '%$q%' OR file_description LIKE '%$q%')
$query_images
ORDER BY file_name ASC
LIMIT $record_from, $record_to"
);
}
$num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
} else {
// -------- LIST VIEW: build unified items[] --------
// Folder filter
if ($get_folder_id == 0 && isset($_GET["q"])) {
$file_folder_snippet = ""; // search across all folders
$doc_folder_snippet = "";
} else {
$file_folder_snippet = "AND file_folder_id = $folder_id";
$doc_folder_snippet = "AND document_folder_id = $folder_id";
}
// Search filters
$safe_q = mysqli_real_escape_string($mysqli, $q);
$file_search_snippet = "";
if (!empty($q)) {
$file_search_snippet = "AND (file_name LIKE '%$safe_q%' OR file_ext LIKE '%$safe_q%' OR file_description LIKE '%$safe_q%')";
}
$doc_search_snippet = "";
if (!empty($q)) {
$doc_search_snippet = "AND (MATCH(document_content_raw) AGAINST ('$safe_q') OR document_name LIKE '%$safe_q%')";
}
// Files query (NO limit - we'll paginate in PHP)
$sql_files = mysqli_query(
$mysqli,
"SELECT files.*, users.user_name
FROM files
LEFT JOIN users ON file_created_by = user_id
WHERE file_client_id = $client_id
AND file_archived_at IS NULL
$file_folder_snippet
$file_search_snippet"
);
// Documents query (NO limit - paginate in PHP)
$sql_documents = mysqli_query(
$mysqli,
"SELECT documents.*, users.user_name
FROM documents
LEFT JOIN users ON document_created_by = user_id
WHERE document_client_id = $client_id
AND document_archived_at IS NULL
$doc_folder_snippet
$doc_search_snippet"
);
// Normalize FILES into $items
while ($row = mysqli_fetch_assoc($sql_files)) {
$file_id = intval($row['file_id']);
$file_name = nullable_htmlentities($row['file_name']);
$file_description = nullable_htmlentities($row['file_description']);
$file_reference_name= nullable_htmlentities($row['file_reference_name']);
$file_ext = nullable_htmlentities($row['file_ext']);
$file_size = intval($row['file_size']);
$file_mime_type = nullable_htmlentities($row['file_mime_type']);
$file_uploaded_by = nullable_htmlentities($row['user_name']);
$file_created_at = nullable_htmlentities($row['file_created_at']);
// determine icon
if ($file_ext == 'pdf') {
$file_icon = "file-pdf";
} elseif (in_array($file_ext, ['gz','tar','zip','7z','rar'])) {
$file_icon = "file-archive";
} elseif (in_array($file_ext, ['txt','md'])) {
$file_icon = "file-alt";
} elseif ($file_ext == 'msg') {
$file_icon = "envelope";
} elseif (in_array($file_ext, ['doc','docx','odt'])) {
$file_icon = "file-word";
} elseif (in_array($file_ext, ['xls','xlsx','ods'])) {
$file_icon = "file-excel";
} elseif (in_array($file_ext, ['pptx','odp'])) {
$file_icon = "file-powerpoint";
} elseif (in_array($file_ext, ['mp3','wav','ogg'])) {
$file_icon = "file-audio";
} elseif (in_array($file_ext, ['mov','mp4','av1'])) {
$file_icon = "file-video";
} elseif (in_array($file_ext, ['jpg','jpeg','png','gif','webp','bmp','tif'])) {
$file_icon = "file-image";
} else {
$file_icon = "file";
}
$items[] = [
'kind' => 'file',
'id' => $file_id,
'name' => $file_name,
'description' => $file_description,
'reference_name' => $file_reference_name,
'icon' => $file_icon,
'mime' => $file_mime_type,
'size' => $file_size,
'created_at' => $file_created_at,
'created_by' => $file_uploaded_by,
];
}
// Normalize DOCUMENTS into $items
while ($row = mysqli_fetch_assoc($sql_documents)) {
$document_id = intval($row['document_id']);
$document_name = nullable_htmlentities($row['document_name']);
$document_description = nullable_htmlentities($row['document_description']);
$document_created_by_name = nullable_htmlentities($row['user_name']);
$document_created_at = $row['document_created_at'];
$items[] = [
'kind' => 'document',
'id' => $document_id,
'name' => $document_name,
'description' => $document_description,
'mime' => 'Document',
'size' => null,
'created_at' => $document_created_at,
'created_by' => $document_created_by_name,
];
}
// Sort combined items
$sort = isset($_GET['sort']) ? $_GET['sort'] : 'name';
$order = isset($_GET['order']) ? $_GET['order'] : 'ASC';
usort($items, function($a, $b) use ($sort, $order) {
$direction = ($order === 'DESC') ? -1 : 1;
if ($sort == 'created') {
$valA = strtotime($a['created_at']);
$valB = strtotime($b['created_at']);
} elseif ($sort == 'type') {
$valA = strtolower($a['mime']);
$valB = strtolower($b['mime']);
} elseif ($sort == 'size') {
$valA = (int)($a['size'] ?? 0);
$valB = (int)($b['size'] ?? 0);
} else {
// default: name
$valA = strtolower($a['name']);
$valB = strtolower($b['name']);
}
if ($valA == $valB) {
return 0;
}
return ($valA < $valB) ? -1 * $direction : 1 * $direction;
});
// Total items (for pagination footer)
$total_items = count($items);
$num_rows = [$total_items];
// Apply pagination slice
$items = array_slice($items, $record_from, $record_to);
}
// ---------------------------------------------
// Root folder count (for "/" badge)
// ---------------------------------------------
$row_root_files = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('file_id') AS num FROM files WHERE file_folder_id = 0 AND file_client_id = $client_id AND file_archived_at IS NULL"));
$row_root_docs = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('document_id') AS num FROM documents WHERE document_folder_id = 0 AND document_client_id = $client_id AND document_archived_at IS NULL"));
$num_root_items = intval($row_root_files['num']) + intval($row_root_docs['num']);
?>
$file_id,
'name' => $file_name,
'preview' => "../uploads/clients/$client_id/$file_reference_name"
];
?>