Skip to content

Commit

Permalink
Merge pull request #12799 from aSeriousDeveloper/3.x
Browse files Browse the repository at this point in the history
Check for Duplicate / Empty columns before attempting to submit import
  • Loading branch information
danharrin authored May 21, 2024
2 parents 35ab1a7 + 9595ad5 commit e2e718b
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 2 deletions.
8 changes: 7 additions & 1 deletion packages/actions/resources/lang/en/import.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,21 @@
'form' => [

'file' => [

'label' => 'File',

'placeholder' => 'Upload a CSV file',

'rules' => [
'duplicate_columns' => '{0} The file must not contain more than one empty column header.|{1,*} The file must not contain duplicate column headers: :columns.',
],

],

'columns' => [
'label' => 'Columns',
'placeholder' => 'Select a column',
],

],

'actions' => [
Expand Down
44 changes: 43 additions & 1 deletion packages/actions/src/Concerns/CanImportRecords.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
use Illuminate\Support\Facades\Bus;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Number;
use Illuminate\Validation\Rules\File;
use Illuminate\Validation\ValidationException;
use League\Csv\ByteSequence;
use League\Csv\CharsetConverter;
Expand Down Expand Up @@ -80,7 +81,48 @@ protected function setUp(): void
->label(__('filament-actions::import.modal.form.file.label'))
->placeholder(__('filament-actions::import.modal.form.file.placeholder'))
->acceptedFileTypes(['text/csv', 'text/x-csv', 'application/csv', 'application/x-csv', 'text/comma-separated-values', 'text/x-comma-separated-values', 'text/plain', 'application/vnd.ms-excel'])
->rule('extensions:csv,txt')
->rules([
'extensions:csv,txt',
File::types(['csv', 'txt'])->rules([
function (string $attribute, mixed $value, Closure $fail) use ($action) {
$csvStream = $this->getUploadedFileStream($value);

if (! $csvStream) {
return;
}

$csvReader = CsvReader::createFromStream($csvStream);

if (filled($csvDelimiter = $this->getCsvDelimiter($csvReader))) {
$csvReader->setDelimiter($csvDelimiter);
}

$csvReader->setHeaderOffset($action->getHeaderOffset() ?? 0);

$csvColumns = $csvReader->getHeader();

$duplicateCsvColumns = [];

foreach (array_count_values($csvColumns) as $header => $count) {
if ($count <= 1) {
continue;
}

$duplicateCsvColumns[] = $header;
}

if (empty($duplicateCsvColumns)) {
return;
}

$filledDuplicateCsvColumns = array_filter($duplicateCsvColumns, fn ($value): bool => filled($value));

$fail(trans_choice('filament-actions::import.modal.form.file.rules.duplicate_columns', count($filledDuplicateCsvColumns), [
'columns' => implode(', ', $filledDuplicateCsvColumns),
]));
},
]),
])
->afterStateUpdated(function (FileUpload $component, Component $livewire, Forms\Set $set, ?TemporaryUploadedFile $state) use ($action) {
if (! $state instanceof TemporaryUploadedFile) {
return;
Expand Down

0 comments on commit e2e718b

Please sign in to comment.