diff --git a/ProcessMaker/ImportExport/Exporters/ScreenTemplatesExporter.php b/ProcessMaker/ImportExport/Exporters/ScreenTemplatesExporter.php index b9f16a30f7..f1bd04a7c4 100644 --- a/ProcessMaker/ImportExport/Exporters/ScreenTemplatesExporter.php +++ b/ProcessMaker/ImportExport/Exporters/ScreenTemplatesExporter.php @@ -3,6 +3,7 @@ namespace ProcessMaker\ImportExport\Exporters; use Illuminate\Support\Facades\Auth; +use ProcessMaker\ImportExport\DependentType; class ScreenTemplatesExporter extends ExporterBase { @@ -10,6 +11,15 @@ class ScreenTemplatesExporter extends ExporterBase public function export() : void { + $media = $this->model->getMedia($this->model->media_collection); + + $this->addReference(DependentType::MEDIA, $media->map(function ($item) { + return [ + 'file_name' => $item->file_name, + 'custom_properties' => $item->custom_properties, + 'base64' => base64_encode(file_get_contents($item->getPath())), + ]; + })->all()); } public function import() : bool @@ -17,7 +27,20 @@ public function import() : bool $screenTemplate = $this->model; $screenTemplate->user_id = Auth::user()->id; $screenTemplate->is_default_template = 0; + $screenTemplate->media_collection = 'st-' . $screenTemplate->uuid . '-media'; $screenTemplate->save(); + $screenTemplate->clearMediaCollection($screenTemplate->media_collection); + + foreach ($this->getReference(DependentType::MEDIA) ?? [] as $item) { + if (empty($item['base64'])) { + continue; + } + + $screenTemplate->addMediaFromBase64($item['base64']) + ->usingFileName($item['file_name']) + ->withCustomProperties($item['custom_properties'] ?? []) + ->toMediaCollection($screenTemplate->media_collection); + } return true; } diff --git a/tests/Feature/Templates/Api/ScreenTemplateTest.php b/tests/Feature/Templates/Api/ScreenTemplateTest.php index aa2283e5fc..9b95f4cd0d 100644 --- a/tests/Feature/Templates/Api/ScreenTemplateTest.php +++ b/tests/Feature/Templates/Api/ScreenTemplateTest.php @@ -336,6 +336,13 @@ public function testImportExportScreenTemplate() { $adminUser = User::factory()->create(); $screenTemplate = ScreenTemplates::factory()->create(['name' => 'ScreenTemplate', 'user_id' => $adminUser->id]); + $mediaCollection = 'st-' . $screenTemplate->uuid . '-media'; + $screenTemplate->media_collection = $mediaCollection; + $screenTemplate->save(); + $screenTemplate->addMedia(UploadedFile::fake()->image('thumbnail.png')) + ->withCustomProperties(['media_type' => 'thumbnail']) + ->toMediaCollection($mediaCollection); + $payload = $this->export($screenTemplate, ScreenTemplatesExporter::class); $screenTemplate->delete(); $this->assertDatabaseMissing('screen_templates', ['name' => $screenTemplate->name]); @@ -346,6 +353,21 @@ public function testImportExportScreenTemplate() $this->assertDatabaseHas('screen_templates', ['name' => $screenTemplate->name]); $importedTemplate = ScreenTemplates::where('name', $screenTemplate->name)->first(); $this->assertEquals($actingAsUser->id, $importedTemplate->user_id); + + $importedCollection = 'st-' . $importedTemplate->uuid . '-media'; + $this->assertEquals($importedCollection, $importedTemplate->media_collection); + $this->assertCount(1, $importedTemplate->getMedia($importedCollection)); + + $templateMedia = $importedTemplate->template_media; + $this->assertNotEmpty($templateMedia['thumbnail']); + $this->assertNotEmpty($templateMedia['thumbnail']->url); + $this->assertNotFalse(filter_var($templateMedia['thumbnail']->url, FILTER_VALIDATE_URL)); + $this->assertFileExists($importedTemplate->getMedia($importedCollection)->first()->getPath()); + + // Import the template again to check if the media collection is the same + $this->actingAs($actingAsUser)->import($payload); + $importedTemplate->refresh(); + $this->assertCount(1, $importedTemplate->getMedia($importedCollection)); } public function testImportExportScreenTemplatesRoutes()