knobik/explorer-prompt
Laravel Explorer Prompt
Laravel explorer style prompt based on laravel/prompts package. Build CLI table based explorers easily.
Installation
composer require knobik/explorer-prompt
Simple Example usage:
use function Knobik\Prompts\explorer;
$result = explorer(
items: [
[1, 'John Doe', 'john.doe@example.com'],
[2, 'Jane Doe', 'jane.doe@example.com'],
[3, 'Jan Kowalski', 'kowalski@example.com'],
],
title: 'Hello from a explorer window',
header: [
'ID',
'Name',
'Email',
],
)
->prompt();
Filtering
You can filter on your data by pressing forward slash /.
Filtering prompt can be disabled by using disableFiltering method.
You can also create your custom filtering solution by providing an invokable class or function to the setFilterHandler method. Example class:
use Knobik\Prompts\ExplorerPrompt;
class FilterHandler
{
public function __invoke(ExplorerPrompt $prompt, string $filter): array
{
if ($filter === '') {
return $prompt->items;
}
return collect($prompt->items)
->filter(function ($item) use ($prompt, $filter) {
$item = is_array($item) ? $item : [$item];
foreach (array_values($item) as $index => $column) {
if ($prompt->getColumnFilterable($index) && str_contains($column, $filter)) {
return true;
}
}
return false;
})
->toArray();
}
}
Advanced file explorer example:
use Knobik\Prompts\Key;
use function Knobik\Prompts\explorer;
function getDirectoryFiles(string $path): array
{
$files = collect(glob("{$path}/*"))
->mapWithKeys(function (string $filename) {
return [
$filename => [
'filename' => basename($filename),
'size' => filesize($filename),
'permissions' => sprintf('%o', fileperms($filename)),
]
];
});
if ($path !== '/') {
$files->prepend([
'filename' => '..',
'size' => null,
'permissions' => sprintf('%o', fileperms(dirname($path)))
], dirname($path));
}
return $files->toArray();
}
$path = '/var/www/html';
while (true) {
$newPath = explorer(
items: $this->getDirectoryFiles($path),
title: $path, //fn(ExplorerPrompt $prompt) => $prompt->highlighted,
header: [
'File name',
'Size in bytes',
'Permissions'
],
)
->setCustomKeyHandler(Key::KEY_ESCAPE, function(ExplorerPrompt $prompt, string $key) { // custom key handler
$prompt->cancel();
})
->setColumnOptions(
column: 2,
width: 20, // number of characters, null to keep it in auto mode
align: ColumnAlign::RIGHT,
filterable: false
)
->prompt();
if ($newPath === null) {
continue; // no item selected
}
$path = $newPath;
if (is_file($path)) {
$this->line(file_get_contents($path));
return self::SUCCESS;
}
}
Related Packages
doctrine/dbal
Powerful PHP database abstraction layer (DBAL) with many features for database s...
648,266,899
9,701
laravel/serializable-closure
Laravel Serializable Closure provides an easy and secure way to serialize closur...
429,221,767
607
nunomaduro/collision
Cli error handling for console/command-line PHP applications.
403,217,078
4,664
Version History
| Version | Released | PHP | Laravel | License |
|---|---|---|---|---|
| 0.4.1 | ^8.1 | ^10.0| | MIT | |
| 0.4.0 | ^8.1 | ^10.0| | MIT | |
| 0.3.10 | ^8.1 | ^10.0| | MIT | |
| 0.3.9 | ^8.1 | ^10.0| | MIT | |
| 0.3.8 | ^8.1 | ^10.0| | MIT | |
| 0.3.7 | ^8.1 | ^10.0| | MIT | |
| 0.3.6 | ^8.1 | ^10.0| | MIT | |
| 0.3.5 | ^8.1 | ^10.0| | MIT | |
| 0.3.4 | ^8.1 | ^10.0| | MIT | |
| 0.3.3 | ^8.1 | ^10.0| | MIT | |
| 0.3.2 | ^8.1 | ^10.0| | MIT | |
| 0.3.1 | ^8.1 | ^10.0| | MIT | |
| 0.3.0 | ^8.1 | ^10.0| | MIT | |
| 0.2.7 | ^8.1 | ^10.0| | MIT | |
| 0.2.6 | ^8.1 | ^10.0| | MIT | |
| 0.2.5 | ^8.1 | ^10.0| | MIT | |
| 0.2.4 | ^8.1 | ^10.0| | MIT | |
| 0.2.3 | ^8.1 | ^10.0| | MIT | |
| 0.2.2 | ^8.1 | ^10.0| | MIT | |
| 0.2.1 | ^8.1 | ^10.0| | MIT | |
| 0.2.0 | ^8.1 | ^10.0| | MIT | |
| 0.1.4 | ^8.1 | ^10.0| | MIT | |
| 0.1.3 | ^8.1 | ^10.0| | MIT | |
| 0.1.2 | ^8.1 | ^10.0| | MIT | |
| 0.1.1 | ^8.1 | ^10.0| | MIT | |
| 0.1.0 | ^8.1 | ^10.0| | MIT |