7 * @link http://www.open-emr.org
8 * @author Jerry Padgett <sjpadgett@gmail.com>
9 * @author Brady Miller <brady.g.miller@gmail.com>
10 * @author Shiqiang Tao <StrongTSQ@gmail.com>
11 * @copyright Copyright (c) 2016-2019 Jerry Padgett <sjpadgett@gmail.com>
12 * @copyright Copyright (c) 2019-2020 Brady Miller <brady.g.miller@gmail.com>
13 * @copyright Copyright (c) 2020 Shiqiang Tao <StrongTSQ@gmail.com>
14 * @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
17 require_once("verify_session.php");
18 require_once("$srcdir/patient.inc");
19 require_once("$srcdir/options.inc.php");
20 require_once("lib/portal_mail.inc");
21 require_once(dirname(__FILE__
) . "/../library/appointments.inc.php");
23 use OpenEMR\Common\Csrf\CsrfUtils
;
24 use OpenEMR\Core\Header
;
26 if (isset($_SESSION['register']) && $_SESSION['register'] === true) {
27 require_once(dirname(__FILE__
) . "/../src/Common/Session/SessionUtil.php");
28 OpenEMR\Common\Session\SessionUtil
::portalSessionCookieDestroy();
29 header('Location: ' . $landingpage . '&w');
33 if (!isset($_SESSION['portal_init'])) {
34 $_SESSION['portal_init'] = true;
37 $whereto = 'profilecard';
38 if (isset($_SESSION['whereto'])) {
39 $whereto = $_SESSION['whereto'];
42 $user = isset($_SESSION['sessionUser']) ?
$_SESSION['sessionUser'] : 'portal user';
43 $result = getPatientData($pid);
45 $msgs = getPortalPatientNotes($_SESSION['portal_username']);
46 $msgcnt = count($msgs);
48 foreach ($msgs as $i) {
49 if ($i['message_status'] == 'New') {
59 <title
><?php
echo xlt('OpenEMR Portal'); ?
> |
<?php
echo xlt('Home'); ?
></title
>
60 <meta name
="description" content
="Developed By sjpadgett@gmail.com" />
65 function restoreSession() {
66 //dummy functions so the dlgopen function will work in the patient portal
73 echo "<script>var cpid=" . js_escape($pid) . ";var cuser=" . js_escape($user) . ";var webRoot=" . js_escape($GLOBALS['web_root']) . ";var ptName=" . js_escape($_SESSION['ptName']) . ";var webroot_url = webRoot;</script>";
75 Header
::setupHeader(['no_main-theme', 'datetime-picker', 'patientportal-style']); ?
>
77 <script src
="../interface/main/tabs/js/dialog_utils.js?v=<?php echo $v_js_includes; ?>"></script
>
78 <link href
="<?php echo $GLOBALS['web_root']; ?>/portal/sign/css/signer_modal.css?v=<?php echo $v_js_includes; ?>" rel
="stylesheet" />
80 <script src
="<?php echo $GLOBALS['web_root']; ?>/portal/sign/assets/signature_pad.umd.js?v=<?php echo $v_js_includes; ?>"></script
>
81 <script src
="<?php echo $GLOBALS['web_root']; ?>/portal/sign/assets/signer_api.js?v=<?php echo $v_js_includes; ?>"></script
>
83 <?php
if ($GLOBALS['payment_gateway'] == 'Stripe') { ?
>
84 <script src
="https://js.stripe.com/v3/"></script
>
86 <?php
if ($GLOBALS['payment_gateway'] == 'AuthorizeNet') {
87 // Must be loaded from their server
88 $script = "https://jstest.authorize.net/v1/Accept.js"; // test script
89 if ($GLOBALS['gateway_mode_production']) {
90 $script = "https://js.authorize.net/v1/Accept.js"; // Production script
92 <script src
="<?php echo $script; ?>"></script
>
97 if($
('body').css('direction') == "rtl") {
98 $
('.float-left').each(function() {
99 $
(this
).addClass('float-right').removeClass('float-left');
101 $
('.dropdown-menu-right').each(function() {
102 $
(this
).removeClass('dropdown-menu-right');
104 $
('.dropdown-menu-md-right').each(function() {
105 $
(this
).removeClass('dropdown-menu-md-right');
108 $
("#profilereport").load("get_profile.php", {}, function () {
109 $
("table").addClass("table");
110 $
(".demographics td").removeClass("label");
111 $
(".demographics td").addClass("bold");
112 $
(".insurance table").addClass("table-sm table-striped");
113 $
("#editDems").click(function () {
118 $
("#medicationlist").load("./get_medications.php", {}, function () {
120 $
("#labresults").load("./get_lab_results.php", {}, function () {
122 $
("#amendmentslist").load("./get_amendments.php", {}, function () {
124 $
("#problemslist").load("./get_problems.php", {}, function () {
126 $
("#allergylist").load("./get_allergies.php", {}, function () {
128 $
("#reports").load("./report/portal_patient_report.php?pid='<?php echo attr_url($pid) ?>'", {}, function () {
131 <?php
if ($GLOBALS['portal_two_payments']) { ?
>
132 $
("#payment").load("./portal_payment.php", {}, function () {
136 <?php
if ($GLOBALS['easipro_enable'] && !empty($GLOBALS['easipro_server']) && !empty($GLOBALS['easipro_name'])) { ?
>
137 $
("#pro").load("./get_pro.php", {}, function () {
141 $
(".generateDoc_download").click(function () {
142 $
("#doc_form").submit();
145 function showProfileModal() {
146 var title
= <?php
echo xlj('Profile Edits Red = Charted Values Blue = Patient Edits'); ?
> +
' ';
150 {text
: <?php
echo xlj('Help'); ?
>, close
: false, style
: 'info', id
: 'formHelp'},
151 {text
: <?php
echo xlj('Cancel'); ?
>, close
: true, style
: 'default'},
152 {text
: <?php
echo xlj('Revert Edits'); ?
>, close
: false, style
: 'danger', id
: 'replaceAllButton'},
153 {text
: <?php
echo xlj('Send for Review'); ?
>, close
: false, style
: 'success', id
: 'donePatientButton'}
158 resolvePromiseOn
: 'init',
160 url
: webRoot +
'/portal/patient/patientdata?pid=' +
encodeURIComponent(cpid
) +
'&user=' +
encodeURIComponent(cuser
)
162 dlgopen('', '', 'modal-xl', 500, '', title
, params
).then(function (dialog
) {
163 $
('div.modal-body', dialog
).addClass('overflow-auto');
167 function saveProfile() {
171 var gowhere
= '#' +
<?php
echo js_escape($whereto); ?
>;
172 $
(gowhere
).collapse('show');
174 $
('#cardgroup').on('show.bs.collapse', '.collapse', function () {
175 $
('#cardgroup').find('.collapse.show').collapse('hide');
178 $
("[data-toggle='pill']").on("click", function (e
) {
180 // don't toggle if already active.
181 if ($
(this
).hasClass('active')) {
184 $
(".nav-item").removeClass("active");
185 let canHide
= $
(".navbar-toggler-icon").is(":visible");
187 $
("[data-toggle='offcanvas']").click();
190 $
('#popwait').hide();
191 $
('#callccda').click(function () {
192 $
('#popwait').show();
195 function editAppointment(mode
, deid
) {
198 if (mode
=== 'add') {
199 title
= <?php
echo xlj('Request New Appointment'); ?
>;
201 } else if (mode
=== 'recurring') {
202 let msg
= <?php
echo xlj("A Recurring Appointment. Please contact your appointment desk for any changes."); ?
>;
203 signerAlertMsg(msg
, 8000);
206 title
= <?php
echo xlj('Edit Appointment'); ?
>;
212 {text
: 'Cancel', close
: true, style
: 'btn-sm btn-secondary'},
219 url
: './add_edit_event_user.php',
223 * A couple notes on dialog.ajax .alert etc.
224 * opener is not required. library will handle for you.
225 * these run in the same scope as calling script.
226 * so same styles, dependencies are in scope.
227 * a promise is returned for doing other neat stuff.
233 function changeCredentials(e
) {
234 title
= <?php
echo xlj('Please Enter New Credentials'); ?
>;
235 dlgopen("./account/index_reset.php", '', 600, 360, null, title
, {});
238 <?php
if ($GLOBALS['easipro_enable'] && !empty($GLOBALS['easipro_server']) && !empty($GLOBALS['easipro_name'])) {
240 function writeResult(score
, stdErr
, assessmentOID
) {
242 url
: '../library/ajax/easipro_util.php',
244 'csrf_token_form': <?php
echo js_escape(CsrfUtils
::collectCsrfToken()); ?
>,
245 'function': 'record_result',
248 'assessmentOID': assessmentOID
255 function selectResponse(obj
, assessmentOID
) {
257 url
: '../library/ajax/easipro_util.php',
260 'csrf_token_form': <?php
echo js_escape(CsrfUtils
::collectCsrfToken()); ?
>,
261 'function': 'select_response',
262 'assessmentOID': assessmentOID
,
263 'ItemResponseOID': obj
.name
,
267 success
: function (data
) {
268 if (data
.DateFinished
!= '') {
269 document
.getElementById("Content").innerHTML
= jsText(<?php
echo xlj('You have finished the assessment.'); ?
>) +
"<br /> " +
jsText(<?php
echo xlj('Thank you'); ?
>);
270 document
.getElementById("asst_" + assessmentOID
).innerHTML
= "<i class='fa fa-check-circle'></i>";
271 document
.getElementById("asst_status_" + assessmentOID
).innerHTML
= "completed";
273 url
: '../library/ajax/easipro_util.php',
276 'csrf_token_form': <?php
echo js_escape(CsrfUtils
::collectCsrfToken()); ?
>,
277 'function': 'collect_results',
278 'assessmentOID': assessmentOID
281 success
: function (data
) {
282 writeResult(data
.Items
[0].Theta
, data
.Items
[0].StdError
, assessmentOID
);
288 for (var j
= 0; j
< data
.Items
[0].Elements
.length
; j++
) {
289 if (typeof (data
.Items
[0].Elements
[j
].Map
) == 'undefined') {
290 screen
= screen +
"<div style=\'height: 30px\' >" + data
.Items
[0].Elements
[j
].Description +
"</div>"
292 for (var k
= 0; k
< data
.Items
[0].Elements
[j
].Map
.length
; k++
) {
293 screen
= screen +
"<div style=\'height: 50px\' ><input type=\'button\' class='btn-submit' id=\'" + data
.Items
[0].Elements
[j
].Map
[k
].Value +
"\' name=\'" + data
.Items
[0].Elements
[j
].Map
[k
].ItemResponseOID +
"\' value=\'" + data
.Items
[0].Elements
[j
].Map
[k
].Description +
"\' onclick=selectResponse(this,'" + assessmentOID +
"') />" +
"</div>";
297 document
.getElementById("Content").innerHTML
= screen
;
299 error
: function (jqXHR
, textStatus
, errorThrown
) {
300 //document.write(jqXHR.responseText + ':' + textStatus + ':' + errorThrown);
301 alert("An error occurred");
306 function startAssessment(param
, assessmentOID
) {
307 param
.innerHTML
= "<i class='fa fa-circle-o-notch fa-spin'></i> " +
jsText(<?php
echo xlj('Loading'); ?
>);
310 url
: '../library/ajax/easipro_util.php',
313 'csrf_token_form': <?php
echo js_escape(CsrfUtils
::collectCsrfToken()); ?
>,
314 'function': 'start_assessment',
315 'assessmentOID': assessmentOID
318 success
: function (data
) {
320 for (var j
= 0; j
< data
.Items
[0].Elements
.length
; j++
) {
321 if (typeof (data
.Items
[0].Elements
[j
].Map
) == 'undefined') {
322 screen
= screen +
"<div style=\'height: 30px\' >" + data
.Items
[0].Elements
[j
].Description +
"</div>"
324 for (var k
= 0; k
< data
.Items
[0].Elements
[j
].Map
.length
; k++
) {
325 screen
= screen +
"<div style=\'height: 50px\' ><input type=\'button\' class='btn-submit' id=\'" + data
.Items
[0].Elements
[j
].Map
[k
].Value +
"\' name=\'" + data
.Items
[0].Elements
[j
].Map
[k
].ItemResponseOID +
"\' value=\'" + data
.Items
[0].Elements
[j
].Map
[k
].Description +
"\' onclick=selectResponse(this,'" + assessmentOID +
"') />" +
"</div>";
329 document
.getElementById("Content").innerHTML
= screen
;
331 param
.innerHTML
= jsText(<?php
echo xlj('Start Assessment') ?
>);
333 error
: function (jqXHR
, textStatus
, errorThrown
) {
334 param
.innerHTML
= jsText(<?php
echo xlj('Start Assessment') ?
>);
336 //document.write(jqXHR.responseText);
337 alert("An error occurred");
342 } // end if $GLOBALS['easipro_enable']?>
347 <header
class="header">
348 <nav
class="navbar navbar-expand-md fixed-top navbar-light bg-light">
349 <div
class="container-fluid">
350 <a href
="home.php" class="navbar-brand d-none d-sm-block">
351 <img
class="img-fluid" width
="140" src
='<?php echo $GLOBALS['images_static_relative
']; ?>/logo-full-con.png' />
353 <button
class="navbar-toggler" type
="button" data
-toggle
="offcanvas" data
-target
="#left-collapse" aria
-controls
="left-collapse" aria
-expanded
="false" aria
-label
="Toggle navigation"><span
class="navbar-toggler-icon"></span
>
355 <!-- Sidebar toggle button
-->
356 <ul
class="nav navbar-nav flex-row">
357 <li
class="nav-item dropdown">
358 <a href
="#" class="nav-link dropdown-toggle" id
="newmsgs" data
-toggle
="dropdown" data
-display
="static" aria
-haspopup
="true" aria
-expanded
="true"> <i
class="fa fa-envelope"></i
>
359 <span
class="badge badge-pill badge-success"><?php
echo text($newcnt); ?
></span
></a
>
360 <div
class="dropdown-menu dropdown-menu-md-right" aria
-labelledby
="newmsgs">
361 <h6
class="dropdown-header"><?php
echo xlt('You have'); ?
> <?php
echo text($newcnt); ?
> <?php
echo xlt('new messages'); ?
></h6
>
362 <!-- inner menu
: contains the actual data
-->
364 foreach ($msgs as $i) {
365 if ($i['message_status'] == 'New') {
366 echo "<div><a class='dropdown-item' href='" . $GLOBALS['web_root'] . "/portal/messaging/messages.php'><h4>" . text($i['title']) . "</h4></a></div>";
371 <a
class="dropdown-item" href
="<?php echo $GLOBALS['web_root']; ?>/portal/messaging/messages.php"><?php
echo xlt('See All Messages'); ?
></a
>
375 <li
class="nav-item dropdown">
376 <a href
="#" class="nav-link dropdown-toggle" id
="profiletab" data
-toggle
="dropdown" data
-display
="static" aria
-haspopup
="true" aria
-expanded
="false"> <i
class="fa fa-user"></i
>
377 <span
><?php
echo text($result['fname'] . " " . $result['lname']); ?
> <i
class="caret"></i
></span
></a
>
378 <div
class="dropdown-menu dropdown-menu-md-right" aria
-labelledby
="profiletab">
379 <div
class="dropdown-header text-center"><?php
echo xlt('Account'); ?
></div
>
380 <a
class="dropdown-item" href
="<?php echo $GLOBALS['web_root']; ?>/portal/messaging/messages.php"> <i
class="fa fa-envelope-o fa-fw"></i
> <?php
echo xlt('Messages'); ?
>
381 <span
class="badge badge-pill badge-danger"><?php
echo text($msgcnt); ?
></span
></a
>
382 <div
class="dropdown-divider"></div
>
383 <?php
if ($GLOBALS['allow_portal_chat']) {
385 <a
class="dropdown-item" href
="<?php echo $GLOBALS['web_root']; ?>/portal/messaging/secure_chat.php?fullscreen=true"> <i
class="fa fa-user fa-fw"></i
><?php
echo xlt('Chat'); ?
></a
>
388 <a
class="dropdown-item" href
="javascript:changeCredentials(event)"> <i
class="fa fa-cog fa-fw"></i
> <?php
echo xlt('Change Credentials'); ?
></a
>
389 <div
class="dropdown-divider"></div
>
390 <a
class="dropdown-item" href
="logout.php"><i
class="fa fa-ban fa-fw"></i
> <?php
echo xlt('Logout'); ?
></a
>
397 <div
class="wrapper d-flex">
398 <!-- Left side column
. contains the logo
and sidebar
-->
399 <aside
class="fixed-top left-side sidebar-offcanvas collapse collapse-md mt-5" id
="left-collapse">
400 <nav
class="sidebar">
401 <!-- Sidebar user panel
-->
402 <div
class="user-panel">
403 <div
class="float-left image">
404 <i
class="fa fa-user"></i
>
406 <div
class="float-left info">
407 <p
><?php
echo xlt('Welcome') . ' ' . text($result['fname'] . " " . $result['lname']); ?
></p
>
408 <a href
="#"><i
class="fa fa-circle text-success"></i
> <?php
echo xlt('Online'); ?
></a
>
411 <ul
class="nav nav-pills flex-column text-dark">
412 <!-- css
class was sidebar
-menu
-->
413 <li
class="nav-item" data
-toggle
="pill"><a
class="nav-link" href
="#profilecard" data
-toggle
="collapse" data
-parent
="#cardgroup"><i
class="fas fa-id-card"></i
> <?php
echo xlt('Profile'); ?
></a
></li
>
414 <li
class="nav-item" data
-toggle
="pill"><a
class="nav-link" href
="#lists" data
-toggle
="collapse" data
-parent
="#cardgroup"><i
class="fas fa-list"></i
> <?php
echo xlt('Lists'); ?
></a
></li
>
415 <li
class="nav-item"><a
class="nav-link" href
="<?php echo $GLOBALS['web_root']; ?>/portal/patient/onsitedocuments?pid=<?php echo attr_url($pid); ?>"><i
class="fas fa-file-medical"></i
> <?php
echo xlt('Patient Documents'); ?
></a
></li
>
416 <?php
if ($GLOBALS['allow_portal_appointments']) { ?
>
417 <li
class="nav-item" data
-toggle
="pill"><a
class="nav-link" href
="#appointmentcard" data
-toggle
="collapse" data
-parent
="#cardgroup"><i
class="fas fa-calendar-check"></i
> <?php
echo xlt("Appointment"); ?
></a
></li
>
419 <?php
if ($GLOBALS['portal_two_ledger'] ||
$GLOBALS['portal_two_payments']) { ?
>
420 <li
class="nav-item dropdown accounting-menu"><a href
="#" class="nav-link dropdown-toggle" data
-toggle
="dropdown"><i
class="fas fa-file-invoice-dollar"></i
> <?php
echo xlt('Accountings'); ?
></a
>
421 <div
class="dropdown-menu">
422 <?php
if ($GLOBALS['portal_two_ledger']) { ?
>
423 <span data
-toggle
="pill"><a
class="dropdown-item" href
="#ledgercard" data
-toggle
="collapse" data
-parent
="#cardgroup"><i
class="fas fa-folder-open"></i
> <?php
echo xlt('Ledger'); ?
></a
></span
>
425 <?php
if ($GLOBALS['portal_two_payments']) { ?
>
426 <span data
-toggle
="pill"><a
class="dropdown-item" href
="#paymentcard" data
-toggle
="collapse" data
-parent
="#cardgroup"><i
class="fas fa-credit-card"></i
> <?php
echo xlt('Make Payment'); ?
></a
></span
>
431 <li
class="nav-item dropdown reporting-menu"><a href
="#" class="nav-link dropdown-toggle" data
-toggle
="dropdown"><i
class="fas fa-book-medical"></i
> <?php
echo xlt('Reports'); ?
></a
>
432 <div
class="dropdown-menu">
433 <?php
if ($GLOBALS['ccda_alt_service_enable'] > 1) { ?
>
434 <a
class="dropdown-item" id
="callccda" href
="<?php echo $GLOBALS['web_root']; ?>/ccdaservice/ccda_gateway.php?action=startandrun"><i
class="fas fa-envelope"></i
> <?php
echo xlt('View CCD'); ?
></a
>
436 <?php
if (!empty($GLOBALS['portal_onsite_document_download'])) { ?
>
437 <span data
-toggle
="pill"><a
class="dropdown-item" href
="#reportcard" data
-toggle
="collapse"
438 data
-parent
="#cardgroup"><i
class="fa fa-folder-open"></i
> <?php
echo xlt('Report Content'); ?
></a
></span
>
440 <span data
-toggle
="pill"><a
class="dropdown-item" href
="#downloadcard" data
-toggle
="collapse"
441 data
-parent
="#cardgroup"><i
class="fa fa-download"></i
> <?php
echo xlt('Download Lab Documents'); ?
></a
></span
>
445 <li
class="nav-item"><a
class="nav-link" href
="<?php echo $GLOBALS['web_root']; ?>/portal/messaging/messages.php"><i
class="fas fa-envelope"></i
> <?php
echo xlt('Secure Messaging'); ?
></a
></li
>
446 <?php
if ($GLOBALS['allow_portal_chat']) { ?
>
447 <li
class="nav-item" data
-toggle
="pill"><a
class="nav-link" href
="#messagescard" data
-toggle
="collapse"
448 data
-parent
="#cardgroup"><i
class="fas fa-comment-medical"></i
> <?php
echo xlt("Secure Chat"); ?
></a
></li
>
450 <?php
if ($GLOBALS['easipro_enable'] && !empty($GLOBALS['easipro_server']) && !empty($GLOBALS['easipro_name'])) { ?
>
451 <li
class="nav-item" data
-toggle
="pill"><a
class="nav-link" href
="#procard" data
-toggle
="collapse" data
-parent
="#cardgroup"><i
class="fa fa-edit"></i
> <?php
echo xlt("Patient Reported Outcomes"); ?
></a
></li
>
453 <li
class="nav-item" data
-toggle
="pill"><a
class="nav-link" href
="#openSignModal" data
-toggle
="modal" data
-type
="patient-signature"><i
class="fas fa-file-signature"></i
> <?php
echo xlt('Signature on File'); ?
></a
></li
>
454 <li
class="nav-item"><a
class="nav-link" href
="logout.php"><i
class="fa fa-ban"></i
> <?php
echo xlt('Logout'); ?
></a
></li
>
458 <!-- Right side column
. Contains content of the page
-->
459 <aside
class="right-side mt-3">
460 <!-- Main content
-->
461 <section
class="container" id
="cardgroup">
462 <div id
="popwait" class="alert alert-warning"><strong
><?php
echo xlt('Working!'); ?
></strong
> <?php
echo xlt('Please wait...'); ?
></div
>
463 <div
class="collapse" id
="lists">
465 <header
class="card-header bg-primary text-light"><?php
echo xlt('Medications'); ?
> </header
>
466 <div id
="medicationlist" class="card-body bg-light"></div
>
469 <header
class="card-header bg-primary text-light"><?php
echo xlt('Medications Allergy List'); ?
> </header
>
470 <div id
="allergylist" class="card-body bg-light"></div
>
473 <header
class="card-header bg-primary text-light"><?php
echo xlt('Issues List'); ?
></header
>
474 <div id
="problemslist" class="card-body bg-light"></div
>
477 <header
class="card-header bg-primary text-light"><?php
echo xlt('Amendment List'); ?
> </header
>
478 <div id
="amendmentslist" class="card-body bg-light"></div
>
481 <header
class="card-header bg-primary text-light"><?php
echo xlt('Lab Results'); ?
> </header
>
482 <div id
="labresults" class="card-body bg-light"></div
>
484 </div
><!-- /.lists
-->
485 <?php
if ($GLOBALS['allow_portal_appointments']) { ?
>
486 <div
class="collapse mt-2" id
="appointmentcard">
487 <div
class="jumbotron jumbotron-fluid m-5 p-3">
488 <div
class="container-fluid">
489 <h3
class="text-center"><?php
echo xlt('Appointments'); ?
></h3
>
491 $current_date2 = date('Y-m-d');
493 $appts = fetchNextXAppts($current_date2, $pid, $apptLimit);
495 $stringCM = "(" . xl("Comments field entry present") . ")";
496 $stringR = "(" . xl("Recurring appointment") . ")";
498 foreach ($appts as $row) {
499 $status_title = getListItemTitle('apptstat', $row['pc_apptstatus']);
501 $dayname = xl(date("l", strtotime($row ['pc_eventDate'])));
503 $disphour = substr($row ['pc_startTime'], 0, 2) +
0;
504 $dispmin = substr($row ['pc_startTime'], 3, 2);
505 if ($disphour >= 12) {
507 if ($disphour > 12) {
512 if ($row ['pc_hometext'] != "") {
513 $etitle = xlt('Comments') . ": " . $row ['pc_hometext'] . "\r\n";
518 echo '<div class="card p-2">';
519 $mode = (int)$row['pc_recurrtype'] > 0 ?
text("recurring") : $row['pc_recurrtype'];
520 $appt_type_icon = (int)$row['pc_recurrtype'] > 0 ?
"<i class='float-right fa fa-edit text-danger bg-light'></i>" : "<i class='float-right fa fa-edit text-success bg-light'></i>";
521 echo "<div class='card-header clearfix'><a href='#' onclick='editAppointment(" . attr_js($mode) . "," . attr_js($row ['pc_eid']) . ")'" . " title='" . attr($etitle) . "'>" . $appt_type_icon . "</a></div>";
522 echo "<div class='body font-weight-bold'><p>" . text($dayname . ", " . $row ['pc_eventDate']) . " ";
523 echo text($disphour . ":" . $dispmin . " " . $dispampm) . "<br />";
524 echo xlt("Type") . ": " . text($row ['pc_catname']) . "<br />";
525 echo xlt("Provider") . ": " . text($row ['ufname'] . " " . $row ['ulname']) . "<br />";
526 echo xlt("Status") . ": " . text($status_title);
527 echo "</p></div></div>";
529 if ($count == $apptLimit) {
530 echo "<p>" . xlt("Display limit reached") . "<br>" . xlt("More appointments may exist") . "</p>";
532 } else { // if no appts
533 echo "<h3 class='text-center'>" . xlt('No Appointments') . "</h3>";
536 <span
><a
class='btn btn-primary btn-block' href
='#' onclick
="editAppointment('add',<?php echo attr_js($pid); ?>)"><?php
echo xlt('Schedule A New Appointment'); ?
></a
>
542 <?php
if ($GLOBALS['portal_two_payments']) {
544 <div
class="collapse" id
="paymentcard">
546 <header
class="card-header bg-primary text-light"> <?php
echo xlt('Payments'); ?
> </header
>
547 <div id
="payment" class="card-body bg-light"></div
>
551 <?php
if ($GLOBALS['allow_portal_chat']) { ?
>
552 <div
class="collapse" id
="messagescard">
553 <div
class="card pt-0 pb-0">
554 <header
class="card-header bg-primary text-light"><?php
echo xlt('Secure Chat'); ?
> </header
>
555 <div id
="messages" class="card-body p-0 overflow-auto" style
="height: calc(100vh - 120px);">
556 <iframe src
="./messaging/secure_chat.php" class="w-100 h-100"></iframe
>
562 <div
class="card collapse" id
="reportcard">
563 <header
class="card-header bg-primary text-light"><?php
echo xlt('Reports'); ?
></header
>
564 <div id
="reports" class="card-body"></div
>
566 <?php
if (!empty($GLOBALS['portal_onsite_document_download'])) {
568 <div
class="card collapse" id
="downloadcard">
569 <header
class="card-header bg-primary text-light"> <?php
echo xlt('Download Documents'); ?
> </header
>
570 <div id
="docsdownload" class="card-body">
572 <span
class="text"><?php
echo xlt('Download all patient documents'); ?
></span
>
573 <form name
='doc_form' id
='doc_form' action
='./get_patient_documents.php' method
='post'>
574 <input type
="button" class="generateDoc_download" value
="<?php echo xla('Download'); ?>" />
577 </div
><!-- /.card
-body
-->
580 <?php
if ($GLOBALS['portal_two_ledger']) { ?
>
581 <div
class="collapse" id
="ledgercard">
583 <header
class="card-header bg-primary text-light"><?php
echo xlt('Ledger'); ?
></header
>
584 <div id
="patledger" class="card-body">
585 <iframe src
="./report/pat_ledger.php" class="w-100 vh-100 border-0" scrolling
="yes"></iframe
>
590 <?php
if ($GLOBALS['easipro_enable'] && !empty($GLOBALS['easipro_server']) && !empty($GLOBALS['easipro_name'])) {
592 <div
class="card collapse" id
="procard">
593 <header
class="card-header bg-primary text-light"> <?php
echo xlt('Patient Reported Outcomes'); ?
> </header
>
594 <div id
="pro" class="card-body bg-light"></div
>
597 <div
class="card collapse" id
="profilecard">
598 <header
class="card-header bg-primary text-light"><?php
echo xlt('Profile'); ?
></header
>
599 <div id
="profilereport" class="card-body bg-light"></div
>
602 </aside
><!-- /.right
-side
-->
603 </div
><!-- ./wrapper
-->