Changeset 2958937
- Timestamp:
- 08/27/2023 07:34:29 PM (3 years ago)
- Location:
- codemonkeys-hipaa-forms/trunk
- Files:
-
- 9 edited
-
ajax-functions.php (modified) (9 diffs)
-
css/admin-style.css (modified) (1 diff)
-
css/style.css (modified) (1 diff)
-
enqueue.php (modified) (2 diffs)
-
hipaa-forms.php (modified) (1 diff)
-
includes/class-cm-hipaa.php (modified) (6 diffs)
-
js/admin-script.js (modified) (5 diffs)
-
js/script.js (modified) (2 diffs)
-
readme.txt (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
codemonkeys-hipaa-forms/trunk/ajax-functions.php
r2949557 r2958937 44 44 45 45 /*** ADMIN AJAX FUNCTION ***/ 46 /* GET SUBMITTED FORMS (DEPRECATED) */47 /* COMMENTED OUT ON 09/07/2022*/48 /*function cm_hipaa_get_forms() {49 if (isset($_REQUEST)) {50 $location = '';51 if(isset($_REQUEST['location'])) {52 $location = sanitize_text_field($_REQUEST['location']);53 }54 $formName = '';55 if(isset($_REQUEST['form_name'])) {56 $formName = sanitize_text_field($_REQUEST['form_name']);57 }58 $firstName = '';59 if(isset($_REQUEST['first_name'])) {60 $firstName = sanitize_text_field($_REQUEST['first_name']);61 }62 $lastName = '';63 if(isset($_REQUEST['last_name'])) {64 $lastName = sanitize_text_field($_REQUEST['last_name']);65 }66 $phone = '';67 if(isset($_REQUEST['phone'])) {68 $phone = sanitize_text_field($_REQUEST['phone']);69 }70 $email = '';71 if(isset($_REQUEST['email'])) {72 $email = sanitize_email($_REQUEST['email']);73 }74 $status = '';75 if(isset($_REQUEST['status'])) {76 $status = sanitize_text_field($_REQUEST['status']);77 }78 $limit = '';79 if(isset($_REQUEST['limit'])) {80 $limit = intval($_REQUEST['limit']);81 }82 $page = '';83 if(isset($_REQUEST['page'])) {84 $page = intval($_REQUEST['page']);85 }86 $nonce = '';87 if(isset($_REQUEST['nonce'])) {88 $nonce = sanitize_text_field($_REQUEST['nonce']);89 }90 91 if(!wp_verify_nonce($nonce, 'cm-hipaa-forms-nonce')) {92 $results = array(93 'error' => 'Nonce expired, please refresh the page. If the error persists please contact the site administrator'94 );95 96 echo json_encode($results);97 } else {98 // GET SUBMITTED FORMS FROM CODEMONKEYS HIPAA API99 $cmSubmittedForms = new cmHipaaForms;100 echo $cmSubmittedForms->getForms($location, $formName, $firstName, $lastName, $phone, $email, $status, $limit, $page);101 }102 }103 104 die();105 }*/106 //add_action( 'wp_ajax_cm_hipaa_get_forms', 'cm_hipaa_get_forms' );107 //add_action( 'wp_ajax_nopriv_cm_hipaa_get_forms', 'cm_hipaa_get_forms' );108 109 46 /* GET SUBMITTED FORMS LIST */ 110 47 function cm_hipaa_get_submitted_forms_list() { … … 923 860 add_action( 'wp_ajax_cm_hipaa_get_file_upload_url', 'cm_hipaa_get_file_upload_url' ); 924 861 add_action( 'wp_ajax_nopriv_cm_hipaa_get_file_upload_url', 'cm_hipaa_get_file_upload_url' ); 862 863 /* REBUILD AND SAVE MISSING RAW FIELD ARRAY */ 864 function cm_hipaa_rebuild_form_fields() { 865 if (isset($_REQUEST)) { 866 $formId = ''; 867 if(isset($_REQUEST['form_id'])) { 868 $formId = intval($_REQUEST['form_id']); 869 } 870 871 $sanitizedFormFields = array(); 872 if (isset($_REQUEST['form_fields'])) { 873 $formFields = $_REQUEST['form_fields']; // ARRAY OF ENTIRE FIELDS 874 875 // SANITIZE ARRAY 876 foreach($formFields as $formField) { 877 $formFieldItem = array(); 878 foreach($formField as $key => $value) { 879 $formFieldKey = sanitize_text_field($key); 880 $formFieldValue = sanitize_text_field($value); 881 $formFieldItem[$formFieldKey] = $formFieldValue; 882 } 883 884 array_push($sanitizedFormFields, $formFieldItem); 885 } 886 } 887 888 $nonce = ''; 889 if(isset($_REQUEST['nonce'])) { 890 $nonce = sanitize_text_field($_REQUEST['nonce']); 891 } 892 893 if(!wp_verify_nonce($nonce, 'cm-hipaa-admin-nonce')) { 894 $results = array( 895 'error' => 'Nonce expired, please refresh the page. If the error persists please contact the site administrator' 896 ); 897 898 echo json_encode($results); 899 } else { 900 $security = wp_create_nonce('rebuildFormFields'); 901 $hipaaForms = new cmHipaaForms; 902 echo $hipaaForms->rebuildFormFields($formId, $sanitizedFormFields, $security); 903 } 904 } 905 906 die(); 907 } 908 add_action( 'wp_ajax_cm_hipaa_rebuild_form_fields', 'cm_hipaa_rebuild_form_fields' ); 909 add_action( 'wp_ajax_nopriv_cm_hipaa_rebuild_form_fields', 'cm_hipaa_rebuild_form_fields' ); 925 910 926 911 /* EXPORT FORM */ … … 1247 1232 // GET CALDERA FORM DATA 1248 1233 $calderaFormData = Caldera_Forms_Forms::get_form($formId); 1249 $calderaFormName = $calderaFormData['name']; 1250 $calderaFormDataMailer = $calderaFormData['mailer']; 1251 $calderaFormSenderName = $calderaFormDataMailer['sender_name']; 1252 $calderaFormSenderEmail = $calderaFormDataMailer['sender_email']; 1253 $calderaFormRecipients = $calderaFormDataMailer['recipients']; 1254 $calderaFormBccTo = $calderaFormDataMailer['bcc_to']; 1255 $calderaFormSubject = $calderaFormDataMailer['email_subject']; 1256 $fieldsData = $calderaFormData['fields']; 1234 1235 $calderaFormName = ''; 1236 if(isset($calderaFormData['name'])) { 1237 $calderaFormName = $calderaFormData['name']; 1238 } 1239 1240 $calderaFormDataMailer = ''; 1241 if(isset($calderaFormData['mailer'])) { 1242 $calderaFormDataMailer = $calderaFormData['mailer']; 1243 } 1244 1245 $calderaFormSenderName = ''; 1246 if(isset($calderaFormDataMailer['sender_name'])) { 1247 $calderaFormSenderName = $calderaFormDataMailer['sender_name']; 1248 } 1249 1250 $calderaFormSenderEmail = ''; 1251 if(isset($calderaFormDataMailer['sender_email'])) { 1252 $calderaFormSenderEmail = $calderaFormDataMailer['sender_email']; 1253 } 1254 1255 $calderaFormRecipients = ''; 1256 if(isset($calderaFormDataMailer['recipients'])) { 1257 $calderaFormRecipients = $calderaFormDataMailer['recipients']; 1258 } 1259 1260 $calderaFormBccTo = ''; 1261 if(isset($calderaFormDataMailer['bcc_to'])) { 1262 $calderaFormBccTo = $calderaFormDataMailer['bcc_to']; 1263 } 1264 1265 $calderaFormSubject = ''; 1266 if(isset($calderaFormDataMailer['email_subject'])) { 1267 $calderaFormSubject = $calderaFormDataMailer['email_subject']; 1268 } 1269 1270 $fieldsData = ''; 1271 if(isset($calderaFormData['fields'])) { 1272 $fieldsData = $calderaFormData['fields']; 1273 } 1257 1274 1258 1275 // SET NOTIFICATION EMAIL FROM NAME … … 1565 1582 $phone = sanitize_text_field($_REQUEST['phone']); 1566 1583 } 1567 $formFields = ''; 1568 if(isset($_REQUEST['formFields'])) { 1584 1585 $sanitizedFormFields = array(); 1586 if (isset($_REQUEST['formFields'])) { 1569 1587 $formFields = $_REQUEST['formFields']; // ARRAY OF ENTIRE FIELDS 1570 } 1588 1589 // SANITIZE ARRAY 1590 foreach($formFields as $formField) { 1591 $formFieldItem = array(); 1592 foreach($formField as $key => $value) { 1593 $formFieldKey = sanitize_text_field($key); 1594 $formFieldValue = sanitize_text_field($value); 1595 $formFieldItem[$formFieldKey] = $formFieldValue; 1596 } 1597 1598 array_push($sanitizedFormFields, $formFieldItem); 1599 } 1600 } 1601 1571 1602 $formHtml = ''; 1572 1603 if(isset($_REQUEST['formHtml'])) { … … 1578 1609 } 1579 1610 $nononce = ''; 1580 $nonce = '';1581 1611 if(isset($_REQUEST['nononce'])) { 1582 1612 $nononce = sanitize_text_field($_REQUEST['nononce']); 1583 1613 } 1614 $nonce = ''; 1584 1615 if(isset($_REQUEST['nonce'])) { 1585 1616 $nonce = sanitize_text_field($_REQUEST['nonce']); … … 1659 1690 } else { 1660 1691 $gravityFormMeta = RGFormsModel::get_form_meta($formIdStripped); 1661 $gravityFormName = $gravityFormMeta['title']; 1662 $gravityFormNotifications = $gravityFormMeta['notifications']; 1692 1693 $gravityFormName = ''; 1694 if(isset($gravityFormMeta['title'])) { 1695 $gravityFormName = $gravityFormMeta['title']; 1696 } 1697 1698 $gravityFormNotifications = ''; 1699 if(isset($gravityFormMeta['notifications'])) { 1700 $gravityFormNotifications = $gravityFormMeta['notifications']; 1701 } 1663 1702 1664 1703 $gravityNotificationRecipients = ''; … … 1671 1710 // GET GRAVITY NOTIFICATION VALUES 1672 1711 foreach($gravityFormNotifications as $gravityFormNotification) { 1673 $gravityNotificationRecipients = $gravityFormNotification['to']; 1674 $gravityNotificationSenderName = $gravityFormNotification['fromName'] ?? ''; 1675 $gravityNotificationSenderEmail = $gravityFormNotification['from'] ?? ''; 1676 $gravityNotificationBccTo = $gravityFormNotification['bcc'] ?? ''; 1677 $gravityNotificationSubject = $gravityFormNotification['subject']; 1712 if(isset($gravityFormNotification['to'])) { 1713 $gravityNotificationRecipients = $gravityFormNotification['to']; 1714 } 1715 if(isset($gravityFormNotification['fromName'])) { 1716 $gravityNotificationSenderName = $gravityFormNotification['fromName']; 1717 } 1718 if(isset($gravityFormNotification['from'])) { 1719 $gravityNotificationSenderEmail = $gravityFormNotification['from']; 1720 } 1721 if(isset($gravityFormNotification['bcc'])) { 1722 $gravityNotificationBccTo = $gravityFormNotification['bcc']; 1723 } 1724 if(isset($gravityFormNotification['subject'])) { 1725 $gravityNotificationSubject = $gravityFormNotification['subject']; 1726 } 1678 1727 1679 1728 // REPLACE MERGE TAGS IF USED … … 1832 1881 1833 1882 $fields = array(); 1834 foreach ($ formFields as $key => $value) {1883 foreach ($sanitizedFormFields as $key => $value) { 1835 1884 $fieldId = ''; 1836 1885 if(isset($value['field_id'])) { … … 1838 1887 } 1839 1888 1840 $fieldLabel = strip_tags($value['label']); 1841 $optionLabel = strip_tags($value['option_label']); 1842 $optionValue = sanitize_text_field($value['option_value']); 1843 $fieldValue = sanitize_text_field($value['value']); 1844 $optionText = trim($value['option_text']); 1845 $fieldType = sanitize_text_field($value['field_type']); 1889 $fieldLabel = ''; 1890 if(isset($value['label'])) { 1891 $fieldLabel = strip_tags($value['label']); 1892 } 1893 1894 $optionLabel = ''; 1895 if(isset($value['option_label'])) { 1896 $optionLabel = strip_tags($value['option_label']); 1897 } 1898 1899 $optionValue = ''; 1900 if(isset($value['option_value'])) { 1901 $optionValue = $value['option_value']; 1902 } 1903 1904 $fieldValue = ''; 1905 if(isset($value['value'])) { 1906 $fieldValue = $value['value']; 1907 } 1908 1909 $optionText = ''; 1910 if(isset($value['option_text'])) { 1911 $optionText = trim($value['option_text']); 1912 } 1913 1914 $fieldType = ''; 1915 if(isset($value['field_type'])) { 1916 $fieldType = $value['field_type']; 1917 } 1846 1918 1847 1919 // PUSH FIELD TO ARRAY -
codemonkeys-hipaa-forms/trunk/css/admin-style.css
r2949557 r2958937 1 1 /** 2 2 * Created by Spencer on 7/16/2018. 3 * V2.9. 73 * V2.9.8 4 4 */ 5 5 -
codemonkeys-hipaa-forms/trunk/css/style.css
r2949557 r2958937 1 1 /** 2 2 * Created by Spencer on 7/16/2018. 3 * V2.9. 73 * V2.9.8 4 4 */ 5 5 -
codemonkeys-hipaa-forms/trunk/enqueue.php
r2949557 r2958937 41 41 // ENQUEUE SCRIPT 42 42 wp_enqueue_script( 'jquery-form' ); 43 wp_enqueue_script( 'cmHipaaAdminBuggyFill', plugin_dir_url(__FILE__) . 'js/viewport-units-buggyfill.js', array('jquery'), '2.9. 7', true );44 wp_enqueue_script( 'cmHipaaAdminBuggyFillHack', plugin_dir_url(__FILE__) . 'js/viewport-units-buggyfill.hacks.js', array('jquery'), '2.9. 7', true );45 wp_enqueue_script( 'cmHipaaAdminScript', plugin_dir_url(__FILE__) . 'js/admin-script.js', array('jquery'), '2.9. 7', true );46 wp_enqueue_script( 'cm-hipaa-signature', plugin_dir_url(__FILE__) . 'js/jSignature/jSignature.min.noconflict.js', array('jquery'), '2.9. 7', true);47 wp_enqueue_script( 'cm-hipaa-jquery-print', plugin_dir_url(__FILE__) . 'js/printThis.js', array('jquery'), '2.9. 7', true);43 wp_enqueue_script( 'cmHipaaAdminBuggyFill', plugin_dir_url(__FILE__) . 'js/viewport-units-buggyfill.js', array('jquery'), '2.9.8', true ); 44 wp_enqueue_script( 'cmHipaaAdminBuggyFillHack', plugin_dir_url(__FILE__) . 'js/viewport-units-buggyfill.hacks.js', array('jquery'), '2.9.8', true ); 45 wp_enqueue_script( 'cmHipaaAdminScript', plugin_dir_url(__FILE__) . 'js/admin-script.js', array('jquery'), '2.9.8', true ); 46 wp_enqueue_script( 'cm-hipaa-signature', plugin_dir_url(__FILE__) . 'js/jSignature/jSignature.min.noconflict.js', array('jquery'), '2.9.8', true); 47 wp_enqueue_script( 'cm-hipaa-jquery-print', plugin_dir_url(__FILE__) . 'js/printThis.js', array('jquery'), '2.9.8', true); 48 48 }; 49 49 }; … … 74 74 75 75 // ENQUEUE CUSTOM JS 76 wp_enqueue_script( 'cmHipaaBuggyFill', plugin_dir_url(__FILE__) . 'js/viewport-units-buggyfill.js', array('jquery'), '2.9. 7', true );77 wp_enqueue_script( 'cmHipaaBuggyFillHack', plugin_dir_url(__FILE__) . 'js/viewport-units-buggyfill.hacks.js', array('jquery'), '2.9. 7', true );78 wp_enqueue_script('cm-hipaa-script', plugin_dir_url(__FILE__) . 'js/script.js', array('jquery'), '2.9. 7&time=' . time(), true);79 wp_enqueue_script('cm-hipaa-signature', plugin_dir_url(__FILE__) . 'js/jSignature/jSignature.min.noconflict.js', array('jquery'), '2.9. 7', true);76 wp_enqueue_script( 'cmHipaaBuggyFill', plugin_dir_url(__FILE__) . 'js/viewport-units-buggyfill.js', array('jquery'), '2.9.8', true ); 77 wp_enqueue_script( 'cmHipaaBuggyFillHack', plugin_dir_url(__FILE__) . 'js/viewport-units-buggyfill.hacks.js', array('jquery'), '2.9.8', true ); 78 wp_enqueue_script('cm-hipaa-script', plugin_dir_url(__FILE__) . 'js/script.js', array('jquery'), '2.9.8&time=' . time(), true); 79 wp_enqueue_script('cm-hipaa-signature', plugin_dir_url(__FILE__) . 'js/jSignature/jSignature.min.noconflict.js', array('jquery'), '2.9.8', true); 80 80 81 81 // CHECK IF HOMEPAGE -
codemonkeys-hipaa-forms/trunk/hipaa-forms.php
r2949557 r2958937 10 10 * Plugin URI: https://www.hipaaforms.online 11 11 * Description: HIPAA Compliant Forms 12 * Version: 2.9. 712 * Version: 2.9.8 13 13 * Author: Code Monkeys LLC 14 14 * Author URI: https://www.codemonkeysllc.com -
codemonkeys-hipaa-forms/trunk/includes/class-cm-hipaa.php
r2848460 r2958937 2247 2247 $results = array( 2248 2248 'success' => 'success', 2249 'form_id' => $formId, 2249 2250 'form' => $form, 2250 2251 'files' => $files … … 5352 5353 } 5353 5354 5355 /*** REBUILD MISSING FORM FIELDS ARRAY ***/ 5356 public function rebuildFormFields($formId, $formFields, $security) { 5357 if(!wp_verify_nonce($security, 'rebuildFormFields')){ 5358 return json_encode(array('error' => 'There was an error: NONCE EXPIRED')); 5359 }else { 5360 // GET LICENCE KEY 5361 $licenseKey = esc_attr(get_option('license_key')); 5362 5363 /* GET ENCRYPT KEYS */ 5364 $encryptKey = ''; 5365 $encryptIV = ''; 5366 // Create curl resource 5367 $curl = curl_init(self::CURL_URL); 5368 5369 // Create post data 5370 $curl_post_data = array( 5371 'form_id' => $formId, 5372 'plugin_version' => HIPAAFORMS_CURRENT_VERSION 5373 ); 5374 5375 // Assign curl settings 5376 curl_setopt($curl, CURLOPT_HTTPHEADER, array( 5377 'Action: getencryptkeys', 5378 'License-Key: ' . $licenseKey 5379 )); 5380 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 5381 curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($curl_post_data)); 5382 curl_setopt($curl, CURLOPT_REFERER, get_site_url()); 5383 5384 $output = json_decode(curl_exec($curl)); 5385 5386 // Close curl resource to free up system resources 5387 curl_close($curl); 5388 5389 if ($output) { 5390 foreach ($output as $data) { 5391 $error = ''; 5392 if (isset($data->error)) { 5393 $error = $data->error; 5394 } 5395 5396 if ($error) { 5397 $results = array( 5398 'error' => $error 5399 ); 5400 } else { 5401 $success = $data->success; 5402 5403 if ($success == 'success') { 5404 if (isset($data->encrypt_key)) { 5405 $encryptKey = $data->encrypt_key; 5406 } 5407 5408 if (isset($data->encrypt_iv)) { 5409 $encryptIV = $data->encrypt_iv; 5410 } 5411 5412 $results = array( 5413 'encrypt_key' => $encryptKey, 5414 'encrypt_iv' => $encryptIV 5415 ); 5416 } else { 5417 $results = array( 5418 'error' => 'API did not return a success message' 5419 ); 5420 } 5421 } 5422 } 5423 } else { 5424 $results = array( 5425 'error' => 'No response from API' 5426 ); 5427 } 5428 5429 // ENCRYPT FORM FIELDS ARRAY 5430 $encryptedFields = self::encrypt(json_encode($formFields), $encryptKey, $encryptIV); 5431 5432 /* SEND ENCRYPTED FORM FIELDS TO API */ 5433 // Create curl resource 5434 //$curl_url = 'https://www.hipaaforms.online/hipaa-api'; 5435 $curl = curl_init(self::CURL_URL); 5436 5437 // Create post data 5438 $curl_post_data = array( 5439 'form_id' => $formId, 5440 'form_fields' => $encryptedFields, 5441 'plugin_version' => HIPAAFORMS_CURRENT_VERSION 5442 ); 5443 5444 // Assign curl settings 5445 curl_setopt($curl, CURLOPT_HTTPHEADER, array( 5446 'Action: rebuildformfields', 5447 'License-Key: ' . $licenseKey 5448 )); 5449 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 5450 curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($curl_post_data)); 5451 curl_setopt($curl, CURLOPT_REFERER, get_site_url()); 5452 5453 $output = json_decode(curl_exec($curl)); 5454 5455 // Close curl resource to free up system resources 5456 curl_close($curl); 5457 5458 if ($output) { 5459 foreach ($output as $data) { 5460 $error = ''; 5461 if (isset($data->error)) { 5462 $error = $data->error; 5463 } 5464 5465 if ($error) { 5466 $results = array( 5467 'error' => $error 5468 ); 5469 } else { 5470 $success = $data->success; 5471 5472 if ($success == 'success') { 5473 $results = array( 5474 'success' => 'success' 5475 ); 5476 } 5477 } 5478 } 5479 } else { 5480 $results = array( 5481 'error' => 'No response from API' 5482 ); 5483 } 5484 5485 return json_encode($results); 5486 } 5487 } 5488 5354 5489 /**** EXPORT FORM ***/ 5355 5490 public function exportForm($formId, $includeNotes, $security) { … … 5507 5642 $decryptedFields = json_decode(self::decrypt($formFields, $encryptKey, $encryptIv)); 5508 5643 $fields[] = $decryptedFields; 5644 5645 // IF DECRYPTED FIELDS IS EMPTY 5646 if(is_array($decryptedFields) && empty($decryptedFields)) { 5647 $results = array( 5648 'error' => 'EMPTY', 5649 'content' => 'Decrypted Fields Array is Empty', 5650 'form_id' => $formId 5651 ); 5652 5653 return json_encode($results); 5654 } 5655 } else { 5656 $results = array( 5657 'error' => 'EMPTY', 5658 'content' => 'Form fields is empty', 5659 'form_id' => $formId 5660 ); 5661 5662 return json_encode($results); 5509 5663 } 5510 5664 } … … 5524 5678 'domain' => $domain, 5525 5679 'date' => $formDate, 5526 'fields' => $fields 5680 'fields' => $fields, 5681 'form_fields' => $formFields 5527 5682 ); 5528 5683 } else { … … 5675 5830 5676 5831 if (is_array($formsData) && !empty($formsData)) { 5832 // LOOP FORMS & CHECK FOR MISSING/EMPTY FORM FIELDS 5833 $emptyForms = array(); 5834 foreach ($formsData as $formData) { 5835 $form = $formData[0]; 5836 $formId = $form->form_id; 5837 $formFields = $form->fields; 5838 $encryptKey = $form->encrypt_key; 5839 $encryptIv = $form->encrypt_iv; 5840 5841 // DECRYPT FORM FIELDS 5842 $decryptedFields = ''; 5843 if ($formFields) { 5844 $decryptedFields = json_decode(self::decrypt($formFields, $encryptKey, $encryptIv)); 5845 } 5846 5847 if(!$formFields || is_array($decryptedFields) && empty($decryptedFields)) { 5848 array_push($emptyForms, $formId); 5849 } 5850 } 5851 5852 if($emptyForms && is_array($emptyForms) && !empty($emptyForms)) { 5853 $results = array( 5854 'error' => 'Empty form fields', 5855 'form_ids' => $emptyForms 5856 ); 5857 5858 return json_encode($results); 5859 } 5860 5677 5861 // LOOP FORMS 5678 5862 $forms = array(); … … 6191 6375 6192 6376 /* 6193 * FRONT END CLASSES6377 * FRONT END METHODS 6194 6378 */ 6195 6379 -
codemonkeys-hipaa-forms/trunk/js/admin-script.js
r2949557 r2958937 2 2 * Created by Spencer on 7/16/2018. 3 3 * Updated by Dan on 7/27/2022. 4 * V2.9. 74 * V2.9.8 5 5 * Updated: 09/09/2022 by Dan 6 6 */ … … 2316 2316 /*** EXPORT FORM ***/ 2317 2317 function cmHipaaExportForm(formId) { 2318 //var nonce = hipaaScript.nonce;2319 2318 var resultsEle = jQuery('.cm-hipaa-submitted-form-export-results[data-form-id="' + formId + '"]'); 2320 2319 … … 2331 2330 success: function (data) { 2332 2331 var exportData = JSON.parse(data); 2333 var formId = exportData.form_id; 2334 var formName = exportData.form_name.replace(/ /g,"_"); 2335 var firstName = exportData.first_name; 2336 var lastName = exportData.last_name; 2337 var email = exportData.email; 2338 var phone = exportData.phone; 2339 var location = exportData.location; 2340 var domain = exportData.domain; 2341 var date = exportData.date; 2342 var formFields = exportData.fields; 2343 2344 if(exportData) { 2345 // TODO: FORMAT FIELDS AND REPLACE FAKE PATHS AND CHECKMARK IMAGES 2346 var csv = ''; 2347 2348 jQuery.each(formFields, function() { 2349 // Loop the array of objects 2350 var fields = jQuery(this); 2351 2352 for(var row = 0; row < fields.length; row++) { 2353 // ADD FORM_ID, FORM_NAME, FIRST_NAME & LAST_NAME TO FORMFIELDS ARRAY 2354 fields[row]['form_id'] = formId; 2355 fields[row]['form_name'] = formName; 2356 fields[row]['first_name'] = firstName; 2357 fields[row]['last_name'] = lastName; 2358 fields[row]['email'] = email; 2359 fields[row]['phone'] = phone; 2360 fields[row]['location'] = location; 2361 fields[row]['domain'] = domain; 2362 fields[row]['date'] = date; 2363 } 2364 2365 for(var row = 0; row < fields.length; row++) { 2366 var keysAmount = Object.keys(fields[row]).length; 2367 var keysCounter = 1; 2368 var valuesCounter = 1; 2369 2370 // If this is the first row, generate the headings 2371 if(row === 0){ 2372 // Loop each property of the object 2373 for(var headKey in fields[row]) { 2374 // This is to not add a comma at the last cell 2375 // The '\r\n' adds a new line 2376 csv += headKey + (keysCounter < keysAmount ? ',' : '\r\n' ); 2377 keysCounter++; 2332 var dataError = exportData.error; 2333 2334 if(dataError === 'EMPTY') { 2335 console.log('ERROR: ' + exportData.content); 2336 // REBUILD FIELDS ARRAY 2337 cmHipaaRebuildFieldsArray(exportData.form_id, 'single'); 2338 } else { 2339 var formId = exportData.form_id; 2340 var formName = exportData.form_name.replace(/ /g, "_"); 2341 var firstName = exportData.first_name; 2342 var lastName = exportData.last_name; 2343 var email = exportData.email; 2344 var phone = exportData.phone; 2345 var location = exportData.location; 2346 var domain = exportData.domain; 2347 var date = exportData.date; 2348 var formFields = exportData.fields; 2349 2350 if (formFields && formFields !== 'null') { 2351 // TODO: FORMAT FIELDS AND REPLACE FAKE PATHS AND CHECKMARK IMAGES 2352 var csv = ''; 2353 2354 jQuery.each(formFields, function () { 2355 // Loop the array of objects 2356 var fields = jQuery(this); 2357 2358 for (var row = 0; row < fields.length; row++) { 2359 // ADD FORM_ID, FORM_NAME, FIRST_NAME & LAST_NAME TO FORMFIELDS ARRAY 2360 fields[row]['form_id'] = formId; 2361 fields[row]['form_name'] = formName; 2362 fields[row]['first_name'] = firstName; 2363 fields[row]['last_name'] = lastName; 2364 fields[row]['email'] = email; 2365 fields[row]['phone'] = phone; 2366 fields[row]['location'] = location; 2367 fields[row]['domain'] = domain; 2368 fields[row]['date'] = date; 2369 } 2370 2371 for (var row = 0; row < fields.length; row++) { 2372 var keysAmount = Object.keys(fields[row]).length; 2373 var keysCounter = 1; 2374 var valuesCounter = 1; 2375 2376 // If this is the first row, generate the headings 2377 if (row === 0) { 2378 // Loop each property of the object 2379 for (var headKey in fields[row]) { 2380 // This is to not add a comma at the last cell 2381 // The '\r\n' adds a new line 2382 csv += headKey + (keysCounter < keysAmount ? ',' : '\r\n'); 2383 keysCounter++; 2384 } 2378 2385 } 2386 2387 if (!fields[row]['field_id'] && fields[row]['label'] === 'Signature') { 2388 // IGNORE DRAG 'N DRAW SIGNATURE FIELD 2389 } else { 2390 for (var valKey in fields[row]) { 2391 var fieldValue; 2392 2393 if (fields[row][valKey]) { 2394 if (typeof fields[row][valKey] === 'string' || fields[row][valKey] instanceof String) { 2395 fieldValue = fields[row][valKey].trim().replace(/,/g, ';').replace(/(\r\n|\n|\r)/gm, ';'); 2396 } else { 2397 // IF VALUE IS OBJECT ARRAY LIKE FROM MULTISELECT, JOIN VALUES TO STRING 2398 if (Array.isArray(fields[row][valKey])) { 2399 fieldValue = fields[row][valKey].join(';'); 2400 fieldValue = fieldValue.trim().replace(/,/g, ';'); 2401 } else { 2402 fieldValue = fields[row][valKey]; 2403 } 2404 } 2405 } else { 2406 fieldValue = 'NA'; 2407 } 2408 2409 csv += fieldValue + (valuesCounter < keysAmount ? ',' : '\r\n'); 2410 valuesCounter++; 2411 } 2412 } 2413 2414 keysCounter = 1; 2415 valuesCounter = 1; 2379 2416 } 2380 2381 if(!fields[row]['field_id'] && fields[row]['label'] === 'Signature') { 2382 // IGNORE DRAG 'N DRAW SIGNATURE FIELD 2383 } else { 2384 for (var valKey in fields[row]) { 2385 var fieldValue; 2386 2387 if (fields[row][valKey]) { 2388 if(typeof fields[row][valKey] === 'string' || fields[row][valKey] instanceof String) { 2389 fieldValue = fields[row][valKey].trim().replace(/,/g, ';').replace(/(\r\n|\n|\r)/gm,';'); 2390 } else { 2391 // IF VALUE IS OBJECT ARRAY LIKE FROM MULTISELECT, JOIN VALUES TO STRING 2392 if(Array.isArray(fields[row][valKey])) { 2393 fieldValue = fields[row][valKey].join(';'); 2394 fieldValue = fieldValue.trim().replace(/,/g, ';'); 2395 } else { 2396 fieldValue = fields[row][valKey]; 2397 } 2398 } 2399 } else { 2400 fieldValue = 'NA'; 2401 } 2402 2403 csv += fieldValue + (valuesCounter < keysAmount ? ',' : '\r\n'); 2404 valuesCounter++; 2405 } 2406 } 2407 2408 keysCounter = 1; 2409 valuesCounter = 1; 2410 } 2411 }); 2412 2413 // Once we are done looping, download the .csv by creating a link 2414 var link = document.createElement('a'); 2415 link.id = 'download-form-csv-' + formId; 2416 link.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(csv)); 2417 link.setAttribute('download', 'hipaa_form_' + formId + '.csv'); 2418 document.body.appendChild(link); 2419 document.querySelector('#download-form-csv-' + formId).click(); 2420 2421 resultsEle.html(''); 2422 } else { 2423 resultsEle.html('No results'); 2417 }); 2418 2419 // Once we are done looping, download the .csv by creating a link 2420 var link = document.createElement('a'); 2421 link.id = 'download-form-csv-' + formId; 2422 link.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(csv)); 2423 link.setAttribute('download', 'hipaa_form_' + formId + '.csv'); 2424 document.body.appendChild(link); 2425 document.querySelector('#download-form-csv-' + formId).click(); 2426 2427 resultsEle.html(''); 2428 } else { 2429 resultsEle.html('No results, form fields empty'); 2430 } 2424 2431 } 2425 2432 }, … … 2645 2652 var exportData = JSON.parse(data); 2646 2653 var formsSet = exportData.forms; 2654 2655 if(exportData.error === 'Empty form fields') { 2656 const emptyFormIds = exportData.form_ids; 2657 console.log('ERROR: Forms ' + emptyFormIds + ' missing fields data, rebuilding fields data now...'); 2658 2659 if(emptyFormIds && Array.isArray(emptyFormIds)) { 2660 buildHiddenForms(emptyFormIds); 2661 } else { 2662 console.log('Form fields empty but no form IDs found'); 2663 } 2664 2665 return false; 2666 } 2647 2667 2648 2668 jQuery.each(formsSet, function(formsIndex, formsValue) { … … 2759 2779 } 2760 2780 } 2781 2782 /*** REBUILD EMPTY FIELDS ARRAY ***/ 2783 function cmHipaaRebuildFieldsArray(formId, type, isLast) { 2784 let formWrapper; 2785 if(type === 'single') { 2786 formWrapper = jQuery('#cm-submitted-form-wrapper-' + formId); 2787 } else if(type === 'bulk') { 2788 formWrapper = jQuery('#cm-hidden-submitted-form-wrapper-' + formId); 2789 } 2790 2791 // REMOVE JUNK FROM HTML WE DON'T WANT PASSED INTO VALUES 2792 formWrapper.find('.screen-reader-text, .gfield_required').remove(); 2793 2794 // GET FIELDS 2795 const fields = formWrapper.find('.gfield'); 2796 let formFields = []; 2797 2798 jQuery.each(fields, function() { 2799 const thisField = jQuery(this); 2800 const fieldId = thisField.attr('id'); 2801 const legend = thisField.find('legend').text(); 2802 const label = thisField.find('label').text(); 2803 const fieldClass = thisField.attr('class'); 2804 const fieldClassArr = fieldClass.split(' '); 2805 const typeClass = fieldClassArr.filter(p => String(p).startsWith('gfield--type')); 2806 const fieldType = typeClass[0].split('-').pop(); 2807 let fieldValue = ''; 2808 2809 // SET LABEL VALUE (SOME FIELDS HAVE A LEGEND) 2810 let labelValue; 2811 if(legend) { 2812 labelValue = legend; 2813 } else { 2814 labelValue = label; 2815 } 2816 2817 // SET CHECKBOX OR RADIO FIELD LABEL AND INPUT LABEL 2818 if (fieldType === 'checkbox' || fieldType === 'radio') { 2819 let optionFieldWrapper = thisField.find('.cm-hipaa-forms-radio-checked-wrapper, .cm-hipaa-forms-radio-not-checked-wrapper, .cm-hipaa-forms-checkbox-checked-wrapper, .cm-hipaa-forms-checkbox-not-checked-wrapper'); 2820 2821 jQuery.each(optionFieldWrapper, function(index) { 2822 let optionLabelEle; 2823 let optionId = ''; 2824 let optionLabel = ''; 2825 2826 optionLabelEle = jQuery(this).find('label'); 2827 optionId = optionLabelEle.attr('for'); 2828 2829 if(!optionLabelEle || optionLabelEle.length === 0) { 2830 optionLabelEle = jQuery(this).find('.gform-field-label'); 2831 optionId = fieldId + '_' + index; 2832 } 2833 2834 optionLabel = optionLabelEle.text().trim(); 2835 2836 if(jQuery(this).hasClass('cm-hipaa-forms-radio-checked-wrapper') || jQuery(this).hasClass('cm-hipaa-forms-checkbox-checked-wrapper')) { 2837 fieldValue = 'checked'; 2838 } else { 2839 fieldValue = ''; 2840 } 2841 2842 formFields.push({ 2843 'field_id': optionId, 2844 'label': labelValue, 2845 'option_label': optionLabel, 2846 'option_value': optionLabel, 2847 'option_text': '', 2848 'value': fieldValue, 2849 'field_type': fieldType 2850 }); 2851 }); 2852 } else if(fieldType === 'list') { 2853 const listGroups = thisField.find('.gfield_list_group'); 2854 const listHeaders = thisField.find('.gform-field-label.gfield_header_item'); 2855 let listItems = []; 2856 2857 // LOOP LIST GROUPS 2858 jQuery.each(listGroups, function() { 2859 const listGroup = jQuery(this); 2860 2861 // IF HEADERS EXIST 2862 if (listHeaders && listHeaders.length > 0) { 2863 // LOOP HEADERS 2864 jQuery.each(listHeaders, function (index) { 2865 // GET GROUP ITEMS WITHIN THIS GROUP 2866 const listGroupItem = listGroup.find('.gfield_list_group_item:eq(' + index + ')').find('span'); 2867 let listHeader = listGroupItem.attr('aria-label'); 2868 // REPLACE COMMA WITH SEMICOLON 2869 listHeader = listHeader.replace(',', ';'); 2870 const listValue = listGroupItem.text().trim(); 2871 2872 listItems.push(listHeader + ':' + listValue); 2873 }); 2874 } else { 2875 const listItemEles = listGroup.find('.gfield_list_group_item'); 2876 2877 jQuery.each(listItemEles, function () { 2878 listItems.push(jQuery(this).text().trim()); 2879 }); 2880 } 2881 }); 2882 2883 fieldValue = listItems.join(' - '); 2884 2885 formFields.push({ 2886 'field_id': fieldId, 2887 'label': labelValue, 2888 'option_label': '', 2889 'option_value': '', 2890 'option_text': '', 2891 'value': fieldValue, 2892 'field_type': fieldType 2893 }); 2894 } else { 2895 fieldValue = thisField.find('.ginput_container').text().trim(); 2896 2897 formFields.push({ 2898 'field_id': fieldId, 2899 'label': labelValue, 2900 'option_label': '', 2901 'option_value': '', 2902 'option_text': '', 2903 'value': fieldValue, 2904 'field_type': fieldType 2905 }); 2906 } 2907 }); 2908 2909 // ADD PRIVACY FIELD 2910 const privacyFieldWrapper = formWrapper.find('.cm-hipaa-forms-privacy-statement'); 2911 if(privacyFieldWrapper) { 2912 const privacyLabelEle = privacyFieldWrapper.find('label'); 2913 const privacyLabel = privacyLabelEle.text().trim(); 2914 const privacyOptionLabel = privacyFieldWrapper.find('.cm-hipaa-forms-checkbox-value').text().trim(); 2915 2916 let privacyFieldValue = ''; 2917 if(privacyFieldWrapper.hasClass('cm-hipaa-forms-checkbox-checked-wrapper')) { 2918 privacyFieldValue = 'checked'; 2919 } 2920 2921 formFields.push({ 2922 'field_id': 'cm-hipaa-forms-privacy-agree', 2923 'label': 'Privacy Agreement', 2924 'option_label': privacyLabel, 2925 'option_value': privacyOptionLabel, 2926 'option_text': '', 2927 'value': privacyFieldValue, 2928 'field_type': 'checkbox' 2929 }); 2930 } 2931 //console.log(formFields); 2932 2933 jQuery.ajax({ 2934 method: 'POST', 2935 type: 'POST', 2936 url: hipaaScript.ajax_url, 2937 data: { 2938 'action': 'cm_hipaa_rebuild_form_fields', 2939 'form_id': formId, 2940 'form_fields': formFields, 2941 'nonce': hipaaScript.nonce 2942 }, 2943 success: function (data) { 2944 const results = JSON.parse(data); 2945 2946 if(results.success === 'success') { 2947 if(type === 'single') { 2948 console.log('Fields data for form ID ' + formId + ' successfully rebuilt, continuing to export...'); 2949 2950 // RE-RUN EXPORT 2951 cmHipaaExportForm(formId); 2952 } else if(type === 'bulk') { 2953 console.log('Fields data for form ID ' + formId + ' successfully rebuilt'); 2954 2955 // REMOVE HIDDEN FORM ELEMENT 2956 jQuery('#cm-hidden-submitted-form-wrapper-' + formId).remove(); 2957 console.log('Form ID ' + formId + ' HTML removed'); 2958 2959 if(isLast === true || isLast === 'true') { 2960 // IF LAST FORM IN BULK LOOP 2961 console.log('All field data rebuilt for all forms, continuing to export...'); 2962 2963 // GET FORM ID'S TO EXPORT 2964 const formIds = jQuery('.cm-hipaa-forms-bulk-export-button').attr('data-form-ids'); 2965 2966 // RE-RUN BULK EXPORT 2967 cmHipaaBulkFormExport(formIds); 2968 } else { 2969 console.log('Rebuilding fields data for next form...'); 2970 } 2971 } 2972 } else { 2973 console.log('Error rebuilding fields data: ' + results.error); 2974 } 2975 }, 2976 error: function (errorThrown) { 2977 console.log(errorThrown); 2978 } 2979 }); 2980 } 2981 2982 async function buildHiddenForms(formIds = []) { 2983 // LOOP EMPTY FORM ID'S 2984 for(let i = 0; i < formIds.length; i++) { 2985 let isLast = false; 2986 let result; 2987 try { 2988 result = await jQuery.ajax({ 2989 method: 'POST', 2990 type: 'POST', 2991 url: hipaaScript.ajax_url, 2992 data: { 2993 'action': 'cm_hipaa_get_submitted_form', 2994 'form_id': formIds[i], 2995 'nonce': hipaaScript.nonce 2996 }, 2997 }); 2998 } catch (error) { 2999 result = { 3000 'error': error 3001 } 3002 console.error(error); 3003 } 3004 3005 let resultData; 3006 if(result) { 3007 resultData = JSON.parse(result); 3008 } 3009 3010 if(resultData.success === 'success') { 3011 // SET "isLast" TRUE IF LAST ITERATION 3012 if(i+1 === formIds.length) { 3013 isLast = true; 3014 } 3015 3016 // ADD FORM IN HIDDEN ELEMENT 3017 jQuery('.cm-hipaa-forms-bulk-export-wrapper').append('<div id="cm-hidden-submitted-form-wrapper-' + resultData.form_id + '" style="display:none">' + resultData.form + '</div>'); 3018 console.log('HTML form pulled for form ID ' + resultData.form_id); 3019 3020 // REBUILD MISSING FORM FIELDS DATA 3021 cmHipaaRebuildFieldsArray(resultData.form_id, 'bulk', isLast); 3022 } 3023 } 3024 3025 // EMPTY FIELDS VALUES 3026 // 2580 "U1oxYWhVNEh5dGJacS9uUWNPUEswdz09" 3027 // 2579 "cFV1cjVzVmU0NVByUzkxZDViMFZqdz09" 3028 // 2578 "aEE4ZlhRRWJDOUZhWHpNRmVDK2tBUT09" 3029 // 2577 "K0d5N1RHUm5BSUsxQ080SGJkc1JKQT09" 3030 // 2576 "WDFVdlF6TTN6MW41Y0prelhRYjh6QT09" 3031 // 2575 "b20ybG1nZGhlZ21TdjJHa1RCTE5BQT09" 3032 // 2574 "VnpMTUtUekR5a0tsWk5xUVNTQ0NRdz09" 3033 // 2573 "aUxqcFJ1U0lqTnhHWmUvOTZYaVRoUT09" 3034 // 2572 "WG5tOTRyT2hqMDJhSVllSVczZWZHQT09" 3035 // 2571 "dTFQZTBjUUlKL1I5Qi9JUkdRZHAwdz09" 3036 // 2570 "SkhkOVlKbHBnTUhmZEVXOVZIbzVHZz09" 3037 } -
codemonkeys-hipaa-forms/trunk/js/script.js
r2949557 r2958937 2 2 * Created by Spencer on 7/16/2018. 3 3 * Updated by Dan on 7/14/2023. 4 * V2.9. 74 * V2.9.8 5 5 */ 6 6 … … 3119 3119 submitButton.removeClass('inactive').addClass('active'); 3120 3120 } else { 3121 //console.log(formId); 3121 3122 //console.log(formFields); 3122 3123 //console.log(hiddenForm.html()); -
codemonkeys-hipaa-forms/trunk/readme.txt
r2949557 r2958937 3 3 Tags: hipaa forms, gravity forms, hipaa compliance, secure forms, health forms, medical forms 4 4 Requires at least: 5.4 5 Tested up to: 6. 2.56 Stable tag: 2.9. 75 Tested up to: 6.3.5 6 Stable tag: 2.9.8 7 7 License: GPLv2 8 8 … … 186 186 187 187 == Changelog == 188 V2.9.8 189 - Added fix to rebuild missing export data during export 190 188 191 V2.9.7 189 192 - Fixed empty export
Note: See TracChangeset
for help on using the changeset viewer.