Skip to content
31 changes: 27 additions & 4 deletions ProcessMaker/Http/Resources/ScreenVersion.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@

namespace ProcessMaker\Http\Resources;

use ProcessMaker\Models\Process;
use Illuminate\Support\Arr;
use ProcessMaker\Models\Screen;
use ProcessMaker\ProcessTranslations\ProcessTranslation;
use ProcessMaker\ProcessTranslations\ScreenTranslation;

class ScreenVersion extends ApiResource
Expand All @@ -24,6 +23,7 @@ public function toArray($request)
$task = null;

if (in_array('nested', $include)) {
$this->setDefaultScreenForNestedScreens($screenVersion);
$task = $request->route('task');
$processRequest = null;
if ($task) {
Expand All @@ -32,8 +32,10 @@ public function toArray($request)

$nested = [];
foreach ($this->parent->nestedScreenIds($processRequest) as $id) {
$nestedScreen = Screen::findOrFail($id);
$nested[] = $nestedScreen->versionFor($processRequest)->toArray();
$nestedScreen = Screen::find($id);
if ($nestedScreen) {
$nested[] = $nestedScreen->versionFor($processRequest)->toArray();
}
}
$screenVersion['nested'] = $nested;
}
Expand All @@ -54,4 +56,25 @@ public function toArray($request)

return $screenVersion;
}

/**
* Set the default screen for nested screens when no screen has been selected.
*/
private function setDefaultScreenForNestedScreens(array &$screenVersion): void
{
$configArray = $screenVersion['config'];
foreach ($configArray as $key => $config) {
foreach ($config['items'] as $itemKey => $item) {
if (isset($item['component']) && $item['component'] === 'FormNestedScreen') {
$configScreen = $item['config']['screen'] ?? null;
if (Screen::where('id', $configScreen)->doesntExist()) {
$defaultScreenId = Screen::where('key', 'default-form-screen')->value('id');
$path = "{$key}.items.{$itemKey}.config.screen";
Arr::set($configArray, $path, $defaultScreenId);
}
}
}
}
$screenVersion['config'] = $configArray;
}
}
24 changes: 18 additions & 6 deletions ProcessMaker/Models/ProcessRequestToken.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
use Illuminate\Support\Facades\Notification;
use Laravel\Scout\Searchable;
use Log;
use ProcessMaker\Facades\WorkflowManager;
use ProcessMaker\Facades\WorkflowUserManager;
use ProcessMaker\Nayra\Bpmn\TokenTrait;
use ProcessMaker\Nayra\Contracts\Bpmn\ActivityInterface;
Expand Down Expand Up @@ -320,14 +319,27 @@ public function getBpmnDefinition()

/**
* Get the form assigned to the task.
*
* @return Screen
*/
public function getScreen()
public function getScreen(): ?Screen
{
$definition = $this->getDefinition();
$screenRef = $definition['screenRef'] ?? null;
$screen = Screen::find($screenRef);

if ($screen === null) {
// Attempt to retrieve the localName property from the bpmnDefinition object.
// It uses a try-catch block to handle any exceptions that might occur, for example in test environments.
try {
$localName = $this->getBpmnDefinition()->localName;
} catch (\Throwable $t) {
$localName = null;
}
$isManualTask = $localName === 'manualTask';
$defaultScreen = $isManualTask ? 'default-display-screen' : 'default-form-screen';
$screen = Screen::firstWhere('key', $defaultScreen);
}

return empty($definition['screenRef']) ? null : Screen::find($definition['screenRef']);
return $screen;
}

/**
Expand All @@ -339,7 +351,7 @@ public function getScreenVersion()
{
$screen = $this->getScreen();

if (!$screen) {
if ($screen === null) {
return null;
}

Expand Down
Loading