1 | /* TrackingModelLocator.as */
|
---|
2 |
|
---|
3 | package gov.va.med.edp.model
|
---|
4 | {
|
---|
5 | import com.adobe.cairngorm.model.ModelLocator;
|
---|
6 |
|
---|
7 | import flash.events.TimerEvent;
|
---|
8 | import flash.net.URLRequest;
|
---|
9 | import flash.net.navigateToURL;
|
---|
10 | import flash.utils.Timer;
|
---|
11 |
|
---|
12 | import gov.va.med.edp.model.reports.ReportsModel;
|
---|
13 | import gov.va.med.edp.pt.demog.model.PatientChecksModel;
|
---|
14 | import gov.va.med.edp.vo.LogEditParamsVO;
|
---|
15 | import gov.va.med.edp.vo.LogSelectorVO;
|
---|
16 | import gov.va.med.edp.vo.SessionVO;
|
---|
17 | import gov.va.med.edp.vo.VisitVO;
|
---|
18 |
|
---|
19 | import mx.collections.ArrayCollection;
|
---|
20 | import mx.collections.XMLListCollection;
|
---|
21 | import mx.rpc.Fault;
|
---|
22 |
|
---|
23 |
|
---|
24 | [Bindable]
|
---|
25 | public class TrackingModelLocator implements ModelLocator
|
---|
26 | {
|
---|
27 | // Possible view states for the application
|
---|
28 | public static const VIEW_APP_INTRO: int = 0;
|
---|
29 | public static const VIEW_APP_SIGN_IN: int = 1;
|
---|
30 | public static const VIEW_APP_TRIAGE: int = 2;
|
---|
31 | public static const VIEW_APP_UPDATE: int = 3;
|
---|
32 | public static const VIEW_APP_DISPOSITION: int = 4;
|
---|
33 | public static const VIEW_APP_EDIT_CLOSED: int = 5;
|
---|
34 | public static const VIEW_APP_DISPLAY_BOARD: int = 6;
|
---|
35 | public static const VIEW_APP_ASSIGN_STAFF: int = 7;
|
---|
36 | public static const VIEW_APP_REPORTS: int = 8;
|
---|
37 | public static const VIEW_APP_CONFIGURE: int = 9;
|
---|
38 | public static const VIEW_APP_VERSION_INCOMPATIBILITY: int = 90;
|
---|
39 | public static const VIEW_APP_NO_VIEWS: int = 99;
|
---|
40 |
|
---|
41 | public static const VIEW_EDIT_MESSAGE: String = "Message";
|
---|
42 | public static const VIEW_EDIT_SIGN_IN: String = "SignIn";
|
---|
43 | public static const VIEW_EDIT_TRIAGE: String = "Triage";
|
---|
44 | public static const VIEW_EDIT_UPDATE: String = "Update";
|
---|
45 | public static const VIEW_EDIT_UPDATE_NORES: String = "UpdateNoRes";
|
---|
46 | public static const VIEW_EDIT_DISP_DELAY: String = "DispDelay";
|
---|
47 | public static const VIEW_EDIT_DISP_DELAY_CODED: String = "DispDelayCoded";
|
---|
48 | public static const VIEW_EDIT_CLOSED: String = "EditClosed";
|
---|
49 | public static const VIEW_EDIT_CLOSED_CODED: String = "EditClosedCoded";
|
---|
50 |
|
---|
51 | public static const APP_NAME_BIGBOARD: String = "bigboard";
|
---|
52 | public static const APP_NAME_TRACKING: String = "tracking";
|
---|
53 |
|
---|
54 | public var bigboardInfo: BigBoardDebugInfo;
|
---|
55 |
|
---|
56 | public var appName: String = "";
|
---|
57 | public var appClientVersion: String = "1.0";
|
---|
58 | public var contextRoot: String = "";
|
---|
59 | public var appViewList: ArrayCollection;
|
---|
60 | public var appViewState: int = VIEW_APP_INTRO;
|
---|
61 | public var logEntryViewState: String = "";
|
---|
62 | public var logEntryTitle: String = "";
|
---|
63 |
|
---|
64 | // Session information
|
---|
65 | public var session: SessionVO;
|
---|
66 | public var rootURL: String;
|
---|
67 | public var logoutURL: String;
|
---|
68 | public var helpContextRootURL: String;
|
---|
69 |
|
---|
70 | // Reports
|
---|
71 | public var reports: ReportsModel = new ReportsModel();
|
---|
72 |
|
---|
73 | // Debug
|
---|
74 | public var debug: DebugModel = new DebugModel();
|
---|
75 |
|
---|
76 | // Log Editor
|
---|
77 | public var logArea: int;
|
---|
78 | public var logEntryList: LogEntryList = new LogEntryList();
|
---|
79 | public var logEdit: LogEdit = new LogEdit();
|
---|
80 | public var logEditParams: LogEditParamsVO;
|
---|
81 | public var matchingDiagnoses: ArrayCollection;
|
---|
82 | public var matchingDiagnosesLoaded: Boolean = false;
|
---|
83 |
|
---|
84 | // Patient Selection
|
---|
85 | public var patientChecksModel:PatientChecksModel = new PatientChecksModel();
|
---|
86 |
|
---|
87 | public var matchingClosedVisits: ArrayCollection;
|
---|
88 | public var matchingClosedVisitsIndex: int = -1;
|
---|
89 |
|
---|
90 | // Display Board
|
---|
91 | public var boardSortField: String = "";
|
---|
92 | public var boardSortDescending: Boolean;
|
---|
93 | public var boardReady: Boolean = false;
|
---|
94 | public var boardData: XMLListCollection;
|
---|
95 | public var boardSpec: BoardSpec = new BoardSpec();
|
---|
96 | public var boardLastUpdated: Date;
|
---|
97 |
|
---|
98 | // Configure
|
---|
99 | public var config: Config = new Config();
|
---|
100 |
|
---|
101 | // Connectivity
|
---|
102 | public var reconnectFunction:Function;
|
---|
103 | public var disconnectionFault:Fault = null;
|
---|
104 | private var _disconnected: Boolean = false;
|
---|
105 | private var _connecting: Boolean = false;
|
---|
106 | private var _reconnectTimer: Timer;
|
---|
107 |
|
---|
108 | public var reloadFunction:Function; // function for reloading the flash application in case of fatal error or sommat
|
---|
109 |
|
---|
110 | private static const RECONNECT_SECONDS:int = 10;
|
---|
111 |
|
---|
112 | //Singleton logic -----------------------------------------------------------
|
---|
113 |
|
---|
114 | private static var modelLocator: TrackingModelLocator;
|
---|
115 |
|
---|
116 | public static function getInstance(): TrackingModelLocator
|
---|
117 | {
|
---|
118 | if (modelLocator == null) {
|
---|
119 | modelLocator = new TrackingModelLocator();
|
---|
120 | }
|
---|
121 | return modelLocator;
|
---|
122 | }
|
---|
123 |
|
---|
124 | public function TrackingModelLocator()
|
---|
125 | {
|
---|
126 | if (modelLocator != null) {
|
---|
127 | throw new Error("Only one TrackingModelLocator should be instantiated.");
|
---|
128 | }
|
---|
129 | }
|
---|
130 |
|
---|
131 | public function isDisconnected(): Boolean {
|
---|
132 | return disconnected;
|
---|
133 | }
|
---|
134 |
|
---|
135 | public function buildSiteDate(): Date
|
---|
136 | {
|
---|
137 | var now:Date = new Date();
|
---|
138 | return new Date(now.time - session.baseTime.time + session.siteTime.time);
|
---|
139 | }
|
---|
140 |
|
---|
141 | public function synchToLastEntry(): void
|
---|
142 | {
|
---|
143 | for (var i:int = 0; i < logEntryList.entries.length; i++) {
|
---|
144 | var logSelector: LogSelectorVO = logEntryList.entries[i];
|
---|
145 | if (logSelector.id == logEdit.entry.id) {
|
---|
146 | logEntryList.selectedIndex = -1; // force binding to fire
|
---|
147 | logEntryList.selectedIndex = i;
|
---|
148 | logEntryList.selectedID = logSelector.id;
|
---|
149 | return;
|
---|
150 | } // if
|
---|
151 | } // for
|
---|
152 | } // synchToLastEntry
|
---|
153 |
|
---|
154 | public function synchToClosedEntry(): void
|
---|
155 | {
|
---|
156 | for (var i: int = 0; i < matchingClosedVisits.length; i++) {
|
---|
157 | var visit: VisitVO = matchingClosedVisits[i];
|
---|
158 | if (visit.id == logEdit.entry.id) {
|
---|
159 | matchingClosedVisitsIndex = -1; // force binding to fire
|
---|
160 | matchingClosedVisitsIndex = i;
|
---|
161 | return;
|
---|
162 | } // if
|
---|
163 | } // for
|
---|
164 | } // synchToClosedEntry
|
---|
165 |
|
---|
166 | public function appViewTitle(view: int): String
|
---|
167 | {
|
---|
168 | switch (appViewState) {
|
---|
169 | case VIEW_APP_SIGN_IN:
|
---|
170 | return "EDIS Sign In";
|
---|
171 | case VIEW_APP_TRIAGE:
|
---|
172 | return "EDIS Triage";
|
---|
173 | case VIEW_APP_UPDATE:
|
---|
174 | return "EDIS Update";
|
---|
175 | case VIEW_APP_DISPOSITION:
|
---|
176 | return "EDIS Disposition";
|
---|
177 | case VIEW_APP_EDIT_CLOSED:
|
---|
178 | return "EDIS Edit Closed Visit";
|
---|
179 | case VIEW_APP_DISPLAY_BOARD:
|
---|
180 | return "EDIS Display Board";
|
---|
181 | case VIEW_APP_ASSIGN_STAFF:
|
---|
182 | return "EDIS Staff List";
|
---|
183 | case VIEW_APP_REPORTS:
|
---|
184 | return "EDIS Reports";
|
---|
185 | case VIEW_APP_CONFIGURE:
|
---|
186 | return "EDIS Configuration";
|
---|
187 | case VIEW_APP_NO_VIEWS:
|
---|
188 | return "EDIS";
|
---|
189 | default:
|
---|
190 | return "EDIS";
|
---|
191 | }
|
---|
192 | }
|
---|
193 |
|
---|
194 | public function appViewHelp(view: int): String
|
---|
195 | {
|
---|
196 | switch (appViewState) {
|
---|
197 | case VIEW_APP_SIGN_IN:
|
---|
198 | return "SignIn";
|
---|
199 | case VIEW_APP_TRIAGE:
|
---|
200 | return "Triage";
|
---|
201 | case VIEW_APP_UPDATE:
|
---|
202 | return "Update";
|
---|
203 | case VIEW_APP_DISPOSITION:
|
---|
204 | return "Disposition";
|
---|
205 | case VIEW_APP_EDIT_CLOSED:
|
---|
206 | return "EditClosedVisit";
|
---|
207 | case VIEW_APP_DISPLAY_BOARD:
|
---|
208 | return "DisplayBoard";
|
---|
209 | case VIEW_APP_ASSIGN_STAFF:
|
---|
210 | return "StaffList";
|
---|
211 | case VIEW_APP_REPORTS:
|
---|
212 | return "Reports";
|
---|
213 | case VIEW_APP_CONFIGURE:
|
---|
214 | return "Configuration";
|
---|
215 | case VIEW_APP_NO_VIEWS:
|
---|
216 | return "General";
|
---|
217 | default:
|
---|
218 | return "General";
|
---|
219 | }
|
---|
220 | }
|
---|
221 |
|
---|
222 | public function setEditState(): void
|
---|
223 | {
|
---|
224 | // always start at the beginning
|
---|
225 | logEntryViewState = "";
|
---|
226 |
|
---|
227 | if (logEdit.entry == null) {
|
---|
228 | logEntryViewState = VIEW_EDIT_MESSAGE;
|
---|
229 | return;
|
---|
230 | }
|
---|
231 |
|
---|
232 | // convenient place to clear lookup list since this is called when entry changes
|
---|
233 | matchingDiagnoses = null;
|
---|
234 |
|
---|
235 | switch (appViewState) {
|
---|
236 | case VIEW_APP_SIGN_IN:
|
---|
237 | logEntryViewState = VIEW_EDIT_SIGN_IN;
|
---|
238 | break;
|
---|
239 | case VIEW_APP_TRIAGE:
|
---|
240 | logEntryViewState = VIEW_EDIT_TRIAGE;
|
---|
241 | break;
|
---|
242 | case VIEW_APP_UPDATE:
|
---|
243 | logEditParams.promptResidents ?
|
---|
244 | logEntryViewState = VIEW_EDIT_UPDATE : logEntryViewState = VIEW_EDIT_UPDATE_NORES;
|
---|
245 | break;
|
---|
246 | case VIEW_APP_DISPOSITION:
|
---|
247 | logEditParams.codedDiagnosis ?
|
---|
248 | logEntryViewState = VIEW_EDIT_DISP_DELAY_CODED :
|
---|
249 | logEntryViewState = VIEW_EDIT_DISP_DELAY;
|
---|
250 | break;
|
---|
251 | case VIEW_APP_EDIT_CLOSED:
|
---|
252 | logEditParams.codedDiagnosis ?
|
---|
253 | logEntryViewState = VIEW_EDIT_CLOSED_CODED :
|
---|
254 | logEntryViewState = VIEW_EDIT_CLOSED;
|
---|
255 | break;
|
---|
256 | default:
|
---|
257 | logEntryViewState = VIEW_EDIT_MESSAGE;
|
---|
258 | break;
|
---|
259 | } // switch
|
---|
260 | } // setEditState
|
---|
261 |
|
---|
262 | public function modifiedViews(): String
|
---|
263 | {
|
---|
264 | var x: String = "";
|
---|
265 | if (logEdit.dirty) {
|
---|
266 | var viewName: String = logEntryViewState;
|
---|
267 | viewName = (viewName.substr(0, 4) == "Disp") ? "Disposition" : viewName;
|
---|
268 | viewName = (viewName.substr(0, 4) == "Upda") ? "Update" : viewName;
|
---|
269 | viewName = (viewName.substr(0, 4) == "Edit") ? "Edit Closed" : viewName;
|
---|
270 | x += "\t" + viewName + "\n";
|
---|
271 | }
|
---|
272 | x += config.staffMods ? "\tStaff Configuration \n" : "";
|
---|
273 | x += config.bedMods ? "\tRoom / Area Configuration \n" : "";
|
---|
274 | x += config.boardMods ? "\tDisplay Board Configuration \n" : "";
|
---|
275 | x += config.colorMods ? "\tColor Configuration \n" : "";
|
---|
276 | x += config.paramMods ? "\tParameter Configuration \n" : "";
|
---|
277 | x += config.selectionMods ? "\tSelection List Configuration \n" : "";
|
---|
278 | return x;
|
---|
279 | }
|
---|
280 |
|
---|
281 | public function entryRemoveReady(): void
|
---|
282 | {
|
---|
283 | var ready: Boolean = true;
|
---|
284 |
|
---|
285 | // special dispositions that allow immediate removal
|
---|
286 | if ((logEdit.entry.disposition == logEditParams.errorIEN) ||
|
---|
287 | (logEdit.entry.disposition == logEditParams.nurseEvalIEN) ||
|
---|
288 | (logEdit.entry.disposition == logEditParams.leftIEN)) {
|
---|
289 | logEdit.entry.removeReady = true;
|
---|
290 | return;
|
---|
291 | }
|
---|
292 |
|
---|
293 | if (logEdit.entry.requireDiagnosis && (logEdit.entry.diagnoses.length == 0)) {
|
---|
294 | ready = false;
|
---|
295 | }
|
---|
296 | if (logEdit.entry.requireDisposition &&
|
---|
297 | ((logEdit.entry.disposition == logEditParams.emptyValue) ||
|
---|
298 | (logEdit.entry.disposition < 1))) {
|
---|
299 | ready = false;
|
---|
300 | }
|
---|
301 | if (logEdit.entry.requireDelay &&
|
---|
302 | ((logEdit.entry.delay == logEditParams.emptyValue) ||
|
---|
303 | (logEdit.entry.delay < 1))) {
|
---|
304 | ready = false;
|
---|
305 | }
|
---|
306 | if (Number(logEdit.entry.provider) < 1) {
|
---|
307 | ready = false;
|
---|
308 | }
|
---|
309 |
|
---|
310 | logEdit.entry.removeReady = ready;
|
---|
311 | }
|
---|
312 |
|
---|
313 | public function logout(): void {
|
---|
314 | var request: URLRequest = new URLRequest(logoutURL);
|
---|
315 | navigateToURL(request, "_top");
|
---|
316 | }
|
---|
317 |
|
---|
318 | public function get disconnected(): Boolean {
|
---|
319 | return _disconnected;
|
---|
320 | }
|
---|
321 |
|
---|
322 | public function set disconnected(b:Boolean):void {
|
---|
323 | if (_disconnected && !b) {
|
---|
324 | stopReconnectCountdown();
|
---|
325 | disconnectionFault = null;
|
---|
326 | } else if (!_disconnected && b) {
|
---|
327 | startReconnectCountdown();
|
---|
328 | }
|
---|
329 | _disconnected = b;
|
---|
330 | }
|
---|
331 |
|
---|
332 | public function get connecting(): Boolean {
|
---|
333 | return _connecting;
|
---|
334 | }
|
---|
335 |
|
---|
336 | public function set connecting(b:Boolean):void {
|
---|
337 | _connecting = b;
|
---|
338 | if (disconnected) {
|
---|
339 | if (!_connecting) {
|
---|
340 | startReconnectCountdown();
|
---|
341 | } else {
|
---|
342 | stopReconnectCountdown();
|
---|
343 | }
|
---|
344 | }
|
---|
345 | }
|
---|
346 |
|
---|
347 | [Bindable(event="reconnectSecondsChanged")]
|
---|
348 | public function get reconnectSeconds():int {
|
---|
349 | if (_reconnectTimer == null) return RECONNECT_SECONDS;
|
---|
350 | return _reconnectTimer.repeatCount - _reconnectTimer.currentCount;
|
---|
351 | }
|
---|
352 |
|
---|
353 | public function attemptReconnect():void {
|
---|
354 | stopReconnectCountdown();
|
---|
355 | reconnectFunction.call(null);
|
---|
356 | }
|
---|
357 |
|
---|
358 | private function reconnectCountDown(e:TimerEvent):void {
|
---|
359 | dispatchEvent(new Event("reconnectSecondsChanged"));
|
---|
360 | }
|
---|
361 |
|
---|
362 | private function reconnectTimerComplete(e:TimerEvent):void {
|
---|
363 | attemptReconnect();
|
---|
364 | }
|
---|
365 |
|
---|
366 | private function startReconnectCountdown():void {
|
---|
367 | if (_reconnectTimer == null) {
|
---|
368 | _reconnectTimer = new Timer(1000, RECONNECT_SECONDS);
|
---|
369 | _reconnectTimer.addEventListener(TimerEvent.TIMER, reconnectCountDown);
|
---|
370 | _reconnectTimer.addEventListener(TimerEvent.TIMER_COMPLETE, reconnectTimerComplete);
|
---|
371 | }
|
---|
372 | _reconnectTimer.reset();
|
---|
373 | _reconnectTimer.start();
|
---|
374 | }
|
---|
375 |
|
---|
376 | private function stopReconnectCountdown():void {
|
---|
377 | if (_reconnectTimer != null) {
|
---|
378 | _reconnectTimer.reset();
|
---|
379 | }
|
---|
380 | }
|
---|
381 |
|
---|
382 | } // class
|
---|
383 | } // package
|
---|