Skip to content
This repository has been archived by the owner on Jan 16, 2024. It is now read-only.

Commit

Permalink
feat: searchbar (#8)
Browse files Browse the repository at this point in the history
  • Loading branch information
AlxisHenry committed Dec 20, 2022
1 parent 978486e commit e05c355
Show file tree
Hide file tree
Showing 2 changed files with 144 additions and 19 deletions.
19 changes: 18 additions & 1 deletion public/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,25 @@
<p class="masthead-subheading font-weight-light mb-0"><?= dashboard()->owner->description ?></p>
</div>
</header>
<section class='page-section' id="search">
<div class="container">
<h2 class='page-section-heading text-center text-uppercase'>Search</h2>
<div class='divider-custom'>
<div class='divider-custom-line'></div>
<div class='divider-custom-icon'><i class='fas fa-star'></i></div>
<div class='divider-custom-line'></div>
</div>
<div class="container d-flex justify-content-center mb-5">
<form class="form-inline my-2 my-lg-0 d-flex gap-1" style="width: 70%;" method="GET" action="#search">
<input class="form-control mr-sm-2" type="search" name="search" placeholder="Search filename" aria-label="Search" value="<?= $_GET['search'] ?? "" ?>">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
<?= searchResults() ?>
</div>
</section>
<?php
$background = false;
$background = true;
foreach (getCategories() as $category) {
echo generateCategorySection($category, $background);
$background = !$background;
Expand Down
144 changes: 126 additions & 18 deletions services/dashboard.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,61 +12,146 @@
*/
function getCategories(): array
{
/**
* @var array $categories
* @var array $directories
* @var array $exclude
*/
$categories = [];
$directories = scandir('./shared');
$exclude = ['.', '..', 'build', 'index.php'];
foreach ($directories as $directory) {
if (!in_array($directory, $exclude)) {
$categories[] = $directory;
}
if (!in_array($directory, $exclude)) $categories[] = $directory;
}
return $categories;
}

/**
* @param string $search
* @return array
*/
function getItemsCorrespondingToSearch(string $search): array
{
/**
* @var array $items
*/
$items = [];
/**
* Make an array containing all the items corresponding to the search input in the shared folder
* An item have the following structure:
* [
* 'category' => 'category',
* 'filename' => 'filename'
* ]
*/
foreach (getCategories() as $category) {
foreach (getCategoryItems($category) as $item) {
if (strpos($item, $search) !== false) {
$items[] = [
'category' => $category,
'filename' => $item
];
}
}
}
return $items;
}

/**
* @param string $category
* @return array
*/
function getContent(string $category): array
function getCategoryItems(string $category): array
{
/**
* @var array $files
* @var array $categoryItems
* @var array $exclude
*/
$files = [];
$categoryContent = scandir("./shared/$category/");
$categoryItems = scandir("./shared/$category/");
$exclude = ['.', '..', '.gitignore', 'index.php'];
foreach ($categoryContent as $content) {
if (!in_array($content, $exclude)) {
$files[] = $content;
}
foreach ($categoryItems as $item) {
if (!in_array($item, $exclude)) $files[] = $item;
}
return $files;
}

/**
* @param string $category
* @param string $domain
* @param array $items
* @param ?string $category
* @return string
*/
function generateCategoryContentList(string $category): string
function generateItems(array $items, ?string $category = null): string
{
$content = getContent($category);
/**
* @var string $list
* @var string $domain
*/
$list = "";
$domain = (($_SERVER['HTTPS'] ?? false) ? "https://" : "http://") . $_SERVER['HTTP_HOST'];
foreach ($content as $item) {
$url = $domain . "/shared/$category/$item";
$downloadUrl = $domain . "/shared/$category/?file=$item";
if (!$category) {
$category = $items[0]['category'];
}
foreach ($items as $item) {
if (!is_array($item)) {
$item = [
'category' => $category,
'filename' => $item
];
}
$category = $item['category'];
$filename = $item['filename'];
/**
* @var string $url
* @var string $downloadUrl
*/
$url = $domain . "/shared/$category/$filename";
$downloadUrl = $domain . "/shared/$category/?file=$filename";
$list .= "<li class='list-group-item d-flex flex-column'>
<p>
<a class='' target='_blank' href='/shared/$category/$item'>$item</a>
<a class='' target='_blank' href='/shared/$category/$filename'>$filename</a>
</p>
<p class='d-flex flex-column text-decoration-none'>
<a class='ml-auto p-1 text-decoration-none' target='_blank' href='$url'><i class='fa-solid fa-link'></i> <span>$url</span></a>
<a class='ml-auto p-1 text-decoration-none' href='$downloadUrl'><i class='fas fa-download'></i> <span>$downloadUrl</span></a>
</p>
</li>";
}
return $list;
}

/**
* @param string $category
* @param string $domain
* @return string
*/
function generateCategoryItemsList(string $category): string
{
/**
* @var array $items
* @var string $list
*/
$items = getCategoryItems($category);
$list = generateItems($items, $category);
if (empty($list)) $list = "<li class='list-group-item'>No content available</li>";
return "<ul class='list-group'>$list</ul>";
}

/**
* @param string $search
* @return bool|string
*/
function generateSearchContentList(string $search): bool|string
{
/**
* @var array $correspondingItems
*/
$correspondingItems = getItemsCorrespondingToSearch($search);
if (count($correspondingItems) <= 0 || !$correspondingItems) return false;
return generateItems($correspondingItems);
}

/**
* @param string $category
* @param bool $background
Expand All @@ -91,16 +176,39 @@ function generateCategorySection(string $category, bool $background): string
<div class='divider-custom-icon'><i class='fas fa-star'></i></div>
<div class='divider-custom-line'></div>
</div>
".generateCategoryContentList($category)."
".generateCategoryItemsList($category)."
</div>
</section>";
}

/**
* @return string
*/
function searchResults(): string
{
/**
* @var string $search
* @var string $results
*/
$search = $_GET['search'] ?? null;
if (!isset($search) || $search === "") {
$results = "<li class='list-group-item'>No search term provided</li>";
} else {
$results = generateSearchContentList($search);
if (!$results) $results = "<li class='list-group-item'>No result found</li>";
}
return "<ul class='list-group'>$results</ul>";
}

/**
* @return Dashboard
*/
function dashboard(): Dashboard
{
/**
* @var array $settings
* @var Dashboard $dashboard
*/
$settings = Yaml::parseFile(__DIR__ . '/../settings.yml');
$dashboard = new Dashboard($settings['dashboard']);
return $dashboard;
Expand Down

0 comments on commit e05c355

Please sign in to comment.