Skip to content

Commit c18884b

Browse files
committed
add: file columns logic
1 parent 0221cfd commit c18884b

File tree

2 files changed

+123
-2
lines changed

2 files changed

+123
-2
lines changed

src/Http/Livewire/ImportCsv.php

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,56 @@ class ImportCsv extends Component
99
{
1010
use WithFileUploads;
1111

12-
/** @var string */
12+
/** @var string $model*/
1313
public string $model;
1414

15-
/** @var string */
15+
/** @var string $file*/
1616
public string $file;
1717

18+
/** @var array $columnsToMap */
19+
public array $columnsToMap = [];
20+
21+
/** @var array $requiredColumns */
22+
public array $requiredColumns = [];
23+
24+
/** @var array $columnLabels */
25+
public array $columnLabels = [];
26+
27+
public function mount()
28+
{
29+
$this->columnsToMap = collect($this->columnsToMap)
30+
->mapWithKeys(fn ($column): array => [$column => ''])
31+
->toArray();
32+
33+
if ($this->columnLabels) {
34+
$this->columnLabels = collect($this->requiredColumns)
35+
->mapWithKeys(function ($column): array {
36+
return [
37+
'columnsToMap.' . $column => strtolower($this->columnLabels[$column]),
38+
];
39+
})->toArray();
40+
}
41+
42+
$this->requiredColumns = collect($this->requiredColumns)
43+
->mapWithKeys(function ($column): array {
44+
return ['columnsToMap.' . $column => 'required'];
45+
})->toArray();
46+
}
47+
1848
public function render()
1949
{
2050
return view('laravel-csv::livewire.import-csv');
2151
}
52+
53+
protected function rules()
54+
{
55+
return [
56+
'file' => 'required|file|mimes:csv,txt',
57+
] + $this->requiredColumns;
58+
}
59+
60+
protected function validationAttributes()
61+
{
62+
return $this->columnLabels;
63+
}
2264
}

tests/ImportCsvTest.php

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,82 @@
3232
->assertSet('file', $file)
3333
->assertSuccessful();
3434
});
35+
36+
it('transfers columnsToMap into an associative array', function () {
37+
$columnsToMap = [
38+
'name',
39+
'email',
40+
'phone',
41+
];
42+
$model = Customer::class;
43+
$file = __DIR__.'./Data/customers.csv';
44+
45+
livewire(ImportCsv::class, [
46+
'model' => $model,
47+
'file' => $file,
48+
'columnsToMap' => $columnsToMap,
49+
])
50+
->assertSet('model', $model)
51+
->assertSet('file', $file)
52+
->assertSet('columnsToMap', [
53+
'name' => '',
54+
'email' => '',
55+
'phone' => '',
56+
])
57+
->assertSuccessful();
58+
});
59+
60+
it('maps requiredColumns property into columnsToMap required state', function () {
61+
$requiredColumns = [
62+
'name',
63+
'email',
64+
'phone',
65+
];
66+
$model = Customer::class;
67+
$file = __DIR__.'./Data/customers.csv';
68+
69+
livewire(ImportCsv::class, [
70+
'model' => $model,
71+
'file' => $file,
72+
'requiredColumns' => $requiredColumns,
73+
])
74+
->assertSet('model', $model)
75+
->assertSet('file', $file)
76+
->assertSet('requiredColumns', [
77+
'columnsToMap.name' => 'required',
78+
'columnsToMap.email' => 'required',
79+
'columnsToMap.phone' => 'required',
80+
]);
81+
});
82+
83+
it('maps through columnsLabels to validate attributes', function () {
84+
$columnsToMap = [
85+
'name', 'email', 'phone',
86+
];
87+
88+
$requiredColumns = [
89+
'name', 'email',
90+
];
91+
92+
$columnLabels = [
93+
'name' => 'Name',
94+
'email' => 'Email',
95+
];
96+
97+
$model = Customer::class;
98+
$file = __DIR__.'./Data/customers.csv';
99+
100+
livewire(ImportCsv::class, [
101+
'model' => $model,
102+
'file' => $file,
103+
'columnsToMap' => $columnsToMap,
104+
'requiredColumns' => $requiredColumns,
105+
'columnLabels' => $columnLabels,
106+
])
107+
->assertSet('model', $model)
108+
->assertSet('file', $file)
109+
->assertSet('columnLabels', [
110+
'columnsToMap.name' => 'name',
111+
'columnsToMap.email' => 'email',
112+
]);
113+
});

0 commit comments

Comments
 (0)