From bffbdd5cd4c8971908b0a63846c7ee6cf9d2a0c5 Mon Sep 17 00:00:00 2001 From: KarapetyanSergo Date: Mon, 10 Jun 2024 12:17:58 +0400 Subject: [PATCH 1/9] Allow multiple lines to be added to the import example file. --- .../actions/src/Concerns/CanImportRecords.php | 32 +++++++++++++++---- packages/actions/src/Imports/ImportColumn.php | 14 ++++++++ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/packages/actions/src/Concerns/CanImportRecords.php b/packages/actions/src/Concerns/CanImportRecords.php index fcd050bae7..38746e0e6c 100644 --- a/packages/actions/src/Concerns/CanImportRecords.php +++ b/packages/actions/src/Concerns/CanImportRecords.php @@ -334,18 +334,36 @@ protected function setUp(): void $columns, )); - $example = array_map( - fn (ImportColumn $column) => $column->getExample(), + /* + Сount the number of lines in the file. + It should be equal to the largest number of examples in the columns. + */ + $rowsCount = 0; + array_map( + function (ImportColumn $column) use (&$rowsCount) { + $rowsCount = count($column->getExamples()) > $rowsCount ? count($column->getExamples()) : $rowsCount; + }, $columns, ); - if (array_filter( - $example, - fn ($value): bool => filled($value), - )) { - $csv->insertOne($example); + /* + Get an array of “examples” in which the number of elements + is equal to the number of lines in the file. + */ + $examples = []; + foreach ($columns as $column) { + $columnExamples = $column->getExamples(); + + for($i = 0; $i < $rowsCount; $i++) { + $examples[$i][] = $columnExamples[$i] ?? ''; + } } + /* + Filling out the file + */ + $csv->insertAll($examples); + return response()->streamDownload(function () use ($csv) { echo $csv->toString(); }, __('filament-actions::import.example_csv.file_name', ['importer' => (string) str($this->getImporter())->classBasename()->kebab()]), [ diff --git a/packages/actions/src/Imports/ImportColumn.php b/packages/actions/src/Imports/ImportColumn.php index d7e1f68e49..78f5c56990 100644 --- a/packages/actions/src/Imports/ImportColumn.php +++ b/packages/actions/src/Imports/ImportColumn.php @@ -53,6 +53,8 @@ class ImportColumn extends Component protected mixed $example = null; + protected array $examples = []; + protected string | Closure | null $exampleHeader = null; protected string | Closure | null $relationship = null; @@ -116,6 +118,13 @@ public function example(mixed $example): static return $this; } + public function examples(array $examples): static + { + $this->examples = $examples; + + return $this; + } + public function exampleHeader(string | Closure | null $header): static { $this->exampleHeader = $header; @@ -437,6 +446,11 @@ public function getExample(): mixed return $this->evaluate($this->example); } + public function getExamples(): array + { + return array_merge([$this->evaluate($this->example)], $this->examples); + } + /** * @param string | array | Closure | null $resolveUsing */ From d5a29929c38fc5f3aae5909b76bc50a23730e7ac Mon Sep 17 00:00:00 2001 From: KarapetyanSergo Date: Mon, 10 Jun 2024 12:37:54 +0400 Subject: [PATCH 2/9] fix phpstan --- packages/actions/src/Imports/ImportColumn.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/actions/src/Imports/ImportColumn.php b/packages/actions/src/Imports/ImportColumn.php index 78f5c56990..0613e6241e 100644 --- a/packages/actions/src/Imports/ImportColumn.php +++ b/packages/actions/src/Imports/ImportColumn.php @@ -53,6 +53,9 @@ class ImportColumn extends Component protected mixed $example = null; + /** + * @var array + */ protected array $examples = []; protected string | Closure | null $exampleHeader = null; @@ -118,6 +121,9 @@ public function example(mixed $example): static return $this; } + /** + * @param array $rules + */ public function examples(array $examples): static { $this->examples = $examples; @@ -446,6 +452,9 @@ public function getExample(): mixed return $this->evaluate($this->example); } + /** + * @return array + */ public function getExamples(): array { return array_merge([$this->evaluate($this->example)], $this->examples); From 4c1c90d21c3e7c0ecb8ea4dfbf38f7b96b14a25c Mon Sep 17 00:00:00 2001 From: KarapetyanSergo Date: Mon, 10 Jun 2024 12:42:01 +0400 Subject: [PATCH 3/9] fix phpstan --- packages/actions/src/Imports/ImportColumn.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/actions/src/Imports/ImportColumn.php b/packages/actions/src/Imports/ImportColumn.php index 0613e6241e..08a4cb744a 100644 --- a/packages/actions/src/Imports/ImportColumn.php +++ b/packages/actions/src/Imports/ImportColumn.php @@ -122,7 +122,7 @@ public function example(mixed $example): static } /** - * @param array $rules + * @param array $examples */ public function examples(array $examples): static { From dd79c7c35a45e3efe8156e6641d6740ffdd23041 Mon Sep 17 00:00:00 2001 From: KarapetyanSergo Date: Thu, 13 Jun 2024 17:25:13 +0400 Subject: [PATCH 4/9] Improve code for 'Allow multiple lines to be added to the import example file' --- .../actions/src/Concerns/CanImportRecords.php | 20 +++------------ packages/actions/src/Imports/ImportColumn.php | 25 +++++++++++-------- 2 files changed, 18 insertions(+), 27 deletions(-) diff --git a/packages/actions/src/Concerns/CanImportRecords.php b/packages/actions/src/Concerns/CanImportRecords.php index 38746e0e6c..690096b204 100644 --- a/packages/actions/src/Concerns/CanImportRecords.php +++ b/packages/actions/src/Concerns/CanImportRecords.php @@ -334,22 +334,13 @@ protected function setUp(): void $columns, )); - /* - Сount the number of lines in the file. - It should be equal to the largest number of examples in the columns. - */ - $rowsCount = 0; - array_map( - function (ImportColumn $column) use (&$rowsCount) { - $rowsCount = count($column->getExamples()) > $rowsCount ? count($column->getExamples()) : $rowsCount; - }, + $rowsCount = array_reduce( $columns, + function ($maxCount, ImportColumn $column) { + return max($maxCount, count($column->getExamples())); + } ); - /* - Get an array of “examples” in which the number of elements - is equal to the number of lines in the file. - */ $examples = []; foreach ($columns as $column) { $columnExamples = $column->getExamples(); @@ -359,9 +350,6 @@ function (ImportColumn $column) use (&$rowsCount) { } } - /* - Filling out the file - */ $csv->insertAll($examples); return response()->streamDownload(function () use ($csv) { diff --git a/packages/actions/src/Imports/ImportColumn.php b/packages/actions/src/Imports/ImportColumn.php index 08a4cb744a..4ab5ce1bd6 100644 --- a/packages/actions/src/Imports/ImportColumn.php +++ b/packages/actions/src/Imports/ImportColumn.php @@ -51,12 +51,10 @@ class ImportColumn extends Component protected ?Importer $importer = null; - protected mixed $example = null; - /** - * @var array + * @var array | Closure */ - protected array $examples = []; + protected array | Closure $examples = []; protected string | Closure | null $exampleHeader = null; @@ -116,16 +114,18 @@ public function label(string | Closure | null $label): static public function example(mixed $example): static { - $this->example = $example; - - return $this; + $this->examples($example); } /** - * @param array $examples + * @param mixed $examples */ - public function examples(array $examples): static + public function examples(mixed $examples): static { + if (!is_array($examples) && !$examples instanceof Closure) { + $examples = Arr::wrap($examples); + } + $this->examples = $examples; return $this; @@ -447,9 +447,12 @@ public function getImporter(): ?Importer return $this->importer; } + /** + * @deprecated Use `getExamples()` instead. + */ public function getExample(): mixed { - return $this->evaluate($this->example); + return Arr::first($this->getExamples()); } /** @@ -457,7 +460,7 @@ public function getExample(): mixed */ public function getExamples(): array { - return array_merge([$this->evaluate($this->example)], $this->examples); + return Arr::wrap($this->evaluate($this->examples)); } /** From bbfdb5f42537b0339b1bfcd850ebce3cc51cd331 Mon Sep 17 00:00:00 2001 From: KarapetyanSergo Date: Thu, 13 Jun 2024 17:27:35 +0400 Subject: [PATCH 5/9] fix array_reduce default value --- packages/actions/src/Concerns/CanImportRecords.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/actions/src/Concerns/CanImportRecords.php b/packages/actions/src/Concerns/CanImportRecords.php index 690096b204..eb9c24f5ce 100644 --- a/packages/actions/src/Concerns/CanImportRecords.php +++ b/packages/actions/src/Concerns/CanImportRecords.php @@ -338,7 +338,8 @@ protected function setUp(): void $columns, function ($maxCount, ImportColumn $column) { return max($maxCount, count($column->getExamples())); - } + }, + 0 ); $examples = []; From 078d52b410b65297b87715399a3069b5fc5d5086 Mon Sep 17 00:00:00 2001 From: KarapetyanSergo Date: Thu, 13 Jun 2024 17:37:24 +0400 Subject: [PATCH 6/9] fix phpstan --- packages/actions/src/Concerns/CanImportRecords.php | 2 +- packages/actions/src/Imports/ImportColumn.php | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/actions/src/Concerns/CanImportRecords.php b/packages/actions/src/Concerns/CanImportRecords.php index eb9c24f5ce..415bada5de 100644 --- a/packages/actions/src/Concerns/CanImportRecords.php +++ b/packages/actions/src/Concerns/CanImportRecords.php @@ -336,7 +336,7 @@ protected function setUp(): void $rowsCount = array_reduce( $columns, - function ($maxCount, ImportColumn $column) { + function (?int $maxCount, ImportColumn $column) { return max($maxCount, count($column->getExamples())); }, 0 diff --git a/packages/actions/src/Imports/ImportColumn.php b/packages/actions/src/Imports/ImportColumn.php index 4ab5ce1bd6..844fd8926f 100644 --- a/packages/actions/src/Imports/ImportColumn.php +++ b/packages/actions/src/Imports/ImportColumn.php @@ -115,6 +115,8 @@ public function label(string | Closure | null $label): static public function example(mixed $example): static { $this->examples($example); + + return $this; } /** From 625ddc6504766ee4118ed4595d59e535d4fc9e09 Mon Sep 17 00:00:00 2001 From: KarapetyanSergo Date: Thu, 13 Jun 2024 18:02:32 +0400 Subject: [PATCH 7/9] add examples method to documentation --- packages/actions/docs/07-prebuilt-actions/08-import.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/actions/docs/07-prebuilt-actions/08-import.md b/packages/actions/docs/07-prebuilt-actions/08-import.md index e32ba3601d..590de3bde7 100644 --- a/packages/actions/docs/07-prebuilt-actions/08-import.md +++ b/packages/actions/docs/07-prebuilt-actions/08-import.md @@ -494,6 +494,15 @@ ImportColumn::make('sku') ->example('ABC123') ``` +Or you can add multiple example rows to the CSV using the `examples()` method: + +```php +use Filament\Actions\Imports\ImportColumn; + +ImportColumn::make('sku') + ->examples(['ABC123', 'DEF456']) +``` + By default, the name of the column is used in the header of the example CSV. You can customize the header per-column using `exampleHeader()`: ```php From 6a8ed611c3fc366306377dea9594326182c2aeec Mon Sep 17 00:00:00 2001 From: KarapetyanSergo Date: Thu, 13 Jun 2024 18:19:43 +0400 Subject: [PATCH 8/9] change documentation for examples method --- packages/actions/docs/07-prebuilt-actions/08-import.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/actions/docs/07-prebuilt-actions/08-import.md b/packages/actions/docs/07-prebuilt-actions/08-import.md index 590de3bde7..ab917f64e3 100644 --- a/packages/actions/docs/07-prebuilt-actions/08-import.md +++ b/packages/actions/docs/07-prebuilt-actions/08-import.md @@ -494,7 +494,7 @@ ImportColumn::make('sku') ->example('ABC123') ``` -Or you can add multiple example rows to the CSV using the `examples()` method: +Or if you want to add more than one example row, you can pass array to `examples()` method: ```php use Filament\Actions\Imports\ImportColumn; From 582a2fc0a42b7793022d7b4aa3166753a225f1b8 Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Fri, 14 Jun 2024 11:19:08 +0100 Subject: [PATCH 9/9] refactor --- .../docs/07-prebuilt-actions/08-import.md | 2 +- .../actions/src/Concerns/CanImportRecords.php | 24 ++++++++++--------- packages/actions/src/Imports/ImportColumn.php | 8 +++---- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/packages/actions/docs/07-prebuilt-actions/08-import.md b/packages/actions/docs/07-prebuilt-actions/08-import.md index ab917f64e3..287d9f9e6d 100644 --- a/packages/actions/docs/07-prebuilt-actions/08-import.md +++ b/packages/actions/docs/07-prebuilt-actions/08-import.md @@ -494,7 +494,7 @@ ImportColumn::make('sku') ->example('ABC123') ``` -Or if you want to add more than one example row, you can pass array to `examples()` method: +Or if you want to add more than one example row, you can pass an array to the `examples()` method: ```php use Filament\Actions\Imports\ImportColumn; diff --git a/packages/actions/src/Concerns/CanImportRecords.php b/packages/actions/src/Concerns/CanImportRecords.php index 415bada5de..06d755ee33 100644 --- a/packages/actions/src/Concerns/CanImportRecords.php +++ b/packages/actions/src/Concerns/CanImportRecords.php @@ -334,24 +334,26 @@ protected function setUp(): void $columns, )); - $rowsCount = array_reduce( + $columnExamples = array_map( + fn (ImportColumn $column): array => $column->getExamples(), $columns, - function (?int $maxCount, ImportColumn $column) { - return max($maxCount, count($column->getExamples())); - }, - 0 ); - $examples = []; - foreach ($columns as $column) { - $columnExamples = $column->getExamples(); + $exampleRowsCount = array_reduce( + $columnExamples, + fn (int $count, array $exampleData): int => max($count, count($exampleData)), + initial: 0, + ); + + $exampleRows = []; - for($i = 0; $i < $rowsCount; $i++) { - $examples[$i][] = $columnExamples[$i] ?? ''; + foreach ($columnExamples as $exampleData) { + for ($i = 0; $i < $exampleRowsCount; $i++) { + $exampleRows[$i][] = $exampleData[$i] ?? ''; } } - $csv->insertAll($examples); + $csv->insertAll($exampleRows); return response()->streamDownload(function () use ($csv) { echo $csv->toString(); diff --git a/packages/actions/src/Imports/ImportColumn.php b/packages/actions/src/Imports/ImportColumn.php index 844fd8926f..dfcb86ae6b 100644 --- a/packages/actions/src/Imports/ImportColumn.php +++ b/packages/actions/src/Imports/ImportColumn.php @@ -119,12 +119,12 @@ public function example(mixed $example): static return $this; } - /** - * @param mixed $examples - */ public function examples(mixed $examples): static { - if (!is_array($examples) && !$examples instanceof Closure) { + if ( + (! is_array($examples)) && + (! $examples instanceof Closure) + ) { $examples = Arr::wrap($examples); }