5 * @link http://www.open-emr.org
6 * @author Kevin Yeh <kevin.y@integralemr.com>
7 * @author Brady Miller <brady.g.miller@gmail.com>
8 * @copyright Copyright (c) 2016 Kevin Yeh <kevin.y@integralemr.com>
9 * @copyright Copyright (c) 2016 Brady Miller <brady.g.miller@gmail.com>
10 * @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
13 function tabStatus(title,url,name,loading_label,closable,visible,locked)
16 self.visible=ko.observable(visible);
17 self.locked=ko.observable(locked);
18 self.closable=ko.observable(closable);
19 self.title=ko.observable(title);
20 //Start Spinning motor
21 self.spinner=ko.observable("fa-spin");
22 self.url=ko.observable(url);
23 self.name=ko.observable(name);
24 self.loading_text=ko.observable(loading_label + "...");
25 self.loading_text_status = ko.observable(true);
26 self.title.subscribe(function() {
27 self.loading_text_status(false);
37 * @returns {tabs_view_model}
39 * Initial setup of the tabs view model to be an observable array
41 function tabs_view_model()
43 this.tabsList=ko.observableArray();
47 function activateTab(data)
49 for(var tabIdx=0;tabIdx<app_view_model.application_data.tabs.tabsList().length;tabIdx++)
51 var curTab=app_view_model.application_data.tabs.tabsList()[tabIdx];
56 curTab.visible(false);
66 function activateTabByName(name,hideOthers)
69 for(var tabIdx=0;tabIdx<app_view_model.application_data.tabs.tabsList().length;tabIdx++)
71 var curTab=app_view_model.application_data.tabs.tabsList()[tabIdx];
72 if(curTab.name()===name)
80 curTab.visible(false);
86 function tabClicked(data,evt)
91 function tabRefresh(data,evt)
94 // To do: Consider modification if part of frame.
96 data.window.location = data.window.location;
99 // Do nothing, but avoid exceptions caused by iFrames from different domain (ie NewCrop)
104 * Given a name, refresh that tab. This code is used to support custom code where it is required
105 * to programmatically refresh a tab via javascript. This func may not be used by core code, please do not remove.
109 function tabRefreshByName(name) {
110 for (var tabIdx = 0; tabIdx < app_view_model.application_data.tabs.tabsList().length; tabIdx++) {
111 var curTab = app_view_model.application_data.tabs.tabsList()[tabIdx];
112 if (curTab.name() === name) {
118 function tabClose(data,evt)
121 app_view_model.application_data.tabs.tabsList.remove(data);
122 //activate the next tab
124 activateTab(app_view_model.application_data.tabs.tabsList()[app_view_model.application_data.tabs.tabsList().length-1]);
128 function tabCloseByName(name)
130 for(var tabIdx=0;tabIdx<app_view_model.application_data.tabs.tabsList().length;tabIdx++)
132 var curTab=app_view_model.application_data.tabs.tabsList()[tabIdx];
133 if(curTab.name()===name)
140 function navigateTab(url,name,afterLoadFunction,loading_label='')
143 top.restoreSession();
144 if($("iframe[name='"+name+"']").length>0)
146 if(typeof afterLoadFunction !== 'function'){
147 $( "body" ).off( "load", "iframe[name='"+name+"']");
149 $("iframe[name='"+name+"']").one('load', function () {
153 openExistingTab(url,name);
154 $("iframe[name='"+name+"']").get(0).contentWindow.location=url;
158 let curTab=new tabStatus(xl("Loading") + "...",url,name,loading_label,true,false,false);
159 app_view_model.application_data.tabs.tabsList.push(curTab);
160 if(typeof afterLoadFunction === 'function'){
166 function tabLockToggle(data,evt)
168 data.locked(!data.locked());
179 function refreshPatient(data,evt)
181 loadCurrentPatient();
184 function refreshGroup(data,evt)
186 loadCurrentTherapyGroup();
189 function refreshEncounter(data,evt)
191 loadCurrentEncounter();
194 function setEncounter(id)
196 app_view_model.application_data[attendant_type]().selectedEncounterID(id);
199 function chooseEncounterEvent(data,evt)
201 top.restoreSession();
202 setEncounter(data.id());
203 goToEncounter(data.id());
206 function goToEncounter(encId)
208 var url=webroot_url+'/interface/patient_file/encounter/encounter_top.php?set_encounter=' + encId;
210 navigateTab(url,"enc", function () {
211 activateTabByName("enc",true);
216 function reviewEncounter(encId)
218 top.restoreSession();
219 var url=webroot_url+'/interface/patient_file/encounter/forms.php?review_id=' + encId;
220 navigateTab(url,"rev",function () {
221 activateTabByName("rev",true);
226 function reviewEncounterEvent(data,evt)
228 reviewEncounter(data.id());
230 function clickNewEncounter(data,evt)
232 newEncounter(data,evt);
235 function clickEncounterList(data,evt)
240 function clickNewGroupEncounter(data,evt)
242 newTherapyGroupEncounter();
245 function newEncounter(data, evt) {
247 if (typeof(data) === "object" && data.mode === "follow_up_encounter") {
248 url = webroot_url + '/interface/forms/newpatient/new.php?mode=followup&enc=' + data.encounterId + '&autoloaded=1&calenc=';
251 url = webroot_url + '/interface/forms/newpatient/new.php?autoloaded=1&calenc=';
253 navigateTab(url, "enc", function () {
254 activateTabByName("enc", true);
259 function newTherapyGroupEncounter()
261 var url=webroot_url+'/interface/forms/newGroupEncounter/new.php?autoloaded=1&calenc==';
262 navigateTab(url, "enc", function () {
263 activateTabByName("enc",true);
267 function encounterList()
269 var url=webroot_url+'/interface/patient_file/history/encounters.php';
270 navigateTab(url, "enc", function () {
271 activateTabByName("enc",true);
275 function loadCurrentPatient()
277 var url=webroot_url+'/interface/patient_file/summary/demographics.php';
278 navigateTab(url, "pat", function () {
279 activateTabByName("pat",true);
283 function loadCurrentTherapyGroup() {
285 var url=webroot_url+'/interface/therapy_groups/index.php?method=groupDetails&group_id=from_session';
286 navigateTab(url,"gdg", function () {
287 activateTabByName("gdg",true);
291 function loadCurrentEncounter()
293 var url=webroot_url+'/interface/patient_file/encounter/encounter_top.php';
294 navigateTab(url, "enc", function () {
295 activateTabByName("enc",true);
299 function popMenuDialog(url, title) {
300 let notlike = title.toLowerCase();
301 dlgopen(url, 'menupopup', 'modal-mlg', 500, '', title, {
302 sizeHeight: notlike.search('label') !== -1 ? 'full' : 'auto'
306 function menuActionClick(data,evt)
309 // Yet another menu fixup for legacy 'popup'.
310 // let's abandon a tab and call a support function from this view.
311 // we'll take along uri and current menu label as title for dialog.
312 // @TODO Possibly add global to allow tab or popup.
313 if (data.target === 'pop') {
314 let title = $(evt.currentTarget).text();
315 return popMenuDialog(webroot_url + data.url(), title);
320 if(data.requirement===2)
322 var encounterID=app_view_model.application_data[attendant_type]().selectedEncounterID();
323 if(isEncounterLocked(encounterID))
325 alert(xl('This encounter is locked. No new forms can be added.'));
330 // Fixups for loading a new encounter form, as these are now in tabs.
331 var dataurl = data.url();
332 var dataLabel = data.label();
333 var matches = dataurl.match(/load_form.php\?formname=(\w+)/);
335 // If the encounter frameset already exists, just tell it to add a tab for this form.
336 for (var i = 0; i < frames.length; ++i) {
337 if (frames[i].twAddFrameTab) {
338 frames[i].twAddFrameTab('enctabs', data.label(), webroot_url + dataurl);
339 activateTabByName(data.target,true);
343 // Otherwise continue by creating the encounter frameset including this form.
344 dataurl = '/interface/patient_file/encounter/encounter_top.php?formname=' +
345 matches[1] + '&formdesc=' + encodeURIComponent(data.label());
348 navigateTab(webroot_url + dataurl, data.target, function () {
349 activateTabByName(data.target,true);
350 },xl("Loading") + " " + dataLabel);
352 var par = $(evt.currentTarget).closest("ul.menuEntries");
353 par.wrap("<ul class='timedReplace' style='display:none;'></ul>");
355 setTimeout(function() {
356 par.insertBefore(".timedReplace");
357 $(".timedReplace").remove();
362 if(data.requirement === 1)
364 alert((top.jsGlobals.enable_group_therapy == 1) ? xl('You must first select or add a patient or therapy group.') : xl('You must first select or add a patient.'));
366 else if((data.requirement === 2)||data.requirement === 3)
368 alert(xl('You must first select or create an encounter.'));
374 function clearPatient()
376 top.restoreSession();
377 app_view_model.application_data.patient(null);
378 tabCloseByName('enc');
379 tabCloseByName('rev');
380 tabCloseByName('pop');
381 tabCloseByName('pat');
382 navigateTab(webroot_url+'/interface/main/finder/dynamic_finder.php','fin', function () {
383 activateTabByName('fin',true);
386 //Ajax call to clear active patient in session
389 url: webroot_url+"/library/ajax/unset_session_ajax.php",
392 csrf_token_form: csrf_token_js
394 success:function( msg ) {
402 function clearTherapyGroup()
404 top.restoreSession();
405 app_view_model.application_data.therapy_group(null);
406 tabCloseByName('gdg');
407 tabCloseByName('enc');
408 navigateTab(webroot_url+'/interface/therapy_groups/index.php?method=listGroups','gfn', function () {
409 activateTabByName('gfn',true);
412 //Ajax call to clear active patient in session
415 url: webroot_url+"/library/ajax/unset_session_ajax.php",
418 csrf_token_form: csrf_token_js
420 success:function( msg ) {
427 function openExistingTab(url, name) {
428 for (let tabIdx = 0; tabIdx < app_view_model.application_data.tabs.tabsList().length; tabIdx++) {
429 let currTab = app_view_model.application_data.tabs.tabsList()[tabIdx];
430 let currTabUrl = currTab.url();
431 let currTabName = currTab.name();
432 //Check if URL is from $GLOBAL['default_tab']
433 switch (currTabUrl) {
434 case '../main_info.php':
435 currTabUrl = webroot_url + '/interface/main/main_info.php';
437 case '../../new/new.php':
438 currTabUrl = webroot_url + '/interface/new/new.php';
440 case '../../../interface/main/finder/dynamic_finder.php':
441 currTabUrl = webroot_url + '/interface/main/finder/dynamic_finder.php';
443 case '../../../interface/patient_tracker/patient_tracker.php?skip_timeout_reset=1':
444 currTabUrl = webroot_url + '/interface/patient_tracker/patient_tracker.php?skip_timeout_reset=1';
446 case '../../../interface/main/messages/messages.php?form_active=1':
447 currTabUrl = webroot_url + '/interface/main/messages/messages.php?form_active=1';
450 if (url === currTabUrl) {
451 currTab.visible(true);
454 else if (url !== currTabUrl && currTabName == name) {
455 currTab.visible(true);
459 if (!currTab.locked()) {
460 currTab.visible(false);