Skip to content

Commit

Permalink
Merge pull request #77 from alex552/main
Browse files Browse the repository at this point in the history
add alternative column names for automatic matching
  • Loading branch information
frankyso committed Jun 18, 2023
2 parents 605c10b + 08fcc4c commit 00c5f09
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 3 deletions.
12 changes: 9 additions & 3 deletions src/Actions/ImportAction.php
Original file line number Diff line number Diff line change
Expand Up @@ -159,19 +159,25 @@ private function getFields(ImportField|Field $field): Field
$options = $this->cachedHeadingOptions;

if (count($options) == 0) {
$options = $this->toCollection($filePath)->first()?->first()->filter(fn ($value) => $value != null)->toArray();
$options = $this->toCollection($filePath)->first()?->first()->filter(fn ($value) => $value != null)->map('trim')->toArray();
}

$selected = array_search($field->getName(), $options);
if ($selected != false) {

if ($selected !== false) {
$set($field->getName(), $selected);
} elseif (! empty($field->getAlternativeColumnNames())) {
$alternativeNames = array_intersect($field->getAlternativeColumnNames(), $options);
if (count($alternativeNames) > 0) {
$set($field->getName(), array_search(current($alternativeNames), $options));
}
}

return $options;
});
}

public function handleRecordCreation(Closure $closure)
public function handleRecordCreation(Closure $closure): static
{
$this->handleRecordCreation = $closure;
$this->massCreate(false);
Expand Down
2 changes: 2 additions & 0 deletions src/Actions/ImportField.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Konnco\FilamentImport\Actions;

use Konnco\FilamentImport\Concerns\HasColumnMatching;
use Konnco\FilamentImport\Concerns\HasFieldHelper;
use Konnco\FilamentImport\Concerns\HasFieldLabel;
use Konnco\FilamentImport\Concerns\HasFieldMutation;
Expand All @@ -17,6 +18,7 @@ class ImportField
use HasFieldLabel;
use HasFieldRequire;
use HasFieldValidation;
use HasColumnMatching;

public function __construct(private string $name)
{
Expand Down
20 changes: 20 additions & 0 deletions src/Concerns/HasColumnMatching.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace Konnco\FilamentImport\Concerns;

trait HasColumnMatching
{
protected ?array $alternativeColumnNames = [];

public function alternativeColumnNames(array $alternativeColumnNames): static
{
$this->alternativeColumnNames = $alternativeColumnNames;

return $this;
}

public function getAlternativeColumnNames(): array
{
return $this->alternativeColumnNames;
}
}
17 changes: 17 additions & 0 deletions tests/Features/ImportTest.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?php

use Konnco\FilamentImport\Tests\Resources\Models\Post;
use Konnco\FilamentImport\Tests\Resources\Pages\AlternativeColumnsNamesList;
use Konnco\FilamentImport\Tests\Resources\Pages\HandleCreationList;
use Konnco\FilamentImport\Tests\Resources\Pages\NonRequiredTestList;
use Konnco\FilamentImport\Tests\Resources\Pages\ValidateTestList;
Expand Down Expand Up @@ -120,6 +121,22 @@
assertDatabaseCount(Post::class, 10);
});

it('can match alternative column names', function () {
$file = csvFiles(10);
livewire(AlternativeColumnsNamesList::class)->mountPageAction('import')
->setPageActionData([
'file' => [$file->store('file')],
'fileRealPath' => $file->getRealPath(),
'skipHeader' => false,
])
->assertPageActionDataSet(['title' => 0, 'slug' => 1, 'body' => 2])
->callMountedPageAction()
->assertHasNoPageActionErrors()
->assertSuccessful();

assertDatabaseCount(Post::class, 11);
});

//it('can manipulate single field', function () {
// expect(true)->toBeTrue();
//});
Expand Down
29 changes: 29 additions & 0 deletions tests/Resources/Pages/AlternativeColumnsNamesList.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace Konnco\FilamentImport\Tests\Resources\Pages;

use Filament\Resources\Pages\ListRecords;
use Konnco\FilamentImport\Actions\ImportAction;
use Konnco\FilamentImport\Actions\ImportField;
use Konnco\FilamentImport\Tests\Resources\Models\Post;
use Konnco\FilamentImport\Tests\Resources\PostResource;

class AlternativeColumnsNamesList extends ListRecords
{
protected static string $resource = PostResource::class;

protected function getActions(): array
{
return [
ImportAction::make('import')
->fields([
ImportField::make('title')->alternativeColumnNames(['Title']),
ImportField::make('slug')->alternativeColumnNames(['Slug']),
ImportField::make('body')->alternativeColumnNames(['Body']),
])
->handleRecordCreation(function ($data) {
return Post::create($data);
}),
];
}
}

0 comments on commit 00c5f09

Please sign in to comment.