feat: show collection balance in billing widget (#7454)
[openemr.git] / portal / questionnaire_render.php
blob51f4d617df825c5caab196f30fe3c0f905a4da31
1 <?php
3 /**
4 * Questionnaire Template
6 * @package OpenEMR
7 * @link https://www.open-emr.org
8 * @author Jerry Padgett <sjpadgett@gmail.com>
9 * @copyright Copyright (c) 2022 Jerry Padgett <sjpadgett@gmail.com>
10 * @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
13 require_once(__DIR__ . "/../src/Common/Forms/CoreFormToPortalUtility.php");
15 use OpenEMR\Common\Forms\CoreFormToPortalUtility;
16 use OpenEMR\Core\Header;
17 use OpenEMR\Services\QuestionnaireService;
19 // block of code to securely support use by the patient portal
20 $patientPortalSession = CoreFormToPortalUtility::isPatientPortalSession($_GET);
21 if ($patientPortalSession) {
22 $ignoreAuth_onsite_portal = true;
25 require_once(__DIR__ . "/../interface/globals.php");
27 $mode = $_REQUEST['mode'] ?? '';
28 $q = $_REQUEST['qId'] ?? null;
29 $q_file = $_REQUEST['importFile'] ?? null;
30 $q_name = $_REQUEST['name'] ?? null;
32 if (!empty($q)) {
33 $templateService = new QuestionnaireService();
34 $resource = $templateService->fetchQuestionnaireResource($q, $q);
35 $q_json = $resource['questionnaire'];
36 $lform = $resource['lform'];
40 <html>
41 <head>
42 <title><?php echo xlt('Portal'); ?> | <?php echo xlt('Questionnaire'); ?></title>
43 <?php Header::setupHeader(['opener']); ?>
44 <script>
45 let lform, qform;
46 let baseMsg = xl('Convert and verify import');
48 function renderForm(type) {
49 if (type === 'lForm') {
50 LForms.Util.addFormToPage(lform, 'formContainer');
51 baseMsg = xl('Rendering LHC Form');
52 } else {
53 LForms.Util.addFormToPage(qform, 'formContainer');
54 baseMsg = xl('Rendering Questionnaire');
56 document.getElementById('subtitle').innerHTML = baseMsg;
59 function doCancel() {
60 opener.callBackCmd = '';
61 dlgclose();
64 function doImport() {
65 opener.callBackCmd = 'submit';
66 opener.document.getElementById('q_mode').value = formMode;
67 dlgclose('doImportSubmit');
70 function doManualImport() {
71 $('.isRender').toggleClass('d-none');
72 let content = document.getElementById('q_import').value;
73 if (content.length > 80) {
74 typeAndConvert(content);
75 } else {
76 $('.isRender').toggleClass('d-none');
77 alertMsg(xl("You must enter valid form json."), 5000, 'danger', false);
81 function renderManualImport() {
82 $('.isManual').toggleClass('d-none');
85 // convert import to all definitions available
86 // store in parent upload form
87 let gotQ = false;
88 let gotL = false;
89 function typeAndConvert(file, displayMsg = true) {
90 let obj = JSON.parse(file);
91 // reformat file to get rid of lf
92 file = JSON.stringify(obj)
93 if (obj && obj.resourceType === "Questionnaire") {
94 gotQ = true;
95 } else if (obj) {
96 gotL = true;
98 if (gotL) {
99 // convert to questionnaire
100 qform = LForms.Util.getFormFHIRData("Questionnaire", 'R4', obj);
101 lform = file;
102 opener.document.getElementById('questionnaire').value = JSON.stringify(qform);
103 opener.document.getElementById('lform').value = file;
104 baseMsg += ' ' + xl('Rendering LHC-Form');
105 LForms.Util.addFormToPage(opener.document.getElementById('lform').value, 'formContainer');
106 } else if (gotQ) {
107 // convert to lform
108 lform = LForms.Util.convertFHIRQuestionnaireToLForms(obj, 'R4');
109 qform = file;
110 opener.document.getElementById('lform').value = JSON.stringify(lform);
111 opener.document.getElementById('questionnaire').value = file;
112 baseMsg += ' ' + xl('Rendering Questionnaire');
113 LForms.Util.addFormToPage(opener.document.getElementById('questionnaire').value, 'formContainer');
114 } else {
115 alert(xl('Error! Import conversion failed.'));
116 return false;
119 if (displayMsg) {
120 document.getElementById('subtitle').innerHTML = baseMsg;
124 function readQuestionnaireFile() {
125 // grab first file from parent
126 const file = opener.document.getElementById("fetch_files").files.item(0)
127 if (file) {
128 let reader = new FileReader();
129 reader.readAsText(file);
130 reader.addEventListener('load', (evt) => {
131 return typeAndConvert(evt.target.result);
133 reader.addEventListener('onerror', (evt) => {
134 alert("Error reading file");
135 return false;
140 function saveQR() {
141 let qr = LForms.Util.getFormFHIRData('QuestionnaireResponse', 'R4');
142 let formElement = opener.document.getElementById("formContainer");
143 let data = LForms.Util.getUserData(formElement, true, true, true);
144 window.alert(JSON.stringify(data, null, 2));
145 window.alert(JSON.stringify(qr, null, 2));
146 return false;
148 </script>
149 </head>
150 <body>
151 <div class="container-xl mt-2">
152 <div class="my-2">
153 <h3><?php echo xlt("FHIR Questionnaire"); ?><small id="subtitle" class="ml-2"></small></h3>
154 </div>
155 <form id="qForm">
156 <div class="isManual isRender d-none">
157 <label for="q_import"><strong><?php echo xlt("To manually import paste json here"); ?></strong></label>
158 <textarea id="q_import" cols="120" rows="20" class="form-control"></textarea>
159 </div>
160 <div class="my-2">
161 <button type="button" class="isManual btn btn-sm btn-primary btn-save d-none" onclick="doManualImport()"><?php echo xlt("Render"); ?></button>
162 <button type="button" class="isManual isRender btn btn-sm btn-primary btn-save" onclick="doImport()"><?php echo xlt("Import"); ?></button>
163 <div class="btn-group">
164 <button type="button" class="isManual isRender btn btn-sm btn-success" onclick="renderForm('lForm')"><?php echo xlt("LHC Form Version"); ?></button>
165 <button type="button" class="isManual isRender btn btn-sm btn-success" onclick="renderForm('qForm')"><?php echo xlt("Questionnaire Version"); ?></button>
166 </div>
167 <button type="button" class="isManual isRender btn btn-sm btn-primary btn-save" onclick="saveQR()"><?php echo xlt("View Response"); ?></button>
168 <button type="button" class="btn btn-sm btn-secondary btn-cancel" onclick="doCancel()"><?php echo xlt("Cancel"); ?></button>
169 </div>
170 <div id=formContainer></div>
171 <div class="isManual isRender d-none">
172 <label for="q_import"><strong><?php echo xlt("To manually import paste json here"); ?></strong></label>
173 <textarea id="q_import" cols="120" rows="20" class="form-control"></textarea>
174 </div>
175 <div class="my-2">
176 <button type="button" class="isManual btn btn-sm btn-primary btn-save d-none" onclick="doManualImport()"><?php echo xlt("Render"); ?></button>
177 <button type="button" class="isManual isRender btn btn-sm btn-primary btn-save" onclick="doImport()"><?php echo xlt("Import"); ?></button>
178 <div class="btn-group">
179 <button type="button" class="isManual isRender btn btn-sm btn-success" onclick="renderForm('lForm')"><?php echo xlt("LHC Form Version"); ?></button>
180 <button type="button" class="isManual isRender btn btn-sm btn-success" onclick="renderForm('qForm')"><?php echo xlt("Questionnaire Version"); ?></button>
181 </div>
182 <button type="button" class="isManual isRender btn btn-sm btn-primary btn-save" onclick="saveQR()"><?php echo xlt("View Response"); ?></button>
183 <button type="button" class="btn btn-sm btn-secondary btn-cancel" onclick="doCancel()"><?php echo xlt("Cancel"); ?></button>
184 </div>
185 </form>
186 </div>
187 <?php require(__DIR__ . "/../interface/forms/questionnaire_assessments/lform_webcomponents.php") ?>
188 </body>
189 <script>
190 let formMode = <?php echo js_escape($mode); ?>;
191 <?php if ($mode == 'render_import') { ?>
192 window.onload = readQuestionnaireFile();
193 <?php } elseif ($mode == 'render_import_manual') { ?>
194 window.onload = renderManualImport();
195 <?php } ?>
196 </script>
197 </html>