Site Id intermittent error. (#4492)
[openemr.git] / interface / main / tabs / js / tabs_view_model.js
blob9bc6f7900c28a3116e21483a2f9cf936c875d2c3
1 /**
2  * tabs_view_model.js
3  *
4  * @package   OpenEMR
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
11  */
13 function tabStatus(title,url,name,loading_label,closable,visible,locked)
15     var self=this;
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);
28         //Stop Spinning motor
29         self.spinner("");
30     });
31     self.window=null;
32     return this;
35 /**
36  *
37  * @returns {tabs_view_model}
38  *
39  * Initial setup of the tabs view model to be an observable array
40  */
41 function tabs_view_model()
43     this.tabsList=ko.observableArray();
44     return this;
47 function activateTab(data)
49     for(var tabIdx=0;tabIdx<app_view_model.application_data.tabs.tabsList().length;tabIdx++)
50     {
51         var curTab=app_view_model.application_data.tabs.tabsList()[tabIdx];
52         if(data!==curTab)
53         {
54             if(!curTab.locked())
55             {
56                 curTab.visible(false);
57             }
58         }
59         else
60         {
61             curTab.visible(true);
62         }
63     }
66 function activateTabByName(name,hideOthers)
69     for(var tabIdx=0;tabIdx<app_view_model.application_data.tabs.tabsList().length;tabIdx++)
70     {
71         var curTab=app_view_model.application_data.tabs.tabsList()[tabIdx];
72         if(curTab.name()===name)
73         {
74             curTab.visible(true);
75         }
76         else if(hideOthers)
77         {
78             if(!curTab.locked())
79             {
80                 curTab.visible(false);
81             }
82         }
83     }
86 function tabClicked(data,evt)
88     activateTab(data);
91 function tabRefresh(data,evt)
93     top.restoreSession();
94     // To do: Consider modification if part of frame.
95     try {
96         data.window.location = data.window.location;
97         activateTab(data);
98     } catch(e) {
99         // Do nothing, but avoid exceptions caused by iFrames from different domain (ie NewCrop)
100     }
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.
107  * @param name
108  */
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) {
113             tabRefresh(curTab);
114         }
115     }
118 function tabClose(data,evt)
120     //remove the tab
121     app_view_model.application_data.tabs.tabsList.remove(data);
122     //activate the next tab
123     if(data.visible()) {
124         activateTab(app_view_model.application_data.tabs.tabsList()[app_view_model.application_data.tabs.tabsList().length-1]);
125     }
128 function tabCloseByName(name)
130     for(var tabIdx=0;tabIdx<app_view_model.application_data.tabs.tabsList().length;tabIdx++)
131     {
132         var curTab=app_view_model.application_data.tabs.tabsList()[tabIdx];
133         if(curTab.name()===name)
134         {
135             tabClose(curTab);
136         }
137     }
140 function navigateTab(url,name,afterLoadFunction,loading_label='')
143     top.restoreSession();
144     if($("iframe[name='"+name+"']").length>0)
145     {
146         if(typeof afterLoadFunction !== 'function'){
147             $( "body" ).off( "load", "iframe[name='"+name+"']");
148         } else {
149             $("iframe[name='"+name+"']").one('load', function () {
150                 afterLoadFunction();
151             });
152         }
153         openExistingTab(url,name);
154         $("iframe[name='"+name+"']").get(0).contentWindow.location=url;
155     }
156     else
157     {
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'){
161             afterLoadFunction();
162         }
163     }
166 function tabLockToggle(data,evt)
168     data.locked(!data.locked());
169     if(data.locked())
170     {
171         activateTab(data);
172     }
173     else
174     {
175         data.visible(false);
176     }
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);
212     });
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);
222     });
226 function reviewEncounterEvent(data,evt)
228     reviewEncounter(data.id());
230 function clickNewEncounter(data,evt)
232     newEncounter(data,evt);
235 function clickEncounterList(data,evt)
237     encounterList();
240 function clickNewGroupEncounter(data,evt)
242     newTherapyGroupEncounter();
245 function newEncounter(data, evt) {
246     var url = '';
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=';
249     }
250     else {
251         url = webroot_url + '/interface/forms/newpatient/new.php?autoloaded=1&calenc=';
252     }
253     navigateTab(url, "enc", function () {
254         activateTabByName("enc", true);
255     });
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);
264     });
267 function encounterList()
269     var url=webroot_url+'/interface/patient_file/history/encounters.php';
270     navigateTab(url, "enc", function () {
271         activateTabByName("enc",true);
272     });
275 function loadCurrentPatient()
277     var url=webroot_url+'/interface/patient_file/summary/demographics.php';
278     navigateTab(url, "pat", function () {
279         activateTabByName("pat",true);
280     });
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);
288     });
291 function loadCurrentEncounter()
293     var url=webroot_url+'/interface/patient_file/encounter/encounter_top.php';
294     navigateTab(url, "enc", function () {
295         activateTabByName("enc",true);
296     });
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'
303     });
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);
316     }
318     if(data.enabled())
319     {
320         if(data.requirement===2)
321         {
322             var encounterID=app_view_model.application_data[attendant_type]().selectedEncounterID();
323             if(isEncounterLocked(encounterID))
324             {
325                 alert(xl('This encounter is locked. No new forms can be added.'));
326                 return;
327             }
328         }
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+)/);
334         if (matches) {
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);
340               return;
341             }
342           }
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());
346         }
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>");
354         par.detach();
355         setTimeout(function() {
356            par.insertBefore(".timedReplace");
357             $(".timedReplace").remove();
358         }, 500);
359     }
360     else
361     {
362         if(data.requirement === 1)
363         {
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.'));
365         }
366         else if((data.requirement === 2)||data.requirement === 3)
367         {
368             alert(xl('You must first select or create an encounter.'));
369         }
370     }
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);
384     });
386     //Ajax call to clear active patient in session
387     $.ajax({
388         type: "POST",
389         url: webroot_url+"/library/ajax/unset_session_ajax.php",
390             data: {
391             func: "unset_pid",
392             csrf_token_form: csrf_token_js
393         },
394             success:function( msg ) {
397             }
398         });
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);
410     });
412     //Ajax call to clear active patient in session
413     $.ajax({
414         type: "POST",
415         url: webroot_url+"/library/ajax/unset_session_ajax.php",
416         data: {
417             func: "unset_gid",
418             csrf_token_form: csrf_token_js
419         },
420         success:function( msg ) {
423         }
424     });
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';
436                 break;
437             case '../../new/new.php':
438                 currTabUrl = webroot_url + '/interface/new/new.php';
439                 break;
440             case '../../../interface/main/finder/dynamic_finder.php':
441                 currTabUrl = webroot_url + '/interface/main/finder/dynamic_finder.php';
442                 break;
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';
445                 break;
446             case '../../../interface/main/messages/messages.php?form_active=1':
447                 currTabUrl = webroot_url + '/interface/main/messages/messages.php?form_active=1';
448                 break;
449         }
450         if (url === currTabUrl) {
451             currTab.visible(true);
452             exist = true;
453         }
454         else if (url !== currTabUrl && currTabName == name) {
455             currTab.visible(true);
456             currTab.url(url);
457         }
458         else {
459             if (!currTab.locked()) {
460                 currTab.visible(false);
461             }
462         }
463     }