. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Tree; use Illuminate\Support\Collection; use League\Flysystem\Filesystem; use League\Flysystem\FilesystemException; use League\Flysystem\StorageAttributes; use Psr\Http\Message\ServerRequestInterface; use function assert; /** * Autocomplete handler for media folders */ class AutoCompleteFolder extends AbstractAutocompleteHandler { /** * @param ServerRequestInterface $request * * @return Collection */ protected function search(ServerRequestInterface $request): Collection { $tree = $request->getAttribute('tree'); assert($tree instanceof Tree); $query = $request->getAttribute('query'); $media_filesystem = Registry::filesystem()->media($tree); try { $folders = $media_filesystem->listContents('', Filesystem::LIST_DEEP) ->filter(fn (StorageAttributes $attributes): bool => $attributes->isDir()) ->filter(fn (StorageAttributes $attributes): bool => str_contains($attributes->path(), $query)) ->filter(fn (StorageAttributes $attributes): bool => !in_array('thumbs', explode('/', $attributes->path()), true)) ->filter(fn (StorageAttributes $attributes): bool => !in_array('watermarks', explode('/', $attributes->path()), true)) ->map(fn (StorageAttributes $attributes): string => $attributes->path()); return new Collection($folders); $contents = new Collection($media_filesystem->listContents('', Filesystem::LIST_DEEP)); return $contents ->filter(static function (array $object) use ($query): bool { return $object['type'] === 'dir' && str_contains($object['path'], $query); }) ->values() ->pluck('path') ->take(static::LIMIT); } catch (FilesystemException $ex) { return new Collection(); } } }