feat(templates): importar CSV/Excel con group, question y help
El importador de plantillas solo parseaba name/label/type/required/options/ min/max/step, dejando fuera group (sección), question (pregunta corta) y help (ayuda) que el builder manual sí soporta. - Nuevo orden de columnas: group,name,label,question,type,required,options,min,max,step,help - parseRows() rellena las 11 claves (coincide con addField()). - readFileRows() ya no descarta filas por la 1ª columna (ahora es `group`, que puede ir vacía); filtra por "fila con algún contenido" y parseRows descarta las que no tengan `name`. - CSV de ejemplo actualizado (con BOM UTF-8) y con filas que muestran group/ question/help/select. - Modal de importación: texto de columnas y tabla de preview muestran Grupo y Pregunta. Tests: nuevo test csv_import_parses_group_question_and_help. Suite 95 passing. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -12,6 +12,7 @@ use App\Models\Phase;
|
||||
use App\Models\Project;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use Livewire\Livewire;
|
||||
use Spatie\Permission\Models\Permission;
|
||||
use Tests\TestCase;
|
||||
@@ -116,6 +117,43 @@ class GlobalTemplatesTest extends TestCase
|
||||
->assertSet('editingTemplate', $tpl->id);
|
||||
}
|
||||
|
||||
public function test_csv_import_parses_group_question_and_help(): void
|
||||
{
|
||||
Permission::findOrCreate('manage templates');
|
||||
$admin = User::factory()->create();
|
||||
$admin->givePermissionTo('manage templates');
|
||||
|
||||
$csv = "group,name,label,question,type,required,options,min,max,step,help\n"
|
||||
. "Dimensiones,altura,Altura (m),¿Cumple la cota?,decimal,1,,0,100,0.1,Medir con flexómetro\n"
|
||||
. "Acabados,ok,¿Acabado?,,boolean,0,,,,,\n";
|
||||
$file = UploadedFile::fake()->createWithContent('plantilla.csv', $csv);
|
||||
|
||||
$cmp = Livewire::actingAs($admin)
|
||||
->test(GlobalTemplateManager::class)
|
||||
->set('importTemplateName', 'Importada')
|
||||
->set('importFile', $file)
|
||||
->call('parseImportFile')
|
||||
->assertHasNoErrors();
|
||||
|
||||
$fields = $cmp->get('importPreviewFields');
|
||||
$this->assertCount(2, $fields);
|
||||
$this->assertEquals('Dimensiones', $fields[0]['group']);
|
||||
$this->assertEquals('altura', $fields[0]['name']);
|
||||
$this->assertEquals('¿Cumple la cota?', $fields[0]['question']);
|
||||
$this->assertEquals('Medir con flexómetro', $fields[0]['help']);
|
||||
$this->assertEquals('decimal', $fields[0]['type']);
|
||||
$this->assertTrue($fields[0]['required']);
|
||||
|
||||
// Fila sin group (columna 1 vacía) NO debe descartarse
|
||||
$this->assertEquals('Acabados', $fields[1]['group']);
|
||||
$this->assertEquals('ok', $fields[1]['name']);
|
||||
|
||||
$cmp->call('confirmImportFile');
|
||||
$tpl = InspectionTemplate::where('name', 'Importada')->first();
|
||||
$this->assertNotNull($tpl);
|
||||
$this->assertEquals('¿Cumple la cota?', $tpl->fields[0]['question']);
|
||||
}
|
||||
|
||||
public function test_map_template_selector_only_shows_assigned_templates(): void
|
||||
{
|
||||
$user = User::factory()->create();
|
||||
|
||||
Reference in New Issue
Block a user