diff --git a/app/Http/Controllers/FormController.php b/app/Http/Controllers/FormController.php index af18b6bf..4537551d 100644 --- a/app/Http/Controllers/FormController.php +++ b/app/Http/Controllers/FormController.php @@ -258,10 +258,11 @@ class FormController extends Controller return $this->deliverform($formdata, $finfo->data->questions); } elseif ($formdata->link_type == 'list') { $form = $finfo->data->form ?? $formdata; - $showPositions = $form->show_positions ?? $form->show_position ?? 'no'; - $positionColumns = $this->getAvailablePositionColumns($finfo->data->submissions ?? [], $showPositions); - $userAttrs = $this->userAttributeCodes($form); - $userAttrLabels = $this->resolveUserAttributeLabels($userAttrs); + $dataDesignerView = $this->hasDataDesignerView($form); + $showPositions = $dataDesignerView ? 'no' : ($form->show_positions ?? $form->show_position ?? 'no'); + $positionColumns = $dataDesignerView ? [] : $this->getAvailablePositionColumns($finfo->data->submissions ?? [], $showPositions); + $userAttrs = $dataDesignerView ? [] : $this->userAttributeCodes($form); + $userAttrLabels = $dataDesignerView ? [] : $this->resolveUserAttributeLabels($userAttrs); $listViewData = [ 'questions' => $finfo->data->questions, 'submissions' => $finfo->data->submissions, @@ -273,6 +274,7 @@ class FormController extends Controller 'positionColumns' => $positionColumns, 'userAttrs' => $userAttrs, 'userAttrLabels' => $userAttrLabels, + 'dataDesignerView' => $dataDesignerView, ]; if (\View::exists('form.'.$formdata->partition.'.list-'.$formdata->form_id)) { return view('form.'.$formdata->partition.'.list-'.$formdata->form_id)->with($listViewData); @@ -401,83 +403,106 @@ class FormController extends Controller $sessionForm = $request->session()->get('formdata'); $canDeleteByPermission = $request->input('delete_submission') == 1 || $this->sessionFlag($sessionForm, 'delete_submission'); - $userAttrs = $this->userAttributeCodes($formdata); + $dataDesignerView = $this->hasDataDesignerView($formdata); + $userAttrs = $dataDesignerView ? [] : $this->userAttributeCodes($formdata); foreach($submissions as $submission) { if (!isset($submission->user_info->name)) continue; $row = [ - "date" => date("d M Y", strtotime($submission->updatedAt)), - "name" => $submission->user_info->name, - "designation" => $submission->user_info->designation ?? "", - "employee_code" => $submission->user_info->employee_code ?? "", "submission_id" => $submission->id, "actions" => [] ]; - foreach ($userAttrs as $attr) { - $row[$attr] = $this->userAttributeValue($submission->user_info ?? null, $attr); - } - // workflow status - if (isset($formdata->workflow) && $formdata->workflow == 'yes') { - $row["workflow_status"] = ucfirst($submission->workflow_status ?? ""); - $row["workflow_next_approver"] = $submission->workflow_next_approver ?? ""; - } + if ($dataDesignerView) { + foreach ($questions as $code => $question) { + if (isset($question->type) && $question->type == 'hidden') { + continue; + } + $value = null; + if (isset($submission->formdata) && is_object($submission->formdata) && property_exists($submission->formdata, $code)) { + $value = $submission->formdata->{$code}; + } elseif (isset($submission->{$code})) { + $value = $submission->{$code}; + } + if (is_array($value)) { + $value = implode(', ', $value); + } + $row[$code] = $value ?? ''; + } + if (isset($formdata->workflow) && $formdata->workflow == 'yes') { + $row['workflow_next_approver'] = $submission->workflow_next_approver ?? ''; + } + } else { + $row['date'] = date("d M Y", strtotime($submission->updatedAt)); + $row['name'] = $submission->user_info->name; + $row['designation'] = $submission->user_info->designation ?? ""; + $row['employee_code'] = $submission->user_info->employee_code ?? ""; + foreach ($userAttrs as $attr) { + $row[$attr] = $this->userAttributeValue($submission->user_info ?? null, $attr); + } - // answers for all questions (put on top level!) - foreach($questions as $code => $question) { - if ($question->type == 'hidden') continue; - if ($question->type == 'multitextbox') { - foreach ($question->options as $k => $v) { - $row[$k] = isset($submission->formdata->{$k}) - ? (is_array($submission->formdata->{$k}) - ? implode(', ', $submission->formdata->{$k}) - : $submission->formdata->{$k}) + // workflow status + if (isset($formdata->workflow) && $formdata->workflow == 'yes') { + $row["workflow_status"] = ucfirst($submission->workflow_status ?? ""); + $row["workflow_next_approver"] = $submission->workflow_next_approver ?? ""; + } + + // answers for all questions (put on top level!) + foreach($questions as $code => $question) { + if ($question->type == 'hidden') continue; + if ($question->type == 'multitextbox') { + foreach ($question->options as $k => $v) { + $row[$k] = isset($submission->formdata->{$k}) + ? (is_array($submission->formdata->{$k}) + ? implode(', ', $submission->formdata->{$k}) + : $submission->formdata->{$k}) + : ''; + } + } else if ($question->type == 'file') { + $row[$code . '_file'] = isset($submission->formdata->{$code}) + ? (is_array($submission->formdata->{$code}) + ? implode(', ', $submission->formdata->{$code}) + : $submission->formdata->{$code}) + : ''; + } else { + $row[$code] = isset($submission->formdata->{$code}) + ? (is_array($submission->formdata->{$code}) + ? implode(', ', $submission->formdata->{$code}) + : $submission->formdata->{$code}) : ''; } - } else if ($question->type == 'file') { - $row[$code . '_file'] = isset($submission->formdata->{$code}) - ? (is_array($submission->formdata->{$code}) - ? implode(', ', $submission->formdata->{$code}) - : $submission->formdata->{$code}) - : ''; - } else { - $row[$code] = isset($submission->formdata->{$code}) - ? (is_array($submission->formdata->{$code}) - ? implode(', ', $submission->formdata->{$code}) - : $submission->formdata->{$code}) - : ''; } - } - $generatedFiles = $submission->formdata->genareted_image ?? null; - if (is_object($generatedFiles)) { - $generatedFiles = array_values((array) $generatedFiles); - } - if (is_array($generatedFiles) && count($generatedFiles)) { - $imageFormId = $submission->formdata->form_id ?? $form_id; - $row['generated_image_url'] = collect($generatedFiles)->filter()->map(function ($file) use ($imageFormId) { - return asset('storage/personalized/'.$imageFormId.'/'.$file); - })->implode(', '); - } - - if (isset($formdata->workflow) && $formdata->workflow == 'yes') { - $row['workflow_action_date'] = $this->formatWorkflowActionDate($submission); - $row['approval_history'] = $this->formatApprovalHistory($submission); - } - - // show positions (legacy: show_position) — null-safe; blades only render available columns - $showPositions = $formdata->show_positions ?? $formdata->show_position ?? 'no'; - if ($showPositions == 'yes') { - foreach (['territory', 'area', 'region', 'zone'] as $positionField) { - $row[$positionField] = $submission->{$positionField} ?? ''; + $generatedFiles = $submission->formdata->genareted_image ?? null; + if (is_object($generatedFiles)) { + $generatedFiles = array_values((array) $generatedFiles); + } + if (is_array($generatedFiles) && count($generatedFiles)) { + $imageFormId = $submission->formdata->form_id ?? $form_id; + $row['generated_image_url'] = collect($generatedFiles)->filter()->map(function ($file) use ($imageFormId) { + return asset('storage/personalized/'.$imageFormId.'/'.$file); + })->implode(', '); } - } - // show L1/L2 manager details - if (isset($formdata->show_manager_details) && $formdata->show_manager_details == 'yes') { - $row['manager1_name'] = $submission->manager1_name ?? ''; - $row['manager1_code'] = $submission->manager1_code ?? ''; - $row['manager2_name'] = $submission->manager2_name ?? ''; - $row['manager2_code'] = $submission->manager2_code ?? ''; + if (isset($formdata->workflow) && $formdata->workflow == 'yes') { + $row['workflow_action_date'] = $this->formatWorkflowActionDate($submission); + $row['approval_history'] = $this->formatApprovalHistory($submission); + } + + // show positions (legacy: show_position) — null-safe; blades only render available columns + $showPositions = $formdata->show_positions ?? $formdata->show_position ?? 'no'; + if ($showPositions == 'yes') { + foreach (['territory', 'area', 'region', 'zone'] as $positionField) { + $row[$positionField] = $submission->{$positionField} ?? ''; + } + } + + // show L1/L2 manager details + if (isset($formdata->show_manager_details) && $formdata->show_manager_details == 'yes') { + $row['manager1_name'] = $submission->manager1_name ?? ''; + $row['manager1_code'] = $submission->manager1_code ?? ''; + $row['manager2_name'] = $submission->manager2_name ?? ''; + $row['manager2_code'] = $submission->manager2_code ?? ''; + } } // actions @@ -490,8 +515,8 @@ class FormController extends Controller } if (isset($submission->actions) && in_array('edit', $submission->actions)) $row['actions'][] = 'edit'; if ( - isset($formdata->workflow) && - $formdata->workflow == 'yes' && + isset($formdata->workflow) && + $formdata->workflow == 'yes' && $submission->workflow_status == 'unapproved' ) { $row['actions'][] = 'approve'; @@ -508,23 +533,25 @@ class FormController extends Controller } // Target forms: always expose approval status for list UI (downloadpersonalization list) - $targetFormIds = [ - '1781004538-88671587-3b81-403b-af63-fdbfae8a965e', // rapport-team2 - '1782118020-9c6160bf-f07c-465e-9ea1-e8ff0c0b89dd', // rapport-titans - ]; - $resolvedFormIds = array_filter([ - (string) $form_id, - (string) ($originalFormId ?? ''), - (string) (is_object($formdata) ? ($formdata->id ?? '') : ''), - (string) (is_object($formdata) ? ($formdata->form_id ?? '') : ''), - ]); - $isTargetForm = count(array_intersect($targetFormIds, $resolvedFormIds)) > 0; + if (!$dataDesignerView) { + $targetFormIds = [ + '1781004538-88671587-3b81-403b-af63-fdbfae8a965e', // rapport-team2 + '1782118020-9c6160bf-f07c-465e-9ea1-e8ff0c0b89dd', // rapport-titans + ]; + $resolvedFormIds = array_filter([ + (string) $form_id, + (string) ($originalFormId ?? ''), + (string) (is_object($formdata) ? ($formdata->id ?? '') : ''), + (string) (is_object($formdata) ? ($formdata->form_id ?? '') : ''), + ]); + $isTargetForm = count(array_intersect($targetFormIds, $resolvedFormIds)) > 0; - if ($isTargetForm) { - $workflowStatus = $submission->workflow_status - ?? (is_object($submission->formdata) ? ($submission->formdata->workflow_status ?? '') : ''); - $row['workflow_status'] = ucfirst(trim((string) $workflowStatus)); - $row['workflow_next_approver'] = $submission->workflow_next_approver ?? ($row['workflow_next_approver'] ?? ''); + if ($isTargetForm) { + $workflowStatus = $submission->workflow_status + ?? (is_object($submission->formdata) ? ($submission->formdata->workflow_status ?? '') : ''); + $row['workflow_status'] = ucfirst(trim((string) $workflowStatus)); + $row['workflow_next_approver'] = $submission->workflow_next_approver ?? ($row['workflow_next_approver'] ?? ''); + } } $jsonRows[] = $row; } @@ -13337,6 +13364,47 @@ class FormController extends Controller Log::debug($cmd); } + /** + * True when the form Data Designer has at least one show_in_view field. + * Opt-in only: empty designer or export-only fields keep the legacy list. + */ + protected function hasDataDesignerView($form): bool + { + if (!$form) { + return false; + } + $designer = $form->data_designer ?? null; + if (is_string($designer) && trim($designer) !== '') { + $decoded = json_decode($designer, true); + $designer = is_array($decoded) ? $decoded : null; + } elseif (is_object($designer)) { + $designer = (array) $designer; + } + if (!is_array($designer)) { + return false; + } + $fields = $designer['fields'] ?? []; + if (is_object($fields)) { + $fields = (array) $fields; + } + if (!is_array($fields)) { + return false; + } + foreach ($fields as $field) { + if (is_object($field)) { + $show = $field->show_in_view ?? false; + } elseif (is_array($field)) { + $show = $field['show_in_view'] ?? false; + } else { + continue; + } + if ($show === true || $show === 1 || $show === '1' || $show === 'true') { + return true; + } + } + return false; + } + /** * Selected user attribute codes when Show User Attributes is Yes. * A saved attribute list is ignored while that setting is No. diff --git a/resources/views/form/list.blade.php b/resources/views/form/list.blade.php index 3c4ad69d..be9d0a52 100644 --- a/resources/views/form/list.blade.php +++ b/resources/views/form/list.blade.php @@ -64,6 +64,15 @@ Action + @if(!empty($dataDesignerView)) + @foreach($questions as $code => $question) + @if(isset($question->type) && $question->type == 'hidden') + @continue + @endif + {{ $question->label }} + @endforeach + @php $showGeneratedImage = false; @endphp + @else Submission Date Submitted By Employee Code @@ -107,6 +116,7 @@ @if($showGeneratedImage) Generated Image @endif + @endif @@ -240,6 +250,14 @@ return buttons; } }, + @if(!empty($dataDesignerView)) + @foreach($questions as $code => $question) + @if(isset($question->type) && $question->type == 'hidden') + @continue + @endif + { "data": "{{$code}}", "defaultContent": "" }, + @endforeach + @else { "data": "date" }, { "data": "name" }, { "data": "employee_code" }, @@ -310,6 +328,7 @@ } }, @endif + @endif ], "initComplete": function(settings, json) { var textBox = $('.dataTables_filter label input');