From 0c7a58cb48ee843e8a121fab61b71ff34cc8354d Mon Sep 17 00:00:00 2001 From: Eleazar Resendez Date: Thu, 9 Jul 2026 12:12:21 -0600 Subject: [PATCH] FOUR-29372: Show persisted multi-instance form data --- .../Api/ProcessRequestController.php | 2 +- tests/Feature/Api/ProcessRequestsTest.php | 65 +++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/ProcessMaker/Http/Controllers/Api/ProcessRequestController.php b/ProcessMaker/Http/Controllers/Api/ProcessRequestController.php index 15746d08cd..0a4daa0991 100644 --- a/ProcessMaker/Http/Controllers/Api/ProcessRequestController.php +++ b/ProcessMaker/Http/Controllers/Api/ProcessRequestController.php @@ -792,7 +792,7 @@ public function getRequestToken(Request $httpRequest, ProcessRequest $request) public function screenRequested(Request $httpRequest, ProcessRequest $request) { $query = ProcessRequestToken::query(); - $query->select('id', 'element_id', 'process_id', 'process_request_id', 'data') + $query->select('id', 'element_id', 'process_id', 'process_request_id', 'data', 'token_properties') ->where('process_request_id', $request->id) ->whereNotIn('element_type', ['end_event', 'scriptTask']) ->whereIn('status', ['CLOSED', 'TRIGGERED']) diff --git a/tests/Feature/Api/ProcessRequestsTest.php b/tests/Feature/Api/ProcessRequestsTest.php index 930805cead..1556b07c90 100644 --- a/tests/Feature/Api/ProcessRequestsTest.php +++ b/tests/Feature/Api/ProcessRequestsTest.php @@ -14,6 +14,7 @@ use ProcessMaker\Models\Process; use ProcessMaker\Models\ProcessRequest; use ProcessMaker\Models\ProcessRequestToken; +use ProcessMaker\Models\Screen; use ProcessMaker\Models\User; use ProcessMaker\Nayra\Contracts\Bpmn\ActivityInterface; use Tests\Feature\Shared\RequestHelper; @@ -1133,6 +1134,70 @@ public function testScreenRequested() $this->assertEmpty($data); } + public function testScreenRequestedReturnsMultiInstanceTokenPropertiesData() + { + $screen = Screen::factory()->create([ + 'config' => [[ + 'component' => 'FormTextArea', + 'config' => [ + 'label' => 'New Textarea', + 'name' => 'form_text_area_1', + ], + ]], + ]); + $bpmn = file_get_contents(base_path('tests/Feature/Api/processes/Timer_BoundaryEvent_MultiInstance.bpmn')); + $bpmn = str_replace('pm:screenRef="19"', 'pm:screenRef="' . $screen->id . '"', $bpmn); + $process = Process::factory()->create([ + 'bpmn' => $bpmn, + 'user_id' => $this->user->id, + ]); + $request = ProcessRequest::factory()->create([ + 'process_id' => $process->id, + 'process_version_id' => $process->getLatestVersion()->id, + 'callable_id' => 'ProcessId', + 'data' => [ + 'array' => [ + ['form_input_1' => 'lulu1'], + ], + ], + ]); + + ProcessRequestToken::factory()->create([ + 'process_id' => $process->id, + 'process_request_id' => $request->id, + 'element_id' => 'node_2', + 'element_type' => 'task', + 'status' => 'CLOSED', + 'data' => [ + 'loopCounter' => 1, + 'form_input_1' => 'lulu1', + 'form_text_area_1' => 'lorem ipsum', + ], + 'token_properties' => [ + 'data' => [ + 'loopCounter' => 1, + 'form_input_1' => 'lulu1', + 'form_text_area_1' => 'lorem ipsum', + ], + ], + ]); + + $route = route('api.requests.detail.screen', ['request' => $request->id]); + $response = $this->apiCall('GET', $route, [ + 'page' => 1, + 'per_page' => 10, + 'order_by' => 'completed_at', + 'order_direction' => 'asc', + 'filter' => '', + ]); + + $response->assertStatus(200); + $data = $response->json('data'); + $this->assertCount(1, $data); + $this->assertSame('lorem ipsum', $data[0]['data']['form_text_area_1']); + $this->assertSame('lorem ipsum', $data[0]['data']['_parent']['form_text_area_1']); + } + /** * Get a list of Requests by Cases. */