diff --git a/ProcessMaker/Http/Controllers/Api/ProcessController.php b/ProcessMaker/Http/Controllers/Api/ProcessController.php index 1ec1a6269f..626b1f0a24 100644 --- a/ProcessMaker/Http/Controllers/Api/ProcessController.php +++ b/ProcessMaker/Http/Controllers/Api/ProcessController.php @@ -1721,9 +1721,11 @@ public function saveImagesIntoMedia(Request $request, Process $process) public function getMediaImages(Request $request, Process $process) { - $media = Process::with(['media']) - ->where('id', $process->id) - ->get(); + $media = Process::with(['media' => function ($query) { + $query->orderBy('order_column', 'asc'); + }]) + ->where('id', $process->id) + ->get(); return new ProcessCollection($media); } diff --git a/ProcessMaker/Jobs/SyncGuidedTemplates.php b/ProcessMaker/Jobs/SyncGuidedTemplates.php index 79310e5f79..2f033ad541 100644 --- a/ProcessMaker/Jobs/SyncGuidedTemplates.php +++ b/ProcessMaker/Jobs/SyncGuidedTemplates.php @@ -229,10 +229,22 @@ private function importTemplateAssets($template, $config, $mediaCollectionName, $this->importMedia($templateIconUrl, 'icon', $mediaCollectionName, $guidedTemplate); $this->importMedia($templateCardBackgroundUrl, 'cardBackground', $mediaCollectionName, $guidedTemplate); + if (!empty($template['assets']['launchpad']['process-card-background'])) { + $templateProcessCardBackgroundUrl = $this->buildTemplateUrl($config, $template['assets']['launchpad']['process-card-background']); + $this->importMedia($templateProcessCardBackgroundUrl, 'launchpadProcessCardBackground', $mediaCollectionName, $guidedTemplate); + } + foreach ($template['assets']['slides'] as $slide) { $templateSlideUrl = $this->buildTemplateUrl($config, $slide); $this->importMedia($templateSlideUrl, 'slide', $mediaCollectionName, $guidedTemplate); } + + if (!empty($template['assets']['launchpad']['slides'])) { + foreach ($template['assets']['launchpad']['slides'] as $slide) { + $templateSlideUrl = $this->buildTemplateUrl($config, $slide); + $this->importMedia($templateSlideUrl, 'launchpadSlides', $mediaCollectionName, $guidedTemplate); + } + } } private function importMedia($assetUrl, $customProperty, $mediaCollectionName, $guidedTemplate) diff --git a/ProcessMaker/Templates/ProcessTemplate.php b/ProcessMaker/Templates/ProcessTemplate.php index ee61cf3c02..2ce246c08b 100644 --- a/ProcessMaker/Templates/ProcessTemplate.php +++ b/ProcessMaker/Templates/ProcessTemplate.php @@ -17,8 +17,10 @@ use ProcessMaker\Models\ProcessCategory; use ProcessMaker\Models\ProcessTemplates; use ProcessMaker\Models\Template; +use ProcessMaker\Models\WizardTemplate; use ProcessMaker\Traits\HasControllerAddons; use SebastianBergmann\CodeUnit\Exception; +use Spatie\MediaLibrary\MediaCollections\Models\Media; /** * Summary of ProcessTemplate @@ -284,6 +286,8 @@ public function create($request) : JsonResponse $process = Process::findOrFail($processId); + $this->syncLaunchpadAssets($request, $process); + if (class_exists(self::PROJECT_ASSET_MODEL_CLASS) && !empty($requestData['projects'])) { $manifest = $this->getManifest('process', $processId); @@ -511,4 +515,62 @@ public function existingTemplate($request) : ?array return null; } + + /** + * Syncs launchpad assets from a guided template to the imported process. + * + * @param Illuminate\Http\Request $request + * @param App\Models\Process $process + * @return void + */ + protected function syncLaunchpadAssets($request, $process) + { + if (empty($request->wizardTemplateUuid)) { + return; + } + + // Add media collection for the imported process + $processMediaCollectionName = $process->uuid . '_images_carousel'; + $process->addMediaCollection($processMediaCollectionName); + + // Retrieve the guided template by UUID + $guidedTemplateUuid = $request->input('wizardTemplateUuid'); + $template = WizardTemplate::where('uuid', $guidedTemplateUuid)->first(); + + // Get launchpad slides media from the guided template + $templateLaunchpadSlides = $template->getMedia($template->media_collection, function (Media $media) { + return $media->custom_properties['media_type'] === 'launchpadSlides'; + }); + + // Iterate over each launchpad slide and add to the imported process media collection + foreach ($templateLaunchpadSlides as $slide) { + // Extract order index from file name + $orderIndex = $this->extractOrderIndexFromFileName($slide->getPath()); + + // Add media to the imported process collection + $media = $process->addMedia($slide->getPath())->preservingOriginal()->toMediaCollection($processMediaCollectionName); + + // Set order column if available + if (!is_null($orderIndex)) { + $media->order_column = $orderIndex; + $media->save(); + } + } + } + + /** + * Extracts order index from the file name. + * + * @param string $fileName + * @return int|null + */ + protected function extractOrderIndexFromFileName($fileName) + { + preg_match('/\d+/', basename($fileName), $matches); + if (!empty($matches)) { + return intval($matches[0]) - 1; + } + + return null; + } }