"use strict"; var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, function() { var hostUrl = localStorage.getItem("host") ? "https://" + localStorage.getItem("host") : "", rootDir = localStorage.getItem("rootDir") || "", RESTWS = hostUrl + "/openmrs/ws/rest", RESTWS_V1 = hostUrl + "/openmrs/ws/rest/v1", BAHMNI_CORE = RESTWS_V1 + "/bahmnicore", EMRAPI = RESTWS + "/emrapi", BACTERIOLOGY = RESTWS_V1, BASE_URL = hostUrl + "/bahmni_config/openmrs/apps/", CUSTOM_URL = hostUrl + "/implementation_config/openmrs/apps/", serverErrorMessages = [{ serverMessage: "Cannot have more than one active order for the same orderable and care setting at same time", clientMessage: "One or more drugs you are trying to order are already active. Please change the start date of the conflicting drug or remove them from the new prescription." }, { serverMessage: "[Order.cannot.have.more.than.one]", clientMessage: "One or more drugs you are trying to order are already active. Please change the start date of the conflicting drug or remove them from the new prescription." }], representation = "custom:(uuid,name,names,conceptClass,setMembers:(uuid,name,names,conceptClass,setMembers:(uuid,name,names,conceptClass,setMembers:(uuid,name,names,conceptClass))))", unAuthenticatedReferenceDataMap = { "/openmrs/ws/rest/v1/location?tags=Login+Location&s=byTags&v=default": "LoginLocations", "/openmrs/ws/rest/v1/bahmnicore/sql/globalproperty?property=locale.allowed.list": "LocaleList" }, authenticatedReferenceDataMap = { "/openmrs/ws/rest/v1/idgen/identifiertype": "IdentifierTypes", "/openmrs/module/addresshierarchy/ajax/getOrderedAddressHierarchyLevels.form": "AddressHierarchyLevels", "/openmrs/ws/rest/v1/bahmnicore/sql/globalproperty?property=mrs.genders": "Genders", "/openmrs/ws/rest/v1/bahmnicore/sql/globalproperty?property=bahmni.encountersession.duration": "encounterSessionDuration", "/openmrs/ws/rest/v1/bahmnicore/sql/globalproperty?property=bahmni.relationshipTypeMap": "RelationshipTypeMap", "/openmrs/ws/rest/v1/bahmnicore/config/bahmniencounter?callerContext=REGISTRATION_CONCEPTS": "RegistrationConcepts", "/openmrs/ws/rest/v1/relationshiptype?v=custom:(aIsToB,bIsToA,uuid)": "RelationshipType", "/openmrs/ws/rest/v1/personattributetype?v=custom:(uuid,name,sortWeight,description,format,concept)": "PersonAttributeType", "/openmrs/ws/rest/v1/entitymapping?mappingType=loginlocation_visittype&s=byEntityAndMappingType": "LoginLocationToVisitTypeMapping", "/openmrs/ws/rest/v1/bahmnicore/config/patient": "PatientConfig", "/openmrs/ws/rest/v1/concept?s=byFullySpecifiedName&name=Consultation+Note&v=custom:(uuid,name,answers)": "ConsultationNote", "/openmrs/ws/rest/v1/concept?s=byFullySpecifiedName&name=Lab+Order+Notes&v=custom:(uuid,name)": "LabOrderNotes", "/openmrs/ws/rest/v1/concept?s=byFullySpecifiedName&name=Impression&v=custom:(uuid,name)": "RadiologyImpressionConfig", "/openmrs/ws/rest/v1/concept?s=byFullySpecifiedName&name=All_Tests_and_Panels&v=custom:(uuid,name:(uuid,name),setMembers:(uuid,name:(uuid,name)))": "AllTestsAndPanelsConcept", "/openmrs/ws/rest/v1/concept?s=byFullySpecifiedName&name=Dosage+Frequency&v=custom:(uuid,name,answers)": "DosageFrequencyConfig", "/openmrs/ws/rest/v1/concept?s=byFullySpecifiedName&name=Dosage+Instructions&v=custom:(uuid,name,answers)": "DosageInstructionConfig", "/openmrs/ws/rest/v1/bahmnicore/sql/globalproperty?property=bahmni.encounterType.default": "DefaultEncounterType", "/openmrs/ws/rest/v1/concept?s=byFullySpecifiedName&name=Stopped+Order+Reason&v=custom:(uuid,name,answers)": "StoppedOrderReasonConfig", "/openmrs/ws/rest/v1/ordertype": "OrderType", "/openmrs/ws/rest/v1/bahmnicore/config/drugOrders": "DrugOrderConfig", "/openmrs/ws/rest/v1/bahmnicore/sql/globalproperty?property=drugOrder.drugOther": "NonCodedDrugConcept" }; authenticatedReferenceDataMap["/openmrs/ws/rest/v1/entitymapping?mappingType=location_encountertype&s=byEntityAndMappingType&entityUuid=" + (localStorage.getItem("LoginInformation") ? JSON.parse(localStorage.getItem("LoginInformation")).currentLocation.uuid : "")] = "LoginLocationToEncounterTypeMapping", Bahmni.Common.Constants = { hostURL: hostUrl, dateFormat: "dd/mm/yyyy", dateDisplayFormat: "DD-MMM-YYYY", timeDisplayFormat: "hh:mm", emrapiDiagnosisUrl: EMRAPI + "/diagnosis", bahmniDiagnosisUrl: BAHMNI_CORE + "/diagnosis/search", bahmniDeleteDiagnosisUrl: BAHMNI_CORE + "/diagnosis/delete", diseaseTemplateUrl: BAHMNI_CORE + "/diseaseTemplates", AllDiseaseTemplateUrl: BAHMNI_CORE + "/diseaseTemplate", emrapiConceptUrl: EMRAPI + "/concept", encounterConfigurationUrl: BAHMNI_CORE + "/config/bahmniencounter", patientConfigurationUrl: BAHMNI_CORE + "/config/patient", drugOrderConfigurationUrl: BAHMNI_CORE + "/config/drugOrders", emrEncounterUrl: EMRAPI + "/encounter", encounterUrl: RESTWS_V1 + "/encounter", locationUrl: RESTWS_V1 + "/location", bahmniVisitLocationUrl: BAHMNI_CORE + "/visitLocation", bahmniOrderUrl: BAHMNI_CORE + "/orders", bahmniDrugOrderUrl: BAHMNI_CORE + "/drugOrders", bahmniDispositionByVisitUrl: BAHMNI_CORE + "/disposition/visit", bahmniDispositionByPatientUrl: BAHMNI_CORE + "/disposition/patient", bahmniSearchUrl: BAHMNI_CORE + "/search", bahmniLabOrderResultsUrl: BAHMNI_CORE + "/labOrderResults", bahmniEncounterUrl: BAHMNI_CORE + "/bahmniencounter", conceptUrl: RESTWS_V1 + "/concept", bahmniConceptAnswerUrl: RESTWS_V1 + "/bahmniconceptanswer", conceptSearchByFullNameUrl: RESTWS_V1 + "/concept?s=byFullySpecifiedName", visitUrl: RESTWS_V1 + "/visit", endVisitUrl: BAHMNI_CORE + "/visit/endVisit", endVisitAndCreateEncounterUrl: BAHMNI_CORE + "/visit/endVisitAndCreateEncounter", visitTypeUrl: RESTWS_V1 + "/visittype", patientImageUrlByPatientUuid: RESTWS_V1 + "/patientImage?patientUuid=", labResultUploadedFileNameUrl: "/uploaded_results/", visitSummaryUrl: BAHMNI_CORE + "/visit/summary", encounterModifierUrl: BAHMNI_CORE + "/bahmniencountermodifier", openmrsUrl: hostUrl + "/openmrs", loggingUrl: hostUrl + "/log/", idgenConfigurationURL: RESTWS_V1 + "/idgen/identifiertype", bahmniRESTBaseURL: BAHMNI_CORE + "", observationsUrl: BAHMNI_CORE + "/observations", obsRelationshipUrl: BAHMNI_CORE + "/obsrelationships", encounterImportUrl: BAHMNI_CORE + "/admin/upload/encounter", programImportUrl: BAHMNI_CORE + "/admin/upload/program", conceptImportUrl: BAHMNI_CORE + "/admin/upload/concept", conceptSetImportUrl: BAHMNI_CORE + "/admin/upload/conceptset", drugImportUrl: BAHMNI_CORE + "/admin/upload/drug", labResultsImportUrl: BAHMNI_CORE + "/admin/upload/labResults", referenceTermsImportUrl: BAHMNI_CORE + "/admin/upload/referenceterms", relationshipImportUrl: BAHMNI_CORE + "/admin/upload/relationship", conceptSetExportUrl: BAHMNI_CORE + "/admin/export/conceptset?conceptName=:conceptName", patientImportUrl: BAHMNI_CORE + "/admin/upload/patient", adminImportStatusUrl: BAHMNI_CORE + "/admin/upload/status", programUrl: RESTWS_V1 + "/program", programEnrollPatientUrl: RESTWS_V1 + "/bahmniprogramenrollment", programStateDeletionUrl: RESTWS_V1 + "/programenrollment", programEnrollmentDefaultInformation: "default", programEnrollmentFullInformation: "full", programAttributeTypes: RESTWS_V1 + "/programattributetype", relationshipTypesUrl: RESTWS_V1 + "/relationshiptype", personAttributeTypeUrl: RESTWS_V1 + "/personattributetype", diseaseSummaryPivotUrl: BAHMNI_CORE + "/diseaseSummaryData", allTestsAndPanelsConceptName: "All_Tests_and_Panels", dosageFrequencyConceptName: "Dosage Frequency", dosageInstructionConceptName: "Dosage Instructions", stoppedOrderReasonConceptName: "Stopped Order Reason", consultationNoteConceptName: "Consultation Note", diagnosisConceptSet: "Diagnosis Concept Set", radiologyOrderType: "Radiology Order", radiologyResultConceptName: "Radiology Result", investigationEncounterType: "INVESTIGATION", validationNotesEncounterType: "VALIDATION NOTES", labOrderNotesConcept: "Lab Order Notes", impressionConcept: "Impression", qualifiedByRelationshipType: "qualified-by", dispositionConcept: "Disposition", dispositionGroupConcept: "Disposition Set", dispositionNoteConcept: "Disposition Note", ruledOutDiagnosisConceptName: "Ruled Out Diagnosis", emrapiConceptMappingSource: "org.openmrs.module.emrapi", abbreviationConceptMappingSource: "Abbreviation", includeAllObservations: !1, openmrsObsUrl: RESTWS_V1 + "/obs", openmrsObsRepresentation: "custom:(uuid,obsDatetime,value:(uuid,name:(uuid,name)))", admissionCode: "ADMIT", dischargeCode: "DISCHARGE", transferCode: "TRANSFER", undoDischargeCode: "UNDO_DISCHARGE", vitalsConceptName: "Vitals", heightConceptName: "HEIGHT", weightConceptName: "WEIGHT", bmiConceptName: "BMI", bmiStatusConceptName: "BMI STATUS", abnormalObservationConceptName: "IS_ABNORMAL", documentsPath: "/document_images", documentsConceptName: "Document", miscConceptClassName: "Misc", abnormalConceptClassName: "Abnormal", unknownConceptClassName: "Unknown", durationConceptClassName: "Duration", conceptDetailsClassName: "Concept Details", admissionEncounterTypeName: "ADMISSION", dischargeEncounterTypeName: "DISCHARGE", imageClassName: "Image", videoClassName: "Video", locationCookieName: "bahmni.user.location", retrospectiveEntryEncounterDateCookieName: "bahmni.clinical.retrospectiveEncounterDate", JSESSIONID: "JSESSIONID", rootScopeRetrospectiveEntry: "retrospectiveEntry.encounterDate", patientFileConceptName: "Patient file", serverErrorMessages: serverErrorMessages, currentUser: "bahmni.user", retrospectivePrivilege: "app:clinical:retrospective", locationPickerPrivilege: "app:clinical:locationpicker", onBehalfOfPrivilege: "app:clinical:onbehalf", nutritionalConceptName: "Nutritional Values", messageForNoObservation: "NO_OBSERVATIONS_CAPTURED", messageForNoDisposition: "NO_DISPOSTIONS_AVAILABLE_MESSAGE_KEY", messageForNoFulfillment: "NO_FULFILMENT_MESSAGE", reportsUrl: "/bahmnireports", uploadReportTemplateUrl: "/bahmnireports/upload", ruledOutdiagnosisStatus: "Ruled Out Diagnosis", registartionConsultationPrivilege: "app:common:registration_consultation_link", manageIdentifierSequencePrivilege: "Manage Identifier Sequence", closeVisitPrivilege: "app:common:closeVisit", deleteDiagnosisPrivilege: "app:clinical:deleteDiagnosis", viewPatientsPrivilege: "View Patients", editPatientsPrivilege: "Edit Patients", addVisitsPrivilege: "Add Visits", deleteVisitsPrivilege: "Delete Visits", grantProviderAccess: "app:clinical:grantProviderAccess", grantProviderAccessDataCookieName: "app.clinical.grantProviderAccessData", globalPropertyUrl: BAHMNI_CORE + "/sql/globalproperty", passwordPolicyUrl: BAHMNI_CORE + "/globalProperty/passwordPolicyProperties", fulfillmentConfiguration: "fulfillment", fulfillmentFormSuffix: " Fulfillment Form", noNavigationLinksMessage: "NO_NAVIGATION_LINKS_AVAILABLE_MESSAGE", conceptSetRepresentationForOrderFulfillmentConfig: representation, entityMappingUrl: RESTWS_V1 + "/entitymapping", encounterTypeUrl: RESTWS_V1 + "/encountertype", defaultExtensionName: "default", orderSetMemberAttributeTypeUrl: RESTWS_V1 + "/ordersetmemberattributetype", orderSetUrl: RESTWS_V1 + "/bahmniorderset", primaryOrderSetMemberAttributeTypeName: "Primary", bahmniBacteriologyResultsUrl: BACTERIOLOGY + "/specimen", bedFromVisit: RESTWS_V1 + "/beds", ordersUrl: RESTWS_V1 + "/order", formDataUrl: RESTWS_V1 + "/obs", providerUrl: RESTWS_V1 + "/provider", drugUrl: RESTWS_V1 + "/drug", orderTypeUrl: RESTWS_V1 + "/ordertype", userUrl: RESTWS_V1 + "/user", passwordUrl: RESTWS_V1 + "/password", formUrl: RESTWS_V1 + "/form", allFormsUrl: RESTWS_V1 + "/bahmniie/form/allForms", latestPublishedForms: RESTWS_V1 + "/bahmniie/form/latestPublishedForms", formTranslationsUrl: RESTWS_V1 + "/bahmniie/form/translations", sqlUrl: BAHMNI_CORE + "/sql", patientAttributeDateFieldFormat: "org.openmrs.util.AttributableDate", platform: "user.platform", RESTWS_V1: RESTWS_V1, baseUrl: BASE_URL, customUrl: CUSTOM_URL, faviconUrl: hostUrl + "/bahmni/favicon.ico", platformType: { other: "other" }, numericDataType: "Numeric", encryptionType: { SHA3: "SHA3" }, LoginInformation: "LoginInformation", ServerDateTimeFormat: "YYYY-MM-DDTHH:mm:ssZZ", calculateDose: BAHMNI_CORE + "/calculateDose", unAuthenticatedReferenceDataMap: unAuthenticatedReferenceDataMap, authenticatedReferenceDataMap: authenticatedReferenceDataMap, rootDir: rootDir, dischargeUrl: BAHMNI_CORE + "/discharge", uuidRegex: "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}", eventlogFilterUrl: hostUrl + "/openmrs/ws/rest/v1/eventlog/filter", bahmniConnectMetaDataDb: "metaData", serverDateTimeUrl: "/cgi-bin/systemdate", loginText: "/bahmni_config/openmrs/apps/home/whiteLabel.json", auditLogUrl: RESTWS_V1 + "/auditlog", appointmentServiceUrl: RESTWS_V1 + "/appointmentService", conditionUrl: EMRAPI + "/condition", conditionHistoryUrl: EMRAPI + "/conditionhistory", followUpConditionConcept: "Follow-up Condition", localeLangs: "/bahmni_config/openmrs/apps/home/locale_languages.json", privilegeRequiredErrorMessage: "PRIVILEGE_REQUIRED", defaultPossibleRelativeSearchLimit: 10 } }(), function() { function n(n, t) { return n.set(t[0], t[1]), n } function t(n, t) { return n.add(t), n } function r(n, t, r) { switch (r.length) { case 0: return n.call(t); case 1: return n.call(t, r[0]); case 2: return n.call(t, r[0], r[1]); case 3: return n.call(t, r[0], r[1], r[2]) } return n.apply(t, r) } function e(n, t, r, e) { for (var u = -1, o = n.length; ++u < o;) { var i = n[u]; t(e, i, r(i), n) } return e } function u(n, t) { for (var r = -1, e = n.length; ++r < e && !1 !== t(n[r], r, n);); return n } function o(n, t) { for (var r = -1, e = n.length; ++r < e;) if (!t(n[r], r, n)) return !1; return !0 } function i(n, t) { for (var r = -1, e = n.length, u = -1, o = []; ++r < e;) { var i = n[r]; t(i, r, n) && (o[++u] = i) } return o } function f(n, t) { return !!n.length && -1 < d(n, t, 0) } function c(n, t, r) { for (var e = -1, u = n.length; ++e < u;) if (r(t, n[e])) return !0; return !1 } function a(n, t) { for (var r = -1, e = n.length, u = Array(e); ++r < e;) u[r] = t(n[r], r, n); return u } function l(n, t) { for (var r = -1, e = t.length, u = n.length; ++r < e;) n[u + r] = t[r]; return n } function s(n, t, r, e) { var u = -1, o = n.length; for (e && o && (r = n[++u]); ++u < o;) r = t(r, n[u], u, n); return r } function h(n, t, r, e) { var u = n.length; for (e && u && (r = n[--u]); u--;) r = t(r, n[u], u, n); return r } function p(n, t) { for (var r = -1, e = n.length; ++r < e;) if (t(n[r], r, n)) return !0; return !1 } function _(n, t, r) { for (var e = -1, u = n.length; ++e < u;) { var o = n[e], i = t(o); if (null != i && (f === Z ? i === i : r(i, f))) var f = i, c = o } return c } function g(n, t, r, e) { var u; return r(n, function(n, r, o) { return t(n, r, o) ? (u = e ? r : n, !1) : void 0 }), u } function v(n, t, r) { for (var e = n.length, u = r ? e : -1; r ? u-- : ++u < e;) if (t(n[u], u, n)) return u; return -1 } function d(n, t, r) { if (t !== t) return B(n, r); --r; for (var e = n.length; ++r < e;) if (n[r] === t) return r; return -1 } function y(n, t, r, e, u) { return u(n, function(n, u, o) { r = e ? (e = !1, n) : t(r, n, u, o) }), r } function b(n, t) { var r = n.length; for (n.sort(t); r--;) n[r] = n[r].c; return n } function x(n, t) { for (var r, e = -1, u = n.length; ++e < u;) { var o = t(n[e]); o !== Z && (r = r === Z ? o : r + o) } return r } function j(n, t) { for (var r = -1, e = Array(n); ++r < n;) e[r] = t(r); return e } function m(n, t) { return a(t, function(t) { return [t, n[t]] }) } function w(n) { return function(t) { return n(t) } } function A(n, t) { return a(t, function(t) { return n[t] }) } function O(n, t) { for (var r = -1, e = n.length; ++r < e && -1 < d(t, n[r], 0);); return r } function k(n, t) { for (var r = n.length; r-- && -1 < d(t, n[r], 0);); return r } function E(n) { return n && n.Object === Object ? n : null } function I(n, t) { if (n !== t) { var r = null === n, e = n === Z, u = n === n, o = null === t, i = t === Z, f = t === t; if (n > t && !o || !u || r && !i && f || e && f) return 1; if (t > n && !r || !f || o && !e && u || i && u) return -1 } return 0 } function S(n) { return Un[n] } function R(n) { return zn[n] } function W(n) { return "\\" + $n[n] } function B(n, t, r) { var e = n.length; for (t += r ? 0 : -1; r ? t-- : ++t < e;) { var u = n[t]; if (u !== u) return t } return -1 } function C(n) { var t = !1; if (null != n && "function" != typeof n.toString) try { t = !!(n + "") } catch (r) {} return t } function U(n, t) { return n = "number" == typeof n || yn.test(n) ? +n : -1, n > -1 && 0 == n % 1 && (null == t ? 9007199254740991 : t) > n } function z(n) { for (var t, r = []; !(t = n.next()).done;) r.push(t.value); return r } function M(n) { var t = -1, r = Array(n.size); return n.forEach(function(n, e) { r[++t] = [e, n] }), r } function L(n, t) { for (var r = -1, e = n.length, u = -1, o = []; ++r < e;) n[r] === t && (n[r] = "__lodash_placeholder__", o[++u] = r); return o } function $(n) { var t = -1, r = Array(n.size); return n.forEach(function(n) { r[++t] = n }), r } function F(n) { if (!n || !En.test(n)) return n.length; for (var t = kn.lastIndex = 0; kn.test(n);) t++; return t } function N(n) { return Mn[n] } function D(E) { function yn(n) { if (je(n) && !No(n) && !(n instanceof An)) { if (n instanceof wn) return n; if (cu.call(n, "__wrapped__")) return Zr(n) } return new wn(n) } function mn() {} function wn(n, t) { this.__wrapped__ = n, this.__actions__ = [], this.__chain__ = !!t, this.__index__ = 0, this.__values__ = Z } function An(n) { this.__wrapped__ = n, this.__actions__ = [], this.__dir__ = 1, this.__filtered__ = !1, this.__iteratees__ = [], this.__takeCount__ = 4294967295, this.__views__ = [] } function Un() {} function zn(n) { var t = -1, r = n ? n.length : 0; for (this.clear(); ++t < r;) { var e = n[t]; this.set(e[0], e[1]) } } function Mn(n) { var t = -1, r = n ? n.length : 0; for (this.__data__ = new zn; ++t < r;) this.push(n[t]) } function Ln(n, t) { var r = n.__data__; return Ur(t) ? (r = r.__data__, "__lodash_hash_undefined__" === ("string" == typeof t ? r.string : r.hash)[t]) : r.has(t) } function $n(n) { var t = -1, r = n ? n.length : 0; for (this.clear(); ++t < r;) { var e = n[t]; this.set(e[0], e[1]) } } function Dn(n, t) { var r = qn(n, t); return !(0 > r) && (r == n.length - 1 ? n.pop() : Ou.call(n, r, 1), !0) } function Zn(n, t) { var r = qn(n, t); return 0 > r ? Z : n[r][1] } function qn(n, t) { for (var r = n.length; r--;) if (se(n[r][0], t)) return r; return -1 } function Pn(n, t, r) { var e = qn(n, t); 0 > e ? n.push([t, r]) : n[e][1] = r } function Tn(n, t, r, e) { return n === Z || se(n, iu[r]) && !cu.call(e, r) ? t : n } function Gn(n, t, r) { (r !== Z && !se(n[t], r) || "number" == typeof t && r === Z && !(t in n)) && (n[t] = r) } function Yn(n, t, r) { var e = n[t]; (!se(e, r) || se(e, iu[t]) && !cu.call(n, t) || r === Z && !(t in n)) && (n[t] = r) } function Hn(n, t, r, e) { return Ju(n, function(n, u, o) { t(e, n, r(n), o) }), e } function Qn(n, t) { return n && Ht(t, Fe(t), n) } function Xn(n, t) { for (var r = -1, e = null == n, u = t.length, o = Array(u); ++r < u;) o[r] = e ? Z : Me(n, t[r]); return o } function nt(n, t, r) { return n === n && (r !== Z && (n = n > r ? r : n), t !== Z && (n = t > n ? t : n)), n } function tt(n, t, r, e, o, i) { var f; if (r && (f = o ? r(n, e, o, i) : r(n)), f !== Z) return f; if (!xe(n)) return n; if (e = No(n)) { if (f = Ir(n), !t) return Yt(n, f) } else { var c = kr(n), a = "[object Function]" == c || "[object GeneratorFunction]" == c; if (Do(n)) return Kt(n, t); if ("[object Object]" != c && "[object Arguments]" != c && (!a || o)) return Cn[c] ? Rr(n, c, t) : o ? n : {}; if (C(n)) return o ? n : {}; if (f = Sr(a ? {} : n), !t) return Xt(n, Qn(f, n)) } return i || (i = new $n), (o = i.get(n)) ? o : (i.set(n, f), (e ? u : at)(n, function(e, u) { Yn(f, u, tt(e, t, r, u, n, i)) }), e ? f : Xt(n, f)) } function rt(n) { var t = Fe(n), r = t.length; return function(e) { if (null == e) return !r; for (var u = r; u--;) { var o = t[u], i = n[o], f = e[o]; if (f === Z && !(o in Object(e)) || !i(f)) return !1 } return !0 } } function et(n, t, r) { if ("function" != typeof n) throw new uu("Expected a function"); return Au(function() { n.apply(Z, r) }, t) } function ut(n, t, r, e) { var u = -1, o = f, i = !0, l = n.length, s = [], h = t.length; if (!l) return s; r && (t = a(t, w(r))), e ? (o = c, i = !1) : t.length >= 200 && (o = Ln, i = !1, t = new Mn(t)); n: for (; ++u < l;) { var p = n[u], _ = r ? r(p) : p; if (i && _ === _) { for (var g = h; g--;) if (t[g] === _) continue n; s.push(p) } else o(t, _, e) || s.push(p) } return s } function ot(n, t) { var r = !0; return Ju(n, function(n, e, u) { return r = !!t(n, e, u) }), r } function it(n, t) { var r = []; return Ju(n, function(n, e, u) { t(n, e, u) && r.push(n) }), r } function ft(n, t, r, e) { e || (e = []); for (var u = -1, o = n.length; ++u < o;) { var i = n[u]; ge(i) && (r || No(i) || pe(i)) ? t ? ft(i, t, r, e) : l(e, i) : r || (e[e.length] = i) } return e } function ct(n, t) { return null == n ? n : Hu(n, t, Ne) } function at(n, t) { return n && Hu(n, t, Fe) } function lt(n, t) { return n && Qu(n, t, Fe) } function st(n, t) { return i(t, function(t) { return de(n[t]) }) } function ht(n, t) { t = Cr(t, n) ? [t + ""] : Nt(t); for (var r = 0, e = t.length; null != n && e > r;) n = n[t[r++]]; return r && r == e ? n : Z } function pt(n, t) { return cu.call(n, t) || "object" == typeof n && t in n && null === xu(n) } function _t(n, t) { return t in Object(n) } function gt(n, t, r) { for (var e = r ? c : f, u = n.length, o = u, i = Array(u), l = []; o--;) { var s = n[o]; o && t && (s = a(s, w(t))), i[o] = r || !t && 120 > s.length ? Z : new Mn(o && s) } var s = n[0], h = -1, p = s.length, _ = i[0]; n: for (; ++h < p;) { var g = s[h], v = t ? t(g) : g; if (_ ? !Ln(_, v) : !e(l, v, r)) { for (o = u; --o;) { var d = i[o]; if (d ? !Ln(d, v) : !e(n[o], v, r)) continue n } _ && _.push(v), l.push(g) } } return l } function vt(n, t, r, e) { return at(n, function(n, u, o) { t(e, r(n), u, o) }), e } function dt(n, t, e) { return Cr(t, n) || (t = Nt(t), n = $r(n, t), t = Kr(t)), t = null == n ? n : n[t], null == t ? Z : r(t, n, e) } function yt(n, t, r, e, u) { if (n === t) return !0; if (null == n || null == t || !xe(n) && !je(t)) return n !== n && t !== t; n: { var o = No(n), i = No(t), f = "[object Array]", c = "[object Array]";o || (f = kr(n), "[object Arguments]" == f ? f = "[object Object]" : "[object Object]" != f && (o = Ie(n))), i || (c = kr(t), "[object Arguments]" == c ? c = "[object Object]" : "[object Object]" != c && Ie(t)); var a = "[object Object]" == f && !C(n), i = "[object Object]" == c && !C(t), c = f == c; if (!c || o || a) { if (!(2 & e) && (f = a && cu.call(n, "__wrapped__"), i = i && cu.call(t, "__wrapped__"), f || i)) { n = yt(f ? n.value() : n, i ? t.value() : t, r, e, u); break n } c ? (u || (u = new $n), n = (o ? br : jr)(n, t, yt, r, e, u)) : n = !1 } else n = xr(n, t, f, yt, r, e) } return n } function bt(n, t, r, e) { var u = r.length, o = u, i = !e; if (null == n) return !o; for (n = Object(n); u--;) { var f = r[u]; if (i && f[2] ? f[1] !== n[f[0]] : !(f[0] in n)) return !1 } for (; ++u < o;) { var f = r[u], c = f[0], a = n[c], l = f[1]; if (i && f[2]) { if (a === Z && !(c in n)) return !1 } else if (f = new $n, c = e ? e(a, l, c, n, t, f) : Z, c === Z ? !yt(l, a, e, 3, f) : !c) return !1 } return !0 } function xt(n) { var t = typeof n; return "function" == t ? n : null == n ? Ve : "object" == t ? No(n) ? At(n[0], n[1]) : wt(n) : Qe(n) } function jt(n) { n = null == n ? n : Object(n); var t, r = []; for (t in n) r.push(t); return r } function mt(n, t) { var r = -1, e = _e(n) ? Array(n.length) : []; return Ju(n, function(n, u, o) { e[++r] = t(n, u, o) }), e } function wt(n) { var t = Ar(n); if (1 == t.length && t[0][2]) { var r = t[0][0], e = t[0][1]; return function(n) { return null != n && (n[r] === e && (e !== Z || r in Object(n))) } } return function(r) { return r === n || bt(r, n, t) } } function At(n, t) { return function(r) { var e = Me(r, n); return e === Z && e === t ? $e(r, n) : yt(t, e, Z, 3) } } function Ot(n, t, r, e, o) { if (n !== t) { var i = No(t) || Ie(t) ? Z : Ne(t); u(i || t, function(u, f) { if (i && (f = u, u = t[f]), xe(u)) { o || (o = new $n); var c = f, a = o, l = n[c], s = t[c], h = a.get(s); if (!h) { var h = e ? e(l, s, c + "", n, t, a) : Z, p = h === Z; p && (h = s, No(s) || Ie(s) ? No(l) ? h = r ? Yt(l) : l : ge(l) ? h = Yt(l) : (p = !1, h = tt(s)) : Ae(s) || pe(s) ? pe(l) ? h = Ue(l) : !xe(l) || r && de(l) ? (p = !1, h = tt(s)) : h = r ? tt(l) : l : p = !1), a.set(s, h), p && Ot(h, s, r, e, a) } Gn(n, c, h) } else c = e ? e(n[f], u, f + "", n, t, o) : Z, c === Z && (c = u), Gn(n, f, c) }) } } function kt(n, t, r) { var e = -1, u = wr(); return t = a(t.length ? t : Array(1), function(n) { return u(n) }), n = mt(n, function(n, r, u) { return { a: a(t, function(t) { return t(n) }), b: ++e, c: n } }), b(n, function(n, t) { var e; n: { e = -1; for (var u = n.a, o = t.a, i = u.length, f = r.length; ++e < i;) { var c = I(u[e], o[e]); if (c) { if (e >= f) { e = c; break n } e = c * ("desc" == r[e] ? -1 : 1); break n } } e = n.b - t.b } return e }) } function Et(n, t) { return n = Object(n), s(t, function(t, r) { return r in n && (t[r] = n[r]), t }, {}) } function It(n, t) { var r = {}; return ct(n, function(n, e) { t(n, e) && (r[e] = n) }), r } function St(n) { return function(t) { return null == t ? Z : t[n] } } function Rt(n) { return function(t) { return ht(t, n) } } function Wt(n, t, r) { var e = -1, u = t.length, o = n; for (r && (o = a(n, function(n) { return r(n) })); ++e < u;) for (var i = 0, f = t[e], f = r ? r(f) : f; - 1 < (i = d(o, f, i));) o !== n && Ou.call(o, i, 1), Ou.call(n, i, 1); return n } function Bt(n, t) { for (var r = n ? t.length : 0, e = r - 1; r--;) { var u = t[r]; if (e == r || u != o) { var o = u; if (U(u)) Ou.call(n, u, 1); else if (Cr(u, n)) delete n[u]; else { var u = Nt(u), i = $r(n, u); null != i && delete i[Kr(u)] } } } return n } function Ct(n, t) { return n + Eu(Uu() * (t - n + 1)) } function Ut(n, t, r, e) { t = Cr(t, n) ? [t + ""] : Nt(t); for (var u = -1, o = t.length, i = o - 1, f = n; null != f && ++u < o;) { var c = t[u]; if (xe(f)) { var a = r; if (u != i) { var l = f[c], a = e ? e(l, c, f) : Z; a === Z && (a = null == l ? U(t[u + 1]) ? [] : {} : l) } Yn(f, c, a) } f = f[c] } return n } function zt(n, t, r) { var e = -1, u = n.length; for (0 > t && (t = -t > u ? 0 : u + t), r = r > u ? u : r, 0 > r && (r += u), u = t > r ? 0 : r - t >>> 0, t >>>= 0, r = Array(u); ++e < u;) r[e] = n[e + t]; return r } function Mt(n, t) { var r; return Ju(n, function(n, e, u) { return r = t(n, e, u), !r }), !!r } function Lt(n, t, r) { var e = 0, u = n ? n.length : e; if ("number" == typeof t && t === t && 2147483647 >= u) { for (; u > e;) { var o = e + u >>> 1, i = n[o]; (r ? t >= i : t > i) && null !== i ? e = o + 1 : u = o } return u } return $t(n, t, Ve, r) } function $t(n, t, r, e) { t = r(t); for (var u = 0, o = n ? n.length : 0, i = t !== t, f = null === t, c = t === Z; o > u;) { var a = Eu((u + o) / 2), l = r(n[a]), s = l !== Z, h = l === l; (i ? h || e : f ? h && s && (e || null != l) : c ? h && (e || s) : null == l ? 0 : e ? t >= l : t > l) ? u = a + 1: o = a } return Bu(o, 4294967294) } function Ft(n, t) { for (var r = 0, e = n.length, u = n[0], o = t ? t(u) : u, i = o, f = 0, c = [u]; ++r < e;) u = n[r], o = t ? t(u) : u, se(o, i) || (i = o, c[++f] = u); return c } function Nt(n) { return No(n) ? n : Fr(n) } function Dt(n, t, r) { var e = -1, u = f, o = n.length, i = !0, a = [], l = a; if (r) i = !1, u = c; else if (o < 200) l = t ? [] : a; else { if (u = t ? null : no(n)) return $(u); i = !1, u = Ln, l = new Mn } n: for (; ++e < o;) { var s = n[e], h = t ? t(s) : s; if (i && h === h) { for (var p = l.length; p--;) if (l[p] === h) continue n; t && l.push(h), a.push(s) } else u(l, h, r) || (l !== a && l.push(h), a.push(s)) } return a } function Zt(n, t, r, e) { for (var u = n.length, o = e ? u : -1; (e ? o-- : ++o < u) && t(n[o], o, n);); return r ? zt(n, e ? 0 : o, e ? o + 1 : u) : zt(n, e ? o + 1 : 0, e ? u : o) } function qt(n, t) { var r = n; return r instanceof An && (r = r.value()), s(t, function(n, t) { return t.func.apply(t.thisArg, l([n], t.args)) }, r) } function Pt(n, t, r) { for (var e = -1, u = n.length; ++e < u;) var o = o ? l(ut(o, n[e], t, r), ut(n[e], o, t, r)) : n[e]; return o && o.length ? Dt(o, t, r) : [] } function Tt(n, t, r) { for (var e = -1, u = n.length, o = t.length, i = {}; ++e < u;) r(i, n[e], o > e ? t[e] : Z); return i } function Kt(n, t) { if (t) return n.slice(); var r = new n.constructor(n.length); return n.copy(r), r } function Gt(n) { var t = new n.constructor(n.byteLength); return new du(t).set(new du(n)), t } function Vt(n, t, r) { for (var e = r.length, u = -1, o = Wu(n.length - e, 0), i = -1, f = t.length, c = Array(f + o); ++i < f;) c[i] = t[i]; for (; ++u < e;) c[r[u]] = n[u]; for (; o--;) c[i++] = n[u++]; return c } function Jt(n, t, r) { for (var e = -1, u = r.length, o = -1, i = Wu(n.length - u, 0), f = -1, c = t.length, a = Array(i + c); ++o < i;) a[o] = n[o]; for (i = o; ++f < c;) a[i + f] = t[f]; for (; ++e < u;) a[i + r[e]] = n[o++]; return a } function Yt(n, t) { var r = -1, e = n.length; for (t || (t = Array(e)); ++r < e;) t[r] = n[r]; return t } function Ht(n, t, r) { return Qt(n, t, r) } function Qt(n, t, r, e) { r || (r = {}); for (var u = -1, o = t.length; ++u < o;) { var i = t[u], f = e ? e(r[i], n[i], i, r, n) : n[i]; Yn(r, i, f) } return r } function Xt(n, t) { return Ht(n, eo(n), t) } function nr(n, t) { return function(r, u) { var o = No(r) ? e : Hn, i = t ? t() : {}; return o(r, n, wr(u), i) } } function tr(n) { return le(function(t, r) { var e = -1, u = r.length, o = u > 1 ? r[u - 1] : Z, i = u > 2 ? r[2] : Z, o = "function" == typeof o ? (u--, o) : Z; for (i && Br(r[0], r[1], i) && (o = 3 > u ? Z : o, u = 1), t = Object(t); ++e < u;)(i = r[e]) && n(t, i, e, o); return t }) } function rr(n, t) { return function(r, e) { if (null == r) return r; if (!_e(r)) return n(r, e); for (var u = r.length, o = t ? u : -1, i = Object(r); (t ? o-- : ++o < u) && !1 !== e(i[o], o, i);); return r } } function er(n) { return function(t, r, e) { var u = -1, o = Object(t); e = e(t); for (var i = e.length; i--;) { var f = e[n ? i : ++u]; if (!1 === r(o[f], f, o)) break } return t } } function ur(n, t, r) { function e() { return (this && this !== Vn && this instanceof e ? o : n).apply(u ? r : this, arguments) } var u = 1 & t, o = fr(n); return e } function or(n) { return function(t) { t = ze(t); var r = En.test(t) ? t.match(kn) : Z, e = r ? r[0] : t.charAt(0); return t = r ? r.slice(1).join("") : t.slice(1), e[n]() + t } } function ir(n) { return function(t) { return s(Ke(Pe(t)), n, "") } } function fr(n) { return function() { var t = arguments; switch (t.length) { case 0: return new n; case 1: return new n(t[0]); case 2: return new n(t[0], t[1]); case 3: return new n(t[0], t[1], t[2]); case 4: return new n(t[0], t[1], t[2], t[3]); case 5: return new n(t[0], t[1], t[2], t[3], t[4]); case 6: return new n(t[0], t[1], t[2], t[3], t[4], t[5]); case 7: return new n(t[0], t[1], t[2], t[3], t[4], t[5], t[6]) } var r = Vu(n.prototype), t = n.apply(r, t); return xe(t) ? t : r } } function cr(n, t, e) { function u() { for (var i = arguments.length, f = i, c = Array(i), a = this && this !== Vn && this instanceof u ? o : n, l = yn.placeholder || u.placeholder; f--;) c[f] = arguments[f]; return f = 3 > i && c[0] !== l && c[i - 1] !== l ? [] : L(c, l), i -= f.length, e > i ? vr(n, t, lr, l, Z, c, f, Z, Z, e - i) : r(a, this, c) } var o = fr(n); return u } function ar(n) { return le(function(t) { t = ft(t); var r = t.length, e = r, u = wn.prototype.thru; for (n && t.reverse(); e--;) { var o = t[e]; if ("function" != typeof o) throw new uu("Expected a function"); if (u && !i && "wrapper" == mr(o)) var i = new wn([], (!0)) } for (e = i ? e : r; ++e < r;) var o = t[e], u = mr(o), f = "wrapper" == u ? to(o) : Z, i = f && zr(f[0]) && 424 == f[1] && !f[4].length && 1 == f[9] ? i[mr(f[0])].apply(i, f[3]) : 1 == o.length && zr(o) ? i[u]() : i.thru(o); return function() { var n = arguments, e = n[0]; if (i && 1 == n.length && No(e) && e.length >= 200) return i.plant(e).value(); for (var u = 0, n = r ? t[u].apply(this, n) : e; ++u < r;) n = t[u].call(this, n); return n } }) } function lr(n, t, r, e, u, o, i, f, c, a) { function l() { for (var y = arguments.length, b = y, x = Array(y); b--;) x[b] = arguments[b]; if (e && (x = Vt(x, e, u)), o && (x = Jt(x, o, i)), _ || g) { var b = yn.placeholder || l.placeholder, j = L(x, b), y = y - j.length; if (a > y) return vr(n, t, lr, b, r, x, j, f, c, a - y) } if (y = h ? r : this, b = p ? y[n] : n, f) for (var j = x.length, m = Bu(f.length, j), w = Yt(x); m--;) { var A = f[m]; x[m] = U(A, j) ? w[A] : Z } else v && x.length > 1 && x.reverse(); return s && x.length > c && (x.length = c), this && this !== Vn && this instanceof l && (b = d || fr(b)), b.apply(y, x) } var s = 128 & t, h = 1 & t, p = 2 & t, _ = 8 & t, g = 16 & t, v = 512 & t, d = p ? Z : fr(n); return l } function sr(n, t) { return function(r, e) { return vt(r, n, t(e), {}) } } function hr(n) { return le(function(t) { return t = a(ft(t), wr()), le(function(e) { var u = this; return n(t, function(n) { return r(n, u, e) }) }) }) } function pr(n, t, r) { return t = We(t), n = F(n), t && t > n ? (t -= n, r = r === Z ? " " : r + "", n = Te(r, ku(t / F(r))), En.test(r) ? n.match(kn).slice(0, t).join("") : n.slice(0, t)) : "" } function _r(n, t, e, u) { function o() { for (var t = -1, c = arguments.length, a = -1, l = u.length, s = Array(l + c), h = this && this !== Vn && this instanceof o ? f : n; ++a < l;) s[a] = u[a]; for (; c--;) s[a++] = arguments[++t]; return r(h, i ? e : this, s) } var i = 1 & t, f = fr(n); return o } function gr(n) { return function(t, r, e) { e && "number" != typeof e && Br(t, r, e) && (r = e = Z), t = Ce(t), t = t === t ? t : 0, r === Z ? (r = t, t = 0) : r = Ce(r) || 0, e = e === Z ? r > t ? 1 : -1 : Ce(e) || 0; var u = -1; r = Wu(ku((r - t) / (e || 1)), 0); for (var o = Array(r); r--;) o[n ? r : ++u] = t, t += e; return o } } function vr(n, t, r, e, u, o, i, f, c, a) { var l = 8 & t; f = f ? Yt(f) : Z; var s = l ? i : Z; i = l ? Z : i; var h = l ? o : Z; return o = l ? Z : o, t = (t | (l ? 32 : 64)) & ~(l ? 64 : 32), 4 & t || (t &= -4), t = [n, t, u, h, s, o, i, f, c, a], r = r.apply(Z, t), zr(n) && uo(r, t), r.placeholder = e, r } function dr(n) { var t = ru[n]; return function(n, r) { if (n = Ce(n), r = We(r)) { var e = (ze(n) + "e").split("e"), e = t(e[0] + "e" + (+e[1] + r)), e = (ze(e) + "e").split("e"); return +(e[0] + "e" + (+e[1] - r)) } return t(n) } } function yr(n, t, r, e, u, o, i, f) { var c = 2 & t; if (!c && "function" != typeof n) throw new uu("Expected a function"); var a = e ? e.length : 0; if (a || (t &= -97, e = u = Z), i = i === Z ? i : Wu(We(i), 0), f = f === Z ? f : We(f), a -= u ? u.length : 0, 64 & t) { var l = e, s = u; e = u = Z } var h = c ? Z : to(n); return o = [n, t, r, e, u, l, s, o, i, f], h && (r = o[1], n = h[1], t = r | n, e = 128 == n && 8 == r || 128 == n && 256 == r && h[8] >= o[7].length || 384 == n && h[8] >= h[7].length && 8 == r, 131 > t || e) && (1 & n && (o[2] = h[2], t |= 1 & r ? 0 : 4), (r = h[3]) && (e = o[3], o[3] = e ? Vt(e, r, h[4]) : Yt(r), o[4] = e ? L(o[3], "__lodash_placeholder__") : Yt(h[4])), (r = h[5]) && (e = o[5], o[5] = e ? Jt(e, r, h[6]) : Yt(r), o[6] = e ? L(o[5], "__lodash_placeholder__") : Yt(h[6])), (r = h[7]) && (o[7] = Yt(r)), 128 & n && (o[8] = null == o[8] ? h[8] : Bu(o[8], h[8])), null == o[9] && (o[9] = h[9]), o[0] = h[0], o[1] = t), n = o[0], t = o[1], r = o[2], e = o[3], u = o[4], f = o[9] = null == o[9] ? c ? 0 : n.length : Wu(o[9] - a, 0), !f && 24 & t && (t &= -25), c = t && 1 != t ? 8 == t || 16 == t ? cr(n, t, f) : 32 != t && 33 != t || u.length ? lr.apply(Z, o) : _r(n, t, r, e) : ur(n, t, r), (h ? Xu : uo)(c, o) } function br(n, t, r, e, u, o) { var i = -1, f = 2 & u, c = 1 & u, a = n.length, l = t.length; if (!(a == l || f && l > a)) return !1; if (l = o.get(n)) return l == t; for (l = !0, o.set(n, t); ++i < a;) { var s = n[i], h = t[i]; if (e) var _ = f ? e(h, s, i, t, n, o) : e(s, h, i, n, t, o); if (_ !== Z) { if (_) continue; l = !1; break } if (c) { if (!p(t, function(n) { return s === n || r(s, n, e, u, o) })) { l = !1; break } } else if (s !== h && !r(s, h, e, u, o)) { l = !1; break } } return o["delete"](n), l } function xr(n, t, r, e, u, o) { switch (r) { case "[object ArrayBuffer]": if (n.byteLength != t.byteLength || !e(new du(n), new du(t))) break; return !0; case "[object Boolean]": case "[object Date]": return +n == +t; case "[object Error]": return n.name == t.name && n.message == t.message; case "[object Number]": return n != +n ? t != +t : n == +t; case "[object RegExp]": case "[object String]": return n == t + ""; case "[object Map]": var i = M; case "[object Set]": return i || (i = $), (2 & o || n.size == t.size) && e(i(n), i(t), u, 1 | o); case "[object Symbol]": return !!vu && Tu.call(n) == Tu.call(t) } return !1 } function jr(n, t, r, e, u, o) { var i = 2 & u, f = Fe(n), c = f.length, a = Fe(t).length; if (c != a && !i) return !1; for (var l = c; l--;) { var s = f[l]; if (!(i ? s in t : pt(t, s))) return !1 } if (a = o.get(n)) return a == t; a = !0, o.set(n, t); for (var h = i; ++l < c;) { var s = f[l], p = n[s], _ = t[s]; if (e) var g = i ? e(_, p, s, t, n, o) : e(p, _, s, n, t, o); if (g === Z ? p !== _ && !r(p, _, e, u, o) : !g) { a = !1; break } h || (h = "constructor" == s) } return a && !h && (r = n.constructor, e = t.constructor, r != e && "constructor" in n && "constructor" in t && !("function" == typeof r && r instanceof r && "function" == typeof e && e instanceof e) && (a = !1)), o["delete"](n), a } function mr(n) { for (var t = n.name + "", r = Gu[t], e = cu.call(Gu, t) ? r.length : 0; e--;) { var u = r[e], o = u.func; if (null == o || o == n) return u.name } return t } function wr() { var n = yn.iteratee || Je, n = n === Je ? xt : n; return arguments.length ? n(arguments[0], arguments[1]) : n } function Ar(n) { n = De(n); for (var t = n.length; t--;) { var r, e = n[t]; r = n[t][1], r = r === r && !xe(r), e[2] = r } return n } function Or(n, t) { var r = null == n ? Z : n[t]; return me(r) ? r : Z } function kr(n) { return su.call(n) } function Er(n, t, r) { if (null == n) return !1; var e = r(n, t); return e || Cr(t) || (t = Nt(t), n = $r(n, t), null != n && (t = Kr(t), e = r(n, t))), r = n ? n.length : Z, e || !!r && be(r) && U(t, r) && (No(n) || ke(n) || pe(n)) } function Ir(n) { var t = n.length, r = n.constructor(t); return t && "string" == typeof n[0] && cu.call(n, "index") && (r.index = n.index, r.input = n.input), r } function Sr(n) { return Mr(n) ? {} : (n = n.constructor, Vu(de(n) ? n.prototype : Z)) } function Rr(r, e, u) { var o = r.constructor; switch (e) { case "[object ArrayBuffer]": return Gt(r); case "[object Boolean]": case "[object Date]": return new o((+r)); case "[object Float32Array]": case "[object Float64Array]": case "[object Int8Array]": case "[object Int16Array]": case "[object Int32Array]": case "[object Uint8Array]": case "[object Uint8ClampedArray]": case "[object Uint16Array]": case "[object Uint32Array]": return e = r.buffer, new r.constructor(u ? Gt(e) : e, r.byteOffset, r.length); case "[object Map]": return u = r.constructor, s(M(r), n, new u); case "[object Number]": case "[object String]": return new o(r); case "[object RegExp]": return u = new r.constructor(r.source, hn.exec(r)), u.lastIndex = r.lastIndex, u; case "[object Set]": return u = r.constructor, s($(r), t, new u); case "[object Symbol]": return vu ? Object(Tu.call(r)) : {} } } function Wr(n) { var t = n ? n.length : Z; return be(t) && (No(n) || ke(n) || pe(n)) ? j(t, String) : null } function Br(n, t, r) { if (!xe(r)) return !1; var e = typeof t; return !!("number" == e ? _e(r) && U(t, r.length) : "string" == e && t in r) && se(r[t], n) } function Cr(n, t) { return "number" == typeof n || !No(n) && (rn.test(n) || !tn.test(n) || null != t && n in Object(t)) } function Ur(n) { var t = typeof n; return "number" == t || "boolean" == t || "string" == t && "__proto__" !== n || null == n } function zr(n) { var t = mr(n), r = yn[t]; return "function" == typeof r && t in An.prototype && (n === r || (t = to(r), !!t && n === t[0])) } function Mr(n) { var t = n && n.constructor; return n === ("function" == typeof t && t.prototype || iu) } function Lr(n, t, r, e, u, o) { return xe(n) && xe(t) && (o.set(t, n), Ot(n, t, Z, Lr, o)), n } function $r(n, t) { return 1 == t.length ? n : Me(n, zt(t, 0, -1)) } function Fr(n) { var t = []; return ze(n).replace(en, function(n, r, e, u) { t.push(e ? u.replace(ln, "$1") : r || n) }), t } function Nr(n) { return ge(n) ? n : [] } function Dr(n) { return "function" == typeof n ? n : Ve } function Zr(n) { if (n instanceof An) return n.clone(); var t = new wn(n.__wrapped__, n.__chain__); return t.__actions__ = Yt(n.__actions__), t.__index__ = n.__index__, t.__values__ = n.__values__, t } function qr(n, t, r) { var e = n ? n.length : 0; return e ? (t = r || t === Z ? 1 : We(t), zt(n, 0 > t ? 0 : t, e)) : [] } function Pr(n, t, r) { var e = n ? n.length : 0; return e ? (t = r || t === Z ? 1 : We(t), t = e - t, zt(n, 0, 0 > t ? 0 : t)) : [] } function Tr(n) { return n ? n[0] : Z } function Kr(n) { var t = n ? n.length : 0; return t ? n[t - 1] : Z } function Gr(n, t) { return n && n.length && t && t.length ? Wt(n, t) : n } function Vr(n) { return n ? zu.call(n) : n } function Jr(n) { if (!n || !n.length) return []; var t = 0; return n = i(n, function(n) { return ge(n) ? (t = Wu(n.length, t), !0) : void 0 }), j(t, function(t) { return a(n, St(t)) }) } function Yr(n, t) { if (!n || !n.length) return []; var e = Jr(n); return null == t ? e : a(e, function(n) { return r(t, Z, n) }) } function Hr(n) { return n = yn(n), n.__chain__ = !0, n } function Qr(n, t) { return t(n) } function Xr() { return this } function ne(n, t) { return "function" == typeof t && No(n) ? u(n, t) : Ju(n, Dr(t)) } function te(n, t) { var r; if ("function" == typeof t && No(n)) { for (r = n.length; r-- && !1 !== t(n[r], r, n);); r = n } else r = Yu(n, Dr(t)); return r } function re(n, t) { return (No(n) ? a : mt)(n, wr(t, 3)) } function ee(n, t) { var r = -1, e = Re(n), u = e.length, o = u - 1; for (t = nt(We(t), 0, u); ++r < t;) { var u = Ct(r, o), i = e[u]; e[u] = e[r], e[r] = i } return e.length = t, e } function ue(n, t, r) { return t = r ? Z : t, t = n && null == t ? n.length : t, yr(n, 128, Z, Z, Z, Z, t) } function oe(n, t) { var r; if ("function" != typeof t) throw new uu("Expected a function"); return n = We(n), function() { return 0 < --n && (r = t.apply(this, arguments)), 1 >= n && (t = Z), r } } function ie(n, t, r) { return t = r ? Z : t, n = yr(n, 8, Z, Z, Z, Z, Z, t), n.placeholder = yn.placeholder || ie.placeholder, n } function fe(n, t, r) { return t = r ? Z : t, n = yr(n, 16, Z, Z, Z, Z, Z, t), n.placeholder = yn.placeholder || fe.placeholder, n } function ce(n, t, r) { function e() { p && yu(p), a && yu(a), g = 0, c = a = h = p = _ = Z } function u(t, r) { r && yu(r), a = p = _ = Z, t && (g = Wo(), l = n.apply(h, c), p || a || (c = h = Z)) } function o() { var n = t - (Wo() - s); 0 >= n || n > t ? u(_, a) : p = Au(o, n) } function i() { u(y, p) } function f() { if (c = arguments, s = Wo(), h = this, _ = y && (p || !v), !1 === d) var r = v && !p; else { g || a || v || (g = s); var e = d - (s - g), u = 0 >= e || e > d; u ? (a && (a = yu(a)), g = s, l = n.apply(h, c)) : a || (a = Au(i, e)) } return u && p ? p = yu(p) : p || t === d || (p = Au(o, t)), r && (u = !0, l = n.apply(h, c)), !u || p || a || (c = h = Z), l } var c, a, l, s, h, p, _, g = 0, v = !1, d = !1, y = !0; if ("function" != typeof n) throw new uu("Expected a function"); return t = Ce(t) || 0, xe(r) && (v = !!r.leading, d = "maxWait" in r && Wu(Ce(r.maxWait) || 0, t), y = "trailing" in r ? !!r.trailing : y), f.cancel = e, f.flush = function() { return (p && _ || a && y) && (l = n.apply(h, c)), e(), l }, f } function ae(n, t) { if ("function" != typeof n || t && "function" != typeof t) throw new uu("Expected a function"); var r = function() { var e = arguments, u = t ? t.apply(this, e) : e[0], o = r.cache; return o.has(u) ? o.get(u) : (e = n.apply(this, e), r.cache = o.set(u, e), e) }; return r.cache = new ae.Cache, r } function le(n, t) { if ("function" != typeof n) throw new uu("Expected a function"); return t = Wu(t === Z ? n.length - 1 : We(t), 0), function() { for (var e = arguments, u = -1, o = Wu(e.length - t, 0), i = Array(o); ++u < o;) i[u] = e[t + u]; switch (t) { case 0: return n.call(this, i); case 1: return n.call(this, e[0], i); case 2: return n.call(this, e[0], e[1], i) } for (o = Array(t + 1), u = -1; ++u < t;) o[u] = e[u]; return o[t] = i, r(n, this, o) } } function se(n, t) { return n === t || n !== n && t !== t } function he(n, t) { return n > t } function pe(n) { return ge(n) && cu.call(n, "callee") && (!wu.call(n, "callee") || "[object Arguments]" == su.call(n)) } function _e(n) { return null != n && !("function" == typeof n && de(n)) && be(ro(n)) } function ge(n) { return je(n) && _e(n) } function ve(n) { return je(n) && "string" == typeof n.message && "[object Error]" == su.call(n) } function de(n) { return n = xe(n) ? su.call(n) : "", "[object Function]" == n || "[object GeneratorFunction]" == n } function ye(n) { return "number" == typeof n && n == We(n) } function be(n) { return "number" == typeof n && n > -1 && 0 == n % 1 && 9007199254740991 >= n } function xe(n) { var t = typeof n; return !!n && ("object" == t || "function" == t) } function je(n) { return !!n && "object" == typeof n } function me(n) { return null != n && (de(n) ? pu.test(fu.call(n)) : je(n) && (C(n) ? pu : vn).test(n)) } function we(n) { return "number" == typeof n || je(n) && "[object Number]" == su.call(n) } function Ae(n) { if (!je(n) || "[object Object]" != su.call(n) || C(n)) return !1; var t = iu; return "function" == typeof n.constructor && (t = xu(n)), null === t || (n = t.constructor, "function" == typeof n && n instanceof n && fu.call(n) == lu) } function Oe(n) { return xe(n) && "[object RegExp]" == su.call(n) } function ke(n) { return "string" == typeof n || !No(n) && je(n) && "[object String]" == su.call(n) } function Ee(n) { return "symbol" == typeof n || je(n) && "[object Symbol]" == su.call(n) } function Ie(n) { return je(n) && be(n.length) && !!Bn[su.call(n)] } function Se(n, t) { return t > n } function Re(n) { if (!n) return []; if (_e(n)) return ke(n) ? n.match(kn) : Yt(n); if (mu && n[mu]) return z(n[mu]()); var t = kr(n); return ("[object Map]" == t ? M : "[object Set]" == t ? $ : Ze)(n) } function We(n) { if (!n) return 0 === n ? n : 0; if (n = Ce(n), n === q || n === -q) return 1.7976931348623157e308 * (0 > n ? -1 : 1); var t = n % 1; return n === n ? t ? n - t : n : 0 } function Be(n) { return n ? nt(We(n), 0, 4294967295) : 0 } function Ce(n) { if (xe(n) && (n = de(n.valueOf) ? n.valueOf() : n, n = xe(n) ? n + "" : n), "string" != typeof n) return 0 === n ? n : +n; n = n.replace(fn, ""); var t = gn.test(n); return t || dn.test(n) ? Nn(n.slice(2), t ? 2 : 8) : _n.test(n) ? P : +n } function Ue(n) { return Ht(n, Ne(n)) } function ze(n) { if ("string" == typeof n) return n; if (null == n) return ""; if (Ee(n)) return vu ? Ku.call(n) : ""; var t = n + ""; return "0" == t && 1 / n == -q ? "-0" : t } function Me(n, t, r) { return n = null == n ? Z : ht(n, t), n === Z ? r : n } function Le(n, t) { return Er(n, t, pt) } function $e(n, t) { return Er(n, t, _t) } function Fe(n) { var t = Mr(n); if (!t && !_e(n)) return Ru(Object(n)); var r, e = Wr(n), u = !!e, e = e || [], o = e.length; for (r in n) !pt(n, r) || u && ("length" == r || U(r, o)) || t && "constructor" == r || e.push(r); return e } function Ne(n) { for (var t = -1, r = Mr(n), e = jt(n), u = e.length, o = Wr(n), i = !!o, o = o || [], f = o.length; ++t < u;) { var c = e[t]; i && ("length" == c || U(c, f)) || "constructor" == c && (r || !cu.call(n, c)) || o.push(c) } return o } function De(n) { return m(n, Fe(n)) } function Ze(n) { return n ? A(n, Fe(n)) : [] } function qe(n) { return ii(ze(n).toLowerCase()) } function Pe(n) { return (n = ze(n)) && n.replace(bn, S).replace(On, "") } function Te(n, t) { n = ze(n), t = We(t); var r = ""; if (!n || 1 > t || t > 9007199254740991) return r; do t % 2 && (r += n), t = Eu(t / 2), n += n; while (t); return r } function Ke(n, t, r) { return n = ze(n), t = r ? Z : t, t === Z && (t = Rn.test(n) ? Sn : In), n.match(t) || [] } function Ge(n) { return function() { return n } } function Ve(n) { return n } function Je(n) { return xt("function" == typeof n ? n : tt(n, !0)) } function Ye(n, t, r) { var e = Fe(t), o = st(t, e); null != r || xe(t) && (o.length || !e.length) || (r = t, t = n, n = this, o = st(t, Fe(t))); var i = !(xe(r) && "chain" in r) || r.chain, f = de(n); return u(o, function(r) { var e = t[r]; n[r] = e, f && (n.prototype[r] = function() { var t = this.__chain__; if (i || t) { var r = n(this.__wrapped__); return (r.__actions__ = Yt(this.__actions__)).push({ func: e, args: arguments, thisArg: n }), r.__chain__ = t, r } return e.apply(n, l([this.value()], arguments)) }) }), n } function He() {} function Qe(n) { return Cr(n) ? St(n) : Rt(n) } function Xe(n) { return n && n.length ? x(n, Ve) : 0 } E = E ? Jn.defaults({}, E, Jn.pick(Vn, Wn)) : Vn; var nu = E.Date, tu = E.Error, ru = E.Math, eu = E.RegExp, uu = E.TypeError, ou = E.Array.prototype, iu = E.Object.prototype, fu = E.Function.prototype.toString, cu = iu.hasOwnProperty, au = 0, lu = fu.call(Object), su = iu.toString, hu = Vn._, pu = eu("^" + fu.call(cu).replace(un, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"), _u = Kn ? E.Buffer : Z, gu = E.Reflect, vu = E.Symbol, du = E.Uint8Array, yu = E.clearTimeout, bu = gu ? gu.enumerate : Z, xu = Object.getPrototypeOf, ju = Object.getOwnPropertySymbols, mu = "symbol" == typeof(mu = vu && vu.iterator) ? mu : Z, wu = iu.propertyIsEnumerable, Au = E.setTimeout, Ou = ou.splice, ku = ru.ceil, Eu = ru.floor, Iu = E.isFinite, Su = ou.join, Ru = Object.keys, Wu = ru.max, Bu = ru.min, Cu = E.parseInt, Uu = ru.random, zu = ou.reverse, Mu = Or(E, "Map"), Lu = Or(E, "Set"), $u = Or(E, "WeakMap"), Fu = Or(Object, "create"), Nu = $u && new $u, Du = Mu ? fu.call(Mu) : "", Zu = Lu ? fu.call(Lu) : "", qu = $u ? fu.call($u) : "", Pu = vu ? vu.prototype : Z, Tu = vu ? Pu.valueOf : Z, Ku = vu ? Pu.toString : Z, Gu = {}; yn.templateSettings = { escape: Q, evaluate: X, interpolate: nn, variable: "", imports: { _: yn } }; var Vu = function() { function n() {} return function(t) { if (xe(t)) { n.prototype = t; var r = new n; n.prototype = Z } return r || {} } }(), Ju = rr(at), Yu = rr(lt, !0), Hu = er(), Qu = er(!0); bu && !wu.call({ valueOf: 1 }, "valueOf") && (jt = function(n) { return z(bu(n)) }); var Xu = Nu ? function(n, t) { return Nu.set(n, t), n } : Ve, no = Lu && 2 === new Lu([1, 2]).size ? function(n) { return new Lu(n) } : He, to = Nu ? function(n) { return Nu.get(n) } : He, ro = St("length"), eo = ju || function() { return [] }; (Mu && "[object Map]" != kr(new Mu) || Lu && "[object Set]" != kr(new Lu) || $u && "[object WeakMap]" != kr(new $u)) && (kr = function(n) { var t = su.call(n); if (n = "[object Object]" == t ? n.constructor : null, n = "function" == typeof n ? fu.call(n) : "") switch (n) { case Du: return "[object Map]"; case Zu: return "[object Set]"; case qu: return "[object WeakMap]" } return t }); var uo = function() { var n = 0, t = 0; return function(r, e) { var u = Wo(), o = 16 - (u - t); if (t = u, o > 0) { if (150 <= ++n) return r } else n = 0; return Xu(r, e) } }(), oo = le(function(n, t) { No(n) || (n = null == n ? [] : [Object(n)]), t = ft(t); for (var r = n, e = t, u = -1, o = r.length, i = -1, f = e.length, c = Array(o + f); ++u < o;) c[u] = r[u]; for (; ++i < f;) c[u++] = e[i]; return c }), io = le(function(n, t) { return ge(n) ? ut(n, ft(t, !1, !0)) : [] }), fo = le(function(n, t) { var r = Kr(t); return ge(r) && (r = Z), ge(n) ? ut(n, ft(t, !1, !0), wr(r)) : [] }), co = le(function(n, t) { var r = Kr(t); return ge(r) && (r = Z), ge(n) ? ut(n, ft(t, !1, !0), Z, r) : [] }), ao = le(function(n) { var t = a(n, Nr); return t.length && t[0] === n[0] ? gt(t) : [] }), lo = le(function(n) { var t = Kr(n), r = a(n, Nr); return t === Kr(r) ? t = Z : r.pop(), r.length && r[0] === n[0] ? gt(r, wr(t)) : [] }), so = le(function(n) { var t = Kr(n), r = a(n, Nr); return t === Kr(r) ? t = Z : r.pop(), r.length && r[0] === n[0] ? gt(r, Z, t) : [] }), ho = le(Gr), po = le(function(n, t) { t = a(ft(t), String); var r = Xn(n, t); return Bt(n, t.sort(I)), r }), _o = le(function(n) { return Dt(ft(n, !1, !0)) }), go = le(function(n) { var t = Kr(n); return ge(t) && (t = Z), Dt(ft(n, !1, !0), wr(t)) }), vo = le(function(n) { var t = Kr(n); return ge(t) && (t = Z), Dt(ft(n, !1, !0), Z, t) }), yo = le(function(n, t) { return ge(n) ? ut(n, t) : [] }), bo = le(function(n) { return Pt(i(n, ge)) }), xo = le(function(n) { var t = Kr(n); return ge(t) && (t = Z), Pt(i(n, ge), wr(t)) }), jo = le(function(n) { var t = Kr(n); return ge(t) && (t = Z), Pt(i(n, ge), Z, t) }), mo = le(Jr), wo = le(function(n) { var t = n.length, t = t > 1 ? n[t - 1] : Z, t = "function" == typeof t ? (n.pop(), t) : Z; return Yr(n, t) }), Ao = le(function(n) { n = ft(n); var t = n.length, r = t ? n[0] : 0, e = this.__wrapped__, u = function(t) { return Xn(t, n) }; return 1 >= t && !this.__actions__.length && e instanceof An && U(r) ? (e = e.slice(r, +r + (t ? 1 : 0)), e.__actions__.push({ func: Qr, args: [u], thisArg: Z }), new wn(e, this.__chain__).thru(function(n) { return t && !n.length && n.push(Z), n })) : this.thru(u) }), Oo = nr(function(n, t, r) { cu.call(n, r) ? ++n[r] : n[r] = 1 }), ko = nr(function(n, t, r) { cu.call(n, r) ? n[r].push(t) : n[r] = [t] }), Eo = le(function(n, t, e) { var u = -1, o = "function" == typeof t, i = Cr(t), f = _e(n) ? Array(n.length) : []; return Ju(n, function(n) { var c = o ? t : i && null != n ? n[t] : Z; f[++u] = c ? r(c, n, e) : dt(n, t, e) }), f }), Io = nr(function(n, t, r) { n[r] = t }), So = nr(function(n, t, r) { n[r ? 0 : 1].push(t) }, function() { return [ [], [] ] }), Ro = le(function(n, t) { if (null == n) return []; var r = t.length; return r > 1 && Br(n, t[0], t[1]) ? t = [] : r > 2 && Br(t[0], t[1], t[2]) && (t.length = 1), kt(n, ft(t), []) }), Wo = nu.now, Bo = le(function(n, t, r) { var e = 1; if (r.length) var u = L(r, yn.placeholder || Bo.placeholder), e = 32 | e; return yr(n, e, t, r, u) }), Co = le(function(n, t, r) { var e = 3; if (r.length) var u = L(r, yn.placeholder || Co.placeholder), e = 32 | e; return yr(t, e, n, r, u) }), Uo = le(function(n, t) { return et(n, 1, t) }), zo = le(function(n, t, r) { return et(n, Ce(t) || 0, r) }), Mo = le(function(n, t) { t = a(ft(t), wr()); var e = t.length; return le(function(u) { for (var o = -1, i = Bu(u.length, e); ++o < i;) u[o] = t[o].call(this, u[o]); return r(n, this, u) }) }), Lo = le(function(n, t) { var r = L(t, yn.placeholder || Lo.placeholder); return yr(n, 32, Z, t, r) }), $o = le(function(n, t) { var r = L(t, yn.placeholder || $o.placeholder); return yr(n, 64, Z, t, r) }), Fo = le(function(n, t) { return yr(n, 256, Z, Z, Z, ft(t)) }), No = Array.isArray, Do = _u ? function(n) { return n instanceof _u } : Ge(!1), Zo = tr(function(n, t) { Ht(t, Fe(t), n) }), qo = tr(function(n, t) { Ht(t, Ne(t), n) }), Po = tr(function(n, t, r, e) { Qt(t, Ne(t), n, e) }), To = tr(function(n, t, r, e) { Qt(t, Fe(t), n, e) }), Ko = le(function(n, t) { return Xn(n, ft(t)) }), Go = le(function(n) { return n.push(Z, Tn), r(Po, Z, n) }), Vo = le(function(n) { return n.push(Z, Lr), r(Xo, Z, n) }), Jo = sr(function(n, t, r) { n[t] = r }, Ge(Ve)), Yo = sr(function(n, t, r) { cu.call(n, t) ? n[t].push(r) : n[t] = [r] }, wr), Ho = le(dt), Qo = tr(function(n, t, r) { Ot(n, t, r) }), Xo = tr(function(n, t, r, e) { Ot(n, t, r, e) }), ni = le(function(n, t) { return null == n ? {} : (t = a(ft(t), String), Et(n, ut(Ne(n), t))) }), ti = le(function(n, t) { return null == n ? {} : Et(n, ft(t)) }), ri = ir(function(n, t, r) { return t = t.toLowerCase(), n + (r ? qe(t) : t) }), ei = ir(function(n, t, r) { return n + (r ? "-" : "") + t.toLowerCase() }), ui = ir(function(n, t, r) { return n + (r ? " " : "") + t.toLowerCase() }), oi = or("toLowerCase"), ii = or("toUpperCase"), fi = ir(function(n, t, r) { return n + (r ? "_" : "") + t.toLowerCase() }), ci = ir(function(n, t, r) { return n + (r ? " " : "") + qe(t) }), ai = ir(function(n, t, r) { return n + (r ? " " : "") + t.toUpperCase() }), li = le(function(n, t) { try { return r(n, Z, t) } catch (e) { return xe(e) ? e : new tu(e) } }), si = le(function(n, t) { return u(ft(t), function(t) { n[t] = Bo(n[t], n) }), n }), hi = ar(), pi = ar(!0), _i = le(function(n, t) { return function(r) { return dt(r, n, t) } }), gi = le(function(n, t) { return function(r) { return dt(n, r, t) } }), vi = hr(a), di = hr(o), yi = hr(p), bi = gr(), xi = gr(!0), ji = dr("ceil"), mi = dr("floor"), wi = dr("round"); return yn.prototype = mn.prototype, wn.prototype = Vu(mn.prototype), wn.prototype.constructor = wn, An.prototype = Vu(mn.prototype), An.prototype.constructor = An, Un.prototype = Fu ? Fu(null) : iu, zn.prototype.clear = function() { this.__data__ = { hash: new Un, map: Mu ? new Mu : [], string: new Un } }, zn.prototype["delete"] = function(n) { var t = this.__data__; return Ur(n) ? (t = "string" == typeof n ? t.string : t.hash, (Fu ? t[n] !== Z : cu.call(t, n)) && delete t[n]) : Mu ? t.map["delete"](n) : Dn(t.map, n) }, zn.prototype.get = function(n) { var t = this.__data__; return Ur(n) ? (t = "string" == typeof n ? t.string : t.hash, Fu ? (n = t[n], n = "__lodash_hash_undefined__" === n ? Z : n) : n = cu.call(t, n) ? t[n] : Z, n) : Mu ? t.map.get(n) : Zn(t.map, n) }, zn.prototype.has = function(n) { var t = this.__data__; return Ur(n) ? (t = "string" == typeof n ? t.string : t.hash, n = Fu ? t[n] !== Z : cu.call(t, n)) : n = Mu ? t.map.has(n) : -1 < qn(t.map, n), n }, zn.prototype.set = function(n, t) { var r = this.__data__; return Ur(n) ? ("string" == typeof n ? r.string : r.hash)[n] = Fu && t === Z ? "__lodash_hash_undefined__" : t : Mu ? r.map.set(n, t) : Pn(r.map, n, t), this }, Mn.prototype.push = function(n) { var t = this.__data__; Ur(n) ? (t = t.__data__, ("string" == typeof n ? t.string : t.hash)[n] = "__lodash_hash_undefined__") : t.set(n, "__lodash_hash_undefined__") }, $n.prototype.clear = function() { this.__data__ = { array: [], map: null } }, $n.prototype["delete"] = function(n) { var t = this.__data__, r = t.array; return r ? Dn(r, n) : t.map["delete"](n) }, $n.prototype.get = function(n) { var t = this.__data__, r = t.array; return r ? Zn(r, n) : t.map.get(n) }, $n.prototype.has = function(n) { var t = this.__data__, r = t.array; return r ? -1 < qn(r, n) : t.map.has(n) }, $n.prototype.set = function(n, t) { var r = this.__data__, e = r.array; return e && (199 > e.length ? Pn(e, n, t) : (r.array = null, r.map = new zn(e))), (r = r.map) && r.set(n, t), this }, ae.Cache = zn, yn.after = function(n, t) { if ("function" != typeof t) throw new uu("Expected a function"); return n = We(n), function() { return 1 > --n ? t.apply(this, arguments) : void 0 } }, yn.ary = ue, yn.assign = Zo, yn.assignIn = qo, yn.assignInWith = Po, yn.assignWith = To, yn.at = Ko, yn.before = oe, yn.bind = Bo, yn.bindAll = si, yn.bindKey = Co, yn.chain = Hr, yn.chunk = function(n, t) { t = Wu(We(t), 0); var r = n ? n.length : 0; if (!r || 1 > t) return []; for (var e = 0, u = -1, o = Array(ku(r / t)); r > e;) o[++u] = zt(n, e, e += t); return o }, yn.compact = function(n) { for (var t = -1, r = n ? n.length : 0, e = -1, u = []; ++t < r;) { var o = n[t]; o && (u[++e] = o) } return u }, yn.concat = oo, yn.cond = function(n) { var t = n ? n.length : 0, e = wr(); return n = t ? a(n, function(n) { if ("function" != typeof n[1]) throw new uu("Expected a function"); return [e(n[0]), n[1]] }) : [], le(function(e) { for (var u = -1; ++u < t;) { var o = n[u]; if (r(o[0], this, e)) return r(o[1], this, e) } }) }, yn.conforms = function(n) { return rt(tt(n, !0)) }, yn.constant = Ge, yn.countBy = Oo, yn.create = function(n, t) { var r = Vu(n); return t ? Qn(r, t) : r }, yn.curry = ie, yn.curryRight = fe, yn.debounce = ce, yn.defaults = Go, yn.defaultsDeep = Vo, yn.defer = Uo, yn.delay = zo, yn.difference = io, yn.differenceBy = fo, yn.differenceWith = co, yn.drop = qr, yn.dropRight = Pr, yn.dropRightWhile = function(n, t) { return n && n.length ? Zt(n, wr(t, 3), !0, !0) : [] }, yn.dropWhile = function(n, t) { return n && n.length ? Zt(n, wr(t, 3), !0) : [] }, yn.fill = function(n, t, r, e) { var u = n ? n.length : 0; if (!u) return []; for (r && "number" != typeof r && Br(n, t, r) && (r = 0, e = u), u = n.length, r = We(r), 0 > r && (r = -r > u ? 0 : u + r), e = e === Z || e > u ? u : We(e), 0 > e && (e += u), e = r > e ? 0 : Be(e); e > r;) n[r++] = t; return n }, yn.filter = function(n, t) { return (No(n) ? i : it)(n, wr(t, 3)) }, yn.flatMap = function(n, t) { return ft(re(n, t)) }, yn.flatten = function(n) { return n && n.length ? ft(n) : [] }, yn.flattenDeep = function(n) { return n && n.length ? ft(n, !0) : [] }, yn.flip = function(n) { return yr(n, 512) }, yn.flow = hi, yn.flowRight = pi, yn.fromPairs = function(n) { for (var t = -1, r = n ? n.length : 0, e = {}; ++t < r;) { var u = n[t]; e[u[0]] = u[1] } return e }, yn.functions = function(n) { return null == n ? [] : st(n, Fe(n)) }, yn.functionsIn = function(n) { return null == n ? [] : st(n, Ne(n)) }, yn.groupBy = ko, yn.initial = function(n) { return Pr(n, 1) }, yn.intersection = ao, yn.intersectionBy = lo, yn.intersectionWith = so, yn.invert = Jo, yn.invertBy = Yo, yn.invokeMap = Eo, yn.iteratee = Je, yn.keyBy = Io, yn.keys = Fe, yn.keysIn = Ne, yn.map = re, yn.mapKeys = function(n, t) { var r = {}; return t = wr(t, 3), at(n, function(n, e, u) { r[t(n, e, u)] = n }), r }, yn.mapValues = function(n, t) { var r = {}; return t = wr(t, 3), at(n, function(n, e, u) { r[e] = t(n, e, u) }), r }, yn.matches = function(n) { return wt(tt(n, !0)) }, yn.matchesProperty = function(n, t) { return At(n, tt(t, !0)) }, yn.memoize = ae, yn.merge = Qo, yn.mergeWith = Xo, yn.method = _i, yn.methodOf = gi, yn.mixin = Ye, yn.negate = function(n) { if ("function" != typeof n) throw new uu("Expected a function"); return function() { return !n.apply(this, arguments) } }, yn.nthArg = function(n) { return n = We(n), function() { return arguments[n] } }, yn.omit = ni, yn.omitBy = function(n, t) { return t = wr(t, 2), It(n, function(n, r) { return !t(n, r) }) }, yn.once = function(n) { return oe(2, n) }, yn.orderBy = function(n, t, r, e) { return null == n ? [] : (No(t) || (t = null == t ? [] : [t]), r = e ? Z : r, No(r) || (r = null == r ? [] : [r]), kt(n, t, r)) }, yn.over = vi, yn.overArgs = Mo, yn.overEvery = di, yn.overSome = yi, yn.partial = Lo, yn.partialRight = $o, yn.partition = So, yn.pick = ti, yn.pickBy = function(n, t) { return null == n ? {} : It(n, wr(t, 2)) }, yn.property = Qe, yn.propertyOf = function(n) { return function(t) { return null == n ? Z : ht(n, t) } }, yn.pull = ho, yn.pullAll = Gr, yn.pullAllBy = function(n, t, r) { return n && n.length && t && t.length ? Wt(n, t, wr(r)) : n }, yn.pullAt = po, yn.range = bi, yn.rangeRight = xi, yn.rearg = Fo, yn.reject = function(n, t) { var r = No(n) ? i : it; return t = wr(t, 3), r(n, function(n, r, e) { return !t(n, r, e) }) }, yn.remove = function(n, t) { var r = []; if (!n || !n.length) return r; var e = -1, u = [], o = n.length; for (t = wr(t, 3); ++e < o;) { var i = n[e]; t(i, e, n) && (r.push(i), u.push(e)) } return Bt(n, u), r }, yn.rest = le, yn.reverse = Vr, yn.sampleSize = ee, yn.set = function(n, t, r) { return null == n ? n : Ut(n, t, r) }, yn.setWith = function(n, t, r, e) { return e = "function" == typeof e ? e : Z, null == n ? n : Ut(n, t, r, e) }, yn.shuffle = function(n) { return ee(n, 4294967295) }, yn.slice = function(n, t, r) { var e = n ? n.length : 0; return e ? (r && "number" != typeof r && Br(n, t, r) ? (t = 0, r = e) : (t = null == t ? 0 : We(t), r = r === Z ? e : We(r)), zt(n, t, r)) : [] }, yn.sortBy = Ro, yn.sortedUniq = function(n) { return n && n.length ? Ft(n) : [] }, yn.sortedUniqBy = function(n, t) { return n && n.length ? Ft(n, wr(t)) : [] }, yn.split = function(n, t, r) { return ze(n).split(t, r) }, yn.spread = function(n, t) { if ("function" != typeof n) throw new uu("Expected a function"); return t = t === Z ? 0 : Wu(We(t), 0), le(function(e) { var u = e[t]; return e = e.slice(0, t), u && l(e, u), r(n, this, e) }) }, yn.tail = function(n) { return qr(n, 1) }, yn.take = function(n, t, r) { return n && n.length ? (t = r || t === Z ? 1 : We(t), zt(n, 0, 0 > t ? 0 : t)) : [] }, yn.takeRight = function(n, t, r) { var e = n ? n.length : 0; return e ? (t = r || t === Z ? 1 : We(t), t = e - t, zt(n, 0 > t ? 0 : t, e)) : [] }, yn.takeRightWhile = function(n, t) { return n && n.length ? Zt(n, wr(t, 3), !1, !0) : [] }, yn.takeWhile = function(n, t) { return n && n.length ? Zt(n, wr(t, 3)) : [] }, yn.tap = function(n, t) { return t(n), n }, yn.throttle = function(n, t, r) { var e = !0, u = !0; if ("function" != typeof n) throw new uu("Expected a function"); return xe(r) && (e = "leading" in r ? !!r.leading : e, u = "trailing" in r ? !!r.trailing : u), ce(n, t, { leading: e, maxWait: t, trailing: u }) }, yn.thru = Qr, yn.toArray = Re, yn.toPairs = De, yn.toPairsIn = function(n) { return m(n, Ne(n)) }, yn.toPath = function(n) { return No(n) ? a(n, String) : Fr(n) }, yn.toPlainObject = Ue, yn.transform = function(n, t, r) { var e = No(n) || Ie(n); if (t = wr(t, 4), null == r) if (e || xe(n)) { var o = n.constructor; r = e ? No(n) ? new o : [] : Vu(de(o) ? o.prototype : Z) } else r = {}; return (e ? u : at)(n, function(n, e, u) { return t(r, n, e, u) }), r }, yn.unary = function(n) { return ue(n, 1) }, yn.union = _o, yn.unionBy = go, yn.unionWith = vo, yn.uniq = function(n) { return n && n.length ? Dt(n) : [] }, yn.uniqBy = function(n, t) { return n && n.length ? Dt(n, wr(t)) : [] }, yn.uniqWith = function(n, t) { return n && n.length ? Dt(n, Z, t) : [] }, yn.unset = function(n, t) { var r; if (null == n) r = !0; else { r = n; var e = t, e = Cr(e, r) ? [e + ""] : Nt(e); r = $r(r, e), e = Kr(e), r = null == r || !Le(r, e) || delete r[e] } return r }, yn.unzip = Jr, yn.unzipWith = Yr, yn.values = Ze, yn.valuesIn = function(n) { return null == n ? A(n, Ne(n)) : [] }, yn.without = yo, yn.words = Ke, yn.wrap = function(n, t) { return t = null == t ? Ve : t, Lo(t, n) }, yn.xor = bo, yn.xorBy = xo, yn.xorWith = jo, yn.zip = mo, yn.zipObject = function(n, t) { return Tt(n || [], t || [], Yn) }, yn.zipObjectDeep = function(n, t) { return Tt(n || [], t || [], Ut) }, yn.zipWith = wo, yn.extend = qo, yn.extendWith = Po, Ye(yn, yn), yn.add = function(n, t) { var r; return n === Z && t === Z ? 0 : (n !== Z && (r = n), t !== Z && (r = r === Z ? t : r + t), r) }, yn.attempt = li, yn.camelCase = ri, yn.capitalize = qe, yn.ceil = ji, yn.clamp = function(n, t, r) { return r === Z && (r = t, t = Z), r !== Z && (r = Ce(r), r = r === r ? r : 0), t !== Z && (t = Ce(t), t = t === t ? t : 0), nt(Ce(n), t, r) }, yn.clone = function(n) { return tt(n) }, yn.cloneDeep = function(n) { return tt(n, !0) }, yn.cloneDeepWith = function(n, t) { return tt(n, !0, t) }, yn.cloneWith = function(n, t) { return tt(n, !1, t) }, yn.deburr = Pe, yn.endsWith = function(n, t, r) { n = ze(n), t = "string" == typeof t ? t : t + ""; var e = n.length; return r = r === Z ? e : nt(We(r), 0, e), r -= t.length, r >= 0 && n.indexOf(t, r) == r }, yn.eq = se, yn.escape = function(n) { return (n = ze(n)) && H.test(n) ? n.replace(J, R) : n }, yn.escapeRegExp = function(n) { return (n = ze(n)) && on.test(n) ? n.replace(un, "\\$&") : n }, yn.every = function(n, t, r) { var e = No(n) ? o : ot; return r && Br(n, t, r) && (t = Z), e(n, wr(t, 3)) }, yn.find = function(n, t) { if (t = wr(t, 3), No(n)) { var r = v(n, t); return r > -1 ? n[r] : Z } return g(n, t, Ju) }, yn.findIndex = function(n, t) { return n && n.length ? v(n, wr(t, 3)) : -1 }, yn.findKey = function(n, t) { return g(n, wr(t, 3), at, !0) }, yn.findLast = function(n, t) { if (t = wr(t, 3), No(n)) { var r = v(n, t, !0); return r > -1 ? n[r] : Z } return g(n, t, Yu) }, yn.findLastIndex = function(n, t) { return n && n.length ? v(n, wr(t, 3), !0) : -1 }, yn.findLastKey = function(n, t) { return g(n, wr(t, 3), lt, !0) }, yn.floor = mi, yn.forEach = ne, yn.forEachRight = te, yn.forIn = function(n, t) { return null == n ? n : Hu(n, Dr(t), Ne) }, yn.forInRight = function(n, t) { return null == n ? n : Qu(n, Dr(t), Ne) }, yn.forOwn = function(n, t) { return n && at(n, Dr(t)) }, yn.forOwnRight = function(n, t) { return n && lt(n, Dr(t)) }, yn.get = Me, yn.gt = he, yn.gte = function(n, t) { return n >= t }, yn.has = Le, yn.hasIn = $e, yn.head = Tr, yn.identity = Ve, yn.includes = function(n, t, r, e) { return n = _e(n) ? n : Ze(n), r = r && !e ? We(r) : 0, e = n.length, 0 > r && (r = Wu(e + r, 0)), ke(n) ? e >= r && -1 < n.indexOf(t, r) : !!e && -1 < d(n, t, r) }, yn.indexOf = function(n, t, r) { var e = n ? n.length : 0; return e ? (r = We(r), 0 > r && (r = Wu(e + r, 0)), d(n, t, r)) : -1 }, yn.inRange = function(n, t, r) { return t = Ce(t) || 0, r === Z ? (r = t, t = 0) : r = Ce(r) || 0, n = Ce(n), n >= Bu(t, r) && n < Wu(t, r) }, yn.invoke = Ho, yn.isArguments = pe, yn.isArray = No, yn.isArrayBuffer = function(n) { return je(n) && "[object ArrayBuffer]" == su.call(n) }, yn.isArrayLike = _e, yn.isArrayLikeObject = ge, yn.isBoolean = function(n) { return !0 === n || !1 === n || je(n) && "[object Boolean]" == su.call(n) }, yn.isBuffer = Do, yn.isDate = function(n) { return je(n) && "[object Date]" == su.call(n) }, yn.isElement = function(n) { return !!n && 1 === n.nodeType && je(n) && !Ae(n) }, yn.isEmpty = function(n) { if (_e(n) && (No(n) || ke(n) || de(n.splice) || pe(n))) return !n.length; for (var t in n) if (cu.call(n, t)) return !1; return !0 }, yn.isEqual = function(n, t) { return yt(n, t) }, yn.isEqualWith = function(n, t, r) { var e = (r = "function" == typeof r ? r : Z) ? r(n, t) : Z; return e === Z ? yt(n, t, r) : !!e }, yn.isError = ve, yn.isFinite = function(n) { return "number" == typeof n && Iu(n) }, yn.isFunction = de, yn.isInteger = ye, yn.isLength = be, yn.isMap = function(n) { return je(n) && "[object Map]" == kr(n) }, yn.isMatch = function(n, t) { return n === t || bt(n, t, Ar(t)) }, yn.isMatchWith = function(n, t, r) { return r = "function" == typeof r ? r : Z, bt(n, t, Ar(t), r) }, yn.isNaN = function(n) { return we(n) && n != +n }, yn.isNative = me, yn.isNil = function(n) { return null == n }, yn.isNull = function(n) { return null === n }, yn.isNumber = we, yn.isObject = xe, yn.isObjectLike = je, yn.isPlainObject = Ae, yn.isRegExp = Oe, yn.isSafeInteger = function(n) { return ye(n) && n >= -9007199254740991 && 9007199254740991 >= n }, yn.isSet = function(n) { return je(n) && "[object Set]" == kr(n) }, yn.isString = ke, yn.isSymbol = Ee, yn.isTypedArray = Ie, yn.isUndefined = function(n) { return n === Z }, yn.isWeakMap = function(n) { return je(n) && "[object WeakMap]" == kr(n) }, yn.isWeakSet = function(n) { return je(n) && "[object WeakSet]" == su.call(n) }, yn.join = function(n, t) { return n ? Su.call(n, t) : "" }, yn.kebabCase = ei, yn.last = Kr, yn.lastIndexOf = function(n, t, r) { var e = n ? n.length : 0; if (!e) return -1; var u = e; if (r !== Z && (u = We(r), u = (0 > u ? Wu(e + u, 0) : Bu(u, e - 1)) + 1), t !== t) return B(n, u, !0); for (; u--;) if (n[u] === t) return u; return -1 }, yn.lowerCase = ui, yn.lowerFirst = oi, yn.lt = Se, yn.lte = function(n, t) { return t >= n }, yn.max = function(n) { return n && n.length ? _(n, Ve, he) : Z }, yn.maxBy = function(n, t) { return n && n.length ? _(n, wr(t), he) : Z }, yn.mean = function(n) { return Xe(n) / (n ? n.length : 0) }, yn.min = function(n) { return n && n.length ? _(n, Ve, Se) : Z }, yn.minBy = function(n, t) { return n && n.length ? _(n, wr(t), Se) : Z }, yn.noConflict = function() { return Vn._ === this && (Vn._ = hu), this }, yn.noop = He, yn.now = Wo, yn.pad = function(n, t, r) { n = ze(n), t = We(t); var e = F(n); return t && t > e ? (e = (t - e) / 2, t = Eu(e), e = ku(e), pr("", t, r) + n + pr("", e, r)) : n }, yn.padEnd = function(n, t, r) { return n = ze(n), n + pr(n, t, r) }, yn.padStart = function(n, t, r) { return n = ze(n), pr(n, t, r) + n }, yn.parseInt = function(n, t, r) { return r || null == t ? t = 0 : t && (t = +t), n = ze(n).replace(fn, ""), Cu(n, t || (pn.test(n) ? 16 : 10)) }, yn.random = function(n, t, r) { if (r && "boolean" != typeof r && Br(n, t, r) && (t = r = Z), r === Z && ("boolean" == typeof t ? (r = t, t = Z) : "boolean" == typeof n && (r = n, n = Z)), n === Z && t === Z ? (n = 0, t = 1) : (n = Ce(n) || 0, t === Z ? (t = n, n = 0) : t = Ce(t) || 0), n > t) { var e = n; n = t, t = e } return r || n % 1 || t % 1 ? (r = Uu(), Bu(n + r * (t - n + Fn("1e-" + ((r + "").length - 1))), t)) : Ct(n, t) }, yn.reduce = function(n, t, r) { var e = No(n) ? s : y, u = 3 > arguments.length; return e(n, wr(t, 4), r, u, Ju) }, yn.reduceRight = function(n, t, r) { var e = No(n) ? h : y, u = 3 > arguments.length; return e(n, wr(t, 4), r, u, Yu) }, yn.repeat = Te, yn.replace = function() { var n = arguments, t = ze(n[0]); return 3 > n.length ? t : t.replace(n[1], n[2]) }, yn.result = function(n, t, r) { if (Cr(t, n)) e = null == n ? Z : n[t]; else { t = Nt(t); var e = Me(n, t); n = $r(n, t) } return e === Z && (e = r), de(e) ? e.call(n) : e }, yn.round = wi, yn.runInContext = D, yn.sample = function(n) { n = _e(n) ? n : Ze(n); var t = n.length; return t > 0 ? n[Ct(0, t - 1)] : Z }, yn.size = function(n) { if (null == n) return 0; if (_e(n)) { var t = n.length; return t && ke(n) ? F(n) : t } return Fe(n).length }, yn.snakeCase = fi, yn.some = function(n, t, r) { var e = No(n) ? p : Mt; return r && Br(n, t, r) && (t = Z), e(n, wr(t, 3)) }, yn.sortedIndex = function(n, t) { return Lt(n, t) }, yn.sortedIndexBy = function(n, t, r) { return $t(n, t, wr(r)) }, yn.sortedIndexOf = function(n, t) { var r = n ? n.length : 0; if (r) { var e = Lt(n, t); if (r > e && se(n[e], t)) return e } return -1 }, yn.sortedLastIndex = function(n, t) { return Lt(n, t, !0) }, yn.sortedLastIndexBy = function(n, t, r) { return $t(n, t, wr(r), !0) }, yn.sortedLastIndexOf = function(n, t) { if (n && n.length) { var r = Lt(n, t, !0) - 1; if (se(n[r], t)) return r } return -1 }, yn.startCase = ci, yn.startsWith = function(n, t, r) { return n = ze(n), r = nt(We(r), 0, n.length), n.lastIndexOf(t, r) == r }, yn.subtract = function(n, t) { var r; return n === Z && t === Z ? 0 : (n !== Z && (r = n), t !== Z && (r = r === Z ? t : r - t), r) }, yn.sum = Xe, yn.sumBy = function(n, t) { return n && n.length ? x(n, wr(t)) : 0 }, yn.template = function(n, t, r) { var e = yn.templateSettings; r && Br(n, t, r) && (t = Z), n = ze(n), t = Po({}, t, e, Tn), r = Po({}, t.imports, e.imports, Tn); var u, o, i = Fe(r), f = A(r, i), c = 0; r = t.interpolate || xn; var a = "__p+='"; r = eu((t.escape || xn).source + "|" + r.source + "|" + (r === nn ? sn : xn).source + "|" + (t.evaluate || xn).source + "|$", "g"); var l = "sourceURL" in t ? "//# sourceURL=" + t.sourceURL + "\n" : ""; if (n.replace(r, function(t, r, e, i, f, l) { return e || (e = i), a += n.slice(c, l).replace(jn, W), r && (u = !0, a += "'+__e(" + r + ")+'"), f && (o = !0, a += "';" + f + ";\n__p+='"), e && (a += "'+((__t=(" + e + "))==null?'':__t)+'"), c = l + t.length, t }), a += "';", (t = t.variable) || (a = "with(obj){" + a + "}"), a = (o ? a.replace(T, "") : a).replace(K, "$1").replace(G, "$1;"), a = "function(" + (t || "obj") + "){" + (t ? "" : "obj||(obj={});") + "var __t,__p=''" + (u ? ",__e=_.escape" : "") + (o ? ",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}" : ";") + a + "return __p}", t = li(function() { return Function(i, l + "return " + a).apply(Z, f) }), t.source = a, ve(t)) throw t; return t }, yn.times = function(n, t) { if (n = We(n), 1 > n || n > 9007199254740991) return []; var r = 4294967295, e = Bu(n, 4294967295); for (t = Dr(t), n -= 4294967295, e = j(e, t); ++r < n;) t(r); return e }, yn.toInteger = We, yn.toLength = Be, yn.toLower = function(n) { return ze(n).toLowerCase() }, yn.toNumber = Ce, yn.toSafeInteger = function(n) { return nt(We(n), -9007199254740991, 9007199254740991) }, yn.toString = ze, yn.toUpper = function(n) { return ze(n).toUpperCase() }, yn.trim = function(n, t, r) { return (n = ze(n)) ? r || t === Z ? n.replace(fn, "") : (t += "") ? (n = n.match(kn), t = t.match(kn), n.slice(O(n, t), k(n, t) + 1).join("")) : n : n }, yn.trimEnd = function(n, t, r) { return (n = ze(n)) ? r || t === Z ? n.replace(an, "") : (t += "") ? (n = n.match(kn), n.slice(0, k(n, t.match(kn)) + 1).join("")) : n : n }, yn.trimStart = function(n, t, r) { return (n = ze(n)) ? r || t === Z ? n.replace(cn, "") : (t += "") ? (n = n.match(kn), n.slice(O(n, t.match(kn))).join("")) : n : n }, yn.truncate = function(n, t) { var r = 30, e = "..."; if (xe(t)) var u = "separator" in t ? t.separator : u, r = "length" in t ? We(t.length) : r, e = "omission" in t ? ze(t.omission) : e; n = ze(n); var o = n.length; if (En.test(n)) var i = n.match(kn), o = i.length; if (r >= o) return n; if (o = r - F(e), 1 > o) return e; if (r = i ? i.slice(0, o).join("") : n.slice(0, o), u === Z) return r + e; if (i && (o += r.length - o), Oe(u)) { if (n.slice(o).search(u)) { var f = r; for (u.global || (u = eu(u.source, ze(hn.exec(u)) + "g")), u.lastIndex = 0; i = u.exec(f);) var c = i.index; r = r.slice(0, c === Z ? o : c) } } else n.indexOf(u, o) != o && (u = r.lastIndexOf(u), u > -1 && (r = r.slice(0, u))); return r + e }, yn.unescape = function(n) { return (n = ze(n)) && Y.test(n) ? n.replace(V, N) : n }, yn.uniqueId = function(n) { var t = ++au; return ze(n) + t }, yn.upperCase = ai, yn.upperFirst = ii, yn.each = ne, yn.eachRight = te, yn.first = Tr, Ye(yn, function() { var n = {}; return at(yn, function(t, r) { cu.call(yn.prototype, r) || (n[r] = t); }), n }(), { chain: !1 }), yn.VERSION = "4.3.0", u("bind bindKey curry curryRight partial partialRight".split(" "), function(n) { yn[n].placeholder = yn }), u(["drop", "take"], function(n, t) { An.prototype[n] = function(r) { var e = this.__filtered__; if (e && !t) return new An(this); r = r === Z ? 1 : Wu(We(r), 0); var u = this.clone(); return e ? u.__takeCount__ = Bu(r, u.__takeCount__) : u.__views__.push({ size: Bu(r, 4294967295), type: n + (0 > u.__dir__ ? "Right" : "") }), u }, An.prototype[n + "Right"] = function(t) { return this.reverse()[n](t).reverse() } }), u(["filter", "map", "takeWhile"], function(n, t) { var r = t + 1, e = 1 == r || 3 == r; An.prototype[n] = function(n) { var t = this.clone(); return t.__iteratees__.push({ iteratee: wr(n, 3), type: r }), t.__filtered__ = t.__filtered__ || e, t } }), u(["head", "last"], function(n, t) { var r = "take" + (t ? "Right" : ""); An.prototype[n] = function() { return this[r](1).value()[0] } }), u(["initial", "tail"], function(n, t) { var r = "drop" + (t ? "" : "Right"); An.prototype[n] = function() { return this.__filtered__ ? new An(this) : this[r](1) } }), An.prototype.compact = function() { return this.filter(Ve) }, An.prototype.find = function(n) { return this.filter(n).head() }, An.prototype.findLast = function(n) { return this.reverse().find(n) }, An.prototype.invokeMap = le(function(n, t) { return "function" == typeof n ? new An(this) : this.map(function(r) { return dt(r, n, t) }) }), An.prototype.reject = function(n) { return n = wr(n, 3), this.filter(function(t) { return !n(t) }) }, An.prototype.slice = function(n, t) { n = We(n); var r = this; return r.__filtered__ && (n > 0 || 0 > t) ? new An(r) : (0 > n ? r = r.takeRight(-n) : n && (r = r.drop(n)), t !== Z && (t = We(t), r = 0 > t ? r.dropRight(-t) : r.take(t - n)), r) }, An.prototype.takeRightWhile = function(n) { return this.reverse().takeWhile(n).reverse() }, An.prototype.toArray = function() { return this.take(4294967295) }, at(An.prototype, function(n, t) { var r = /^(?:filter|find|map|reject)|While$/.test(t), e = /^(?:head|last)$/.test(t), u = yn[e ? "take" + ("last" == t ? "Right" : "") : t], o = e || /^find/.test(t); u && (yn.prototype[t] = function() { var t = this.__wrapped__, i = e ? [1] : arguments, f = t instanceof An, c = i[0], a = f || No(t), s = function(n) { return n = u.apply(yn, l([n], i)), e && h ? n[0] : n }; a && r && "function" == typeof c && 1 != c.length && (f = a = !1); var h = this.__chain__, p = !!this.__actions__.length, c = o && !h, f = f && !p; return !o && a ? (t = f ? t : new An(this), t = n.apply(t, i), t.__actions__.push({ func: Qr, args: [s], thisArg: Z }), new wn(t, h)) : c && f ? n.apply(this, i) : (t = this.thru(s), c ? e ? t.value()[0] : t.value() : t) }) }), u("pop push shift sort splice unshift".split(" "), function(n) { var t = ou[n], r = /^(?:push|sort|unshift)$/.test(n) ? "tap" : "thru", e = /^(?:pop|shift)$/.test(n); yn.prototype[n] = function() { var n = arguments; return e && !this.__chain__ ? t.apply(this.value(), n) : this[r](function(r) { return t.apply(r, n) }) } }), at(An.prototype, function(n, t) { var r = yn[t]; if (r) { var e = r.name + ""; (Gu[e] || (Gu[e] = [])).push({ name: t, func: r }) } }), Gu[lr(Z, 2).name] = [{ name: "wrapper", func: Z }], An.prototype.clone = function() { var n = new An(this.__wrapped__); return n.__actions__ = Yt(this.__actions__), n.__dir__ = this.__dir__, n.__filtered__ = this.__filtered__, n.__iteratees__ = Yt(this.__iteratees__), n.__takeCount__ = this.__takeCount__, n.__views__ = Yt(this.__views__), n }, An.prototype.reverse = function() { if (this.__filtered__) { var n = new An(this); n.__dir__ = -1, n.__filtered__ = !0 } else n = this.clone(), n.__dir__ *= -1; return n }, An.prototype.value = function() { var n, t = this.__wrapped__.value(), r = this.__dir__, e = No(t), u = 0 > r, o = e ? t.length : 0; n = 0; for (var i = o, f = this.__views__, c = -1, a = f.length; ++c < a;) { var l = f[c], s = l.size; switch (l.type) { case "drop": n += s; break; case "dropRight": i -= s; break; case "take": i = Bu(i, n + s); break; case "takeRight": n = Wu(n, i - s) } } if (n = { start: n, end: i }, i = n.start, f = n.end, n = f - i, u = u ? f : i - 1, i = this.__iteratees__, f = i.length, c = 0, a = Bu(n, this.__takeCount__), !e || 200 > o || o == n && a == n) return qt(t, this.__actions__); e = []; n: for (; n-- && a > c;) { for (u += r, o = -1, l = t[u]; ++o < f;) { var h = i[o], s = h.type, h = (0, h.iteratee)(l); if (2 == s) l = h; else if (!h) { if (1 == s) continue n; break n } } e[c++] = l } return e }, yn.prototype.at = Ao, yn.prototype.chain = function() { return Hr(this) }, yn.prototype.commit = function() { return new wn(this.value(), this.__chain__) }, yn.prototype.flatMap = function(n) { return this.map(n).flatten() }, yn.prototype.next = function() { this.__values__ === Z && (this.__values__ = Re(this.value())); var n = this.__index__ >= this.__values__.length, t = n ? Z : this.__values__[this.__index__++]; return { done: n, value: t } }, yn.prototype.plant = function(n) { for (var t, r = this; r instanceof mn;) { var e = Zr(r); e.__index__ = 0, e.__values__ = Z, t ? u.__wrapped__ = e : t = e; var u = e, r = r.__wrapped__ } return u.__wrapped__ = n, t }, yn.prototype.reverse = function() { var n = this.__wrapped__; return n instanceof An ? (this.__actions__.length && (n = new An(this)), n = n.reverse(), n.__actions__.push({ func: Qr, args: [Vr], thisArg: Z }), new wn(n, this.__chain__)) : this.thru(Vr) }, yn.prototype.toJSON = yn.prototype.valueOf = yn.prototype.value = function() { return qt(this.__wrapped__, this.__actions__) }, mu && (yn.prototype[mu] = Xr), yn } var Z, q = 1 / 0, P = NaN, T = /\b__p\+='';/g, K = /\b(__p\+=)''\+/g, G = /(__e\(.*?\)|\b__t\))\+'';/g, V = /&(?:amp|lt|gt|quot|#39|#96);/g, J = /[&<>"'`]/g, Y = RegExp(V.source), H = RegExp(J.source), Q = /<%-([\s\S]+?)%>/g, X = /<%([\s\S]+?)%>/g, nn = /<%=([\s\S]+?)%>/g, tn = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, rn = /^\w*$/, en = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]/g, un = /[\\^$.*+?()[\]{}|]/g, on = RegExp(un.source), fn = /^\s+|\s+$/g, cn = /^\s+/, an = /\s+$/, ln = /\\(\\)?/g, sn = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g, hn = /\w*$/, pn = /^0x/i, _n = /^[-+]0x[0-9a-f]+$/i, gn = /^0b[01]+$/i, vn = /^\[object .+?Constructor\]$/, dn = /^0o[0-7]+$/i, yn = /^(?:0|[1-9]\d*)$/, bn = /[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g, xn = /($^)/, jn = /['\n\r\u2028\u2029\\]/g, mn = "[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?)*", wn = "(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])" + mn, An = "(?:[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]?|[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff])", On = RegExp("[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]", "g"), kn = RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|" + An + mn, "g"), En = RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0\\ufe0e\\ufe0f]"), In = /[a-zA-Z0-9]+/g, Sn = RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2018\\u2019\\u201c\\u201d \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde]|$)|(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2018\\u2019\\u201c\\u201d \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2018\\u2019\\u201c\\u201d \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2018\\u2019\\u201c\\u201d \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])|$)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2018\\u2019\\u201c\\u201d \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+|[A-Z\\xc0-\\xd6\\xd8-\\xde]+|\\d+", wn].join("|"), "g"), Rn = /[a-z][A-Z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/, Wn = "Array Buffer Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Map Math Object Reflect RegExp Set String Symbol TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap _ clearTimeout isFinite parseInt setTimeout".split(" "), Bn = {}; Bn["[object Float32Array]"] = Bn["[object Float64Array]"] = Bn["[object Int8Array]"] = Bn["[object Int16Array]"] = Bn["[object Int32Array]"] = Bn["[object Uint8Array]"] = Bn["[object Uint8ClampedArray]"] = Bn["[object Uint16Array]"] = Bn["[object Uint32Array]"] = !0, Bn["[object Arguments]"] = Bn["[object Array]"] = Bn["[object ArrayBuffer]"] = Bn["[object Boolean]"] = Bn["[object Date]"] = Bn["[object Error]"] = Bn["[object Function]"] = Bn["[object Map]"] = Bn["[object Number]"] = Bn["[object Object]"] = Bn["[object RegExp]"] = Bn["[object Set]"] = Bn["[object String]"] = Bn["[object WeakMap]"] = !1; var Cn = {}; Cn["[object Arguments]"] = Cn["[object Array]"] = Cn["[object ArrayBuffer]"] = Cn["[object Boolean]"] = Cn["[object Date]"] = Cn["[object Float32Array]"] = Cn["[object Float64Array]"] = Cn["[object Int8Array]"] = Cn["[object Int16Array]"] = Cn["[object Int32Array]"] = Cn["[object Map]"] = Cn["[object Number]"] = Cn["[object Object]"] = Cn["[object RegExp]"] = Cn["[object Set]"] = Cn["[object String]"] = Cn["[object Symbol]"] = Cn["[object Uint8Array]"] = Cn["[object Uint8ClampedArray]"] = Cn["[object Uint16Array]"] = Cn["[object Uint32Array]"] = !0, Cn["[object Error]"] = Cn["[object Function]"] = Cn["[object WeakMap]"] = !1; var Un = { "À": "A", "Á": "A", "Â": "A", "Ã": "A", "Ä": "A", "Å": "A", "à": "a", "á": "a", "â": "a", "ã": "a", "ä": "a", "å": "a", "Ç": "C", "ç": "c", "Ð": "D", "ð": "d", "È": "E", "É": "E", "Ê": "E", "Ë": "E", "è": "e", "é": "e", "ê": "e", "ë": "e", "Ì": "I", "Í": "I", "Î": "I", "Ï": "I", "ì": "i", "í": "i", "î": "i", "ï": "i", "Ñ": "N", "ñ": "n", "Ò": "O", "Ó": "O", "Ô": "O", "Õ": "O", "Ö": "O", "Ø": "O", "ò": "o", "ó": "o", "ô": "o", "õ": "o", "ö": "o", "ø": "o", "Ù": "U", "Ú": "U", "Û": "U", "Ü": "U", "ù": "u", "ú": "u", "û": "u", "ü": "u", "Ý": "Y", "ý": "y", "ÿ": "y", "Æ": "Ae", "æ": "ae", "Þ": "Th", "þ": "th", "ß": "ss" }, zn = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'", "`": "`" }, Mn = { "&": "&", "<": "<", ">": ">", """: '"', "'": "'", "`": "`" }, Ln = { "function": !0, object: !0 }, $n = { "\\": "\\", "'": "'", "\n": "n", "\r": "r", "\u2028": "u2028", "\u2029": "u2029" }, Fn = parseFloat, Nn = parseInt, Dn = Ln[typeof exports] && exports && !exports.nodeType ? exports : null, Zn = Ln[typeof module] && module && !module.nodeType ? module : null, qn = E(Dn && Zn && "object" == typeof global && global), Pn = E(Ln[typeof self] && self), Tn = E(Ln[typeof window] && window), Kn = Zn && Zn.exports === Dn ? Dn : null, Gn = E(Ln[typeof this] && this), Vn = qn || Tn !== (Gn && Gn.window) && Tn || Pn || Gn || Function("return this")(), Jn = D(); (Tn || Pn || {})._ = Jn, "function" == typeof define && "object" == typeof define.amd && define.amd ? define(function() { return Jn }) : Dn && Zn ? (Kn && ((Zn.exports = Jn)._ = Jn), Dn._ = Jn) : Vn._ = Jn }.call(this); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.Util = Bahmni.Common.Util || {}, angular.module("bahmni.common.util", []).provider("$bahmniCookieStore", [function() { var self = this; self.defaultOptions = {}; var fixedEncodeURIComponent = function(str) { return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { return "%" + c.charCodeAt(0).toString(16) }) }; self.setDefaultOptions = function(options) { self.defaultOptions = options }, self.$get = function() { return { get: function(name) { var jsonCookie = $.cookie(name); return jsonCookie ? angular.fromJson(decodeURIComponent(jsonCookie)) : null }, put: function(name, value, options) { options = $.extend({}, self.defaultOptions, options), $.cookie.raw = !0, $.cookie(name, fixedEncodeURIComponent(angular.toJson(value)), options) }, remove: function(name, options) { options = $.extend({}, self.defaultOptions, options), $.removeCookie(name, options) } } } }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.Models = Bahmni.Common.Models || {}, angular.module("bahmni.common.models", []), angular.module("bahmni.common.models").factory("age", [function() { var dateUtil = Bahmni.Common.Util.DateUtil, fromBirthDate = function(birthDate) { var today = dateUtil.now(), period = dateUtil.diffInYearsMonthsDays(birthDate, today); return create(period.years, period.months, period.days) }, create = function(years, months, days) { var isEmpty = function() { return !(this.years || this.months || this.days) }; return { years: years, months: months, days: days, isEmpty: isEmpty } }, calculateBirthDate = function(age) { var birthDate = dateUtil.now(); return birthDate = dateUtil.subtractYears(birthDate, age.years), birthDate = dateUtil.subtractMonths(birthDate, age.months), birthDate = dateUtil.subtractDays(birthDate, age.days) }; return { fromBirthDate: fromBirthDate, create: create, calculateBirthDate: calculateBirthDate } }]), Bahmni.Common.AuditLogEventDetails = { USER_LOGIN_SUCCESS: { eventType: "USER_LOGIN_SUCCESS", message: "USER_LOGIN_SUCCESS_MESSAGE" }, USER_LOGIN_FAILED: { eventType: "USER_LOGIN_FAILED", message: "USER_LOGIN_FAILED_MESSAGE" }, USER_LOGOUT_SUCCESS: { eventType: "USER_LOGOUT_SUCCESS", message: "USER_LOGOUT_SUCCESS_MESSAGE" }, OPEN_VISIT: { eventType: "OPEN_VISIT", message: "OPEN_VISIT_MESSAGE" }, EDIT_VISIT: { eventType: "EDIT_VISIT", message: "EDIT_VISIT_MESSAGE" }, CLOSE_VISIT: { eventType: "CLOSE_VISIT", message: "CLOSE_VISIT_MESSAGE" }, CLOSE_VISIT_FAILED: { eventType: "CLOSE_VISIT_FAILED", message: "CLOSE_VISIT_FAILED_MESSAGE" }, EDIT_ENCOUNTER: { eventType: "EDIT_ENCOUNTER", message: "EDIT_ENCOUNTER_MESSAGE" }, VIEWED_REGISTRATION_PATIENT_SEARCH: { eventType: "VIEWED_REGISTRATION_PATIENT_SEARCH", message: "VIEWED_REGISTRATION_PATIENT_SEARCH_MESSAGE" }, VIEWED_NEW_PATIENT_PAGE: { eventType: "VIEWED_NEW_PATIENT_PAGE", message: "VIEWED_NEW_PATIENT_PAGE_MESSAGE" }, REGISTER_NEW_PATIENT: { eventType: "REGISTER_NEW_PATIENT", message: "REGISTER_NEW_PATIENT_MESSAGE" }, EDIT_PATIENT_DETAILS: { eventType: "EDIT_PATIENT_DETAILS", message: "EDIT_PATIENT_DETAILS_MESSAGE" }, ACCESSED_REGISTRATION_SECOND_PAGE: { eventType: "ACCESSED_REGISTRATION_SECOND_PAGE", message: "ACCESSED_REGISTRATION_SECOND_PAGE_MESSAGE" }, VIEWED_PATIENT_DETAILS: { eventType: "VIEWED_PATIENT_DETAILS", message: "VIEWED_PATIENT_DETAILS_MESSAGE" }, PRINT_PATIENT_STICKER: { eventType: "PRINT_PATIENT_STICKER", message: "PRINT_PATIENT_STICKER_MESSAGE" }, VIEWED_CLINICAL_PATIENT_SEARCH: { eventType: "VIEWED_CLINICAL_PATIENT_SEARCH", message: "VIEWED_PATIENT_SEARCH_MESSAGE" }, VIEWED_CLINICAL_DASHBOARD: { eventType: "VIEWED_CLINICAL_DASHBOARD", message: "VIEWED_CLINICAL_DASHBOARD_MESSAGE" }, VIEWED_OBSERVATIONS_TAB: { eventType: "VIEWED_OBSERVATIONS_TAB", message: "VIEWED_OBSERVATIONS_TAB_MESSAGE" }, VIEWED_DIAGNOSIS_TAB: { eventType: "VIEWED_DIAGNOSIS_TAB", message: "VIEWED_DIAGNOSIS_TAB_MESSAGE" }, VIEWED_TREATMENT_TAB: { eventType: "VIEWED_TREATMENT_TAB", message: "VIEWED_TREATMENT_TAB_MESSAGE" }, VIEWED_DISPOSITION_TAB: { eventType: "VIEWED_DISPOSITION_TAB", message: "VIEWED_DISPOSITION_TAB_MESSAGE" }, VIEWED_DASHBOARD_SUMMARY: { eventType: "VIEWED_DASHBOARD_SUMMARY", message: "VIEWED_DASHBOARD_SUMMARY_MESSAGE" }, VIEWED_ORDERS_TAB: { eventType: "VIEWED_ORDERS_TAB", message: "VIEWED_ORDERS_TAB_MESSAGE" }, VIEWED_BACTERIOLOGY_TAB: { eventType: "VIEWED_BACTERIOLOGY_TAB", message: "VIEWED_BACTERIOLOGY_TAB_MESSAGE" }, VIEWED_INVESTIGATION_TAB: { eventType: "VIEWED_INVESTIGATION_TAB", message: "VIEWED_INVESTIGATION_TAB_MESSAGE" }, VIEWED_SUMMARY_PRINT: { eventType: "VIEWED_SUMMARY_PRINT", message: "VIEWED_SUMMARY_PRINT_MESSAGE" }, VIEWED_VISIT_DASHBOARD: { eventType: "VIEWED_VISIT_DASHBOARD", message: "VIEWED_VISIT_DASHBOARD_MESSAGE" }, VIEWED_VISIT_PRINT: { eventType: "VIEWED_VISIT_PRINT", message: "VIEWED_VISIT_PRINT_MESSAGE" }, VIEWED_DASHBOARD_OBSERVATION: { eventType: "VIEWED_DASHBOARD_OBSERVATION", message: "VIEWED_DASHBOARD_OBSERVATION_MESSAGE" }, VIEWED_PATIENTPROGRAM: { eventType: "VIEWED_PATIENTPROGRAM", message: "VIEWED_PATIENTPROGRAM_MESSAGE" }, RUN_REPORT: { eventType: "RUN_REPORT", message: "RUN_REPORT_MESSAGE" } }, angular.module("bahmni.common.routeErrorHandler", ["ui.router"]).run(["$rootScope", function($rootScope) { $rootScope.$on("$stateChangeError", function(event) { event.preventDefault() }) }]), Bahmni.Common.Util.DateUtil = { diffInDays: function(dateFrom, dateTo) { return Math.floor((this.parse(dateTo) - this.parse(dateFrom)) / 864e5) }, diffInMinutes: function(dateFrom, dateTo) { return moment(dateTo).diff(moment(dateFrom), "minutes") }, diffInSeconds: function(dateFrom, dateTo) { return moment(dateFrom).diff(moment(dateTo), "seconds") }, isInvalid: function(date) { return "Invalid Date" == date }, diffInDaysRegardlessOfTime: function(dateFrom, dateTo) { var from = new Date(dateFrom), to = new Date(dateTo); return from.setHours(0, 0, 0, 0), to.setHours(0, 0, 0, 0), Math.floor((to - from) / 864e5) }, addSeconds: function(date, seconds) { return moment(date).add(seconds, "seconds").toDate() }, addMinutes: function(date, minutes) { return this.addSeconds(date, 60 * minutes) }, addDays: function(date, days) { return moment(date).add(days, "day").toDate() }, addMonths: function(date, months) { return moment(date).add(months, "month").toDate() }, addYears: function(date, years) { return moment(date).add(years, "year").toDate() }, subtractSeconds: function(date, seconds) { return moment(date).subtract(seconds, "seconds").toDate() }, subtractDays: function(date, days) { return this.addDays(date, -1 * days) }, subtractMonths: function(date, months) { return this.addMonths(date, -1 * months) }, subtractYears: function(date, years) { return this.addYears(date, -1 * years) }, createDays: function(startDate, endDate) { for (var startDate = this.getDate(startDate), endDate = this.getDate(endDate), numberOfDays = this.diffInDays(startDate, endDate), days = [], i = 0; i <= numberOfDays; i++) days.push({ dayNumber: i + 1, date: this.addDays(startDate, i) }); return days }, getDayNumber: function(referenceDate, date) { return this.diffInDays(this.getDate(referenceDate), this.getDate(date)) + 1 }, getDateWithoutTime: function(datetime) { return datetime ? moment(datetime).format("YYYY-MM-DD") : null }, getDateWitTime: function(datetime) { return datetime ? moment(datetime).format("YYYY-MM-DD HH:mm:ss") : null }, getDateInMonthsAndYears: function(date, format) { var format = format || "MMM YY", dateRepresentation = isNaN(Number(date)) ? date : Number(date); return moment(dateRepresentation).isValid() ? dateRepresentation ? moment(dateRepresentation).format(format) : null : date }, formatDateWithTime: function(datetime) { var dateRepresentation = isNaN(Number(datetime)) ? datetime : Number(datetime); return moment(dateRepresentation).isValid() ? dateRepresentation ? moment(dateRepresentation).format("DD MMM YY h:mm a") : null : datetime }, formatDateWithoutTime: function(date) { var dateRepresentation = isNaN(Number(date)) ? date : Number(date); return moment(dateRepresentation).isValid() ? dateRepresentation ? moment(dateRepresentation).format("DD MMM YY") : null : date }, formatDateInStrictMode: function(date) { var dateRepresentation = isNaN(Number(date)) ? date : Number(date); return moment(dateRepresentation, "YYYY-MM-DD", !0).isValid() ? moment(dateRepresentation).format("DD MMM YY") : moment(dateRepresentation, "YYYY-MM-DDTHH:mm:ss.SSSZZ", !0).isValid() ? moment(dateRepresentation).format("DD MMM YY") : date }, formatTime: function(date) { var dateRepresentation = isNaN(Number(date)) ? date : Number(date); return moment(dateRepresentation).isValid() ? dateRepresentation ? moment(dateRepresentation).format("h:mm a") : null : date }, getDate: function(dateTime) { return moment(this.parse(dateTime)).startOf("day").toDate() }, parse: function(dateString) { return dateString ? moment(dateString).toDate() : null }, parseDatetime: function(dateTimeString) { return dateTimeString ? moment(dateTimeString) : null }, now: function() { return new Date }, today: function() { return this.getDate(this.now()) }, endOfToday: function() { return moment(this.parse(this.now())).endOf("day").toDate() }, getDateWithoutHours: function(dateString) { return moment(dateString).toDate().setHours(0, 0, 0, 0) }, getDateTimeWithoutSeconds: function(dateString) { return moment(dateString).toDate().setSeconds(0, 0) }, isSameDateTime: function(date1, date2) { if (null == date1 || null == date2) return !1; var dateOne = this.parse(date1), dateTwo = this.parse(date2); return dateOne.getTime() == dateTwo.getTime() }, isBeforeDate: function(date1, date2) { return moment(date1).isBefore(moment(date2)) }, isSameDate: function(date1, date2) { if (null == date1 || null == date2) return !1; var dateOne = this.parse(date1), dateTwo = this.parse(date2); return dateOne.getFullYear() === dateTwo.getFullYear() && dateOne.getMonth() === dateTwo.getMonth() && dateOne.getDate() === dateTwo.getDate() }, diffInYearsMonthsDays: function(dateFrom, dateTo) { dateFrom = this.parse(dateFrom), dateTo = this.parse(dateTo); var from = { d: dateFrom.getDate(), m: dateFrom.getMonth(), y: dateFrom.getFullYear() }, to = { d: dateTo.getDate(), m: dateTo.getMonth(), y: dateTo.getFullYear() }, age = { d: 0, m: 0, y: 0 }, daysFebruary = to.y % 4 != 0 || to.y % 100 == 0 && to.y % 400 != 0 ? 28 : 29, daysInMonths = [31, daysFebruary, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; return age.y = to.y - from.y, age.m = to.m - from.m, from.m > to.m && (age.y = age.y - 1, age.m = to.m - from.m + 12), age.d = to.d - from.d, from.d > to.d && (age.m = age.m - 1, from.m == to.m && (age.y = age.y - 1, age.m = age.m + 12), age.d = to.d - from.d + daysInMonths[parseInt(from.m)]), { days: age.d, months: age.m, years: age.y } }, convertToUnits: function(minutes) { var allUnits = { Years: 525600, Months: 43200, Weeks: 10080, Days: 1440, Hours: 60, Minutes: 1 }, durationRepresentation = function(value, unitName, unitValueInMinutes) { return { value: value, unitName: unitName, unitValueInMinutes: unitValueInMinutes, allUnits: allUnits } }; for (var unitName in allUnits) { var unitValueInMinutes = allUnits[unitName]; if ((minutes || 0 !== minutes) && minutes >= unitValueInMinutes && minutes % unitValueInMinutes === 0) return durationRepresentation(minutes / unitValueInMinutes, unitName, unitValueInMinutes) } return durationRepresentation(void 0, void 0, void 0) }, getEndDateFromDuration: function(dateFrom, value, unit) { dateFrom = this.parse(dateFrom); var from = { h: dateFrom.getHours(), d: dateFrom.getDate(), m: dateFrom.getMonth(), y: dateFrom.getFullYear() }, to = new Date(from.y, from.m, from.d, from.h); return "Months" === unit ? to.setMonth(from.m + value) : "Weeks" === unit ? to.setDate(from.d + 7 * value) : "Days" === unit ? to.setDate(from.d + value) : "Hours" === unit && to.setHours(from.h + value), to }, parseLongDateToServerFormat: function(longDate) { return longDate ? moment(longDate).format("YYYY-MM-DDTHH:mm:ss.SSS") : null }, parseServerDateToDate: function(longDate) { return longDate ? moment(longDate, "YYYY-MM-DDTHH:mm:ss.SSSZZ").toDate() : null }, getDateTimeInSpecifiedFormat: function(date, format) { return date ? moment(date).format(format) : null }, getISOString: function(date) { return date ? moment(date).toDate().toISOString() : null }, isBeforeTime: function(time, otherTime) { return moment(time, "hh:mm a").format("YYYY-MM-DD") } }, Bahmni.Common.Util.AgeUtil = function() { var differenceInMonths = function(date, anotherDate) { var age = fromBirthDateTillReferenceDate(date, anotherDate); return parseFloat((12 * age.years + age.months + age.days / 30).toFixed(3)) }, fromBirthDateTillReferenceDate = function(birthDate, referenceDate) { var DateUtil = Bahmni.Common.Util.DateUtil; referenceDate = referenceDate || DateUtil.now(); var period = DateUtil.diffInYearsMonthsDays(birthDate, referenceDate); return { years: period.years, months: period.months, days: period.days } }, monthsToAgeString = function(months) { var age = monthsToAge(months), ageString = ""; return age.years && (ageString += age.years + "y "), age.months && (ageString += age.months + "m "), age.days && (ageString += age.days + "d"), ageString }, monthsToAge = function(months) { var years = Math.floor(months / 12), remainingMonths = Math.floor(months % 12), days = Math.round(30 * (months - Math.floor(months))); return { years: years, months: remainingMonths, days: days } }; return { monthsToAgeString: monthsToAgeString, differenceInMonths: differenceInMonths } }(), Bahmni.Common.Util.ArrayUtil = { chunk: function(array, chunkSize) { for (var chunks = [], i = 0; i < array.length; i += chunkSize) chunks.push(array.slice(i, i + chunkSize)); return chunks }, groupByPreservingOrder: function(records, groupingFunction, keyName, valueName) { var groups = []; return records.forEach(function(record) { var recordKey = groupingFunction(record), existingGroup = _.find(groups, function(group) { return group[keyName] === recordKey }); if (existingGroup) existingGroup[valueName].push(record); else { var newGroup = {}; newGroup[keyName] = recordKey, newGroup[valueName] = [record], groups.push(newGroup) } }), groups } }, angular.module("httpErrorInterceptor", []).config(["$httpProvider", function($httpProvider) { var interceptor = ["$rootScope", "$q", function($rootScope, $q) { function stringAfter(value, searchString) { var indexOfFirstColon = value.indexOf(searchString); return value.substr(indexOfFirstColon + 1).trim() } function getServerError(message) { return stringAfter(message, ":") } function success(response) { return response } function shouldRedirectToLogin(response) { var errorMessage = response.data.error ? response.data.error.message : response.data; if (errorMessage.search("HTTP Status 403 - Session timed out") > 0) return !0 } function error(response) { var data = response.data, unexpectedError = "There was an unexpected issue on the server. Please try again"; if (500 === response.status) { var errorMessage = data.error && data.error.message ? getServerError(data.error.message) : unexpectedError; showError(errorMessage) } else if (409 === response.status) { var errorMessage = data.error && data.error.message ? getServerError(data.error.message) : "Duplicate entry error"; showError(errorMessage) } else if (0 === response.status) showError("Could not connect to the server. Please check your connection and try again"); else if (405 === response.status) showError(unexpectedError); else if (400 === response.status) { var errorMessage = data.error && data.error.message ? data.error.message : data.localizedMessage || "Could not connect to the server. Please check your connection and try again"; showError(errorMessage) } else if (403 === response.status) { var errorMessage = data.error && data.error.message ? data.error.message : unexpectedError; shouldRedirectToLogin(response) ? $rootScope.$broadcast("event:auth-loginRequired") : showError(errorMessage) } else 404 === response.status && (_.includes(response.config.url, "implementation_config") || _.includes(response.config.url, "locale_") || _.includes(response.config.url, "offlineMetadata") || showError("The requested information does not exist")); return $q.reject(response) } var serverErrorMessages = Bahmni.Common.Constants.serverErrorMessages, showError = function(errorMessage) { var result = _.find(serverErrorMessages, function(listItem) { return listItem.serverMessage === errorMessage }); _.isEmpty(result) && $rootScope.$broadcast("event:serverError", errorMessage) }; return { response: success, responseError: error } }]; $httpProvider.interceptors.push(interceptor) }]), Modernizr.addTest("ios", function() { return !!navigator.userAgent.match(/(iPad|iPhone|iPod)/i) }), Modernizr.addTest("windowOS", function() { return navigator.appVersion.indexOf("Win") != -1 }), $(function() { Modernizr.ios && $(document).on("click", "label[for]", function() { var $inputElement = $("input#" + $(this).attr("for")), elementType = $inputElement.attr("type"); "radio" === elementType ? $inputElement.prop("checked", !0) : "checkbox" === elementType ? $inputElement.prop("checked", !$inputElement.prop("checked")) : $inputElement.focus() }) }), String.prototype.format = function() { for (var content = this, i = 0; i < arguments.length; i++) { var replacement = "{" + i + "}"; content = content.replace(replacement, arguments[i]) } return content }, String.prototype.toValidId = function() { var content = this; return content.replace(/\s/g, "-") }, angular.module("bahmni.common.util").service("offlineStatusService", ["$rootScope", "$interval", "appService", function($rootScope, $interval, appService) { this.checkOfflineStatus = function() { "up" === Offline.state && Offline.check() }, this.setOfflineOptions = function() { var networkConnectivity = appService.getAppDescriptor().getConfigValue("networkConnectivity"), showNetworkStatusIndicator = null != networkConnectivity ? networkConnectivity.showNetworkStatusMessage : null, intervalFrequency = null != networkConnectivity ? networkConnectivity.networkStatusCheckInterval : null; intervalFrequency = intervalFrequency ? intervalFrequency : 5e3, Offline.options = { game: !0, checkOnLoad: !0, checks: { xhr: { url: Bahmni.Common.Constants.faviconUrl } } }, this.checkOfflineStatus(), void 0 === $rootScope.offlineStatusCheckIntervalPromise && ($rootScope.offlineStatusCheckIntervalPromise = $interval(this.checkOfflineStatus, intervalFrequency)); var clearCheckOfflineStatusInterval = function(offlineStatusCheckIntervalPromise) { $interval.cancel(offlineStatusCheckIntervalPromise) }; $rootScope.$on("$destroy", function() { clearCheckOfflineStatusInterval($rootScope.offlineStatusCheckIntervalPromise) }), showNetworkStatusIndicator === !1 && $(".offline-ui").css("display", "none") } }]), Bahmni.Common.Util.DynamicResourceLoader = function() { return { includeJs: function(script) { var element = document.createElement("script"); element.setAttribute("src", script), document.body.appendChild(element) }, includeCss: function(url) { var element = document.createElement("link"); element.setAttribute("href", url), element.setAttribute("rel", "stylesheet"), element.setAttribute("type", "text/css"), document.head.appendChild(element) } } }(); var Bahmni = Bahmni || {}; Bahmni.Auth = Bahmni.Auth || {}, angular.module("authentication", ["ui.router"]), Bahmni.Auth.User = function(user) { angular.extend(this, user), this.userProperties = user.userProperties || {}, this.favouriteObsTemplates = this.userProperties.favouriteObsTemplates ? this.userProperties.favouriteObsTemplates.split("###") : [], this.favouriteWards = this.userProperties.favouriteWards ? this.userProperties.favouriteWards.split("###") : [], this.recentlyViewedPatients = this.userProperties.recentlyViewedPatients ? JSON.parse(this.userProperties.recentlyViewedPatients) : [], this.toContract = function() { var user = angular.copy(this); return user.userProperties.favouriteObsTemplates = this.favouriteObsTemplates.join("###"), user.userProperties.favouriteWards = this.favouriteWards.join("###"), user.userProperties.recentlyViewedPatients = JSON.stringify(this.recentlyViewedPatients), delete user.favouriteObsTemplates, delete user.favouriteWards, delete user.recentlyViewedPatients, user }, this.addDefaultLocale = function(locale) { this.userProperties.defaultLocale = locale }, this.addToRecentlyViewed = function(patient, maxPatients) { _.some(this.recentlyViewedPatients, { uuid: patient.uuid }) || (this.recentlyViewedPatients.unshift({ uuid: patient.uuid, name: patient.name, identifier: patient.identifier }), _.size(this.recentlyViewedPatients) >= maxPatients && (this.recentlyViewedPatients = _.take(this.recentlyViewedPatients, maxPatients))) }, this.isFavouriteObsTemplate = function(conceptName) { return _.includes(this.favouriteObsTemplates, conceptName) }, this.toggleFavoriteObsTemplate = function(conceptName) { this.isFavouriteObsTemplate(conceptName) ? this.favouriteObsTemplates = _.without(this.favouriteObsTemplates, conceptName) : this.favouriteObsTemplates.push(conceptName) }, this.isFavouriteWard = function(wardName) { return _.includes(this.favouriteWards, wardName) }, this.toggleFavoriteWard = function(wardName) { this.isFavouriteWard(wardName) ? this.favouriteWards = _.without(this.favouriteWards, wardName) : this.favouriteWards.push(wardName) } }, angular.module("authentication").service("userService", ["$rootScope", "$http", "$q", function($rootScope, $http, $q) { var getUserFromServer = function(userName) { return $http.get(Bahmni.Common.Constants.userUrl, { method: "GET", params: { username: userName, v: "custom:(username,uuid,person:(uuid,),privileges:(name,retired),userProperties)" }, cache: !1 }) }; this.getUser = function(userName) { var deferrable = $q.defer(); return getUserFromServer(userName).success(function(data) { deferrable.resolve(data) }).error(function() { deferrable.reject("Unable to get user data") }), deferrable.promise }, this.savePreferences = function() { var deferrable = $q.defer(), user = $rootScope.currentUser.toContract(); return $http.post(Bahmni.Common.Constants.userUrl + "/" + user.uuid, { uuid: user.uuid, userProperties: user.userProperties }, { withCredentials: !0 }).then(function(response) { $rootScope.currentUser.userProperties = response.data.userProperties, deferrable.resolve() }), deferrable.promise }; var getProviderFromServer = function(uuid) { return $http.get(Bahmni.Common.Constants.providerUrl, { method: "GET", params: { user: uuid }, cache: !1 }) }; this.getProviderForUser = function(uuid) { var deferrable = $q.defer(); return getProviderFromServer(uuid).success(function(data) { if (data.results.length > 0) { var providerName = data.results[0].display.split("-")[1]; data.results[0].name = providerName ? providerName.trim() : providerName, deferrable.resolve(data) } else deferrable.reject("UNABLE_TO_GET_PROVIDER_DATA") }).error(function() { deferrable.reject("UNABLE_TO_GET_PROVIDER_DATA") }), deferrable.promise }, this.getPasswordPolicies = function() { return $http.get(Bahmni.Common.Constants.passwordPolicyUrl, { method: "GET", withCredentials: !0 }) } }]), angular.module("authentication").config(["$httpProvider", function($httpProvider) { var interceptor = ["$rootScope", "$q", function($rootScope, $q) { function success(response) { return response } function error(response) { return 401 === response.status && $rootScope.$broadcast("event:auth-loginRequired"), $q.reject(response) } return { response: success, responseError: error } }]; $httpProvider.interceptors.push(interceptor) }]).run(["$rootScope", "$window", "$timeout", function($rootScope, $window, $timeout) { $rootScope.$on("event:auth-loginRequired", function() { $timeout(function() { $window.location = "../home/index.html#/login" }) }) }]).service("sessionService", ["$rootScope", "$http", "$q", "$bahmniCookieStore", "userService", function($rootScope, $http, $q, $bahmniCookieStore, userService) { var sessionResourcePath = Bahmni.Common.Constants.RESTWS_V1 + "/session?v=custom:(uuid)", getAuthFromServer = function(username, password, otp) { var btoa = otp ? username + ":" + password + ":" + otp : username + ":" + password; return $http.get(sessionResourcePath, { headers: { Authorization: "Basic " + window.btoa(btoa) }, cache: !1 }) }; this.resendOTP = function(username, password) { var btoa = username + ":" + password; return $http.get(sessionResourcePath + "&resendOTP=true", { headers: { Authorization: "Basic " + window.btoa(btoa) }, cache: !1 }) }; var createSession = function(username, password, otp) { var deferrable = $q.defer(); return destroySessionFromServer().success(function() { getAuthFromServer(username, password, otp).then(function(response) { 204 == response.status && deferrable.resolve({ firstFactAuthorization: !0 }), deferrable.resolve(response.data) }, function(response) { 401 == response.status ? deferrable.reject("LOGIN_LABEL_WRONG_OTP_MESSAGE_KEY") : 410 == response.status ? deferrable.reject("LOGIN_LABEL_OTP_EXPIRED") : 429 == response.status && deferrable.reject("LOGIN_LABEL_MAX_FAILED_ATTEMPTS"), deferrable.reject("LOGIN_LABEL_LOGIN_ERROR_MESSAGE_KEY") }) }).error(function() { deferrable.reject("LOGIN_LABEL_LOGIN_ERROR_MESSAGE_KEY") }), deferrable.promise }, hasAnyActiveProvider = function(providers) { return _.filter(providers, function(provider) { return void 0 == provider.retired || "false" == provider.retired }).length > 0 }, self = this, destroySessionFromServer = function() { return $http["delete"](sessionResourcePath) }, sessionCleanup = function() { delete $.cookie(Bahmni.Common.Constants.currentUser, null, { path: "/" }), delete $.cookie(Bahmni.Common.Constants.currentUser, null, { path: "/" }), delete $.cookie(Bahmni.Common.Constants.retrospectiveEntryEncounterDateCookieName, null, { path: "/" }), delete $.cookie(Bahmni.Common.Constants.grantProviderAccessDataCookieName, null, { path: "/" }), $rootScope.currentUser = void 0 }; this.destroy = function() { var deferrable = $q.defer(); return destroySessionFromServer().then(function() { sessionCleanup(), deferrable.resolve() }), deferrable.promise }, this.loginUser = function(username, password, location, otp) { var deferrable = $q.defer(); return createSession(username, password, otp).then(function(data) { data.authenticated ? ($bahmniCookieStore.put(Bahmni.Common.Constants.currentUser, username, { path: "/", expires: 7 }), void 0 != location && ($bahmniCookieStore.remove(Bahmni.Common.Constants.locationCookieName), $bahmniCookieStore.put(Bahmni.Common.Constants.locationCookieName, { name: location.display, uuid: location.uuid }, { path: "/", expires: 7 })), deferrable.resolve(data)) : data.firstFactAuthorization ? deferrable.resolve(data) : deferrable.reject("LOGIN_LABEL_LOGIN_ERROR_MESSAGE_KEY") }, function(errorInfo) { deferrable.reject(errorInfo) }), deferrable.promise }, this.get = function() { return $http.get(sessionResourcePath, { cache: !1 }) }, this.loadCredentials = function() { var deferrable = $q.defer(), currentUser = $bahmniCookieStore.get(Bahmni.Common.Constants.currentUser); return currentUser ? (userService.getUser(currentUser).then(function(data) { userService.getProviderForUser(data.results[0].uuid).then(function(providers) { !_.isEmpty(providers.results) && hasAnyActiveProvider(providers.results) ? ($rootScope.currentUser = new Bahmni.Auth.User(data.results[0]), $rootScope.currentUser.currentLocation = $bahmniCookieStore.get(Bahmni.Common.Constants.locationCookieName).name, $rootScope.$broadcast("event:user-credentialsLoaded", data.results[0]), deferrable.resolve(data.results[0])) : (self.destroy(), deferrable.reject("YOU_HAVE_NOT_BEEN_SETUP_PROVIDER")) }, function() { self.destroy(), deferrable.reject("COULD_NOT_GET_PROVIDER") }) }, function() { self.destroy(), deferrable.reject("Could not get roles for the current user.") }), deferrable.promise) : (this.destroy()["finally"](function() { $rootScope.$broadcast("event:auth-loginRequired"), deferrable.reject("No User in session. Please login again.") }), deferrable.promise) }, this.getLoginLocationUuid = function() { return $bahmniCookieStore.get(Bahmni.Common.Constants.locationCookieName) ? $bahmniCookieStore.get(Bahmni.Common.Constants.locationCookieName).uuid : null }, this.changePassword = function(currentUserUuid, oldPassword, newPassword) { return $http({ method: "POST", url: Bahmni.Common.Constants.passwordUrl, data: { oldPassword: oldPassword, newPassword: newPassword }, headers: { "Content-Type": "application/json" } }) }, this.loadProviders = function(userInfo) { return $http.get(Bahmni.Common.Constants.providerUrl, { method: "GET", params: { user: userInfo.uuid }, cache: !1 }).success(function(data) { var providerUuid = data.results.length > 0 ? data.results[0].uuid : void 0; $rootScope.currentProvider = { uuid: providerUuid } }) } }]).factory("authenticator", ["$rootScope", "$q", "$window", "sessionService", function($rootScope, $q, $window, sessionService) { var authenticateUser = function() { var defer = $q.defer(), sessionDetails = sessionService.get(); return sessionDetails.then(function(response) { response.data.authenticated ? defer.resolve() : (defer.reject("User not authenticated"), $rootScope.$broadcast("event:auth-loginRequired")) }), defer.promise }; return { authenticateUser: authenticateUser } }]).directive("logOut", ["sessionService", "$window", "configurationService", "auditLogService", function(sessionService, $window, configurationService, auditLogService) { return { link: function(scope, element) { element.bind("click", function() { scope.$apply(function() { auditLogService.log(void 0, "USER_LOGOUT_SUCCESS", void 0, "MODULE_LABEL_LOGOUT_KEY").then(function() { sessionService.destroy().then(function() { $window.location = "../home/index.html#/login" }) }) }) }) } } }]).directive("btnUserInfo", [function() { return { restrict: "CA", link: function(scope, elem) { elem.bind("click", function(event) { $(this).next().toggleClass("active"), event.stopPropagation() }), $(document).find("body").bind("click", function() { $(elem).next().removeClass("active") }) } } }]), angular.module("bahmni.common.appFramework", ["authentication"]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.AppFramework = Bahmni.Common.AppFramework || {}, angular.module("bahmni.common.appFramework").config(["$compileProvider", function($compileProvider) { $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|chrome-extension|file):/) }]).service("appService", ["$http", "$q", "sessionService", "$rootScope", "mergeService", "loadConfigService", "messagingService", "$translate", function($http, $q, sessionService, $rootScope, mergeService, loadConfigService, messagingService, $translate) { var currentUser = null, baseUrl = Bahmni.Common.Constants.baseUrl, customUrl = Bahmni.Common.Constants.customUrl, appDescriptor = null, loadConfig = function(url) { return loadConfigService.loadConfig(url, appDescriptor.contextPath) }, loadTemplate = function(appDescriptor) { var deferrable = $q.defer(); return loadConfig(baseUrl + appDescriptor.contextPath + "/appTemplate.json").then(function(result) { _.keys(result.data).length > 0 && appDescriptor.setTemplate(result.data), deferrable.resolve(appDescriptor) }, function(error) { 404 !== error.status ? deferrable.reject(error) : deferrable.resolve(appDescriptor) }), deferrable.promise }, setDefinition = function(baseResultData, customResultData) { customResultData && (_.keys(baseResultData).length > 0 || _.keys(customResultData.length > 0)) ? appDescriptor.setDefinition(baseResultData, customResultData) : _.keys(baseResultData).length > 0 && appDescriptor.setDefinition(baseResultData) }, loadDefinition = function(appDescriptor) { var deferrable = $q.defer(); return loadConfig(baseUrl + appDescriptor.contextPath + "/app.json").then(function(baseResult) { baseResult.data.shouldOverRideConfig ? loadConfig(customUrl + appDescriptor.contextPath + "/app.json").then(function(customResult) { setDefinition(baseResult.data, customResult.data), deferrable.resolve(appDescriptor) }, function() { setDefinition(baseResult.data), deferrable.resolve(appDescriptor) }) : (setDefinition(baseResult.data), deferrable.resolve(appDescriptor)) }, function(error) { 404 !== error.status ? deferrable.reject(error) : deferrable.resolve(appDescriptor) }), deferrable.promise }, setExtensions = function(baseResultData, customResultData) { customResultData ? appDescriptor.setExtensions(baseResultData, customResultData) : appDescriptor.setExtensions(baseResultData) }, loadExtensions = function(appDescriptor, extensionFileName) { var deferrable = $q.defer(); return loadConfig(baseUrl + appDescriptor.extensionPath + extensionFileName).then(function(baseResult) { baseResult.data.shouldOverRideConfig ? loadConfig(customUrl + appDescriptor.extensionPath + extensionFileName).then(function(customResult) { setExtensions(baseResult.data, customResult.data), deferrable.resolve(appDescriptor) }, function() { setExtensions(baseResult.data), deferrable.resolve(appDescriptor) }) : (setExtensions(baseResult.data), deferrable.resolve(appDescriptor)) }, function(error) { 404 !== error.status ? deferrable.reject(error) : deferrable.resolve(appDescriptor) }), deferrable.promise }, setDefaultPageConfig = function(pageName, baseResultData, customResultData) { customResultData && (_.keys(customResultData).length > 0 || _.keys(baseResultData).length > 0) ? appDescriptor.addConfigForPage(pageName, baseResultData, customResultData) : _.keys(baseResultData).length > 0 && appDescriptor.addConfigForPage(pageName, baseResultData) }, hasPrivilegeOf = function(privilegeName) { return _.some(currentUser.privileges, { name: privilegeName }) }, loadPageConfig = function(pageName, appDescriptor) { var deferrable = $q.defer(); return loadConfig(baseUrl + appDescriptor.contextPath + "/" + pageName + ".json").then(function(baseResult) { baseResult.data.shouldOverRideConfig ? loadConfig(customUrl + appDescriptor.contextPath + "/" + pageName + ".json").then(function(customResult) { setDefaultPageConfig(pageName, baseResult.data, customResult.data), deferrable.resolve(appDescriptor) }, function() { setDefaultPageConfig(pageName, baseResult.data), deferrable.resolve(appDescriptor) }) : (setDefaultPageConfig(pageName, baseResult.data), deferrable.resolve(appDescriptor)) }, function(error) { 404 !== error.status ? (messagingService.showMessage("error", "Incorrect Configuration: " + error.message), deferrable.reject(error)) : deferrable.resolve(appDescriptor) }), deferrable.promise }; this.getAppDescriptor = function() { return appDescriptor }, this.configBaseUrl = function() { return baseUrl }, this.loadCsvFileFromConfig = function(name) { return loadConfig(baseUrl + appDescriptor.contextPath + "/" + name) }, this.loadConfig = function(name, shouldMerge) { return loadConfig(baseUrl + appDescriptor.contextPath + "/" + name).then(function(baseResponse) { return baseResponse.data.shouldOverRideConfig ? loadConfig(customUrl + appDescriptor.contextPath + "/" + name).then(function(customResponse) { return shouldMerge || void 0 === shouldMerge ? mergeService.merge(baseResponse.data, customResponse.data) : [baseResponse.data, customResponse.data] }, function() { return baseResponse.data }) : baseResponse.data }) }, this.loadMandatoryConfig = function(path) { return $http.get(path) }, this.getAppName = function() { return this.appName }, this.checkPrivilege = function(privilegeName) { return hasPrivilegeOf(privilegeName) ? $q.when(!0) : (messagingService.showMessage("error", $translate.instant(Bahmni.Common.Constants.privilegeRequiredErrorMessage) + " [Privileges required: " + privilegeName + "]"), $q.reject()) }, this.initApp = function(appName, options, extensionFileSuffix, configPages) { this.appName = appName; var appLoader = $q.defer(), extensionFileName = extensionFileSuffix && "default" !== extensionFileSuffix.toLowerCase() ? "/extension-" + extensionFileSuffix + ".json" : "/extension.json", promises = [], opts = options || { app: !0, extension: !0 }, inheritAppContext = !opts.inherit || opts.inherit; appDescriptor = new Bahmni.Common.AppFramework.AppDescriptor(appName, inheritAppContext, function() { return currentUser }, mergeService); var loadCredentialsPromise = sessionService.loadCredentials(), loadProviderPromise = loadCredentialsPromise.then(sessionService.loadProviders); return promises.push(loadCredentialsPromise), promises.push(loadProviderPromise), opts.extension && promises.push(loadExtensions(appDescriptor, extensionFileName)), opts.template && promises.push(loadTemplate(appDescriptor)), opts.app && promises.push(loadDefinition(appDescriptor)), _.isEmpty(configPages) || configPages.forEach(function(configPage) { promises.push(loadPageConfig(configPage, appDescriptor)) }), $q.all(promises).then(function(results) { currentUser = results[0], appLoader.resolve(appDescriptor), $rootScope.$broadcast("event:appExtensions-loaded") }, function(errors) { appLoader.reject(errors) }), appLoader.promise } }]), angular.module("bahmni.common.appFramework").service("mergeService", [function() { this.merge = function(base, custom) { var mergeResult = $.extend(!0, {}, base, custom); return deleteNullValuedKeys(mergeResult) }; var deleteNullValuedKeys = function(currentObject) { return _.forOwn(currentObject, function(value, key) { (_.isUndefined(value) || _.isNull(value) || _.isNaN(value) || _.isObject(value) && _.isNull(deleteNullValuedKeys(value))) && delete currentObject[key] }), currentObject } }]), angular.module("bahmni.common.appFramework").directive("appExtensionList", ["appService", function(appService) { var appDescriptor = appService.getAppDescriptor(); return { restrict: "EA", template: '', scope: { extnPointId: "@", showLabel: "@", onExtensionClick: "&", contextModel: "&" }, compile: function(cElement, cAttrs) { var extnList = appDescriptor.getExtensions(cAttrs.extnPointId); return function(scope) { scope.appExtensions = extnList; var model = scope.contextModel(); scope.extnParams = model || {} } }, controller: function($scope, $location) { $scope.formatUrl = appDescriptor.formatUrl, $scope.extnLinkClick = function(extn, params) { var proceedWithDefault = !0, clickHandler = $scope.onExtensionClick(), target = appDescriptor.formatUrl(extn.url, params); if (clickHandler) { var event = { src: extn, target: target, params: params, preventDefault: function() { proceedWithDefault = !1 } }; clickHandler(event) } proceedWithDefault && $location.url(target) } } } }]), Bahmni.Common.AppFramework.AppDescriptor = function(context, inheritContext, retrieveUserCallback, mergeService) { this.id = null, this.instanceOf = null, this.description = null, this.contextModel = null, this.baseExtensionPoints = [], this.customExtensionPoints = [], this.baseExtensions = {}, this.customExtensions = {}, this.customConfigs = {}, this.baseConfigs = {}, this.extensionPath = context, this.contextPath = inheritContext ? context.split("/")[0] : context; var self = this, setExtensionPointsFromExtensions = function(currentExtensions, currentExtensionPoints) { _.values(currentExtensions).forEach(function(extn) { if (extn) { var existing = self[currentExtensionPoints].filter(function(ep) { return ep.id === extn.extensionPointId }); 0 === existing.length && self[currentExtensionPoints].push({ id: extn.extensionPointId, description: extn.description }) } }) }; this.setExtensions = function(baseExtensions, customExtensions) { customExtensions && (setExtensionPointsFromExtensions(customExtensions, "customExtensionPoints"), self.customExtensions = customExtensions), self.baseExtensions = baseExtensions, setExtensionPointsFromExtensions(baseExtensions, "baseExtensionPoints") }, this.setTemplate = function(template) { self.instanceOf = template.id, self.description = self.description || template.description, self.contextModel = self.contextModel || template.contextModel, template.configOptions && _.values(template.configOptions).forEach(function(opt) { var existing = self.configs.filter(function(cfg) { return cfg.name === opt.name }); existing.length > 0 ? existing[0].description = opt.description : self.configs.push({ name: opt.name, description: opt.description, value: opt.defaultValue }) }) }; var setConfig = function(instance, currentConfig) { for (var configName in instance.config) { var existingConfig = getConfig(self[currentConfig], configName); existingConfig ? existingConfig.value = instance.config[configName] : self[currentConfig][configName] = { name: configName, value: instance.config[configName] } } }, setDefinitionExtensionPoints = function(extensionPoints, currentExtensionPoints) { extensionPoints && extensionPoints.forEach(function(iep) { if (iep) { var existing = self[currentExtensionPoints].filter(function(ep) { return ep.id === iep.id }); 0 === existing.length && self[currentExtensionPoints].push(iep) } }) }; this.setDefinition = function(baseInstance, customInstance) { self.instanceOf = customInstance && customInstance.instanceOf ? customInstance.instanceOf : baseInstance.instanceOf, self.id = customInstance && customInstance.id ? customInstance.id : baseInstance.id, self.description = customInstance && customInstance.description ? customInstance.description : baseInstance.description, self.contextModel = customInstance && customInstance.contextModel ? customInstance.contextModel : baseInstance.contextModel, setDefinitionExtensionPoints(baseInstance.extensionPoints, "baseExtensionPoints"), setConfig(baseInstance, "baseConfigs"), customInstance && (setDefinitionExtensionPoints(customInstance.extensionPoints, "customExtensionPoints"), setConfig(customInstance, "customConfigs")) }; var getExtensions = function(extPointId, type, extensions) { var currentUser = retrieveUserCallback(), currentExtensions = _.values(extensions); if (currentUser && currentExtensions) { var extnType = type || "all", userPrivileges = currentUser.privileges.map(function(priv) { return priv.retired ? "" : priv.name }), appsExtns = currentExtensions.filter(function(extn) { return ("all" === extnType || extn.type === extnType) && extn.extensionPointId === extPointId && (!extn.requiredPrivilege || userPrivileges.indexOf(extn.requiredPrivilege) >= 0) }); return appsExtns.sort(function(extn1, extn2) { return extn1.order - extn2.order }), appsExtns } }; this.getExtensions = function(extPointId, type, shouldMerge) { if (shouldMerge || void 0 === shouldMerge) { var mergedExtensions = mergeService.merge(self.baseExtensions, self.customExtensions); return getExtensions(extPointId, type, mergedExtensions) } return [getExtensions(extPointId, type, self.baseExtensions), getExtensions(extPointId, type, self.customExtensions)] }, this.getExtensionById = function(id, shouldMerge) { if (shouldMerge || void 0 === shouldMerge) { var mergedExtensions = _.values(mergeService.merge(self.baseExtensions, self.customExtensions)); return mergedExtensions.filter(function(extn) { return extn.id === id })[0] } return [self.baseExtensions.filter(function(extn) { return extn.id === id })[0], self.customExtensions.filter(function(extn) { return extn.id === id })[0]] }; var getConfig = function(config, configName) { var cfgList = _.values(config).filter(function(cfg) { return cfg.name === configName }); return cfgList.length > 0 ? cfgList[0] : null }; this.getConfig = function(configName, shouldMerge) { return shouldMerge || void 0 === shouldMerge ? getConfig(mergeService.merge(self.baseConfigs, self.customConfigs), configName) : [getConfig(self.baseConfigs, configName), getConfig(self.customConfigs, configName)] }, this.getConfigValue = function(configName, shouldMerge) { var config = this.getConfig(configName, shouldMerge); return shouldMerge || void 0 === shouldMerge ? config ? config.value : null : config }, this.formatUrl = function(url, options, useQueryParams) { var pattern = /{{([^}]*)}}/g, matches = url.match(pattern), replacedString = url, checkQueryParams = useQueryParams || !1, queryParameters = this.parseQueryParams(); return matches && matches.forEach(function(el) { var key = el.replace("{{", "").replace("}}", ""), value = options[key]; value || checkQueryParams !== !0 || (value = queryParameters[key] || null), replacedString = replacedString.replace(el, value) }), replacedString.trim() }, this.parseQueryParams = function(locationSearchString) { var urlParams, match, pl = /\+/g, search = /([^&=]+)=?([^&]*)/g, decode = function(s) { return decodeURIComponent(s.replace(pl, " ")) }, queryString = locationSearchString || window.location.search.substring(1); for (urlParams = {}; match = search.exec(queryString);) urlParams[decode(match[1])] = decode(match[2]); return urlParams }, this.addConfigForPage = function(pageName, baseConfig, customConfig) { self.basePageConfigs = self.basePageConfigs || {}, self.basePageConfigs[pageName] = baseConfig, self.customPageConfigs = self.customPageConfigs || {}, self.customPageConfigs[pageName] = customConfig }, this.getConfigForPage = function(pageName, shouldMerge) { return shouldMerge || void 0 === shouldMerge ? mergeService.merge(self.basePageConfigs[pageName], self.customPageConfigs[pageName]) : [_.values(self.basePageConfigs[pageName]), _.values(self.customPageConfigs[pageName])] } }, angular.module("bahmni.common.config", []), angular.module("bahmni.common.config").service("configurations", ["configurationService", function(configurationService) { this.configs = {}, this.load = function(configNames) { var self = this; return configurationService.getConfigurations(_.difference(configNames, Object.keys(this.configs))).then(function(configurations) { angular.extend(self.configs, configurations) }) }, this.dosageInstructionConfig = function() { return this.configs.dosageInstructionConfig || [] }, this.stoppedOrderReasonConfig = function() { return this.configs.stoppedOrderReasonConfig || [] }, this.dosageFrequencyConfig = function() { return this.configs.dosageFrequencyConfig || [] }, this.allTestsAndPanelsConcept = function() { return this.configs.allTestsAndPanelsConcept.results[0] || [] }, this.impressionConcept = function() { return this.configs.radiologyImpressionConfig.results[0] || [] }, this.labOrderNotesConcept = function() { return this.configs.labOrderNotesConfig.results[0] || [] }, this.consultationNoteConcept = function() { return this.configs.consultationNoteConfig.results[0] || [] }, this.patientConfig = function() { return this.configs.patientConfig || {} }, this.encounterConfig = function() { return angular.extend(new EncounterConfig, this.configs.encounterConfig || []) }, this.patientAttributesConfig = function() { return this.configs.patientAttributesConfig.results }, this.identifierTypesConfig = function() { return this.configs.identifierTypesConfig }, this.genderMap = function() { return this.configs.genderMap }, this.addressLevels = function() { return this.configs.addressLevels }, this.relationshipTypes = function() { return this.configs.relationshipTypeConfig.results || [] }, this.relationshipTypeMap = function() { return this.configs.relationshipTypeMap || {} }, this.loginLocationToVisitTypeMapping = function() { return this.configs.loginLocationToVisitTypeMapping || {} }, this.defaultEncounterType = function() { return this.configs.defaultEncounterType } }]), angular.module("bahmni.common.config").directive("showIfPrivilege", ["$rootScope", function($rootScope) { return { scope: { showIfPrivilege: "@" }, link: function(scope, element) { var privileges = scope.showIfPrivilege.split(","), requiredPrivilege = !1; if ($rootScope.currentUser) { var allTypesPrivileges = _.map($rootScope.currentUser.privileges, _.property("name")), intersect = _.intersectionWith(allTypesPrivileges, privileges, _.isEqual); requiredPrivilege = intersect.length > 0 } requiredPrivilege || element.hide() } } }]), angular.module("bahmni.common.patient", []), Bahmni.PatientMapper = function(patientConfig, $rootScope, $translate) { this.patientConfig = patientConfig, this.map = function(openmrsPatient) { var patient = this.mapBasic(openmrsPatient); return this.mapAttributes(patient, openmrsPatient.person.attributes), patient }, this.mapBasic = function(openmrsPatient) { var patient = {}; if (patient.uuid = openmrsPatient.uuid, patient.givenName = openmrsPatient.person.preferredName.givenName, patient.familyName = null === openmrsPatient.person.preferredName.familyName ? "" : openmrsPatient.person.preferredName.familyName, patient.name = patient.givenName + " " + patient.familyName, patient.age = openmrsPatient.person.age, patient.ageText = calculateAge(Bahmni.Common.Util.DateUtil.parseServerDateToDate(openmrsPatient.person.birthdate)), patient.gender = openmrsPatient.person.gender, patient.genderText = mapGenderText(patient.gender), patient.address = mapAddress(openmrsPatient.person.preferredAddress), patient.birthdateEstimated = openmrsPatient.person.birthdateEstimated, patient.birthtime = Bahmni.Common.Util.DateUtil.parseServerDateToDate(openmrsPatient.person.birthtime), patient.bloodGroupText = getPatientBloodGroupText(openmrsPatient), openmrsPatient.identifiers) { var primaryIdentifier = openmrsPatient.identifiers[0].primaryIdentifier; patient.identifier = primaryIdentifier ? primaryIdentifier : openmrsPatient.identifiers[0].identifier } return openmrsPatient.person.birthdate && (patient.birthdate = parseDate(openmrsPatient.person.birthdate)), openmrsPatient.person.personDateCreated && (patient.registrationDate = parseDate(openmrsPatient.person.personDateCreated)), patient.image = Bahmni.Common.Constants.patientImageUrlByPatientUuid + openmrsPatient.uuid, patient }, this.getPatientConfigByUuid = function(patientConfig, attributeUuid) { return this.patientConfig.personAttributeTypes ? patientConfig.personAttributeTypes.filter(function(item) { return item.uuid === attributeUuid })[0] : {} }, this.mapAttributes = function(patient, attributes) { var self = this; this.patientConfig && attributes.forEach(function(attribute) { var x = self.getPatientConfigByUuid(patientConfig, attribute.attributeType.uuid); patient[x.name] = { label: x.description, value: attribute.value, isDateField: checkIfDateField(x) } }) }; var calculateAge = function(birthDate) { var DateUtil = Bahmni.Common.Util.DateUtil, age = DateUtil.diffInYearsMonthsDays(birthDate, DateUtil.now()), ageInString = ""; return age.years && (ageInString += age.years + " " + $translate.instant("CLINICAL_YEARS_TRANSLATION_KEY") + " "), age.months && (ageInString += age.months + " " + $translate.instant("CLINICAL_MONTHS_TRANSLATION_KEY") + " "), age.days && (ageInString += age.days + " " + $translate.instant("CLINICAL_DAYS_TRANSLATION_KEY") + " "), ageInString }, mapAddress = function(preferredAddress) { return preferredAddress ? { address1: preferredAddress.address1, address2: preferredAddress.address2, address3: preferredAddress.address3, cityVillage: preferredAddress.cityVillage, countyDistrict: null === preferredAddress.countyDistrict ? "" : preferredAddress.countyDistrict, stateProvince: preferredAddress.stateProvince } : {} }, parseDate = function(dateStr) { return dateStr ? Bahmni.Common.Util.DateUtil.parse(dateStr.substr(0, 10)) : dateStr }, mapGenderText = function(genderChar) { return null == genderChar ? null : "" + $rootScope.genderMap[angular.uppercase(genderChar)] + "" }, getPatientBloodGroupText = function(openmrsPatient) { if (openmrsPatient.person.bloodGroup) return "" + openmrsPatient.person.bloodGroup + ""; if (openmrsPatient.person.attributes && openmrsPatient.person.attributes.length > 0) { var bloodGroup; if (_.forEach(openmrsPatient.person.attributes, function(attribute) { "bloodGroup" == attribute.attributeType.display && (bloodGroup = attribute.display) }), bloodGroup) return "" + bloodGroup + "" } }, checkIfDateField = function(x) { return x.format === Bahmni.Common.Constants.patientAttributeDateFieldFormat } }, Bahmni.PatientContextMapper = function() { this.map = function(patient) { var patientContext = {}; patientContext.uuid = patient.uuid, patientContext.givenName = patient.person.names[0].givenName; var familyName = patient.person.names[0].familyName; if (patientContext.familyName = familyName ? familyName : "", patientContext.middleName = patient.person.names[0].middleName, patientContext.gender = patient.person.gender, patient.identifiers) { var primaryIdentifier = patient.identifiers[0].primaryIdentifier; patientContext.identifier = primaryIdentifier ? primaryIdentifier : patient.identifiers[0].identifier } return patient.person.birthdate && (patientContext.birthdate = parseDate(patient.person.birthdate)), patientContext }; var parseDate = function(dateStr) { return dateStr ? Bahmni.Common.Util.DateUtil.parse(dateStr.substr(0, 10)) : dateStr } }, angular.module("bahmni.common.patient").filter("gender", ["$rootScope", function($rootScope) { return function(genderChar) { return null == genderChar ? "Unknown" : $rootScope.genderMap[angular.uppercase(genderChar)] } }]), angular.module("bahmni.common.patient").filter("age", function() { return function(age) { return age.years ? age.years + " y" : age.months ? age.months + " m" : age.days + " d" } }), angular.module("bahmni.common.patient").filter("dateToAge", ["$filter", function($filter) { return function(birthDate, referenceDate) { var DateUtil = Bahmni.Common.Util.DateUtil; referenceDate = referenceDate || DateUtil.now(); var age = DateUtil.diffInYearsMonthsDays(birthDate, referenceDate); return $filter("age")(age) } }]), angular.module("bahmni.common.patient").filter("birthDateToAgeText", ["$filter", "$translate", function($filter, $translate) { return function(birthDate) { var DateUtil = Bahmni.Common.Util.DateUtil; if (birthDate) { var age = DateUtil.diffInYearsMonthsDays(birthDate, DateUtil.now()), ageInString = ""; return age.years && (ageInString += age.years + " " + $translate.instant("CLINICAL_YEARS_TRANSLATION_KEY") + " "), age.months && (ageInString += age.months + " " + $translate.instant("CLINICAL_MONTHS_TRANSLATION_KEY") + " "), age.days && (ageInString += age.days + " " + $translate.instant("CLINICAL_DAYS_TRANSLATION_KEY") + " "), ageInString } return "" } }]), angular.module("bahmni.common.patient").directive("patientSummary", function() { var link = function($scope) { $scope.showPatientDetails = !1, $scope.togglePatientDetails = function() { $scope.showPatientDetails = !$scope.showPatientDetails }, $scope.onImageClick = function() { $scope.onImageClickHandler && $scope.onImageClickHandler() } }; return { restrict: "E", templateUrl: "../common/patient/header/views/patientSummary.html", link: link, required: "patient", scope: { patient: "=", bedDetails: "=", onImageClickHandler: "&" } } }), angular.module("bahmni.common.patient").directive("fallbackSrc", function() { return { restrict: "A", link: function(scope, element, attrs) { _.isEmpty(attrs.ngSrc) && element.attr("src", attrs.fallbackSrc), element.bind("error", function() { element.attr("src", attrs.fallbackSrc) }) } } }), angular.module("bahmni.common.patient").directive("stopEventPropagation", function() { return { link: function(scope, elem, attrs) { elem.on(attrs.stopEventPropagation, function(e) { e.stopPropagation() }) } } }), angular.module("bahmni.common.patientSearch", ["bahmni.common.patient", "infinite-scroll"]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.PatientSearch = Bahmni.Common.PatientSearch || {}, Bahmni.Common.PatientSearch.Constants = { searchExtensionTileViewType: "tile", searchExtensionTabularViewType: "tabular", tabularViewIgnoreHeadingsList: ["display", "uuid", "image", "$$hashKey", "activeVisitUuid", "hasBeenAdmitted", "forwardUrl", "programUuid", "enrollment"], identifierHeading: ["ID", "Id", "id", "identifier", "DQ_COLUMN_TITLE_ACTION"], nameHeading: ["NAME", "Name", "name"], patientTileHeight: 100, patientTileWidth: 100, printIgnoreHeadingsList: ["DQ_COLUMN_TITLE_ACTION"], tileLoadRatio: .5 }, Bahmni.Common.PatientSearch.Search = function(searchTypes) { function mapPatient(patient) { return (patient.name || patient.givenName || patient.familyName) && (patient.name = patient.name || patient.givenName + (patient.familyName ? " " + patient.familyName : "")), patient.display = _.map(self.searchColumns, function(column) { return patient[column] }).join(" - "), patient.image = Bahmni.Common.Constants.patientImageUrlByPatientUuid + patient.uuid, patient } var self = this; self.searchTypes = searchTypes || [], self.searchType = this.searchTypes[0], self.searchParameter = "", self.noResultsMessage = null, self.searchResults = [], self.activePatients = [], self.navigated = !1, self.links = self.searchType && self.searchType.links ? self.searchType.links : [], self.searchColumns = self.searchType && self.searchType.searchColumns ? self.searchType.searchColumns : ["identifier", "name"], angular.forEach(searchTypes, function(searchType) { searchType.patientCount = "..." }), self.switchSearchType = function(searchType) { self.noResultsMessage = null, self.isSelectedSearch(searchType) || (self.searchParameter = "", self.navigated = !0, self.searchType = searchType, self.activePatients = [], self.searchResults = [], self.links = self.searchType && self.searchType.links ? self.searchType.links : [], self.searchColumns = self.searchType && self.searchType.searchColumns ? self.searchType.searchColumns : ["identifier", "name"]), self.markPatientEntry() }, self.markPatientEntry = function() { self.startPatientSearch = !0, window.setTimeout(function() { self.startPatientSearch = !1 }) }, self.patientsCount = function() { return self.activePatients.length }, self.updatePatientList = function(patientList) { self.activePatients = patientList.map(mapPatient), self.searchResults = self.activePatients }, self.updateSearchResults = function(patientList) { self.updatePatientList(patientList), 0 === self.activePatients.length && "" != self.searchParameter ? self.noResultsMessage = "NO_RESULTS_FOUND" : self.noResultsMessage = null }, self.hasSingleActivePatient = function() { return 1 === self.activePatients.length }, self.filterPatients = function(matchingCriteria) { matchingCriteria = matchingCriteria ? matchingCriteria : matchesNameOrId, self.searchResults = self.searchParameter ? self.activePatients.filter(matchingCriteria) : self.activePatients }, self.filterPatientsByIdentifier = function() { self.filterPatients(matchesId) }, self.isSelectedSearch = function(searchType) { return self.searchType && self.searchType.id == searchType.id }, self.isCurrentSearchLookUp = function() { return self.searchType && self.searchType.handler }, self.isTileView = function() { return self.searchType && self.searchType.view === Bahmni.Common.PatientSearch.Constants.searchExtensionTileViewType }, self.isTabularView = function() { return self.searchType && self.searchType.view === Bahmni.Common.PatientSearch.Constants.searchExtensionTabularViewType }, self.showPatientCountOnSearchParameter = function(searchType) { return showPatientCount(searchType) && self.searchParameter }; var matchesNameOrId = function(patient) { return patient.display.toLowerCase().indexOf(self.searchParameter.toLowerCase()) !== -1 }, matchesId = function(patient) { return patient.identifier.toLowerCase().indexOf(self.searchParameter.toLowerCase()) !== -1 }, showPatientCount = function(searchType) { return self.isSelectedSearch(searchType) && self.isCurrentSearchLookUp() } }, angular.module("bahmni.common.patientSearch").directive("resize", ["$window", function($window) { var controller = function($scope) { $scope.storeWindowDimensions = function() { var windowWidth = window.innerWidth, windowHeight = window.innerHeight, tileWidth = Bahmni.Common.PatientSearch.Constants.patientTileWidth, tileHeight = Bahmni.Common.PatientSearch.Constants.patientTileHeight; $scope.tilesToFit = Math.ceil(windowWidth * windowHeight / (tileWidth * tileHeight)), $scope.tilesToLoad = Math.ceil($scope.tilesToFit * Bahmni.Common.PatientSearch.Constants.tileLoadRatio) }; var updateVisibleResults = function() { $scope.visibleResults = $scope.searchResults.slice(0, $scope.tilesToLoad) }; $scope.loadMore = function() { var last = $scope.visibleResults.length, more = $scope.searchResults.length - last, toShow = more > $scope.tilesToLoad ? $scope.tilesToLoad : more; if (toShow > 0) for (var i = 1; i <= toShow; i++) $scope.visibleResults.push($scope.searchResults[last + i - 1]) }, $scope.$watch("searchResults", updateVisibleResults), $scope.$watch("tilesToFit", updateVisibleResults) }, link = function($scope) { $scope.storeWindowDimensions(), angular.element($window).bind("resize", function() { $scope.$apply(function() { $scope.storeWindowDimensions() }) }) }; return { restrict: "E", link: link, controller: controller, transclude: !0, scope: { searchResults: "=", visibleResults: "=" }, template: '
' } }]), angular.module("bahmni.common.patientSearch").directive("scheduler", ["$interval", function($interval) { var link = function($scope) { var promise, cancelSchedule = function() { promise && ($interval.cancel(promise), promise = null) }, startSchedule = function() { promise || (promise = $interval($scope.triggerFunction, 1e3 * $scope.refreshTime)) }; $scope.$watch(function() { return $scope.watchOn }, function(value) { $scope.refreshTime > 0 && (value ? cancelSchedule() : startSchedule()) }), $scope.triggerFunction(), $scope.$on("$destroy", function() { cancelSchedule() }) }; return { restrict: "A", link: link, scope: { refreshTime: "=", watchOn: "=", triggerFunction: "&" } } }]), angular.module("bahmni.common.patientSearch").controller("PatientsListController", ["$scope", "$http", "$window", "patientService", "$rootScope", "appService", "spinner", "$stateParams", "$bahmniCookieStore", "printer", "configurationService", function($scope, $http, $window, patientService, $rootScope, appService, spinner, $stateParams, $bahmniCookieStore, printer, configurationService) { const DEFAULT_FETCH_DELAY = 2e3; var patientListSpinner, patientSearchConfig = appService.getAppDescriptor().getConfigValue("patientSearch"), initialize = function() { var searchTypes = appService.getAppDescriptor().getExtensions("org.bahmni.patient.search", "config").map(mapExtensionToSearchType); $scope.search = new Bahmni.Common.PatientSearch.Search(_.without(searchTypes, void 0)), $scope.search.markPatientEntry(), $scope.$watch("search.searchType", function(currentSearchType) { _.isEmpty(currentSearchType) || fetchPatients(currentSearchType) }), $scope.$watch("search.activePatients", function(activePatientsList) { activePatientsList.length > 0 && patientListSpinner && hideSpinner(spinner, patientListSpinner, $(".tab-content")) }), patientSearchConfig && patientSearchConfig.serializeSearch ? getPatientCountSeriallyBySearchIndex(0) : _.each($scope.search.searchTypes, function(searchType) { _.isEmpty(searchType) || $scope.search.searchType != searchType && getPatientCount(searchType, null) }), null != $rootScope.currentSearchType && $scope.search.switchSearchType($rootScope.currentSearchType), configurationService.getConfigurations(["identifierTypesConfig"]).then(function(response) { $scope.primaryIdentifier = _.find(response.identifierTypesConfig, { primary: !0 }).name }) }; $scope.searchPatients = function() { return spinner.forPromise(patientService.search($scope.search.searchParameter)).then(function(response) { $scope.search.updateSearchResults(response.data.pageOfResults), $scope.search.hasSingleActivePatient() && $scope.forwardPatient($scope.search.activePatients[0]) }) }, $scope.filterPatientsAndSubmit = function() { 1 == $scope.search.searchResults.length && $scope.forwardPatient($scope.search.searchResults[0]) }; var getPatientCount = function(searchType, patientListSpinner) { if (searchType.handler) { var params = { q: searchType.handler, v: "full", location_uuid: $bahmniCookieStore.get(Bahmni.Common.Constants.locationCookieName).uuid, provider_uuid: $rootScope.currentProvider.uuid }; searchType.additionalParams && (params.additionalParams = searchType.additionalParams), patientService.findPatients(params).then(function(response) { searchType.patientCount = response.data.length, $scope.search.isSelectedSearch(searchType) && $scope.search.updatePatientList(response.data), patientListSpinner && hideSpinner(spinner, patientListSpinner, $(".tab-content")) }) } }, hideSpinner = function(spinnerObj, data, container) { spinnerObj.hide(data, container), $(container).children("patient-list-spinner").hide() }; $scope.getHeadings = function(patients) { if (patients && patients.length > 0) { var headings = _.chain(patients[0]).keys().filter(function(heading) { return _.indexOf(Bahmni.Common.PatientSearch.Constants.tabularViewIgnoreHeadingsList, heading) === -1 }).value(); return headings } return [] }, $scope.isHeadingOfLinkColumn = function(heading) { var identifierHeading = _.includes(Bahmni.Common.PatientSearch.Constants.identifierHeading, heading); return identifierHeading ? identifierHeading : $scope.search.searchType && $scope.search.searchType.links ? _.find($scope.search.searchType.links, { linkColumn: heading }) : $scope.search.searchType && $scope.search.searchType.linkColumn ? _.includes([$scope.search.searchType.linkColumn], heading) : void 0 }, $scope.isHeadingOfName = function(heading) { return _.includes(Bahmni.Common.PatientSearch.Constants.nameHeading, heading) }, $scope.getPrintableHeadings = function(patients) { var headings = $scope.getHeadings(patients), printableHeadings = headings.filter(function(heading) { return _.indexOf(Bahmni.Common.PatientSearch.Constants.printIgnoreHeadingsList, heading) === -1 }); return printableHeadings }, $scope.printPage = function() { null != $scope.search.searchType.printHtmlLocation && printer.printFromScope($scope.search.searchType.printHtmlLocation, $scope) }; var mapExtensionToSearchType = function(appExtn) { return { name: appExtn.label, display: appExtn.extensionParams.display, handler: appExtn.extensionParams.searchHandler, forwardUrl: appExtn.extensionParams.forwardUrl, id: appExtn.id, params: appExtn.extensionParams.searchParams, refreshTime: appExtn.extensionParams.refreshTime || 0, view: appExtn.extensionParams.view || Bahmni.Common.PatientSearch.Constants.searchExtensionTileViewType, showPrint: appExtn.extensionParams.showPrint || !1, printHtmlLocation: appExtn.extensionParams.printHtmlLocation || null, additionalParams: appExtn.extensionParams.additionalParams, searchColumns: appExtn.extensionParams.searchColumns, translationKey: appExtn.extensionParams.translationKey, linkColumn: appExtn.extensionParams.linkColumn, links: appExtn.extensionParams.links } }, debounceGetPatientCount = _.debounce(function(currentSearchType, patientListSpinner) { getPatientCount(currentSearchType, patientListSpinner) }, patientSearchConfig && patientSearchConfig.fetchDelay || DEFAULT_FETCH_DELAY, {}), showSpinner = function(spinnerObj, container) { return $(container).children("patient-list-spinner").show(), spinnerObj.show(container) }, fetchPatients = function(currentSearchType) { void 0 !== patientListSpinner && hideSpinner(spinner, patientListSpinner, $(".tab-content")), $rootScope.currentSearchType = currentSearchType, $scope.search.isCurrentSearchLookUp() && (patientListSpinner = showSpinner(spinner, $(".tab-content")), patientSearchConfig && patientSearchConfig.debounceSearch ? debounceGetPatientCount(currentSearchType, patientListSpinner) : getPatientCount(currentSearchType, patientListSpinner)) }; $scope.forwardPatient = function(patient, heading) { var options = $.extend({}, $stateParams); $rootScope.patientAdmitLocationStatus = patient.Status, $.extend(options, { patientUuid: patient.uuid, visitUuid: patient.activeVisitUuid || null, encounterUuid: $stateParams.encounterUuid || "active", programUuid: patient.programUuid || null, enrollment: patient.enrollment || null, forwardUrl: patient.forwardUrl || null, dateEnrolled: patient.dateEnrolled || null }); var link = options.forwardUrl ? { url: options.forwardUrl, newTab: !0 } : { url: $scope.search.searchType.forwardUrl, newTab: !1 }; $scope.search.searchType.links && (link = _.find($scope.search.searchType.links, { linkColumn: heading }) || link), "#/default/patient/{{patientUuid}}/dashboard?encounterUuid=active" === link.url ? $http({ method: "GET", url: "/openmrs/ws/rest/v1/visit?includeInactive=true&patient=" + patient.uuid + "&v=custom:(uuid,visitType,startDatetime,stopDatetime,location,encounters:(uuid))" }).then(function(response) { var result = response.data.results; result.length > 1 ? $window.open(appService.getAppDescriptor().formatUrl(link.url, options, !0), link.newTab ? "_blank" : "_self") : $window.location.href = "https://" + $window.location.hostname + ":6060/patientDashboard/" + patient.uuid }) : $window.open(appService.getAppDescriptor().formatUrl(link.url, options, !0), link.newTab ? "_blank" : "_self") }; var getPatientCountSeriallyBySearchIndex = function(index) { if (index !== $scope.search.searchTypes.length) { var searchType = $scope.search.searchTypes[index]; if (searchType.handler) { var params = { q: searchType.handler, v: "full", location_uuid: $bahmniCookieStore.get(Bahmni.Common.Constants.locationCookieName).uuid, provider_uuid: $rootScope.currentProvider.uuid }; searchType.additionalParams && (params.additionalParams = searchType.additionalParams), patientService.findPatients(params).then(function(response) { return searchType.patientCount = response.data.length, $scope.search.isSelectedSearch(searchType) && $scope.search.updatePatientList(response.data), getPatientCountSeriallyBySearchIndex(index + 1) }) } } }; initialize() }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.Domain = Bahmni.Common.Domain || {}, Bahmni.Common.Domain.Helper = Bahmni.Common.Domain.Helper || {}, angular.module("bahmni.common.domain", []), Bahmni.Common.Domain.RetrospectiveEntry = function() { var self = this; Object.defineProperty(this, "encounterDate", { get: function() { return self._encounterDate }, set: function(value) { value && (self._encounterDate = value) } }) }, Bahmni.Common.Domain.RetrospectiveEntry.createFrom = function(retrospectiveEncounterDateCookie) { var obj = new Bahmni.Common.Domain.RetrospectiveEntry; return obj.encounterDate = retrospectiveEncounterDateCookie, obj }, Bahmni.Common.Domain.Diagnosis = function(codedAnswer, order, certainty, existingObsUuid, freeTextAnswer, diagnosisDateTime, voided) { var self = this; self.codedAnswer = codedAnswer, self.order = order, self.certainty = certainty, self.existingObs = existingObsUuid, self.freeTextAnswer = freeTextAnswer, self.diagnosisDateTime = diagnosisDateTime, self.diagnosisStatus = void 0, self.isNonCodedAnswer = !1, self.codedAnswer && (self.conceptName = self.codedAnswer.name), self.voided = voided, self.firstDiagnosis = null, self.comments = "", self.getDisplayName = function() { return self.freeTextAnswer ? self.freeTextAnswer : self.codedAnswer.shortName || self.codedAnswer.name }, self.isPrimary = function() { return "PRIMARY" == self.order }, self.isSecondary = function() { return "SECONDARY" == self.order }, self.isRuledOut = function() { return self.diagnosisStatus == $rootScope.diagnosisStatus }, self.answerNotFilled = function() { return !self.codedAnswer.name }, self.isValidAnswer = function() { return self.codedAnswer.name && self.codedAnswer.uuid || self.codedAnswer.name && !self.codedAnswer.uuid && self.isNonCodedAnswer || self.answerNotFilled() }, self.isValidOrder = function() { return self.isEmpty() || void 0 !== self.order }, self.isValidCertainty = function() { return self.isEmpty() || void 0 !== self.certainty }, self.isEmpty = function() { return void 0 === self.getDisplayName() || 0 === self.getDisplayName().length }, self.diagnosisStatusValue = null, self.diagnosisStatusConcept = null, Object.defineProperty(this, "diagnosisStatus", { get: function() { return this.diagnosisStatusValue }, set: function(newStatus) { newStatus ? (this.diagnosisStatusValue = newStatus, this.diagnosisStatusConcept = { name: Bahmni.Common.Constants.ruledOutdiagnosisStatus }) : (this.diagnosisStatusValue = null, this.diagnosisStatusConcept = null) } }), self.clearCodedAnswerUuid = function() { self.codedAnswer.uuid = void 0 }, self.setAsNonCodedAnswer = function() { self.isNonCodedAnswer = !self.isNonCodedAnswer } }, function() { var DateUtil = Bahmni.Common.Util.DateUtil, Conditions = Bahmni.Common.Domain.Conditions = {}, Condition = Bahmni.Common.Domain.Condition = function(data) { data = data || {}, this.uuid = data.uuid, this.concept = { uuid: _.get(data, "concept.uuid"), shortName: _.get(data, "concept.shortName"), name: _.get(data, "concept.name") }, this.status = data.status, this.onSetDate = data.onSetDate, this.conditionNonCoded = data.conditionNonCoded, this.voided = data.voided, this.additionalDetail = data.additionalDetail, this.isNonCoded = data.isNonCoded, this.creator = data.creator, this.previousConditionUuid = data.previousConditionUuid, this.activeSince = data.onSetDate }; Condition.prototype = {}, Condition.prototype.toggleNonCoded = function() { this.isNonCoded = !this.isNonCoded }, Condition.prototype.clearConcept = function() { this.concept.uuid = void 0 }, Condition.prototype.isValidConcept = function() { return !(this.concept.name && !this.concept.uuid && !this.isNonCoded) }, Condition.prototype.isValid = function() { return this.status && (this.concept.name && this.isNonCoded || this.concept.uuid) }, Condition.prototype.isActive = function() { return "ACTIVE" == this.status }, Condition.prototype.displayString = function() { return this.conditionNonCoded || this.concept.shortName || this.concept.name }, Condition.prototype.isEmpty = function() { return !(this.status || this.concept.name || this.isNonCoded || this.concept.uuid || this.onSetDate || this.additionalDetail) }, Condition.createFromDiagnosis = function(diagnosis) { return new Condition({ concept: { uuid: diagnosis.codedAnswer.uuid, shortName: diagnosis.codedAnswer.shortName, name: diagnosis.codedAnswer.name }, status: "ACTIVE", onSetDate: DateUtil.today(), conditionNonCoded: diagnosis.freeTextAnswer, additionalDetail: diagnosis.comments, voided: !1 }) }, Conditions.fromConditionHistories = function(conditionsHistories) { return _.map(conditionsHistories, function(conditionsHistory) { var conditions = conditionsHistory.conditions; return new Condition(_.last(_.sortBy(_.reject(conditions, "endDate"), "onSetDate"))) }) }, Conditions.getPreviousActiveCondition = function(condition, allConditions) { if ("ACTIVE" == condition.status) return condition; var previousCondition = _.find(allConditions, { uuid: condition.previousConditionUuid }); return previousCondition ? Conditions.getPreviousActiveCondition(previousCondition, allConditions) : condition } }(), angular.module("bahmni.common.domain").service("retrospectiveEntryService", ["$rootScope", "$bahmniCookieStore", function($rootScope, $bahmniCookieStore) { var retrospectiveEntryService = this, dateUtil = Bahmni.Common.Util.DateUtil; this.getRetrospectiveEntry = function() { return $rootScope.retrospectiveEntry }, this.isRetrospectiveMode = function() { return !_.isEmpty(retrospectiveEntryService.getRetrospectiveEntry()) }, this.getRetrospectiveDate = function() { return $rootScope.retrospectiveEntry && $rootScope.retrospectiveEntry.encounterDate }, this.initializeRetrospectiveEntry = function() { var retrospectiveEncounterDateCookie = $bahmniCookieStore.get(Bahmni.Common.Constants.retrospectiveEntryEncounterDateCookieName); retrospectiveEncounterDateCookie && ($rootScope.retrospectiveEntry = Bahmni.Common.Domain.RetrospectiveEntry.createFrom(dateUtil.getDate(retrospectiveEncounterDateCookie))) }, this.resetRetrospectiveEntry = function(date) { $bahmniCookieStore.remove(Bahmni.Common.Constants.retrospectiveEntryEncounterDateCookieName, { path: "/", expires: 1 }), $rootScope.retrospectiveEntry = void 0, date && !dateUtil.isSameDate(date, dateUtil.today()) && ($rootScope.retrospectiveEntry = Bahmni.Common.Domain.RetrospectiveEntry.createFrom(dateUtil.getDate(date)), $bahmniCookieStore.put(Bahmni.Common.Constants.retrospectiveEntryEncounterDateCookieName, date, { path: "/", expires: 1 })) } }]), angular.module("bahmni.common.domain").factory("dispositionService", ["$http", function($http) { var getDispositionActions = function() { return $http.get(Bahmni.Common.Constants.conceptSearchByFullNameUrl + "&name=" + Bahmni.Common.Constants.dispositionConcept + "&v=custom:(uuid,name,answers:(uuid,name,mappings))", { cache: !0 }) }, getDispositionNoteConcept = function() { return $http.get(Bahmni.Common.Constants.conceptSearchByFullNameUrl + "&name=" + Bahmni.Common.Constants.dispositionNoteConcept + "&v=custom:(uuid,name:(name))", { cache: !0 }) }, getDispositionByVisit = function(visitUuid) { return $http.get(Bahmni.Common.Constants.bahmniDispositionByVisitUrl, { params: { visitUuid: visitUuid } }) }, getDispositionByPatient = function(patientUuid, numberOfVisits) { return $http.get(Bahmni.Common.Constants.bahmniDispositionByPatientUrl, { params: { patientUuid: patientUuid, numberOfVisits: numberOfVisits } }) }; return { getDispositionActions: getDispositionActions, getDispositionNoteConcept: getDispositionNoteConcept, getDispositionByVisit: getDispositionByVisit, getDispositionByPatient: getDispositionByPatient } }]), angular.module("bahmni.common.domain").service("visitDocumentService", ["$http", "auditLogService", "configurations", "$q", function($http, auditLogService, configurations, $q) { var removeVoidedDocuments = function(documents) { documents.forEach(function(document) { if (document.voided && document.image) { var url = Bahmni.Common.Constants.RESTWS_V1 + "/bahmnicore/visitDocument?filename=" + document.image; $http["delete"](url, { withCredentials: !0 }) } }) }; this.save = function(visitDocument) { var url = Bahmni.Common.Constants.RESTWS_V1 + "/bahmnicore/visitDocument", isNewVisit = !visitDocument.visitUuid; removeVoidedDocuments(visitDocument.documents); var visitTypeName = configurations.encounterConfig().getVisitTypeByUuid(visitDocument.visitTypeUuid).name, encounterTypeName = configurations.encounterConfig().getEncounterTypeByUuid(visitDocument.encounterTypeUuid).name; return $http.post(url, visitDocument).then(function(response) { var promise = isNewVisit ? auditLogService.log(visitDocument.patientUuid, "OPEN_VISIT", { visitUuid: response.data.visitUuid, visitType: visitTypeName }, encounterTypeName) : $q.when(); return promise.then(function() { return auditLogService.log(visitDocument.patientUuid, "EDIT_ENCOUNTER", { encounterUuid: response.data.encounterUuid, encounterType: encounterTypeName }, encounterTypeName).then(function() { return response }) }) }) }, this.saveFile = function(file, patientUuid, encounterTypeName, fileName, fileType) { var searchStr = ";base64", format = file.split(searchStr)[0].split("/")[1]; "video" === fileType && (format = _.last(_.split(fileName, "."))); var url = Bahmni.Common.Constants.RESTWS_V1 + "/bahmnicore/visitDocument/uploadDocument"; return $http.post(url, { content: file.substring(file.indexOf(searchStr) + searchStr.length, file.length), format: format, patientUuid: patientUuid, encounterTypeName: encounterTypeName, fileType: fileType || "file" }, { withCredentials: !0, headers: { Accept: "application/json", "Content-Type": "application/json" } }) }, this.getFileType = function(fileType) { var pdfType = "pdf", imageType = "image"; return fileType.indexOf(pdfType) !== -1 ? pdfType : fileType.indexOf(imageType) !== -1 ? imageType : "not_supported" } }]), angular.module("bahmni.common.domain").service("bedService", ["$http", "$rootScope", function($http, $rootScope) { var mapBedDetails = function(response) { var results = response.data.results; if (!_.isEmpty(results)) { var bed = _.first(results); return { wardName: bed.physicalLocation.parentLocation.display, wardUuid: bed.physicalLocation.parentLocation.uuid, physicalLocationName: bed.physicalLocation.name, bedNumber: bed.bedNumber, bedId: bed.bedId } } }; this.setBedDetailsForPatientOnRootScope = function(uuid) { var promise = this.getAssignedBedForPatient(uuid); return promise.then(function(bedDetails) { $rootScope.bedDetails = bedDetails }), promise }, this.getAssignedBedForPatient = function(patientUuid, visitUuid) { var params = { patientUuid: patientUuid, v: "full" }; return visitUuid && (params.visitUuid = visitUuid, params.s = "bedDetailsFromVisit"), $http.get(Bahmni.Common.Constants.bedFromVisit, { method: "GET", params: params, withCredentials: !0 }).then(mapBedDetails) }, this.assignBed = function(bedId, patientUuid, encounterUuid) { var patientJson = { patientUuid: patientUuid, encounterUuid: encounterUuid }; return $http.post(Bahmni.Common.Constants.bedFromVisit + "/" + bedId, patientJson, { withCredentials: !0, headers: { Accept: "application/json", "Content-Type": "application/json" } }) }, this.getBedInfo = function(bedId) { return $http.get(Bahmni.Common.Constants.bedFromVisit + "/" + bedId + "?v=custom:(bedId,bedNumber,patients:(uuid,person:(age,personName:(givenName,familyName),gender),identifiers:(uuid,identifier),),physicalLocation:(name))", { withCredentials: !0 }) }, this.getCompleteBedDetailsByBedId = function(bedId) { return $http.get(Bahmni.Common.Constants.bedFromVisit + "/" + bedId, { withCredentials: !0 }) } }]), angular.module("bahmni.common.domain").factory("providerService", ["$http", function($http) { var search = function(fieldValue) { return $http.get(Bahmni.Common.Constants.providerUrl, { method: "GET", params: { q: fieldValue, v: "full" }, withCredentials: !0 }) }, searchByUuid = function(uuid) { return $http.get(Bahmni.Common.Constants.providerUrl, { method: "GET", params: { user: uuid }, cache: !1 }) }, list = function(params) { return $http.get(Bahmni.Common.Constants.providerUrl, { method: "GET", cache: !1, params: params }) }; return { search: search, searchByUuid: searchByUuid, list: list } }]), Bahmni.Common.Domain.Helper.getHintForNumericConcept = function(concept) { if (concept) return null != concept.hiNormal && null != concept.lowNormal ? "(" + concept.lowNormal + " - " + concept.hiNormal + ")" : null != concept.hiNormal && null == concept.lowNormal ? "(< " + concept.hiNormal + ")" : null == concept.hiNormal && null != concept.lowNormal ? "(> " + concept.lowNormal + ")" : "" }, Bahmni.Common.Domain.ProviderMapper = function() { this.map = function(openMrsProvider) { return openMrsProvider ? { uuid: openMrsProvider.uuid, name: openMrsProvider.preferredName ? openMrsProvider.preferredName.display : openMrsProvider.person.preferredName.display } : null } }, Bahmni.Common.Domain.ConceptMapper = function() { this.map = function(openMrsConcept) { if (!openMrsConcept) return null; if (alreadyMappedConcept(openMrsConcept)) return openMrsConcept; var openMrsDescription = openMrsConcept.descriptions ? openMrsConcept.descriptions[0] : null, shortConceptName = _.find(openMrsConcept.names, { conceptNameType: "SHORT" }); return { uuid: openMrsConcept.uuid, name: openMrsConcept.name.name, shortName: shortConceptName ? shortConceptName.name : null, description: openMrsDescription ? openMrsDescription.description : null, set: openMrsConcept.set, dataType: openMrsConcept.datatype ? openMrsConcept.datatype.name : null, hiAbsolute: openMrsConcept.hiAbsolute, lowAbsolute: openMrsConcept.lowAbsolute, hiNormal: openMrsConcept.hiNormal, handler: openMrsConcept.handler, allowDecimal: openMrsConcept.allowDecimal, lowNormal: openMrsConcept.lowNormal, conceptClass: openMrsConcept.conceptClass ? openMrsConcept.conceptClass.name : null, answers: openMrsConcept.answers, units: openMrsConcept.units, displayString: shortConceptName ? shortConceptName.name : openMrsConcept.name.name, names: openMrsConcept.names } }; var alreadyMappedConcept = function(concept) { return !concept.name.name } }, Bahmni.Common.Domain.ObservationMapper = function() { this.map = function(openMrsObs) { var conceptMapper = new Bahmni.Common.Domain.ConceptMapper, groupMembers = openMrsObs.groupMembers || []; return { uuid: openMrsObs.uuid, concept: conceptMapper.map(openMrsObs.concept), value: openMrsObs.value, voided: openMrsObs.voided, voidedReason: openMrsObs.voidedReason, observationDateTime: openMrsObs.obsDatetime, orderUuid: openMrsObs.orderUuid, groupMembers: groupMembers.map(this.map) } } }, function() { var nameFor = { Date: function(obs) { return moment(obs.value).format("D-MMM-YYYY") }, Datetime: function(obs) { var date = Bahmni.Common.Util.DateUtil.parseDatetime(obs.value); return null != date ? Bahmni.Common.Util.DateUtil.formatDateWithTime(date) : "" }, Boolean: function(obs) { return obs.value === !0 ? "Yes" : obs.value === !1 ? "No" : obs.value }, Coded: function(obs) { return obs.value.shortName || obs.value.name || obs.value }, Object: function(obs) { return nameFor.Coded(obs) }, MultiSelect: function(obs) { return obs.getValues().join(", ") }, Default: function(obs) { return obs.value } }; Bahmni.Common.Domain.ObservationValueMapper = { getNameFor: nameFor, map: function(obs) { var type = obs.concept && obs.concept.dataType || obs.type; return type in nameFor || (type = "object" == typeof obs.value && "Object" || obs.isMultiSelect && "MultiSelect" || "Default"), nameFor[type](obs) } } }(), Bahmni.DiagnosisMapper = function(diagnosisStatus) { var self = this, mapDiagnosis = function(diagnosis) { diagnosis.codedAnswer || (diagnosis.codedAnswer = { name: void 0, uuid: void 0 }); var mappedDiagnosis = angular.extend(new Bahmni.Common.Domain.Diagnosis, diagnosis); return mappedDiagnosis.firstDiagnosis && (mappedDiagnosis.firstDiagnosis = mapDiagnosis(mappedDiagnosis.firstDiagnosis)), mappedDiagnosis.latestDiagnosis && (mappedDiagnosis.latestDiagnosis = mapDiagnosis(mappedDiagnosis.latestDiagnosis)), diagnosis.diagnosisStatusConcept && Bahmni.Common.Constants.ruledOutdiagnosisStatus === diagnosis.diagnosisStatusConcept.name && (mappedDiagnosis.diagnosisStatus = diagnosisStatus), mappedDiagnosis }; self.mapDiagnosis = mapDiagnosis, self.mapDiagnoses = function(diagnoses) { var mappedDiagnoses = []; return _.each(diagnoses, function(diagnosis) { mappedDiagnoses.push(mapDiagnosis(diagnosis)) }), mappedDiagnoses }, self.mapPastDiagnosis = function(diagnoses, currentEncounterUuid) { var pastDiagnosesResponse = []; return diagnoses.forEach(function(diagnosis) { diagnosis.encounterUuid !== currentEncounterUuid && (diagnosis.previousObs = diagnosis.existingObs, diagnosis.existingObs = null, diagnosis.inCurrentEncounter = void 0, pastDiagnosesResponse.push(diagnosis)) }), pastDiagnosesResponse }, self.mapSavedDiagnosesFromCurrentEncounter = function(diagnoses, currentEncounterUuid) { var savedDiagnosesFromCurrentEncounter = []; return diagnoses.forEach(function(diagnosis) { diagnosis.encounterUuid === currentEncounterUuid && (diagnosis.inCurrentEncounter = !0, savedDiagnosesFromCurrentEncounter.push(diagnosis)) }), savedDiagnosesFromCurrentEncounter } }; var EncounterConfig = function() { function EncounterConfig(encounterTypes) { this.encounterTypes = encounterTypes } return EncounterConfig.prototype = { getConsultationEncounterTypeUuid: function() { return this.getEncounterTypeUuid("Consultation") }, getAdmissionEncounterTypeUuid: function() { return this.getEncounterTypeUuid("ADMISSION") }, getDischargeEncounterTypeUuid: function() { return this.getEncounterTypeUuid("DISCHARGE") }, getTransferEncounterTypeUuid: function() { return this.getEncounterTypeUuid("TRANSFER") }, getRadiologyEncounterTypeUuid: function() { return this.getEncounterTypeUuid("RADIOLOGY") }, getPatientDocumentEncounterTypeUuid: function() { return this.getEncounterTypeUuid("Patient Document") }, getValidationEncounterTypeUuid: function() { return this.getEncounterTypeUuid(Bahmni.Common.Constants.validationNotesEncounterType) }, getEncounterTypeUuid: function(encounterTypeName) { return this.encounterTypes[encounterTypeName] }, getVisitTypes: function() { var visitTypesArray = []; for (var name in this.visitTypes) visitTypesArray.push({ name: name, uuid: this.visitTypes[name] }); return visitTypesArray }, getEncounterTypes: function() { var encounterTypesArray = []; for (var name in this.encounterTypes) encounterTypesArray.push({ name: name, uuid: this.encounterTypes[name] }); return encounterTypesArray }, getVisitTypeByUuid: function(uuid) { var visitTypes = this.getVisitTypes(); return visitTypes.filter(function(visitType) { return visitType.uuid === uuid })[0] }, getEncounterTypeByUuid: function(uuid) { var encounterType = this.getEncounterTypes(); return encounterType.filter(function(encounterType) { return encounterType.uuid === uuid })[0] } }, EncounterConfig }(); ! function() { Bahmni.Common.Domain.ObservationFilter = function() { var self = this, voidExistingObservationWithOutValue = function(observations) { observations.forEach(function(observation) { voidExistingObservationWithOutValue(observation.groupMembers), observation.voided = observation.voided || observation.canBeVoided(), observation.voided && voidAllChildren(observation) }) }, voidAllChildren = function(voidedObservation) { voidedObservation.groupMembers.forEach(function(childWithVoidedParent) { childWithVoidedParent.voided = !0, voidAllChildren(childWithVoidedParent) }) }, removeNewObservationsWithoutValue = function(observations) { return observations.forEach(function(observation) { observation.groupMembers = removeNewObservationsWithoutValue(observation.groupMembers) }), observations.filter(function(observation) { var validObs = observation.isExisting() || observation.hasValue() || observation.hasMemberWithValue(); return validObs && !observation.voided || observation.isExisting() && observation.voided }) }, removeNewObservationsWhichAreVoided = function(observations) { return observations.forEach(function(observation) { observation.groupMembers = removeNewObservationsWhichAreVoided(observation.groupMembers) }), _.reject(observations, function(observation) { return observation.isNew() && observation.voided }) }; self.filter = function(observations) { var wrappedObservations = observations.map(Observation.wrap), filteredObservations = removeNewObservationsWithoutValue(wrappedObservations); return filteredObservations = removeNewObservationsWhichAreVoided(filteredObservations), voidExistingObservationWithOutValue(filteredObservations), filteredObservations } }; var Observation = function(observationData) { angular.extend(this, observationData), this.isNew = function() { return !this.uuid }, this.isExisting = function() { return !this.isNew() }, this.hasValue = function() { return void 0 !== this.value && null !== this.value && "" !== this.value }, this.hasMemberWithValue = function() { return this.groupMembers.some(function(groupMember) { return groupMember.hasValue() || groupMember.hasMemberWithValue() }) }, this.isGroup = function() { return this.groupMembers.length > 0 }, this.isLeaf = function() { return !this.isGroup() }, this.isGroupWithOnlyVoidedMembers = function() { return this.isGroup() && this.groupMembers.every(function(groupMember) { return groupMember.voided }) }, this.isLeafNodeWithOutValue = function() { return this.isLeaf() && !this.hasValue() }, this.canBeVoided = function() { return this.isExisting() && (this.isLeafNodeWithOutValue() || this.isGroupWithOnlyVoidedMembers()) } }; Observation.wrap = function(observationData) { var observation = new Observation(observationData); return observation.groupMembers = observation.groupMembers ? observation.groupMembers.map(Observation.wrap) : [], observation } }(), angular.module("bahmni.common.gallery", []), angular.module("bahmni.common.gallery").directive("bmGalleryPane", ["$rootScope", "$document", "observationsService", "encounterService", "spinner", "configurations", "ngDialog", function($rootScope, $document, observationsService, encounterService, spinner, configurations, ngDialog) { function close() { $("body #gallery-pane").remove(), $body.removeClass("gallery-open"), keyboardJS.releaseKey("right"), keyboardJS.releaseKey("left") } var $body = $document.find("body"); $rootScope.$on("$stateChangeStart", function() { close() }); var link = function($scope, element) { $scope.galleryElement = element, $body.prepend($scope.galleryElement).addClass("gallery-open"), keyboardJS.on("right", function() { $scope.$apply(function() { $scope.getTotalLength() > 1 && $scope.showNext() }) }), keyboardJS.on("left", function() { $scope.$apply(function() { $scope.getTotalLength() > 1 && $scope.showPrev() }) }) }, controller = function($scope) { $scope.imageIndex = $scope.imagePosition.index ? $scope.imagePosition.index : 0, $scope.albumTag = $scope.imagePosition.tag ? $scope.imagePosition.tag : "defaultTag", $scope.showImpression = !1, $scope.isActive = function(index, tag) { return $scope.imageIndex == index && $scope.albumTag == tag }; var getAlbumIndex = function() { return _.findIndex($scope.albums, function(album) { return album.tag == $scope.albumTag }) }; $scope.showPrev = function() { var albumIndex = getAlbumIndex(); if ($scope.imageIndex > 0) --$scope.imageIndex; else { 0 == albumIndex && (albumIndex = $scope.albums.length); var previousAlbum = $scope.albums[albumIndex - 1]; 0 == previousAlbum.images.length && $scope.showPrev(albumIndex - 1), $scope.albumTag = previousAlbum.tag, $scope.imageIndex = previousAlbum.images.length - 1 } }, $scope.showNext = function() { var albumIndex = getAlbumIndex(); if ($scope.imageIndex < $scope.albums[albumIndex].images.length - 1) ++$scope.imageIndex; else { albumIndex == $scope.albums.length - 1 && (albumIndex = -1); var nextAlbum = $scope.albums[albumIndex + 1]; 0 == nextAlbum.images.length && $scope.showNext(albumIndex + 1), $scope.albumTag = nextAlbum.tag, $scope.imageIndex = 0 } }, $scope.isPdf = function(image) { return image.src && image.src.indexOf(".pdf") > 0 }, $scope.getTotalLength = function() { var totalLength = 0; return angular.forEach($scope.albums, function(album) { totalLength += album.images.length }), totalLength }, $scope.getCurrentIndex = function() { for (var currentIndex = 1, i = 0; i < getAlbumIndex(); i++) currentIndex += $scope.albums[i].images.length; return currentIndex + parseInt($scope.imageIndex) }, $scope.close = function() { close($scope) }, $scope.toggleImpression = function() { $scope.showImpression = !$scope.showImpression }, $scope.hasObsRelationship = function(image) { return image.commentOnUpload || image.sourceObs && image.sourceObs.length > 0 }, $scope.saveImpression = function(image) { var bahmniEncounterTransaction = mapBahmniEncounterTransaction(image); spinner.forPromise(encounterService.create(bahmniEncounterTransaction).then(function() { constructNewSourceObs(image), fetchObsRelationship(image) })) }; var init = function() { $scope.accessImpression && $scope.albums.forEach(function(album) { album.images.forEach(function(image) { fetchObsRelationship(image), constructNewSourceObs(image) }) }), ngDialog.openConfirm({ template: "../common/gallery/views/gallery.html", scope: $scope, closeByEscape: !0, className: "gallery-dialog ngdialog-theme-default" }) }, fetchObsRelationship = function(image) { observationsService.getObsRelationship(image.uuid).then(function(response) { image.sourceObs = response.data }) }, constructNewSourceObs = function(image) { image.newSourceObs = $scope.newSourceObs && $scope.newSourceObs.targetObsRelation.targetObs.uuid === image.uuid ? $scope.targetObs : { value: "", concept: { uuid: configurations.impressionConcept().uuid }, targetObsRelation: { relationshipType: Bahmni.Common.Constants.qualifiedByRelationshipType, targetObs: { uuid: image.uuid } } } }, mapBahmniEncounterTransaction = function(image) { return { patientUuid: $scope.patient.uuid, encounterTypeUuid: configurations.encounterConfig().getConsultationEncounterTypeUuid(), observations: [image.newSourceObs] } }; init() }; return { link: link, controller: controller } }]), angular.module("bahmni.common.uiHelper", ["ngClipboard"]), angular.module("bahmni.common.uiHelper").factory("spinner", ["messagingService", "$timeout", function(messagingService, $timeout) { var tokens = [], topLevelDiv = function(element) { return $(element).find("div").eq(0) }, showSpinnerForElement = function(element) { return 0 === $(element).find(".dashboard-section-loader").length && topLevelDiv(element).addClass("spinnable").append('
'), { element: $(element).find(".dashboard-section-loader") } }, showSpinnerForOverlay = function() { var token = Math.random(); tokens.push(token), 0 === $("#overlay").length && $("body").prepend('
'); var spinnerElement = $("#overlay"); return spinnerElement.stop().show(), { element: spinnerElement, token: token } }, show = function(element) { return void 0 !== element ? showSpinnerForElement(element) : showSpinnerForOverlay() }, hide = function(spinner, parentElement) { var spinnerElement = spinner.element; spinner.token ? (_.pull(tokens, spinner.token), 0 === tokens.length && spinnerElement.fadeOut(300)) : (topLevelDiv(parentElement).removeClass("spinnable"), spinnerElement && spinnerElement.remove()) }, forPromise = function(promise, element) { return $timeout(function() { var spinner = show(element); return promise["finally"](function() { hide(spinner, element) }), promise }) }, forAjaxPromise = function(promise, element) { var spinner = show(element); return promise.always(function() { hide(spinner, element) }), promise }; return { forPromise: forPromise, forAjaxPromise: forAjaxPromise, show: show, hide: hide } }]), angular.module("bahmni.common.uiHelper").factory("printer", ["$rootScope", "$compile", "$http", "$timeout", "$q", "spinner", function($rootScope, $compile, $http, $timeout, $q, spinner) { var printHtml = function(html) { var deferred = $q.defer(), hiddenFrame = $('').appendTo("body")[0]; hiddenFrame.contentWindow.printAndRemove = function() { hiddenFrame.contentWindow.print(), $(hiddenFrame).remove(), deferred.resolve() }; var htmlContent = '' + html + "", doc = hiddenFrame.contentWindow.document.open("text/html", "replace"); return doc.write(htmlContent), doc.close(), deferred.promise }, print = function(templateUrl, data) { $rootScope.isBeingPrinted = !0, $http.get(templateUrl).then(function(templateData) { var template = templateData.data, printScope = $rootScope.$new(); angular.extend(printScope, data); var element = $compile($("
" + template + "
"))(printScope), renderAndPrintPromise = $q.defer(), waitForRenderAndPrint = function() { return printScope.$$phase || $http.pendingRequests.length ? $timeout(waitForRenderAndPrint, 1e3) : (printHtml(element.html()).then(function() { $rootScope.isBeingPrinted = !1, renderAndPrintPromise.resolve() }), printScope.$destroy()), renderAndPrintPromise.promise }; spinner.forPromise(waitForRenderAndPrint()) }) }, printFromScope = function(templateUrl, scope, afterPrint) { $rootScope.isBeingPrinted = !0, $http.get(templateUrl).then(function(response) { var template = response.data, printScope = scope, element = $compile($("
" + template + "
"))(printScope), renderAndPrintPromise = $q.defer(), waitForRenderAndPrint = function() { return printScope.$$phase || $http.pendingRequests.length ? $timeout(waitForRenderAndPrint) : printHtml(element.html()).then(function() { $rootScope.isBeingPrinted = !1, afterPrint && afterPrint(), renderAndPrintPromise.resolve() }), renderAndPrintPromise.promise }; spinner.forPromise(waitForRenderAndPrint()) }) }; return { print: print, printFromScope: printFromScope } }]), angular.module("bahmni.common.uiHelper").directive("nonBlank", function() { return function($scope, element, attrs) { var addNonBlankAttrs = function() { element.attr({ required: "required" }) }, removeNonBlankAttrs = function() { element.removeAttr("required") }; return attrs.nonBlank ? void $scope.$watch(attrs.nonBlank, function(value) { return value ? addNonBlankAttrs() : removeNonBlankAttrs() }) : addNonBlankAttrs(element) } }).directive("datepicker", function() { var link = function($scope, element, attrs, ngModel) { var maxDate = attrs.maxDate, minDate = attrs.minDate || "-120y", format = attrs.dateFormat || "dd-mm-yy"; element.datepicker({ changeYear: !0, changeMonth: !0, maxDate: maxDate, minDate: minDate, yearRange: "c-120:c+120", dateFormat: format, onSelect: function(dateText) { $scope.$apply(function() { ngModel.$setViewValue(dateText) }) } }) }; return { require: "ngModel", link: link } }).directive("myAutocomplete", ["$parse", function($parse) { var link = function(scope, element, attrs, ngModelCtrl) { var source = ($parse(attrs.ngModel), scope.source()), responseMap = scope.responseMap(), onSelect = scope.onSelect(); element.autocomplete({ autofocus: !0, minLength: 2, source: function(request, response) { source(attrs.id, request.term, attrs.itemType).then(function(data) { var results = responseMap ? responseMap(data.data) : data.data; response(results) }) }, select: function(event, ui) { return scope.$apply(function(scope) { ngModelCtrl.$setViewValue(ui.item.value), scope.$eval(attrs.ngChange), null != onSelect && onSelect(ui.item) }), !0 }, search: function(event) { var searchTerm = $.trim(element.val()); searchTerm.length < 2 && event.preventDefault() } }) }; return { link: link, require: "ngModel", scope: { source: "&", responseMap: "&", onSelect: "&" } } }]).directive("bmForm", ["$timeout", function($timeout) { var link = function(scope, elem, attrs) { $timeout(function() { $(elem).unbind("submit").submit(function(e) { var formScope = scope.$parent, formName = attrs.name; e.preventDefault(), scope.autofillable && $(elem).find("input").trigger("change"), formScope[formName].$valid ? (formScope.$apply(attrs.ngSubmit), $(elem).removeClass("submitted-with-error")) : $(elem).addClass("submitted-with-error") }) }, 0) }; return { link: link, require: "form", scope: { autofillable: "=" } } }]).directive("patternValidate", ["$timeout", function($timeout) { return function($scope, element, attrs) { var addPatternToElement = function() { $scope.fieldValidation && $scope.fieldValidation[attrs.id] && element.attr({ pattern: $scope.fieldValidation[attrs.id].pattern, title: $scope.fieldValidation[attrs.id].errorMessage, type: "text" }) }; $timeout(addPatternToElement) } }]).directive("validateOn", function() { var link = function(scope, element, attrs, ngModelCtrl) { var validationMessage = attrs.validationMessage || "Please enter a valid detail", setValidity = function(value) { var valid = !!value; ngModelCtrl.$setValidity("blank", valid), element[0].setCustomValidity(valid ? "" : validationMessage) }; scope.$watch(attrs.validateOn, setValidity, !0) }; return { link: link, require: "ngModel" } }), angular.module("bahmni.common.uiHelper").directive("bahmniAutocomplete", ["$translate", function($translate) { var link = function(scope, element, attrs, ngModelCtrl) { var source = scope.source(), responseMap = scope.responseMap && scope.responseMap(), onSelect = scope.onSelect(), onEdit = scope.onEdit && scope.onEdit(), minLength = scope.minLength || 2, formElement = element[0], validationMessage = scope.validationMessage || $translate.instant("SELECT_VALUE_FROM_AUTOCOMPLETE_DEFAULT_MESSAGE"), validateIfNeeded = function(value) { scope.strictSelect && (scope.isInvalid = value !== scope.selectedValue, _.isEmpty(value) && (scope.isInvalid = !1)) }; scope.$watch("initialValue", function() { scope.initialValue && (scope.selectedValue = scope.initialValue, scope.isInvalid = !1) }), element.autocomplete({ autofocus: !0, minLength: minLength, source: function(request, response) { source({ elementId: attrs.id, term: request.term, elementType: attrs.type }).then(function(data) { var results = responseMap ? responseMap(data) : data; response(results) }) }, select: function(event, ui) { return scope.selectedValue = ui.item.value, ngModelCtrl.$setViewValue(ui.item.value), null != onSelect && onSelect(ui.item), validateIfNeeded(ui.item.value), scope.blurOnSelect && element.blur(), scope.$apply(), scope.$eval(attrs.ngDisabled), scope.$apply(), !0 }, search: function(event, ui) { null != onEdit && onEdit(ui.item); var searchTerm = $.trim(element.val()); validateIfNeeded(searchTerm), searchTerm.length < minLength && event.preventDefault() } }); var changeHanlder = function(e) { validateIfNeeded(element.val()) }, keyUpHandler = function(e) { validateIfNeeded(element.val()), scope.$apply() }; element.on("change", changeHanlder), element.on("keyup", keyUpHandler), scope.$watch("isInvalid", function() { ngModelCtrl.$setValidity("selection", !scope.isInvalid), formElement.setCustomValidity(scope.isInvalid ? validationMessage : "") }), scope.$on("$destroy", function() { element.off("change", changeHanlder), element.off("keyup", keyUpHandler) }) }; return { link: link, require: "ngModel", scope: { source: "&", responseMap: "&?", onSelect: "&", onEdit: "&?", minLength: "=?", blurOnSelect: "=?", strictSelect: "=?", validationMessage: "@", isInvalid: "=?", initialValue: "=?" } } }]), angular.module("bahmni.common.uiHelper").directive("bmPopOver", function() { var controller = function($scope) { $scope.targetElements = []; var hideTargetElements = function() { $scope.targetElements.forEach(function(el) { el.hide() }) }, showTargetElements = function() { $scope.targetElements.forEach(function(el) { el.show() }) }; this.registerTriggerElement = function(triggerElement) { $scope.triggerElement = triggerElement; var docClickHandler = function() { $scope.autoclose && (hideTargetElements(), $scope.isTargetOpen = !1, $(document).off("click", docClickHandler)) }; $scope.triggerElement.on("click", function(event) { $scope.isTargetOpen ? ($scope.isTargetOpen = !1, hideTargetElements(0), $(document).off("click", docClickHandler)) : ($scope.isTargetOpen = !0, showTargetElements(), $(document).on("click", docClickHandler), event.stopImmediatePropagation()) }), $scope.$on("$destroy", function() { $(document).off("click", docClickHandler) }) }, this.registerTargetElement = function(targetElement) { targetElement.hide(), $scope.targetElements.push(targetElement) }; var hideOrShowTargetElements = function() { $scope.isTargetOpen && ($scope.isTargetOpen = !1, hideTargetElements(0)) }; $(document).on("click", ".reg-wrapper", hideOrShowTargetElements), $scope.$on("$destroy", function() { $(document).off("click", ".reg-wrapper", hideOrShowTargetElements) }) }; return { restrict: "A", controller: controller, scope: { autoclose: "=" } } }).directive("bmPopOverTarget", function() { var link = function($scope, element, attrs, popOverController) { popOverController.registerTargetElement(element) }; return { restrict: "A", require: "^bmPopOver", link: link } }).directive("bmPopOverTrigger", function() { var link = function($scope, element, attrs, popOverController) { popOverController.registerTriggerElement(element) }; return { restrict: "A", require: "^bmPopOver", link: link } }), function() { var constructSearchResult = function(concept, searchString) { var matchingName = null, conceptName = concept.name; if (!_.includes(_.toLower(conceptName), _.toLower(searchString))) { var synonyms = _.map(concept.names, "name"); matchingName = _.find(synonyms, function(name) { return name !== conceptName && name.search(new RegExp(searchString, "i")) !== -1 }) } return { label: matchingName ? matchingName + " => " + conceptName : conceptName, value: conceptName, concept: concept, uuid: concept.uuid, name: conceptName } }, searchWithDefaultConcept = function(searchMethod, request, response) { var searchTerm = _.toLower(request.term.trim()), isMatching = function(answer) { var conceptNameFound = _.find(answer.names, function(name) { return _.includes(_.toLower(name.name), searchTerm) }), conceptDrugNameFound = _.includes(_.toLower(answer.name), searchTerm); return conceptNameFound || conceptDrugNameFound }, responseMap = _.partial(constructSearchResult, _, searchTerm); searchMethod().then(_.partial(_.filter, _, isMatching)).then(_.partial(_.map, _, responseMap)).then(response) }, searchWithGivenConcept = function(searchMethod, request, response) { var searchTerm = request.term.trim(), responseMap = _.partial(constructSearchResult, _, searchTerm); searchMethod().then(_.partial(_.map, _, responseMap)).then(response) }, toBeInjected = ["$parse", "$http", "conceptService"], conceptAutocomplete = function($parse, $http, conceptService) { var link = function(scope, element, attrs, ngModelCtrl) { var minLength = scope.minLength || 2, previousValue = scope.previousValue, validator = function(searchTerm) { if (scope.strictSelect) return scope.illegalValue || !_.isEmpty(searchTerm) && searchTerm !== previousValue ? void element.addClass("illegalValue") : void element.removeClass("illegalValue") }; element.autocomplete({ autofocus: !0, minLength: minLength, source: function(request, response) { var searchMethod; !scope.answersConceptName && scope.defaultConcept ? (searchMethod = _.partial(conceptService.getAnswers, scope.defaultConcept), searchWithDefaultConcept(searchMethod, request, response)) : (searchMethod = _.partial(conceptService.getAnswersForConceptName, { term: request.term, answersConceptName: scope.answersConceptName }), searchWithGivenConcept(searchMethod, request, response)) }, select: function(event, ui) { return scope.$apply(function(scope) { ngModelCtrl.$setViewValue(ui.item), scope.blurOnSelect && element.blur(), previousValue = ui.item.value, validator(previousValue), scope.$eval(attrs.ngChange) }), !0 }, search: function(event) { var searchTerm = $.trim(element.val()); searchTerm.length < minLength && event.preventDefault(), previousValue = null } }); var blurHandler = function() { var searchTerm = $.trim(element.val()); validator(searchTerm) }; element.on("blur", blurHandler), scope.$on("$destroy", function() { element.off("blur", blurHandler) }) }; return { link: link, require: "ngModel", scope: { illegalValue: "=", defaultConcept: "=", answersConceptName: "=", minLength: "=", blurOnSelect: "=", strictSelect: "=?", previousValue: "=" } } }; conceptAutocomplete.$inject = toBeInjected, angular.module("bahmni.common.uiHelper").directive("conceptAutocomplete", conceptAutocomplete) }(), angular.module("bahmni.common.uiHelper").directive("datetimepicker", function() { var link = function($scope) { $scope.allowFutureDates || ($scope.maxDate = Bahmni.Common.Util.DateTimeFormatter.getDateWithoutTime()); var getSelectedDateStr = function() { return null != $scope.selectedDate ? moment($scope.selectedDate).format("YYYY-MM-DD") : "" }, getSelectedTimeStr = function() { return null != $scope.selectedTime ? moment($scope.selectedTime).format("HH:mm") : "" }, valueNotFilled = function() { return null == $scope.selectedDate && null == $scope.selectedTime }, valueCompletelyFilled = function() { return null != $scope.selectedDate && null != $scope.selectedTime }; if ($scope.updateModel = function() { valueCompletelyFilled() ? $scope.model = getSelectedDateStr() + " " + getSelectedTimeStr() : $scope.isValid() ? $scope.model = "" : $scope.model = "Invalid Datetime" }, $scope.isValid = function() { return valueNotFilled() || valueCompletelyFilled() }, $scope.model) { var date = moment($scope.model).toDate(); $scope.selectedDate = date, $scope.selectedTime = date, $scope.updateModel() } }; return { restrict: "E", link: link, scope: { model: "=", observation: "=", showTime: "=", illegalValue: "=", allowFutureDates: "=" }, template: "
" } }), angular.module("bahmni.common.uiHelper").directive("monthyearpicker", ["$translate", function($translate) { var link = function($scope) { var monthNames = $translate.instant("MONTHS"); $scope.monthNames = monthNames.split(","); var getYearList = function() { for (var minYear = $scope.minYear ? $scope.minYear : moment().toDate().getFullYear() - 15, maxYear = $scope.maxYear ? $scope.maxYear : moment().toDate().getFullYear() + 5, yearList = [], i = maxYear; i >= minYear; i--) yearList.push(i); return yearList }; $scope.years = getYearList(); var valueCompletelyFilled = function() { return null != $scope.selectedMonth && null != $scope.selectedYear }, valueNotFilled = function() { return null == $scope.selectedMonth && null == $scope.selectedYear }, getCompleteDate = function() { var month = $scope.selectedMonth + 1; return $scope.selectedYear + "-" + month + "-01" }; if ($scope.updateModel = function() { valueCompletelyFilled() ? $scope.model = getCompleteDate() : $scope.isValid() ? $scope.model = "" : $scope.model = "Invalid Date" }, $scope.isValid = function() { return valueNotFilled() || valueCompletelyFilled() }, $scope.illegalMonth = function() { return (void 0 === $scope.selectedMonth || null === $scope.selectedMonth) && null !== $scope.selectedYear && void 0 !== $scope.selectedYear }, $scope.illegalYear = function() { return null !== $scope.selectedMonth && void 0 !== $scope.selectedMonth && (void 0 === $scope.selectedYear || null === $scope.selectedYear) }, $scope.model) { var date = moment($scope.model).toDate(); $scope.selectedMonth = date.getMonth(), $scope.selectedYear = date.getFullYear() } }; return { restrict: "E", link: link, scope: { observation: "=", minYear: "=", maxYear: "=", illegalValue: "=", model: "=" }, template: '' } }]), angular.module("bahmni.common.uiHelper").directive("toggle", function() { var link = function($scope, element) { $scope.toggle = void 0 !== $scope.toggle && $scope.toggle, $(element).click(function() { $scope.$apply(function() { $scope.toggle = !$scope.toggle }) }), $scope.$watch("toggle", function() { $(element).toggleClass("active", $scope.toggle) }), $scope.$on("$destroy", function() { element.off("click") }) }; return { scope: { toggle: "=" }, link: link } }), angular.module("bahmni.common.uiHelper").directive("bmGallery", ["$location", "$rootScope", "$compile", function($location, $rootScope, $compile) { var controller = function($scope) { $scope.albums = [], $scope.imagePosition = { tag: void 0, index: 0 }, this.image = function(record) { var provider = record.provider; return { src: Bahmni.Common.Constants.documentsPath + "/" + record.imageObservation.value, title: record.concept.name, commentOnUpload: record.comment || record.imageObservation.comment, date: record.imageObservation.observationDateTime, uuid: record.imageObservation.uuid, providerName: provider ? provider.name : null } }, this.addImageObservation = function(record, tag) { return this.addImage(this.image(record), tag) }, this.addImage = function(image, tag, tagOrder) { var matchedAlbum = getMatchingAlbum(tag); if (matchedAlbum) { var index = image.imageIndex ? image.imageIndex : matchedAlbum.images.length; matchedAlbum.images.splice(index, 0, image) } else { var newAlbum = {}; newAlbum.tag = tag, newAlbum.images = [image], $scope.albums.splice(tagOrder, 0, newAlbum) } return $scope.albums[0].images.length - 1 }; var getMatchingAlbum = function(tag) { return _.find($scope.albums, function(album) { return album.tag == tag }) }; this.removeImage = function(image, tag, index) { var matchedAlbum = getMatchingAlbum(tag); matchedAlbum && matchedAlbum.images && matchedAlbum.images.splice(index, 1) }, this.setIndex = function(tag, index) { $scope.imagePosition.tag = tag, $scope.imagePosition.index = index }, this.open = function() { $compile("")($scope) } }; return { controller: controller, scope: { patient: "=", accessImpression: "=?" } } }]).directive("bmGalleryItem", function() { var link = function($scope, element, attrs, imageGalleryController) { var image = { src: $scope.image.encodedValue, title: $scope.image.concept ? $scope.image.concept.name : "", date: $scope.image.obsDatetime, uuid: $scope.image.obsUuid, providerName: $scope.image.provider ? $scope.image.provider.name : "", imageIndex: $scope.image.imageIndex, commentOnUpload: $scope.image.comment }; imageGalleryController.addImage(image, $scope.visitUuid, $scope.visitOrder), element.click(function(e) { e.stopPropagation(), imageGalleryController.setIndex($scope.visitUuid, $scope.index), imageGalleryController.open() }), element.on("$destroy", function() { imageGalleryController.removeImage(image, $scope.visitUuid, $scope.index) }) }; return { link: link, scope: { image: "=", index: "@", visitUuid: "=", visitOrder: "@" }, require: "^bmGallery" } }).directive("bmImageObservationGalleryItem", function() { var link = function(scope, element, attrs, imageGalleryController) { scope.imageIndex = imageGalleryController.addImageObservation(scope.observation, "defaultTag"), element.click(function(e) { e.stopPropagation(), imageGalleryController.setIndex("defaultTag", scope.imageIndex), imageGalleryController.open() }) }; return { link: link, scope: { observation: "=" }, require: "^bmGallery" } }).directive("bmObservationGalleryItem", function() { var link = function(scope, element, attrs, imageGalleryController) { scope.imageObservation = new Bahmni.Common.Obs.ImageObservation(scope.observation, scope.observation.concept, scope.observation.provider), scope.imageIndex = imageGalleryController.addImageObservation(scope.imageObservation, "defaultTag"), element.click(function(e) { e.stopPropagation(), imageGalleryController.setIndex("defaultTag", scope.imageIndex), imageGalleryController.open() }) }; return { link: link, scope: { observation: "=" }, require: "^bmGallery" } }).directive("bmImageObservationGalleryItems", function() { var link = function(scope, elem, attrs, imageGalleryController) { angular.forEach(scope.list, function(record) { imageGalleryController.addImageObservation(record, "defaultTag") }), $(elem).click(function() { imageGalleryController.open() }) }; return { link: link, scope: { list: "=" }, require: "^bmGallery" } }).directive("bmLazyImageObservationGalleryItems", function() { var link = function(scope, elem, attrs, imageGalleryController) { scope.promise.then(function(response) { angular.forEach(response, function(record) { var index = imageGalleryController.addImageObservation(record, "defaultTag"); scope.currentObservation && scope.currentObservation.imageObservation.uuid == record.imageObservation.uuid && imageGalleryController.setIndex("defaultTag", index) }), $(elem).click(function() { imageGalleryController.open() }) }) }; return { link: link, scope: { promise: "=", currentObservation: "=?index" }, require: "^bmGallery" } }), angular.module("bahmni.common.uiHelper").directive("ngConfirmClick", function() { var link = function(scope, element, attr) { var msg = attr.confirmMessage || "Are you sure?", clickAction = attr.ngConfirmClick; element.bind("click", function() { window.confirm(msg) && scope.$apply(clickAction) }) }; return { restrict: "A", link: link } }), angular.module("bahmni.common.uiHelper").directive("bmShow", ["$rootScope", function($rootScope) { var link = function($scope, element) { $scope.$watch("bmShow", function() { $rootScope.isBeingPrinted || $scope.bmShow ? element.removeClass("ng-hide") : element.addClass("ng-hide") }) }; return { scope: { bmShow: "=" }, link: link } }]), angular.module("bahmni.common.uiHelper").directive("confirmOnExit", ["$translate", function($translate) { return { link: function($scope) { var cleanUpListenerPageUnload = $scope.$on("event:pageUnload", function() { window.onbeforeunload = function() { return $translate.instant("BROWSER_CLOSE_DIALOG_MESSAGE_KEY") } }); $scope.$on("$destroy", cleanUpListenerPageUnload) } } }]), angular.module("bahmni.common.uiHelper").filter("days", function() { return function(startDate, endDate) { return Bahmni.Common.Util.DateUtil.diffInDays(startDate, endDate) } }).filter("bahmniDateTime", function() { return function(date) { return Bahmni.Common.Util.DateUtil.formatDateWithTime(date) } }).filter("bahmniDate", function() { return function(date) { return Bahmni.Common.Util.DateUtil.formatDateWithoutTime(date) } }).filter("bahmniTime", function() { return function(date) { return Bahmni.Common.Util.DateUtil.formatTime(date) } }).filter("bahmniDateInStrictMode", function() { return function(date) { return Bahmni.Common.Util.DateUtil.formatDateInStrictMode(date) } }), angular.module("bahmni.common.uiHelper").filter("reverse", function() { return function(items) { return items && items.slice().reverse() } }), angular.module("bahmni.common.uiHelper").filter("thumbnail", function() { return function(url, extension) { if (url) return extension ? Bahmni.Common.Constants.documentsPath + "/" + url.replace(/(.*)\.(.*)$/, "$1_thumbnail." + extension) || null : Bahmni.Common.Constants.documentsPath + "/" + url.replace(/(.*)\.(.*)$/, "$1_thumbnail.$2") || null } }), angular.module("bahmni.common.uiHelper").filter("formatDecimalValues", function() { return function(value) { return value ? value.toString().replace(/.0(\s+)/g, "$1") : null } }), angular.module("bahmni.common.uiHelper").service("backlinkService", ["$window", function($window) { var self = this, urls = []; self.reset = function() { urls = [] }, self.setUrls = function(backLinks) { self.reset(), angular.forEach(backLinks, function(backLink) { self.addUrl(backLink) }) }, self.addUrl = function(backLink) { urls.push(backLink) }, self.addBackUrl = function(label) { var backLabel = label || "Back"; urls.push({ label: backLabel, action: $window.history.back }) }, self.getUrlByLabel = function(label) { return urls.filter(function(url) { return url.label === label }) }, self.getAllUrls = function() { return urls } }]), angular.module("bahmni.common.uiHelper").service("contextChangeHandler", ["$rootScope", function($rootScope) { var callbacks = [], self = this; $rootScope.$on("$stateChangeSuccess", function() { self.reset() }), this.reset = function() { callbacks = [] }, this.add = function(callback) { callbacks.push(callback) }, this.execute = function() { var allow = !0, callBackReturn = null, errorMessage = null; return callbacks.forEach(function(callback) { callBackReturn = callback(), allow = allow && callBackReturn.allow, _.isEmpty(errorMessage) && (errorMessage = callBackReturn.errorMessage) }), callBackReturn && errorMessage ? { allow: allow, errorMessage: errorMessage } : { allow: allow } } }]), angular.module("bahmni.common.uiHelper").service("stateChangeSpinner", ["$rootScope", "spinner", function($rootScope, spinner) { var showSpinner = function(event, toState) { toState.spinnerToken = spinner.show() }, hideSpinner = function(event, toState) { spinner.hide(toState.spinnerToken) }; this.activate = function() { $rootScope.$on("$stateChangeStart", showSpinner), $rootScope.$on("$stateChangeSuccess", hideSpinner), $rootScope.$on("$stateChangeError", hideSpinner) } }]), angular.module("bahmni.common.uiHelper").directive("bmBackLinks", function() { return { template: '', controller: function($scope, backlinkService) { $scope.backLinks = backlinkService.getAllUrls(), $scope.$on("$stateChangeSuccess", function(event, state) { state.data && state.data.backLinks && (backlinkService.setUrls(state.data.backLinks), $scope.backLinks = backlinkService.getAllUrls()) }), $scope.$on("$destroy", function() { window.onbeforeunload = void 0 }) }, restrict: "E" } }), angular.module("bahmni.common.uiHelper").directive("providerDirective", function() { var template = '{{::creatorName}} {{"ON_BEHALF_OF_TRANSLATION_KEY"|translate}} {{::providerName}} {{::providerDate | bahmniTime}} '; return { restrict: "EA", replace: !0, scope: { creatorName: "@", providerName: "@", providerDate: "=?" }, template: template } }), angular.module("bahmni.common.uiHelper").directive("focusOn", ["$timeout", function($timeout) { return function(scope, elem, attrs) { Modernizr.ios || scope.$watch(attrs.focusOn, function(value) { value && $timeout(function() { $(elem).focus() }) }) } }]), angular.module("bahmni.common.uiHelper").directive("scrollToObsElement", function() { return function(scope, elem, attrs) { if (attrs.scrollToObsElement && scope.observation.scrollToElement) { $(elem).focus(); var scrollPosition = $(elem).offset().top - window.innerHeight / 2; if ($("#scrollOnEdit")[0]) { var container = $("#scrollOnEdit"), scrollTo = elem; scrollPosition = scrollTo.offset().top + container.scrollTop() - (container.offset().top + container.offset().top / 2), container.animate({ scrollTop: scrollPosition }, 900) } else $(window).animate({ scrollTop: scrollPosition }, 900); scope.observation.scrollToElement = !1 } } }), angular.module("bahmni.common.uiHelper").directive("dateConverter", [function() { return { require: "ngModel", link: function(scope, element, attrs, ngModelController) { var DateUtil = Bahmni.Common.Util.DateUtil; ngModelController.$parsers.push(function(date) { return DateUtil.parse(date) }), ngModelController.$formatters.push(function(date) { return DateUtil.parse(DateUtil.getDateWithoutTime(date)) }) } } }]), angular.module("bahmni.common.uiHelper").directive("compileHtml", ["$compile", function($compile) { return function(scope, element, attrs) { scope.$watch(function(scope) { return scope.$eval(attrs.compileHtml) }, function(value) { element.html(value), $compile(element.contents())(scope) }) } }]), angular.module("bahmni.common.uiHelper").controller("MessageController", ["$scope", "messagingService", function($scope, messagingService) { $scope.messages = messagingService.messages, $scope.getMessageText = function(level) { var string = ""; return $scope.messages[level].forEach(function(message) { string = string.concat(message.value) }), string }, $scope.hideMessage = function(level) { messagingService.hideMessages(level) }, $scope.isErrorMessagePresent = function() { return $scope.messages.error.length > 0 }, $scope.isInfoMessagePresent = function() { return $scope.messages.info.length > 0 } }]), angular.module("bahmni.common.uiHelper").service("messagingService", ["$rootScope", "$timeout", function($rootScope, $timeout) { this.messages = { error: [], info: [] }; var self = this; $rootScope.$on("event:serverError", function(event, errorMessage) { self.showMessage("error", errorMessage, "serverError") }), this.showMessage = function(level, message, errorEvent) { var messageObject = { value: "", isServerError: !1 }; messageObject.value = message, errorEvent ? messageObject.isServerError = !0 : "info" == level && this.createTimeout("info", 4e3); var index = _.findIndex(this.messages[level], function(msg) { return msg.value == messageObject.value }); index >= 0 && this.messages[level].splice(index, 1), this.messages[level].push(messageObject) }, this.createTimeout = function(level, time) { $timeout(function() { self.messages[level] = [] }, time, !0) }, this.hideMessages = function(level) { self.messages[level].length = 0 }, this.clearAll = function() { self.messages.error = [], self.messages.info = [] } }]), angular.module("bahmni.common.uiHelper").service("confirmBox", ["$rootScope", "ngDialog", function($rootScope, ngDialog) { var dialog, confirmBox = function(config) { var confirmBoxScope = $rootScope.$new(); confirmBoxScope.close = function() { ngDialog.close(dialog.id), confirmBoxScope.$destroy() }, confirmBoxScope.scope = config.scope, confirmBoxScope.actions = config.actions, dialog = ngDialog.open({ template: "../common/ui-helper/views/confirmBox.html", scope: confirmBoxScope, className: config.className || "ngdialog-theme-default" }) }; return confirmBox }]), angular.module("bahmni.common.uiHelper").directive("focusOnInputErrors", ["$timeout", function($timeout) { return function(scope) { var cleanUpListenerErrorsOnForm = scope.$on("event:errorsOnForm", function() { $timeout(function() { $(".illegalValue:first button").focus(), $(".illegalValue:first").focus() }, 10, !1) }); scope.$on("$destroy", cleanUpListenerErrorsOnForm) } }]), angular.module("bahmni.common.uiHelper").directive("fixedFirstColumn", ["$interval", function($interval) { return { restrict: "A", template: "
", transclude: !0, link: function($scope, $element) { var checkIfTableLoaded = $interval(function() { if ($element.find("table").length > 0) { var tr = $element.find("tr"); angular.forEach(tr, function(i) { var columns = angular.element(i).children(); if (!(columns.length < 1)) { var column0 = columns[0], column1 = columns[1], height0 = column0.offsetHeight, height1 = column1 ? column1.offsetHeight : 0, height = Math.max(height0, height1); columns[0].style.height = height + "px", i.style.height = height + "px", column1 && (column1.style.height = height + "px"), 0 !== height0 && height0 === height1 && clearInterval(checkIfTableLoaded) } }), clearInterval(checkIfTableLoaded) } }, 100, 1) } } }]), angular.module("bahmni.common.uiHelper").directive("assignHeight", function() { return { restrict: "A", link: function(scope, element, attrs) { var height; scope.$watch(function() { height = element[0].offsetHeight, attrs.key && (scope[attrs.key] = { height: height }) }) } } }), angular.module("bahmni.common.attributeTypes", []).directive("attributeTypes", [function() { return { scope: { targetModel: "=", attribute: "=", fieldValidation: "=", isAutoComplete: "&", getAutoCompleteList: "&", getDataResults: "&", handleUpdate: "&", isReadOnly: "&", isForm: "=?" }, templateUrl: "../common/attributeTypes/views/attributeInformation.html", restrict: "E", controller: function($scope) { $scope.getAutoCompleteList = $scope.getAutoCompleteList(), $scope.getDataResults = $scope.getDataResults(), $scope.isAutoComplete = $scope.isAutoComplete() || function() { return !1 }, $scope.isReadOnly = $scope.isReadOnly() || function() { return !1 }, $scope.handleUpdate = $scope.handleUpdate() || function() { return !1 }, $scope.appendConceptNameToModel = function(attribute) { var attributeValueConceptType = $scope.targetModel[attribute.name], concept = _.find(attribute.answers, function(answer) { return answer.conceptId === attributeValueConceptType.conceptUuid }); attributeValueConceptType.value = concept && concept.fullySpecifiedName } } } }]), Bahmni.Common.Domain.AttributeTypeMapper = function() { function AttributeTypeMapper() {} return AttributeTypeMapper.prototype.mapFromOpenmrsAttributeTypes = function(mrsAttributeTypes, mandatoryAttributes, attributesConfig) { var attributeTypes = []; return angular.forEach(mrsAttributeTypes, function(mrsAttributeType) { var isRequired = function() { var element = _.find(mandatoryAttributes, function(mandatoryAttribute) { return mandatoryAttribute == mrsAttributeType.name }); return !!element }, attributeType = { uuid: mrsAttributeType.uuid, sortWeight: mrsAttributeType.sortWeight, name: mrsAttributeType.name, fullySpecifiedName: mrsAttributeType.name, description: mrsAttributeType.description || mrsAttributeType.name, format: mrsAttributeType.format || mrsAttributeType.datatypeClassname, answers: [], required: isRequired(), concept: mrsAttributeType.concept || {}, excludeFrom: attributesConfig && attributesConfig[mrsAttributeType.name] && attributesConfig[mrsAttributeType.name].excludeFrom || [] }; attributeType.concept.dataType = attributeType.concept.datatype && attributeType.concept.datatype.name, mrsAttributeType.concept && mrsAttributeType.concept.answers && angular.forEach(mrsAttributeType.concept.answers, function(mrsAnswer) { var displayName = mrsAnswer.display, fullySpecifiedName = mrsAnswer.display; mrsAnswer.names && 2 == mrsAnswer.names.length && "FULLY_SPECIFIED" == mrsAnswer.name.conceptNameType && (mrsAnswer.names[0].display == displayName ? (displayName = mrsAnswer.names[1].display, fullySpecifiedName = mrsAnswer.names[0].display) : (displayName = mrsAnswer.names[0].display, fullySpecifiedName = mrsAnswer.names[1].display)), attributeType.answers.push({ fullySpecifiedName: fullySpecifiedName, description: displayName, conceptId: mrsAnswer.uuid }) }), "org.openmrs.customdatatype.datatype.RegexValidatedTextDatatype" == attributeType.format && (attributeType.pattern = mrsAttributeType.datatypeConfig), attributeTypes.push(attributeType) }), { attributeTypes: attributeTypes } }, AttributeTypeMapper }(), Bahmni.Common.Domain.AttributeFormatter = function() { function AttributeFormatter() {} AttributeFormatter.prototype.getMrsAttributes = function(model, attributeTypes) { return attributeTypes.map(function(result) { var attribute = { attributeType: { uuid: result.uuid } }; return _.isEmpty(model) || setAttributeValue(result, attribute, model[result.name]), attribute }) }, AttributeFormatter.prototype.getMrsAttributesForUpdate = function(model, attributeTypes, attributes) { return _.filter(AttributeFormatter.prototype.getMrsAttributes(model, attributeTypes), function(mrsAttribute) { var attribute = _.find(attributes, function(attribute) { return mrsAttribute.attributeType.uuid === attribute.attributeType.uuid }); return attribute && !attribute.voided && (mrsAttribute.uuid = attribute.uuid), isAttributeChanged(mrsAttribute) }) }, AttributeFormatter.prototype.removeUnfilledAttributes = function(formattedAttributes) { return _.filter(formattedAttributes, isAttributeChanged) }; var isAttributeChanged = function(attribute) { return attribute.value || attribute.uuid }, setAttributeValue = function(attributeType, attr, value) { if ("" === value || null === value || void 0 === value || null === value.conceptUuid) attr.voided = !0; else if ("org.openmrs.Concept" === attributeType.format) { var attrDescription = _.find(attributeType.answers, function(answer) { if (answer.conceptId === value.conceptUuid) return !0 }); attr.value = void 0 != attrDescription ? attrDescription.description : null, attr.hydratedObject = value.conceptUuid } else if ("org.openmrs.util.AttributableDate" == attributeType.format || "org.openmrs.customdatatype.datatype.DateDatatype" == attributeType.format) { var mnt = moment(value); attr.value = mnt.format("YYYY-MM-DD") } else attr.value = value.toString() }; return AttributeFormatter }(); var Bahmni = Bahmni || {}; Bahmni.ConceptSet = Bahmni.ConceptSet || {}, Bahmni.ConceptSet.FormConditions = Bahmni.ConceptSet.FormConditions || {}, angular.module("bahmni.common.conceptSet", ["bahmni.common.uiHelper", "ui.select2", "pasvaz.bindonce", "ngSanitize", "ngTagsInput"]), angular.module("bahmni.common.conceptSet").controller("ConceptSetGroupController", ["$scope", "contextChangeHandler", "spinner", "messagingService", "conceptSetService", "$rootScope", "sessionService", "encounterService", "treatmentConfig", "retrospectiveEntryService", "userService", "conceptSetUiConfigService", "$timeout", "clinicalAppConfigService", "$stateParams", "$translate", function($scope, contextChangeHandler, spinner, messagingService, conceptSetService, $rootScope, sessionService, encounterService, treatmentConfig, retrospectiveEntryService, userService, conceptSetUiConfigService, $timeout, clinicalAppConfigService, $stateParams, $translate) { var conceptSetUIConfig = conceptSetUiConfigService.getConfig(), init = function() { $scope.validationHandler = new Bahmni.ConceptSet.ConceptSetGroupPanelViewValidationHandler($scope.allTemplates), contextChangeHandler.add($scope.validationHandler.validate) }; $scope.toggleSideBar = function() { $rootScope.showLeftpanelToggle = !$rootScope.showLeftpanelToggle }, $scope.showLeftpanelToggle = function() { return $rootScope.showLeftpanelToggle }, $scope.togglePref = function(conceptSet, conceptName) { $rootScope.currentUser.toggleFavoriteObsTemplate(conceptName), spinner.forPromise(userService.savePreferences()) }, $scope.getNormalized = function(conceptName) { return conceptName.replace(/['\.\s\(\)\/,\\]+/g, "_") }, $scope.showPreviousButton = function(conceptSetName) { return conceptSetUIConfig[conceptSetName] && conceptSetUIConfig[conceptSetName].showPreviousButton }, $scope.showPrevious = function(conceptSetName, event) { event.stopPropagation(), $timeout(function() { $scope.$broadcast("event:showPrevious" + conceptSetName) }) }, $scope.isInEditEncounterMode = function() { return void 0 !== $stateParams.encounterUuid && "active" !== $stateParams.encounterUuid }, $scope.computeField = function(conceptSet, event) { event.stopPropagation(), $scope.consultation.preSaveHandler.fire(); var defaultRetrospectiveVisitType = clinicalAppConfigService.getVisitTypeForRetrospectiveEntries(), encounterData = (new Bahmni.Clinical.EncounterTransactionMapper).map(angular.copy($scope.consultation), $scope.patient, sessionService.getLoginLocationUuid(), retrospectiveEntryService.getRetrospectiveEntry(), defaultRetrospectiveVisitType, $scope.isInEditEncounterMode()); encounterData = encounterService.buildEncounter(encounterData), encounterData.drugOrders = []; var conceptSetData = { name: conceptSet.conceptName, uuid: conceptSet.uuid }, data = { encounterModifierObservations: encounterData.observations, drugOrders: encounterData.drugOrders, conceptSetData: conceptSetData, patientUuid: encounterData.patientUuid, encounterDateTime: encounterData.encounterDateTime }; spinner.forPromise(treatmentConfig().then(function(treatmentConfig) { return $scope.treatmentConfiguration = treatmentConfig, conceptSetService.getComputedValue(data) }).then(function(response) { response = response.data, copyValues($scope.consultation.observations, response.encounterModifierObservations), $scope.consultation.newlyAddedTreatments = $scope.consultation.newlyAddedTreatments || [], response.drugOrders.forEach(function(drugOrder) { $scope.consultation.newlyAddedTreatments.push(Bahmni.Clinical.DrugOrderViewModel.createFromContract(drugOrder, $scope.treatmentConfiguration)) }) })) }, $scope.canRemove = function(index) { var observations = $scope.allTemplates[index].observations; return !(void 0 !== observations && !_.isEmpty(observations)) || void 0 === observations[0].uuid }, $scope.clone = function(index) { var clonedObj = $scope.allTemplates[index].clone(); $scope.allTemplates.splice(index + 1, 0, clonedObj), $.scrollTo("#concept-set-" + (index + 1), 200, { offset: { top: -400 } }) }, $scope.clonePanelConceptSet = function(conceptSet) { var index = _.findIndex($scope.allTemplates, conceptSet); messagingService.showMessage("info", $translate.instant("CLINICAL_TEMPLATE_ADDED_SUCCESS_KEY", { label: $scope.allTemplates[index].label })), $scope.clone(index), $scope.showLeftPanelConceptSet($scope.allTemplates[index + 1]) }, $scope.isClonedSection = function(conceptSetTemplate, allTemplates) { if (allTemplates) { var index = allTemplates.indexOf(conceptSetTemplate); return index > 0 && allTemplates[index].label == allTemplates[index - 1].label } return !1 }, $scope.isLastClonedSection = function(conceptSetTemplate) { var index = _.findIndex($scope.allTemplates, conceptSetTemplate); return !(!$scope.allTemplates || index != $scope.allTemplates.length - 1 && $scope.allTemplates[index].label == $scope.allTemplates[index + 1].label) }, $scope.remove = function(index) { var label = $scope.allTemplates[index].label, currentTemplate = $scope.allTemplates[index], anotherTemplate = _.find($scope.allTemplates, function(template) { return template.label == currentTemplate.label && template !== currentTemplate }); if (anotherTemplate) $scope.allTemplates.splice(index, 1); else { var clonedObj = $scope.allTemplates[index].clone(); $scope.allTemplates[index] = clonedObj, $scope.allTemplates[index].isAdded = !1, $scope.allTemplates[index].isOpen = !1, $scope.allTemplates[index].klass = "", $scope.allTemplates[index].isLoaded = !1 } $scope.leftPanelConceptSet = "", messagingService.showMessage("info", $translate.instant("CLINICAL_TEMPLATE_REMOVED_SUCCESS_KEY", { label: label })) }, $scope.openActiveForm = function(conceptSet) { return conceptSet && "active" == conceptSet.klass && conceptSet != $scope.leftPanelConceptSet && $scope.showLeftPanelConceptSet(conceptSet), conceptSet.klass }; var copyValues = function(existingObservations, modifiedObservations) { existingObservations.forEach(function(observation, index) { observation.groupMembers && observation.groupMembers.length > 0 ? copyValues(observation.groupMembers, modifiedObservations[index].groupMembers) : observation.value = modifiedObservations[index].value }) }, collapseExistingActiveSection = function(section) { section && (section.klass = "", section.isOpen = !1, section.isLoaded = !1) }; $scope.showLeftPanelConceptSet = function(selectedConceptSet) { collapseExistingActiveSection($scope.leftPanelConceptSet), $scope.leftPanelConceptSet = selectedConceptSet, $scope.leftPanelConceptSet.isOpen = !0, $scope.leftPanelConceptSet.isLoaded = !0, $scope.leftPanelConceptSet.klass = "active", $scope.leftPanelConceptSet.atLeastOneValueIsSet = selectedConceptSet.hasSomeValue(), $scope.leftPanelConceptSet.isAdded = !0, $scope.consultation.lastvisited = selectedConceptSet.id || selectedConceptSet.formUuid, $(window).scrollTop(0) }, $scope.focusOnErrors = function() { var errorMessage = $scope.leftPanelConceptSet.errorMessage ? $scope.leftPanelConceptSet.errorMessage : "{{'CLINICAL_FORM_ERRORS_MESSAGE_KEY' | translate }}"; messagingService.showMessage("error", errorMessage), $scope.$parent.$parent.$broadcast("event:errorsOnForm") }, $scope.isFormTemplate = function(data) { return data.formUuid }, init() }]).directive("conceptSetGroup", function() { return { restrict: "EA", scope: { conceptSetGroupExtensionId: "=?", observations: "=", allTemplates: "=", context: "=", autoScrollEnabled: "=", patient: "=", consultation: "=" }, controller: "ConceptSetGroupController", templateUrl: "../common/concept-set/views/conceptSetGroup.html" } }), angular.module("bahmni.common.conceptSet").controller("multiSelectObservationSearchController", ["$scope", "conceptSetService", function($scope, conceptSetService) { var possibleAnswers = [], unselectedValues = []; $scope.values = []; var init = function() { var selectedValues = _.map(_.values($scope.observation.selectedObs), "value"); _.remove(selectedValues, _.isUndefined), selectedValues.forEach(function(observation) { $scope.values.push({ label: observation.name, name: observation.name }) }); var configuredConceptSetName = $scope.observation.getConceptUIConfig().answersConceptName; _.isUndefined(configuredConceptSetName) ? (possibleAnswers = $scope.observation.getPossibleAnswers(), unselectedValues = _.xorBy(possibleAnswers, selectedValues, "uuid")) : conceptSetService.getConcept({ name: configuredConceptSetName, v: "bahmni" }).then(function(response) { possibleAnswers = _.isEmpty(response.data.results) ? [] : response.data.results[0].answers, unselectedValues = _.xorBy(possibleAnswers, $scope.values, "uuid") }) }; $scope.search = function(query) { var matchingAnswers = []; return _.forEach(unselectedValues, function(answer) { if ("object" != typeof answer.name && answer.name.toLowerCase().indexOf(query.toLowerCase()) !== -1) answer.label = answer.name, matchingAnswers.push(answer); else if ("object" == typeof answer.name && answer.name.name.toLowerCase().indexOf(query.toLowerCase()) !== -1) answer.name = answer.name.name, answer.label = answer.name, matchingAnswers.push(answer); else { var synonyms = _.map(answer.names, "name"); _.find(synonyms, function(name) { name.toLowerCase().indexOf(query.toLowerCase()) !== -1 && (answer.label = name + " => " + answer.name, matchingAnswers.push(answer)) }) } }), _.uniqBy(matchingAnswers, "uuid") }, $scope.addItem = function(item) { unselectedValues = _.remove(unselectedValues, function(value) { return value.uuid !== item.uuid }), $scope.observation.toggleSelection(item) }, $scope.removeItem = function(item) { unselectedValues.push(item), $scope.observation.toggleSelection(item) }, $scope.setLabel = function(answer) { return answer.label = answer.name, !0 }, $scope.removeFreeTextItem = function() { var value = $("input.input").val(); _.isEmpty($scope.search(value)) && $("input.input").val("") }, init() }]).config(["tagsInputConfigProvider", function(tagsInputConfigProvider) { tagsInputConfigProvider.setDefaults("tagsInput", { placeholder: "" }) }]), angular.module("bahmni.common.conceptSet").directive("conceptSet", ["contextChangeHandler", "appService", "observationsService", "messagingService", "conceptSetService", "conceptSetUiConfigService", "spinner", function(contextChangeHandler, appService, observationsService, messagingService, conceptSetService, conceptSetUiConfigService, spinner) { var controller = function($scope) { var conceptSetName = $scope.conceptSetName, ObservationUtil = Bahmni.Common.Obs.ObservationUtil, conceptSetUIConfig = conceptSetUiConfigService.getConfig(), observationMapper = new Bahmni.ConceptSet.ObservationMapper, validationHandler = $scope.validationHandler() || contextChangeHandler, id = "#" + $scope.sectionId; $scope.atLeastOneValueIsSet = $scope.atLeastOneValueIsSet || !1, $scope.conceptSetRequired = !1, $scope.showTitleValue = $scope.showTitle(), $scope.numberOfVisits = conceptSetUIConfig[conceptSetName] && conceptSetUIConfig[conceptSetName].numberOfVisits ? conceptSetUIConfig[conceptSetName].numberOfVisits : null, $scope.hideAbnormalButton = conceptSetUIConfig[conceptSetName] && conceptSetUIConfig[conceptSetName].hideAbnormalButton; var focusFirstObs = function() { if ($scope.conceptSetFocused && $scope.rootObservation.groupMembers && $scope.rootObservation.groupMembers.length > 0) { var firstObs = _.find($scope.rootObservation.groupMembers, function(obs) { return obs.isFormElement && obs.isFormElement() }); firstObs && (firstObs.isFocused = !0) } }, updateObservationsOnRootScope = function() { if ($scope.rootObservation) { for (var i = 0; i < $scope.observations.length; i++) if ($scope.observations[i].concept.uuid === $scope.rootObservation.concept.uuid) return void($scope.observations[i] = $scope.rootObservation); $scope.observations.push($scope.rootObservation) } }, getObservationsOfCurrentTemplate = function() { return _.filter($scope.observations, function(observation) { return _.toLower(observation.conceptSetName) === _.toLower($scope.rootObservation.concept.name) }) }, getDefaults = function() { var conceptSetUI = appService.getAppDescriptor().getConfigValue("conceptSetUI"); if (conceptSetUI && conceptSetUI.defaults) return conceptSetUI.defaults || {} }, getCodedAnswerWithDefaultAnswerString = function(defaults, groupMember) { var defaultCodedAnswer, possibleAnswers = groupMember.possibleAnswers, defaultAnswer = defaults[groupMember.concept.name]; return defaultAnswer instanceof Array ? (defaultCodedAnswer = [], _.each(defaultAnswer, function(answer) { defaultCodedAnswer.push(_.find(possibleAnswers, { displayString: answer })) })) : defaultCodedAnswer = _.find(possibleAnswers, { displayString: defaultAnswer }), defaultCodedAnswer }, setDefaultsForGroupMembers = function(groupMembers, defaults) { defaults && _.each(groupMembers, function(groupMember) { var conceptFullName = groupMember.concept.name, present = _.includes(_.keys(defaults), conceptFullName); present && void 0 == groupMember.value && ("Coded" == groupMember.concept.dataType ? setDefaultsForCodedObservations(groupMember, defaults) : groupMember.value = defaults[conceptFullName]), groupMember.groupMembers && groupMember.groupMembers.length > 0 && (setDefaultsForGroupMembers(groupMember.groupMembers, defaults), groupMember instanceof Bahmni.ConceptSet.ObservationNode && defaults[groupMember.label] && groupMember.abnormalObs && void 0 == groupMember.abnormalObs.value && groupMember.onValueChanged(groupMember.value)) }) }, setDefaultsForCodedObservations = function(observation, defaults) { var defaultCodedAnswer = getCodedAnswerWithDefaultAnswerString(defaults, observation); observation.isMultiSelect ? observation.hasValue() || _.each(defaultCodedAnswer, function(answer) { observation.selectAnswer(answer) }) : defaultCodedAnswer instanceof Array || (observation.value = defaultCodedAnswer) }, getFlattenedObsValues = function(flattenedObs) { return _.reduce(flattenedObs, function(flattenedObsValues, obs) { if (void 0 == flattenedObsValues[obs.concept.name + "|" + obs.uniqueId]) if (obs.isMultiSelect) { var selectedObsConceptNames = []; _.each(obs.selectedObs, function(observation) { observation.voided || selectedObsConceptNames.push(observation.value.name), observation.voided || selectedObsConceptNames.push(observation.value.name) }), flattenedObsValues[obs.concept.name + "|" + obs.uniqueId] = selectedObsConceptNames } else if (obs.conceptUIConfig.multiSelect) { var alreadyProcessedMultiSelect = []; _.each(_.keys(flattenedObsValues), function(eachObsKey) { eachObsKey.split("|")[0] == obs.concept.name && alreadyProcessedMultiSelect.push(eachObsKey) }), alreadyProcessedMultiSelect.length < 2 && (flattenedObsValues[obs.concept.name + "|" + obs.uniqueId] = flattenedObsValues[obs.concept.name + "|undefined"]) } else obs.value instanceof Object ? flattenedObsValues[obs.concept.name + "|" + obs.uniqueId] = obs.value.name instanceof Object ? obs.value.name.name : obs.value.name : flattenedObsValues[obs.concept.name + "|" + obs.uniqueId] = obs.value; return flattenedObsValues }, {}) }, clearFieldValuesOnDisabling = function(obs) { if (obs.comment = void 0, obs.value || obs.isBoolean) obs.value = void 0; else if (obs.isMultiSelect) for (var key in obs.selectedObs) obs.selectedObs[key].voided || obs.toggleSelection(obs.selectedObs[key].value) }, setObservationState = function(obsArray, disable, error, hide) { _.isEmpty(obsArray) || _.each(obsArray, function(obs) { obs.disabled = disable || hide, obs.error = error, obs.hide = hide, (hide || obs.disabled) && clearFieldValuesOnDisabling(obs), obs.groupMembers && _.each(obs.groupMembers, function(groupMember) { groupMember && setObservationState([groupMember], disable, error, hide) }) }) }, processConditions = function(flattenedObs, fields, disable, error, hide) { _.each(fields, function(field) { var clonedObsInSameGroup, matchingObsArray = []; flattenedObs.forEach(function(obs) { 0 != clonedObsInSameGroup && obs.concept.name == field ? (matchingObsArray.push(obs), clonedObsInSameGroup = !0) : clonedObsInSameGroup && obs.concept.name != field && (clonedObsInSameGroup = !1) }), _.isEmpty(matchingObsArray) ? messagingService.showMessage("error", "No element found with name : " + field) : setObservationState(matchingObsArray, disable, error, hide) }) }, runFormConditionForObs = function(enableCase, formName, formCondition, conceptName, flattenedObs) { var conceptSetObsValues = getFlattenedObsValues(flattenedObs); _.each(_.keys(conceptSetObsValues), function(eachObsKey) { if (eachObsKey.split("|")[0] == conceptName && "undefined" != eachObsKey.split("|")[1]) { var valueMap = _.reduce(conceptSetObsValues, function(conceptSetValueMap, obsValue, conceptName) { return conceptSetValueMap[conceptName.split("|")[0]] = obsValue, conceptSetValueMap }, {}), conditions = formCondition(formName, valueMap, $scope.patient); _.isUndefined(conditions) || (conditions.error && !_.isEmpty(conditions.error) ? (messagingService.showMessage("error", conditions.error), processConditions(flattenedObs, [conceptName], !1, !0, !1)) : enableCase && processConditions(flattenedObs, [conceptName], !1, !1, !1), processConditions(flattenedObs, conditions.disable, !0), processConditions(flattenedObs, conditions.enable, !1), processConditions(flattenedObs, conditions.show, !1, void 0, !1), processConditions(flattenedObs, conditions.hide, !1, void 0, !0), _.each(conditions.enable, function(subConditionConceptName) { var conditionFn = Bahmni.ConceptSet.FormConditions.rules && Bahmni.ConceptSet.FormConditions.rules[subConditionConceptName]; null != conditionFn && runFormConditionForObs(!0, formName, conditionFn, subConditionConceptName, flattenedObs) }), _.each(conditions.disable, function(subConditionConceptName) { var conditionFn = Bahmni.ConceptSet.FormConditions.rules && Bahmni.ConceptSet.FormConditions.rules[subConditionConceptName]; null != conditionFn && _.each(flattenedObs, function(obs) { obs.concept.name == subConditionConceptName && runFormConditionForObs(!1, formName, conditionFn, subConditionConceptName, flattenedObs) }) }), _.each(conditions.show, function(subConditionConceptName) { var conditionFn = Bahmni.ConceptSet.FormConditions.rules && Bahmni.ConceptSet.FormConditions.rules[subConditionConceptName]; conditionFn && runFormConditionForObs(!0, formName, conditionFn, subConditionConceptName, flattenedObs) }), _.each(conditions.hide, function(subConditionConceptName) { var conditionFn = Bahmni.ConceptSet.FormConditions.rules && Bahmni.ConceptSet.FormConditions.rules[subConditionConceptName]; conditionFn && _.each(flattenedObs, function(obs) { obs.concept.name == subConditionConceptName && runFormConditionForObs(!1, formName, conditionFn, subConditionConceptName, flattenedObs) }) })) } }) }, updateFormConditions = function(observationsOfCurrentTemplate, rootObservation) { Bahmni.ConceptSet.FormConditions.rules && runFormConditionForAllObsRecursively(rootObservation.concept.name, rootObservation) }, runFormConditionForAllObsRecursively = function(formName, rootObservation) { _.each(rootObservation.groupMembers, function(observation) { var conditionFn = Bahmni.ConceptSet.FormConditions.rules && Bahmni.ConceptSet.FormConditions.rules[observation.concept.name]; if (null != conditionFn) { var flattenedObs = ObservationUtil.flattenObsToArray([rootObservation]); runFormConditionForObs(!1, formName, conditionFn, observation.concept.name, flattenedObs) } observation.groupMembers && observation.groupMembers.length > 0 && runFormConditionForAllObsRecursively(formName, observation) }) }, addDummyImage = function() { _.each($scope.rootObservation.groupMembers, function(observation) { addDummyImageObservationForSavedObs(observation, $scope.rootObservation) }) }, addDummyImageObservationForSavedObs = function(observation, rootObservation) { if (_.each(observation.groupMembers, function(childObservation) { addDummyImageObservationForSavedObs(childObservation, observation) }), "image" === observation.getControlType() && observation.value && rootObservation.groupMembers.indexOf(observation) === rootObservation.groupMembers.length - 1) return void rootObservation.groupMembers.push(observation.cloneNew()) }, init = function() { return conceptSetService.getConcept({ name: conceptSetName, v: "bahmni" }).then(function(response) { if ($scope.conceptSet = response.data.results[0], $scope.rootObservation = $scope.conceptSet ? observationMapper.map($scope.observations, $scope.conceptSet, conceptSetUIConfig) : null, $scope.rootObservation) { $scope.rootObservation.conceptSetName = $scope.conceptSetName, focusFirstObs(), updateObservationsOnRootScope(); var groupMembers = getObservationsOfCurrentTemplate()[0].groupMembers, defaults = getDefaults(); addDummyImage(), setDefaultsForGroupMembers(groupMembers, defaults); var observationsOfCurrentTemplate = getObservationsOfCurrentTemplate(); updateFormConditions(observationsOfCurrentTemplate, $scope.rootObservation) } else $scope.showEmptyConceptSetMessage = !0 })["catch"](function(error) { messagingService.showMessage("error", error.message) }) }; spinner.forPromise(init(), id); var validateObservationTree = function() { if ("undefined" == typeof $scope.rootObservation || null === $scope.rootObservation) return { allow: !0, errorMessage: null }; $scope.atLeastOneValueIsSet = $scope.rootObservation && $scope.rootObservation.atLeastOneValueSet(), $scope.conceptSetRequired = !$scope.required || $scope.required; var nodes = $scope.rootObservation && findInvalidNodes($scope.rootObservation.groupMembers, $scope.rootObservation); return { allow: !nodes.status, errorMessage: nodes.message } }, findInvalidNodes = function(members, parentNode) { var errorMessage = null, status = members.some(function(childNode) { if (childNode.voided) return !1; var groupMembers = childNode.groupMembers || []; for (var index in groupMembers) { var information = groupMembers[index].groupMembers && groupMembers[index].groupMembers.length ? findInvalidNodes(groupMembers[index].groupMembers, groupMembers[index]) : validateChildNode(groupMembers[index], childNode); if (information.status) return errorMessage = information.message, !0 } return information = validateChildNode(childNode, parentNode), information.status ? (errorMessage = information.message, !0) : !childNode.isValid($scope.atLeastOneValueIsSet, $scope.conceptSetRequired) }); return { message: errorMessage, status: status } }, validateChildNode = function(childNode, parentNode) { var errorMessage; if (childNode.possibleAnswers && !childNode.possibleAnswers.length) { if ("function" == typeof childNode.isValueInAbsoluteRange && !childNode.isValueInAbsoluteRange()) return errorMessage = "The value you entered (red field) is outside the range of allowable values for that record. Please check the value.", { message: errorMessage, status: !0 }; if (childNode.isNumeric()) { if (!childNode.isValidNumeric()) return errorMessage = "Please enter Integer value, decimal value is not allowed", { message: errorMessage, status: !0 }; if (parentNode) { if (!childNode.isValidNumericValue() || !parentNode.isValidNumericValue()) return errorMessage = "Please enter Numeric values", { message: errorMessage, status: !0 } } else if (!childNode.isValidNumericValue()) return errorMessage = "Please enter Numeric values", { message: errorMessage, status: !0 } } } return { status: !1 } }; validationHandler.add(validateObservationTree); var cleanUpListenerShowPrevious = $scope.$on("event:showPrevious" + conceptSetName, function() { return spinner.forPromise(observationsService.fetch($scope.patient.uuid, $scope.conceptSetName, null, $scope.numberOfVisits, null, !0), id).then(function(response) { var recentObservations = ObservationUtil.flattenObsToArray(response.data), conceptSetObservation = $scope.observations.filter(function(observation) { return observation.conceptSetName === $scope.conceptSetName }); ObservationUtil.flattenObsToArray(conceptSetObservation).forEach(function(obs) { var correspondingRecentObs = _.filter(recentObservations, function(recentObs) { return obs.concept.uuid === recentObs.concept.uuid }); null != correspondingRecentObs && correspondingRecentObs.length > 0 && (correspondingRecentObs.sort(function(obs1, obs2) { return new Date(obs2.encounterDateTime) - new Date(obs1.encounterDateTime) }), obs.previous = correspondingRecentObs.map(function(previousObs) { return { value: Bahmni.Common.Domain.ObservationValueMapper.map(previousObs), date: previousObs.observationDateTime } })) }) }) }), deregisterAddMore = $scope.$root.$on("event:addMore", function(event, observation) { updateFormConditions([observation], observation) }), deregisterObservationUpdated = $scope.$root.$on("event:observationUpdated-" + conceptSetName, function(event, conceptName, rootObservation) { var formName = rootObservation.concept.name, formCondition = Bahmni.ConceptSet.FormConditions.rules && Bahmni.ConceptSet.FormConditions.rules[conceptName]; if (formCondition) { var flattenedObs = ObservationUtil.flattenObsToArray([rootObservation]); runFormConditionForObs(!0, formName, formCondition, conceptName, flattenedObs) } }); $scope.$on("$destroy", function() { deregisterObservationUpdated(), deregisterAddMore(), cleanUpListenerShowPrevious() }) }; return { restrict: "E", scope: { conceptSetName: "=", observations: "=?", required: "=?", showTitle: "&", validationHandler: "&", patient: "=", conceptSetFocused: "=?", collapseInnerSections: "=?", atLeastOneValueIsSet: "=?", sectionId: "=" }, templateUrl: "../common/concept-set/views/conceptSet.html", controller: controller } }]), angular.module("bahmni.common.conceptSet").directive("formControls", ["formService", "spinner", "$timeout", "$translate", function(formService, spinner, $timeout, $translate) { var loadedFormDetails = {}, loadedFormTranslations = {}, unMountReactContainer = function(formUuid) { var reactContainerElement = angular.element(document.getElementById(formUuid)); reactContainerElement.on("$destroy", function() { unMountForm(document.getElementById(formUuid)) }) }, controller = function($scope) { var formUuid = $scope.form.formUuid, formVersion = $scope.form.formVersion, formName = $scope.form.formName, formObservations = $scope.form.observations, collapse = $scope.form.collapseInnerSections && $scope.form.collapseInnerSections.value, validateForm = $scope.validateForm || !1, locale = $translate.use(); loadedFormDetails[formUuid] ? $timeout(function() { $scope.form.component = renderWithControls(loadedFormDetails[formUuid], formObservations, formUuid, collapse, $scope.patient, validateForm, locale, loadedFormTranslations[formUuid]), unMountReactContainer($scope.form.formUuid) }, 0, !1) : spinner.forPromise(formService.getFormDetail(formUuid, { v: "custom:(resources:(value))" }).then(function(response) { var formDetailsAsString = _.get(response, "data.resources[0].value"); if (formDetailsAsString) { var formDetails = JSON.parse(formDetailsAsString); formDetails.version = formVersion, loadedFormDetails[formUuid] = formDetails; var formParams = { formName: formName, formVersion: formVersion, locale: locale, formUuid: formDetails.uuid }; spinner.forPromise(formService.getFormTranslations(formDetails.translationsUrl, formParams).then(function(response) { var formTranslations = _.isEmpty(response.data) ? {} : response.data[0]; loadedFormTranslations[formUuid] = formTranslations, $scope.form.component = renderWithControls(formDetails, formObservations, formUuid, collapse, $scope.patient, validateForm, locale, formTranslations) }, function() { var formTranslations = {}; loadedFormTranslations[formUuid] = formTranslations, $scope.form.component = renderWithControls(formDetails, formObservations, formUuid, collapse, $scope.patient, validateForm, locale, formTranslations) })) } unMountReactContainer($scope.form.formUuid) })), $scope.$watch("form.collapseInnerSections", function() { var collapse = $scope.form.collapseInnerSections && $scope.form.collapseInnerSections.value; loadedFormDetails[formUuid] && ($scope.form.component = renderWithControls(loadedFormDetails[formUuid], formObservations, formUuid, collapse, $scope.patient, validateForm, locale, loadedFormTranslations[formUuid])) }), $scope.$on("$destroy", function() { if ($scope.$parent.consultation && $scope.$parent.consultation.observationForms && $scope.form.component) { var formObservations = $scope.form.component.getValue(); $scope.form.observations = formObservations.observations; var hasError = formObservations.errors; _.isEmpty(hasError) || ($scope.form.isValid = !1) } }) }; return { restrict: "E", scope: { form: "=", patient: "=", validateForm: "=" }, controller: controller } }]), angular.module("bahmni.common.conceptSet").directive("concept", ["RecursionHelper", "spinner", "$filter", "messagingService", function(RecursionHelper, spinner, $filter, messagingService) { var link = function(scope) { var hideAbnormalbuttonConfig = scope.observation && scope.observation.conceptUIConfig && scope.observation.conceptUIConfig.hideAbnormalButton; scope.now = moment().format("YYYY-MM-DD hh:mm:ss"), scope.showTitle = void 0 === scope.showTitle || scope.showTitle, scope.hideAbnormalButton = void 0 == hideAbnormalbuttonConfig ? scope.hideAbnormalButton : hideAbnormalbuttonConfig, scope.cloneNew = function(observation, parentObservation) { observation.showAddMoreButton = function() { return !1 }; var newObs = observation.cloneNew(); newObs.scrollToElement = !0; var index = parentObservation.groupMembers.indexOf(observation); parentObservation.groupMembers.splice(index + 1, 0, newObs), messagingService.showMessage("info", "A new " + observation.label + " section has been added"), scope.$root.$broadcast("event:addMore", newObs) }, scope.removeClonedObs = function(observation, parentObservation) { observation.voided = !0; var lastObservationByLabel = _.findLast(parentObservation.groupMembers, function(groupMember) { return groupMember.label === observation.label && !groupMember.voided }); lastObservationByLabel.showAddMoreButton = function() { return !0 }, observation.hidden = !0 }, scope.isClone = function(observation, parentObservation) { if (parentObservation && parentObservation.groupMembers) { var index = parentObservation.groupMembers.indexOf(observation); return index > 0 && parentObservation.groupMembers[index].label == parentObservation.groupMembers[index - 1].label } return !1 }, scope.isRemoveValid = function(observation) { return "image" != observation.getControlType() || !observation.value }, scope.getStringValue = function(observations) { return observations.map(function(observation) { return observation.value + " (" + $filter("bahmniDate")(observation.date) + ")" }).join(", ") }, scope.toggleSection = function() { scope.collapse = !scope.collapse }, scope.isCollapsibleSet = function() { return 1 == scope.showTitle }, scope.hasPDFAsValue = function() { return scope.observation.value && scope.observation.value.indexOf(".pdf") > 0 }, scope.$watch("collapseInnerSections", function() { scope.collapse = scope.collapseInnerSections && scope.collapseInnerSections.value }), scope.handleUpdate = function() { scope.$root.$broadcast("event:observationUpdated-" + scope.conceptSetName, scope.observation.concept.name, scope.rootObservation) }, scope.update = function(value) { scope.getBooleanResult(scope.observation.isObservationNode) ? scope.observation.primaryObs.value = value : scope.getBooleanResult(scope.observation.isFormElement()) && (scope.observation.value = value), scope.handleUpdate() }, scope.getBooleanResult = function(value) { return !!value } }, compile = function(element) { return RecursionHelper.compile(element, link) }; return { restrict: "E", compile: compile, scope: { conceptSetName: "=", observation: "=", atLeastOneValueIsSet: "=", showTitle: "=", conceptSetRequired: "=", rootObservation: "=", patient: "=", collapseInnerSections: "=", rootConcept: "&", hideAbnormalButton: "=" }, templateUrl: "../common/concept-set/views/observation.html" } }]), angular.module("bahmni.common.conceptSet").directive("buttonSelect", function() { return { restrict: "E", scope: { observation: "=", abnormalObs: "=?" }, link: function(scope, element, attrs) { attrs.dirtyCheckFlag && (scope.hasDirtyFlag = !0) }, controller: function($scope) { $scope.isSet = function(answer) { return $scope.observation.hasValueOf(answer) }, $scope.select = function(answer) { $scope.observation.toggleSelection(answer), $scope.$parent.observation && "function" == typeof $scope.$parent.observation.onValueChanged && $scope.$parent.observation.onValueChanged(), $scope.$parent.handleUpdate() }, $scope.getAnswerDisplayName = function(answer) { var shortName = answer.names ? _.first(answer.names.filter(function(name) { return "SHORT" === name.conceptNameType })) : null; return shortName ? shortName.name : answer.displayString } }, templateUrl: "../common/concept-set/views/buttonSelect.html" } }), angular.module("bahmni.common.conceptSet").directive("stepper", function() { return { restrict: "E", require: "ngModel", replace: !0, scope: { ngModel: "=", obs: "=", ngClass: "=", focusMe: "=" }, template: '
', link: function(scope, element, attrs, ngModelController) { function updateModel(offset) { var currValue = 0; isNaN(ngModelController.$viewValue) ? null != scope.obs.concept.lowNormal && (currValue = scope.obs.concept.lowNormal - offset) : currValue = parseInt(ngModelController.$viewValue), ngModelController.$setViewValue(currValue + offset) } ngModelController.$render = function() {}, ngModelController.$formatters.push(function(value) { return parseInt(value, 10) }), ngModelController.$parsers.push(function(value) { return parseInt(value, 10) }), scope.increment = function() { if (null != scope.obs.concept.hiNormal) { var currValue = isNaN(ngModelController.$viewValue) ? 0 : ngModelController.$viewValue; currValue < scope.obs.concept.hiNormal && updateModel(1) } else updateModel(1) }, scope.decrement = function() { if (null != scope.obs.concept.lowNormal) { var currValue = isNaN(ngModelController.$viewValue) ? 0 : ngModelController.$viewValue; currValue > scope.obs.concept.lowNormal && updateModel(-1) } else updateModel(-1) } } } }), angular.module("bahmni.common.conceptSet").directive("obsConstraints", function() { var attributesMap = { Numeric: "number", Date: "date", Datetime: "datetime" }, link = function($scope, element) { var attributes = {}, obsConcept = $scope.obs.concept; obsConcept.conceptClass == Bahmni.Common.Constants.conceptDetailsClassName && (obsConcept = $scope.obs.primaryObs.concept), attributes.type = attributesMap[obsConcept.dataType] || "text", "number" === attributes.type && (attributes.step = "any"), obsConcept.hiNormal && (attributes.max = obsConcept.hiNormal), obsConcept.lowNormal && (attributes.min = obsConcept.lowNormal), "date" == attributes.type && (null != $scope.obs.conceptUIConfig && $scope.obs.conceptUIConfig.allowFutureDates || (attributes.max = Bahmni.Common.Util.DateTimeFormatter.getDateWithoutTime())), element.attr(attributes) }; return { link: link, scope: { obs: "=" }, require: "ngModel" } }), angular.module("bahmni.common.conceptSet").directive("duration", ["contextChangeHandler", function(contextChangeHandler) { var link = function($scope, element, attrs, ngModelController) { var setValue = function() { if ($scope.unitValue && $scope.measureValue) { var value = $scope.unitValue * $scope.measureValue; ngModelController.$setViewValue(value) } else ngModelController.$setViewValue(void 0) }; $scope.$watch("measureValue", setValue), $scope.$watch("unitValue", setValue), $scope.$watch("disabled", function(value) { value && ($scope.unitValue = void 0, $scope.measureValue = void 0, $scope.hours = void 0) }); var illegalValueChecker = $scope.$watch("illegalValue", function(value) { $scope.illegalDurationValue = value; var contextChange = function() { return { allow: !$scope.illegalDurationValue } }; contextChangeHandler.add(contextChange) }); $scope.$on("$destroy", function() { $scope.illegalDurationValue = !1, illegalValueChecker() }) }, controller = function($scope) { var valueAndUnit = Bahmni.Common.Util.DateUtil.convertToUnits($scope.hours); $scope.units = valueAndUnit.allUnits, $scope.measureValue = valueAndUnit.value, $scope.unitValue = valueAndUnit.unitValueInMinutes; var durations = Object.keys($scope.units).reverse(); $scope.displayUnits = durations.map(function(duration) { return { name: duration, value: $scope.units[duration] } }) }; return { restrict: "E", require: "ngModel", controller: controller, scope: { hours: "=ngModel", illegalValue: "=", disabled: "=" }, link: link, template: '' } }]), Bahmni.ConceptSet.ConceptSetGroupValidationHandler = function(conceptSetSections) { var validations = []; this.add = function(validation) { validations.push(validation) }, this.validate = function() { var errorMessage = "", allConceptSetSectionsValid = !0; return validations.forEach(function(validation) { var validationReturn = validation(); _.isEmpty(errorMessage) && (errorMessage = validationReturn.errorMessage), allConceptSetSectionsValid = allConceptSetSectionsValid && validationReturn.allow }), allConceptSetSectionsValid || conceptSetSections.filter(_.property("isLoaded")).forEach(function(conceptSetSection) { conceptSetSection.show() }), { allow: allConceptSetSectionsValid, errorMessage: errorMessage } } }, Bahmni.ConceptSet.ConceptSetGroupPanelViewValidationHandler = function(conceptSetSections) { this.add = function(validation) { var conceptSetPanel = getActiveConceptSet(); 1 == conceptSetPanel.length && (conceptSetPanel[0].validate = validation) }; var getActiveConceptSet = function() { return _.filter(conceptSetSections, function(conceptSet) { return "active" === conceptSet.klass }) }; this.validate = function() { var errorMessage = "", allConceptSetSectionsValid = !0; return _.forEach(conceptSetSections, function(conceptSet) { if (conceptSet.validate && "function" == typeof conceptSet.validate) { var validationReturn = conceptSet.validate(); conceptSet.isValid = validationReturn.allow, conceptSet.errorMessage = validationReturn.errorMessage, "active" == conceptSet.klass && (errorMessage = validationReturn.errorMessage), allConceptSetSectionsValid = allConceptSetSectionsValid && validationReturn.allow } }), allConceptSetSectionsValid || conceptSetSections.filter(_.property("isLoaded")).forEach(function(conceptSetSection) { conceptSetSection.show() }), { allow: allConceptSetSectionsValid, errorMessage: errorMessage } } }, Bahmni.ConceptSet.ConceptSetSection = function(extensions, user, config, observations, conceptSet) { var self = this; self.clone = function() { var clonedConceptSetSection = new Bahmni.ConceptSet.ConceptSetSection(extensions, user, config, [], conceptSet); return clonedConceptSetSection.isAdded = !0, clonedConceptSetSection }; var init = function() { self.observations = observations, self.options = extensions.extensionParams || {}, self.conceptName = conceptSet.name ? conceptSet.name.name : self.options.conceptName; var conceptName = _.find(conceptSet.names, { conceptNameType: "SHORT" }) || _.find(conceptSet.names, { conceptNameType: "FULLY_SPECIFIED" }); conceptName = conceptName ? conceptName.name : conceptName, self.label = conceptName || self.conceptName || self.options.conceptName, self.isLoaded = self.isOpen, self.collapseInnerSections = { value: !1 }, self.uuid = conceptSet.uuid, self.alwaysShow = user.isFavouriteObsTemplate(self.conceptName), self.allowAddMore = config.allowAddMore, self.id = "concept-set-" + conceptSet.uuid }, getShowIfFunction = function() { if (!self.showIfFunction) { var showIfFunctionStrings = self.options.showIf || ["return true;"]; self.showIfFunction = new Function("context", showIfFunctionStrings.join("\n")) } return self.showIfFunction }, atLeastOneValueSet = function(observation) { return observation.groupMembers && observation.groupMembers.length > 0 ? observation.groupMembers.some(function(groupMember) { return atLeastOneValueSet(groupMember) }) : !(_.isUndefined(observation.value) || "" === observation.value) }; self.isAvailable = function(context) { return getShowIfFunction()(context || {}) }, self.show = function() { self.isOpen = !0, self.isLoaded = !0 }, self.hide = function() { self.isOpen = !1 }, self.getObservationsForConceptSection = function() { return self.observations.filter(function(observation) { return observation.concept.name === self.conceptName }) }, self.hasSomeValue = function() { var observations = self.getObservationsForConceptSection(); return _.some(observations, function(observation) { return atLeastOneValueSet(observation) }) }, self.showComputeButton = function() { return config.computeDrugs === !0 }, self.toggle = function() { self.added = !self.added, self.added && self.show() }, self.maximizeInnerSections = function(event) { event.stopPropagation(), self.collapseInnerSections = { value: !1 } }, self.minimizeInnerSections = function(event) { event.stopPropagation(), self.collapseInnerSections = { value: !0 } }, self.toggleDisplay = function() { self.isOpen ? self.hide() : self.show() }, self.canToggle = function() { return !self.hasSomeValue() }, self.canAddMore = function() { return 1 == self.allowAddMore }, Object.defineProperty(self, "isOpen", { get: function() { return void 0 === self.open && (self.open = self.hasSomeValue()), self.open }, set: function(value) { self.open = value } }), self.isDefault = function() { return self.options["default"] }, Object.defineProperty(self, "isAdded", { get: function() { return void 0 === self.added && (self.options["default"] ? self.added = !0 : self.added = self.hasSomeValue()), self.added }, set: function(value) { self.added = value } }), init() }, Bahmni.ConceptSet.Observation = function(observation, savedObs, conceptUIConfig) { var self = this; angular.extend(this, observation), this.isObservation = !0, this.conceptUIConfig = conceptUIConfig[this.concept.name] || [], this.uniqueId = _.uniqueId("observation_"), this.erroneousValue = null, savedObs ? (this.uuid = savedObs.uuid, this.value = savedObs.value, this.observationDateTime = savedObs.observationDateTime, this.provider = savedObs.provider) : this.value = this.conceptUIConfig.defaultValue, Object.defineProperty(this, "autocompleteValue", { enumerable: !0, get: function() { return null != this.value && "object" == typeof this.value ? this.value.name : this.value }, set: function(newValue) { this.__prevValue = this.value, this.value = newValue } }), Object.defineProperty(this, "value", { enumerable: !0, get: function() { return null != self._value ? self._value : (savedObs && "object" == typeof savedObs.value && savedObs.value && (savedObs.value.displayString = savedObs.value.shortName ? savedObs.value.shortName : savedObs.value.name), savedObs ? savedObs.value : void 0) }, set: function(newValue) { self.__prevValue = this.value, self._value = newValue, newValue || (savedObs = null), self.onValueChanged() } }); var cloneNonTabularObs = function(oldObs) { var newGroupMembers = []; return oldObs.groupMembers.forEach(function(member) { if (void 0 === member.isTabularObs) { var clone = member.cloneNew(); clone.hidden = member.hidden, newGroupMembers.push(clone) } }), newGroupMembers }, getTabularObs = function(oldObs) { var tabularObsList = []; return oldObs.groupMembers.forEach(function(member) { void 0 !== member.isTabularObs && tabularObsList.push(member) }), tabularObsList }, cloneTabularObs = function(oldObs, tabularObsList) { return tabularObsList = _.map(tabularObsList, function(tabularObs) { var matchingObsList = _.filter(oldObs.groupMembers, function(member) { return member.concept.name == tabularObs.concept.name }); return new Bahmni.ConceptSet.TabularObservations(matchingObsList, oldObs, conceptUIConfig) }), tabularObsList.forEach(function(tabularObs) { oldObs.groupMembers.push(tabularObs) }), oldObs }; this.cloneNew = function() { var oldObs = angular.copy(observation); if (oldObs.groupMembers && oldObs.groupMembers.length > 0) { oldObs.groupMembers = _.filter(oldObs.groupMembers, function(member) { return !member.isMultiSelect }); var newGroupMembers = cloneNonTabularObs(oldObs), tabularObsList = getTabularObs(oldObs); oldObs.groupMembers = newGroupMembers, _.isEmpty(tabularObsList) || (oldObs = cloneTabularObs(oldObs, tabularObsList)) } new Bahmni.ConceptSet.MultiSelectObservations(conceptUIConfig).map(oldObs.groupMembers); var clone = new Bahmni.ConceptSet.Observation(oldObs, null, conceptUIConfig); return clone.comment = void 0, clone.disabled = this.disabled, clone } }, Bahmni.ConceptSet.Observation.prototype = { displayValue: function() { if (!(this.possibleAnswers.length > 0)) return this.value; for (var i = 0; i < this.possibleAnswers.length; i++) if (this.possibleAnswers[i].uuid === this.value) return this.possibleAnswers[i].display }, isGroup: function() { return !!this.groupMembers && this.groupMembers.length > 0 }, isComputed: function() { return "Computed" === this.concept.conceptClass }, isComputedAndEditable: function() { return "Computed/Editable" === this.concept.conceptClass }, isNumeric: function() { return "Numeric" === this.getDataTypeName() }, isValidNumeric: function() { return !(!this.isDecimalAllowed() && this.value && this.value.toString().indexOf(".") >= 0) }, isValidNumericValue: function() { var element = document.getElementById(this.uniqueId); return "" !== this.value || !element || element.checkValidity() }, isText: function() { return "Text" === this.getDataTypeName() }, isCoded: function() { return "Coded" === this.getDataTypeName() }, isDatetime: function() { return "Datetime" === this.getDataTypeName() }, isImage: function() { return this.concept.conceptClass == Bahmni.Common.Constants.imageClassName }, isVideo: function() { return this.concept.conceptClass == Bahmni.Common.Constants.videoClassName }, getDataTypeName: function() { return this.concept.dataType }, isDecimalAllowed: function() { return this.concept.allowDecimal }, isDateDataType: function() { return "Date".indexOf(this.getDataTypeName()) != -1 }, isVoided: function() { return void 0 !== this.voided && this.voided }, getPossibleAnswers: function() { return this.possibleAnswers }, getHighAbsolute: function() { return this.concept.hiAbsolute }, getLowAbsolute: function() { return this.concept.lowAbsolute }, isHtml5InputDataType: function() { return ["Date", "Numeric"].indexOf(this.getDataTypeName()) !== -1 }, isGrid: function() { return this.conceptUIConfig.grid }, isButtonRadio: function() { return this.conceptUIConfig.buttonRadio }, isComplex: function() { return "Complex" === this.concept.dataType }, isLocationRef: function() { return this.isComplex() && "LocationObsHandler" === this.concept.handler }, isProviderRef: function() { return this.isComplex() && "ProviderObsHandler" === this.concept.handler }, getControlType: function() { return this.hidden ? "hidden" : this.conceptUIConfig.freeTextAutocomplete ? "freeTextAutocomplete" : this.isHtml5InputDataType() ? "html5InputDataType" : this.isImage() ? "image" : this.isVideo() ? "video" : this.isText() ? "text" : this.isCoded() ? this._getCodedControlType() : this.isGrid() ? "grid" : this.isDatetime() ? "datetime" : this.isLocationRef() ? "text" : this.isProviderRef() ? "text" : "unknown" }, canHaveComment: function() { return this.conceptUIConfig.disableAddNotes ? !this.conceptUIConfig.disableAddNotes : !this.isText() && !this.isImage() && !this.isVideo() }, canAddMore: function() { return 1 == this.conceptUIConfig.allowAddMore }, isStepperControl: function() { if (this.isNumeric()) return 1 == this.conceptUIConfig.stepper }, isConciseText: function() { return 1 == this.conceptUIConfig.conciseText }, _getCodedControlType: function() { var conceptUIConfig = this.conceptUIConfig; return conceptUIConfig.autocomplete ? "autocomplete" : conceptUIConfig.dropdown ? "dropdown" : "buttonselect" }, onValueChanged: function() { this.isNumeric() && this.setErroneousValue() }, setErroneousValue: function() { if (this.hasValue()) { var erroneousValue = this.value > (this.concept.hiAbsolute || 1 / 0) || this.value < (this.concept.lowAbsolute || 0); this.erroneousValue = erroneousValue } else this.erroneousValue = void 0 }, getInputType: function() { return this.getDataTypeName() }, atLeastOneValueSet: function() { return this.isGroup() ? this.groupMembers.some(function(childNode) { return childNode.atLeastOneValueSet() }) : this.hasValue() && !this.isVoided() }, hasValue: function() { var value = this.value; return value === !1 || (0 === value || !("" === value || !value) && (!(value instanceof Array) || value.length > 0)) }, hasValueOf: function(value) { return !(!this.value || !value) && (this.value == value || this.value.uuid == value.uuid) }, toggleSelection: function(answer) { this.value && this.value.uuid === answer.uuid ? this.value = null : this.value = answer }, isValidDate: function() { if (this.isComputed()) return !0; if (!this.hasValue()) return !0; var date = Bahmni.Common.Util.DateUtil.parse(this.value); if (!this.conceptUIConfig.allowFutureDates) { var today = Bahmni.Common.Util.DateUtil.parse(moment().format("YYYY-MM-DD")); if (today < date) return !1 } return date.getUTCFullYear() && date.getUTCFullYear().toString().length <= 4 }, hasInvalidDateTime: function() { if (this.isComputed()) return !1; var date = Bahmni.Common.Util.DateUtil.parse(this.value); return !this.conceptUIConfig.allowFutureDates && moment() < date || "Invalid Datetime" === this.value }, isValid: function(checkRequiredFields, conceptSetRequired) { if (this.isNumeric() && !this.isValidNumeric()) return !1; if (this.error) return !1; if (this.hidden) return !0; if (checkRequiredFields) { if (this.isGroup()) return this._hasValidChildren(checkRequiredFields, conceptSetRequired); if (conceptSetRequired && this.isRequired() && !this.hasValue()) return !1; if (this.isRequired() && !this.hasValue()) return !1 } return this._isDateDataType() ? this.isValidDate() : this._isDateTimeDataType() ? !this.hasInvalidDateTime() : !this.erroneousValue && ("autocomplete" !== this.getControlType() || (_.isEmpty(this.value) || _.isObject(this.value))) }, isValueInAbsoluteRange: function() { return !this.erroneousValue && (!this.isGroup() || this._areChildNodesInAbsoluteRange()) }, _isDateDataType: function() { return "Date" === this.getDataTypeName() }, _isDateTimeDataType: function() { return "Datetime" === this.getDataTypeName() }, isRequired: function() { return this.disabled = !!this.disabled && this.disabled, this.conceptUIConfig.required === !0 && this.disabled === !1 }, isFormElement: function() { return (!this.concept.set || this.isGrid()) && !this.isComputed() }, _hasValidChildren: function(checkRequiredFields, conceptSetRequired) { return this.groupMembers.every(function(member) { return member.isValid(checkRequiredFields, conceptSetRequired) }) }, _areChildNodesInAbsoluteRange: function() { return this.groupMembers.every(function(member) { return "function" != typeof member.isValueInAbsoluteRange || member.isValueInAbsoluteRange() }) }, markAsNonCoded: function() { this.markedAsNonCoded = !this.markedAsNonCoded }, toggleVoidingOfImage: function() { this.voided = !this.voided }, assignAddMoreButtonID: function() { return this.concept.name.split(" ").join("_").toLowerCase() + "_addmore_" + this.uniqueId } }, Bahmni.ConceptSet.MultiSelectObservations = function(conceptSetConfig) { var self = this; this.multiSelectObservationsMap = {}, this.map = function(memberOfCollection) { memberOfCollection.forEach(function(member) { isMultiSelectable(member.concept, conceptSetConfig) && add(member.concept, member, memberOfCollection) }), insertMultiSelectObsInExistingOrder(memberOfCollection) }; var isMultiSelectable = function(concept, conceptSetConfig) { return conceptSetConfig[concept.name] && conceptSetConfig[concept.name].multiSelect }, insertMultiSelectObsInExistingOrder = function(memberOfCollection) { getAll().forEach(function(multiObs) { var index = _.findIndex(memberOfCollection, function(member) { return member.concept.name === multiObs.concept.name }); memberOfCollection.splice(index, 0, multiObs) }) }, add = function(concept, obs, memberOfCollection) { var conceptName = concept.name.name || concept.name; self.multiSelectObservationsMap[conceptName] = self.multiSelectObservationsMap[conceptName] || new Bahmni.ConceptSet.MultiSelectObservation(concept, memberOfCollection, conceptSetConfig), self.multiSelectObservationsMap[conceptName].add(obs) }, getAll = function() { return _.values(self.multiSelectObservationsMap) } }, Bahmni.ConceptSet.MultiSelectObservation = function(concept, memberOfCollection, conceptSetConfig) { var self = this; this.label = concept.shortName || concept.name, this.isMultiSelect = !0, this.selectedObs = {}, this.concept = concept, this.concept.answers = this.concept.answers || [], this.groupMembers = [], this.provider = null, this.observationDateTime = "", this.conceptUIConfig = conceptSetConfig[this.concept.name] || {}, this.possibleAnswers = self.concept.answers.map(function(answer) { var cloned = _.cloneDeep(answer); return answer.name.name && (cloned.name = answer.name.name), cloned }), this.getPossibleAnswers = function() { return this.possibleAnswers }, this.cloneNew = function() { var clone = new Bahmni.ConceptSet.MultiSelectObservation(concept, memberOfCollection, conceptSetConfig); return clone.disabled = this.disabled, clone }, this.add = function(obs) { if (obs.value) { self.selectedObs[obs.value.name] = obs, self.provider || (self.provider = self.selectedObs[obs.value.name].provider); var currentObservationDateTime = self.selectedObs[obs.value.name].observationDateTime; self.observationDateTime < currentObservationDateTime && (self.observationDateTime = currentObservationDateTime) } obs.hidden = !0 }, this.isComputedAndEditable = function() { return "Computed/Editable" === this.concept.conceptClass }, this.hasValueOf = function(answer) { return self.selectedObs[answer.name] && !self.selectedObs[answer.name].voided }, this.toggleSelection = function(answer) { self.hasValueOf(answer) ? unselectAnswer(answer) : self.selectAnswer(answer) }, this.isFormElement = function() { return !0 }, this.getControlType = function() { var conceptConfig = this.getConceptUIConfig(); return this.isCoded() && 1 == conceptConfig.autocomplete && 1 == conceptConfig.multiSelect ? "autocompleteMultiSelect" : 1 == conceptConfig.autocomplete ? "autocomplete" : "buttonselect" }, this.atLeastOneValueSet = function() { var obsValue = _.filter(this.selectedObs, function(obs) { return obs.value }); return !_.isEmpty(obsValue) }, this.hasValue = function() { return !_.isEmpty(this.selectedObs) }, this.hasNonVoidedValue = function() { var hasNonVoidedValue = !1; return this.hasValue() && angular.forEach(this.selectedObs, function(obs) { obs.voided || (hasNonVoidedValue = !0) }), hasNonVoidedValue }, this.isValid = function(checkRequiredFields, conceptSetRequired) { if (this.error) return !1; if (checkRequiredFields) { if (conceptSetRequired && this.isRequired() && !this.hasNonVoidedValue()) return !1; if (this.isRequired() && !this.hasNonVoidedValue()) return !1 } return !0 }, this.canHaveComment = function() { return !1 }, this.getConceptUIConfig = function() { return this.conceptUIConfig || {} }, this.canAddMore = function() { return 1 == this.getConceptUIConfig().allowAddMore }, this.isRequired = function() { return this.disabled = !!this.disabled && this.disabled, this.getConceptUIConfig().required === !0 && this.disabled === !1 }; var createObsFrom = function(answer) { var obs = newObservation(concept, answer, conceptSetConfig); return memberOfCollection.push(obs), obs }, removeObsFrom = function(answer) { var obs = newObservation(concept, answer, conceptSetConfig); _.remove(memberOfCollection, function(member) { return !!member.value && obs.value.displayString == member.value.displayString }) }; this.selectAnswer = function(answer) { var obs = self.selectedObs[answer.name]; obs ? (obs.value = answer, obs.voided = !1) : (obs = createObsFrom(answer), self.add(obs)) }; var unselectAnswer = function(answer) { var obs = self.selectedObs[answer.name]; obs && obs.uuid ? (obs.value = null, obs.voided = !0) : (removeObsFrom(answer), delete self.selectedObs[answer.name]) }, newObservation = function(concept, value, conceptSetConfig) { var observation = buildObservation(concept); return new Bahmni.ConceptSet.Observation(observation, { value: value }, conceptSetConfig, []) }, buildObservation = function(concept) { return { concept: concept, units: concept.units, label: concept.shortName || concept.name, possibleAnswers: self.concept.answers, groupMembers: [], comment: null } }; this.getValues = function() { var values = []; return _.values(self.selectedObs).forEach(function(obs) { obs.value && values.push(obs.value.shortName || obs.value.name) }), values }, this.isComputed = function() { return "Computed" === this.concept.conceptClass }, this.getDataTypeName = function() { return this.concept.dataType }, this._isDateTimeDataType = function() { return "Datetime" === this.getDataTypeName() }, this.isNumeric = function() { return "Numeric" === this.getDataTypeName() }, this.isText = function() { return "Text" === this.getDataTypeName() }, this.isCoded = function() { return "Coded" === this.getDataTypeName() } }, Bahmni.ConceptSet.SpecimenTypeObservation = function(observation, allSamples) { angular.extend(this, observation), this.allSamples = allSamples, this.getPossibleAnswers = function() { return this.allSamples }, this.hasValueOf = function(answer) { return observation.type && observation.type.uuid === answer.uuid }, this.toggleSelection = function(answer) { this.hasValueOf(answer) ? observation.type = null : observation.type = answer } }, Bahmni.ConceptSet.BooleanObservation = function(observation, conceptUIConfig) { angular.extend(this, observation), this.isBoolean = !0, this.conceptUIConfig = conceptUIConfig[this.concept.name] || {}, this.cloneNew = function() { var clone = new Bahmni.ConceptSet.BooleanObservation(angular.copy(observation), conceptUIConfig); return clone.value = void 0, clone.comment = void 0, clone.uuid = null, clone.disabled = this.disabled, clone }; var possibleAnswers = [{ displayString: "OBS_BOOLEAN_YES_KEY", value: !0 }, { displayString: "OBS_BOOLEAN_NO_KEY", value: !1 }]; this.getPossibleAnswers = function() { return possibleAnswers }, this.hasValueOf = function(answer) { return this.value === answer.value }, this.toggleSelection = function(answer) { this.value === answer.value ? this.value = null : this.value = answer.value }, this.isFormElement = function() { return !0 }, this.getControlType = function() { return "buttonselect" }, this.isRequired = function() { return this.disabled = !!this.disabled && this.disabled, this.getConceptUIConfig().required === !0 && this.disabled === !1 }, this.isComputedAndEditable = function() { return "Computed/Editable" === this.concept.conceptClass }, this.atLeastOneValueSet = function() { return void 0 != this.value }, this.isValid = function(checkRequiredFields, conceptSetRequired) { if (this.error) return !1; var notYetSet = function(value) { return "undefined" == typeof value || null == value; }; if (checkRequiredFields) { if (conceptSetRequired && this.isRequired() && notYetSet(this.value)) return !1; if (this.isRequired() && notYetSet(this.value)) return !1 } return !0 }, this.canHaveComment = function() { return !this.getConceptUIConfig().disableAddNotes || !this.getConceptUIConfig().disableAddNotes }, this.getConceptUIConfig = function() { return this.conceptUIConfig }, this.canAddMore = function() { return 1 == this.getConceptUIConfig().allowAddMore }, this.isComputed = function() { return "Computed" === this.concept.conceptClass }, this.getDataTypeName = function() { return this.concept.dataType }, this.hasValue = function() { var value = this.value; return value === !1 || (0 === value || !("" === value || !value) && (!(value instanceof Array) || value.length > 0)) }, this.isNumeric = function() { return "Numeric" === this.getDataTypeName() }, this.isText = function() { return "Text" === this.getDataTypeName() }, this.isCoded = function() { return "Coded" === this.getDataTypeName() }, this._isDateTimeDataType = function() { return "Datetime" === this.getDataTypeName() } }, function() { var findObservationByClassName = function(groupMembers, conceptClassName) { return _.find(groupMembers, function(member) { return member.concept.conceptClass.name === conceptClassName || member.concept.conceptClass === conceptClassName }) }, findObservationByConceptName = function(groupMembers, conceptName) { return _.find(groupMembers, { concept: { name: conceptName } }) }, setNewObservation = function(observation, newValue) { observation && (observation.__prevValue = observation.value, observation.value = newValue, observation.voided = !1) }, voidObservation = function(observation) { observation && (observation.uuid ? observation.voided = !0 : observation.value = void 0) }, isFreeTextAutocompleteType = function(conceptUIConfig) { return conceptUIConfig.autocomplete && conceptUIConfig.nonCodedConceptName && conceptUIConfig.codedConceptName }; Bahmni.ConceptSet.ObservationNode = function(observation, savedObs, conceptUIConfig, concept) { angular.extend(this, observation), this.conceptUIConfig = conceptUIConfig[concept.name.name] || !_.isEmpty(concept.setMembers) && conceptUIConfig[concept.setMembers[0].name.name] || {}, this.cloneNew = function() { var oldObs = angular.copy(observation); oldObs.groupMembers = _.map(oldObs.groupMembers, function(member) { return member.cloneNew() }); var clone = new Bahmni.ConceptSet.ObservationNode(oldObs, null, conceptUIConfig, concept); return clone.comment = void 0, clone }; var getPrimaryObservationValue = function() { return this.primaryObs && _.get(this, "primaryObs.value.name") || _.get(this, "primaryObs.value") }, setFreeTextPrimaryObservationValue = function(newValue) { var codedObservation = findObservationByConceptName(this.groupMembers, this.conceptUIConfig.codedConceptName), nonCodedObservation = findObservationByConceptName(this.groupMembers, this.conceptUIConfig.nonCodedConceptName); "object" == typeof newValue ? (setNewObservation(codedObservation, newValue), voidObservation(nonCodedObservation), this.markedAsNonCoded = !1) : (setNewObservation(nonCodedObservation, newValue), voidObservation(codedObservation)), this.onValueChanged(newValue) }, setFirstObservationValue = function(newValue) { setNewObservation(this.primaryObs, newValue), this.onValueChanged(newValue) }; Object.defineProperty(this, "value", { enumerable: !0, get: getPrimaryObservationValue, set: isFreeTextAutocompleteType(this.conceptUIConfig) ? setFreeTextPrimaryObservationValue : setFirstObservationValue }); var getFreeTextPrimaryObservation = function() { var isAlreadySavedObservation = function(observation) { return _.isString(_.get(observation, "value")) && !_.get(observation, "voided") }, codedConceptObservation = findObservationByConceptName(this.groupMembers, this.conceptUIConfig.codedConceptName), nonCodedConceptObservation = findObservationByConceptName(this.groupMembers, this.conceptUIConfig.nonCodedConceptName); if (isAlreadySavedObservation(nonCodedConceptObservation)) return nonCodedConceptObservation; if (!codedConceptObservation) throw new Error("Configuration Error: Concept '" + this.conceptUIConfig.codedConceptName + "' is not a set member of '" + concept.name.name + "'."); return codedConceptObservation }, getGroupMembersWithoutClass = function(groupMembers, classNames) { return _.filter(groupMembers, function(member) { return !(_.includes(classNames, member.concept.conceptClass.name) || _.includes(classNames, member.concept.conceptClass)) }) }, getFirstObservation = function() { var observations = getGroupMembersWithoutClass(this.groupMembers, [Bahmni.Common.Constants.abnormalConceptClassName, Bahmni.Common.Constants.unknownConceptClassName, Bahmni.Common.Constants.durationConceptClassName]); if (_.isEmpty(observations)) return this.groupMembers[0]; var primaryObs = observations[1] && observations[1].uuid && !observations[1].voided ? observations[1] : observations[0]; return observations[0].isMultiSelect ? observations[0] : primaryObs.uuid && !primaryObs.voided ? primaryObs : !observations[1] || !observations[1].value && "" !== observations[1].value || observations[1].voided ? observations[0] : observations[1] }; Object.defineProperty(this, "primaryObs", { enumerable: !0, get: isFreeTextAutocompleteType(this.conceptUIConfig) ? getFreeTextPrimaryObservation : getFirstObservation }), this.isObservationNode = !0, this.uniqueId = _.uniqueId("observation_"), this.durationObs = findObservationByClassName(this.groupMembers, Bahmni.Common.Constants.durationConceptClassName), this.abnormalObs = findObservationByClassName(this.groupMembers, Bahmni.Common.Constants.abnormalConceptClassName), this.unknownObs = findObservationByClassName(this.groupMembers, Bahmni.Common.Constants.unknownConceptClassName), this.markedAsNonCoded = "Coded" !== this.primaryObs.concept.dataType && this.primaryObs.uuid, savedObs ? (this.uuid = savedObs.uuid, this.observationDateTime = savedObs.observationDateTime) : this.value = this.conceptUIConfig.defaultValue }, Bahmni.ConceptSet.ObservationNode.prototype = { canAddMore: function() { return 1 == this.conceptUIConfig.allowAddMore }, isStepperControl: function() { return !!this.isNumeric() && 1 == this.conceptUIConfig.stepper }, getPossibleAnswers: function() { return this.primaryObs.concept.answers }, getCodedConcept: function() { return findObservationByConceptName(this.groupMembers, this.conceptUIConfig.codedConceptName).concept }, onValueChanged: function() { !this.primaryObs.hasValue() && this.abnormalObs && (this.abnormalObs.value = void 0, this.abnormalObs.erroneousValue = void 0), this.primaryObs.isNumeric() && this.primaryObs.hasValue() && this.abnormalObs && this.setAbnormal(), this.primaryObs.observationDateTime = null, this.unknownObs && this.setUnknown() }, setAbnormal: function() { if (this.primaryObs.hasValue()) { var erroneousValue = this.value > (this.primaryObs.concept.hiAbsolute || 1 / 0) || this.value < (this.primaryObs.concept.lowAbsolute || 0), valueInRange = this.value <= (this.primaryObs.concept.hiNormal || 1 / 0) && this.value >= (this.primaryObs.concept.lowNormal || 0); this.abnormalObs.value = !valueInRange, this.abnormalObs.erroneousValue = erroneousValue } else this.abnormalObs.value = void 0, this.abnormalObs.erroneousValue = void 0 }, setUnknown: function() { this.primaryObs.atLeastOneValueSet() && this.primaryObs.hasValue() ? this.unknownObs.value = !1 : 0 == this.unknownObs.value && (this.unknownObs.value = void 0) }, displayValue: function() { if (!(this.possibleAnswers.length > 0)) return this.value; for (var i = 0; i < this.possibleAnswers.length; i++) if (this.possibleAnswers[i].uuid === this.value) return this.possibleAnswers[i].display }, isGroup: function() { return !1 }, getControlType: function() { return isFreeTextAutocompleteType(this.conceptUIConfig) ? "freeTextAutocomplete" : this.conceptUIConfig.autocomplete ? "autocomplete" : this.isHtml5InputDataType() ? "html5InputDataType" : this.primaryObs.isText() ? "text" : this.conceptUIConfig.dropdown ? "dropdown" : "buttonselect" }, isHtml5InputDataType: function() { return ["Date", "Numeric", "Datetime"].indexOf(this.primaryObs.getDataTypeName()) != -1 }, _isDateTimeDataType: function() { return "Datetime" === this.primaryObs.getDataTypeName() }, isComputed: function() { return this.primaryObs.isComputed() }, isConciseText: function() { return this.conceptUIConfig.conciseText === !0 }, isComputedAndEditable: function() { return "Computed/Editable" === this.concept.conceptClass }, atLeastOneValueSet: function() { return this.primaryObs.hasValue() }, doesNotHaveDuration: function() { return !(!this.durationObs || !this.conceptUIConfig.durationRequired) && (!this.durationObs.value || this.durationObs.value < 0) }, isValid: function(checkRequiredFields, conceptSetRequired) { if (this.isNumeric() && (!this.isValidNumeric() || !this.isValidNumericValue())) return !1; if (this.isGroup()) return this._hasValidChildren(checkRequiredFields, conceptSetRequired); if (checkRequiredFields) { if (conceptSetRequired && this.isRequired() && !this.primaryObs.hasValue()) return !1; if (this.isRequired() && !this.primaryObs.hasValue()) return !1; if ("freeTextAutocomplete" === this.getControlType()) return this.isValidFreeTextAutocomplete() } return "Date" === this.primaryObs.getDataTypeName() ? this.primaryObs.isValidDate() : (!this.primaryObs.hasValue() || !this.doesNotHaveDuration()) && ((!this.abnormalObs || !this.abnormalObs.erroneousValue) && (this.primaryObs.hasValue() && this.primaryObs._isDateTimeDataType() ? !this.hasInvalidDateTime() : "autocomplete" === this.getControlType() ? _.isEmpty(this.primaryObs.value) || _.isObject(this.primaryObs.value) : !this.primaryObs.hasValue() || !this.primaryObs.erroneousValue)) }, isValueInAbsoluteRange: function() { return !(this.abnormalObs && this.abnormalObs.erroneousValue) }, isValidFreeTextAutocomplete: function() { return !("Coded" !== this.primaryObs.concept.dataType && !this.markedAsNonCoded && this.primaryObs.value) }, isRequired: function() { return this.disabled = !!this.disabled && this.disabled, this.conceptUIConfig.required === !0 && this.disabled === !1 }, isDurationRequired: function() { return !!this.conceptUIConfig.durationRequired && !!this.primaryObs.value }, isNumeric: function() { return "Numeric" === this.primaryObs.getDataTypeName() }, isDecimalAllowed: function() { return this.primaryObs.concept.allowDecimal }, isValidNumeric: function() { return !(!this.isDecimalAllowed() && this.value && this.value.toString().indexOf(".") >= 0) }, isValidNumericValue: function() { var element = document.getElementById(this.uniqueId); return "" !== this.value || !element || element.checkValidity() }, _hasValidChildren: function(checkRequiredFields, conceptSetRequired) { return this.groupMembers.every(function(member) { return member.isValid(checkRequiredFields, conceptSetRequired) }) }, markAsNonCoded: function() { this.markedAsNonCoded = !this.markedAsNonCoded }, toggleAbnormal: function() { this.abnormalObs.value = !this.abnormalObs.value }, toggleUnknown: function() { this.unknownObs.value ? this.unknownObs.value = void 0 : this.unknownObs.value = !0 }, assignAddMoreButtonID: function() { return this.concept.name.split(" ").join("_").toLowerCase() + "_addmore_" + this.uniqueId }, canHaveComment: function() { return !this.conceptUIConfig.disableAddNotes || !this.conceptUIConfig.disableAddNotes }, hasInvalidDateTime: function() { if (this.isComputed()) return !1; var date = Bahmni.Common.Util.DateUtil.parse(this.value); return !this.conceptUIConfig.allowFutureDates && moment() < date || "Invalid Datetime" === this.value } } }(), Bahmni.ConceptSet.TabularObservations = function(obsGroups, parentObs, conceptUIConfig) { this.parentObs = parentObs, this.concept = obsGroups[0] && obsGroups[0].concept, this.label = obsGroups[0] && obsGroups[0].label, this.conceptUIConfig = conceptUIConfig[this.concept.name] || {}, this.isTabularObs = !0, this.rows = _.map(obsGroups, function(group) { return new Bahmni.ConceptSet.ObservationRow(group, conceptUIConfig) }), this.columns = _.map(obsGroups[0].groupMembers, function(group) { return group.concept }), this.cloneNew = function() { var old = this, clone = new Bahmni.ConceptSet.TabularObservations(angular.copy(obsGroups), parentObs, conceptUIConfig); return clone.rows = _.map(old.rows, function(row) { return row.cloneNew() }), clone.disabled = this.disabled, clone }, this.addNew = function(row) { var newRow = row.cloneNew(); this.rows.push(newRow), this.parentObs.groupMembers.push(newRow.obsGroup) }, this.remove = function(row) { row["void"](), this.rows.splice(this.rows.indexOf(row), 1), 0 == this.rows.length && this.addNew(row) }, this.isFormElement = function() { return !1 }, this.getControlType = function() { return "tabular" }, this.isValid = function(checkRequiredFields, conceptSetRequired) { return _.every(this.rows, function(observationRow) { return _.every(observationRow.cells, function(conceptSetObservation) { return conceptSetObservation.isValid(checkRequiredFields, conceptSetRequired) }) }) }, this.getConceptUIConfig = function() { return this.conceptUIConfig || {} }, this.canAddMore = function() { return 1 == this.getConceptUIConfig().allowAddMore }, this.atLeastOneValueSet = function() { return this.rows.some(function(childNode) { return childNode.obsGroup.atLeastOneValueSet() }) }, this.isNumeric = function() { return "Numeric" === this.concept.dataType }, this.isValidNumericValue = function() { var element = document.getElementById(this.uniqueId); return "" !== this.value || !element || element.checkValidity() } }, Bahmni.ConceptSet.ObservationRow = function(obsGroup, conceptUIConfig) { this.obsGroup = obsGroup, this.concept = obsGroup.concept, this.cells = obsGroup.groupMembers, this["void"] = function() { this.obsGroup.voided = !0 }, this.cloneNew = function() { var newObsGroup = this.obsGroup.cloneNew(); newObsGroup.hidden = !0; var clone = new Bahmni.ConceptSet.ObservationRow(newObsGroup, conceptUIConfig); return clone.disabled = this.disabled, clone } }, Bahmni.ConceptSet.CustomRepresentationBuilder = { build: function(fields, childPropertyName, numberOfLevels) { for (var childPropertyRep = childPropertyName + ":{{entity_fileds}}", singleEntityString = "(" + fields.concat(childPropertyRep).join(",") + ")", customRepresentation = singleEntityString, i = 0; i < numberOfLevels; i++) customRepresentation = customRepresentation.replace("{{entity_fileds}}", singleEntityString); return customRepresentation = customRepresentation.replace("," + childPropertyRep, "") } }, Bahmni.ObservationForm = function(formUuid, user, formName, formVersion, observations, extension) { function hide() { self.isOpen = !1 } function show() { self.isOpen = !0 } var self = this, init = function() { self.formUuid = formUuid, self.formVersion = formVersion, self.formName = formName, self.label = formName, self.conceptName = formName, self.collapseInnerSections = { value: !1 }, self.alwaysShow = user.isFavouriteObsTemplate(self.conceptName), self.observations = [], _.each(observations, function(observation) { var observationFormField = observation.formFieldPath ? observation.formFieldPath.split("/")[0].split(".") : null; observationFormField && observationFormField[0] === formName && observationFormField[1] === formVersion && self.observations.push(observation) }), self.isOpen = self.observations.length > 0, self.id = "concept-set-" + formUuid, self.options = extension ? extension.extensionParams || {} : {} }; self.toggleDisplay = function() { self.isOpen ? hide() : show() }, self.clone = function() { var clonedObservationFormSection = new Bahmni.ObservationForm(self.formUuid, user, self.formName, self.formVersion, []); return clonedObservationFormSection.isOpen = !0, clonedObservationFormSection }, self.isAvailable = function(context) { return !0 }, self.show = function() { self.isOpen = !0, self.isLoaded = !0 }, self.toggle = function() { self.added = !self.added, self.added && self.show() }, self.hasSomeValue = function() { var observations = self.getObservationsForConceptSection(); return _.some(observations, function(observation) { return atLeastOneValueSet(observation) }) }, self.getObservationsForConceptSection = function() { return self.observations.filter(function(observation) { return observation.formFieldPath.split(".")[0] === self.formName }) }; var atLeastOneValueSet = function(observation) { return observation.groupMembers && observation.groupMembers.length > 0 ? observation.groupMembers.some(function(groupMember) { return atLeastOneValueSet(groupMember) }) : !(_.isUndefined(observation.value) || "" === observation.value) }; self.isDefault = function() { return !1 }, Object.defineProperty(self, "isAdded", { get: function() { return self.hasSomeValue() && (self.added = !0), self.added }, set: function(value) { self.added = value } }), self.maximizeInnerSections = function(event) { event.stopPropagation(), self.collapseInnerSections = { value: !1 } }, self.minimizeInnerSections = function(event) { event.stopPropagation(), self.collapseInnerSections = { value: !0 } }, init() }, Bahmni.ConceptSet.ObservationMapper = function() { function mapTabularObs(mappedGroupMembers, concept, obs, conceptSetConfig) { var tabularObsGroups = _.filter(mappedGroupMembers, function(member) { return conceptSetConfig[member.concept.name] && conceptSetConfig[member.concept.name].isTabular }); if (tabularObsGroups.length > 0) { var array = _.map(concept.setMembers, function(member) { return member.name.name }); tabularObsGroups.forEach(function(group) { group.hidden = !0 }); var groupedObsGroups = _.groupBy(tabularObsGroups, function(group) { return group.concept.name }); _.values(groupedObsGroups).forEach(function(groups) { var tabularObservations = new Bahmni.ConceptSet.TabularObservations(groups, obs, conceptSetConfig); obs.groupMembers.push(tabularObservations) }); var sortedGroupMembers = _.sortBy(obs.groupMembers, function(observation) { return array.indexOf(observation.concept.name) }); obs.groupMembers.length = 0, obs.groupMembers.push.apply(obs.groupMembers, sortedGroupMembers) } } function buildObservation(concept, savedObs, mappedGroupMembers) { var comment = savedObs ? savedObs.comment : null; return { concept: conceptMapper.map(concept), units: concept.units, label: getLabel(concept), possibleAnswers: concept.answers, groupMembers: mappedGroupMembers, comment: comment, showAddMoreButton: showAddMoreButton } } var conceptMapper = new Bahmni.Common.Domain.ConceptMapper, self = this; this.getObservationsForView = function(observations, conceptSetConfig) { return internalMapForDisplay(observations, conceptSetConfig) }; var internalMapForDisplay = function(observations, conceptSetConfig) { var observationsForDisplay = []; return _.forEach(observations, function(savedObs) { if (!savedObs.concept.conceptClass || savedObs.concept.conceptClass !== Bahmni.Common.Constants.conceptDetailsClassName && savedObs.concept.conceptClass.name !== Bahmni.Common.Constants.conceptDetailsClassName) if (savedObs.concept.set) if (conceptSetConfig[savedObs.concept.name] && conceptSetConfig[savedObs.concept.name].grid) savedObs.value = self.getGridObservationDisplayValue(savedObs), observationsForDisplay = observationsForDisplay.concat(createObservationForDisplay(savedObs, savedObs.concept)); else { var groupMemberObservationsForDisplay = internalMapForDisplay(savedObs.groupMembers, conceptSetConfig); observationsForDisplay = observationsForDisplay.concat(groupMemberObservationsForDisplay) } else { var obsToDisplay = null; if (savedObs.isMultiSelect) obsToDisplay = savedObs; else if (!savedObs.hidden) { var observation = newObservation(savedObs.concept, savedObs, []); obsToDisplay = createObservationForDisplay(observation, observation.concept) } obsToDisplay && observationsForDisplay.push(obsToDisplay) } else { var observationNode = new Bahmni.ConceptSet.ObservationNode(savedObs, savedObs, [], savedObs.concept), obsToDisplay = createObservationForDisplay(observationNode, observationNode.primaryObs.concept); obsToDisplay && observationsForDisplay.push(obsToDisplay) } }), observationsForDisplay }; this.map = function(observations, rootConcept, conceptSetConfig) { var savedObs = findInSavedObservation(rootConcept, observations)[0]; return mapObservation(rootConcept, savedObs, conceptSetConfig || {}) }; var findInSavedObservation = function(concept, observations) { return _.filter(observations, function(obs) { return obs && obs.concept && concept.uuid === obs.concept.uuid }) }, mapObservation = function(concept, savedObs, conceptSetConfig) { var obs = null; if (savedObs && (savedObs.isObservation || savedObs.isObservationNode)) return savedObs; var mappedGroupMembers = concept && concept.set ? mapObservationGroupMembers(savedObs ? savedObs.groupMembers : [], concept, conceptSetConfig) : []; return concept.conceptClass.name === Bahmni.Common.Constants.conceptDetailsClassName ? obs = newObservationNode(concept, savedObs, conceptSetConfig, mappedGroupMembers) : (obs = newObservation(concept, savedObs, conceptSetConfig, mappedGroupMembers), new Bahmni.ConceptSet.MultiSelectObservations(conceptSetConfig).map(mappedGroupMembers)), mapTabularObs(mappedGroupMembers, concept, obs, conceptSetConfig), obs }, mapObservationGroupMembers = function(observations, parentConcept, conceptSetConfig) { var observationGroupMembers = [], conceptSetMembers = parentConcept.setMembers; return conceptSetMembers.forEach(function(memberConcept) { for (var savedObservations = findInSavedObservation(memberConcept, observations), configForConcept = conceptSetConfig[memberConcept.name.name] || {}, numberOfNodes = configForConcept.multiple || 1, i = savedObservations.length - 1; i >= 0; i--) observationGroupMembers.push(mapObservation(memberConcept, savedObservations[i], conceptSetConfig)); for (var i = 0; i < numberOfNodes - savedObservations.length; i++) observationGroupMembers.push(mapObservation(memberConcept, null, conceptSetConfig)) }), observationGroupMembers }, getDatatype = function(concept) { return concept.dataType ? concept.dataType : concept.datatype && concept.datatype.name }, newObservation = function(concept, savedObs, conceptSetConfig, mappedGroupMembers) { var observation = buildObservation(concept, savedObs, mappedGroupMembers), obs = new Bahmni.ConceptSet.Observation(observation, savedObs, conceptSetConfig, mappedGroupMembers); return "Boolean" == getDatatype(concept) && (obs = new Bahmni.ConceptSet.BooleanObservation(obs, conceptSetConfig)), obs }, newObservationNode = function(concept, savedObsNode, conceptSetConfig, mappedGroupMembers) { var observation = buildObservation(concept, savedObsNode, mappedGroupMembers); return new Bahmni.ConceptSet.ObservationNode(observation, savedObsNode, conceptSetConfig, concept) }, showAddMoreButton = function(rootObservation) { var observation = this, lastObservationByLabel = _.findLast(rootObservation.groupMembers, { label: observation.label }); return lastObservationByLabel.uuid === observation.uuid }, createObservationForDisplay = function(observation, concept) { if (null != observation.value) { var observationValue = getObservationDisplayValue(observation); return observationValue = observation.durationObs ? observationValue + " " + getDurationDisplayValue(observation.durationObs) : observationValue, { value: observationValue, abnormalObs: observation.abnormalObs, duration: observation.durationObs, provider: observation.provider, label: getLabel(observation.concept), observationDateTime: observation.observationDateTime, concept: concept, comment: observation.comment, uuid: observation.uuid } } }, getObservationDisplayValue = function(observation) { if (observation.isBoolean || "Boolean" === observation.type) return observation.value === !0 ? "Yes" : "No"; if (!observation.value) return ""; if ("object" == typeof observation.value.name) { var valueConcept = conceptMapper.map(observation.value); return valueConcept.shortName || valueConcept.name } return observation.value.shortName || observation.value.name || observation.value }, getDurationDisplayValue = function(duration) { var durationForDisplay = Bahmni.Common.Util.DateUtil.convertToUnits(duration.value); return durationForDisplay.value && durationForDisplay.unitName ? "since " + durationForDisplay.value + " " + durationForDisplay.unitName : "" }; this.getGridObservationDisplayValue = function(observation) { var memberValues = _.compact(_.map(observation.groupMembers, function(member) { return getObservationDisplayValue(member) })); return memberValues.join(", ") }; var getLabel = function(concept) { var mappedConcept = conceptMapper.map(concept); return mappedConcept.shortName || mappedConcept.name } }, angular.module("bahmni.common.conceptSet").factory("conceptService", ["$q", "$http", function($q, $http) { var conceptMapper = new Bahmni.Common.Domain.ConceptMapper, mapConceptOrGetDrug = function(conceptAnswer) { return conceptAnswer.concept && conceptMapper.map(conceptAnswer.concept) || conceptAnswer.drug }, getAnswersForConceptName = function(request) { var params = { q: request.term, question: request.answersConceptName, v: "custom:(concept:(uuid,name:(display,uuid,name,conceptNameType),names:(display,uuid,name,conceptNameType)),drug:(uuid,name,display))", s: "byQuestion" }; return $http.get(Bahmni.Common.Constants.bahmniConceptAnswerUrl, { params: params }).then(_.partial(_.get, _, "data.results")).then(function(conceptAnswers) { return _(conceptAnswers).map(mapConceptOrGetDrug).uniqBy("uuid").value() }) }, getAnswers = function(defaultConcept) { var deferred = $q.defer(), response = _(defaultConcept.answers).uniqBy("uuid").map(conceptMapper.map).value(); return deferred.resolve(response), deferred.promise }; return { getAnswersForConceptName: getAnswersForConceptName, getAnswers: getAnswers } }]), angular.module("bahmni.common.conceptSet").factory("conceptSetUiConfigService", ["$http", "$q", "appService", function($http, $q, appService) { var setConceptUuidInsteadOfName = function(config, conceptNameField, uuidField) { var conceptName = config[conceptNameField]; if (null != conceptName) return $http.get(Bahmni.Common.Constants.conceptSearchByFullNameUrl, { params: { name: conceptName, v: "custom:(uuid,name)" } }).then(function(response) { var concept = response.data.results.filter(function(c) { return c.name.name === conceptName }); concept.length > 0 && (config[uuidField] = concept[0].uuid) }) }, setExtraData = function(config) { Object.getOwnPropertyNames(config).forEach(function(conceptConfigKey) { var conceptConfig = config[conceptConfigKey]; conceptConfig.freeTextAutocomplete instanceof Object && (setConceptUuidInsteadOfName(conceptConfig.freeTextAutocomplete, "codedConceptName", "codedConceptUuid"), setConceptUuidInsteadOfName(conceptConfig.freeTextAutocomplete, "conceptSetName", "conceptSetUuid")) }) }, getConfig = function() { var config = appService.getAppDescriptor().getConfigValue("conceptSetUI") || {}; return setExtraData(config), config }; return { getConfig: getConfig } }]), angular.module("bahmni.common.conceptSet").directive("imageUpload", ["visitDocumentService", "messagingService", "spinner", function(visitDocumentService, messagingService, spinner) { var link = function(scope, element) { element.bind("change", function() { var file = element[0].files[0], reader = new FileReader; reader.onload = function(event) { var image = event.target.result, fileType = scope.fileType || visitDocumentService.getFileType(file.type); "not_supported" !== fileType ? spinner.forPromise(visitDocumentService.saveFile(image, scope.patientUuid, void 0, file.name, fileType).then(function(response) { scope.url = response.data.url, element.val(null), "video" !== fileType && (scope.observation.conceptUIConfig.required = !1, cloneNew(scope.observation, scope.rootObservation)) })) : (messagingService.showMessage("error", "File type is not supported"), scope.$$phase || scope.$apply()) }, reader.readAsDataURL(file) }); var cloneNew = function(observation, parentObservation) { var newObs = observation.cloneNew(); newObs.scrollToElement = !0; var index = parentObservation.groupMembers.indexOf(observation); parentObservation.groupMembers.splice(index + 1, 0, newObs), messagingService.showMessage("info", "A new " + observation.label + " section has been added"), scope.$root.$broadcast("event:addMore", newObs) } }; return { restrict: "A", require: "ngModel", scope: { url: "=ngModel", patientUuid: "=", fileType: "=", observation: "=", rootObservation: "=" }, link: link } }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.Logging = Bahmni.Common.Logging || {}, angular.module("bahmni.common.logging", []), angular.module("bahmni.common.logging").config(["$provide", function($provide) { $provide.decorator("$exceptionHandler", function($delegate, $injector, $window, $log) { var logError = function(exception, cause) { try { var messagingService = $injector.get("messagingService"), loggingService = $injector.get("loggingService"), errorMessage = exception.toString(), stackTrace = printStackTrace({ e: exception }), errorDetails = { timestamp: new Date, browser: $window.navigator.userAgent, errorUrl: $window.location.href, errorMessage: errorMessage, stackTrace: stackTrace, cause: cause || "" }; loggingService.log(errorDetails), messagingService.showMessage("error", errorMessage), exposeException(errorDetails) } catch (loggingError) { $log.warn("Error logging failed"), $log.log(loggingError) } }, exposeException = function(exceptionDetails) { window.angular_exception = window.angular_exception || [], window.angular_exception.push(exceptionDetails) }; return function(exception, cause) { $delegate(exception, cause), logError(exception, cause) } }) }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.Obs = Bahmni.Common.Obs || {}, angular.module("bahmni.common.obs", []), Bahmni.Common.Obs.Observation = function() { var Observation = function(obs, conceptConfig) { angular.extend(this, obs), this.concept = obs.concept, this.conceptConfig = conceptConfig }; return Observation.prototype = { isFormElement: function() { return this.groupMembers && this.groupMembers.length <= 0 }, isImageConcept: function() { return "Image" === this.concept.conceptClass }, isVideoConcept: function() { return "Video" === this.concept.conceptClass }, hasPDFAsValue: function() { return this.value.indexOf(".pdf") > 0 }, isComplexConcept: function() { return "Complex" === this.concept.dataType }, getComplexDataType: function() { return this.complexData ? this.complexData.dataType : null }, isLocationRef: function() { return this.isComplexConcept() && "Location" === this.getComplexDataType() }, isProviderRef: function() { return this.isComplexConcept() && "Provider" === this.getComplexDataType() }, getDisplayValue: function() { var value; if ("Boolean" === this.type || this.concept && "Boolean" === this.concept.dataType) return this.value === !0 ? "OBS_BOOLEAN_YES_KEY" : "OBS_BOOLEAN_NO_KEY"; if ("Datetime" === this.type || this.concept && "Datetime" === this.concept.dataType) { var date = Bahmni.Common.Util.DateUtil.parseDatetime(this.value); return null != date ? Bahmni.Common.Util.DateUtil.formatDateWithTime(date) : "" } if (this.conceptConfig && this.conceptConfig.displayMonthAndYear && (value = Bahmni.Common.Util.DateUtil.getDateInMonthsAndYears(this.value), null != value)) return value; if ("Date" === this.type || this.concept && "Date" === this.concept.dataType) return this.value ? Bahmni.Common.Util.DateUtil.formatDateWithoutTime(this.value) : ""; if (this.isLocationRef()) return this.complexData.display; if (this.isProviderRef()) return this.complexData.display; value = this.value; var displayValue = value && (value.shortName || value.name && (value.name.name || value.name) || value); return this.duration && (displayValue = displayValue + " " + this.getDurationDisplayValue()), displayValue }, getDurationDisplayValue: function() { var durationForDisplay = Bahmni.Common.Util.DateUtil.convertToUnits(this.duration); return "since " + durationForDisplay.value + " " + durationForDisplay.unitName } }, Observation }(), Bahmni.Common.Obs.MultiSelectObservation = function() { var MultiSelectObservation = function(groupMembers, conceptConfig) { this.type = "multiSelect", this.concept = groupMembers[0].concept, this.encounterDateTime = groupMembers[0].encounterDateTime, this.groupMembers = groupMembers, this.conceptConfig = conceptConfig, this.observationDateTime = getLatestObservationDateTime(this.groupMembers), this.providers = groupMembers[0].providers, this.creatorName = groupMembers[0].creatorName }, getLatestObservationDateTime = function(groupMembers) { var latestObservationDateTime = groupMembers[0].observationDateTime; return groupMembers.forEach(function(member) { latestObservationDateTime = latestObservationDateTime < member.observationDateTime ? member.observationDateTime : latestObservationDateTime }), latestObservationDateTime }; return MultiSelectObservation.prototype = { isFormElement: function() { return !0 }, getDisplayValue: function() { var getName = Bahmni.Common.Domain.ObservationValueMapper.getNameFor.Object; return _.map(this.groupMembers, getName).join(", ") } }, MultiSelectObservation }(), Bahmni.Common.Obs.GridObservation = function() { var conceptMapper = new Bahmni.Common.Domain.ConceptMapper, GridObservation = function(obs, conceptConfig) { angular.extend(this, obs), this.type = "grid", this.conceptConfig = conceptConfig }, getObservationDisplayValue = function(observation) { if (observation.isBoolean || "Boolean" === observation.type) return observation.value === !0 ? "OBS_BOOLEAN_YES_KEY" : "OBS_BOOLEAN_NO_KEY"; if (!observation.value) return ""; if ("object" == typeof observation.value.name) { var valueConcept = conceptMapper.map(observation.value); return valueConcept.shortName || valueConcept.name } return observation.value.shortName || observation.value.name || observation.value }; return GridObservation.prototype = { isFormElement: function() { return !0 }, getDisplayValue: function() { var gridObservationDisplayValue = _.compact(_.map(this.groupMembers, function(member) { return getObservationDisplayValue(member) })).join(", "); return gridObservationDisplayValue || this.value } }, GridObservation }(), Bahmni.Common.Obs.ImageObservation = function(observation, concept, provider) { this.concept = concept, this.imageObservation = observation, this.dateTime = observation.observationDateTime, this.provider = provider }, Bahmni.Common.Obs.ObservationMapper = function() { var conceptMapper = new Bahmni.Common.Domain.ConceptMapper; this.map = function(bahmniObservations, allConceptsConfig, dontSortByObsDateTime) { var mappedObservations = mapObservations(bahmniObservations, allConceptsConfig, dontSortByObsDateTime); return mapUIObservations(mappedObservations, allConceptsConfig) }; var mapObservations = function(bahmniObservations, allConceptsConfig, dontSortByObsDateTime) { var mappedObservations = []; return bahmniObservations = dontSortByObsDateTime ? _.flatten(bahmniObservations) : Bahmni.Common.Obs.ObservationUtil.sortSameConceptsWithObsDateTime(bahmniObservations), $.each(bahmniObservations, function(i, bahmniObservation) { var conceptConfig = allConceptsConfig[bahmniObservation.concept.name] || [], observation = new Bahmni.Common.Obs.Observation(bahmniObservation, conceptConfig); observation.groupMembers && observation.groupMembers.length >= 0 && (observation.groupMembers = mapObservations(observation.groupMembers, allConceptsConfig, dontSortByObsDateTime)), mappedObservations.push(observation) }), mappedObservations }, mapUIObservations = function(observations, allConceptsConfig) { var groupedObservations = _.groupBy(observations, function(observation) { return observation.concept.name }), mappedObservations = []; return $.each(groupedObservations, function(i, obsGroup) { var conceptConfig = allConceptsConfig[obsGroup[0].concept.name] || []; if (conceptConfig.multiSelect) { var multiSelectObservations = {}; $.each(obsGroup, function(i, observation) { if (multiSelectObservations[observation.encounterDateTime]) multiSelectObservations[observation.encounterDateTime].push(observation); else { var observations = []; observations.push(observation), multiSelectObservations[observation.encounterDateTime] = observations } }), $.each(multiSelectObservations, function(i, observations) { mappedObservations.push(new Bahmni.Common.Obs.MultiSelectObservation(observations, conceptConfig)) }) } else conceptConfig.grid ? mappedObservations.push(new Bahmni.Common.Obs.GridObservation(obsGroup[0], conceptConfig)) : $.each(obsGroup, function(i, obs) { obs.groupMembers = mapUIObservations(obs.groupMembers, allConceptsConfig), mappedObservations.push(obs) }) }), mappedObservations }; this.getGridObservationDisplayValue = function(observationTemplate) { var memberValues = _.compact(_.map(observationTemplate.bahmniObservations, function(observation) { return getObservationDisplayValue(observation) })); return memberValues.join(", ") }; var getObservationDisplayValue = function(observation) { if (observation.isBoolean || "Boolean" === observation.type) return observation.value === !0 ? "Yes" : "No"; if (!observation.value) return ""; if ("object" == typeof observation.value.name) { var valueConcept = conceptMapper.map(observation.value); return valueConcept.shortName || valueConcept.name } return observation.value.shortName || observation.value.name || observation.value } }, Bahmni.Common.Obs.ObservationUtil = function() { var sortSameConceptsWithObsDateTime = function(observation) { for (var sortedObservations = [], i = 0; i < observation.length; i++) if (i !== observation.length - 1) if (observation[i].conceptUuid !== observation[i + 1].conceptUuid) sortedObservations.push(observation[i]); else { var sameConceptsSubArray = [], j = i + 1; for (sameConceptsSubArray.push(observation[i]); j < observation.length && observation[i].conceptUuid === observation[j].conceptUuid;) sameConceptsSubArray.push(observation[j++]); sameConceptsSubArray = _.sortBy(sameConceptsSubArray, "observationDateTime"), sortedObservations.push(sameConceptsSubArray), i = j - 1 } else sortedObservations.push(observation[i]); return _.flatten(sortedObservations) }, getValue = function(observation) { if (observation.selectedObs) return observation.getValues(); var obsValue; return obsValue = observation.value && observation.value.name && observation.value.name.name ? observation.value.name.name : observation.value && observation.value.name && !observation.value.name.name ? observation.value.name : observation.value, void 0 === obsValue || null === obsValue ? obsValue : obsValue.displayString || obsValue }, collect = function(flattenedObservations, key, value) { void 0 != value && (flattenedObservations[key] = flattenedObservations[key] ? _.uniq(_.flatten(_.union([flattenedObservations[key]], [value]))) : value) }, findLeafObservations = function(flattenedObservations, observation) { _.isEmpty(observation.groupMembers) ? collect(flattenedObservations, observation.concept.name, getValue(observation)) : _.each(observation.groupMembers, function(member) { findLeafObservations(flattenedObservations, member) }) }, flatten = function(observation) { var flattenedObservation = {}; return _.isEmpty(observation) || findLeafObservations(flattenedObservation, observation), flattenedObservation }, flattenObsToArray = function(observations) { var flattened = []; return flattened.push.apply(flattened, observations), observations.forEach(function(obs) { obs.groupMembers && obs.groupMembers.length > 0 && flattened.push.apply(flattened, flattenObsToArray(obs.groupMembers)) }), flattened }; return { sortSameConceptsWithObsDateTime: sortSameConceptsWithObsDateTime, flatten: flatten, flattenObsToArray: flattenObsToArray } }(), angular.module("bahmni.common.obs").directive("showObservation", ["ngDialog", function(ngDialog) { var controller = function($scope, $rootScope, $filter) { $scope.toggle = function(observation) { observation.showDetails = !observation.showDetails }, $scope.print = $rootScope.isBeingPrinted || !1, $scope.dateString = function(observation) { var filterName; if ($scope.showDate && $scope.showTime) filterName = "bahmniDateTime"; else { if ($scope.showDate || !$scope.showTime && void 0 !== $scope.showTime) return null; filterName = "bahmniTime" } return $filter(filterName)(observation.observationDateTime) }, $scope.openVideoInPopup = function(observation) { ngDialog.open({ template: "../common/obs/views/showVideo.html", closeByDocument: !1, className: "ngdialog-theme-default", showClose: !0, data: { observation: observation } }) } }; return { restrict: "E", scope: { observation: "=?", patient: "=", showDate: "=?", showTime: "=?", showDetailsButton: "=?" }, controller: controller, template: "" } }]), angular.module("bahmni.common.obs").directive("editObservation", ["$q", "spinner", "$state", "$rootScope", "ngDialog", "messagingService", "encounterService", "configurations", "contextChangeHandler", "auditLogService", function($q, spinner, $state, $rootScope, ngDialog, messagingService, encounterService, configurations, contextChangeHandler, auditLogService) { var controller = function($scope) { var ObservationUtil = Bahmni.Common.Obs.ObservationUtil, findEditableObs = function(observations) { return _.find(observations, function(obs) { return obs.uuid === $scope.observation.uuid }) }, shouldEditSpecificObservation = function() { return !!$scope.observation.uuid }, contextChange = function() { return contextChangeHandler.execute() }, init = function() { var consultationMapper = new Bahmni.ConsultationMapper(configurations.dosageFrequencyConfig(), configurations.dosageInstructionConfig(), configurations.consultationNoteConcept(), configurations.labOrderNotesConcept()); return encounterService.findByEncounterUuid($scope.observation.encounterUuid).then(function(reponse) { var encounterTransaction = reponse.data; if ($scope.encounter = consultationMapper.map(encounterTransaction), $scope.editableObservations = [], shouldEditSpecificObservation()) { var editableObs = findEditableObs(ObservationUtil.flattenObsToArray($scope.encounter.observations)); editableObs ? $scope.editableObservations.push(editableObs) : messagingService.showMessage("error", "{{'CLINICAL_FORM_EDIT_ERROR_MESSAGE_KEY' | translate}}") } else $scope.editableObservations = $scope.encounter.observations; $scope.patient = { uuid: $scope.encounter.patientUuid } }) }; spinner.forPromise(init()); var isFormValid = function() { var contxChange = contextChange(), shouldAllow = contxChange.allow; if (!shouldAllow) { var errorMessage = contxChange.errorMessage ? contxChange.errorMessage : "{{'CLINICAL_FORM_ERRORS_MESSAGE_KEY' | translate }}"; messagingService.showMessage("error", errorMessage) } return shouldAllow }; $scope.$parent.resetContextChangeHandler = function() { contextChangeHandler.reset() }, $scope.save = function() { if (!isFormValid()) return void $scope.$parent.$parent.$broadcast("event:errorsOnForm"); $scope.$parent.shouldPromptBeforeClose = !1, $scope.$parent.shouldPromptBrowserReload = !1; var updateEditedObservation = function(observations) { return _.map(observations, function(obs) { return obs.uuid == $scope.editableObservations[0].uuid ? $scope.editableObservations[0] : (obs.groupMembers = updateEditedObservation(obs.groupMembers), obs) }) }, getEditedObservation = function(observations) { return _.find(observations, function(obs) { return obs.uuid == $scope.editableObservations[0].uuid || getEditedObservation(obs.groupMembers) }) }; if (shouldEditSpecificObservation()) { var allObservations = updateEditedObservation($scope.encounter.observations); $scope.encounter.observations = [getEditedObservation(allObservations)] } $scope.encounter.observations = (new Bahmni.Common.Domain.ObservationFilter).filter($scope.encounter.observations), $scope.encounter.orders = addOrdersToEncounter(), $scope.encounter.extensions = {}; var createPromise = encounterService.create($scope.encounter); spinner.forPromise(createPromise).then(function(savedResponse) { var messageParams = { encounterUuid: savedResponse.data.encounterUuid, encounterType: savedResponse.data.encounterType }; auditLogService.log($scope.patient.uuid, "EDIT_ENCOUNTER", messageParams, "MODULE_LABEL_CLINICAL_KEY"), $rootScope.hasVisitedConsultation = !1, $state.go($state.current, {}, { reload: !0 }), ngDialog.close(), messagingService.showMessage("info", "{{'CLINICAL_SAVE_SUCCESS_MESSAGE_KEY' | translate}}") }) }; var addOrdersToEncounter = function() { var modifiedOrders = _.filter($scope.encounter.orders, function(order) { return order.hasBeenModified || order.isDiscontinued || !order.uuid }), tempOrders = modifiedOrders.map(function(order) { return order.hasBeenModified && !order.isDiscontinued ? Bahmni.Clinical.Order.revise(order) : order.isDiscontinued ? Bahmni.Clinical.Order.discontinue(order) : { uuid: order.uuid, concept: { name: order.concept.name, uuid: order.concept.uuid }, commentToFulfiller: order.commentToFulfiller } }); return tempOrders } }; return { restrict: "E", scope: { observation: "=", conceptSetName: "@", conceptDisplayName: "@" }, controller: controller, template: "" } }]), angular.module("bahmni.common.uiHelper").directive("autoScroll", ["$location", "$anchorScroll", "$timeout", function($location, $anchorScroll, $timeout) { var heightOfNavigationBar = 55; return { scope: { autoScrollEnabled: "=" }, link: function(scope, element, attrs) { $timeout(function() { scope.autoScrollEnabled && $("body").animate({ scrollTop: $("#" + attrs.autoScroll).offset().top - heightOfNavigationBar }, 500) }), scope.$on("$destroy", function() { $timeout.cancel(), $("body").animate({ scrollTop: -1 * heightOfNavigationBar }, 0) }) } } }]), Bahmni.Common.DocumentImage = function(data) { angular.extend(this, data), this.title = this.getTitle(), this.thumbnail = this.getThumbnail() }, Bahmni.Common.DocumentImage.prototype = { getTitle: function() { var titleComponents = []; return this.concept && titleComponents.push(this.concept.name), this.obsDatetime && titleComponents.push(moment(this.obsDatetime).format(Bahmni.Common.Constants.dateDisplayFormat)), titleComponents.join(", ") }, getThumbnail: function() { var src = this.src || this.encodedValue; return src && src.replace(/(.*)\.(.*)$/, "$1_thumbnail.$2") || null } }, Bahmni.Common.VisitSummary = function(visitSummary) { angular.extend(this, visitSummary), this.isAdmitted = function() { return !(!this.admissionDetails || !this.admissionDetails.uuid) }, this.isDischarged = function() { return !(!this.dischargeDetails || !this.dischargeDetails.uuid) }, this.getAdmissionEncounterUuid = function() { return this.isAdmitted() ? this.admissionDetails.uuid : void 0 }, this.getDischargeEncounterUuid = function() { return this.isDischarged() ? this.dischargeDetails.uuid : void 0 }, this.hasBeenAdmitted = function() { return this.isAdmitted() && !this.isDischarged() } }; var debugUiRouter = function($rootScope) { $rootScope.$on("$stateChangeStart", function(event, toState, toParams) { console.log("$stateChangeStart to " + toState.to + "- fired when the transition begins. toState,toParams : \n", toState, toParams) }), $rootScope.$on("$stateChangeError", function() { console.log("$stateChangeError - fired when an error occurs during transition."), console.log(arguments) }), $rootScope.$on("$stateChangeSuccess", function(event, toState) { console.log("$stateChangeSuccess to " + toState.name + "- fired once the state transition is complete.") }), $rootScope.$on("$viewContentLoaded", function(event) { console.log("$viewContentLoaded - fired after dom rendered", event) }), $rootScope.$on("$stateNotFound", function(event, unfoundState, fromState, fromParams) { console.log("$stateNotFound " + unfoundState.to + " - fired when a state cannot be found by its name."), console.log(unfoundState, fromState, fromParams) }) }; angular.module("bahmni.common.uiHelper").directive("singleClick", function() { var ignoreClick = !1, link = function(scope, element) { var clickHandler = function() { ignoreClick || (ignoreClick = !0, scope.singleClick()["finally"](function() { ignoreClick = !1 })) }; element.on("click", clickHandler), scope.$on("$destroy", function() { element.off("click", clickHandler) }) }; return { scope: { singleClick: "&" }, restrict: "A", link: link } }), angular.module("bahmni.common.uiHelper").directive("singleSubmit", function() { var ignoreSubmit = !1, link = function(scope, element) { var submitHandler = function() { ignoreSubmit || (ignoreSubmit = !0, scope.singleSubmit()["finally"](function() { ignoreSubmit = !1 })) }; element.on("submit", submitHandler), scope.$on("$destroy", function() { element.off("submit", submitHandler) }) }; return { scope: { singleSubmit: "&" }, restrict: "A", link: link } }); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, angular.module("bahmni.common.displaycontrol", []); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.Observation = Bahmni.Common.DisplayControl.Observation || {}, angular.module("bahmni.common.displaycontrol.observation", ["bahmni.common.conceptSet", "pascalprecht.translate"]), Bahmni.Common.DisplayControl.Observation.GroupingFunctions = function() { var self = this, observationGroupingFunction = function(obs) { return Bahmni.Common.Util.DateUtil.getDateTimeWithoutSeconds(obs.encounterDateTime) }; return self.groupByEncounterDate = function(bahmniObservations) { var obsArray = []; bahmniObservations = _.groupBy(bahmniObservations, observationGroupingFunction); var sortWithInAConceptDateCombination = function(anObs, challengerObs) { return anObs.encounterDateTime < challengerObs.encounterDateTime ? 1 : anObs.encounterDateTime > challengerObs.encounterDateTime ? -1 : anObs.conceptSortWeight < challengerObs.conceptSortWeight ? -1 : anObs.conceptSortWeight > challengerObs.conceptSortWeight ? 1 : 0 }; for (var obsKey in bahmniObservations) { var dateTime = obsKey, anObs = { key: dateTime, value: bahmniObservations[dateTime].sort(sortWithInAConceptDateCombination), date: dateTime }; obsArray.push(anObs) } return _.sortBy(obsArray, "date").reverse() }, self.persistOrderOfConceptNames = function(bahmniObservations) { var obsArray = []; for (var obsKey in bahmniObservations) { var anObs = { key: obsKey, value: [bahmniObservations[obsKey]], date: bahmniObservations[obsKey].encounterDateTime }; obsArray.push(anObs) } return obsArray }, self }, angular.module("bahmni.common.displaycontrol.observation").service("formHierarchyService", ["formService", function(formService) { var self = this; self.build = function(observations) { var obs = self.preProcessMultipleSelectObsToObs(observations); obs = self.createDummyObsGroupForObservationsForForm(obs), self.createDummyObsGroupForSectionsForForm(obs) }, self.preProcessMultipleSelectObsToObs = function(observations) { return _.forEach(observations, function(obs) { _.forEach(obs.value, function(value, index) { "multiSelect" == value.type && (obs.value.push(value.groupMembers[0]), obs.value.splice(index, 1)) }) }), observations }, self.createDummyObsGroupForObservationsForForm = function(observations) { return _.forEach(observations, function(obs) { var newValues = []; _.forEach(obs.value, function(value) { if (!value.formFieldPath) return void newValues.push(value); var dummyObsGroup = { groupMembers: [], concept: { shortName: "", conceptClass: null }, encounterUuid: "" }; dummyObsGroup.concept.shortName = value.formFieldPath.split(".")[0], dummyObsGroup.encounterUuid = value.encounterUuid; var previousDummyObsGroupFound; _.forEach(newValues, function(newValue) { dummyObsGroup.concept.shortName == newValue.concept.shortName && (newValue.groupMembers.push(value), previousDummyObsGroupFound = !0) }), previousDummyObsGroupFound || (dummyObsGroup.groupMembers.push(value), newValues.push(dummyObsGroup)) }), obs.value = newValues }), observations }, self.getFormVersion = function(members) { var formVersion; return _.forEach(members, function(member) { if (member.formFieldPath) return formVersion = member.formFieldPath.split(".")[1].split("/")[0], !1 }), formVersion }, self.getMemberFromFormByFormFieldPath = function(members, id) { return _.filter(members, function(member) { return member.formFieldPath.split(".")[1].split("/")[1].split("-")[0] == id }) }, self.getFormByFormName = function(formList, formName, formVersion) { return _.find(formList, function(form) { return form.name == formName && form.version == formVersion }) }, self.parseSection = function(members, controls, value) { var sectionIsEmpty = !0; return _.forEach(controls, function(control) { var dummyObsGroup = { groupMembers: [], concept: { shortName: "", conceptClass: null } }; if ("section" == control.type) dummyObsGroup.concept.shortName = control.label.value, value.groupMembers.push(dummyObsGroup), self.parseSection(members, control.controls, dummyObsGroup) ? sectionIsEmpty = !1 : value.groupMembers.pop(); else { var member = self.getMemberFromFormByFormFieldPath(members, control.id); 0 != member.length && (0 != member[0].formFieldPath.split("-")[1] && _.reverse(member), _.map(member, function(m) { value.groupMembers.push(m) }), sectionIsEmpty = !1) } }), sectionIsEmpty ? null : value }, self.createSectionForSingleForm = function(obsFromSameForm, formDetails) { var members = obsFromSameForm.groupMembers.slice(); return obsFromSameForm.groupMembers.splice(0, obsFromSameForm.groupMembers.length), self.parseSection(members, formDetails.controls, obsFromSameForm) }, self.createDummyObsGroupForSectionsForForm = function(bahmniObservations) { _.isEmpty(bahmniObservations) || formService.getAllForms().then(function(response) { var allForms = response.data; _.forEach(bahmniObservations, function(observation) { var forms = []; _.forEach(observation.value, function(form) { if (form.concept.conceptClass) return void forms.push(form); var observationForm = self.getFormByFormName(allForms, form.concept.shortName, self.getFormVersion(form.groupMembers)); observationForm && formService.getFormDetail(observationForm.uuid, { v: "custom:(resources:(value))" }).then(function(response) { var formDetailsAsString = _.get(response, "data.resources[0].value"); if (formDetailsAsString) { var formDetails = JSON.parse(formDetailsAsString); forms.push(self.createSectionForSingleForm(form, formDetails)) } observation.value = forms }) }) }) }) } }]), angular.module("bahmni.common.displaycontrol.observation").directive("bahmniObservation", ["observationsService", "appService", "$q", "spinner", "$rootScope", "formHierarchyService", "$translate", function(observationsService, appService, $q, spinner, $rootScope, formHierarchyService, $translate) { var controller = function($scope) { $scope.print = $rootScope.isBeingPrinted || !1, $scope.showGroupDateTime = $scope.config.showGroupDateTime !== !1; var mapObservation = function(observations) { var conceptsConfig = appService.getAppDescriptor().getConfigValue("conceptSetUI") || {}; observations = (new Bahmni.Common.Obs.ObservationMapper).map(observations, conceptsConfig), $scope.config.conceptNames && (observations = _.filter(observations, function(observation) { return _.some($scope.config.conceptNames, function(conceptName) { return _.toLower(conceptName) === _.toLower(_.get(observation, "concept.name")) }) })), $scope.config.persistOrderOfConcepts ? $scope.bahmniObservations = (new Bahmni.Common.DisplayControl.Observation.GroupingFunctions).persistOrderOfConceptNames(observations) : $scope.bahmniObservations = (new Bahmni.Common.DisplayControl.Observation.GroupingFunctions).groupByEncounterDate(observations), _.isEmpty($scope.bahmniObservations) ? ($scope.noObsMessage = $translate.instant(Bahmni.Common.Constants.messageForNoObservation), $scope.$emit("no-data-present-event")) : $scope.showGroupDateTime ? $scope.bahmniObservations[0].isOpen = !0 : _.forEach($scope.bahmniObservations, function(bahmniObs) { bahmniObs.isOpen = !0 }); var formObservations = _.filter(observations, function(obs) { return obs.formFieldPath }); formObservations.length > 0 && formHierarchyService.build($scope.bahmniObservations) }, fetchObservations = function() { if ($scope.observations) mapObservation($scope.observations, $scope.config), $scope.isFulfilmentDisplayControl = !0; else if ($scope.config.observationUuid) $scope.initialization = observationsService.getByUuid($scope.config.observationUuid).then(function(response) { mapObservation([response.data], $scope.config) }); else if ($scope.config.encounterUuid) { var fetchForEncounter = observationsService.fetchForEncounter($scope.config.encounterUuid, $scope.config.conceptNames); $scope.initialization = fetchForEncounter.then(function(response) { mapObservation(response.data, $scope.config) }) } else $scope.enrollment ? $scope.initialization = observationsService.fetchForPatientProgram($scope.enrollment, $scope.config.conceptNames, $scope.config.scope, $scope.config.obsIgnoreList).then(function(response) { mapObservation(response.data, $scope.config) }) : $scope.initialization = observationsService.fetch($scope.patient.uuid, $scope.config.conceptNames, $scope.config.scope, $scope.config.numberOfVisits, $scope.visitUuid, $scope.config.obsIgnoreList, null).then(function(response) { mapObservation(response.data, $scope.config) }) }; $scope.toggle = function(element) { element.isOpen = !element.isOpen }, $scope.isClickable = function() { return $scope.isOnDashboard && $scope.section.expandedViewConfig && ($scope.section.expandedViewConfig.pivotTable || $scope.section.expandedViewConfig.observationGraph) }, fetchObservations(), $scope.dialogData = { patient: $scope.patient, section: $scope.section } }, link = function($scope, element) { $scope.initialization && spinner.forPromise($scope.initialization, element) }; return { restrict: "E", controller: controller, link: link, templateUrl: "../common/displaycontrols/observation/views/observationDisplayControl.html", scope: { patient: "=", visitUuid: "@", section: "=?", config: "=", title: "=sectionTitle", isOnDashboard: "=?", observations: "=?", message: "=?", enrollment: "=?" } } }]), angular.module("bahmni.common.displaycontrol.observation").controller("AllObservationDetailsController", ["$scope", function($scope) { $scope.patient = $scope.ngDialogData.patient, $scope.section = $scope.ngDialogData.section, $scope.config = $scope.ngDialogData.section ? $scope.ngDialogData.section.expandedViewConfig : {} }]), Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.Prescription = Bahmni.Common.DisplayControl.Prescription || {}, angular.module("bahmni.common.displaycontrol.prescription", []), angular.module("bahmni.common.displaycontrol.prescription").directive("prescription", ["treatmentService", "treatmentConfig", "$q", function(treatmentService, treatmentConfig, $q) { var controller = function($scope) { $q.all([treatmentConfig(), treatmentService.getPrescribedAndActiveDrugOrders($scope.patient.uuid, 1, !1, [$scope.visitUuid], "", "", "")]).then(function(results) { var treatmentConfig = results[0], drugOrderResponse = results[1].data, createDrugOrderViewModel = function(drugOrder) { return Bahmni.Clinical.DrugOrderViewModel.createFromContract(drugOrder, treatmentConfig) }; for (var key in drugOrderResponse) drugOrderResponse[key] = drugOrderResponse[key].map(createDrugOrderViewModel); var drugUtil = Bahmni.Clinical.DrugOrder.Util, orderGroupOrders = _.groupBy(drugOrderResponse.visitDrugOrders, function(drugOrder) { return drugOrder.orderGroupUuid ? "orderGroupOrders" : "drugOrders" }), drugOrdersSorted = drugUtil.sortDrugOrders(orderGroupOrders.drugOrders); $scope.drugOrders = _(orderGroupOrders.orderGroupOrders).concat(drugOrdersSorted).uniqBy("uuid").value() }) }; return { restrict: "EA", controller: controller, templateUrl: "../common/displaycontrols/prescription/views/prescription.html", scope: { patient: "=", visitDate: "=", visitUuid: "=" } } }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.PivotTable = Bahmni.Common.DisplayControl.PivotTable || {}, angular.module("bahmni.common.displaycontrol", []), angular.module("bahmni.common.displaycontrol.pivottable", []), angular.module("bahmni.common.displaycontrol.pivottable").directive("pivotTable", ["$rootScope", "$filter", "$stateParams", "spinner", "pivotTableService", "appService", "conceptSetUiConfigService", "$interval", function($rootScope, $filter, $stateParams, spinner, pivotTableService, appService, conceptSetUiConfigService, $interval) { return { scope: { patientUuid: "=", diseaseName: "=", displayName: "=", config: "=", visitUuid: "=", status: "=?" }, link: function(scope, element) { var tablescroll; if (scope.config) { scope.groupBy = scope.config.groupBy || "visits", scope.groupByEncounters = "encounters" === scope.groupBy, scope.groupByVisits = "visits" === scope.groupBy, scope.getOnlyDate = function(startdate) { return Bahmni.Common.Util.DateUtil.formatDateWithoutTime(startdate) }, scope.getOnlyTime = function(startDate) { return Bahmni.Common.Util.DateUtil.formatTime(startDate) }, scope.isLonger = function(value) { return !!value && value.length > 13 }, scope.getColumnValue = function(value, conceptName) { return conceptName && conceptSetUiConfigService.getConfig()[conceptName] && 1 == conceptSetUiConfigService.getConfig()[conceptName].displayMonthAndYear ? Bahmni.Common.Util.DateUtil.getDateInMonthsAndYears(value) : scope.isLonger(value) ? value.substring(0, 10) + "..." : value }, scope.scrollLeft = function() { return $("table.pivot-table tbody").animate({ scrollLeft: 0 }), !1 }, scope.scrollRight = function() { return $("table.pivot-table tbody").animate({ scrollLeft: tablescroll }), !1 }; var programConfig = appService.getAppDescriptor().getConfigValue("program") || {}, startDate = null, endDate = null; programConfig.showDetailsWithinDateRange && (startDate = $stateParams.dateEnrolled, endDate = $stateParams.dateCompleted); var checkIfPivotTableLoaded = $interval(function() { $("table.pivot-table tbody tr").length > 11 ? ($("table.pivot-table tbody").animate({ scrollLeft: "20000px" }, 500), tablescroll = $("table.pivot-table tbody").scrollLeft(), clearInterval(checkIfPivotTableLoaded)) : $("table.pivot-table tbody tr").length < 12 && ($(".btn-scroll-right, .btn-scroll-left").attr("disabled", !0), clearInterval(checkIfPivotTableLoaded)) }, 1e3, 2), pivotDataPromise = pivotTableService.getPivotTableFor(scope.patientUuid, scope.config, scope.visitUuid, startDate, endDate); spinner.forPromise(pivotDataPromise, element), pivotDataPromise.then(function(response) { var concepts = _.map(response.data.conceptDetails, function(conceptDetail) { return { name: conceptDetail.fullName, shortName: conceptDetail.name, lowNormal: conceptDetail.lowNormal, hiNormal: conceptDetail.hiNormal, units: conceptDetail.units } }), tabluarDataInAscOrderByDate = _(response.data.tabularData).toPairs().sortBy(0).fromPairs().value(); scope.result = { concepts: concepts, tabularData: tabluarDataInAscOrderByDate }, scope.hasData = !_.isEmpty(scope.result.tabularData), scope.status = scope.status || {}, scope.status.data = scope.hasData }), scope.showOnPrint = !$rootScope.isBeingPrinted } }, templateUrl: "../common/displaycontrols/pivottable/views/pivotTable.html" } }]), angular.module("bahmni.common.displaycontrol.pivottable").service("pivotTableService", ["$http", function($http) { this.getPivotTableFor = function(patientUuid, diseaseSummaryConfig, visitUuid, startDate, endDate) { return $http.get(Bahmni.Common.Constants.diseaseSummaryPivotUrl, { params: { patientUuid: patientUuid, visit: visitUuid, numberOfVisits: diseaseSummaryConfig.numberOfVisits, initialCount: diseaseSummaryConfig.initialCount, latestCount: diseaseSummaryConfig.latestCount, obsConcepts: diseaseSummaryConfig.obsConcepts, drugConcepts: diseaseSummaryConfig.drugConcepts, labConcepts: diseaseSummaryConfig.labConcepts, groupBy: diseaseSummaryConfig.groupBy, startDate: Bahmni.Common.Util.DateUtil.parseLongDateToServerFormat(startDate), endDate: Bahmni.Common.Util.DateUtil.parseLongDateToServerFormat(endDate) } }) } }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.Disposition = Bahmni.Common.DisplayControl.Disposition || {}, angular.module("bahmni.common.displaycontrol.disposition", []), angular.module("bahmni.common.displaycontrol.disposition").directive("disposition", ["dispositionService", "spinner", function(dispositionService, spinner) { var controller = function($scope) { var fetchDispositionByPatient = function(patientUuid, numOfVisits) { return dispositionService.getDispositionByPatient(patientUuid, numOfVisits).then(handleDispositionResponse) }, handleDispositionResponse = function(response) { $scope.dispositions = response.data, _.isEmpty($scope.dispositions) && ($scope.noDispositionsMessage = Bahmni.Common.Constants.messageForNoDisposition, $scope.$emit("no-data-present-event")) }, fetchDispositionsByVisit = function(visitUuid) { return dispositionService.getDispositionByVisit(visitUuid).then(handleDispositionResponse) }; $scope.getNotes = function(disposition) { return disposition.additionalObs[0] && disposition.additionalObs[0].value ? disposition.additionalObs[0].value : "" }, $scope.showDetailsButton = function(disposition) { return !$scope.getNotes(disposition) && $scope.params.showDetailsButton }, $scope.toggle = function(element) { return $scope.showDetailsButton(element) ? element.show = !element.show : element.show = !0, !1 }, $scope.visitUuid ? $scope.fetchDispositionPromise = fetchDispositionsByVisit($scope.visitUuid) : $scope.params.numberOfVisits && $scope.patientUuid && ($scope.fetchDispositionPromise = fetchDispositionByPatient($scope.patientUuid, $scope.params.numberOfVisits)) }, link = function(scope, element) { spinner.forPromise(scope.fetchDispositionPromise, element) }; return { restrict: "E", controller: controller, link: link, templateUrl: "../common/displaycontrols/disposition/views/disposition.html", scope: { params: "=", patientUuid: "=?", visitUuid: "=?" } } }]), angular.module("bahmni.common.displaycontrol.conditionsList", []), angular.module("bahmni.common.displaycontrol.conditionsList").directive("conditionsList", ["conditionsService", "ngDialog", function(conditionsService, ngDialog) { var controller = function($scope) { return $scope.statuses = ["ACTIVE", "HISTORY_OF"], $scope.openSummaryDialog = function() { ngDialog.open({ template: "../common/displaycontrols/conditionsList/views/conditionsList.html", className: "ngdialog-theme-default ng-dialog-all-details-page", data: { conditions: $scope.conditions }, controller: function($scope) { $scope.hideTitle = !0, $scope.statuses = ["ACTIVE", "HISTORY_OF", "INACTIVE"], $scope.conditions = $scope.ngDialogData.conditions } }) }, conditionsService.getConditions($scope.patient.uuid).then(function(conditions) { $scope.conditions = conditions }) }; return { restrict: "E", controller: controller, templateUrl: "../common/displaycontrols/conditionsList/views/conditionsList.html", scope: { params: "=", patient: "=" } } }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.Dashboard = Bahmni.Common.DisplayControl.Dashboard || {}, angular.module("bahmni.common.displaycontrol.dashboard", []), angular.module("bahmni.common.displaycontrol.dashboard").directive("dashboardSection", function() { var controller = function($scope) { $scope.$on("no-data-present-event", function() { $scope.section.isDataAvailable = !$scope.section.hideEmptyDisplayControl }) }; return { restrict: "E", controller: controller, templateUrl: "../common/displaycontrols/dashboard/views/dashboardSection.html" } }), angular.module("bahmni.common.displaycontrol.dashboard").directive("dashboard", [function() { var controller = function($scope, $filter) { var init = function() { $scope.dashboard = Bahmni.Common.DisplayControl.Dashboard.create($scope.config || {}, $filter) }, checkDisplayType = function(sections, typeToCheck, index) { return sections[index] && sections[index].displayType && sections[index].displayType === typeToCheck }, isDisplayTypeWrong = function(sections) { var allDisplayTypes = ["Full-Page", "LAYOUT_75_25", "LAYOUT_25_75", "Half-Page"]; return allDisplayTypes.indexOf(sections[0].displayType) <= -1 }; $scope.isFullPageSection = function(sections) { return checkDisplayType(sections, "Full-Page", 0) }, $scope.hasThreeFourthPageSection = function(sections, index) { return checkDisplayType(sections, "LAYOUT_75_25", index) }, $scope.isOneFourthPageSection = function(sections) { return checkDisplayType(sections, "LAYOUT_25_75", 0) }, $scope.isHalfPageSection = function(sections) { return sections[0] && (checkDisplayType(sections, "Half-Page", 0) || isDisplayTypeWrong(sections) || !sections[0].displayType) }, $scope.containsThreeFourthPageSection = function(sections) { var hasThreeFourthSection = this.hasThreeFourthPageSection(sections, 0) || this.hasThreeFourthPageSection(sections, 1); return 1 == sections.length ? this.hasThreeFourthPageSection(sections, 0) : hasThreeFourthSection }, $scope.filterOdd = function(index) { return function() { return index++ % 2 === 0 } }, $scope.filterEven = function(index) { return function() { return index++ % 2 === 1 } }; var unbindWatch = $scope.$watch("config", init); $scope.$on("$stateChangeStart", unbindWatch) }; return { restrict: "E", controller: controller, templateUrl: "../common/displaycontrols/dashboard/views/dashboard.html", scope: { config: "=", patient: "=", diseaseTemplates: "=", sectionGroups: "=", visitHistory: "=", activeVisitUuid: "=", visitSummary: "=", enrollment: "=" } } }]), Bahmni.Common.DisplayControl.Dashboard = function(config, $filter) { (config.startDate || config.endDate) && _.each(config.sections, function(section) { section.startDate = config.startDate, section.endDate = config.endDate }); var _sections = _.sortBy(_.map(config.sections, function(section) { return Bahmni.Common.DisplayControl.Dashboard.Section.create(section, $filter) }), function(section) { return section.displayOrder }); this.getSectionByType = function(name) { return _.find(_sections, function(section) { return section.type === name }) || {} }, this.getSections = function(diseaseTemplates) { var sections = _.filter(_sections, function(section) { return "diseaseTemplate" !== section.type || _.find(diseaseTemplates, function(diseaseTemplate) { return diseaseTemplate.name === section.templateName && diseaseTemplate.obsTemplates.length > 0 }) }); return this.groupSectionsByType(sections) }, this.groupSectionsByType = function(sections) { var sectionGroups = [ [] ]; for (var sectionId in sections) { var section = sections[sectionId], nextSection = sectionId < sections.length ? sections[++sectionId] : null, lastElement = sectionGroups.length - 1; this.isFullPageSection(section) ? (_.isEmpty(sectionGroups[lastElement]) && sectionGroups.pop(), sectionGroups.push([section]), sectionGroups.push([])) : sectionGroups = this.groupSectionsIfNotFullPage(section, sectionGroups, lastElement, nextSection) } return sectionGroups }, this.isFullPageSection = function(section) { return this.checkDisplayType(section, "Full-Page") }, this.isThreeFourthPageSection = function(section) { return this.checkDisplayType(section, "LAYOUT_75_25") }, this.isOneFourthPageSection = function(section) { return this.checkDisplayType(section, "LAYOUT_25_75") }, this.isHalfPageSection = function(section) { return this.checkDisplayType(section, "Half-Page") || this.isDisplayTypeWrong(section) || !section.displayType }, this.isDisplayTypeWrong = function(section) { var allDisplayTypes = ["Full-Page", "LAYOUT_75_25", "LAYOUT_25_75", "Half-Page"]; return allDisplayTypes.indexOf(section.displayType) <= -1 }, this.checkDisplayType = function(section, typeToCheck) { return section && section.displayType && section.displayType === typeToCheck }, this.groupSectionsIfNotFullPage = function(section, sectionGroups, lastElement, nextSection) { var lastSection = sectionGroups[lastElement], lastSectionIndex = _.isEmpty(lastSection) ? 0 : lastSection.length - 1; return sectionGroups = this.isThreeFourthPageSection(section) ? this.groupThreeFourthPageSection(lastSection, lastElement, lastSectionIndex, section, sectionGroups) : this.isOneFourthPageSection(section) ? this.groupOneFourthPageSection(lastSection, lastElement, lastSectionIndex, section, sectionGroups, nextSection) : this.groupHalfPageSection(lastSection, lastElement, lastSectionIndex, section, sectionGroups) }, this.groupThreeFourthPageSection = function(lastSection, lastElement, lastSectionIndex, section, sectionGroups) { var lastSectionLength = lastSection.length, isLastSectionOneFourth = 1 == lastSectionLength && this.isOneFourthPageSection(lastSection[lastSectionIndex]); return _.isEmpty(lastSection) || isLastSectionOneFourth ? sectionGroups[lastElement].push(section) : sectionGroups.push([section]), sectionGroups }, this.groupOneFourthPageSection = function(lastSection, lastElement, lastSectionIndex, section, sectionGroups, nextSection) { return this.addOneFourthElementToLastSection(lastSection, lastElement, lastSectionIndex, nextSection) ? sectionGroups[lastElement].push(section) : sectionGroups.push([section]), sectionGroups }, this.addOneFourthElementToLastSection = function(lastSection, lastElement, lastSectionIndex, nextSection) { var lastSectionLength = lastSection.length, isNextSectionThreeFourth = !!nextSection && this.isThreeFourthPageSection(nextSection), isLastSectionNotThreeFourth = !this.isThreeFourthPageSection(lastSection[lastSectionIndex]) && !this.isThreeFourthPageSection(lastSection[0]); return lastSection.length <= 1 && (this.isThreeFourthPageSection(lastSection[0]) || !isNextSectionThreeFourth) || lastSectionLength >= 2 && isLastSectionNotThreeFourth && !isNextSectionThreeFourth }, this.groupHalfPageSection = function(lastSection, lastElement, lastSectionIndex, section, sectionGroups) { var lastSectionLength = lastSection.length, isLastSectionNotThreeFourth = !this.isThreeFourthPageSection(lastSection[lastSectionIndex]) && !this.isThreeFourthPageSection(lastSection[0]); return _.isEmpty(lastSection) || lastSectionLength > 2 || isLastSectionNotThreeFourth ? sectionGroups[lastElement].push(section) : sectionGroups.push([section]), sectionGroups } }, Bahmni.Common.DisplayControl.Dashboard.create = function(config, $filter) { return new Bahmni.Common.DisplayControl.Dashboard(config, $filter) }, function() { var OBSERVATION_SECTION_URL = "../common/displaycontrols/dashboard/views/sections/observationSection.html", COMMON_DISPLAY_CONTROL_URL = "../common/displaycontrols/dashboard/views/sections/SECTION_NAME.html", CLINICAL_DISPLAY_CONTROL_URL = "../clinical/dashboard/views/dashboardSections/SECTION_NAME.html", commonDisplayControlNames = ["admissionDetails", "bacteriologyResultsControl", "chronicTreatmentChart", "custom", "diagnosis", "disposition", "drugOrderDetails", "forms", "observationGraph", "obsToObsFlowSheet", "pacsOrders", "patientInformation", "conditionsList"], getViewUrl = function(section) { if (section.isObservation) return OBSERVATION_SECTION_URL; var isCommonDisplayControl = _.includes(commonDisplayControlNames, section.type); return isCommonDisplayControl ? COMMON_DISPLAY_CONTROL_URL.replace("SECTION_NAME", section.type) : CLINICAL_DISPLAY_CONTROL_URL.replace("SECTION_NAME", section.type) }, getId = function(section, $filter) { if ("custom" !== section.type) { var key = section.translationKey || section.title; return !_.isUndefined($filter) && key ? $filter("titleTranslate")(key).toValidId() : key } }; Bahmni.Common.DisplayControl.Dashboard.Section = function(section, $filter) { angular.extend(this, section), this.displayOrder = section.displayOrder, this.data = section.data || {}, this.isObservation = !!section.isObservation, this.patientAttributes = section.patientAttributes || [], this.viewName = getViewUrl(this), this.hideEmptyDisplayControl = void 0 != section.hideEmptyDisplayControl && section.hideEmptyDisplayControl, this.isDataAvailable = !0, this.id = getId(this, $filter) }, Bahmni.Common.DisplayControl.Dashboard.Section.create = function(section, $filter) { return new Bahmni.Common.DisplayControl.Dashboard.Section(section, $filter) } }(); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.PatientProfile = Bahmni.Common.DisplayControl.PatientProfile || {}, angular.module("bahmni.common.displaycontrol.patientprofile", []), angular.module("bahmni.common.displaycontrol.patientprofile").filter("titleCase", function() { return function(input) { return input = input || "", input.replace(/\w\S*/g, function(txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase() }) } }), angular.module("bahmni.common.displaycontrol.patientprofile").filter("booleanFilter", function() { return function(value) { return value === !0 ? "Yes" : value === !1 ? "No" : value } }), function() { var getAddress = function($scope) { var patient = $scope.patient, address = []; return void 0 != $scope.config.addressFields && 0 != $scope.config.addressFields.length ? $scope.config.addressFields.forEach(function(addressField) { patient.address[addressField] && address.push(patient.address[addressField]) }) : _.includes($scope.config, "cityVillage") || address.push(patient.address.cityVillage), address.join(", ") }, getPatientAttributeTypes = function($scope) { var patient = $scope.patient; $scope.config.hasOwnProperty("ageLimit") && patient.age >= $scope.config.ageLimit && (patient.ageText = patient.age.toString() + " years "); var patientAttributeTypes = [patient.genderText, patient.ageText]; return patient.bloodGroupText && patientAttributeTypes.push(patient.bloodGroupText), patientAttributeTypes.join(", ") }, isAdmitted = function(admissionStatus) { return "Admitted" === _.get(admissionStatus, "value") }; angular.module("bahmni.common.displaycontrol.patientprofile").directive("patientProfile", ["patientService", "spinner", "$sce", "$rootScope", "$stateParams", "$window", "$translate", "configurations", "$q", "visitService", function(patientService, spinner, $sce, $rootScope, $stateParams, $window, $translate, configurations, $q, visitService) { var controller = function($scope) { $scope.isProviderRelationship = function(relationship) { return _.includes($rootScope.relationshipTypeMap.provider, relationship.relationshipType.aIsToB) }, $scope.openPatientDashboard = function(patientUuid) { var configName = $stateParams.configName || Bahmni.Common.Constants.defaultExtensionName; $window.open("../clinical/#/" + configName + "/patient/" + patientUuid + "/dashboard") }; var assignPatientDetails = function() { var patientMapper = new Bahmni.PatientMapper(configurations.patientConfig(), $rootScope, $translate); return patientService.getPatient($scope.patientUuid).then(function(response) { var openMrsPatient = response.data; $scope.patient = patientMapper.map(openMrsPatient) }) }, assignRelationshipDetails = function() { return patientService.getRelationships($scope.patientUuid).then(function(response) { $scope.relationships = response.data.results }) }, assignAdmissionDetails = function() { var REP = "custom:(attributes:(value,attributeType:(display,name)))", ADMISSION_STATUS_ATTRIBUTE = "Admission Status"; return visitService.getVisit($scope.visitUuid, REP).then(function(response) { var attributes = response.data.attributes, admissionStatus = _.find(attributes, { attributeType: { name: ADMISSION_STATUS_ATTRIBUTE } }); $scope.hasBeenAdmitted = isAdmitted(admissionStatus) }) }, setHasBeenAdmittedOnVisitUuidChange = function() { $scope.$watch("visitUuid", function(visitUuid) { _.isEmpty(visitUuid) || assignAdmissionDetails() }) }, setDirectiveAsReady = function() { $scope.isDirectiveReady = !0 }, onDirectiveReady = function() { $scope.addressLine = getAddress($scope), $scope.patientAttributeTypes = $sce.trustAsHtml(getPatientAttributeTypes($scope)), $scope.showBirthDate = $scope.config.showDOB !== !1, $scope.showBirthDate = $scope.showBirthDate && !!$scope.patient.birthdate }, initPromise = $q.all([assignPatientDetails(), assignRelationshipDetails()]); initPromise.then(onDirectiveReady), initPromise.then(setHasBeenAdmittedOnVisitUuidChange), initPromise.then(setDirectiveAsReady), $scope.initialization = initPromise }, link = function($scope, element) { spinner.forPromise($scope.initialization, element) }; return { restrict: "E", controller: controller, link: link, scope: { patientUuid: "@", visitUuid: "@", config: "=" }, templateUrl: "../common/displaycontrols/patientprofile/views/patientProfile.html" } }]) }(), angular.module("bahmni.common.displaycontrol", []), angular.module("bahmni.common.displaycontrol.documents", []), angular.module("bahmni.common.displaycontrol.documents").directive("bmDocuments", ["encounterService", "spinner", "configurations", function(encounterService, spinner, configurations) { var controller = function($scope, $filter) { var encounterTypeUuid = configurations.encounterConfig().getEncounterTypeUuid($scope.encounterType); $scope.initialization = function() { return encounterService.getEncountersForEncounterType($scope.patient.uuid, encounterTypeUuid).then(function(response) { $scope.records = (new Bahmni.Clinical.PatientFileObservationsMapper).map(response.data.results), $scope.config.visitUuids && ($scope.records = _.filter($scope.records, function(record) { return $scope.config.visitUuids.indexOf(record.visitUuid) != -1 })), $scope.recordGroups = (new Bahmni.Clinical.RecordsMapper).map($scope.records), $scope.isDataPresent = function() { return 0 != $scope.recordGroups.length || ($scope.$emit("no-data-present-event"), !1) } }) }, $scope.shouldShowActiveVisitStar = function(records) { return (!$scope.config.visitUuids || 1 !== $scope.config.visitUuids.length) && _.some(records, function(record) { return !record.visitStopDate }) } }, link = function($scope, element) { spinner.forPromise($scope.initialization(), element) }; return { restrict: "E", controller: controller, scope: { patient: "=", config: "=", encounterType: "=" }, link: link, templateUrl: "../common/displaycontrols/documents/views/bmDocuments.html" } }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.navigationLinks = Bahmni.Common.DisplayControl.navigationLinks || {}, angular.module("bahmni.common.displaycontrol.navigationlinks", ["ui.router", "ui.router.util"]), angular.module("bahmni.common.displaycontrol.navigationlinks").directive("navigationLinks", ["$state", "appService", function($state, appService) { var controller = function($scope) { (!$scope.params.showLinks && !$scope.params.customLinks || $scope.params.showLinks && $scope.params.customLinks && 0 == $scope.params.showLinks.length && 0 == $scope.params.customLinks.length) && ($scope.noNavigationLinksMessage = Bahmni.Common.Constants.noNavigationLinksMessage), $scope.standardLinks = [{ name: "home", translationKey: "HOME_DASHBOARD_KEY", url: "../home/#/dashboard" }, { name: "visit", url: "../clinical/#/default/patient/{{patientUuid}}/dashboard/visit/{{visitUuid}}/?encounterUuid=active", translationKey: "PATIENT_VISIT_PAGE_KEY" }, { name: "inpatient", translationKey: "PATIENT_ADT_PAGE_KEY", url: "../adt/#/patient/{{patientUuid}}/visit/{{visitUuid}}/" }, { name: "enrolment", translationKey: "PROGRAM_MANAGEMENT_PAGE_KEY", url: "../clinical/#/programs/patient/{{patientUuid}}/consultationContext" }, { name: "visitAttribute", translationKey: "PATIENT_VISIT_ATTRIBUTES_PAGE_KEY", url: "../registration/#/patient/{{patientUuid}}/visit" }, { name: "registration", translationKey: "PATIENT_REGISTRATION_PAGE_KEY", url: "../registration/#/patient/{{patientUuid}}" }]; var filterLinks = function(links, showLinks) { var linksSpecifiedInShowLinks = function() { return _.filter(links, function(link) { return showLinks.indexOf(link.name) > -1 }) }; return showLinks && linksSpecifiedInShowLinks() }; $scope.getLinks = function() { return _.union(filterLinks($scope.standardLinks, $scope.params.showLinks), $scope.params.customLinks) }, $scope.getUrl = function(link) { var url = getFormattedURL(link); window.open(url, link.title) }, $scope.showUrl = function(link) { var isPropertyNotPresentInLinkParams, params = getParamsToBeReplaced(link.url); for (var i in params) { var property = params[i]; if (isPropertyNotPresentInLinkParams = _.isEmpty($scope.linkParams[property])) return !1 } return !0 }; var getFormattedURL = function(link) { return appService.getAppDescriptor().formatUrl(link.url, $scope.linkParams) }, getParamsToBeReplaced = function(link) { var pattern = /{{([^}]*)}}/g, matches = link.match(pattern), params = []; return matches && matches.forEach(function(el) { var key = el.replace("{{", "").replace("}}", ""); params.push(key) }), params } }; return { restrict: "E", controller: controller, templateUrl: "../common/displaycontrols/navigationlinks/views/navigationLinks.html", scope: { params: "=", linkParams: "=" } } }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.PacsOrders = Bahmni.Common.DisplayControl.PacsOrders || {}, angular.module("bahmni.common.displaycontrol.pacsOrders", []), angular.module("bahmni.common.displaycontrol.pacsOrders").directive("pacsOrders", ["orderService", "orderTypeService", "spinner", "messagingService", "$window", function(orderService, orderTypeService, spinner, messagingService, $window) { var controller = function($scope) { $scope.orderTypeUuid = orderTypeService.getOrderTypeUuid($scope.orderType); var includeAllObs = !0, getOrders = function() { var params = { patientUuid: $scope.patient.uuid, orderTypeUuid: $scope.orderTypeUuid, conceptNames: $scope.config.conceptNames, includeObs: includeAllObs, numberOfVisits: $scope.config.numberOfVisits, obsIgnoreList: $scope.config.obsIgnoreList, visitUuid: $scope.visitUuid, orderUuid: $scope.orderUuid }; return orderService.getOrders(params).then(function(response) { $scope.bahmniOrders = response.data, _.each($scope.bahmniOrders, function(order) { order.pacsImageUrl = ($scope.config.pacsImageUrl || "").replace("{{patientID}}", $scope.patient.identifier).replace("{{orderNumber}}", order.orderNumber) }) }) }, init = function() { return getOrders().then(function() { _.isEmpty($scope.bahmniOrders) && ($scope.noOrdersMessage = $scope.orderType, $scope.$emit("no-data-present-event")) }) }; $scope.getUrl = function(orderNumber) { var pacsImageTemplate = $scope.config.pacsImageUrl || ""; return pacsImageTemplate.replace("{{patientID}}", $scope.patient.identifier).replace("{{orderNumber}}", orderNumber) }, $scope.getLabel = function(bahmniOrder) { return bahmniOrder.concept.shortName || bahmniOrder.concept.name }, $scope.openImage = function(bahmniOrder) { var url = bahmniOrder.pacsImageUrl; spinner.forAjaxPromise($.ajax({ type: "HEAD", url: url, async: !1 }).then(function() { $window.open(url, "_blank") }, function() { messagingService.showMessage("info", "No image available yet for order: " + $scope.getLabel(bahmniOrder)) })) }, $scope.initialization = init() }, link = function($scope, element) { spinner.forPromise($scope.initialization, element) }; return { restrict: "E", controller: controller, link: link, templateUrl: "../common/displaycontrols/pacsOrders/views/pacsOrders.html", scope: { patient: "=", section: "=", orderType: "=", orderUuid: "=", config: "=", visitUuid: "=" } } }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.Custom = Bahmni.Common.DisplayControl.Custom || {}, angular.module("bahmni.common.displaycontrol.custom", []), angular.module("bahmni.common.displaycontrol.custom").directive("customDisplayControl", [function() { return { restrict: "E", template: '
', scope: { patient: "=", visitUuid: "=", section: "=", config: "=", enrollment: "=", params: "=", visitSummary: "=" } } }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.UIControls = Bahmni.Common.UIControls || {}, angular.module("bahmni.common.uicontrols", []); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.UIControls = Bahmni.Common.UIControls || {}, Bahmni.Common.UIControls.ProgramManagement = Bahmni.Common.UIControls.ProgramManagement || {}, angular.module("bahmni.common.uicontrols.programmanagment", []), angular.module("bahmni.common.uicontrols.programmanagment").controller("ManageProgramController", ["$scope", "retrospectiveEntryService", "$window", "programService", "spinner", "messagingService", "$stateParams", "$q", "confirmBox", function($scope, retrospectiveEntryService, $window, programService, spinner, messagingService, $stateParams, $q, confirmBox) { var DateUtil = Bahmni.Common.Util.DateUtil; $scope.programSelected = {}, $scope.workflowStateSelected = {}, $scope.allPrograms = [], $scope.programWorkflowStates = [], $scope.workflowStatesWithoutCurrentState = [], $scope.outComesForProgram = [], $scope.configName = $stateParams.configName, $scope.today = DateUtil.getDateWithoutTime(DateUtil.now()); var id = "#programEnrollmentContainer", updateActiveProgramsList = function() { spinner.forPromise(programService.getPatientPrograms($scope.patient.uuid).then(function(programs) { $scope.activePrograms = programs.activePrograms, _.each($scope.activePrograms, function(patientProgram) { populateDefaultSelectedState(patientProgram) }), $scope.activePrograms.showProgramSection = !0, $scope.endedPrograms = programs.endedPrograms, $scope.endedPrograms.showProgramSection = !0 }).then(function() { formatProgramDates() }), id) }, populateDefaultSelectedState = function(patientProgram) { var activePatientProgramState = getActivePatientProgramState(patientProgram.states); patientProgram.selectedState = activePatientProgramState ? activePatientProgramState.state : null }, formatProgramDates = function() { _.each($scope.activePrograms, function(activeProgram) { activeProgram.fromDate = Bahmni.Common.Util.DateUtil.parseLongDateToServerFormat(activeProgram.dateEnrolled), activeProgram.toDate = Bahmni.Common.Util.DateUtil.parseLongDateToServerFormat(activeProgram.dateCompleted) }), _.each($scope.endedPrograms, function(endedProgram) { endedProgram.fromDate = Bahmni.Common.Util.DateUtil.parseLongDateToServerFormat(endedProgram.dateEnrolled), endedProgram.toDate = Bahmni.Common.Util.DateUtil.parseLongDateToServerFormat(endedProgram.dateCompleted) }) }, getCurrentDate = function() { var retrospectiveDate = retrospectiveEntryService.getRetrospectiveDate(); return DateUtil.parseLongDateToServerFormat(retrospectiveDate) }, init = function() { spinner.forPromise(programService.getAllPrograms().then(function(programs) { $scope.allPrograms = programs, $scope.allPrograms.showProgramSection = !0 }), id), spinner.forPromise(programService.getProgramAttributeTypes().then(function(programAttributeTypes) { $scope.programAttributeTypes = programAttributeTypes }), id), $scope.programSelected = null, $scope.patientProgramAttributes = {}, $scope.programEnrollmentDate = null, updateActiveProgramsList() }, successCallback = function() { messagingService.showMessage("info", "CLINICAL_SAVE_SUCCESS_MESSAGE_KEY"), $scope.programSelected = null, $scope.workflowStateSelected = null, $scope.patientProgramAttributes = {}, $scope.programEnrollmentDate = null, updateActiveProgramsList(), $scope.patientProgram && ($scope.patientProgram.editing = !1) }, failureCallback = function(error) { var fieldErrorMsg = findFieldErrorIfAny(error), errorMsg = _.isUndefined(fieldErrorMsg) ? "Failed to Save" : fieldErrorMsg; messagingService.showMessage("error", errorMsg) }, findFieldErrorIfAny = function(error) { var stateFieldError = objectDeepFind(error, "data.error.fieldErrors.states"), errorField = stateFieldError && stateFieldError[0]; return errorField && errorField.message }, objectDeepFind = function(obj, path) { if (!_.isUndefined(obj)) { var i, paths = path.split("."), current = obj; for (i = 0; i < paths.length; ++i) { if (void 0 == current[paths[i]]) return; current = current[paths[i]] } return current } }, isThePatientAlreadyEnrolled = function() { return _.map($scope.activePrograms, function(program) { return program.program.uuid }).indexOf($scope.programSelected.uuid) > -1 }, isProgramSelected = function() { return $scope.programSelected && $scope.programSelected.uuid }; $scope.hasPatientEnrolledToSomePrograms = function() { return !_.isEmpty($scope.activePrograms) }, $scope.hasPatientAnyPastPrograms = function() { return !_.isEmpty($scope.endedPrograms) }, $scope.enrollPatient = function() { if (!isProgramSelected()) return messagingService.showMessage("error", "PROGRAM_MANAGEMENT_SELECT_PROGRAM_MESSAGE_KEY"), $q.when({}); if (isThePatientAlreadyEnrolled()) return messagingService.showMessage("error", "PROGRAM_MANAGEMENT_ALREADY_ENROLLED_PROGRAM_MESSAGE_KEY"), $q.when({}); var stateUuid = $scope.workflowStateSelected && $scope.workflowStateSelected.uuid ? $scope.workflowStateSelected.uuid : null; return spinner.forPromise(programService.enrollPatientToAProgram($scope.patient.uuid, $scope.programSelected.uuid, $scope.programEnrollmentDate, stateUuid, $scope.patientProgramAttributes, $scope.programAttributeTypes).then(successCallback, failureCallback)) }; var isProgramStateChanged = function(patientProgram, activePatientProgramState) { return !(!_.isEmpty(activePatientProgramState) || void 0 == patientProgram.selectedState) || patientProgram.selectedState && patientProgram.selectedState.uuid != activePatientProgramState.state.uuid }, isOutcomeSelected = function(patientProgram) { return !_.isEmpty(objectDeepFind(patientProgram, "outcomeData.uuid")) }, getActivePatientProgramState = function(states) { return _.find(states, function(state) { return null == state.endDate && !state.voided }) }; $scope.updatePatientProgram = function(patientProgram) { $scope.patientProgram = patientProgram; var activePatientProgramState = getActivePatientProgramState(patientProgram.states), activeStateDate = activePatientProgramState ? DateUtil.parse(activePatientProgramState.startDate) : null, dateCompleted = null; if (isProgramStateChanged(patientProgram, activePatientProgramState)) { var startDate = getCurrentDate(); if (activePatientProgramState && DateUtil.isBeforeDate(startDate, activeStateDate)) return void messagingService.showMessage("error", "PROGRAM_MANAGEMENT_STATE_CANT_START_BEFORE_KEY (" + DateUtil.formatDateWithoutTime(activeStateDate) + ")"); patientProgram.states.push({ state: { uuid: patientProgram.selectedState.uuid }, startDate: startDate }) } return isOutcomeSelected(patientProgram) && (dateCompleted = DateUtil.getDateWithoutTime(getCurrentDate()), activePatientProgramState && DateUtil.isBeforeDate(dateCompleted, activeStateDate)) ? void messagingService.showMessage("error", "PROGRAM_MANAGEMENT_PROGRAM_CANT_END_BEFORE_KEY (" + DateUtil.formatDateWithoutTime(activeStateDate) + ")") : void spinner.forPromise(programService.updatePatientProgram(patientProgram, $scope.programAttributeTypes, dateCompleted).then(successCallback, failureCallback)) }; var voidPatientProgram = function(patientProgram, closeConfirmBox) { patientProgram.voided = !0; var promise = programService.updatePatientProgram(patientProgram, $scope.programAttributeTypes).then(successCallback, failureCallback).then(closeConfirmBox); spinner.forPromise(promise) }, unVoidPatientProgram = function(patientProgram, closeConfirmBox) { delete patientProgram.voidReason, delete patientProgram.voided, patientProgram.deleting = !1, closeConfirmBox() }; $scope.confirmDeletion = function(patientProgram) { var scope = {}; scope.message = "Are you sure, you want to delete " + patientProgram.display + "?", scope.cancel = _.partial(unVoidPatientProgram, patientProgram, _), scope["delete"] = _.partial(voidPatientProgram, patientProgram, _), confirmBox({ scope: scope, actions: [{ name: "cancel", display: "cancel" }, { name: "delete", display: "delete" }], className: "ngdialog-theme-default delete-program-popup" }) }, $scope.toggleDelete = function(program) { program.deleting = !program.deleting }, $scope.toggleEdit = function(program) { $scope.tempProgram = angular.copy(program), program.editing = !program.editing }, $scope.cancelChange = function(program) { populateDefaultSelectedState(program), program.patientProgramAttributes = $scope.tempProgram.patientProgramAttributes, program.editing = !program.editing }, $scope.setWorkflowStates = function(program) { $scope.patientProgramAttributes = {}, $scope.programWorkflowStates = $scope.getStates(program) }, $scope.getStates = function(program) { var states = []; return program && program.allWorkflows && program.allWorkflows.length && program.allWorkflows[0].states.length && (states = program.allWorkflows[0].states), states }, $scope.canRemovePatientState = function(state) { return null == state.endDate }, $scope.removePatientState = function(patientProgram) { var currProgramState = getActivePatientProgramState(patientProgram.states), currProgramStateUuid = objectDeepFind(currProgramState, "uuid"); spinner.forPromise(programService.deletePatientState(patientProgram.uuid, currProgramStateUuid).then(successCallback, failureCallback)) }, $scope.hasStates = function(program) { return program && !_.isEmpty(program.allWorkflows) && !_.isEmpty($scope.programWorkflowStates) }, $scope.hasProgramWorkflowStates = function(patientProgram) { return !_.isEmpty($scope.getStates(patientProgram.program)) }, $scope.hasOutcomes = function(program) { return program.outcomesConcept && !_.isEmpty(program.outcomesConcept.setMembers) }, $scope.getCurrentStateDisplayName = function(program) { var currentState = getActivePatientProgramState(program.states); return _.get(currentState, "state.concept.display") }, $scope.getMaxAllowedDate = function(states) { var minStartDate = DateUtil.getDateWithoutTime(new Date); if (states && angular.isArray(states)) for (var stateIndex = 0; stateIndex < states.length; stateIndex++) states[stateIndex].startDate < minStartDate && (minStartDate = states[stateIndex].startDate); return minStartDate }, $scope.isIncluded = function(attribute) { return !($scope.programSelected && _.includes(attribute.excludeFrom, $scope.programSelected.name)) }, init() }]), angular.module("bahmni.common.uicontrols.programmanagment").service("programHelper", ["appService", function(appService) { function shouldDisplayAllAttributes(programDisplayControlConfig) { return programDisplayControlConfig && void 0 == programDisplayControlConfig.programAttributes || void 0 == programDisplayControlConfig } var self = this, programConfiguration = appService.getAppDescriptor().getConfig("program") && appService.getAppDescriptor().getConfig("program").value, isAttributeRequired = function(attribute) { var attributeName = attribute.attributeType.display; return programConfiguration && programConfiguration[attributeName] && programConfiguration[attributeName].required }; this.filterRetiredPrograms = function(programs) { return _.filter(programs, function(program) { return !program.retired }) }, this.filterRetiredWorkflowsAndStates = function(workflows) { var allWorkflows = _.filter(workflows, function(workflow) { return !workflow.retired }); return _.forEach(allWorkflows, function(workflow) { workflow.states = _.filter(workflow.states, function(state) { return !state.retired }) }), allWorkflows }, this.filterRetiredOutcomes = function(outcomes) { return _.filter(outcomes, function(outcome) { return !outcome.retired }) }; var mapAttributes = function(attribute) { attribute.name = attribute.attributeType.description ? attribute.attributeType.description : attribute.name, attribute.value = attribute.value, attribute.required = isAttributeRequired(attribute) }, mapPrograms = function(program) { program.dateEnrolled = Bahmni.Common.Util.DateUtil.parseServerDateToDate(program.dateEnrolled), program.dateCompleted = Bahmni.Common.Util.DateUtil.parseServerDateToDate(program.dateCompleted), program.program.allWorkflows = self.filterRetiredWorkflowsAndStates(program.program.allWorkflows), _.forEach(program.attributes, function(attribute) { mapAttributes(attribute) }) }; this.filterProgramAttributes = function(patientPrograms, programAttributeTypes) { var programDisplayControlConfig = appService.getAppDescriptor().getConfigValue("programDisplayControl"), config = programDisplayControlConfig ? programDisplayControlConfig.programAttributes : [], configAttrList = []; return configAttrList = shouldDisplayAllAttributes(programDisplayControlConfig) ? programAttributeTypes : programAttributeTypes.filter(function(each) { return config && config.indexOf(each.name) !== -1 }), _.isEmpty(configAttrList) ? patientPrograms.map(function(patientProgram) { return patientProgram.attributes = [], patientProgram }) : (patientPrograms.forEach(function(program) { var attrsToBeDisplayed = []; configAttrList.forEach(function(configAttr) { var attr = _.find(program.attributes, function(progAttr) { return progAttr.attributeType.display === configAttr.name }); attr = attr ? attr : { value: "" }, attr.attributeType = configAttr, attr.attributeType.display = configAttr.name, attrsToBeDisplayed.push(attr) }), program.attributes = attrsToBeDisplayed }), patientPrograms) }, this.groupPrograms = function(patientPrograms) { var activePrograms = [], endedPrograms = [], groupedPrograms = {}; if (patientPrograms) { var filteredPrograms = this.filterRetiredPrograms(patientPrograms); _.forEach(filteredPrograms, function(program) { mapPrograms(program), program.dateCompleted ? endedPrograms.push(program) : activePrograms.push(program) }), groupedPrograms.activePrograms = _.sortBy(activePrograms, function(program) { return moment(program.dateEnrolled).toDate() }).reverse(), groupedPrograms.endedPrograms = _.sortBy(endedPrograms, function(program) { return moment(program.dateCompleted).toDate() }).reverse() } return groupedPrograms } }]), angular.module("bahmni.common.uicontrols.programmanagment").directive("managePrograms", function() { return { templateUrl: "../common/uicontrols/programmanagement/views/programEnrollment.html", controller: "ManageProgramController", scope: { patient: "=" } } }), angular.module("bahmni.common.uicontrols.programmanagment").controller("ProgramAttributesController", ["$scope", function($scope) { var program = $scope.patientProgram.program; $scope.getProgramAttributesMap = function() { var programAttributesMap = {}, programAttributes = $scope.patientProgram.attributes; return _.forEach($scope.programAttributeTypes, function(programAttributeType) { var programAttribute = getProgramAttributeByType(programAttributes, programAttributeType); void 0 == programAttribute || programAttribute.voided || (programAttributesMap[programAttributeType.name] = programAttribute.value, isCodedConceptFormat(programAttributeType.format) ? programAttributesMap[programAttributeType.name] = programAttribute.value && programAttribute.value.uuid : isDateFormat(programAttributeType.format) && (programAttributesMap[programAttributeType.name] = Bahmni.Common.Util.DateUtil.parseServerDateToDate(programAttributesMap[programAttributeType.name]))) }), programAttributesMap }, $scope.getValueForAttributeType = function(attributeType) { var programAttributesMap = $scope.patientProgram.patientProgramAttributes; if (isDateFormat(attributeType.format)) return programAttributesMap[attributeType.name] ? Bahmni.Common.Util.DateUtil.formatDateWithoutTime(programAttributesMap[attributeType.name]) : ""; if (isCodedConceptFormat(attributeType.format)) { var mrsAnswer = _.find(attributeType.answers, function(answer) { return answer.conceptId == programAttributesMap[attributeType.name] }); return mrsAnswer ? mrsAnswer.description : "" } return programAttributesMap[attributeType.name] }, $scope.isIncluded = function(attribute) { return !(program && _.includes(attribute.excludeFrom, program.name)) }; var getProgramAttributeByType = function(programAttributes, attributeType) { return _.find(programAttributes, function(programAttribute) { return programAttribute.attributeType.uuid == attributeType.uuid }) }, isDateFormat = function(format) { return "org.openmrs.util.AttributableDate" == format || "org.openmrs.customdatatype.datatype.DateDatatype" == format }, isCodedConceptFormat = function(format) { return "org.bahmni.module.bahmnicore.customdatatype.datatype.CodedConceptDatatype" == format }; $scope.patientProgram.patientProgramAttributes = $scope.getProgramAttributesMap() }]).directive("programAttributes", function() { return { controller: "ProgramAttributesController", templateUrl: "../common/uicontrols/programmanagement/views/programAttributes.html", scope: { patientProgram: "=", programAttributeTypes: "=" } } }), angular.module("bahmni.common.uicontrols.programmanagment").directive("timeline", ["$timeout", function($timeout) { var link = function($scope, $element) { $timeout(function() { var dateUtil = Bahmni.Common.Util.DateUtil, data = getDataModel($scope.program), svg = d3.select($element[0]).select(".timeline-view").append("svg"), elementDimension = $element[0].getBoundingClientRect(), sortedDates = _.map(data.states, "date"), xMin = 0, xMax = elementDimension.width - 15, endDate = $scope.program.dateCompleted ? dateUtil.parse($scope.program.dateCompleted) : new Date, dateFormatter = d3.time.format("%_d %b%y"), timeScale = d3.time.scale().domain([sortedDates[0], endDate]).range([xMin, xMax]), states = svg.selectAll(".states").data(data.states), stateGroup = states.enter().append("g").classed("states", !0), tooltipEl = d3.select($element[0]).select(".tool-tip"), showTooltip = function(d) { var eventEl = this; tooltipEl.html(function() { return dateFormatter(d.date) + " | " + d.state }).style("left", function() { var tooltipWidth = $(this).width(), eventX = eventEl.getBBox().x, posX = eventX + tooltipWidth > elementDimension.width ? elementDimension.width - tooltipWidth : eventX; return posX + "px" }).style("visibility", "visible") }; stateGroup.append("rect").classed("label-bg", !0), stateGroup.append("text").classed("label", !0), stateGroup.append("rect").classed("date-bg", !0), stateGroup.append("line").classed("date-line", !0), stateGroup.append("text").classed("date", !0); var stateBar = { y: 5, height: 23, textPaddingX: 6 }, dateBar = { y: 30, height: 30, xPadding: -4, textPaddingY: 53 }, dateTick = { y: 0, height: 40 }; states.select(".label-bg").attr("x", function(d) { return timeScale(d.date) }).attr("y", stateBar.y).attr("height", stateBar.height).attr("width", function(d) { return xMax - timeScale(d.date) }), states.select(".label").attr("x", function(d) { return timeScale(d.date) + stateBar.textPaddingX }).attr("y", stateBar.y + .7 * stateBar.height).text(function(d) { return d.state }), states.select(".date-bg").attr("x", function(d) { return timeScale(d.date) + dateBar.xPadding }).attr("y", dateBar.y).attr("height", dateBar.height).attr("width", xMax), states.select(".date-line").attr("x1", function(d) { return timeScale(d.date) }).attr("y1", dateTick.y).attr("x2", function(d) { return timeScale(d.date) }).attr("y2", dateTick.y + dateTick.height), states.select(".date").attr("x", function(d) { return timeScale(d.date) }).attr("y", dateBar.textPaddingY).text(function(d) { return dateFormatter(d.date) }), states.select(".label-bg").on("mouseenter", showTooltip), states.select(".label-bg").on("click", showTooltip), states.select(".label-bg").on("mouseout", function() { tooltipEl.style("visibility", "hidden") }), data.completed || _.isEmpty(data.states) || svg.append("polygon").attr("points", xMax + "," + stateBar.y + " " + (xMax + 12) + "," + (stateBar.y + stateBar.height / 2) + " " + (xMax - 1) + "," + (stateBar.y + stateBar.height)) }, 0) }, getActiveProgramStates = function(patientProgram) { return _.reject(patientProgram.states, function(st) { return st.voided }) }, getDataModel = function(program) { var states = _.sortBy(_.map(getActiveProgramStates(program), function(stateObject) { return { state: stateObject.state.concept.display, date: moment(stateObject.startDate).toDate() } }), "date"), completed = isProgramCompleted(program); return { states: states, completed: completed } }, isProgramCompleted = function(program) { return !_.isEmpty(program.dateCompleted) }; return { restrict: "E", templateUrl: "../common/uicontrols/programmanagement/views/timeline.html", link: link, scope: { program: "=" } } }]), Bahmni.Common.Domain.PatientProgramMapper = function() { this.map = function(patientProgram, programAttributeTypes, dateCompleted) { var attributeFormatter = new Bahmni.Common.Domain.AttributeFormatter; return { dateEnrolled: moment(Bahmni.Common.Util.DateUtil.getDateWithoutTime(patientProgram.dateEnrolled)).format(Bahmni.Common.Constants.ServerDateTimeFormat), states: patientProgram.states, uuid: patientProgram.uuid, dateCompleted: dateCompleted ? moment(dateCompleted).format(Bahmni.Common.Constants.ServerDateTimeFormat) : null, outcome: patientProgram.outcomeData ? patientProgram.outcomeData.uuid : null, attributes: attributeFormatter.getMrsAttributesForUpdate(patientProgram.patientProgramAttributes, programAttributeTypes, patientProgram.attributes), voided: !!patientProgram.voided, voidReason: patientProgram.voidReason } } }, function() { var constructSearchResult = function(concept) { var conceptName = concept.shortName || concept.name.name || concept.name; return { label: conceptName, value: conceptName, concept: concept, uuid: concept.uuid, name: conceptName } }, find = function(allAnswers, savedAnswer) { return _.find(allAnswers, function(answer) { return savedAnswer && savedAnswer.uuid === answer.concept.uuid }) }, toBeInjected = ["conceptService"], conceptDropdown = function(conceptService) { var controller = function($scope) { $scope.onChange = $scope.onChange(); var response = function(answers) { $scope.answers = answers, $scope.selectedAnswer = find(answers, $scope.selectedAnswer) }; return !$scope.answersConceptName && $scope.defaultConcept ? void conceptService.getAnswers($scope.defaultConcept).then(function(results) { return _.map(results, constructSearchResult) }).then(response) : void conceptService.getAnswersForConceptName({ answersConceptName: $scope.answersConceptName }).then(function(results) { return _.map(results, constructSearchResult) }).then(response) }; return { controller: controller, restrict: "E", scope: { selectedAnswer: "=model", answersConceptName: "=?", defaultConcept: "=", onChange: "&", onInvalidClass: "@", isValid: "=", ngDisabled: "=" }, templateUrl: "../common/uicontrols/concept-dropdown/views/conceptDropdown.html" } }; conceptDropdown.$inject = toBeInjected, angular.module("bahmni.common.uicontrols").directive("conceptDropdown", conceptDropdown) }(), angular.module("bahmni.common.domain").factory("programService", ["$http", "programHelper", "appService", function($http, programHelper, appService) { var PatientProgramMapper = new Bahmni.Common.Domain.PatientProgramMapper, getAllPrograms = function() { return $http.get(Bahmni.Common.Constants.programUrl, { params: { v: "default" } }).then(function(response) { var allPrograms = programHelper.filterRetiredPrograms(response.data.results); return _.forEach(allPrograms, function(program) { program.allWorkflows = programHelper.filterRetiredWorkflowsAndStates(program.allWorkflows), program.outcomesConcept && (program.outcomesConcept.setMembers = programHelper.filterRetiredOutcomes(program.outcomesConcept.setMembers)) }), allPrograms }) }, enrollPatientToAProgram = function(patientUuid, programUuid, dateEnrolled, stateUuid, patientProgramAttributes, programAttributeTypes) { var attributeFormatter = new Bahmni.Common.Domain.AttributeFormatter, req = { url: Bahmni.Common.Constants.programEnrollPatientUrl, content: { patient: patientUuid, program: programUuid, dateEnrolled: moment(dateEnrolled).format(Bahmni.Common.Constants.ServerDateTimeFormat), attributes: attributeFormatter.removeUnfilledAttributes(attributeFormatter.getMrsAttributes(patientProgramAttributes, programAttributeTypes || [])) }, headers: { "Content-Type": "application/json" } }; return _.isEmpty(stateUuid) || (req.content.states = [{ state: stateUuid, startDate: moment(dateEnrolled).format(Bahmni.Common.Constants.ServerDateTimeFormat) }]), $http.post(req.url, req.content, req.headers) }, getPatientPrograms = function(patientUuid, filterAttributesForProgramDisplayControl, patientProgramUuid) { var params = { v: "full", patientProgramUuid: patientProgramUuid, patient: patientUuid }; return $http.get(Bahmni.Common.Constants.programEnrollPatientUrl, { params: params }).then(function(response) { var patientPrograms = response.data.results; return getProgramAttributeTypes().then(function(programAttributeTypes) { return filterAttributesForProgramDisplayControl && (patientPrograms = programHelper.filterProgramAttributes(response.data.results, programAttributeTypes)), programHelper.groupPrograms(patientPrograms) }) }) }, savePatientProgram = function(patientProgramUuid, content) { var req = { url: Bahmni.Common.Constants.programEnrollPatientUrl + "/" + patientProgramUuid, content: content, headers: { "Content-Type": "application/json" } }; return $http.post(req.url, req.content, req.headers) }, deletePatientState = function(patientProgramUuid, patientStateUuid) { var req = { url: Bahmni.Common.Constants.programStateDeletionUrl + "/" + patientProgramUuid + "/state/" + patientStateUuid, content: { "!purge": "", reason: "User deleted the state." }, headers: { "Content-Type": "application/json" } }; return $http["delete"](req.url, req.content, req.headers) }, getProgramAttributeTypes = function() { return $http.get(Bahmni.Common.Constants.programAttributeTypes, { params: { v: "custom:(uuid,name,description,datatypeClassname,datatypeConfig,concept)" } }).then(function(response) { var programAttributesConfig = appService.getAppDescriptor().getConfigValue("program"), mandatoryProgramAttributes = []; for (var attributeName in programAttributesConfig) programAttributesConfig[attributeName].required && mandatoryProgramAttributes.push(attributeName); return (new Bahmni.Common.Domain.AttributeTypeMapper).mapFromOpenmrsAttributeTypes(response.data.results, mandatoryProgramAttributes, programAttributesConfig).attributeTypes }) }, updatePatientProgram = function(patientProgram, programAttributeTypes, dateCompleted) { return savePatientProgram(patientProgram.uuid, PatientProgramMapper.map(patientProgram, programAttributeTypes, dateCompleted)) }, getProgramStateConfig = function() { var config = appService.getAppDescriptor().getConfigValue("programDisplayControl"); return !!config && config.showProgramStateInTimeline }, getEnrollmentInfoFor = function(patientUuid, representation) { var params = { patient: patientUuid, v: representation }; return $http.get(Bahmni.Common.Constants.programEnrollPatientUrl, { params: params }).then(function(response) { return response.data.results }) }; return { getAllPrograms: getAllPrograms, enrollPatientToAProgram: enrollPatientToAProgram, getPatientPrograms: getPatientPrograms, savePatientProgram: savePatientProgram, updatePatientProgram: updatePatientProgram, deletePatientState: deletePatientState, getProgramAttributeTypes: getProgramAttributeTypes, getProgramStateConfig: getProgramStateConfig, getEnrollmentInfoFor: getEnrollmentInfoFor } }]); var Bahmni = Bahmni || {}; Bahmni.Clinical = Bahmni.Clinical || {}, Bahmni.Clinical.DisplayControl = Bahmni.Clinical.DisplayControl || {}, angular.module("bahmni.clinical", ["bahmni.common.config", "bahmni.common.domain", "bahmni.common.conceptSet", "bahmni.common.uiHelper", "bahmni.common.gallery", "bahmni.common.logging"]), Bahmni.Clinical.ResultGrouper = function() {}, Bahmni.Clinical.ResultGrouper.prototype.group = function(inputArray, groupKeyFunction, nameForGroupedValue, nameForKey) { var result = [], arrayInObjectForm = {}; return nameForKey = nameForKey || "key", nameForGroupedValue = nameForGroupedValue || "values", inputArray.forEach(function(obj) { arrayInObjectForm[groupKeyFunction(obj)] ? arrayInObjectForm[groupKeyFunction(obj)].values.push(obj) : arrayInObjectForm[groupKeyFunction(obj)] = { values: [obj] } }), angular.forEach(arrayInObjectForm, function(item, key) { var group = {}; group[nameForKey] = key, group[nameForGroupedValue] = item.values, result.push(group) }), result }, Bahmni.Clinical.DrugOrder = function() { var DateUtil = Bahmni.Common.Util.DateUtil, DrugOrder = function(drugOrderData) { angular.extend(this, drugOrderData) }; return DrugOrder.create = function(drugOrderData) { return new DrugOrder(drugOrderData) }, DrugOrder.createFromUIObject = function(drugOrderData) { var dateUtil = Bahmni.Common.Util.DateUtil, getDosingInstructions = function(drugOrderData) { var dosingInstructions = {}; return dosingInstructions.instructions = drugOrderData.instructions && drugOrderData.instructions, dosingInstructions.additionalInstructions = drugOrderData.additionalInstructions, drugOrderData.frequencyType === Bahmni.Clinical.Constants.dosingTypes.variable ? (dosingInstructions.morningDose = drugOrderData.variableDosingType.morningDose, dosingInstructions.afternoonDose = drugOrderData.variableDosingType.afternoonDose, dosingInstructions.eveningDose = drugOrderData.variableDosingType.eveningDose, drugOrderData["continue"] ? dosingInstructions["continue"] = !0 : dosingInstructions["continue"] = !1) : drugOrderData["continue"] ? dosingInstructions["continue"] = !0 : dosingInstructions["continue"] = !1, JSON.stringify(dosingInstructions) }, frequency = drugOrderData.isUniformDosingType() && !drugOrderData.isCurrentDosingTypeEmpty() && drugOrderData.uniformDosingType.frequency, route = drugOrderData.route, drugOrder = new DrugOrder({ careSetting: "OUTPATIENT", drug: drugOrderData.drug, drugNonCoded: drugOrderData.drugNonCoded, orderType: "Drug Order", dosingInstructionType: Bahmni.Clinical.Constants.flexibleDosingInstructionsClass, dosingInstructions: { dose: drugOrderData.uniformDosingType.dose, doseUnits: drugOrderData.doseUnits, route: route, frequency: frequency, asNeeded: drugOrderData.asNeeded, administrationInstructions: getDosingInstructions(drugOrderData), quantity: drugOrderData.quantity, quantityUnits: drugOrderData.quantityUnit, numberOfRefills: 0 }, duration: drugOrderData.duration, durationUnits: drugOrderData.durationUnit, scheduledDate: dateUtil.parse(drugOrderData.scheduledDate), autoExpireDate: dateUtil.parse(drugOrderData.autoExpireDate), previousOrderUuid: drugOrderData.previousOrderUuid, action: drugOrderData.action, orderReasonConcept: drugOrderData.orderReasonConcept, orderReasonText: drugOrderData.orderReasonText, dateStopped: dateUtil.parse(drugOrderData.dateStopped), concept: drugOrderData.concept, sortWeight: drugOrderData.sortWeight, orderGroup: { uuid: drugOrderData.orderGroupUuid, orderSet: { uuid: drugOrderData.orderSetUuid } } }); return drugOrder.dosingInstructions.quantityUnits || (drugOrder.dosingInstructions.quantityUnits = "Unit(s)"), drugOrder }, DrugOrder.prototype = { isActiveOnDate: function(date) { return date >= DateUtil.getDate(this.effectiveStartDate) && date <= DateUtil.getDate(this.effectiveStopDate) }, getStatusOnDate: function(date) { return DateUtil.isSameDate(this.dateStopped, date) ? "stopped" : this.isActiveOnDate(date) ? "active" : "inactive" }, isActive: function() { return this.isActiveOnDate(DateUtil.today()) } }, DrugOrder }(); var constructDrugNameDisplay = function(drug) { if (!_.isEmpty(drug)) return drug.name + " (" + drug.form + ")" }; Bahmni.Clinical.DrugOrderViewModel = function(config, proto, encounterDate) { angular.copy(proto, this); var DateUtil = Bahmni.Common.Util.DateUtil, self = this; config = config || {}; var inputOptionsConfig = config.inputOptionsConfig || {}, drugFormDefaults = inputOptionsConfig.drugFormDefaults || {}, durationUnits = config.durationUnits || [], now = DateUtil.now(), today = function() { return DateUtil.parse(self.encounterDate) }; Object.defineProperty(this, "effectiveStartDate", { get: function() { return self._effectiveStartDate }, set: function(value) { self._effectiveStartDate = value, DateUtil.parse(value) > today() ? self.scheduledDate = self._effectiveStartDate : self.scheduledDate = null }, enumerable: !0 }), Object.defineProperty(this, "doseUnits", { enumerable: !0, get: function() { return this.isUniformDosingType() ? this.uniformDosingType.doseUnits : this.isVariableDosingType() ? this.variableDosingType.doseUnits : null }, set: function(value) { this.isUniformDosingType() ? this.uniformDosingType.doseUnits = value : this.isVariableDosingType() && (this.variableDosingType.doseUnits = value) } }); var getDosingType = function() { return self.isUniformDosingType() ? self.uniformDosingType : self.variableDosingType }, destructureReal = function(number) { var mantissa = parseFloat((number - Math.floor(number)).toFixed(2)), abscissa = Math.ceil(number - mantissa), result = _.result(_.find(config.getDoseFractions(), function(item) { return item.value === mantissa }), "label"), response = { dose: number, fraction: null }; return result && (response.dose = abscissa, response.fraction = { label: result, value: mantissa }), response }; if (this.encounterDate = encounterDate ? encounterDate : now, this.asNeeded = this.asNeeded || !1, this.route = this.route || void 0, this.durationUnit = this.durationUnit || inputOptionsConfig.defaultDurationUnit, this.simpleDrugForm = this.simpleDrugForm || inputOptionsConfig.simpleDrugForm || !1, this.instructions = this.instructions || inputOptionsConfig.defaultInstructions, this.autoExpireDate = this.autoExpireDate || void 0, this.frequencyType = this.frequencyType || Bahmni.Clinical.Constants.dosingTypes.uniform, this.uniformDosingType = this.uniformDosingType || {}, this.uniformDosingType.dose && config.getDoseFractions && !_.isEmpty(config.getDoseFractions())) { var destructredNumber = destructureReal(this.uniformDosingType.dose); this.uniformDosingType.dose = 0 === destructredNumber.dose ? "" : destructredNumber.dose, destructredNumber.fraction && (this.uniformDosingType.doseFraction = destructredNumber.fraction) } this.variableDosingType = this.variableDosingType || {}, this.durationInDays = this.durationInDays || 0, this.isDiscontinuedAllowed = this.isDiscontinuedAllowed || !0, this.isEditAllowed = this.isEditAllowed || !0, this.quantityEnteredViaEdit = this.quantityEnteredViaEdit || !1, this.quantityEnteredManually = this.quantityEnteredManually || !1, this.quantityUnitEnteredManually = this.quantityUnitEnteredManually || !1, this.isBeingEdited = this.isBeingEdited || !1, this.orderAttributes = [], this.isNonCodedDrug = this.isNonCodedDrug || !1, this.isDurationRequired = !inputOptionsConfig.duration || 0 != inputOptionsConfig.duration.required, inputOptionsConfig.defaultStartDate !== !1 || this.effectiveStartDate ? this.effectiveStartDate = this.effectiveStartDate || this.encounterDate : this.effectiveStartDate = null, this.isUniformFrequency = !1, this.variableDosingType.morningDose = this.variableDosingType.morningDose || 0, this.variableDosingType.afternoonDose = this.variableDosingType.afternoonDose || 0, this.variableDosingType.eveningDose = this.variableDosingType.eveningDose || 0, this.showExtraInfo = !1, this.overlappingScheduledWith = function(otherDrugOrder) { var dateUtil = Bahmni.Common.Util.DateUtil; return !otherDrugOrder.effectiveStopDate && !this.effectiveStopDate || (otherDrugOrder.effectiveStopDate ? this.effectiveStopDate ? dateUtil.diffInSeconds(this.effectiveStartDate, otherDrugOrder.effectiveStopDate) <= 0 && dateUtil.diffInSeconds(this.effectiveStopDate, otherDrugOrder.effectiveStartDate) > -1 : dateUtil.diffInSeconds(this.effectiveStartDate, otherDrugOrder.effectiveStartDate) > -1 && dateUtil.diffInSeconds(this.effectiveStartDate, otherDrugOrder.effectiveStopDate) < 1 : dateUtil.diffInSeconds(this.effectiveStopDate, otherDrugOrder.effectiveStartDate) > -1) }; var morphToMixedFraction = function(number) { var mantissa = parseFloat((number - Math.floor(number)).toFixed(2)), abscissa = Math.ceil(number - mantissa); if (!config.getDoseFractions || _.isEmpty(config.getDoseFractions()) || 0 === mantissa) return number; var result = _.result(_.find(config.getDoseFractions(), function(item) { return item.value === mantissa }), "label"); return result ? abscissa ? "" + abscissa + result : "" + result : number }, simpleDoseAndFrequency = function() { var doseAndUnits, uniformDosingType = self.uniformDosingType, mantissa = self.uniformDosingType.doseFraction ? self.uniformDosingType.doseFraction.value : 0, dose = uniformDosingType.dose ? uniformDosingType.dose : 0; return (uniformDosingType.dose || mantissa) && (doseAndUnits = blankIfFalsy(morphToMixedFraction(parseFloat(dose) + mantissa)) + " " + blankIfFalsy(self.doseUnits)), addDelimiter(blankIfFalsy(doseAndUnits), ", ") + addDelimiter(blankIfFalsy(uniformDosingType.frequency), ", ") }, numberBasedDoseAndFrequency = function() { var variableDosingType = self.variableDosingType, variableDosingString = addDelimiter(morphToMixedFraction(variableDosingType.morningDose || 0) + "-" + morphToMixedFraction(variableDosingType.afternoonDose || 0) + "-" + morphToMixedFraction(variableDosingType.eveningDose || 0), " "); if (!self.isVariableDoseEmpty(variableDosingType)) return addDelimiter((variableDosingString + blankIfFalsy(self.doseUnits)).trim(), ", ") }; this.isVariableDoseEmpty = function(variableDosingType) { return !variableDosingType.morningDose && !variableDosingType.afternoonDose && !variableDosingType.eveningDose }; var asNeeded = function(asNeeded) { return asNeeded && config.translate ? config.translate(null, "MEDICATION_AS_NEEDED") : asNeeded ? "sos" : "" }, blankIfFalsy = function(value) { return value ? value.toString().trim() : "" }, getDoseAndFrequency = function() { return self.frequencyType === Bahmni.Clinical.Constants.dosingTypes.uniform ? simpleDoseAndFrequency() : numberBasedDoseAndFrequency() }, addDelimiter = function(item, delimiter) { return item && item.length > 0 ? item + delimiter : item }, getInstructions = function() { if (self.instructions !== Bahmni.Clinical.Constants.asDirectedInstruction) return self.instructions }, getOtherDescription = function(withRoute, withDuration) { var otherDescription = addDelimiter(blankIfFalsy(getInstructions()), ", ") + addDelimiter(blankIfFalsy(asNeeded(self.asNeeded)), ", "); return withRoute ? otherDescription += addDelimiter(blankIfFalsy(self.route), " - ") : (otherDescription = otherDescription.substring(0, otherDescription.length - 2), otherDescription = addDelimiter(blankIfFalsy(otherDescription), " - ")), withDuration && self.duration && 0 != self.duration && (otherDescription = otherDescription + addDelimiter(blankIfFalsy(self.duration), " ") + addDelimiter(blankIfFalsy(self.durationUnit), ", ")), otherDescription = otherDescription.substring(0, otherDescription.length - 2) }; this.getDoseInformation = function() { return getDoseAndFrequency() }, this.getDisplayName = function() { return this.drugNameDisplay ? this.drugNameDisplay : constructDrugNameDisplay(this.drug) }, this.getDrugOrderName = function(showDrugForm) { return showDrugForm ? this.getDisplayName() : self.drugNonCoded ? self.drugNonCoded : self.drug.name }, this.getDescription = function() { return addDelimiter(blankIfFalsy(getDoseAndFrequency()), " ") + getOtherDescription(!0, !0) }, this.getDescriptionWithoutRoute = function() { return addDelimiter(blankIfFalsy(getDoseAndFrequency()), " ") + getOtherDescription(!1, !0) }, this.getDescriptionWithoutRouteAndDuration = function() { var otherDescription = getOtherDescription(!1, !1), description = addDelimiter(blankIfFalsy(getDoseAndFrequency()), " "); return otherDescription ? description + otherDescription : description.substring(0, description.length - 2) }, this.getDescriptionWithoutDuration = function() { var otherDescription = getOtherDescription(!0, !1), description = addDelimiter(blankIfFalsy(getDoseAndFrequency()), " "); return otherDescription ? description + otherDescription : description.substring(0, description.length - 2) }, this.getDescriptionWithQuantity = function() { var description = self.getDescription(), qtywithUnit = self.getQuantityWithUnit(); return _.isEmpty(qtywithUnit) ? description : addDelimiter(description, "(") + addDelimiter(qtywithUnit, ")") }, this.getQuantityWithUnit = function() { return this.simpleDrugForm === !0 || 0 === self.quantity ? "" : addDelimiter(blankIfFalsy(self.quantity), " ") + blankIfFalsy(quantityUnitsFrom(self.quantityUnit)) }; var getFrequencyPerDay = function() { var frequency = self.isUniformDosingType() && _.find(config.frequencies, function(frequency) { return self.uniformDosingType.frequency && frequency.name === self.uniformDosingType.frequency }); return frequency && frequency.frequencyPerDay }, findAnElement = function(array, element) { var found = _.find(array, function(arrayElement) { return arrayElement.name === element }); return found ? element : void 0 }, getDoseUnits = function(doseUnit) { return findAnElement(config.doseUnits, doseUnit) }, getRoute = function(route) { return findAnElement(config.routes, route) }; this.changeDrug = function(drug) { if (this.drug = drug, drug) { var defaults = drugFormDefaults[this.drug.form]; defaults && (this.doseUnits = getDoseUnits(defaults.doseUnits), this.route = getRoute(defaults.route)) } }, this.calculateDurationUnit = function() { if (self.frequencyType === Bahmni.Clinical.Constants.dosingTypes.uniform && null != self.uniformDosingType.frequency) { var defaultDurationUnitMap = inputOptionsConfig.frequencyDefaultDurationUnitsMap || []; defaultDurationUnitMap.forEach(function(range) { var minFrequency = eval(range.minFrequency), maxFrequency = eval(range.maxFrequency); (!minFrequency || minFrequency < getFrequencyPerDay()) && (!maxFrequency || getFrequencyPerDay() <= maxFrequency) && (self.durationUnit = range.defaultDurationUnit) }) } }, this.setFrequencyType = function(type) { self.frequencyType = type, self.frequencyType === Bahmni.Clinical.Constants.dosingTypes.variable ? (self.uniformDosingType.doseUnits && (self.variableDosingType.doseUnits = self.uniformDosingType.doseUnits), self.uniformDosingType = {}) : (self.variableDosingType.doseUnits && (self.uniformDosingType.doseUnits = self.variableDosingType.doseUnits), self.variableDosingType = {}) }, this.toggleFrequency = function() { this.isUniformFrequency ? (self.frequencyType = Bahmni.Clinical.Constants.dosingTypes.variable, self.setFrequencyType(self.frequencyType), this.isUniformFrequency = !1) : (self.frequencyType = Bahmni.Clinical.Constants.dosingTypes.uniform, self.setFrequencyType(self.frequencyType), this.isUniformFrequency = !0) }, this.toggleExtraInfo = function() { this.showExtraInfo = !this.showExtraInfo }, this.isCurrentDosingTypeEmpty = function() { var dosingType = getDosingType(); return _.every(dosingType, function(element) { return !element }) }, this.isVariableDosingType = function() { return self.isFrequencyType(Bahmni.Clinical.Constants.dosingTypes.variable) }, this.isUniformDosingType = function() { return self.isFrequencyType(Bahmni.Clinical.Constants.dosingTypes.uniform) }, this.isFrequencyType = function(type) { return self.frequencyType === type }, this.setQuantityEnteredManually = function() { self.quantityEnteredManually = !0 }, this.setQuantityUnitEnteredManually = function() { self.quantityUnitEnteredManually = !0 }, this.calculateDurationInDays = function() { var durationUnitFromConfig = _.find(durationUnits, function(unit) { return unit.name === self.durationUnit }); self.durationInDays = self.duration ? self.duration * (durationUnitFromConfig && durationUnitFromConfig.factor || 1) : Number.NaN }; var quantityUnitsFrom = function(doseUnit) { return doseUnit }, modifyForReverseSyncIfRequired = function(drugOrder) { drugOrder.reverseSynced && (drugOrder.uniformDosingType = {}, drugOrder.quantity = void 0, drugOrder.quantityUnit = void 0, drugOrder.doseUnits = void 0, drugOrder.changeDrug(drugOrder.drug)) }; this.calculateQuantityAndUnit = function() { if (self.calculateDurationInDays(), self.variableDosingType.morningDose > 0 || self.variableDosingType.afternoonDose > 0 || self.variableDosingType.eveningDose > 0 ? self.frequencyType = "variable" : self.frequencyType = "uniform", !self.quantityEnteredManually && !self.quantityEnteredViaEdit) { if (self.frequencyType === Bahmni.Clinical.Constants.dosingTypes.uniform) { var mantissa = self.uniformDosingType.doseFraction ? self.uniformDosingType.doseFraction.value : 0, dose = self.uniformDosingType.dose ? self.uniformDosingType.dose : 0; self.quantity = (dose + mantissa) * (self.uniformDosingType.frequency ? getFrequencyPerDay() : 0) * self.durationInDays } else if (self.frequencyType === Bahmni.Clinical.Constants.dosingTypes.variable) { var dose = self.variableDosingType; self.quantity = (dose.morningDose + dose.afternoonDose + dose.eveningDose) * self.durationInDays } self.quantity % 1 !== 0 && (self.quantity = self.quantity - self.quantity % 1 + 1) } self.quantityEnteredViaEdit && self.quantityUnit || self.quantityUnitEnteredManually ? self.quantityUnit = quantityUnitsFrom(self.quantityUnit) : self.quantityUnit = quantityUnitsFrom(self.doseUnits), self.quantityEnteredViaEdit = !1, self.quantityUnitEnteredViaEdit = !1 }, this.isStopped = function() { return !!self.dateStopped }, this.isScheduled = function() { return !self.isDiscontinuedOrStopped() && self.scheduledDate && self.scheduledDate > today() }, this.isActive = function() { return !self.isDiscontinuedOrStopped() && (!self.effectiveStopDate || self.effectiveStopDate >= today()) }, this.discontinued = function() { return self.action === Bahmni.Clinical.Constants.orderActions.discontinue }, this.isDiscontinuedOrStopped = function() { return (self.isStopped() || self.discontinued()) && void 0 === self.isMarkedForDiscontinue }; var defaultQuantityUnit = function(drugOrder) { drugOrder.quantityUnit || (drugOrder.quantityUnit = "Unit(s)") }; this.getSpanDetails = function() { var valueString = "- "; return _.forEach(this.span, function(value, key) { value && (valueString += value + " " + key + " + ") }), valueString.substring(0, valueString.length - 3) }, this.getDurationAndDurationUnits = function() { return self.duration ? self.duration + " " + self.durationUnit : "" }, this.refill = function(existingOrderStopDate) { var newDrugOrder = new Bahmni.Clinical.DrugOrderViewModel(config, this); newDrugOrder.previousOrderUuid = void 0, newDrugOrder.action = Bahmni.Clinical.Constants.orderActions["new"], newDrugOrder.uuid = void 0, newDrugOrder.dateActivated = void 0; var oldEffectiveStopDate = existingOrderStopDate ? new Date(existingOrderStopDate) : new Date(self.effectiveStopDate); return newDrugOrder.effectiveStartDate = oldEffectiveStopDate >= today() ? DateUtil.addSeconds(oldEffectiveStopDate, 1) : today(), newDrugOrder.calculateDurationInDays(), newDrugOrder.effectiveStopDate = DateUtil.addDays(DateUtil.parse(newDrugOrder.effectiveStartDate), newDrugOrder.durationInDays), modifyForReverseSyncIfRequired(newDrugOrder), defaultQuantityUnit(newDrugOrder), newDrugOrder.orderReasonText = null, newDrugOrder.orderReasonConcept = null, newDrugOrder.orderSetUuid = self.orderSetUuid, newDrugOrder.orderGroupUuid = void 0, newDrugOrder.isNewOrderSet = !1, newDrugOrder }, this.revise = function() { var newDrugOrder = new Bahmni.Clinical.DrugOrderViewModel(config, this); return newDrugOrder.previousOrderUuid = self.uuid, self.calculateDurationInDays(), newDrugOrder.previousOrderDurationInDays = self.durationInDays, newDrugOrder.action = Bahmni.Clinical.Constants.orderActions.revise, newDrugOrder.uuid = void 0, newDrugOrder.dateActivated = void 0, newDrugOrder.drugNameDisplay = constructDrugNameDisplay(self.drug) || self.drugNonCoded || self.concept.name, newDrugOrder.quantityEnteredViaEdit = !0, newDrugOrder.isBeingEdited = !0, newDrugOrder.orderSetUuid = self.orderSetUuid, newDrugOrder.orderGroupUuid = self.orderGroupUuid, newDrugOrder.isNewOrderSet = !1, newDrugOrder.effectiveStartDate <= today() && (newDrugOrder.effectiveStartDate = today()), modifyForReverseSyncIfRequired(newDrugOrder), defaultQuantityUnit(newDrugOrder), newDrugOrder }, this.cloneForEdit = function(index, config) { var editableDrugOrder = new Bahmni.Clinical.DrugOrderViewModel(config, this); return editableDrugOrder.currentIndex = index, editableDrugOrder.isBeingEdited = !0, editableDrugOrder.quantityEnteredViaEdit = !0, editableDrugOrder.orderSetUuid = self.orderSetUuid, editableDrugOrder.orderGroupUuid = self.orderGroupUuid, defaultQuantityUnit(editableDrugOrder), editableDrugOrder.frequencyType === Bahmni.Clinical.Constants.dosingTypes.variable && (editableDrugOrder.isUniformFrequency = !1), editableDrugOrder }, this.isDoseMandatory = function() { return inputOptionsConfig.routesToMakeDoseSectionNonMandatory = inputOptionsConfig.routesToMakeDoseSectionNonMandatory || [], !(inputOptionsConfig.routesToMakeDoseSectionNonMandatory.indexOf(this.route) !== -1 || _.isEmpty(self.uniformDosingType.doseUnits) && _.isEmpty(self.variableDosingType.doseUnits)) }, this.isMantissaRequired = function() { return this.isDoseMandatory() && this.isUniformFrequency && !this.uniformDosingType.dose; }, this.isUniformDoseUnitRequired = function() { return this.uniformDosingType.dose || this.uniformDosingType.doseFraction || this.isUniformFrequency && this.isDoseMandatory() }, this.isUniformDoseRequired = function() { return this.isUniformFrequency && this.isDoseMandatory() && !this.uniformDosingType.doseFraction }, this.isVariableDoseRequired = function() { if (!this.isUniformFrequency) return !!this.isDoseMandatory() || (self.variableDosingType.morningDose || self.variableDosingType.afternoonDose || self.variableDosingType.eveningDose) }, this.loadOrderAttributes = function(drugOrderResponse) { if (config && config.orderAttributes) { var findOrderAttribute = function(drugOrder, orderAttribute) { return _.find(drugOrder.orderAttributes, function(drugOrderAttribute) { return orderAttribute.name === drugOrderAttribute.name }) }; config.orderAttributes.forEach(function(orderAttributeInConfig) { var orderAttributeInDrugOrder = findOrderAttribute(drugOrderResponse, orderAttributeInConfig), existingOrderAttribute = findOrderAttribute(self, orderAttributeInConfig), orderAttribute = existingOrderAttribute || {}; orderAttribute.name = orderAttributeInConfig.name, orderAttribute.shortName = orderAttributeInConfig.shortName, orderAttribute.conceptUuid = orderAttributeInConfig.uuid, orderAttribute.value = orderAttributeInDrugOrder && "true" === orderAttributeInDrugOrder.value, orderAttribute.obsUuid = orderAttributeInDrugOrder ? orderAttributeInDrugOrder.obsUuid : void 0, orderAttribute.encounterUuid = orderAttributeInDrugOrder ? orderAttributeInDrugOrder.encounterUuid : void 0, existingOrderAttribute || self.orderAttributes.push(orderAttribute) }) } }, this.getOrderAttributesAsObs = function() { if (self.orderAttributes) { var orderAttributesWithValues = self.orderAttributes.filter(function(orderAttribute) { return orderAttribute.value || orderAttribute.obsUuid }); return orderAttributesWithValues.map(function(orderAttribute) { return { uuid: orderAttribute.obsUuid, value: !!orderAttribute.value, orderUuid: self.uuid, concept: { uuid: orderAttribute.conceptUuid } } }) } }, this.loadOrderAttributes({}); var calculateUniformDose = function() { var mantissa = self.uniformDosingType.doseFraction ? self.uniformDosingType.doseFraction.value : 0, dose = self.uniformDosingType.dose ? self.uniformDosingType.dose : 0; return self.uniformDosingType.doseFraction = void 0, dose || mantissa ? dose + mantissa : null }; this.setUniformDoseFraction = function() { "uniform" === self.frequencyType && (self.uniformDosingType.dose = calculateUniformDose()) }, this.getDoseAndUnits = function() { var variableDosingType = self.variableDosingType, variableDosingString = addDelimiter(morphToMixedFraction(variableDosingType.morningDose || 0) + "-" + morphToMixedFraction(variableDosingType.afternoonDose || 0) + "-" + morphToMixedFraction(variableDosingType.eveningDose || 0), " "); if (self.frequencyType === Bahmni.Clinical.Constants.dosingTypes.uniform) { var value = morphToMixedFraction(calculateUniformDose()); return value ? value + " " + blankIfFalsy(self.doseUnits) : "" } return (variableDosingString + blankIfFalsy(self.doseUnits)).trim() }, this.getFrequency = function() { return self.frequencyType === Bahmni.Clinical.Constants.dosingTypes.uniform ? blankIfFalsy(self.uniformDosingType.frequency) : "" }, this.calculateEffectiveStopDate = function() { this.durationInDays && (this.effectiveStopDate = DateUtil.addDays(DateUtil.parse(this.effectiveStartDate), this.durationInDays)) } }, Bahmni.Clinical.DrugOrderViewModel.createFromContract = function(drugOrderResponse, config) { var DateUtil = Bahmni.Common.Util.DateUtil; drugOrderResponse.dosingInstructions = drugOrderResponse.dosingInstructions || {}; var administrationInstructions = JSON.parse(drugOrderResponse.dosingInstructions.administrationInstructions || "{}"), viewModel = new Bahmni.Clinical.DrugOrderViewModel(config); return viewModel.asNeeded = !!drugOrderResponse.dosingInstructions.asNeeded && drugOrderResponse.dosingInstructions.asNeeded, viewModel.route = drugOrderResponse.dosingInstructions.route, drugOrderResponse.effectiveStartDate && (viewModel.effectiveStartDate = DateUtil.parse(drugOrderResponse.effectiveStartDate)), viewModel.effectiveStopDate = drugOrderResponse.effectiveStopDate, viewModel.durationUnit = drugOrderResponse.durationUnits, viewModel.scheduledDate = drugOrderResponse.effectiveStartDate, viewModel.duration = drugOrderResponse.duration, drugOrderResponse.dosingInstructions.frequency || drugOrderResponse.dosingInstructions.dose ? (viewModel.frequencyType = Bahmni.Clinical.Constants.dosingTypes.uniform, viewModel.uniformDosingType = { dose: drugOrderResponse.dosingInstructions.dose, doseUnits: drugOrderResponse.dosingInstructions.doseUnits, frequency: drugOrderResponse.dosingInstructions.frequency }) : administrationInstructions.morningDose || administrationInstructions.afternoonDose || administrationInstructions.eveningDose ? (viewModel.frequencyType = Bahmni.Clinical.Constants.dosingTypes.variable, viewModel.variableDosingType = { morningDose: administrationInstructions.morningDose, afternoonDose: administrationInstructions.afternoonDose, eveningDose: administrationInstructions.eveningDose, doseUnits: drugOrderResponse.dosingInstructions.doseUnits }) : (viewModel.frequencyType = Bahmni.Clinical.Constants.dosingTypes.uniform, viewModel.reverseSynced = !0, viewModel.uniformDosingType = { dose: parseFloat(administrationInstructions.dose), doseUnits: administrationInstructions.doseUnits }), viewModel.instructions = administrationInstructions.instructions, viewModel.additionalInstructions = administrationInstructions.additionalInstructions, viewModel.quantity = drugOrderResponse.dosingInstructions.quantity, viewModel.quantityUnit = drugOrderResponse.dosingInstructions.quantityUnits, viewModel.drug = drugOrderResponse.drug, viewModel.provider = drugOrderResponse.provider, viewModel.creatorName = drugOrderResponse.creatorName, viewModel.action = drugOrderResponse.action, viewModel.concept = drugOrderResponse.concept, viewModel.dateStopped = drugOrderResponse.dateStopped, viewModel.uuid = drugOrderResponse.uuid, viewModel.previousOrderUuid = drugOrderResponse.previousOrderUuid, viewModel.dateActivated = drugOrderResponse.dateActivated, viewModel.encounterUuid = drugOrderResponse.encounterUuid, drugOrderResponse.orderReasonConcept && (viewModel.orderReasonConcept = drugOrderResponse.orderReasonConcept), viewModel.orderReasonText = drugOrderResponse.orderReasonText, viewModel.orderNumber = drugOrderResponse.orderNumber && parseInt(drugOrderResponse.orderNumber.replace("ORD-", "")), viewModel.drugNonCoded = drugOrderResponse.drugNonCoded, viewModel.isNonCodedDrug = !!drugOrderResponse.drugNonCoded, viewModel.drugNameDisplay = viewModel.drugNonCoded || constructDrugNameDisplay(viewModel.drug) || _.get(viewModel, "concept.name"), config ? viewModel.loadOrderAttributes(drugOrderResponse) : viewModel.orderAttributes = drugOrderResponse.orderAttributes, viewModel.visit = drugOrderResponse.visit, viewModel.voided = drugOrderResponse.voided, viewModel.dosage = viewModel.getDoseAndUnits(), viewModel.isDrugRetired = drugOrderResponse.retired, drugOrderResponse.orderGroup && (viewModel.orderGroupUuid = drugOrderResponse.orderGroup.uuid, viewModel.orderSetUuid = drugOrderResponse.orderGroup.orderSet.uuid, viewModel.sortWeight = drugOrderResponse.sortWeight), viewModel }, function() { var DateUtil = Bahmni.Common.Util.DateUtil, Drug = function(name, orders) { this.name = name, this.orders = orders || [] }; Bahmni.Clinical.DrugSchedule = function(fromDate, toDate, drugOrders) { this.fromDate = fromDate, this.toDate = toDate, this.drugOrders = drugOrders, this.days = this.getDays(), this.drugs = this.getDrugs() }, Bahmni.Clinical.DrugSchedule.prototype = { getDays: function() { return DateUtil.createDays(this.fromDate, this.toDate) }, getDrugs: function() { var drugOrders = this.drugOrders.map(Bahmni.Clinical.DrugOrder.create), allOrderedDrugs = []; return _.each(drugOrders, function(order) { var drugAlreadyOrdered = _.find(allOrderedDrugs, order.drugNonCoded ? { name: order.drugNonCoded } : { name: order.drug && order.drug.name || order.concept.name }); drugAlreadyOrdered || (drugAlreadyOrdered = new Drug(order.drugNonCoded ? order.drugNonCoded : order.drug && order.drug.name || order.concept.name), allOrderedDrugs.push(drugAlreadyOrdered)), drugAlreadyOrdered.orders.push(order) }), allOrderedDrugs }, hasDrugOrders: function() { return this.drugOrders.length > 0 } }, Bahmni.Clinical.DrugSchedule.create = function(fromDate, toDate, drugOrders) { var drugOrdersDuringIpd = drugOrders.filter(function(drugOrder) { var orderStartDate = DateUtil.parse(drugOrder.effectiveStartDate), orderStopDate = DateUtil.parse(drugOrder.effectiveStopDate); return orderStartDate < toDate && orderStopDate >= fromDate }); return new this(fromDate, toDate, drugOrdersDuringIpd) }, Drug.prototype = { isActiveOnDate: function(date) { return this.orders.some(function(order) { return order.isActiveOnDate(date) }) }, getStatusOnDate: function(date) { var activeDrugOrders = _.filter(this.orders, function(order) { return order.isActiveOnDate(date) }); return 0 === activeDrugOrders.length ? "inactive" : _.every(activeDrugOrders, function(order) { return "stopped" === order.getStatusOnDate(date) }) ? "stopped" : "active" }, isActive: function() { return this.orders.some(function(order) { return order.isActive() }) } }, Bahmni.Clinical.DrugSchedule.Drug = Drug }(), Bahmni.Clinical.Order = function() { var Order = function(data) { angular.extend(this, data), this.dateCreated = data.dateCreated }, getName = function(test) { var name = _.find(test.names, { conceptNameType: "SHORT" }) || _.find(test.names, { conceptNameType: "FULLY_SPECIFIED" }); return name ? name.name : void 0 }; return Order.create = function(test) { var order = new Order({ uuid: void 0, concept: { uuid: test.uuid, displayName: getName(test) } }); return order }, Order.revise = function(order) { var revisedOrder = new Order({ concept: order.concept, action: Bahmni.Clinical.Constants.orderActions.revise, previousOrderUuid: order.uuid, isDiscontinued: !1, commentToFulfiller: order.commentToFulfiller, urgency: order.urgency }); return revisedOrder }, Order.discontinue = function(order) { var discontinuedOrder = new Order({ concept: order.concept, action: Bahmni.Clinical.Constants.orderActions.discontinue, previousOrderUuid: order.uuid, commentToFulfiller: order.commentToFulfiller, urgency: order.urgency }); return discontinuedOrder }, Order }(), Bahmni.Clinical.TabConfig = function(tabs) { var self = this; this.tabs = _.filter(tabs, function(tab) { return angular.isObject(tab) }), this.identifierKey = null; var initDisplayByDefaultTabs = function() { self.visibleTabs = _.filter(self.tabs, function(tab) { return tab.displayByDefault }) }, init = function() { initDisplayByDefaultTabs(), self.currentTab = self.getFirstTab(), self.currentTab && self.currentTab.translationKey && (self.identifierKey = "translationKey") }, isTabClosed = function(tab) { return !_.find(self.visibleTabs, function(visibleTab) { return visibleTab[self.identifierKey] === tab[self.identifierKey] }) }; this.getTab = function(id) { return _.find(self.tabs, function(tab) { return tab[self.identifierKey] === id }) }, this.getFirstTab = function() { return self.visibleTabs[0] }, this.switchTab = function(tab) { this.currentTab = tab, isTabClosed(tab) && this.visibleTabs.push(tab) }, this.showTabs = function() { return this.tabs.length > 1 }, this.closeTab = function(tab) { tab.displayByDefault || (_.remove(self.visibleTabs, function(visibleTab) { return tab[self.identifierKey] === visibleTab[self.identifierKey] }), this.switchTab(this.getFirstTab())) }, this.getUnOpenedTabs = function() { return _.difference(this.tabs, this.visibleTabs) }, this.isCurrentTab = function(tab) { return this.currentTab && this.currentTab[self.identifierKey] === tab[self.identifierKey] }, this.showPrint = function() { return !_.isEmpty(this.currentTab.printing) }, this.getPrintConfigForCurrentTab = function() { return this.currentTab.printing }, init() }, Bahmni.Clinical.VisitTabConfig = function(tabs) { var tabConfig = new Bahmni.Clinical.TabConfig(tabs); tabConfig.identifierKey || (tabConfig.identifierKey = "title"), angular.extend(this, tabConfig), this.setVisitUuidsAndPatientUuidToTheSections = function(visitUuids, patientUuid) { _.each(this.tabs, function(tab) { _.each(tab.sections, function(section) { section.config.visitUuids = visitUuids, section.config.patientUuid = patientUuid }) }) } }, Bahmni.Clinical.VisitDrugOrder = function() { var VisitDrugOrder = function(orders, ipdOrders, orderGroup) { this.orders = orders, this.ipdDrugSchedule = ipdOrders, this.orderGroup = orderGroup }; return VisitDrugOrder.prototype = { hasIPDDrugSchedule: function() { return this.ipdDrugSchedule && this.ipdDrugSchedule.hasDrugOrders() }, getDrugOrderGroups: function() { return this.orderGroup }, getIPDDrugs: function() { return this.ipdDrugSchedule.drugs } }, VisitDrugOrder.create = function(encounterTransactions, admissionDate, dischargeDate) { var nameToSort = function(drugOrder) { return drugOrder.drugNonCoded ? drugOrder.drugNonCoded : drugOrder.drug.name }, drugOrders = new Bahmni.Clinical.OrdersMapper(nameToSort).map(encounterTransactions, "drugOrders"), prescribedDrugOrders = _.map(drugOrders, Bahmni.Clinical.DrugOrderViewModel.createFromContract); return this.createFromDrugOrders(prescribedDrugOrders, admissionDate, dischargeDate) }, VisitDrugOrder.createFromDrugOrders = function(drugOrders, admissionDate, dischargeDate) { drugOrders = _.filter(drugOrders, function(drugOrder) { return !drugOrder.voided && drugOrder.action !== Bahmni.Clinical.Constants.orderActions.discontinue }), drugOrders = _.filter(drugOrders, function(drugOrder) { return !_.some(drugOrders, function(otherDrugOrder) { return otherDrugOrder.action === Bahmni.Clinical.Constants.orderActions.revise && otherDrugOrder.encounterUuid === drugOrder.encounterUuid && otherDrugOrder.previousOrderUuid === drugOrder.uuid }) }); var ipdOrders = null; admissionDate && (ipdOrders = Bahmni.Clinical.DrugSchedule.create(admissionDate, dischargeDate, drugOrders)); var orderGroup = (new Bahmni.Clinical.OrdersMapper).group(drugOrders, "date"); return new this(drugOrders, ipdOrders, orderGroup) }, VisitDrugOrder }(), Bahmni.Clinical.ConceptWeightBasedSorter = function(allTestAndPanelsConcept) { var sortedConcepts = allTestAndPanelsConcept ? allTestAndPanelsConcept.setMembers : [], sortedNames = sortedConcepts.map(function(concept) { return concept.name.name }); this.sort = function(conceptHolders, nameToSort) { return conceptHolders ? (conceptHolders.forEach(function(conceptHolder) { var index = sortedNames.indexOf(nameToSort ? nameToSort(conceptHolder) : conceptHolder.concept.name); conceptHolder.sortWeight = index === -1 ? 999 : index }), _.sortBy(conceptHolders, "sortWeight")) : [] }, this.sortTestResults = function(labOrderResults) { return labOrderResults ? (labOrderResults.forEach(function(labOrderResult) { var index = sortedNames.indexOf(labOrderResult.orderName || labOrderResult.testName); labOrderResult.sortWeight = index === -1 ? 999 : index, labOrderResult.isPanel && (labOrderResult.tests.forEach(function(test) { var index = sortedNames.indexOf(test.testName); test.sortWeight = index === -1 ? 999 : index }), labOrderResult.tests = _.sortBy(labOrderResult.tests, "sortWeight")) }), _.sortBy(labOrderResults, "sortWeight")) : [] } }, Bahmni.Clinical.ObsGroupingHelper = function(conceptSetUiConfigService) { var conceptSetUiConfigSvc = conceptSetUiConfigService; this.groupObservations = function(observations) { var groupedObservationsArray = [], obsWithoutFieldPath = _.filter(observations, function(obs) { return !obs.formFieldPath }), obsWithFieldPath = _.filter(observations, function(obs) { return obs.formFieldPath }), groupedObsByFieldPath = _.groupBy(obsWithFieldPath, function(obs) { return obs.formFieldPath.split(".")[0] }); return obsWithoutFieldPath.forEach(function(observation) { var temp = [observation], conceptSetName = observation.concept.shortName || observation.concept.name, observationsByGroup = groupObservations(conceptSetName, temp); observationsByGroup.groupMembers.length && groupedObservationsArray.push(observationsByGroup) }), _.each(groupedObsByFieldPath, function(observations, formName) { var observationsByGroup = groupObservations(formName, observations); observationsByGroup.groupMembers.length && groupedObservationsArray.push(observationsByGroup) }), groupedObservationsArray }; var groupObservations = function(conceptSetName, obs) { var observationsByGroup = { conceptSetName: conceptSetName, groupMembers: (new Bahmni.ConceptSet.ObservationMapper).getObservationsForView(obs, conceptSetUiConfigSvc.getConfig()) }; return observationsByGroup } }, Bahmni.Clinical.AccessionNotesMapper = function(encounterConfig) { var isValidationEncounter = function(encounterTransaction) { return encounterTransaction.encounterTypeUuid === encounterConfig.getValidationEncounterTypeUuid() }, addAccessionNote = function(accessions, accessionNote) { var accession = _.find(accessions, { accessionUuid: accessionNote.accessionUuid }); accession && (accession.accessionNotes = accession.accessionNotes || [], accession.accessionNotes.push(accessionNote)) }; this.map = function(encounters, accessions) { var validationEncounters = encounters.filter(isValidationEncounter), accessionNotes = _(validationEncounters).map("accessionNotes").flatten().value(); return accessionNotes.forEach(function(accessionNote) { addAccessionNote(accessions, accessionNote) }), accessions.forEach(function() { accessions.accessionNotes = _.sortBy(accessions.accessionNotes, "dateTime").reverse() }), accessions } }, Bahmni.Clinical.EncounterTransactionToObsMapper = function() { this.map = function(encounterTransactions, invalidEncounterTypes, conceptSetUIConfig) { var allObs, validObservation = function(observation) { return !observation.voided && (!isObservationAgroup(observation) || isObservationAgroup(observation) && observation.groupMembers.some(validObservation)) }, setProvider = function(provider) { var setProviderToObservation = function(observation) { observation.provider = provider, angular.forEach(observation.groupMembers, setProviderToObservation) }; return setProviderToObservation }, setProviderToObservations = function(observations, provider) { var setProviderFunction = setProvider(provider); angular.forEach(observations, function(observation) { setProviderFunction(observation) }) }, createMultiSelectObs = function(obsList) { conceptSetUIConfig && (obsList.forEach(function(obs) { createMultiSelectObs(obs.groupMembers) }), new Bahmni.ConceptSet.MultiSelectObservations(conceptSetUIConfig).map(obsList)) }, flatten = function(transactions, item) { return transactions.reduce(function(result, transaction) { return setProviderToObservations(transaction[item], transaction.providers[0]), createMultiSelectObs(transaction.observations), result.concat(transaction[item]) }, []) }, isObservationAgroup = function(observation) { return observation.groupMembers && observation.groupMembers.length > 0 }, removeInvalidGroupMembers = function(observation) { angular.forEach(observation.groupMembers, removeInvalidGroupMembers), observation.groupMembers && (observation.groupMembers = observation.groupMembers.filter(validObservation)) }, removeInvalidEncounterTypes = function(encounterTransaction) { return invalidEncounterTypes.indexOf(encounterTransaction.encounterTypeUuid) === -1 }; return encounterTransactions = encounterTransactions.filter(removeInvalidEncounterTypes), allObs = flatten(encounterTransactions, "observations").filter(validObservation), allObs.forEach(removeInvalidGroupMembers), allObs } }, Bahmni.Clinical.PatientFileObservationsMapper = function() { var DateUtil = Bahmni.Common.Util.DateUtil; this.map = function(encounters) { var conceptMapper = new Bahmni.Common.Domain.ConceptMapper, observationMapper = new Bahmni.Common.Domain.ObservationMapper, providerMapper = new Bahmni.Common.Domain.ProviderMapper, patientFileRecords = []; return encounters.forEach(function(encounter) { var visitUuid = encounter.visit && encounter.visit.uuid; encounter.obs.forEach(function(parentObservation) { parentObservation.groupMembers.forEach(function(member) { patientFileRecords.push({ id: member.id, concept: conceptMapper.map(parentObservation.concept), imageObservation: observationMapper.map(member), visitUuid: visitUuid, provider: providerMapper.map(encounter.provider), visitStartDate: encounter.visit.startDatetime, visitStopDate: encounter.visit.stopDatetime, comment: member.comment }) }) }) }), patientFileRecords.sort(function(record1, record2) { return record1.imageObservation.observationDateTime !== record2.imageObservation.observationDateTime ? DateUtil.parse(record1.imageObservation.observationDateTime) - DateUtil.parse(record2.imageObservation.observationDateTime) : record1.id - record2.id }), patientFileRecords } }, Bahmni.Clinical.OrdersMapper = function(nameToSort) { this.nameToSort = nameToSort }, Bahmni.Clinical.OrdersMapper.prototype.group = function(orders, groupingParameter) { var getGroupingFunction = function(groupingParameter) { return "date" === groupingParameter ? function(order) { return order.startDate ? Bahmni.Common.Util.DateUtil.getDate(order.startDate) : Bahmni.Common.Util.DateUtil.getDate(order.effectiveStartDate) } : function(order) { return order[groupingParameter] } }; groupingParameter = groupingParameter || "date"; var groupingFunction = getGroupingFunction(groupingParameter), groupedOrders = (new Bahmni.Clinical.ResultGrouper).group(orders, groupingFunction, "orders", groupingParameter); return "date" === groupingParameter ? groupedOrders.map(function(order) { return { date: Bahmni.Common.Util.DateUtil.parse(order.date), orders: _.sortBy(order.orders, "orderNumber") } }).sort(function(first, second) { return first.date < second.date ? 1 : -1 }) : groupedOrders.map(function(order) { var returnObj = {}; return returnObj[groupingParameter] = order[groupingParameter], returnObj.orders = order.orders, returnObj }) }, Bahmni.Clinical.OrdersMapper.prototype.create = function(encounterTransactions, ordersName, filterFunction, groupingParameter, allTestAndPanels) { filterFunction = filterFunction || function() { return !0 }; var filteredOrders = this.map(encounterTransactions, ordersName, allTestAndPanels).filter(filterFunction); return this.group(filteredOrders, groupingParameter) }, Bahmni.Clinical.OrdersMapper.prototype.map = function(encounterTransactions, ordersName, allTestAndPanels) { var allTestsPanelsConcept = new Bahmni.Clinical.ConceptWeightBasedSorter(allTestAndPanels), orderObservationsMapper = new Bahmni.Clinical.OrderObservationsMapper, setOrderProvider = function(encounter) { encounter[ordersName].forEach(function(order) { order.provider = encounter.providers[0], order.accessionUuid = encounter.encounterUuid, order.encounterUuid = encounter.encounterUuid, order.visitUuid = encounter.visitUuid }) }; encounterTransactions.forEach(setOrderProvider); var flattenedOrders = _(encounterTransactions).map(ordersName).flatten().value(), ordersWithoutVoidedOrders = flattenedOrders.filter(function(order) { return !order.voided }), allObservations = _(encounterTransactions).map("observations").flatten().value(); orderObservationsMapper.map(allObservations, ordersWithoutVoidedOrders); var sortedOrders = allTestsPanelsConcept.sort(ordersWithoutVoidedOrders, this.nameToSort); return sortedOrders.forEach(function(order) { order.observations.forEach(function(obs) { obs.groupMembers = allTestsPanelsConcept.sort(obs.groupMembers) }) }), sortedOrders }, Bahmni.Clinical.OrderObservationsMapper = function() {}, Bahmni.Clinical.OrderObservationsMapper.prototype.map = function(observations, orders) { var makeCommentsAsAdditionalObs = function(observation) { if (angular.forEach(observation.groupMembers, makeCommentsAsAdditionalObs), observation.groupMembers) { var additionalObs = [], testObservation = []; angular.forEach(observation.groupMembers, function(obs) { obs.concept.name === Bahmni.Clinical.Constants.commentConceptName ? additionalObs.push(obs) : testObservation.push(obs) }), observation.groupMembers = testObservation, observation.groupMembers[0] && additionalObs.length > 0 && (observation.groupMembers[0].additionalObs = additionalObs) } }, getObservationForOrderIfExist = function(observations, order, obs) { angular.forEach(observations, function(observation) { order.uuid === observation.orderUuid ? (makeCommentsAsAdditionalObs(observation), obs.push(observation)) : null === observation.orderUuid && observation.groupMembers.length > 0 && getObservationForOrderIfExist(observation.groupMembers, order, obs) }) }, mapOrderWithObs = function(observations, order) { var orderObservations = []; getObservationForOrderIfExist(observations, order, orderObservations), order.observations = orderObservations }; orders.forEach(function(order) { mapOrderWithObs(observations, order) }) }, angular.module("bahmni.clinical").service("visitTabConfig", ["$q", "appService", function($q, appService) { var mandatoryConfigPromise = function() { return appService.loadMandatoryConfig(Bahmni.Clinical.Constants.mandatoryVisitConfigUrl) }, configPromise = function() { return appService.loadConfig("visit.json") }; this.load = function() { return $q.all([mandatoryConfigPromise(), configPromise()]).then(function(results) { results[0].data.sections = _.sortBy(results[0].data.sections, function(section) { return section.displayOrder }); for (var tab in results[1]) { var sortedSections = _.sortBy(results[1][tab].sections, function(section) { return section.displayOrder }); sortedSections.length > 0 && (results[1][tab].sections = sortedSections) } var mandatoryConfig = results[0].data, tabs = _.values(results[1]), firstTabWithDefaultSection = _.find(tabs, function(tab) { return tab.defaultSections }); _.find(mandatoryConfig.sections, { title: "Treatments" }) && _.find(firstTabWithDefaultSection.sections, { title: "Treatments" }) && (mandatoryConfig.sections = _.filter(mandatoryConfig.sections, function(section) { return "Treatments" !== section.title })); var mandatorySections = _.map(_.values(mandatoryConfig.sections), function(item) { return _.assign(item, _.find(_.values(firstTabWithDefaultSection.sections), ["type", item.type])) }); return firstTabWithDefaultSection.sections = _.unionWith(_.values(mandatorySections), _.values(firstTabWithDefaultSection.sections), _.isEqual), firstTabWithDefaultSection.sections = _.sortBy(firstTabWithDefaultSection.sections, function(section) { return section.displayOrder }), new Bahmni.Clinical.VisitTabConfig(tabs) }) } }]), angular.module("bahmni.clinical").factory("visitActionsService", ["printer", function(printer) { return { printPrescription: function(patient, visitDate, visitUuid) { printer.print("common/views/prescriptionPrint.html", { patient: patient, visitDate: visitDate, visitUuid: visitUuid }) } } }]), angular.module("bahmni.clinical").service("clinicalAppConfigService", ["appService", "urlHelper", "$stateParams", function(appService, urlHelper, $stateParams) { this.getTreatmentActionLink = function() { return appService.getAppDescriptor().getExtensions("org.bahmni.clinical.treatment.links", "link") || [] }, this.getAllConceptsConfig = function() { return appService.getAppDescriptor().getConfigValue("conceptSetUI") || {} }, this.getConceptConfig = function(name) { var config = appService.getAppDescriptor().getConfigValue("conceptSetUI") || {}; return config[name] }, this.getObsIgnoreList = function() { var baseObsIgnoreList = [Bahmni.Common.Constants.impressionConcept], configuredObsIgnoreList = appService.getAppDescriptor().getConfigValue("obsIgnoreList") || []; return baseObsIgnoreList.concat(configuredObsIgnoreList) }, this.getAllConsultationBoards = function() { return appService.getAppDescriptor().getExtensions("org.bahmni.clinical.consultation.board", "link") }, this.getAllConceptSetExtensions = function(conceptSetGroupName) { return appService.getAppDescriptor().getExtensions("org.bahmni.clinical.conceptSetGroup." + conceptSetGroupName, "config") }, this.getOtherInvestigationsMap = function() { return appService.getAppDescriptor().getConfig("otherInvestigationsMap") }, this.getVisitPageConfig = function(configSection) { var visitSection = appService.getAppDescriptor().getConfigValue("visitPage") || {}; return configSection ? visitSection[configSection] : visitSection }, this.getVisitConfig = function() { return appService.getAppDescriptor().getConfigForPage("visit") }, this.getMedicationConfig = function() { return appService.getAppDescriptor().getConfigForPage("medication") || {} }, this.getPrintConfig = function() { return appService.getAppDescriptor().getConfigValue("printConfig") || {} }, this.getConsultationBoardLink = function() { var allBoards = this.getAllConsultationBoards(), defaultBoard = _.find(allBoards, "default"); if ($stateParams.programUuid) { var programParams = "?programUuid=" + $stateParams.programUuid + "&enrollment=" + $stateParams.enrollment + "&dateEnrolled=" + $stateParams.dateEnrolled + "&dateCompleted=" + $stateParams.dateCompleted; return "/" + $stateParams.configName + urlHelper.getPatientUrl() + "/" + defaultBoard.url + programParams } return defaultBoard ? "/" + $stateParams.configName + urlHelper.getPatientUrl() + "/" + defaultBoard.url + "?encounterUuid=active" : urlHelper.getConsultationUrl() }, this.getDefaultVisitType = function() { return appService.getAppDescriptor().getConfigValue("defaultVisitType") }, this.getVisitTypeForRetrospectiveEntries = function() { return appService.getAppDescriptor().getConfigValue("visitTypeForRetrospectiveEntries") } }]), angular.module("bahmni.clinical").directive("visitPaginator", ["$state", function($state) { var link = function($scope) { var visits = _.clone($scope.visits).reverse(), visitIndex = _.findIndex(visits, function(visitHistoryEntry) { return null !== $scope.currentVisitUuid && visitHistoryEntry.uuid === $scope.currentVisitUuid }); $scope.visitHistoryEntry = visits[visitIndex], $scope.shouldBeShown = function() { return $state.is("patient.dashboard.visit") }, $scope.hasNext = function() { return visitIndex !== -1 && visitIndex < visits.length - 1 }, $scope.hasPrevious = function() { return visitIndex > 0 }, $scope.next = function() { $scope.hasNext() && $scope.nextFn && $scope.nextFn()(visits[visitIndex + 1].uuid) }, $scope.previous = function() { $scope.hasPrevious() && $scope.previousFn && $scope.previousFn()(visits[visitIndex - 1].uuid) } }; return { restrict: "EA", scope: { currentVisitUuid: "=", visits: "=", nextFn: "&", previousFn: "&", visitSummary: "=" }, link: link, templateUrl: "common/views/visitPagination.html" } }]), angular.module("bahmni.common.services", []), angular.module("bahmni.common.services").factory("drugService", ["$http", function($http) { var v = "custom:(uuid,strength,name,dosageForm,concept:(uuid,name,names:(name)))", search = function(drugName, conceptUuid) { var params = { v: v, q: drugName, conceptUuid: conceptUuid, s: "ordered" }; return $http.get(Bahmni.Common.Constants.drugUrl, { method: "GET", params: params, withCredentials: !0 }).then(function(response) { return response.data.results }) }, getSetMembersOfConcept = function(conceptSetFullySpecifiedName, searchTerm) { return $http.get(Bahmni.Common.Constants.drugUrl, { method: "GET", params: { v: v, q: conceptSetFullySpecifiedName, s: "byConceptSet", searchTerm: searchTerm }, withCredentials: !0 }).then(function(response) { return response.data.results }) }, getRegimen = function(patientUuid, patientProgramUuid, drugs) { var params = { patientUuid: patientUuid, patientProgramUuid: patientProgramUuid, drugs: drugs }; return $http.get(Bahmni.Common.Constants.bahmniRESTBaseURL + "/drugOGram/regimen", { params: params, withCredentials: !0 }) }; return { search: search, getRegimen: getRegimen, getSetMembersOfConcept: getSetMembersOfConcept } }]), angular.module("bahmni.clinical").controller("VisitHeaderController", ["$rootScope", "$scope", "$state", "clinicalAppConfigService", "patientContext", "visitHistory", "visitConfig", "contextChangeHandler", "$location", "$stateParams", "urlHelper", function($rootScope, $scope, $state, clinicalAppConfigService, patientContext, visitHistory, visitConfig, contextChangeHandler, $location, $stateParams, urlHelper) { $scope.patient = patientContext.patient, $scope.visitHistory = visitHistory, $scope.consultationBoardLink = clinicalAppConfigService.getConsultationBoardLink(), $scope.showControlPanel = !1, $scope.visitTabConfig = visitConfig, $scope.switchTab = function(tab) { $scope.visitTabConfig.switchTab(tab), $rootScope.$broadcast("event:clearVisitBoard", tab) }, $scope.gotoPatientDashboard = function() { contextChangeHandler.execute().allow && $location.path($stateParams.configName + "/patient/" + patientContext.patient.uuid + "/dashboard") }, $scope.openConsultation = function() { var board = clinicalAppConfigService.getAllConsultationBoards()[0], urlPrefix = urlHelper.getPatientUrl(); $scope.collapseControlPanel(), $rootScope.hasVisitedConsultation = !0; var url = "/" + $stateParams.configName + (board.url ? urlPrefix + "/" + board.url : urlPrefix), extensionParams = board.extensionParams, queryParams = []; if ($stateParams.programUuid) { var programParams = { programUuid: $stateParams.programUuid, enrollment: $stateParams.enrollment }; extensionParams = _.merge(programParams, extensionParams) } angular.forEach(extensionParams, function(extensionParamValue, extensionParamKey) { queryParams.push(extensionParamKey + "=" + extensionParamValue) }), _.isEmpty(queryParams) || (url = url + "?" + queryParams.join("&")), $location.url(url) }, $scope.closeTab = function(tab) { $scope.visitTabConfig.closeTab(tab), $rootScope.$broadcast("event:clearVisitBoard", tab) }, $scope.print = function() { $rootScope.$broadcast("event:printVisitTab", $scope.visitTabConfig.currentTab) }, $scope.showPrint = function() { return $scope.visitTabConfig.showPrint() } }]), angular.module("bahmni.clinical").controller("VisitController", ["$scope", "$state", "encounterService", "clinicalAppConfigService", "configurations", "visitSummary", "$timeout", "printer", "visitConfig", "visitHistory", "$stateParams", function($scope, $state, encounterService, clinicalAppConfigService, configurations, visitSummary, $timeout, printer, visitConfig, visitHistory, $stateParams) { var encounterTypeUuid = configurations.encounterConfig().getPatientDocumentEncounterTypeUuid(); $scope.documentsPromise = encounterService.getEncountersForEncounterType($scope.patient.uuid, encounterTypeUuid).then(function(response) { return (new Bahmni.Clinical.PatientFileObservationsMapper).map(response.data.results) }), $scope.currentVisitUrl = $state.current.views["dashboard-content"].templateUrl || $state.current.views["print-content"].templateUrl, $scope.visitHistory = visitHistory, $scope.visitSummary = visitSummary, $scope.visitTabConfig = visitConfig, $scope.showTrends = !0, $scope.patientUuid = $stateParams.patientUuid, $scope.visitUuid = $stateParams.visitUuid; var tab = $stateParams.tab; $scope.isNumeric = function(value) { return $.isNumeric(value) }, $scope.toggle = function(item) { item.show = !item.show }, $scope.isEmpty = function(notes) { return !notes || notes.trim().length < 2 }, $scope.testResultClass = function(line) { var style = {}; return $scope.pendingResults(line) && (style["pending-result"] = !0), line.isSummary && (style.header = !0), style }, $scope.pendingResults = function(line) { return line.isSummary && !line.hasResults && "" !== line.name }, $scope.displayDate = function(date) { return moment(date).format("DD-MMM-YY") }, $scope.$on("event:printVisitTab", function() { printer.printFromScope("common/views/visitTabPrint.html", $scope) }), $scope.$on("event:clearVisitBoard", function() { $scope.clearBoard = !0, $timeout(function() { $scope.clearBoard = !1 }) }), $scope.loadVisit = function(visitUuid) { $state.go("patient.dashboard.visit", { visitUuid: visitUuid }) }; var printOnPrint = function() { $stateParams.print && printer.printFromScope("common/views/visitTabPrint.html", $scope, function() { window.close() }) }, getTab = function() { if (tab) for (var tabIndex in $scope.visitTabConfig.tabs) if ($scope.visitTabConfig.tabs[tabIndex].title === tab) return $scope.visitTabConfig.tabs[tabIndex]; return $scope.visitTabConfig.getFirstTab() }, init = function() { $scope.visitTabConfig.setVisitUuidsAndPatientUuidToTheSections([$scope.visitUuid], $scope.patientUuid); var tabToOpen = getTab(); $scope.visitTabConfig.switchTab(tabToOpen), printOnPrint() }; init() }]), angular.module("bahmni.clinical").controller("PatientListHeaderController", ["$scope", "$rootScope", "$bahmniCookieStore", "providerService", "spinner", "locationService", "$window", "ngDialog", "retrospectiveEntryService", "$translate", function($scope, $rootScope, $bahmniCookieStore, providerService, spinner, locationService, $window, ngDialog, retrospectiveEntryService, $translate) { var DateUtil = Bahmni.Common.Util.DateUtil; $scope.maxStartDate = DateUtil.getDateWithoutTime(DateUtil.today()); var selectedProvider = {}; $scope.retrospectivePrivilege = Bahmni.Common.Constants.retrospectivePrivilege, $scope.locationPickerPrivilege = Bahmni.Common.Constants.locationPickerPrivilege, $scope.onBehalfOfPrivilege = Bahmni.Common.Constants.onBehalfOfPrivilege, $scope.selectedLocationUuid = {}, $scope.getProviderList = function() { return function(searchAttrs) { return providerService.search(searchAttrs.term) } }, $scope.getProviderDataResults = function(data) { return data.data.results.map(function(providerDetails) { return { value: providerDetails.person ? providerDetails.person.display : providerDetails.display, uuid: providerDetails.uuid } }) }, $scope.providerSelected = function() { return function(providerData) { selectedProvider = providerData } }, $scope.clearProvider = function(data) { _.isEmpty(selectedProvider) || data === selectedProvider.value || ($scope.encounterProvider = "", selectedProvider = {}) }, $scope.windowReload = function() { changeCookieData(), $window.location.reload(!1) }, $scope.isCurrentLocation = function(location) { return getCurrentCookieLocation().uuid === location.uuid }, $scope.popUpHandler = function() { $scope.dialog = ngDialog.open({ template: "consultation/views/defaultDataPopUp.html", className: "test ngdialog-theme-default", controller: "PatientListHeaderController" }), $("body").addClass("show-controller-back") }, $scope.$on("ngDialog.closed", function() { $("body").removeClass("show-controller-back") }), $scope.closePopUp = function() { ngDialog.close() }, $scope.getTitle = function() { var title = []; return getCurrentCookieLocation() && title.push($translate.instant(getCurrentCookieLocation().name)), getCurrentProvider() && getCurrentProvider().value && title.push(getCurrentProvider().value), retrospectiveEntryService.getRetrospectiveDate() && title.push(DateUtil.formatDateWithoutTime(retrospectiveEntryService.getRetrospectiveDate())), title.join(",") }, $scope.sync = function() {}; var getCurrentCookieLocation = function() { return $bahmniCookieStore.get(Bahmni.Common.Constants.locationCookieName) ? $bahmniCookieStore.get(Bahmni.Common.Constants.locationCookieName) : null }, getCurrentProvider = function() { return $bahmniCookieStore.get(Bahmni.Common.Constants.grantProviderAccessDataCookieName) }, getLocationFor = function(uuid) { return _.find($scope.locations, function(location) { return location.uuid === uuid }) }, changeCookieData = function() { retrospectiveEntryService.resetRetrospectiveEntry($scope.date), $bahmniCookieStore.remove(Bahmni.Common.Constants.grantProviderAccessDataCookieName), $bahmniCookieStore.put(Bahmni.Common.Constants.grantProviderAccessDataCookieName, selectedProvider, { path: "/", expires: 1 }); var selectedLocation = getLocationFor($scope.selectedLocationUuid); $bahmniCookieStore.remove(Bahmni.Common.Constants.locationCookieName), $bahmniCookieStore.put(Bahmni.Common.Constants.locationCookieName, { name: selectedLocation.display, uuid: selectedLocation.uuid }, { path: "/", expires: 7 }) }, init = function() { var retrospectiveDate = retrospectiveEntryService.getRetrospectiveDate(); return $scope.date = retrospectiveDate ? new Date(retrospectiveDate) : new Date($scope.maxStartDate), $scope.encounterProvider = getCurrentProvider(), selectedProvider = getCurrentProvider(), locationService.getAllByTag("Login Location").then(function(response) { $scope.locations = response.data.results, $scope.selectedLocationUuid = getCurrentCookieLocation().uuid }) }; return init() }]), angular.module("bahmni.clinical").controller("consultationContextController", ["$scope", "appService", "$stateParams", "visitHistory", function($scope, appService, $stateParams, visitHistory) { var init = function() { $scope.configName = $stateParams.configName; var programConfig = appService.getAppDescriptor().getConfigValue("program"); $scope.visitUuid = _.get(visitHistory, "activeVisit.uuid"), $scope.patientInfoSection = { patientInformation: { title: "Patient Information", name: "patientInformation", patientAttributes: [], ageLimit: programConfig && programConfig.patientInformation ? programConfig.patientInformation.ageLimit : void 0, addressFields: ["address1", "address2", "cityVillage", "countyDistrict"] } } }; init() }]); var Bahmni = Bahmni || {}; Bahmni.Graph = Bahmni.Graph || {}, Bahmni.Graph.c3Chart = function() { var dateUtil = Bahmni.Common.Util.DateUtil, createReferenceClasses = function(data) { var classes = {}; return _.each(data, function(datum) { datum.reference && (classes[datum.name] = "reference-line") }), classes }, formatValueForDisplay = function(value, config) { return config.displayForAge() ? Bahmni.Common.Util.AgeUtil.monthsToAgeString(value) : config.displayForObservationDateTime() ? dateUtil.formatDateWithoutTime(value) : d3.round(value, 2) }, createXAxisConfig = function(config) { return { label: { text: config.xAxisConcept + (config.unit || ""), position: "outer-right" }, type: config.type, tick: { culling: { max: 3 }, count: 10, format: function(xAxisValue) { return formatValueForDisplay(xAxisValue, config) } } } }, createYAxisConfig = function(unit) { return { label: { text: unit, position: "outer-top" }, tick: { culling: { max: 3 }, format: function(y) { return d3.round(y, 2) } }, show: !0 } }, createAxisConfig = function(config, units) { var axis = { x: createXAxisConfig(config), y: createYAxisConfig(units[0]) }; return void 0 !== units[1] && (axis.y2 = createYAxisConfig(units[1])), axis }, createGridConfig = function(config) { var grid = { y: { lines: [] } }; return 1 === config.yAxisConcepts.length && (void 0 !== config.lowNormal && grid.y.lines.push({ value: config.lowNormal, text: "low", "class": "lowNormal" }), void 0 !== config.hiNormal && grid.y.lines.push({ value: config.hiNormal, text: "high", "class": "hiNormal" })), grid }, createConfigForToolTipGroupingFix = function(config) { var xs = {}; return config.yAxisConcepts.forEach(function(yAxisConcept) { xs[yAxisConcept] = config.xAxisConcept }), xs }, createAxisAndPopulateAxes = function(axes, data, axisY, unit) { unit && _.each(data, function(item) { item.units === unit && (axes[item.name] = axisY) }) }, createConfigForAxes = function(data, units) { var axes = {}; return createAxisAndPopulateAxes(axes, data, "y", units[0]), createAxisAndPopulateAxes(axes, data, "y2", units[1]), axes }; this.render = function(bindTo, graphWidth, config, data) { var distinctUnits = _.uniq(_.map(data, "units")); if (distinctUnits.length > 2) throw new Error("Cannot display line graphs with concepts that have more than 2 units"); var c3Chart, allPoints = _(data).reduce(function(accumulator, item) { return accumulator.concat(item.values) }, []), c3Config = { bindto: bindTo, size: { width: graphWidth }, padding: { top: 20, right: 50 }, data: { json: allPoints, keys: { x: config.xAxisConcept, value: config.yAxisConcepts }, axes: createConfigForAxes(data, distinctUnits), xs: createConfigForToolTipGroupingFix(config), onclick: function(d) { c3Chart.tooltip.show({ data: d }) }, classes: createReferenceClasses(data) }, point: { show: !0, r: 5, sensitivity: 20 }, line: { connectNull: !0 }, axis: createAxisConfig(config, distinctUnits), tooltip: { grouped: !0, format: { title: function(xAxisValue) { return formatValueForDisplay(xAxisValue, config) } } }, zoom: { enabled: !0 }, transition_duration: 0, grid: createGridConfig(config) }; return c3Chart = c3.generate(c3Config) } }, Bahmni.Graph.c3Chart.create = function() { return new Bahmni.Graph.c3Chart }, Bahmni.Clinical.ObservationTemplate = function(concept, visitStartDate, observations) { var obsTemplate = { name: concept.name, conceptClass: concept.conceptClass, label: concept.shortName || concept.name, visitStartDate: visitStartDate, encounters: [] }, groupedObservations = _.groupBy(observations, function(observation) { return observation.encounterDateTime }), encounterDates = _.sortBy(Object.keys(groupedObservations), function(a) { return -a }); return angular.forEach(encounterDates, function(encounterDate) { var newEncounter = { encounterDateTime: encounterDate, observations: groupedObservations[encounterDate] }; obsTemplate.encounters.push(newEncounter) }), obsTemplate }, Bahmni.Clinical.DiseaseTemplate = function(concept, obsTemplates) { var diseaseTemplate = { name: concept.name, label: concept.shortName || concept.name, obsTemplates: obsTemplates || [] }; return diseaseTemplate.notEmpty = function() { return diseaseTemplate.obsTemplates && diseaseTemplate.obsTemplates.length > 0 }, diseaseTemplate }, Bahmni.Clinical.ClinicalDashboardConfig = function(config) { var self = this, tabConfig = new Bahmni.Clinical.TabConfig(config); tabConfig.identifierKey || (tabConfig.identifierKey = "dashboardName"), angular.extend(self, tabConfig), this.getDiseaseTemplateSections = function(tab) { return tab = tab || this.currentTab, _.filter(_.values(tab.sections), function(section) { return "diseaseTemplate" === section.type }) }, this.getMaxRecentlyViewedPatients = function() { return self.currentTab.maxRecentlyViewedPatients || 10 } }, Bahmni.Clinical.RecordsMapper = function() { var DateUtil = Bahmni.Common.Util.DateUtil, sortByDateTimeOrId = function(record1, record2) { return record2.imageObservation.observationDateTime !== record1.imageObservation.observationDateTime ? DateUtil.parse(record2.imageObservation.observationDateTime) - DateUtil.parse(record1.imageObservation.observationDateTime) : record2.id - record1.id }; this.map = function(records) { return records = records.sort(sortByDateTimeOrId), Bahmni.Common.Util.ArrayUtil.groupByPreservingOrder(records, function(record) { return record.concept.name }, "conceptName", "records") } }, Bahmni.Clinical.DiseaseTemplateMapper = function(diseaseTemplateResponse, allConceptsConfig) { var allObsTemplates = [], isGrid = function(obsTemplate) { return allConceptsConfig[obsTemplate.concept.name] && allConceptsConfig[obsTemplate.concept.name].grid }; return diseaseTemplateResponse.observationTemplates && diseaseTemplateResponse.observationTemplates.length > 0 && diseaseTemplateResponse.observationTemplates.forEach(function(obsTemplate) { var observationTemplate, observations = []; isGrid(obsTemplate) ? (obsTemplate.value = (new Bahmni.Common.Obs.ObservationMapper).getGridObservationDisplayValue(obsTemplate), observationTemplate = new Bahmni.Clinical.ObservationTemplate(obsTemplate.concept, obsTemplate.visitStartDate, observations), observationTemplate.value = obsTemplate.value) : (obsTemplate.bahmniObservations.length > 0 && (observations = (new Bahmni.Common.Obs.ObservationMapper).map(obsTemplate.bahmniObservations, allConceptsConfig)), observationTemplate = new Bahmni.Clinical.ObservationTemplate(obsTemplate.concept, obsTemplate.visitStartDate, observations)), allObsTemplates.push(observationTemplate) }), Bahmni.Clinical.DiseaseTemplate(diseaseTemplateResponse.concept, allObsTemplates) }, angular.module("bahmni.clinical").service("clinicalDashboardConfig", ["appService", function(appService) { var self = this; this.load = function() { return appService.loadConfig("dashboard.json").then(function(response) { angular.extend(self, new Bahmni.Clinical.ClinicalDashboardConfig(_.values(response))) }) } }]), angular.module("bahmni.clinical").directive("diseaseTemplate", function() { var controller = function($scope) { $scope.dateTimeDisplayConfig = function(obsTemplate) { var showDate = !1, showTime = !1; return obsTemplate.conceptClass === Bahmni.Clinical.Constants.caseIntakeConceptClass ? $scope.showDateTimeForIntake && (showDate = !0, showTime = !0) : $scope.showTimeForProgress && (showTime = !0), { showDate: showDate, showTime: showTime } }, $scope.isIntakeTemplate = function(obsTemplate) { return obsTemplate.conceptClass === Bahmni.Clinical.Constants.caseIntakeConceptClass }, $scope.showGroupDateTime = $scope.config.showGroupDateTime !== !1 }; return { restrict: "E", controller: controller, scope: { diseaseTemplate: "=template", config: "=", patient: "=", showDateTimeForIntake: "=", showTimeForProgress: "=", sectionId: "=" }, templateUrl: "dashboard/views/diseaseTemplate.html" } }), angular.module("bahmni.clinical").directive("recentPatients", function() { var controller = function($rootScope, $scope, $state, clinicalDashboardConfig, $stateParams, patientService, sessionService) { var initialize = function() { $scope.search = new Bahmni.Common.PatientSearch.Search((void 0)), $scope.showPatientsList = !1 }; $scope.recentlyViewedPatients = _.take($rootScope.currentUser.recentlyViewedPatients, clinicalDashboardConfig.getMaxRecentlyViewedPatients()), $scope.configName = $stateParams.configName; var patientIndex = _.findIndex($scope.recentlyViewedPatients, function(patientHistoryEntry) { return patientHistoryEntry.uuid === $scope.patient.uuid }); $scope.hasNext = function() { return 0 !== patientIndex }, $scope.togglePatientsList = function() { $scope.showPatientsList = !$scope.showPatientsList }, $scope.hasPrevious = function() { return patientIndex >= 0 && $scope.recentlyViewedPatients.length - 1 !== patientIndex }, $scope.next = function() { $scope.hasNext() && $scope.goToDashboard($scope.recentlyViewedPatients[patientIndex - 1].uuid) }, $scope.previous = function() { $scope.hasPrevious() && $scope.goToDashboard($scope.recentlyViewedPatients[patientIndex + 1].uuid) }, $scope.goToDashboard = function(patientUuid) { $state.go("patient.dashboard", { configName: $scope.configName, patientUuid: patientUuid }) }, $scope.getActivePatients = function() { if (!($scope.search.patientsCount() > 0)) { var params = { q: Bahmni.Clinical.Constants.globalPropertyToFetchActivePatients, location_uuid: sessionService.getLoginLocationUuid() }; patientService.findPatients(params).then(function(response) { $scope.search.updatePatientList(response.data) }) } }, initialize() }; return { restrict: "E", controller: controller, templateUrl: "dashboard/views/recentPatients.html" } }), angular.module("bahmni.clinical").controller("DiseaseTemplateController", ["$scope", function($scope) { var patient = $scope.patient; $scope.showDateTimeForIntake = !1, $scope.showTimeForProgress = !0, $scope.dialogData = { diseaseTemplateName: $scope.section.templateName, patient: patient, section: $scope.section }, $scope.getDiseaseTemplateSection = function(diseaseName) { return _.find($scope.diseaseTemplates, function(diseaseTemplate) { return diseaseTemplate.name === diseaseName }) } }]), angular.module("bahmni.clinical").controller("EditObservationFormController", ["$scope", "appService", "$window", "$rootScope", "$translate", function($scope, appService, $window, $rootScope, $translate) { var configForPrompting = appService.getAppDescriptor().getConfigValue("showSaveConfirmDialog"); $scope.directivePreCloseCallback = function() { if ($scope.resetContextChangeHandler(), configForPrompting && $scope.shouldPromptBeforeClose) return !!$window.confirm($translate.instant("POP_UP_CLOSE_DIALOG_MESSAGE_KEY")) && ($rootScope.hasVisitedConsultation || ($scope.shouldPromptBrowserReload = !1), !0) }, window.onbeforeunload = function() { if (configForPrompting && $scope.shouldPromptBrowserReload) return $translate.instant("BROWSER_CLOSE_DIALOG_MESSAGE_KEY") } }]), angular.module("bahmni.clinical").controller("PatientDashboardTreatmentController", ["$scope", "ngDialog", function($scope, ngDialog) { var treatmentConfigParams = $scope.dashboard.getSectionByType("treatment") || {}, patientUuidparams = { patientUuid: $scope.patient.uuid }; $scope.dashboardConfig = {}, $scope.expandedViewConfig = {}, _.extend($scope.dashboardConfig, treatmentConfigParams.dashboardConfig || {}, patientUuidparams), _.extend($scope.expandedViewConfig, treatmentConfigParams.expandedViewConfig || {}, patientUuidparams), $scope.openSummaryDialog = function() { ngDialog.open({ template: "dashboard/views/dashboardSections/treatmentSummary.html", params: $scope.expandedViewConfig, className: "ngdialog-theme-default ng-dialog-all-details-page", scope: $scope }) }; var cleanUpListener = $scope.$on("ngDialog.closing", function() { $("body").removeClass("ngdialog-open") }); $scope.$on("$destroy", cleanUpListener) }]), angular.module("bahmni.clinical").controller("PatientDashboardLabOrdersController", ["$scope", "$stateParams", function($scope, $stateParams) { $scope.dashboardConfig = $scope.dashboard.getSectionByType("labOrders").dashboardConfig || {}, $scope.dashboardConfig.patientUuid = $stateParams.patientUuid, $scope.dialogData = { patient: $scope.patient, expandedViewConfig: $scope.dashboard.getSectionByType("labOrders").expandedViewConfig || {} } }]), angular.module("bahmni.clinical").controller("PatientDashboardLabSummaryController", ["$scope", "$stateParams", function($scope, $stateParams) { $scope.expandedViewConfig = $scope.ngDialogData.expandedViewConfig, $scope.expandedViewConfig.patientUuid = $stateParams.patientUuid, $scope.patient = $scope.ngDialogData.patient }]), angular.module("bahmni.clinical").controller("PatientDashboardRadiologyController", ["$scope", function($scope) { $scope.config = $scope.dashboard.getSectionByType("radiology") || {} }]), angular.module("bahmni.clinical").controller("PatientDashboardAllDiseaseTemplateController", ["$scope", "diseaseTemplateService", "spinner", "appService", "$stateParams", function($scope, diseaseTemplateService, spinner, appService, $stateParams) { var init = function() { $scope.diseaseName = $scope.ngDialogData.diseaseTemplateName, $scope.patient = $scope.ngDialogData.patient, $scope.section = $scope.ngDialogData.section, $scope.showDateTimeForIntake = !0, $scope.showTimeForProgress = !0; var programConfig = appService.getAppDescriptor().getConfigValue("program"), startDate = null, endDate = null; return programConfig && programConfig.showDetailsWithinDateRange && (startDate = $stateParams.dateEnrolled, endDate = $stateParams.dateCompleted), diseaseTemplateService.getAllDiseaseTemplateObs($scope.patient.uuid, $scope.diseaseName, startDate, endDate).then(function(diseaseTemplate) { $scope.diseaseTemplate = diseaseTemplate }) }; spinner.forPromise(init()) }]), angular.module("bahmni.clinical").controller("PatientDashboardController", ["$scope", "clinicalAppConfigService", "clinicalDashboardConfig", "printer", "$state", "spinner", "visitSummary", "appService", "$stateParams", "diseaseTemplateService", "patientContext", "$location", "$filter", function($scope, clinicalAppConfigService, clinicalDashboardConfig, printer, $state, spinner, visitSummary, appService, $stateParams, diseaseTemplateService, patientContext, $location, $filter) { $scope.patient = patientContext.patient, $scope.activeVisit = $scope.visitHistory.activeVisit, $scope.activeVisitData = {}, $scope.obsIgnoreList = clinicalAppConfigService.getObsIgnoreList(), $scope.clinicalDashboardConfig = clinicalDashboardConfig, $scope.visitSummary = visitSummary, $scope.enrollment = $stateParams.enrollment, $scope.isDashboardPrinting = !1; var programConfig = appService.getAppDescriptor().getConfigValue("program") || {}; $scope.stateChange = function() { return "patient.dashboard.show" === $state.current.name }; var cleanUpListenerSwitchDashboard = $scope.$on("event:switchDashboard", function(event, dashboard) { $scope.init(dashboard) }), cleanUpListenerPrintDashboard = $scope.$on("event:printDashboard", function(event, tab) { var printScope = $scope.$new(); printScope.isDashboardPrinting = !0, printScope.tabBeingPrinted = tab || clinicalDashboardConfig.currentTab; var dashboardModel = Bahmni.Common.DisplayControl.Dashboard.create(printScope.tabBeingPrinted, $filter); spinner.forPromise(diseaseTemplateService.getLatestDiseaseTemplates($stateParams.patientUuid, clinicalDashboardConfig.getDiseaseTemplateSections(printScope.tabBeingPrinted), null, null).then(function(diseaseTemplate) { printScope.diseaseTemplates = diseaseTemplate, printScope.sectionGroups = dashboardModel.getSections(printScope.diseaseTemplates), printer.printFromScope("dashboard/views/dashboardPrint.html", printScope) })) }); $scope.$on("$destroy", function() { cleanUpListenerSwitchDashboard(), cleanUpListenerPrintDashboard() }); var addTabNameToParams = function(board) { $location.search("currentTab", board.translationKey) }, getCurrentTab = function() { var currentTabKey = $location.search().currentTab, currentTab = $state.current.dashboard; return currentTabKey && (currentTab = _.find(clinicalDashboardConfig.visibleTabs, function(tab) { return tab.translationKey === currentTabKey })), void 0 != currentTab ? currentTab : clinicalDashboardConfig.currentTab }; $scope.init = function(dashboard) { dashboard.startDate = null, dashboard.endDate = null, programConfig.showDetailsWithinDateRange && (dashboard.startDate = $stateParams.dateEnrolled, dashboard.endDate = $stateParams.dateCompleted), $state.current.dashboard = dashboard, clinicalDashboardConfig.switchTab(dashboard), addTabNameToParams(dashboard); var dashboardModel = Bahmni.Common.DisplayControl.Dashboard.create(dashboard, $filter); diseaseTemplateService.getLatestDiseaseTemplates($stateParams.patientUuid, clinicalDashboardConfig.getDiseaseTemplateSections(), dashboard.startDate, dashboard.endDate).then(function(diseaseTemplate) { $scope.diseaseTemplates = diseaseTemplate, $scope.sectionGroups = dashboardModel.getSections($scope.diseaseTemplates) }), $scope.currentDashboardTemplateUrl = $state.current.views["dashboard-content"] ? $state.current.views["dashboard-content"].templateUrl : $state.current.views["dashboard-content"] }, $scope.init(getCurrentTab()) }]), angular.module("bahmni.clinical").controller("PatientDashboardVisitsController", ["$scope", "$stateParams", function($scope, $stateParams) { $scope.noOfVisits = $scope.visitHistory.visits.length, $scope.dialogData = { noOfVisits: $scope.noOfVisits, patient: $scope.patient, sectionConfig: $scope.dashboard.getSectionByType("visits") }, $scope.dashboardConfig = $scope.dashboard.getSectionByType("visits").dashboardConfig || {}, $scope.patientUuid = $stateParams.patientUuid }]), angular.module("bahmni.clinical").controller("PatientDashboardAllVisitsController", ["$scope", "$state", "$stateParams", function($scope, $state, $stateParams) { $scope.patient = $scope.ngDialogData.patient, $scope.noOfVisits = $scope.ngDialogData.noOfVisits; var sectionConfig = $scope.ngDialogData.sectionConfig, defaultParams = { maximumNoOfVisits: $scope.noOfVisits ? $scope.noOfVisits : 0 }; $scope.params = angular.extend(defaultParams, $scope.params), $scope.params = angular.extend(sectionConfig, $scope.params), $scope.patientUuid = $stateParams.patientUuid, $scope.showAllObservationsData = !0 }]), angular.module("bahmni.clinical").controller("PatientDashboardProgramsController", ["$scope", "$state", function($scope, $state) { $scope.gotoDetailsPage = function() { $state.go("patient.patientProgram.show") } }]), Bahmni.Clinical.Error = function() { var messages = Bahmni.Common.Constants.serverErrorMessages, findClientMessage = function(message) { var result = _.find(messages, function(listItem) { return listItem.serverMessage === message }); return result && result.clientMessage || message }, translate = function(error) { return error && error.data && error.data.error && error.data.error.message ? findClientMessage(error.data.error.message) : null }; return { translate: translate } }(), Bahmni.Clinical.LabResult = function(name, value, alert, lowNormal, highNormal, unit, notes, members) { this.name = name, this.value = value, this.alert = alert, this.unit = unit, this.highNormal = highNormal, this.lowNormal = lowNormal, this.notes = notes || [], this.members = members }, Bahmni.Clinical.LabResult.prototype = { isPanel: function() { return this.members.length > 0 }, hasNotes: function() { return this.notes.length > 0 }, isAbnormal: function() { return "A" === this.alert || "B" === this.alert }, range: function() { return this.lowNormal && this.highNormal ? "" + this.lowNormal + " - " + this.highNormal : null } }, Bahmni.Clinical.DrugSearchResult = function() { var createSynonym = function(drug, synonymName) { var value = drug.dosageForm ? drug.name + " (" + drug.dosageForm.display + ")" : drug.name, label = synonymName ? synonymName + " => " + value : value; return { label: label, value: value, drug: drug } }, create = function(drug) { return createSynonym(drug) }, getMatcher = function(searchString) { return function(value) { return _.includes(value.toLowerCase(), searchString.toLowerCase()) } }, getSynonymCreator = function(drug) { return function(name) { return createSynonym(drug, name) } }, getAllMatchingSynonyms = function(drug, searchString) { var doesMatchSearchString = getMatcher(searchString), createSynonym = getSynonymCreator(drug); if (doesMatchSearchString(drug.name)) return [createSynonym()]; var conceptNames = drug && drug.concept && drug.concept.names, uniqConceptNames = _.uniq(_.map(conceptNames, "name")), namesThatMatches = _.filter(uniqConceptNames, doesMatchSearchString); return namesThatMatches = _.sortBy(namesThatMatches), _.map(namesThatMatches, createSynonym) }; return { create: create, createSynonym: createSynonym, getAllMatchingSynonyms: getAllMatchingSynonyms } }(), Bahmni.Clinical.VisitHistoryEntry = function() { var VisitHistoryEntry = function(visitData) { angular.extend(this, visitData) }; return VisitHistoryEntry.prototype = { isActive: function() { return null === this.stopDatetime }, isFromCurrentLocation: function(currentVisitLocation) { var visitLocation = _.get(this.location, "uuid"); return visitLocation === currentVisitLocation }, isOneDayVisit: function() { if (this.isActive()) return !0; var startDateString = moment(this.startDatetime).format("YYYYMMDD"), stopDateString = moment(this.stopDatetime).format("YYYYMMDD"); return startDateString === stopDateString }, getVisitType: function() { if (this.visitType) return this.visitType.name || this.visitType.display } }, VisitHistoryEntry }(), Bahmni.Clinical.Category = function(name, tests) { this.name = name, this.tests = tests, this.filteredTests = tests, this.filter = function(filterFunction) { this.filteredTests = tests.filter(filterFunction) }, this.hasTests = function() { return this.filteredTests.length > 0 } }, Bahmni.Clinical.Selectable = function(data, selectableChildren, onSelectionChange) { angular.extend(this, data); var selectionSources = [], children = selectableChildren || []; onSelectionChange = onSelectionChange || angular.noop, this.isSelected = function() { return selectionSources.length > 0 }, this.isSelectedFromSelf = function() { return selectionSources.indexOf(this) !== -1 }, this.isSelectedFromOtherSource = function() { return this.isSelected() && !this.isSelectedFromSelf() }, this.addChild = function(selectable) { children.push(selectable) }, this.getChildrenCount = function() { return children.length }, this.toggle = function(selectionSource) { this.isSelected() ? this.unselect(selectionSource) : this.select(selectionSource) }, this.select = function(selectionSource) { selectionSource = selectionSource || this, selectionSources.indexOf(selectionSource) === -1 && (selectionSources.push(selectionSource), angular.forEach(children, function(child) { child.unselect(child), child.select(selectionSource) }), onSelectionChange(this)) }, this.unselect = function(selectionSource) { selectionSource = selectionSource || this; var index = selectionSources.indexOf(selectionSource); index !== -1 && (selectionSources.splice(index, 1), angular.forEach(children, function(child) { child.unselect(selectionSource) }), onSelectionChange(this)) } }, Bahmni.Clinical.Specimen = function(specimen, allSamples) { function hasResults() { return self && self.report && self.report.results && self.report.results.length > 0 } var self = this; self.uuid = specimen && specimen.uuid, self.dateCollected = specimen && Bahmni.Common.Util.DateUtil.getDateWithoutTime(specimen.dateCollected), self.type = specimen && specimen.type, self.typeFreeText = specimen && specimen.typeFreeText, self.identifier = specimen && specimen.identifier, self.sample = specimen && specimen.sample && specimen.sample.additionalAttributes ? specimen.sample : { additionalAttributes: [] }, self.report = specimen && specimen.report && specimen.report.results ? specimen.report : { results: [] }, self.existingObs = specimen && specimen.existingObs, self.typeObservation = new Bahmni.ConceptSet.SpecimenTypeObservation(self, allSamples); var isDirtyRuleForFreeText = function() { return self.type && "Other" === self.type.name && !self.typeFreeText }, clearObservations = function(obs) { angular.forEach(obs, function(ob) { ob.value = void 0, clearObservations(ob.groupMembers) }) }; self.isDirty = function() { return !!(self.dateCollected && !self.type || !self.dateCollected && !self.type && self.isAdditionalAttriburtesFilled() || !self.dateCollected && self.type || !self.dateCollected && !self.type && self.identifier || isDirtyRuleForFreeText()) }, self.isEmpty = function() { return !(self.dateCollected || self.identifier || self.type || self.typeFreeText) }, self.atLeastOneResult = function() { return hasResults() && !!self.report.results[0].value }, self.isDateCollectedDirty = function() { return !self.dateCollected && self.hasIllegalDateCollected }, self.isTypeDirty = function() { return !self.type && self.hasIllegalType }, self.isTypeFreeTextDirty = function() { return !self.typeFreeText && self.hasIllegalTypeFreeText }, self.isAdditionalAttriburtesFilled = function() { var additionalAttributes = self.sample && self.sample.additionalAttributes[0] && self.sample.additionalAttributes[0].groupMembers; for (var i in additionalAttributes) if (additionalAttributes[i].value) return !0; return !1 }, self.isExistingSpecimen = function() { return self.uuid }, self.voidIfEmpty = function() { return !(!self.isEmpty() || !self.isExistingSpecimen()) && (self.setMandatoryFieldsBeforeSavingVoidedSpecimen(), !0) }, self.setMandatoryFieldsBeforeSavingVoidedSpecimen = function() { self.voided = !0, self.dateCollected = self.typeObservation.dateCollected, self.type = self.typeObservation.type, clearObservations(self.sample.additionalAttributes), clearObservations(self.report.results) } }, Bahmni.Clinical.DrugOrderOptions = function() { var itemsForInputConfig = function(listOfObjects, filterStrings, filterKey) { return filterKey = filterKey || "name", filterStrings ? _.filter(listOfObjects, function(object) { return _.includes(filterStrings, object[filterKey]) }) : listOfObjects }; return function(_inputConfig, masterConfig) { var inputConfig = _inputConfig || {}; this.doseUnits = itemsForInputConfig(masterConfig.doseUnits, inputConfig.doseUnits), this.routes = itemsForInputConfig(masterConfig.routes, inputConfig.routes), this.frequencies = itemsForInputConfig(masterConfig.frequencies, inputConfig.frequencies), this.durationUnits = itemsForInputConfig(masterConfig.durationUnits, inputConfig.durationUnits), this.dosingInstructions = itemsForInputConfig(masterConfig.dosingInstructions, inputConfig.dosingInstructions), this.dispensingUnits = itemsForInputConfig(masterConfig.dispensingUnits, inputConfig.dispensingUnits), this.dosePlaceHolder = inputConfig.dosePlaceHolder, this.hiddenFields = inputConfig.hiddenFields || [], this.isDropDown = inputConfig.isDropDown, this.drugConceptSet = inputConfig.drugConceptSet, this.labels = inputConfig.labels || {}, this.doseFractions = itemsForInputConfig(masterConfig.doseFractions, inputConfig.doseFractions, "label"), this.allowNonCodedDrugs = !inputConfig.allowOnlyCodedDrugs } }(), angular.module("bahmni.clinical").service("urlHelper", ["$stateParams", function($stateParams) { this.getPatientUrl = function() { return "/patient/" + $stateParams.patientUuid + "/dashboard" }, this.getConsultationUrl = function() { return this.getPatientUrl() + "/consultation" }, this.getVisitUrl = function(visitUuid) { return this.getPatientUrl() + "/visit/" + visitUuid } }]), angular.module("bahmni.clinical").service("drugOrderHistoryHelper", [function() { this.getInactiveDrugsFromPastVisit = function(activeAndScheduledDrugs, previousVisitDrugs) { var inactivePreviousVisitDrugs = []; return _.each(previousVisitDrugs, function(previousVisitDrug) { var presentInActiveAndScheduledDrugs = _.find(activeAndScheduledDrugs, function(activeAndScheduledDrug) { return activeAndScheduledDrug.drug && previousVisitDrug.drug ? activeAndScheduledDrug.drug.uuid === previousVisitDrug.drug.uuid : !(!activeAndScheduledDrug.drugNonCoded || !previousVisitDrug.drugNonCoded) && activeAndScheduledDrug.drugNonCoded === previousVisitDrug.drugNonCoded }); presentInActiveAndScheduledDrugs || inactivePreviousVisitDrugs.push(previousVisitDrug) }), inactivePreviousVisitDrugs }, this.getRefillableDrugOrders = function(activeAndScheduledDrugOrders, previousVisitDrugOrders, showOnlyActive) { var drugOrderUtil = Bahmni.Clinical.DrugOrder.Util, now = new Date, partitionedDrugOrders = _.groupBy(activeAndScheduledDrugOrders, function(drugOrder) { return drugOrder.effectiveStartDate > now ? "scheduled" : "active" }), sortedDrugOrders = []; return sortedDrugOrders.push(drugOrderUtil.sortDrugOrders(partitionedDrugOrders.scheduled)), sortedDrugOrders.push(drugOrderUtil.sortDrugOrders(partitionedDrugOrders.active)), showOnlyActive || sortedDrugOrders.push(drugOrderUtil.sortDrugOrders(this.getInactiveDrugsFromPastVisit(activeAndScheduledDrugOrders, previousVisitDrugOrders))), _.flatten(sortedDrugOrders) } }]); var ReactHelper = { createReactComponent: function(component, props) { return React.createElement(component, props) }, renderReactComponent: function(component, rootId) { return ReactDOM.render(component, document.getElementById(rootId)) } }; Bahmni.Clinical.DispostionActionMapper = function() { var getMappingCode = function(concept) { var mappingCode = ""; return concept.mappings && concept.mappings.forEach(function(mapping) { var mappingSource = mapping.display.split(":")[0]; mappingSource === Bahmni.Common.Constants.emrapiConceptMappingSource && (mappingCode = $.trim(mapping.display.split(":")[1])) }), mappingCode }; this.map = function(dispositionActions) { return dispositionActions.map(function(dispositionAction) { return { name: dispositionAction.name.name, code: getMappingCode(dispositionAction) } }) } }, Bahmni.LabResultsMapper = function() { this.map = function(encounterTransaction) { return getLabResults(getLabResultObs(encounterTransaction)) }; var getLabResults = function(observations) { return observations.map(function(obs) { var notes = getNotes(obs), resultValue = obs.value, members = isLeaf(obs) ? [] : getLabResults(obs.groupMembers); return new Bahmni.Clinical.LabResult(obs.concept.name, resultValue, obs.comments, null, null, null, notes, members) }) }, isLeaf = function(obs) { return 0 === obs.groupMembers.length || "COMMENTS" === obs.groupMembers[0].concept.name }, getNotes = function(obs) { var notes = []; return obs.groupMembers = obs.groupMembers || [], obs.groupMembers.forEach(function(member) { "COMMENTS" === member.concept.name && notes.push(member.value) }), notes }, getLabResultObs = function(encounterTransaction) { var labResultObs; return encounterTransaction.observations.forEach(function(observation) { observation.concept.name === Bahmni.Clinical.Constants.labConceptSetName && (labResultObs = observation.groupMembers) }), labResultObs || [] } }, Bahmni.ConsultationMapper = function(dosageFrequencies, dosageInstructions, consultationNoteConcept, labOrderNoteConcept, followUpConditionConcept) { var filterPreviousOrderOfRevisedOrders = function(orders) { return _.filter(orders, function(drugOrder) { return !_.some(orders, function(otherDrugOrder) { return otherDrugOrder.action === Bahmni.Clinical.Constants.orderActions.revise && otherDrugOrder.encounterUuid === drugOrder.encounterUuid && otherDrugOrder.previousOrderUuid === drugOrder.uuid }) }) }; this.map = function(encounterTransaction) { var encounterUuid = encounterTransaction.encounterUuid, specialObservationConceptUuids = [consultationNoteConcept.uuid, labOrderNoteConcept.uuid], investigations = encounterTransaction.orders.filter(function(order) { return !order.voided }), labResults = (new Bahmni.LabResultsMapper).map(encounterTransaction), nonVoidedDrugOrders = encounterTransaction.drugOrders.filter(function(order) { return !order.voided && order.action !== Bahmni.Clinical.Constants.orderActions.discontinue }); nonVoidedDrugOrders = filterPreviousOrderOfRevisedOrders(nonVoidedDrugOrders); var treatmentDrugs = nonVoidedDrugOrders.map(function(drugOrder) { return Bahmni.Clinical.DrugOrderViewModel.createFromContract(drugOrder) }), consultationNote = mapSpecialObservation(encounterTransaction.observations, consultationNoteConcept), labOrderNote = mapSpecialObservation(encounterTransaction.observations, labOrderNoteConcept), observations = encounterTransaction.observations.filter(function(observation) { return !observation.voided && specialObservationConceptUuids.indexOf(observation.concept.uuid) === -1 }), orders = encounterTransaction.orders.filter(function(order) { return order.action !== Bahmni.Clinical.Constants.orderActions.discontinue && !order.dateStopped }), mdrtbSpecimen = encounterTransaction.extensions.mdrtbSpecimen && encounterTransaction.extensions.mdrtbSpecimen.map(function(specimen) { return specimen.sample && (specimen.sample.additionalAttributes = specimen.sample.additionalAttributes ? (new Bahmni.Common.Obs.ObservationMapper).map([specimen.sample.additionalAttributes], {}) : []), specimen.report && (specimen.report.results = specimen.report.results ? (new Bahmni.Common.Obs.ObservationMapper).map([specimen.report.results], {}) : []), new Bahmni.Clinical.Specimen(specimen) }), followUpConditions = _.filter(encounterTransaction.observations, function(observation) { return _.get(followUpConditionConcept, "uuid") == _.get(observation, "concept.uuid") }); return { visitUuid: encounterTransaction.visitUuid, visitTypeUuid: encounterTransaction.visitTypeUuid, encounterUuid: encounterUuid, investigations: investigations, treatmentDrugs: treatmentDrugs, newlyAddedDiagnoses: [], newlyAddedSpecimens: [], labResults: labResults, consultationNote: consultationNote || emptyObservation(consultationNoteConcept), labOrderNote: labOrderNote || emptyObservation(labOrderNoteConcept), observations: observations, disposition: encounterTransaction.disposition, encounterDateTime: encounterTransaction.encounterDateTime, orders: orders, patientUuid: encounterTransaction.patientUuid, visitType: encounterTransaction.visitType, providers: encounterTransaction.providers, locationUuid: encounterTransaction.locationUuid, extensions: { mdrtbSpecimen: mdrtbSpecimen }, followUpConditions: followUpConditions } }; var emptyObservation = function(concept) { return { concept: { uuid: concept.uuid } } }, mapSpecialObservation = function(encounterObservations, specialConcept) { var observation = emptyObservation(specialConcept), obsFromEncounter = encounterObservations.filter(function(obs) { return obs.concept && obs.concept.uuid === specialConcept.uuid && !obs.voided })[0]; return obsFromEncounter && (observation.value = obsFromEncounter.value, observation.uuid = obsFromEncounter.uuid, observation.observationDateTime = obsFromEncounter.observationDateTime), observation } }, Bahmni.LabConceptsMapper = function() { var LabConceptsMapper = function() {}, forConcptClass = function(conceptClassName) { return function(concept) { return concept.conceptClass.name === conceptClassName } }, assignDepartmentToTests = function(tests, departmentConceptSet) { var departmentConcepts = departmentConceptSet ? departmentConceptSet.setMembers : []; angular.forEach(departmentConcepts, function(departmentConcept) { var department = { name: departmentConcept.name.name }; angular.forEach(departmentConcept.setMembers, function(testConcept) { var test = tests.filter(function(test) { return test.uuid === testConcept.uuid })[0]; test && (test.department = department) }) }) }, createTest = function(concept, sample, panels) { return { uuid: concept.uuid, name: concept.name.name, sample: sample, panels: panels, set: !1, orderTypeName: Bahmni.Clinical.Constants.labOrderType } }, createPanel = function(concept, sample) { return { uuid: concept.uuid, name: concept.name.name, sample: sample, set: !0, orderTypeName: Bahmni.Clinical.Constants.labOrderType } }, mapPanelTests = function(sample, tests, panelConcept) { var panel = createPanel(panelConcept, sample), testConcepts = panelConcept.setMembers.filter(forConcptClass(Bahmni.Clinical.Constants.testConceptName)); angular.forEach(testConcepts, function(testConcept) { var test = tests.filter(function(test) { return test.uuid === testConcept.uuid })[0]; test ? test.panels.push(panel) : tests.push(createTest(testConcept, sample, [panel])) }) }; return LabConceptsMapper.prototype = { map: function(labConceptSet, departmentConceptSet) { if (!labConceptSet) return []; var tests = [], sampleConcepts = labConceptSet.setMembers; return angular.forEach(sampleConcepts, function(sampleConcept) { var sample = { uuid: sampleConcept.uuid, name: sampleConcept.name.name }, panelConcepts = sampleConcept.setMembers.filter(forConcptClass(Bahmni.Clinical.Constants.labSetConceptName)), testConcepts = sampleConcept.setMembers.filter(forConcptClass(Bahmni.Clinical.Constants.testConceptName)); angular.forEach(panelConcepts, function(panelConcept) { mapPanelTests(sample, tests, panelConcept) }), angular.forEach(testConcepts, function(testConcept) { var test = tests.filter(function(test) { return test.uuid === testConcept.uuid })[0]; test || tests.push(createTest(testConcept, sample, [])) }) }), assignDepartmentToTests(tests, departmentConceptSet), tests } }, LabConceptsMapper }(), Bahmni.Clinical.EncounterTransactionMapper = function() { var addEditedDiagnoses = function(consultation, diagnosisList) { consultation.pastDiagnoses && consultation.pastDiagnoses.forEach(function(diagnosis) { diagnosis.isDirty && (diagnosis.diagnosisDateTime = null, diagnosisList.push(diagnosis)) }), consultation.savedDiagnosesFromCurrentEncounter && consultation.savedDiagnosesFromCurrentEncounter.forEach(function(diagnosis) { diagnosis.isDirty && (diagnosis.diagnosisDateTime = null, diagnosisList.push(diagnosis)) }) }; this.map = function(consultation, patient, locationUuid, retrospectiveEntry, defaultRetrospectiveVisitType, defaultVisitType, isInEditEncounterMode, patientProgramUuid) { var encounterData = {}; encounterData.locationUuid = isInEditEncounterMode ? consultation.locationUuid : locationUuid, encounterData.patientUuid = patient.uuid, encounterData.encounterUuid = consultation.encounterUuid, encounterData.visitUuid = consultation.visitUuid, encounterData.providers = consultation.providers, encounterData.encounterDateTime = consultation.encounterDateTime, encounterData.extensions = { mdrtbSpecimen: consultation.newlyAddedSpecimens }, encounterData.context = { patientProgramUuid: patientProgramUuid }, _.isEmpty(retrospectiveEntry) ? encounterData.visitUuid ? encounterData.visitType || (encounterData.visitType = defaultVisitType) : encounterData.visitType = defaultVisitType : encounterData.visitType = defaultRetrospectiveVisitType || "OPD", consultation.newlyAddedDiagnoses && consultation.newlyAddedDiagnoses.length > 0 ? encounterData.bahmniDiagnoses = consultation.newlyAddedDiagnoses.map(function(diagnosis) { return { codedAnswer: { uuid: diagnosis.isNonCodedAnswer ? void 0 : diagnosis.codedAnswer.uuid }, freeTextAnswer: diagnosis.isNonCodedAnswer ? diagnosis.codedAnswer.name : void 0, order: diagnosis.order, certainty: diagnosis.certainty, existingObs: null, diagnosisDateTime: null, diagnosisStatusConcept: diagnosis.diagnosisStatusConcept, voided: diagnosis.voided, comments: diagnosis.comments } }) : encounterData.bahmniDiagnoses = [], addEditedDiagnoses(consultation, encounterData.bahmniDiagnoses), encounterData.orders = []; var addOrdersToEncounter = function() { var modifiedOrders = _.filter(consultation.orders, function(order) { return order.hasBeenModified || order.isDiscontinued || !order.uuid }), tempOrders = modifiedOrders.map(function(order) { return order.urgency = order.isUrgent ? "STAT" : void 0, order.hasBeenModified && !order.isDiscontinued ? Bahmni.Clinical.Order.revise(order) : order.isDiscontinued ? Bahmni.Clinical.Order.discontinue(order) : { uuid: order.uuid, concept: { name: order.concept.name, uuid: order.concept.uuid }, commentToFulfiller: order.commentToFulfiller, urgency: order.urgency } }); encounterData.orders = encounterData.orders.concat(tempOrders) }; addOrdersToEncounter(), consultation.drugOrders = []; var newlyAddedTreatments = consultation.newlyAddedTreatments; newlyAddedTreatments && newlyAddedTreatments.forEach(function(treatment) { consultation.drugOrders.push(Bahmni.Clinical.DrugOrder.createFromUIObject(treatment)) }), consultation.removableDrugs && (consultation.drugOrders = consultation.drugOrders.concat(consultation.removableDrugs)), encounterData.drugOrders = consultation.drugOrders, encounterData.disposition = consultation.disposition; var addObservationsToEncounter = function() { if (encounterData.observations = consultation.observations || [], consultation.consultationNote && encounterData.observations.push(consultation.consultationNote), consultation.labOrderNote && encounterData.observations.push(consultation.labOrderNote), !_.isEmpty(consultation.drugOrdersWithUpdatedOrderAttributes)) { var orderAttributes = _.values(consultation.drugOrdersWithUpdatedOrderAttributes).map(function(drugOrder) { return drugOrder.getOrderAttributesAsObs() }); encounterData.observations = encounterData.observations.concat(_.flatten(orderAttributes)) } }; return addObservationsToEncounter(), consultation.followUpConditions && [].push.apply(consultation.observations, consultation.followUpConditions), encounterData } }, Bahmni.Clinical.SpecimenMapper = function() { this.mapObservationToSpecimen = function(observation, allSamples, conceptsConfig, dontSortByObsDateTime) { var specimen = new Bahmni.Clinical.Specimen(observation, allSamples); if (specimen.specimenId = specimen.identifier, specimen.specimenSource = specimen.type.shortName ? specimen.type.shortName : specimen.type.name, specimen.specimenCollectionDate = specimen.dateCollected, specimen.report && specimen.report.results) { specimen.report.results = specimen.report.results instanceof Array ? specimen.report.results : [specimen.report.results]; var obs = (new Bahmni.Common.Obs.ObservationMapper).map(specimen.report.results, conceptsConfig, dontSortByObsDateTime); specimen.sampleResult = obs && obs.length > 0 ? obs[0] : obs } return specimen.sample && specimen.sample.additionalAttributes && (specimen.sample.additionalAttributes = specimen.sample.additionalAttributes instanceof Array ? specimen.sample.additionalAttributes : [specimen.sample.additionalAttributes]), specimen }, this.mapSpecimenToObservation = function(specimen) { var observation = {}; observation.dateCollected = moment(specimen.dateCollected).format("YYYY-MM-DDTHH:mm:ss.SSSZ"), observation.existingObs = specimen.existingObs, observation.identifier = specimen.identifier, observation.sample = {}, observation.report = {}, observation.type = specimen.type, observation.voided = specimen.voided, observation.typeFreeText = specimen.typeFreeText, observation.uuid = specimen.uuid; var observationFilter = new Bahmni.Common.Domain.ObservationFilter; return observation.sample.additionalAttributes = Array.isArray(specimen.sample.additionalAttributes) ? specimen.sample.additionalAttributes : [specimen.sample.additionalAttributes], observation.sample.additionalAttributes = observationFilter.filter(specimen.sample.additionalAttributes)[0], observation.report.results = Array.isArray(specimen.report.results) ? specimen.report.results : [specimen.report.results], observation.report.results = observationFilter.filter(specimen.report.results)[0], observation } }, Bahmni.OtherInvestigationsConceptsMapper = function() { var OtherInvestigationsConceptsMapper = function(orderTypesMap) { this.orderTypesMap = orderTypesMap }, assignCategoriesToTests = function(tests, categoryConceptSet) { var categoryConcepts = categoryConceptSet ? categoryConceptSet.setMembers : []; angular.forEach(categoryConcepts, function(categoryConcept) { var category = { name: categoryConcept.name.name }; angular.forEach(categoryConcept.setMembers, function(testConcept) { var test = tests.filter(function(test) { return test.uuid === testConcept.uuid })[0]; test && (test.category = category) }) }) }, createTest = function(concept, investigationType, orderTypesMap) { var orderTypeName = orderTypesMap[investigationType.name] || investigationType.name; return { uuid: concept.uuid, name: concept.name.name, type: investigationType, orderTypeName: orderTypeName } }; return OtherInvestigationsConceptsMapper.prototype = { map: function(otherInvestigationsConcept, categoryConceptSet) { var self = this; if (!otherInvestigationsConcept) return []; var tests = [], testTypeSets = otherInvestigationsConcept.setMembers.filter(function(concept) { return concept.set }); return angular.forEach(testTypeSets, function(concept) { var type = { uuid: concept.uuid, name: concept.name.name }, testConcepts = concept.setMembers.filter(function(concept) { return concept.conceptClass.name === Bahmni.Clinical.Constants.testConceptName }); angular.forEach(testConcepts, function(testConcept) { tests.push(createTest(testConcept, type, self.orderTypesMap)) }) }), assignCategoriesToTests(tests, categoryConceptSet), tests } }, OtherInvestigationsConceptsMapper }(), angular.module("bahmni.clinical").service("patientVisitHistoryService", ["visitService", function(visitService) { this.getVisitHistory = function(patientUuid, currentVisitLocation) { return visitService.search({ patient: patientUuid, v: "custom:(uuid,visitType,startDatetime,stopDatetime,location,encounters:(uuid))", includeInactive: !0 }).then(function(data) { var visits = _.map(data.data.results, function(visitData) { return new Bahmni.Clinical.VisitHistoryEntry(visitData) }), activeVisit = visits.filter(function(visit) { return visit.isActive() && visit.isFromCurrentLocation(currentVisitLocation) })[0]; return { visits: visits, activeVisit: activeVisit } }) } }]), angular.module("bahmni.clinical").service("labTestsProvider", ["$q", "conceptSetService", function($q, conceptSetService) { this.getTests = function() { var deferer = $q.defer(), labConceptsPromise = conceptSetService.getConcept({ name: Bahmni.Clinical.Constants.labConceptSetName, v: "custom:(uuid,setMembers:(uuid,name,conceptClass,setMembers:(uuid,name,conceptClass,setMembers:(uuid,name,conceptClass))))" }, !0), departmentConceptsPromise = conceptSetService.getConcept({ name: Bahmni.Clinical.Constants.labDepartmentsConceptSetName, v: "custom:(uuid,setMembers:(uuid,name,setMembers:(uuid,name)))" }, !0); return $q.all([labConceptsPromise, departmentConceptsPromise]).then(function(results) { var labConceptsSet = results[0].data.results[0], labDepartmentsSet = results[1].data.results[0], tests = (new Bahmni.LabConceptsMapper).map(labConceptsSet, labDepartmentsSet); deferer.resolve(tests) }, deferer.reject), deferer.promise } }]), angular.module("bahmni.clinical").service("otherTestsProvider", ["$q", "conceptSetService", "clinicalAppConfigService", function($q, conceptSetService, clinicalAppConfigService) { var orderTypesMapConfig = clinicalAppConfigService.getOtherInvestigationsMap(), orderTypesMap = orderTypesMapConfig ? orderTypesMapConfig.value : {}, mapper = new Bahmni.OtherInvestigationsConceptsMapper(orderTypesMap); this.getTests = function() { var deferer = $q.defer(), otherInvestigationsConceptPromise = conceptSetService.getConcept({ name: Bahmni.Clinical.Constants.otherInvestigationsConceptSetName, v: "fullchildren" }, !0), categoriesConceptPromise = conceptSetService.getConcept({ name: Bahmni.Clinical.Constants.otherInvestigationCategoriesConceptSetName, v: "custom:(uuid,setMembers:(uuid,name,setMembers:(uuid,name)))" }, !0); return $q.all([otherInvestigationsConceptPromise, categoriesConceptPromise]).then(function(results) { var otherInvestigationConcept = results[0].data.results[0], labDepartmentsSet = results[1].data.results[0], tests = mapper.map(otherInvestigationConcept, labDepartmentsSet); deferer.resolve(tests) }, deferer.reject), deferer.promise } }]), Bahmni.Clinical.Notifier = function() { var callBacks = {}; this.register = function(key, callback) { callBacks[key] = callback }, this.fire = function() { _.each(callBacks, function(callback) { callback() }) } }, angular.module("bahmni.clinical").factory("treatmentConfig", ["treatmentService", "spinner", "configurationService", "appService", "$q", "$translate", function(treatmentService, spinner, configurationService, appService, $q, $translate) { var getConfigFromServer = function(baseTreatmentConfig) { return treatmentService.getConfig().then(function(result) { var config = angular.extend(baseTreatmentConfig, result.data); return config.durationUnits = [{ name: "Day(s)", factor: 1 }, { name: "Week(s)", factor: 7 }, { name: "Month(s)", factor: 30 }], config.frequencies = _(config.frequencies).reverse().sortBy({ name: "Immediately" }).sortBy({ name: "SOS" }).reverse().value(), config }) }, setNonCodedDrugConcept = function(config) { return treatmentService.getNonCodedDrugConcept().then(function(data) { return config.nonCodedDrugconcept = { uuid: data }, config }) }, setStoppedOrderReasonConcepts = function(config) { return configurationService.getConfigurations(["stoppedOrderReasonConfig"]).then(function(response) { var stoppedOrderReasonConfig = response.stoppedOrderReasonConfig.results[0] || {}; return config.stoppedOrderReasonConcepts = stoppedOrderReasonConfig.answers, config }) }; return function(tabConfigName) { var drugOrderOptions, baseTreatmentConfig = { allowNonCodedDrugs: function() { return drugOrderOptions.allowNonCodedDrugs }, getDoseUnits: function() { return drugOrderOptions.doseUnits }, getRoutes: function() { return drugOrderOptions.routes }, getDurationUnits: function() { return drugOrderOptions.durationUnits }, getDosingInstructions: function() { return drugOrderOptions.dosingInstructions }, getDispensingUnits: function() { return drugOrderOptions.dispensingUnits }, getFrequencies: function() { return drugOrderOptions.frequencies }, getDosePlaceHolder: function() { return drugOrderOptions.dosePlaceHolder }, getDoseFractions: function() { return drugOrderOptions.doseFractions }, isHiddenField: function(fieldName) { return _.includes(drugOrderOptions.hiddenFields, fieldName) }, isDropDown: function() { return drugOrderOptions.isDropDown && drugOrderOptions.drugConceptSet }, isAutoComplete: function() { return !this.isDropDown() }, getDrugConceptSet: function() { return drugOrderOptions.drugConceptSet }, isDropDownForGivenConceptSet: function() { return this.isDropDown() && this.getDrugConceptSet() }, isAutoCompleteForGivenConceptSet: function() { return this.isAutoComplete() && this.getDrugConceptSet() }, isAutoCompleteForAllConcepts: function() { return !this.getDrugConceptSet() }, showAdditionalInformation: function() { var additionalInformationFields = ["sos", "additionalInstructions", "dosingInstructions"], hiddenAdditionalInformationFields = _.intersection(additionalInformationFields, drugOrderOptions.hiddenFields); return hiddenAdditionalInformationFields.length < additionalInformationFields.length }, translate: function(field, defaultKey) { var labelKey = drugOrderOptions.labels[field], labelValue = $translate.instant(labelKey); return labelValue === labelKey && (labelValue = $translate.instant(defaultKey)), labelValue }, showBulkChangeDuration: function() { return !this.hideBulkChangeDurationButton } }, setDrugOrderOptions = function(medicationTabConfig, tabConfigName) { var medicationJson = appService.getAppDescriptor().getConfigForPage("medication") || {}, commonConfig = medicationJson.commonConfig || {}, allTabConfigs = medicationJson.tabConfig || {}, tabConfig = allTabConfigs[tabConfigName] || {}; tabConfig.inputOptionsConfig = tabConfig.inputOptionsConfig || {}, tabConfig.orderSet = tabConfig.orderSet || {}; var showDoseFractions = tabConfig.inputOptionsConfig.showDoseFractions; return tabConfig.inputOptionsConfig.showDoseFractions = !!showDoseFractions && showDoseFractions, tabConfig.drugOrderHistoryConfig = tabConfig.drugOrderHistoryConfig || {}, angular.extend(medicationTabConfig, commonConfig, tabConfig), drugOrderOptions = new Bahmni.Clinical.DrugOrderOptions(medicationTabConfig.inputOptionsConfig, medicationTabConfig), medicationTabConfig }; return getConfigFromServer(baseTreatmentConfig).then(function(config) { return setDrugOrderOptions(config, tabConfigName) }).then(setStoppedOrderReasonConcepts).then(setNonCodedDrugConcept) } }]), angular.module("bahmni.clinical").filter("observationValue", function() { return function(obs) { return Bahmni.Common.Domain.ObservationValueMapper.map(obs) } }), angular.module("bahmni.clinical").directive("buttonsRadio", function() { return { restrict: "E", scope: { model: "=", options: "=", dirtyCheckFlag: "=" }, link: function(scope, element, attrs) { attrs.dirtyCheckFlag && (scope.hasDirtyFlag = !0) }, controller: function($scope) { angular.isString($scope.options) && ($scope.options = $scope.options.split(",").reduce(function(options, item) { return options[item] = item, options }, {})), $scope.activate = function(option) { $scope.model === option ? $scope.model = void 0 : $scope.model = option, $scope.hasDirtyFlag && ($scope.dirtyCheckFlag = !0) } }, template: "" } }), angular.module("bahmni.clinical").directive("orderSelector", [function() { var link = function($scope) { $scope.hasTests = function() { var rootConcept = $scope.tab.leftCategory; return rootConcept && !_.isEmpty(rootConcept.setMembers) }, $scope.filterByConceptClass = function(test) { return test.conceptClass.name === $scope.group.name }; var filterBySearchString = function(testName) { return _.includes(_.toLower(testName.name), _.toLower($scope.search.string)) }; $scope.filterBySearchString = function(test) { return _.some(test.names, filterBySearchString) } }; return { restrict: "E", link: link, templateUrl: "./consultation/views/orderSelector.html", scope: !1 } }]), angular.module("bahmni.clinical").directive("diagnosisAutoComplete", ["$parse", function($parse) { var link = function(scope, element, attrs) { var ngModel = $parse(attrs.ngModel), source = scope.source(), responseMap = scope.responseMap(), onSelect = scope.onSelect(); element.autocomplete({ autofocus: !0, minLength: 2, source: function(request, response) { source(request.term).success(function(data) { var results = responseMap ? responseMap(data) : data; response(results) }) }, select: function(event, ui) { return scope.$apply(function() { ngModel.assign(scope, ui.item.value), onSelect && onSelect(scope.index, ui.item.lookup), scope.$eval(attrs.ngChange) }), !0 }, search: function(event) { var searchTerm = $.trim(element.val()); searchTerm.length < 2 && event.preventDefault() } }) }; return { link: link, require: "ngModel", scope: { source: "&", responseMap: "&", onSelect: "&", index: "=" } } }]), angular.module("bahmni.clinical").directive("newDrugOrders", ["messagingService", function(messagingService) { var controller = function($scope, $rootScope) { $scope.edit = function(drugOrder, index) { $rootScope.$broadcast("event:editDrugOrder", drugOrder, index) }, $scope.remove = function(index) { $rootScope.$broadcast("event:removeDrugOrder", index) }; var defaultBulkDuration = function() { return { bulkDurationUnit: $scope.treatmentConfig.durationUnits ? $scope.treatmentConfig.durationUnits[0].name : "" } }; $scope.bulkDurationData = defaultBulkDuration(); var clearBulkDurationChange = function() { $scope.bulkDurationData = defaultBulkDuration(), $scope.bulkSelectCheckbox = !1 }; $scope.bulkDurationChangeDone = function() { $scope.bulkDurationData.bulkDuration && $scope.bulkDurationData.bulkDurationUnit && $scope.treatments.forEach(function(treatment) { treatment.durationUpdateFlag && (treatment.duration || (treatment.quantityEnteredManually = !1), treatment.duration = $scope.bulkDurationData.bulkDuration, treatment.durationUnit = $scope.bulkDurationData.bulkDurationUnit, treatment.calculateDurationInDays(), treatment.calculateQuantityAndUnit()) }), clearBulkDurationChange(), $scope.bulkChangeDuration() }; var isDurationNullForAnyTreatment = function(treatments) { var isDurationNull = !1; return treatments.forEach(function(treatment) { treatment.duration || (isDurationNull = !0) }), isDurationNull }, setNonCodedDrugConcept = function(treatment) { treatment.drugNonCoded && (treatment.concept = $scope.treatmentConfig.nonCodedDrugconcept) }; $scope.selectAllCheckbox = function() { $scope.bulkSelectCheckbox = !$scope.bulkSelectCheckbox, $scope.treatments.forEach(function(treatment) { setNonCodedDrugConcept(treatment), treatment.durationUpdateFlag = $scope.bulkSelectCheckbox }) }, $scope.bulkChangeDuration = function() { $scope.showBulkChangeToggle = !$scope.showBulkChangeToggle, clearBulkDurationChange(), $scope.selectAllCheckbox(), $scope.showBulkChangeToggle && isDurationNullForAnyTreatment($scope.treatments) && messagingService.showMessage("info", "There are drugs that do no have a duration specified.Updating duration will update for those drugs as well") }, $scope.showBulkChangeDuration = $scope.treatmentConfig.showBulkChangeDuration(), $scope.updateDuration = function(stepperValue) { !$scope.bulkDurationData.bulkDuration && isNaN($scope.bulkDurationData.bulkDuration) && ($scope.bulkDurationData.bulkDuration = 0), $scope.bulkDurationData.bulkDuration += stepperValue } }; return { templateUrl: "consultation/views/newDrugOrders.html", scope: { treatments: "=", treatmentConfig: "=" }, controller: controller } }]), angular.module("bahmni.clinical").directive("newOrderGroup", [function() { var controller = function($scope) { $scope.config = { columns: ["drugName", "dosage", "frequency", "route", "duration", "startDate", "instructions"], actions: ["edit"], columnHeaders: { frequency: "MEDICATION_LABEL_FREQUENCY", drugName: "MEDICATION_DRUG_NAME_TITLE" } }; var setOrderSetName = function(orderSetNewName) { _.isUndefined(orderSetNewName) || ($scope.config.title = orderSetNewName) }; $scope.$watch("orderSetName", setOrderSetName) }; return { templateUrl: "consultation/views/newOrderGroup.html", scope: { treatments: "=", orderSetName: "=" }, controller: controller } }]), angular.module("bahmni.clinical").controller("InvestigationsSelectorController", ["$scope", "spinner", "configurations", function($scope, spinner, configurations) { var Selectable = Bahmni.Clinical.Selectable, Category = Bahmni.Clinical.Category; $scope.selectablePanels = [], $scope.selectableTests = [], spinner.forPromise($scope.testsProvider.getTests()).then(function(tests) { initializeTests(tests), selectSelectablesBasedOnInvestigations(), $scope.showAll() }); var onSelectionChange = function(selectable) { selectable.isSelected() ? selectable.isSelectedFromSelf() && addInvestigationForSelectable(selectable) : removeInvestigationForSelectable(selectable) }, initializeTests = function(tests) { var categories = $scope.categories = [], selectablePanels = $scope.selectablePanels = [], selectableTests = $scope.selectableTests = [], filters = $scope.filters = []; angular.forEach(tests, function(test) { var selectableTest = new Selectable(test, [], onSelectionChange); selectableTests.push(selectableTest); var categoryData = test[$scope.categoryColumn] || { name: "Other" }, category = categories.filter(function(category) { return category.name === categoryData.name })[0]; category ? category.tests.push(selectableTest) : categories.push(new Category(categoryData.name, [selectableTest])), angular.forEach(test.panels, function(testPanel) { var selectablePanel = selectablePanels.filter(function(panel) { return panel.name === testPanel.name })[0]; selectablePanel ? selectablePanel.addChild(selectableTest) : (selectablePanel = new Selectable(testPanel, [selectableTest], onSelectionChange), selectablePanels.push(selectablePanel)) }); var filter = test[$scope.filterColumn]; filters.indexOf(filter) === -1 && filters.push(filter) }) }, selectSelectablesBasedOnInvestigations = function() { var selectables = $scope.allSelectables(), currentInvestigations = $scope.investigations.filter(function(investigation) { return !investigation.voided }); angular.forEach(currentInvestigations, function(investigation) { var selectable = findSelectableForInvestigation(selectables, investigation); selectable && selectable.select() }) }, findSelectableForInvestigation = function(selectables, investigation) { return selectables.filter(function(selectableConcept) { return selectableConcept.uuid === investigation.concept.uuid })[0] }, createInvestigationFromSelectable = function(selectable) { return { concept: { uuid: selectable.uuid, name: selectable.name, set: selectable.set }, orderTypeUuid: configurations.encounterConfig().orderTypes[selectable.orderTypeName], voided: !1 } }, addInvestigationForSelectable = function(selectable) { var investigation = findInvestigationForSelectable(selectable); investigation ? investigation.voided = !1 : $scope.investigations.push(createInvestigationFromSelectable(selectable)) }, removeInvestigationForSelectable = function(selectable) { var investigation = findInvestigationForSelectable(selectable); investigation && removeInvestigation(investigation) }, removeInvestigation = function(investigation) { if (investigation.uuid) investigation.voided = !0; else { var index = $scope.investigations.indexOf(investigation); $scope.investigations.splice(index, 1) } }, findInvestigationForSelectable = function(selectable) { return $scope.investigations.filter(function(investigation) { return investigation.concept.uuid === selectable.uuid })[0] }; $scope.showAll = function() { $scope.filterBy(null) }; var applyCurrentFilterByFilterCoulmn = function(selectable) { return !$scope.currentFilter || selectable[$scope.filterColumn] === $scope.currentFilter }; $scope.filterBy = function(filter) { $scope.currentFilter = filter, $scope.filteredPanels = $scope.selectablePanels.filter(applyCurrentFilterByFilterCoulmn), angular.forEach($scope.categories, function(category) { category.filter(applyCurrentFilterByFilterCoulmn) }) }, $scope.hasFilter = function() { return !!$scope.currentFilter }, $scope.hasTests = function() { return $scope.selectableTests && $scope.selectableTests.length > 0 }, $scope.isFilteredBy = function(filter) { return $scope.currentFilter === filter }, $scope.allSelectables = function() { return $scope.selectablePanels.concat($scope.selectableTests) }, $scope.selctedSelectables = function() { return $scope.allSelectables().filter(function(selectable) { return selectable.isSelectedFromSelf() }) } }]).directive("investigationsSelector", function() { return { restrict: "EA", templateUrl: "consultation/views/investigationsSelector.html", controller: "InvestigationsSelectorController", require: "ngModel", scope: { investigations: "=ngModel", testsProvider: "=", filterColumn: "@", filterHeader: "@", categoryColumn: "@" } } }), angular.module("bahmni.clinical").controller("ClinicalController", ["$scope", "retrospectiveEntryService", "$rootScope", "appService", function($scope, retrospectiveEntryService, $rootScope, appService) { $scope.retrospectiveClass = function() { return !_.isEmpty(retrospectiveEntryService.getRetrospectiveEntry()) }, $rootScope.toggleControlPanel = function() { $rootScope.showControlPanel = !$rootScope.showControlPanel }, $rootScope.collapseControlPanel = function() { $rootScope.showControlPanel = !1 }, $rootScope.getLocaleCSS = function() { var networkConnectivity, localeCSS = "offline-language-english"; appService.getAppDescriptor() && (networkConnectivity = appService.getAppDescriptor().getConfigValue("networkConnectivity")); var locales = void 0 != networkConnectivity ? networkConnectivity.locales : null, currentUser = $rootScope.currentUser; return currentUser && currentUser.userProperties && locales && _.each(locales, function(localeObj) { localeObj.locale == currentUser.userProperties.defaultLocale && (localeCSS = localeObj.css) }), localeCSS } }]), angular.module("bahmni.clinical").controller("ConsultationSummaryController", ["$scope", "conceptSetUiConfigService", function($scope, conceptSetUiConfigService) { var geEditedDiagnosesFromPastEncounters = function() { var editedDiagnosesFromPastEncounters = []; return $scope.consultation.pastDiagnoses.forEach(function(pastDiagnosis) { pastDiagnosis.isDirty && pastDiagnosis.encounterUuid !== $scope.consultation.encounterUuid && editedDiagnosesFromPastEncounters.push(pastDiagnosis) }), editedDiagnosesFromPastEncounters }; $scope.editedDiagnosesFromPastEncounters = geEditedDiagnosesFromPastEncounters(), $scope.onNoteChanged = function() { $scope.consultation.consultationNote.observationDateTime = null }; var groupObservations = function() { var allObservations = $scope.consultation.observations; return allObservations = _.filter(allObservations, function(obs) { return "Dispensed" !== obs.concept.name && (!$scope.followUpConditionConcept || obs.concept.uuid !== $scope.followUpConditionConcept.uuid) }), new Bahmni.Clinical.ObsGroupingHelper(conceptSetUiConfigService).groupObservations(allObservations) }; $scope.groupedObservations = groupObservations(), $scope.disposition = $scope.consultation.disposition, $scope.toggle = function(item) { item.show = !item.show }, $scope.isConsultationTabEmpty = function() { return !!(_.isEmpty($scope.consultation.newlyAddedDiagnoses) && _.isEmpty($scope.groupedObservations) && _.isEmpty($scope.consultation.newlyAddedSpecimens) && _.isEmpty($scope.consultation.consultationNote.value) && _.isEmpty($scope.consultation.investigations) && _.isEmpty($scope.consultation.disposition) && _.isEmpty($scope.consultation.treatmentDrugs) && _.isEmpty($scope.consultation.newlyAddedTreatments) && _.isEmpty($scope.consultation.discontinuedDrugs) && _.isEmpty($scope.consultation.savedDiagnosesFromCurrentEncounter)) } }]), angular.module("bahmni.clinical").controller("DiagnosisController", ["$scope", "$rootScope", "diagnosisService", "messagingService", "contextChangeHandler", "spinner", "appService", "$translate", "retrospectiveEntryService", function($scope, $rootScope, diagnosisService, messagingService, contextChangeHandler, spinner, appService, $translate, retrospectiveEntryService) { var DateUtil = Bahmni.Common.Util.DateUtil; $scope.todayWithoutTime = DateUtil.getDateWithoutTime(DateUtil.today()), $scope.toggles = { expandInactive: !1 }, $scope.consultation.condition = $scope.consultation.condition || new Bahmni.Common.Domain.Condition({}), $scope.conditionsStatuses = { CONDITION_LIST_ACTIVE: "ACTIVE", CONDITION_LIST_INACTIVE: "INACTIVE", CONDITION_LIST_HISTORY_OF: "HISTORY_OF" }, $scope.consultation.followUpConditions = $scope.consultation.followUpConditions || [], _.forEach($scope.consultation.conditions, function(condition) { condition.isFollowUp = _.some($scope.consultation.followUpConditions, { value: condition.uuid }) }), $scope.placeholder = "Add Diagnosis", $scope.hasAnswers = !1, $scope.orderOptions = { CLINICAL_DIAGNOSIS_ORDER_PRIMARY: "PRIMARY", CLINICAL_DIAGNOSIS_ORDER_SECONDARY: "SECONDARY" }, $scope.certaintyOptions = { CLINICAL_DIAGNOSIS_CERTAINTY_CONFIRMED: "CONFIRMED", CLINICAL_DIAGNOSIS_CERTAINTY_PRESUMED: "PRESUMED" }, $scope.getDiagnosis = function(params) { return diagnosisService.getAllFor(params.term).then(mapConcept) }; var _canAdd = function(diagnosis) { var canAdd = !0; return $scope.consultation.newlyAddedDiagnoses.forEach(function(observation) { observation.codedAnswer.uuid === diagnosis.codedAnswer.uuid && (canAdd = !1) }), diagnosis.codedAnswer.uuid && (diagnosis.order = "PRIMARY", diagnosis.certainty = "PRESUMED"), canAdd }; $scope.getAddNewDiagnosisMethod = function(diagnosisAtIndex) { return function(item) { var concept = item.lookup, index = $scope.consultation.newlyAddedDiagnoses.indexOf(diagnosisAtIndex), diagnosisBeingEdited = $scope.consultation.newlyAddedDiagnoses[index], diagnosis = new Bahmni.Common.Domain.Diagnosis(concept, diagnosisBeingEdited.order, diagnosisBeingEdited.certainty, diagnosisBeingEdited.existingObs); _canAdd(diagnosis) && $scope.consultation.newlyAddedDiagnoses.splice(index, 1, diagnosis) } }; var addPlaceHolderDiagnosis = function() { var diagnosis = new Bahmni.Common.Domain.Diagnosis(""); $scope.consultation.newlyAddedDiagnoses.push(diagnosis) }, findPrivilege = function(privilegeName) { return _.find($rootScope.currentUser.privileges, function(privilege) { return privilegeName === privilege.name }) }, init = function() { $scope.canDeleteDiagnosis = findPrivilege(Bahmni.Common.Constants.deleteDiagnosisPrivilege), $scope.allowOnlyCodedDiagnosis = appService.getAppDescriptor().getConfig("allowOnlyCodedDiagnosis") && appService.getAppDescriptor().getConfig("allowOnlyCodedDiagnosis").value, $scope.hideConditions = appService.getAppDescriptor().getConfigValue("hideConditions"), addPlaceHolderDiagnosis(), diagnosisService.getDiagnosisConceptSet().then(function(result) { $scope.diagnosisMetaData = result.data.results[0], $scope.isStatusConfigured = function() { var memberFound = _.find($scope.diagnosisMetaData.setMembers, function(member) { return "Bahmni Diagnosis Status" === member.name.name }); return void 0 !== memberFound } }) }; $scope.checkInvalidDiagnoses = function() { $scope.errorMessage = "", $scope.consultation.newlyAddedDiagnoses.forEach(function(diagnosis) { isInvalidDiagnosis(diagnosis) && ($scope.errorMessage = "{{'CLINICAL_DUPLICATE_DIAGNOSIS_ERROR_MESSAGE' | translate }}") }) }; var isInvalidDiagnosis = function(diagnosis) { var codedAnswers = _.map(_.remove(_.map($scope.consultation.newlyAddedDiagnoses, "codedAnswer"), void 0), function(answer) { return answer.name.toLowerCase() }), codedAnswersCount = _.countBy(codedAnswers); return diagnosis.invalid = !!(diagnosis.codedAnswer.name && codedAnswersCount[diagnosis.codedAnswer.name.toLowerCase()] > 1), diagnosis.invalid }, contextChange = function() { var invalidnewlyAddedDiagnoses = $scope.consultation.newlyAddedDiagnoses.filter(function(diagnosis) { return isInvalidDiagnosis(diagnosis) || !$scope.isValid(diagnosis) }), invalidSavedDiagnosesFromCurrentEncounter = $scope.consultation.savedDiagnosesFromCurrentEncounter.filter(function(diagnosis) { return !$scope.isValid(diagnosis) }), invalidPastDiagnoses = $scope.consultation.pastDiagnoses.filter(function(diagnosis) { return !$scope.isValid(diagnosis) }), isValidConditionForm = $scope.consultation.condition.isEmpty() || $scope.consultation.condition.isValid(); return { allow: 0 === invalidnewlyAddedDiagnoses.length && 0 === invalidPastDiagnoses.length && 0 === invalidSavedDiagnosesFromCurrentEncounter.length && isValidConditionForm, errorMessage: $scope.errorMessage } }; contextChangeHandler.add(contextChange); var mapConcept = function(result) { return _.map(result.data, function(concept) { var response = { value: concept.matchedName || concept.conceptName, concept: { name: concept.conceptName, uuid: concept.conceptUuid }, lookup: { name: concept.matchedName || concept.conceptName, uuid: concept.conceptUuid } }; return concept.matchedName && concept.matchedName !== concept.conceptName && (response.value = response.value + " => " + concept.conceptName), concept.code && (response.value = response.value + " (" + concept.code + ")"), response }) }; $scope.getAddConditionMethod = function() { return function(item) { $scope.consultation.condition.concept.uuid = item.lookup.uuid, item.value = $scope.consultation.condition.concept.name = item.lookup.name } }; var findExistingCondition = function(newCondition) { return _.find($scope.consultation.conditions, function(condition) { return newCondition.conditionNonCoded ? condition.conditionNonCoded == newCondition.conditionNonCoded : condition.concept.uuid == newCondition.concept.uuid }) }; $scope.filterConditions = function(status) { return _.filter($scope.consultation.conditions, { status: status }) }; var expandInactiveOnNewInactive = function(condition) { "INACTIVE" == condition.status && ($scope.toggles.expandInactive = !0) }, updateOrAddCondition = function(condition) { var existingCondition = findExistingCondition(condition); return existingCondition ? existingCondition.uuid ? existingCondition.isActive() ? void messagingService.showMessage("error", "CONDITION_LIST_ALREADY_EXISTS_AS_ACTIVE") : existingCondition.activeSince && condition.onSetDate && !DateUtil.isBeforeDate(existingCondition.activeSince - 1, condition.onSetDate) ? void messagingService.showMessage("error", $translate.instant("CONDITION_LIST_ALREADY_EXISTS", { lastActive: DateUtil.formatDateWithoutTime(existingCondition.activeSince), status: existingCondition.status })) : (existingCondition.status != condition.status && (existingCondition.onSetDate = condition.onSetDate || DateUtil.today(), existingCondition.status = condition.status), existingCondition.additionalDetail = condition.additionalDetail, existingCondition.isActive() && (existingCondition.activeSince = existingCondition.endDate), expandInactiveOnNewInactive(condition), void clearCondition()) : (_.pull($scope.consultation.conditions, existingCondition), $scope.consultation.conditions.push(condition), expandInactiveOnNewInactive(condition), void clearCondition()) : ($scope.consultation.conditions.push(condition), expandInactiveOnNewInactive(condition), void clearCondition()) }; $scope.addCondition = function(condition_) { var condition = _.cloneDeep(condition_); condition_.isNonCoded && (condition.conditionNonCoded = condition.concept.name, condition.concept = {}), condition.voided = !1, updateOrAddCondition(new Bahmni.Common.Domain.Condition(condition)) }, $scope.markAs = function(condition, status) { condition.status = status, condition.onSetDate = DateUtil.today(), expandInactiveOnNewInactive(condition) }; var clearCondition = function() { $scope.consultation.condition = new Bahmni.Common.Domain.Condition, $scope.consultation.condition.showNotes = !1 }; $scope.addDiagnosisToConditions = function(diagnosis) { updateOrAddCondition(Bahmni.Common.Domain.Condition.createFromDiagnosis(diagnosis)) }, $scope.cannotBeACondition = function(diagnosis) { return "CONFIRMED" != diagnosis.certainty || alreadyHasActiveCondition(diagnosis) }, $scope.addConditionAsFollowUp = function(condition) { condition.isFollowUp = !0; var followUpCondition = { concept: { uuid: $scope.followUpConditionConcept.uuid }, value: condition.uuid, voided: !1 }; $scope.consultation.followUpConditions.push(followUpCondition) }; var alreadyHasActiveCondition = function(diagnosis) { var existingCondition = findExistingCondition(Bahmni.Common.Domain.Condition.createFromDiagnosis(diagnosis)); return existingCondition && existingCondition.isActive() }; $scope.cleanOutDiagnosisList = function(allDiagnoses) { return allDiagnoses.filter(function(diagnosis) { return !alreadyAddedToDiagnosis(diagnosis) }) }; var alreadyAddedToDiagnosis = function(diagnosis) { var isPresent = !1; return $scope.consultation.newlyAddedDiagnoses.forEach(function(d) { d.codedAnswer.uuid === diagnosis.concept.uuid && (isPresent = !0) }), isPresent }; $scope.removeObservation = function(index) { index >= 0 && $scope.consultation.newlyAddedDiagnoses.splice(index, 1) }, $scope.clearDiagnosis = function(index) { var diagnosisBeingEdited = $scope.consultation.newlyAddedDiagnoses[index]; diagnosisBeingEdited.clearCodedAnswerUuid() }; var reloadDiagnosesSection = function(encounterUuid) { return diagnosisService.getPastAndCurrentDiagnoses($scope.patient.uuid, encounterUuid).then(function(response) { $scope.consultation.pastDiagnoses = response.pastDiagnoses, $scope.consultation.savedDiagnosesFromCurrentEncounter = response.savedDiagnosesFromCurrentEncounter }) }; $scope.deleteDiagnosis = function(diagnosis) { var obsUUid = null !== diagnosis.existingObs ? diagnosis.existingObs : diagnosis.previousObs; spinner.forPromise(diagnosisService.deleteDiagnosis(obsUUid).then(function() { messagingService.showMessage("info", "Deleted"); var currentUuid = $scope.consultation.savedDiagnosesFromCurrentEncounter.length > 0 ? $scope.consultation.savedDiagnosesFromCurrentEncounter[0].encounterUuid : ""; return reloadDiagnosesSection(currentUuid) })).then(function() {}) }; var clearBlankDiagnosis = !0, removeBlankDiagnosis = function() { clearBlankDiagnosis && ($scope.consultation.newlyAddedDiagnoses = $scope.consultation.newlyAddedDiagnoses.filter(function(diagnosis) { return !diagnosis.isEmpty() }), clearBlankDiagnosis = !1) }; $scope.consultation.preSaveHandler.register("diagnosisSaveHandlerKey", removeBlankDiagnosis), $scope.$on("$destroy", removeBlankDiagnosis), $scope.processDiagnoses = function(data) { data.map(function(concept) { return concept.conceptName === concept.matchedName ? { value: concept.matchedName, concept: concept } : { value: concept.matchedName + "=>" + concept.conceptName, concept: concept } }) }, $scope.restEmptyRowsToOne = function(index) { var iter; for (iter = 0; iter < $scope.consultation.newlyAddedDiagnoses.length; iter++) $scope.consultation.newlyAddedDiagnoses[iter].isEmpty() && iter !== index && $scope.consultation.newlyAddedDiagnoses.splice(iter, 1); var emptyRows = $scope.consultation.newlyAddedDiagnoses.filter(function(diagnosis) { return diagnosis.isEmpty() }); 0 === emptyRows.length && addPlaceHolderDiagnosis(), clearBlankDiagnosis = !0 }, $scope.toggle = function(item) { item.show = !item.show }, $scope.isValid = function(diagnosis) { return diagnosis.isValidAnswer() && diagnosis.isValidOrder() && diagnosis.isValidCertainty() }, $scope.isRetrospectiveMode = retrospectiveEntryService.isRetrospectiveMode, init() }]), angular.module("bahmni.clinical").controller("InvestigationController", ["$scope", "labTestsProvider", "otherTestsProvider", function($scope, labTestsProvider, otherTestsProvider) { $scope.tabs = [{ name: "Laboratory", testsProvider: labTestsProvider, filterColumn: "sample", filterHeader: "Sample", categoryColumn: "department" }, { name: "Other", testsProvider: otherTestsProvider, filterColumn: "type", filterHeader: "Investigation", categoryColumn: "category" }], $scope.activateTab = function(tab) { $scope.activeTab && ($scope.activeTab.klass = ""), $scope.activeTab = tab, $scope.activeTab.klass = "active" }; var findVoidedInvestigations = function() { var filteredInvestigation = $scope.consultation.investigations.filter(function(investigation) { return investigation.voided }); return filteredInvestigation.length === $scope.consultation.investigations.length }; $scope.isValidInvestigation = function() { return !$scope.consultation.investigations.length > 0 || findVoidedInvestigations() ? ($scope.noteState = !1, $scope.consultation.labOrderNote.uuid ? $scope.consultation.labOrderNote.voided = !0 : $scope.consultation.labOrderNote.value && ($scope.consultation.labOrderNote.value = null), !1) : ($scope.consultation.labOrderNote.uuid && ($scope.noteState = !0, $scope.consultation.labOrderNote.voided = !1), !0) }, $scope.activateTab($scope.tabs[0]), $scope.toggleNote = function() { $scope.noteState = !$scope.noteState }; var init = function() { $scope.noteState = !(!$scope.consultation.labOrderNote || !$scope.consultation.labOrderNote.value) }; $scope.onNoteChanged = function() { $scope.consultation.labOrderNote && ($scope.consultation.labOrderNote.observationDateTime = null) }, init() }]), angular.module("bahmni.clinical").controller("OrderController", ["$scope", "allOrderables", "ngDialog", "retrospectiveEntryService", "appService", "$translate", function($scope, allOrderables, ngDialog, retrospectiveEntryService, appService, $translate) { $scope.consultation.orders = $scope.consultation.orders || [], $scope.consultation.childOrders = $scope.consultation.childOrders || [], $scope.allOrdersTemplates = allOrderables; var RadiologyOrderOptionsConfig = appService.getAppDescriptor().getConfig("enableRadiologyOrderOptions"), LabOrderOptionsConfig = appService.getAppDescriptor().getConfig("enableLabOrderOptions"); $scope.enableRadiologyOrderOptions = RadiologyOrderOptionsConfig ? RadiologyOrderOptionsConfig.value : null, $scope.enableLabOrderOptions = LabOrderOptionsConfig ? LabOrderOptionsConfig.value : null; var testConceptToParentsMapping = {}, collapseExistingActiveSection = function(section) { section && (section.klass = "") }, showFirstLeftCategoryByDefault = function() { if (!$scope.activeTab.leftCategory) { var allLeftCategories = $scope.getOrderTemplate($scope.activeTab.name).setMembers; allLeftCategories.length > 0 && $scope.showLeftCategoryTests(allLeftCategories[0]) } }, findTest = function(testUuid) { var test, allLeftCategories = $scope.getOrderTemplate($scope.activeTab.name).setMembers; return _.each(allLeftCategories, function(leftCategory) { var foundTest = _.find(leftCategory.setMembers, function(test) { return test.uuid === testUuid }); if (foundTest) return void(test = foundTest) }), test }, removeOrder = function(testUuid) { var order = _.find($scope.consultation.orders, function(order) { return order.concept.uuid === testUuid }); order && (order.uuid ? order.isDiscontinued = !0 : _.remove($scope.consultation.orders, order)) }, createOrder = function(test) { var discontinuedOrder = _.find($scope.consultation.orders, function(order) { return test.uuid === order.concept.uuid && order.isDiscontinued }); if (discontinuedOrder) discontinuedOrder.isDiscontinued = !1; else { var createdOrder = Bahmni.Clinical.Order.create(test); $scope.consultation.orders.push(createdOrder) } }, initTestConceptToParentsMapping = function() { var allLeftCategories = $scope.getOrderTemplate($scope.activeTab.name).setMembers; _.each(allLeftCategories, function(leftCategory) { _.each(leftCategory.setMembers, function(member) { 0 !== member.setMembers.length && _.each(member.setMembers, function(child) { void 0 === testConceptToParentsMapping[child.uuid] && (testConceptToParentsMapping[child.uuid] = []), testConceptToParentsMapping[child.uuid].push(member.uuid) }) }) }) }, init = function() { $scope.tabs = [], _.forEach($scope.allOrdersTemplates, function(item) { var conceptName = $scope.getName(item); $scope.tabs.push({ name: conceptName ? conceptName : item.name.name, topLevelConcept: item.name.name }) }) }; $scope.isRetrospectiveMode = function() { return !_.isEmpty(retrospectiveEntryService.getRetrospectiveEntry()) }, $scope.activateTab = function(tab) { "active" === tab.klass ? (tab.klass = "", $scope.activeTab = void 0) : (collapseExistingActiveSection($scope.activeTab), $scope.activeTab = tab, $scope.activeTab.klass = "active", $scope.updateSelectedOrdersForActiveTab(), initTestConceptToParentsMapping(), showFirstLeftCategoryByDefault()) }, $scope.updateSelectedOrdersForActiveTab = function() { if ($scope.activeTab) { var activeTabTestConcepts = _.map(_.flatten(_.map($scope.getOrderTemplate($scope.activeTab.name).setMembers, "setMembers")), "uuid"); $scope.selectedOrders = _.filter($scope.consultation.orders, function(testOrder) { return _.indexOf(activeTabTestConcepts, testOrder.concept.uuid) !== -1 }), _.each($scope.selectedOrders, function(order) { order.isUrgent = "STAT" == order.urgency || order.isUrgent }) } }, $scope.getOrderTemplate = function(templateName) { var key = "'" + templateName + "'"; return $scope.allOrdersTemplates[key] }, $scope.showLeftCategoryTests = function(leftCategory) { collapseExistingActiveSection($scope.activeTab.leftCategory), $scope.activeTab.leftCategory = leftCategory, $scope.activeTab.leftCategory.klass = "active", $scope.activeTab.leftCategory.groups = $scope.getConceptClassesInSet(leftCategory) }, $scope.getConceptClassesInSet = function(conceptSet) { var conceptsWithUniqueClass = _.uniqBy(conceptSet ? conceptSet.setMembers : [], function(concept) { return concept.conceptClass.uuid }), conceptClasses = []; return _.forEach(conceptsWithUniqueClass, function(concept) { conceptClasses.push({ name: concept.conceptClass.name, description: concept.conceptClass.description }) }), conceptClasses = _.sortBy(conceptClasses, "name") }, $scope.$watchCollection("consultation.orders", $scope.updateSelectedOrdersForActiveTab), $scope.handleOrderClick = function(order) { var test = findTest(order.concept.uuid); $scope.toggleOrderSelection(test) }, $scope.search = {}, $scope.search.string = "", $scope.resetSearchString = function() { $scope.search.string = "" }, $scope.toggleOrderSelection = function(test) { $scope.resetSearchString(); var orderPresent = $scope.isActiveOrderPresent(test); orderPresent ? removeOrder(test.uuid) : (createOrder(test), _.each(test.setMembers, function(child) { removeOrder(child.uuid) })) }, $scope.isActiveOrderPresent = function(test) { var validOrders = _.filter($scope.consultation.orders, function(testOrder) { return !testOrder.isDiscontinued }); return _.find(validOrders, function(order) { return order.concept.uuid === test.uuid || _.includes(testConceptToParentsMapping[test.uuid], order.concept.uuid) }) }, $scope.isOrderNotEditable = function(order) { var test = findTest(order.concept.uuid); return $scope.isTestIndirectlyPresent(test) }, $scope.isTestIndirectlyPresent = function(test) { var validOrders = _.filter($scope.consultation.orders, function(testOrder) { return !testOrder.isDiscontinued }); return _.find(validOrders, function(order) { return _.includes(testConceptToParentsMapping[test.uuid], order.concept.uuid) }) }, $scope.openNotesPopup = function(order) { order.previousNote = order.commentToFulfiller, $scope.orderNoteText = order.previousNote, $scope.dialog = ngDialog.open({ template: "consultation/views/orderNotes.html", className: "selectedOrderNoteContainer-dialog ngdialog-theme-default", data: order, scope: $scope }) }, $scope.$on("ngDialog.opened", function() { $("body").addClass("show-controller-back") }), $scope.$on("ngDialog.closed", function() { $("body").removeClass("show-controller-back") }), $scope.appendPrintNotes = function(order) { var printNotes = $translate.instant("CLINICAL_ORDER_RADIOLOGY_NEED_PRINT"); order.previousNote && order.previousNote.indexOf(printNotes) == -1 ? $scope.orderNoteText = printNotes + (order.previousNote || "") : ($scope.orderNoteText || "").indexOf(printNotes) == -1 && ($scope.orderNoteText = $translate.instant(printNotes) + ($scope.orderNoteText || "")) }, $scope.isPrintShown = function(isOrderSaved) { var configuredOptions = getConfiguredOptions(); return _.some(configuredOptions, function(option) { return "needsprint" === option.toLowerCase() }) && !isOrderSaved }, $scope.isUrgent = function() { var configuredOptions = getConfiguredOptions(); return _.some(configuredOptions, function(option) { return "urgent" === option.toLowerCase() }) }; var getConfiguredOptions = function() { var configuredOptions = null; return configuredOptions = "Radiology" == $scope.activeTab.name ? $scope.enableRadiologyOrderOptions : $scope.enableLabOrderOptions }; $scope.setEditedFlag = function(order, orderNoteText) { order.previousNote !== orderNoteText && (order.commentToFulfiller = orderNoteText, order.hasBeenModified = !0), $scope.closePopup() }, $scope.closePopup = function() { ngDialog.close() }, $scope.getName = function(sample) { var name = _.find(sample.names, { conceptNameType: "SHORT" }) || _.find(sample.names, { conceptNameType: "FULLY_SPECIFIED" }); return name && name.name }, init() }]), angular.module("bahmni.clinical").controller("TreatmentController", ["$scope", "clinicalAppConfigService", "treatmentConfig", "$stateParams", function($scope, clinicalAppConfigService, treatmentConfig, $stateParams) { var init = function() { var drugOrderHistoryConfig = treatmentConfig.drugOrderHistoryConfig || {}; $scope.drugOrderHistoryView = drugOrderHistoryConfig.view || "default", $scope.tabConfigName = $stateParams.tabConfigName || "default"; var initializeTreatments = function() { $scope.consultation.newlyAddedTabTreatments = $scope.consultation.newlyAddedTabTreatments || {}, $scope.consultation.newlyAddedTabTreatments[$scope.tabConfigName] = $scope.consultation.newlyAddedTabTreatments[$scope.tabConfigName] || { treatments: [], orderSetTreatments: [], newOrderSet: {} }, $scope.treatments = $scope.consultation.newlyAddedTabTreatments[$scope.tabConfigName].treatments, $scope.orderSetTreatments = $scope.consultation.newlyAddedTabTreatments[$scope.tabConfigName].orderSetTreatments, $scope.newOrderSet = $scope.consultation.newlyAddedTabTreatments[$scope.tabConfigName].newOrderSet }; $scope.$watch("consultation.newlyAddedTabTreatments", initializeTreatments), $scope.enrollment = $stateParams.enrollment, $scope.treatmentConfig = treatmentConfig }; init() }]), angular.module("bahmni.clinical").controller("AddTreatmentController", ["$scope", "$rootScope", "contextChangeHandler", "treatmentConfig", "drugService", "$timeout", "clinicalAppConfigService", "ngDialog", "$window", "messagingService", "appService", "activeDrugOrders", "orderSetService", "$q", "locationService", "spinner", "$translate", "$http", "$location", function($scope, $rootScope, contextChangeHandler, treatmentConfig, drugService, $timeout, clinicalAppConfigService, ngDialog, $window, messagingService, appService, activeDrugOrders, orderSetService, $q, locationService, spinner, $translate, $http, $location) { var DateUtil = Bahmni.Common.Util.DateUtil, DrugOrderViewModel = Bahmni.Clinical.DrugOrderViewModel, scrollTop = _.partial($window.scrollTo, 0, 0); $scope.showOrderSetDetails = !0, $scope.addTreatment = !0, $scope.canOrderSetBeAdded = !0, $scope.isSearchDisabled = !1, $scope.getFilteredOrderSets = function(searchTerm) { searchTerm && searchTerm.length >= 3 ? orderSetService.getOrderSetsByQuery(searchTerm).then(function(response) { $scope.orderSets = response.data.results, _.each($scope.orderSets, function(orderSet) { _.each(orderSet.orderSetMembers, setUpOrderSetTransactionalData) }) }) : $scope.orderSets = {} }, $scope.treatmentActionLinks = clinicalAppConfigService.getTreatmentActionLink(); var preFetchDrugsForGivenConceptSet = function() { drugService.getSetMembersOfConcept(treatmentConfig.getDrugConceptSet()).then(function(result) { $scope.drugs = result.map(Bahmni.Clinical.DrugSearchResult.create) }) }; treatmentConfig.isDropDownForGivenConceptSet() && preFetchDrugsForGivenConceptSet(), treatmentConfig.isAutoCompleteForAllConcepts() && ($scope.getDrugs = function(request) { return drugService.search(request.term) }), treatmentConfig.isAutoCompleteForGivenConceptSet() && ($scope.getDrugs = function(request) { return drugService.getSetMembersOfConcept(treatmentConfig.getDrugConceptSet(), request.term) }), $scope.doseFractions = treatmentConfig.getDoseFractions(), $scope.hideOrderSet = treatmentConfig.inputOptionsConfig.hideOrderSet, $scope.showDoseFractions = treatmentConfig.inputOptionsConfig.showDoseFractions, $scope.isDoseFractionsAvailable = function() { return $scope.doseFractions && !_.isEmpty($scope.doseFractions) }, $scope.isSelected = function(drug) { var selectedDrug = $scope.treatment.drug; return selectedDrug && drug.drug.name === selectedDrug.name }, $scope.selectFromDefaultDrugList = function() { $scope.onSelect($scope.treatment.selectedItem) }; var markVariable = function(variable) { $scope[variable] = !0, $timeout(function() { $scope[variable] = !1 }) }, markEitherVariableDrugOrUniformDrug = function(drug) { markVariable(drug.isVariableDosingType() ? "editDrugEntryVariableFrequency" : "editDrugEntryUniformFrequency") }; markVariable("startNewDrugEntry"); var setDrugOrderBeingEdited, clearHighlights; ! function() { var drugOrderBeingEdited = null; setDrugOrderBeingEdited = function(drugOder) { drugOrderBeingEdited = drugOder }, clearHighlights = function() { $scope.treatments.forEach(setIsNotBeingEdited), $scope.orderSetTreatments.forEach(setIsNotBeingEdited), drugOrderBeingEdited && (drugOrderBeingEdited.isBeingEdited = !1, drugOrderBeingEdited.isDiscontinuedAllowed = !0) } }(); var encounterDate = DateUtil.parse($scope.consultation.encounterDateTime), newTreatment = function() { var newTreatment = new Bahmni.Clinical.DrugOrderViewModel(treatmentConfig, null, encounterDate); return newTreatment.isEditAllowed = !1, newTreatment }; $scope.treatment = newTreatment(), treatmentConfig.durationUnits.forEach(function(durationUnit) { _.isEqual(durationUnit, $scope.treatment.durationUnit) && ($scope.treatment.durationUnit = durationUnit) }); var watchFunctionForQuantity = function() { var treatment = $scope.treatment; return { uniformDosingType: treatment.uniformDosingType, variableDosingType: treatment.variableDosingType, "continue": treatment["continue"], doseUnits: treatment.doseUnits, duration: treatment.duration, durationUnit: treatment.durationUnit } }, isSameDrugBeingDiscontinuedAndOrdered = function() { var existingTreatment = !1; return angular.forEach($scope.consultation.discontinuedDrugs, function(drugOrder) { existingTreatment = _.some($scope.treatments, function(treatment) { return treatment.getDisplayName() === drugOrder.getDisplayName() }) && drugOrder.isMarkedForDiscontinue }), existingTreatment }, clearOtherDrugOrderActions = function(drugOrders) { drugOrders.forEach(function(drugOrder) { drugOrder.isDiscontinuedAllowed = !0, drugOrder.isBeingEdited = !1 }) }, setNonCodedDrugConcept = function(treatment) { treatment.drugNonCoded && (treatment.concept = treatmentConfig.nonCodedDrugconcept) }; $scope.refillDrug = function(drugOrder, alreadyActiveSimilarOrder) { $scope.bulkSelectCheckbox = !1; var existingOrderStopDate = alreadyActiveSimilarOrder ? alreadyActiveSimilarOrder.effectiveStopDate : null, refillDrugOrder = drugOrder.refill(existingOrderStopDate); setNonCodedDrugConcept(refillDrugOrder), setDrugOrderBeingEdited(drugOrder), $scope.treatments.push(refillDrugOrder), markVariable("startNewDrugEntry"), ngDialog.close() }, $scope.refillOrderSet = function(drugOrder) { ngDialog.close(); var drugOrdersOfOrderGroup = _.filter($scope.consultation.activeAndScheduledDrugOrders, function(treatment) { return treatment.orderGroupUuid === drugOrder.orderGroupUuid }), refilledOrderGroupOrders = []; drugOrdersOfOrderGroup.forEach(function(drugOrder) { setNonCodedDrugConcept(drugOrder), drugOrder.effectiveStopDate && refilledOrderGroupOrders.push(drugOrder.refill()) }), setSortWeightForOrderSetDrugs(refilledOrderGroupOrders); var matchedOrderSet = _.find(orderSets, { uuid: drugOrder.orderSetUuid }), orderSetMembersOfMatchedOrderSet = matchedOrderSet.orderSetMembers, matchedMembers = []; _.each(refilledOrderGroupOrders, function(drugOrder) { _.each(orderSetMembersOfMatchedOrderSet, function(orderSetMember) { orderSetMember.orderTemplate.drug ? orderSetMember.orderTemplate.drug.uuid === _.get(drugOrder, "drug.uuid") && matchedMembers.push(orderSetMember) : orderSetMember.concept.uuid === drugOrder.concept.uuid && matchedMembers.push(orderSetMember) }) }); var listOfPromises = _.map(matchedMembers, function(eachMember, index) { if (eachMember.orderTemplate) { var doseUnits = eachMember.orderTemplate.dosingInstructions.doseUnits, baseDose = eachMember.orderTemplate.dosingInstructions.dose, drugName = eachMember.orderTemplate.concept.name; return orderSetService.getCalculatedDose($scope.patient.uuid, drugName, baseDose, doseUnits, $scope.newOrderSet.name).then(function(calculatedDosage) { refilledOrderGroupOrders[index].uniformDosingType.dose = calculatedDosage.dose, refilledOrderGroupOrders[index].uniformDosingType.doseUnits = calculatedDosage.doseUnit, refilledOrderGroupOrders[index].calculateQuantityAndUnit() }) } }); spinner.forPromise($q.all(listOfPromises).then(function() { Array.prototype.push.apply($scope.treatments, refilledOrderGroupOrders) })) }, $scope.$on("event:refillDrugOrder", function(event, drugOrder, alreadyActiveSimilarOrder) { $scope.refillDrug(drugOrder, alreadyActiveSimilarOrder) }); var refillDrugOrders = function(drugOrders) { drugOrders.forEach(function(drugOrder) { if (setNonCodedDrugConcept(drugOrder), drugOrder.effectiveStopDate) { var refill = drugOrder.refill(); $scope.treatments.push(refill) } }) }; $scope.$on("event:sectionUpdated", function(event, drugOrder) { _.remove($scope.consultation.activeAndScheduledDrugOrders, function(activeOrder) { return activeOrder.uuid === drugOrder.uuid }) }), $scope.$on("event:refillDrugOrders", function(event, drugOrders) { $scope.bulkSelectCheckbox = !1, refillDrugOrders(drugOrders); }), $scope.$on("event:discontinueDrugOrder", function(event, drugOrder) { drugOrder.isMarkedForDiscontinue = !0, drugOrder.isEditAllowed = !1, drugOrder.dateStopped = DateUtil.now(), $scope.consultation.discontinuedDrugs.push(drugOrder), $scope.minDateStopped = DateUtil.getDateWithoutTime(drugOrder.effectiveStartDate < DateUtil.now() ? drugOrder.effectiveStartDate : DateUtil.now()) }), $scope.$on("event:undoDiscontinueDrugOrder", function(event, drugOrder) { $scope.consultation.discontinuedDrugs = _.reject($scope.consultation.discontinuedDrugs, function(removableOrder) { return removableOrder.uuid === drugOrder.uuid }), $scope.consultation.removableDrugs = _.reject($scope.consultation.removableDrugs, function(removableOrder) { return removableOrder.previousOrderUuid === drugOrder.uuid }), drugOrder.orderReasonConcept = null, drugOrder.dateStopped = null, drugOrder.orderReasonText = null, drugOrder.isMarkedForDiscontinue = !1, drugOrder.isEditAllowed = !0 }); var selectDrugFromDropdown = function(drug_) { treatmentConfig.isDropDownForGivenConceptSet() && ($scope.treatment.selectedItem = _.find($scope.drugs, function(drug) { return drug.drug.uuid === drug_.uuid })) }; $scope.$on("event:reviseDrugOrder", function(event, drugOrder, drugOrders) { clearOtherDrugOrderActions(drugOrders), drugOrder.isBeingEdited = !0, drugOrder.isDiscontinuedAllowed = !1, $scope.treatments.forEach(setIsNotBeingEdited), setDrugOrderBeingEdited(drugOrder), $scope.treatment = drugOrder.revise(), selectDrugFromDropdown(drugOrder.drug), markEitherVariableDrugOrUniformDrug($scope.treatment), $scope.treatment.currentIndex = $scope.treatments.length + 1, $scope.treatment.frequencyType === Bahmni.Clinical.Constants.dosingTypes.variable && ($scope.treatment.isUniformFrequency = !1), $scope.treatment.quantity = $scope.treatment.quantity ? $scope.treatment.quantity : null }), $scope.$watch(watchFunctionForQuantity, function() { $scope.treatment.calculateQuantityAndUnit() }, !0), $scope.add = function() { var treatments = $scope.treatments; $scope.treatment.isNewOrderSet && (treatments = $scope.orderSetTreatments), $scope.treatment.dosingInstructionType = Bahmni.Clinical.Constants.flexibleDosingInstructionsClass, $scope.treatment.isNonCodedDrug && ($scope.treatment.drugNonCoded = $scope.treatment.drugNameDisplay), $scope.treatment.setUniformDoseFraction(); var newDrugOrder = $scope.treatment; return setNonCodedDrugConcept($scope.treatment), newDrugOrder.calculateEffectiveStopDate(), getConflictingDrugOrder(newDrugOrder) ? ($scope.alreadyActiveSimilarOrder.isNewOrderSet ? $scope.conflictingIndex = _.findIndex($scope.orderSetTreatments, $scope.alreadyActiveSimilarOrder) : $scope.conflictingIndex = _.findIndex($scope.treatments, $scope.alreadyActiveSimilarOrder), ngDialog.open({ template: "consultation/views/treatmentSections/conflictingDrugOrderModal.html", scope: $scope }), void($scope.popupActive = !0)) : ($scope.treatment.quantity || ($scope.treatment.quantity = 0), $scope.treatment.isBeingEdited ? (treatments.splice($scope.treatment.currentIndex, 1, $scope.treatment), $scope.treatment.isBeingEdited = !1) : treatments.push($scope.treatment), void $scope.clearForm()) }; var getConflictingDrugOrder = function(newDrugOrder) { var allDrugOrders = $scope.treatments.concat($scope.orderSetTreatments); allDrugOrders = _.reject(allDrugOrders, newDrugOrder); var existingDrugOrders, unsavedNotBeingEditedOrders = _.filter(allDrugOrders, { isBeingEdited: !1 }); existingDrugOrders = newDrugOrder.isBeingEdited ? _.reject($scope.consultation.activeAndScheduledDrugOrders, { uuid: newDrugOrder.previousOrderUuid }) : $scope.consultation.activeAndScheduledDrugOrders, existingDrugOrders = existingDrugOrders.concat(unsavedNotBeingEditedOrders); var potentiallyOverlappingOrders = existingDrugOrders.filter(function(drugOrder) { return drugOrder.getDisplayName() === newDrugOrder.getDisplayName() && drugOrder.overlappingScheduledWith(newDrugOrder) }); setEffectiveDates(newDrugOrder, potentiallyOverlappingOrders); var alreadyActiveSimilarOrders = existingDrugOrders.filter(function(drugOrder) { return drugOrder.getDisplayName() === newDrugOrder.getDisplayName() && drugOrder.overlappingScheduledWith(newDrugOrder) }); return alreadyActiveSimilarOrders.length > 0 && ($scope.alreadyActiveSimilarOrder = _.sortBy(potentiallyOverlappingOrders, "effectiveStartDate").reverse()[0], $scope.alreadyActiveSimilarOrder) }, isEffectiveStartDateSameAsToday = function(newDrugOrder) { return DateUtil.isSameDate(newDrugOrder.effectiveStartDate, DateUtil.parse(newDrugOrder.encounterDate)) && DateUtil.isSameDate(newDrugOrder.effectiveStartDate, DateUtil.now()) }, setEffectiveDates = function(newDrugOrder, existingDrugOrders) { newDrugOrder.scheduledDate = newDrugOrder.effectiveStartDate, existingDrugOrders.forEach(function(existingDrugOrder) { DateUtil.isSameDate(existingDrugOrder.effectiveStartDate, newDrugOrder.effectiveStopDate) && !DateUtil.isSameDate(existingDrugOrder.effectiveStopDate, newDrugOrder.effectiveStartDate) && (newDrugOrder.previousOrderUuid && newDrugOrder.previousOrderDurationInDays !== newDrugOrder.durationInDays || (newDrugOrder.effectiveStopDate = DateUtil.subtractSeconds(existingDrugOrder.effectiveStartDate, 1)), (newDrugOrder.previousOrderUuid || DateUtil.isSameDate(newDrugOrder.effectiveStartDate, newDrugOrder.encounterDate)) && (newDrugOrder.autoExpireDate = newDrugOrder.effectiveStopDate)), DateUtil.isSameDate(existingDrugOrder.effectiveStopDate, newDrugOrder.effectiveStartDate) && DateUtil.isSameDate(DateUtil.addSeconds(existingDrugOrder.effectiveStopDate, 1), newDrugOrder.effectiveStartDate) && (existingDrugOrder.uuid || (existingDrugOrder.effectiveStopDate = DateUtil.subtractSeconds(existingDrugOrder.effectiveStopDate, 1)), newDrugOrder.effectiveStartDate = DateUtil.addSeconds(existingDrugOrder.effectiveStopDate, 1)) }), isEffectiveStartDateSameAsToday(newDrugOrder) && (newDrugOrder.scheduledDate = null) }; $scope.closeDialog = function() { ngDialog.close() }, $scope.refillConflictingDrug = function(drugOrder, alreadyActiveSimilarOrder) { $scope.popupActive = !1, ngDialog.close(), $scope.clearForm(), $scope.$broadcast("event:refillDrugOrder", drugOrder, alreadyActiveSimilarOrder) }, $scope.revise = function(drugOrder, index) { $scope.popupActive = !1, ngDialog.close(), drugOrder.uuid ? $scope.$broadcast("event:reviseDrugOrder", drugOrder, $scope.consultation.activeAndScheduledDrugOrders) : edit(drugOrder, index) }, $scope.toggleShowAdditionalInstructions = function(treatment) { treatment.showAdditionalInstructions = !treatment.showAdditionalInstructions }, $scope.toggleAsNeeded = function(treatment) { treatment.asNeeded = !treatment.asNeeded }; var edit = function(drugOrder, index) { clearHighlights(); var treatment = drugOrder; markEitherVariableDrugOrUniformDrug(treatment), treatment.isBeingEdited = !0, $scope.treatment = treatment.cloneForEdit(index, treatmentConfig), 0 === $scope.treatment.quantity && ($scope.treatment.quantity = null, $scope.treatment.quantityEnteredManually = !1), selectDrugFromDropdown(treatment.drug) }; $scope.$on("event:editDrugOrder", function(event, drugOrder, index) { edit(drugOrder, index) }), $scope.$on("event:removeDrugOrder", function(event, index) { $scope.treatments.splice(index, 1) }), $scope.incompleteDrugOrders = function() { var anyValuesFilled = $scope.treatment.drug || $scope.treatment.uniformDosingType.dose || $scope.treatment.uniformDosingType.frequency || $scope.treatment.variableDosingType.morningDose || $scope.treatment.variableDosingType.afternoonDose || $scope.treatment.variableDosingType.eveningDose || $scope.treatment.duration || $scope.treatment.quantity || $scope.treatment.isNonCodedDrug || $scope.treatment.drugNameDisplay; return anyValuesFilled && $scope.addForm.$invalid }, $scope.unaddedDrugOrders = function() { return $scope.addForm.$valid }; var contextChange = function() { var errorMessages = Bahmni.Clinical.Constants.errorMessages; return isSameDrugBeingDiscontinuedAndOrdered() ? { allow: !1, errorMessage: $translate.instant(errorMessages.discontinuingAndOrderingSameDrug) } : $scope.incompleteDrugOrders() ? ($scope.formInvalid = !0, { allow: !1 }) : $scope.unaddedDrugOrders() ? { allow: !1, errorMessage: $translate.instant(errorMessages.incompleteForm) } : { allow: !0 } }, setIsNotBeingEdited = function(treatment) { treatment.isBeingEdited = !1 }; $scope.getDataResults = function(drugs) { var searchString = $scope.treatment.drugNameDisplay, listOfDrugSynonyms = _.map(drugs, function(drug) { return Bahmni.Clinical.DrugSearchResult.getAllMatchingSynonyms(drug, searchString) }); return _.flatten(listOfDrugSynonyms) }, function() { var selectedItem; $scope.onSelect = function(item) { selectedItem = item, $scope.onChange() }, $scope.onAccept = function() { $scope.treatment.acceptedItem = $scope.treatment.drugNameDisplay, $scope.onChange() }; var value = !1; $scope["continue"] = function() { value = !value, value === !0 ? void 0 === $scope.treatment.duration && ($scope.treatment.duration = parseInt("1")) : $scope.treatment.duration = void 0 }, $scope.onChange = function() { return selectedItem ? ($scope.treatment.isNonCodedDrug = !1, delete $scope.treatment.drugNonCoded, $scope.treatment.changeDrug({ name: selectedItem.drug.name, form: selectedItem.drug.dosageForm && selectedItem.drug.dosageForm.display, uuid: selectedItem.drug.uuid }), $scope.treatment.variableDosingType.doseUnits = selectedItem.drug.dosageForm.display, $http({ method: "GET", url: "/openmrs/module/bahmnicustomutil/drugs-additional-info.form?uuid=${selectedItem.drug.uuid}" }).success(function(response) { response ? (response["continue"] === !0 ? ($scope.treatment["continue"] = !0, value = !0) : ($scope.treatment["continue"] = !1, value = !1), null !== response.instruction ? $scope.treatment.instructions = response.instruction : $scope.treatment.instructions = void 0, null !== response.duration ? $scope.treatment.duration = response.duration : response["continue"] === !0 ? $scope.treatment.duration = parseInt(1) : $scope.treatment.duration = void 0, null !== response.durationUnit ? $scope.treatment.durationUnit = response.durationUnit : $scope.treatment.durationUnit = "Day(s)", null !== response.dose ? ($scope.treatment.isUniformFrequency = !0, $scope.treatment.uniformDosingType.dose = parseFloat(response.dose), null !== response.frequency ? $scope.treatment.uniformDosingType.frequency = response.frequency : $scope.treatment.uniformDosingType.frequency = void 0, null !== response.and ? $scope.treatment.uniformDosingType.doseFraction = $scope.doseFractions.filter(function(data) { return data.label === response.and })[0] : $scope.treatment.uniformDosingType.doseFraction = void 0) : ($scope.treatment.isUniformFrequency = !1, $scope.treatment.uniformDosingType.dose = void 0, null !== response.morningDose ? ($scope.treatment.isUniformFrequency = !1, $scope.treatment.variableDosingType.morningDose = parseFloat(response.morningDose)) : $scope.treatment.variableDosingType.morningDose = 0, null !== response.nightDose ? ($scope.treatment.isUniformFrequency = !1, $scope.treatment.variableDosingType.eveningDose = parseFloat(response.nightDose)) : $scope.treatment.variableDosingType.eveningDose = 0, null !== response.afternoonDose ? ($scope.treatment.isUniformFrequency = !1, $scope.treatment.variableDosingType.afternoonDose = parseFloat(response.afternoonDose)) : $scope.treatment.variableDosingType.afternoonDose = 0)) : ($scope.treatment.isUniformFrequency = !1, $scope.treatment.uniformDosingType.dose = void 0, $scope.treatment.variableDosingType.afternoonDose = 0, $scope.treatment.variableDosingType.morningDose = 0, $scope.treatment.variableDosingType.eveningDose = 0, $scope.treatment.uniformDosingType.frequency = void 0, $scope.treatment.uniformDosingType.doseFraction = void 0, $scope.treatment.duration = void 0, $scope.treatment["continue"] = !1, $scope.treatment.instructions = void 0, $scope.treatment.durationUnit = "Day(s)") }), void(selectedItem = null)) : $scope.treatment.acceptedItem ? ($scope.treatment.isNonCodedDrug = !$scope.treatment.isNonCodedDrug, $scope.treatment.drugNonCoded = $scope.treatment.acceptedItem, delete $scope.treatment.drug, void delete $scope.treatment.acceptedItem) : void delete $scope.treatment.drug } }(), $scope.clearForm = function() { $scope.treatment = newTreatment(), $scope.formInvalid = !1, clearHighlights(), markVariable("startNewDrugEntry") }, $scope.openActionLink = function(extension) { var url, location; locationService.getLoggedInLocation().then(function(response) { location = response.name, url = extension.url.replace("{{patient_ref}}", $scope.patient.identifier).replace("{{location_ref}}", location), $window.open(url, "_blank") }) }, $scope.toggleTabIndexWithinModal = function(event) { var buttonsToFocusOn = ["modal-revise-button", "modal-refill-button"], focusedButton = event.target; focusedButton.tabIndex = 1, buttonsToFocusOn.splice(buttonsToFocusOn.indexOf(focusedButton.id), 1); var otherButton = buttonsToFocusOn[0]; $("#" + otherButton)[0].tabIndex = 2 }, $scope.toggleDrugOrderAttribute = function(orderAttribute) { orderAttribute.value = !orderAttribute.value }, contextChangeHandler.add(contextChange); var getActiveDrugOrders = function(activeDrugOrders) { var activeDrugOrdersList = activeDrugOrders || []; return activeDrugOrdersList.map(function(drugOrder) { return DrugOrderViewModel.createFromContract(drugOrder, treatmentConfig) }) }, removeOrder = function(removableOrder) { removableOrder.action = Bahmni.Clinical.Constants.orderActions.discontinue, removableOrder.previousOrderUuid = removableOrder.uuid, removableOrder.uuid = void 0, $scope.consultation.removableDrugs.push(removableOrder) }, saveTreatment = function() { var tabNames = Object.keys($scope.consultation.newlyAddedTabTreatments || {}), allTreatmentsAcrossTabs = _.flatten(_.map(tabNames, function(tabName) { return $scope.consultation.newlyAddedTabTreatments[tabName].treatments })), orderSetTreatmentsAcrossTabs = _.flatten(_.map(tabNames, function(tabName) { return $scope.consultation.newlyAddedTabTreatments[tabName].orderSetTreatments })), includedOrderSetTreatments = _.filter(orderSetTreatmentsAcrossTabs, function(treatment) { return !treatment.orderSetUuid || treatment.include }); $scope.consultation.newlyAddedTreatments = allTreatmentsAcrossTabs.concat(includedOrderSetTreatments), $scope.consultation.discontinuedDrugs && $scope.consultation.discontinuedDrugs.forEach(function(discontinuedDrug) { var removableOrder = _.find(activeDrugOrders, { uuid: discontinuedDrug.uuid }); discontinuedDrug && (removableOrder.orderReasonText = discontinuedDrug.orderReasonText, removableOrder.dateActivated = null, removableOrder.scheduledDate = discontinuedDrug.dateStopped, removableOrder.dateStopped = discontinuedDrug.dateStopped, discontinuedDrug.orderReasonConcept && discontinuedDrug.orderReasonConcept.name && (removableOrder.orderReasonConcept = { name: discontinuedDrug.orderReasonConcept.name.name, uuid: discontinuedDrug.orderReasonConcept.uuid })), removableOrder && removeOrder(removableOrder) }) }, putCalculatedDose = function(orderTemplate) { var visitUuid = treatmentConfig.orderSet.calculateDoseOnlyOnCurrentVisitValues ? $scope.activeVisit.uuid : void 0, calculatedDose = orderSetService.getCalculatedDose($scope.patient.uuid, orderTemplate.concept.name, orderTemplate.dosingInstructions.dose, orderTemplate.dosingInstructions.doseUnits, $scope.newOrderSet.name, orderTemplate.dosingInstructions.dosingRule, visitUuid); return 0 === calculatedDose.$$state.status && ($scope.isSearchDisabled = !1), calculatedDose.then(function(calculatedDosage) { return orderTemplate.dosingInstructions.dose = calculatedDosage.dose, orderTemplate.dosingInstructions.doseUnits = calculatedDosage.doseUnit, orderTemplate }) }, deleteDrugIfEmpty = function(template) { _.isEmpty(template.drug) && delete template.drug }, setUpOrderSetTransactionalData = function(orderSetMember) { orderSetMember.orderTemplateMetaData = orderSetMember.orderTemplate, orderSetMember.orderTemplate = JSON.parse(orderSetMember.orderTemplate), orderSetMember.orderTemplate.concept = { name: orderSetMember.concept.display, uuid: orderSetMember.concept.uuid }, deleteDrugIfEmpty(orderSetMember.orderTemplate) }, calculateDoseForTemplatesIn = function(orderSet) { $scope.newOrderSet.name = orderSet.name; var orderSetMemberTemplates = _.map(orderSet.orderSetMembers, "orderTemplate"), promisesToCalculateDose = _.map(orderSetMemberTemplates, putCalculatedDose), returnOrderSet = function() { return orderSet }; return $q.all(promisesToCalculateDose).then(returnOrderSet) }, createDrugOrderViewModel = function(orderTemplate) { orderTemplate.effectiveStartDate = $scope.newOrderSet.date; var drugOrder = Bahmni.Clinical.DrugOrder.create(orderTemplate), drugOrderViewModel = Bahmni.Clinical.DrugOrderViewModel.createFromContract(drugOrder, treatmentConfig); return drugOrderViewModel.instructions = orderTemplate.administrationInstructions, drugOrderViewModel.additionalInstructions = orderTemplate.additionalInstructions, drugOrderViewModel.isNewOrderSet = !0, drugOrderViewModel.dosingInstructionType = Bahmni.Clinical.Constants.flexibleDosingInstructionsClass, drugOrderViewModel.quantity = drugOrderViewModel.quantity || 0, drugOrderViewModel.calculateDurationUnit(), drugOrderViewModel.calculateQuantityAndUnit(), drugOrderViewModel.calculateEffectiveStopDate(), drugOrderViewModel.setUniformDoseFraction(), drugOrderViewModel }, setSortWeightForOrderSetDrugs = function(orderSetDrugs) { _.each(orderSetDrugs, function(drugOrder, index) { void 0 !== drugOrder.sortWeight ? drugOrder.sortWeight = drugOrder.sortWeight + orderSetDrugs.length : drugOrder.sortWeight = index + 1 }) }, createDrugOrdersAndGetConflicts = function(orderSet) { var conflictingDrugOrders = [], orderSetMemberTemplates = _.map(orderSet.orderSetMembers, "orderTemplate"); return _.each(orderSetMemberTemplates, function(orderTemplate) { var drugOrderViewModel = createDrugOrderViewModel(orderTemplate); drugOrderViewModel.orderSetUuid = orderSet.uuid; var conflictingDrugOrder = getConflictingDrugOrder(drugOrderViewModel); conflictingDrugOrder ? conflictingDrugOrders.push(conflictingDrugOrder) : drugOrderViewModel.include = !1, $scope.orderSetTreatments.push(drugOrderViewModel) }), setSortWeightForOrderSetDrugs($scope.orderSetTreatments), conflictingDrugOrders }, showConflictMessageIfAny = function(conflictingDrugOrders) { _.isEmpty(conflictingDrugOrders) || (_.each($scope.orderSetTreatments, function(orderSetDrugOrder) { orderSetDrugOrder.include = !1 }), ngDialog.open({ template: "consultation/views/treatmentSections/conflictingOrderSet.html", data: { conflictingDrugOrders: conflictingDrugOrders } }), $scope.popupActive = !0) }; $scope.addOrderSet = function(orderSet) { $scope.isSearchDisabled = !0, scrollTop(); var setUpNewOrderSet = function() { $scope.newOrderSet.name = orderSet.name, $scope.newOrderSet.uuid = orderSet.uuid, $scope.isSearchDisabled = !0 }; calculateDoseForTemplatesIn(orderSet).then(createDrugOrdersAndGetConflicts).then(showConflictMessageIfAny).then(setUpNewOrderSet) }, $scope.removeOrderSet = function() { $scope.isSearchDisabled = !1, delete $scope.newOrderSet.name, delete $scope.newOrderSet.uuid, $scope.orderSetTreatments.splice(0, $scope.orderSetTreatments.length) }, $scope.$on("event:includeOrderSetDrugOrder", function(event, drugOrder) { var conflictingDrugOrder = getConflictingDrugOrder(drugOrder); conflictingDrugOrder && (drugOrder.include = !1, ngDialog.open({ template: "consultation/views/treatmentSections/conflictingOrderSet.html", data: { conflictingDrugOrders: [conflictingDrugOrder] } }), $scope.popupActive = !0) }), $scope.consultation.preSaveHandler.register("drugOrderSaveHandlerKey", saveTreatment); var mergeActiveAndScheduledWithDiscontinuedOrders = function() { _.each($scope.consultation.discontinuedDrugs, function(discontinuedDrug) { _.remove($scope.consultation.activeAndScheduledDrugOrders, { uuid: discontinuedDrug.uuid }), $scope.consultation.activeAndScheduledDrugOrders.push(discontinuedDrug) }) }, init = function() { $scope.consultation.removableDrugs = $scope.consultation.removableDrugs || [], $scope.consultation.discontinuedDrugs = $scope.consultation.discontinuedDrugs || [], $scope.consultation.drugOrdersWithUpdatedOrderAttributes = $scope.consultation.drugOrdersWithUpdatedOrderAttributes || {}, $scope.consultation.activeAndScheduledDrugOrders = getActiveDrugOrders(activeDrugOrders), mergeActiveAndScheduledWithDiscontinuedOrders(), $scope.treatmentConfig = treatmentConfig }; init() }]), angular.module("bahmni.clinical").controller("DispositionController", ["$scope", "$q", "dispositionService", "retrospectiveEntryService", "spinner", function($scope, $q, dispositionService, retrospectiveEntryService, spinner) { var consultation = $scope.consultation, allDispositions = [], getPreviousDispositionNote = function() { if (consultation.disposition && !consultation.disposition.voided) return _.find(consultation.disposition.additionalObs, function(obs) { return obs.concept.uuid === $scope.dispositionNoteConceptUuid }) }, getDispositionNotes = function() { var previousDispositionNotes = getPreviousDispositionNote(); return getSelectedConceptName($scope.dispositionCode, $scope.dispositionActions) ? _.cloneDeep(previousDispositionNotes) || { concept: { uuid: $scope.dispositionNoteConceptUuid } } : { concept: { uuid: $scope.dispositionNoteConceptUuid } } }, getDispositionActionsPromise = function() { return dispositionService.getDispositionActions().then(function(response) { allDispositions = (new Bahmni.Clinical.DispostionActionMapper).map(response.data.results[0].answers), $scope.dispositionActions = filterDispositionActions(allDispositions, $scope.$parent.visitSummary), $scope.dispositionCode = consultation.disposition && !consultation.disposition.voided ? consultation.disposition.code : null, $scope.dispositionNote = getDispositionNotes() }) }, getDispositionActions = function(finalDispositionActions, dispositions, action) { var copyOfFinalDispositionActions = _.cloneDeep(finalDispositionActions), dispositionPresent = _.find(dispositions, action); return dispositionPresent && copyOfFinalDispositionActions.push(dispositionPresent), copyOfFinalDispositionActions }, filterDispositionActions = function(dispositions, visitSummary) { var defaultDispositions = ["Undo Discharge", "Admit Patient", "Transfer Patient", "Discharge Patient"], finalDispositionActions = _.filter(dispositions, function(disposition) { return defaultDispositions.indexOf(disposition.name) < 0 }), isVisitOpen = !!visitSummary && _.isEmpty(visitSummary.stopDateTime); return visitSummary && visitSummary.isDischarged() && isVisitOpen ? finalDispositionActions = getDispositionActions(finalDispositionActions, dispositions, { name: defaultDispositions[0] }) : visitSummary && visitSummary.isAdmitted() && isVisitOpen ? (finalDispositionActions = getDispositionActions(finalDispositionActions, dispositions, { name: defaultDispositions[2] }), finalDispositionActions = getDispositionActions(finalDispositionActions, dispositions, { name: defaultDispositions[3] })) : finalDispositionActions = getDispositionActions(finalDispositionActions, dispositions, { name: defaultDispositions[1] }), finalDispositionActions }; $scope.isRetrospectiveMode = function() { return !_.isEmpty(retrospectiveEntryService.getRetrospectiveEntry()) }, $scope.showWarningForEarlierDispositionNote = function() { return !$scope.dispositionCode && consultation.disposition }; var getDispositionNotePromise = function() { return dispositionService.getDispositionNoteConcept().then(function(response) { $scope.dispositionNoteConceptUuid = response.data.results[0].uuid }) }, loadDispositionActions = function() { return getDispositionNotePromise().then(getDispositionActionsPromise) }; $scope.clearDispositionNote = function() { $scope.dispositionNote.value = null }; var getSelectedConceptName = function(dispositionCode, dispositions) { var selectedDispositionConceptName = _.findLast(dispositions, { code: dispositionCode }) || {}; return selectedDispositionConceptName.name }, getSelectedDisposition = function() { if ($scope.dispositionCode) { $scope.dispositionNote.voided = !$scope.dispositionNote.value; var disposition = { additionalObs: [], dispositionDateTime: consultation.disposition && consultation.disposition.dispositionDateTime, code: $scope.dispositionCode, conceptName: getSelectedConceptName($scope.dispositionCode, allDispositions) }; return ($scope.dispositionNote.value || $scope.dispositionNote.uuid) && (disposition.additionalObs = [_.clone($scope.dispositionNote)]), disposition } }; spinner.forPromise(loadDispositionActions(), "#disposition"); var saveDispositions = function() { var selectedDisposition = getSelectedDisposition(); selectedDisposition ? consultation.disposition = selectedDisposition : consultation.disposition && (consultation.disposition.voided = !0, consultation.disposition.voidReason = "Cancelled during encounter") }; $scope.consultation.preSaveHandler.register("dispositionSaveHandlerKey", saveDispositions), $scope.$on("$destroy", saveDispositions) }]), angular.module("bahmni.clinical").controller("ConsultationController", ["$scope", "$rootScope", "$state", "$http", "$location", "$translate", "clinicalAppConfigService", "diagnosisService", "urlHelper", "contextChangeHandler", "spinner", "encounterService", "messagingService", "sessionService", "retrospectiveEntryService", "patientContext", "$q", "patientVisitHistoryService", "$stateParams", "$window", "visitHistory", "clinicalDashboardConfig", "appService", "ngDialog", "$filter", "configurations", "visitConfig", "conditionsService", "configurationService", "auditLogService", function($scope, $rootScope, $state, $http, $location, $translate, clinicalAppConfigService, diagnosisService, urlHelper, contextChangeHandler, spinner, encounterService, messagingService, sessionService, retrospectiveEntryService, patientContext, $q, patientVisitHistoryService, $stateParams, $window, visitHistory, clinicalDashboardConfig, appService, ngDialog, $filter, configurations, visitConfig, conditionsService, configurationService, auditLogService) { var DateUtil = Bahmni.Common.Util.DateUtil; Bahmni.Common.Domain.Conditions.getPreviousActiveCondition; $scope.togglePrintList = !1, $scope.patient = patientContext.patient, $scope.showDashboardMenu = !1, $scope.stateChange = function() { return "patient.dashboard.show" === $state.current.name }, $scope.showComment = !0, $scope.showSaveAndContinueButton = !0, $scope.visitHistory = visitHistory, $scope.consultationBoardLink = clinicalAppConfigService.getConsultationBoardLink(), $scope.showControlPanel = !1, $scope.clinicalDashboardConfig = clinicalDashboardConfig, $scope.lastvisited = null, $scope.openConsultationInNewTab = function() { $window.open("#" + $scope.consultationBoardLink, "_blank") }, $scope.toggleDashboardMenu = function() { $scope.showDashboardMenu = !$scope.showDashboardMenu }, $scope.showDashboard = function(dashboard) { clinicalDashboardConfig.isCurrentTab(dashboard) || $scope.$parent.$broadcast("event:switchDashboard", dashboard), $scope.showDashboardMenu = !1 }; var setPrintAction = function(event, tab) { tab.print = function() { $rootScope.$broadcast(event, tab) } }, setDashboardPrintAction = _.partial(setPrintAction, "event:printDashboard", _), setVisitTabPrintAction = function(tab) { tab.print = function() { var url = $state.href("patient.dashboard.visitPrint", { visitUuid: visitHistory.activeVisit.uuid, tab: tab.title, print: "print" }); window.open(url, "_blank") } }; _.each(visitConfig.tabs, setVisitTabPrintAction), _.each(clinicalDashboardConfig.tabs, setDashboardPrintAction), $scope.printList = _.concat(clinicalDashboardConfig.tabs, visitConfig.tabs), clinicalDashboardConfig.quickPrints = appService.getAppDescriptor().getConfigValue("quickPrints"), $scope.printDashboard = function(tab) { tab ? tab.print() : clinicalDashboardConfig.currentTab.print() }, $scope.allowConsultation = function() { return appService.getAppDescriptor().getConfigValue("allowConsultationWhenNoOpenVisit") }, $scope.closeDashboard = function(dashboard) { clinicalDashboardConfig.closeTab(dashboard), $scope.$parent.$parent.$broadcast("event:switchDashboard", clinicalDashboardConfig.currentTab) }, $scope.closeAllDialogs = function() { ngDialog.closeAll() }, $scope.availableBoards = [], $scope.configName = $stateParams.configName, $scope.getTitle = function(board) { return $filter("titleTranslate")(board) }, $scope.showBoard = function(boardIndex) { return $rootScope.collapseControlPanel(), buttonClickAction($scope.availableBoards[boardIndex]) }; var updateQueueStatus = function(identifier, roomId) { return $http({ method: "PUT", url: "/openmrs/module/queuemanagement/updateQueue.form?identifier=" + identifier + "&roomId=" + roomId, headers: { "Content-Type": "application/json" } }) }; $scope.completeConsultation = function(visitUuid) { const queueMng = appService.getAppDescriptor().getConfigValue("queueManagement"), identifier = $scope.patient.identifier, date = new Date, formatDate = date.toISOString().split("T"); queueMng.willUse === !0 ? $http({ method: "GET", url: "/openmrs/module/queuemanagement/getToken.form?identifier=" + identifier + "&dateCreated=" + formatDate[0] }).then(function(response) { const room = response.data.roomId; void 0 !== room ? updateQueueStatus(identifier, room) : console.log("Patient Room Id is undefined for the queue") }) : console.log("Queue management module is not being used now"), contextChangeHandler.execute().allow && $location.path($stateParams.configName + "/patient/" + patientContext.patient.uuid + "/dashboard/visit/" + visitUuid + "/?encounterUuid=active") }, $scope.gotoPatientDashboard = function() { if (!isFormValid()) return $scope.$parent.$parent.$broadcast("event:errorsOnForm"), $q.when({}); if (contextChangeHandler.execute().allow) { var params = { configName: $scope.configName, patientUuid: patientContext.patient.uuid, encounterUuid: void 0 }; $scope.dashboardDirty && (params.dashboardCachebuster = Math.random()), $state.go("patient.dashboard.show", params) } }; var isLongerName = function(value) { return !!value && value.length > 18 }; $scope.getShorterName = function(value) { return isLongerName(value) ? value.substring(0, 15) + "..." : value }, $scope.isInEditEncounterMode = function() { return void 0 !== $stateParams.encounterUuid && "active" !== $stateParams.encounterUuid }, $scope.enablePatientSearch = function() { return appService.getAppDescriptor().getConfigValue("allowPatientSwitchOnConsultation") === !0 }; var setCurrentBoardBasedOnPath = function() { var currentPath = $location.url(), board = _.find($scope.availableBoards, function(board) { return "treatment" === board.url ? _.includes(currentPath, board.extensionParams ? board.extensionParams.tabConfigName : board.url) : _.includes(currentPath, board.url) }); board && ($scope.currentBoard = board, $scope.currentBoard.isSelectedTab = !0) }, initialize = function() { var appExtensions = clinicalAppConfigService.getAllConsultationBoards(); $scope.adtNavigationConfig = { forwardUrl: Bahmni.Clinical.Constants.adtForwardUrl, title: $translate.instant("CLINICAL_GO_TO_DASHBOARD_LABEL"), privilege: Bahmni.Clinical.Constants.adtPrivilege }, $scope.availableBoards = $scope.availableBoards.concat(appExtensions), $scope.showSaveConfirmDialogConfig = appService.getAppDescriptor().getConfigValue("showSaveConfirmDialog"); var adtNavigationConfig = appService.getAppDescriptor().getConfigValue("adtNavigationConfig"); Object.assign($scope.adtNavigationConfig, adtNavigationConfig), setCurrentBoardBasedOnPath() }; $scope.shouldDisplaySaveConfirmDialogForStateChange = function(toState, toParams, fromState, fromParams) { return !toState.name.match(/patient.dashboard.show.*/) || fromParams.patientUuid != toParams.patientUuid }; var cleanUpListenerStateChangeStart = $scope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams) { $scope.showSaveConfirmDialogConfig && $rootScope.hasVisitedConsultation && $scope.shouldDisplaySaveConfirmDialogForStateChange(toState, toParams, fromState, fromParams) && $scope.showConfirmationPopUp && (event.preventDefault(), spinner.hide(toState.spinnerToken), ngDialog.close(), $scope.toStateConfig = { toState: toState, toParams: toParams }, $scope.displayConfirmationDialog()), setCurrentBoardBasedOnPath() }); $scope.adtNavigationURL = function(visitUuid) { return appService.getAppDescriptor().formatUrl($scope.adtNavigationConfig.forwardUrl, { patientUuid: $scope.patient.uuid, visitUuid: visitUuid }) }; var cleanUpListenerErrorsOnForm = $scope.$on("event:errorsOnForm", function() { $scope.showConfirmationPopUp = !0 }); $scope.displayConfirmationDialog = function(event) { $rootScope.hasVisitedConsultation && $scope.showSaveConfirmDialogConfig && (event && (event.preventDefault(), $scope.targetUrl = event.currentTarget.getAttribute("href")), ngDialog.openConfirm({ template: "../common/ui-helper/views/saveConfirmation.html", scope: $scope })) }; var cleanUpListenerStateChangeSuccess = $scope.$on("$stateChangeSuccess", function(event, toState, toParams, fromState) { toState.name.match(/patient.dashboard.show.+/) && ($rootScope.hasVisitedConsultation = !0, $scope.showConfirmationPopUp = !0, $scope.showSaveConfirmDialogConfig && $rootScope.$broadcast("event:pageUnload")), toState.name === fromState.name && "patient.dashboard.show" === fromState.name && ($rootScope.hasVisitedConsultation = !1) }); $scope.$on("$destroy", function() { cleanUpListenerStateChangeSuccess(), cleanUpListenerErrorsOnForm(), cleanUpListenerStateChangeStart() }), $scope.cancelTransition = function() { $scope.showConfirmationPopUp = !0, ngDialog.close(), delete $scope.targetUrl }, $scope.saveAndContinue = function() { $scope.showConfirmationPopUp = !1, $scope.save($scope.toStateConfig), $window.onbeforeunload = null, ngDialog.close() }, $scope.continueWithoutSaving = function() { $scope.showConfirmationPopUp = !1, $scope.targetUrl && $window.open($scope.targetUrl, "_self"), $window.onbeforeunload = null, $state.go($scope.toStateConfig.toState, $scope.toStateConfig.toParams), ngDialog.close() }; var getUrl = function(board) { var urlPrefix = urlHelper.getPatientUrl(), url = "/" + $stateParams.configName + (board.url ? urlPrefix + "/" + board.url : urlPrefix), queryParams = []; $state.params.encounterUuid && queryParams.push("encounterUuid=" + $state.params.encounterUuid), $state.params.programUuid && queryParams.push("programUuid=" + $state.params.programUuid), $state.params.enrollment && queryParams.push("enrollment=" + $state.params.enrollment), $state.params.dateEnrolled && queryParams.push("dateEnrolled=" + $state.params.dateEnrolled), $state.params.dateCompleted && queryParams.push("dateCompleted=" + $state.params.dateCompleted); var extensionParams = board.extensionParams; return angular.forEach(extensionParams, function(extensionParamValue, extensionParamKey) { queryParams.push(extensionParamKey + "=" + extensionParamValue) }), _.isEmpty(queryParams) || (url = url + "?" + queryParams.join("&")), $scope.lastConsultationTabUrl.url = url, $location.url(url) }; $scope.openConsultation = function() { $scope.showSaveConfirmDialogConfig && $rootScope.$broadcast("event:pageUnload"), $scope.closeAllDialogs(), $scope.collapseControlPanel(), $rootScope.hasVisitedConsultation = !0, switchToConsultationTab() }, $scope.singlePagePrescription = function() { //$window.location.href = "https://${$window.location.hostname}:6061/prescription/${$scope.patient.uuid}" $window.location.href = "https://" + $window.location.hostname + ":6060/patientDashboard/" + $scope.patient.uuid; }; var switchToConsultationTab = function() { $scope.lastConsultationTabUrl.url ? $location.url($scope.lastConsultationTabUrl.url) : getUrl($scope.availableBoards[0]) }, contextChange = function() { return contextChangeHandler.execute() }, buttonClickAction = function(board) { if ($scope.currentBoard !== board) return isFormValid() ? (contextChangeHandler.reset(), _.map($scope.availableBoards, function(availableBoard) { availableBoard.isSelectedTab = !1 }), $scope.currentBoard = board, $scope.currentBoard.isSelectedTab = !0, getUrl(board)) : void $scope.$parent.$broadcast("event:errorsOnForm") }, preSavePromise = function() { var deferred = $q.defer(), observationFilter = new Bahmni.Common.Domain.ObservationFilter; $scope.consultation.preSaveHandler.fire(), $scope.lastvisited = $scope.consultation.lastvisited; var selectedObsTemplate = $scope.consultation.selectedObsTemplate, tempConsultation = angular.copy($scope.consultation); tempConsultation.observations = observationFilter.filter(tempConsultation.observations), tempConsultation.consultationNote = observationFilter.filter([tempConsultation.consultationNote])[0], tempConsultation.labOrderNote = observationFilter.filter([tempConsultation.labOrderNote])[0], addFormObservations(tempConsultation), storeTemplatePreference(selectedObsTemplate); var visitTypeForRetrospectiveEntries = clinicalAppConfigService.getVisitTypeForRetrospectiveEntries(), defaultVisitType = clinicalAppConfigService.getDefaultVisitType(), encounterData = (new Bahmni.Clinical.EncounterTransactionMapper).map(tempConsultation, $scope.patient, sessionService.getLoginLocationUuid(), retrospectiveEntryService.getRetrospectiveEntry(), visitTypeForRetrospectiveEntries, defaultVisitType, $scope.isInEditEncounterMode(), $state.params.enrollment); return deferred.resolve(encounterData), deferred.promise }, saveConditions = function() { return conditionsService.save($scope.consultation.conditions, $scope.patient.uuid).then(function() { return conditionsService.getConditions($scope.patient.uuid) }).then(function(savedConditions) { return savedConditions }) }, storeTemplatePreference = function(selectedObsTemplate) { var templates = []; _.each(selectedObsTemplate, function(template) { var templateName = template.formName || template.conceptName, isTemplateAlreadyPresent = _.find(templates, function(template) { return template === templateName }); _.isUndefined(isTemplateAlreadyPresent) && templates.push(templateName) }); var data = { patientUuid: $scope.patient.uuid, providerUuid: $rootScope.currentProvider.uuid, templates: templates }; _.isEmpty(templates) || localStorage.setItem("templatePreference", JSON.stringify(data)) }, discontinuedDrugOrderValidation = function(removableDrugs) { var discontinuedDrugOrderValidationMessage; return _.find(removableDrugs, function(drugOrder) { if (!drugOrder.dateStopped) return drugOrder._effectiveStartDate < moment() ? (discontinuedDrugOrderValidationMessage = "Please make sure that " + drugOrder.concept.name + " has a stop date between " + DateUtil.getDateWithoutTime(drugOrder._effectiveStartDate) + " and " + DateUtil.getDateWithoutTime(DateUtil.now()), !0) : (discontinuedDrugOrderValidationMessage = drugOrder.concept.name + " should have stop date as today's date since it is a future drug order", !0) }), discontinuedDrugOrderValidationMessage }, addFormObservations = function(tempConsultation) { tempConsultation.observationForms && (_.remove(tempConsultation.observations, function(observation) { return observation.formNamespace }), _.each(tempConsultation.observationForms, function(observationForm) { if (observationForm.component) { var formObservations = observationForm.component.getValue(); _.each(formObservations.observations, function(obs) { tempConsultation.observations.push(obs) }) } })) }, isObservationFormValid = function() { var valid = !0; return _.each($scope.consultation.observationForms, function(observationForm) { if (valid && observationForm.component) { var value = observationForm.component.getValue(); value.errors && (messagingService.showMessage("error", "{{'CLINICAL_FORM_ERRORS_MESSAGE_KEY' | translate }}"), valid = !1) } }), valid }, isFormValid = function() { var contxChange = contextChange(), shouldAllow = contxChange.allow, discontinuedDrugOrderValidationMessage = discontinuedDrugOrderValidation($scope.consultation.discontinuedDrugs); if (shouldAllow) discontinuedDrugOrderValidationMessage && messagingService.showMessage("error", discontinuedDrugOrderValidationMessage); else { var errorMessage = contxChange.errorMessage ? contxChange.errorMessage : "{{'CLINICAL_FORM_ERRORS_MESSAGE_KEY' | translate }}"; messagingService.showMessage("error", errorMessage) } return shouldAllow && !discontinuedDrugOrderValidationMessage && isObservationFormValid() }, copyConsultationToScope = function(consultationWithDiagnosis) { consultationWithDiagnosis.preSaveHandler = $scope.consultation.preSaveHandler, consultationWithDiagnosis.postSaveHandler = $scope.consultation.postSaveHandler, $scope.$parent.consultation = consultationWithDiagnosis, $scope.$parent.consultation.postSaveHandler.fire(), $scope.dashboardDirty = !0 }; $scope.save = function(toStateConfig) { return isFormValid() ? spinner.forPromise($q.all([preSavePromise(), encounterService.getEncounterType($state.params.programUuid, sessionService.getLoginLocationUuid())]).then(function(results) { var encounterData = results[0]; encounterData.encounterTypeUuid = results[1].uuid; var params = angular.copy($state.params); return params.cachebuster = Math.random(), encounterService.create(encounterData).then(function(saveResponse) { var messageParams = { encounterUuid: saveResponse.data.encounterUuid, encounterType: saveResponse.data.encounterType }; auditLogService.log($scope.patient.uuid, "EDIT_ENCOUNTER", messageParams, "MODULE_LABEL_CLINICAL_KEY"); var consultationMapper = new Bahmni.ConsultationMapper(configurations.dosageFrequencyConfig(), configurations.dosageInstructionConfig(), configurations.consultationNoteConcept(), configurations.labOrderNotesConcept(), $scope.followUpConditionConcept), consultation = consultationMapper.map(saveResponse.data); return consultation.lastvisited = $scope.lastvisited, consultation }).then(function(savedConsultation) { return spinner.forPromise(diagnosisService.populateDiagnosisInformation($scope.patient.uuid, savedConsultation).then(function(consultationWithDiagnosis) { return saveConditions().then(function(savedConditions) { consultationWithDiagnosis.conditions = savedConditions, messagingService.showMessage("info", "{{'CLINICAL_SAVE_SUCCESS_MESSAGE_KEY' | translate}}") }, function() { consultationWithDiagnosis.conditions = $scope.consultation.conditions }).then(function() { return copyConsultationToScope(consultationWithDiagnosis), $scope.targetUrl ? $window.open($scope.targetUrl, "_self") : $state.transitionTo(toStateConfig ? toStateConfig.toState : $state.current, toStateConfig ? toStateConfig.toParams : params, { inherit: !1, notify: !0, reload: void 0 !== toStateConfig }) }) })) })["catch"](function(error) { var message = Bahmni.Clinical.Error.translate(error) || "{{'CLINICAL_SAVE_FAILURE_MESSAGE_KEY' | translate}}"; messagingService.showMessage("error", message) }) })) : ($scope.$parent.$parent.$broadcast("event:errorsOnForm"), $q.when({})) }, initialize() }]), angular.module("bahmni.clinical").controller("ConceptSetPageController", ["$scope", "$rootScope", "$stateParams", "conceptSetService", "clinicalAppConfigService", "messagingService", "configurations", "$state", "spinner", "contextChangeHandler", "$q", "$translate", "formService", function($scope, $rootScope, $stateParams, conceptSetService, clinicalAppConfigService, messagingService, configurations, $state, spinner, contextChangeHandler, $q, $translate, formService) { $scope.consultation.selectedObsTemplate = $scope.consultation.selectedObsTemplate || [], $scope.allTemplates = $scope.allTemplates || [], $scope.scrollingEnabled = !1; var extensions = clinicalAppConfigService.getAllConceptSetExtensions($stateParams.conceptSetGroupName), configs = clinicalAppConfigService.getAllConceptsConfig(), visitType = configurations.encounterConfig().getVisitTypeByUuid($scope.consultation.visitTypeUuid); $scope.context = { visitType: visitType, patient: $scope.patient }; var numberOfLevels = 2, fields = ["uuid", "name:(name,display)", "names:(uuid,conceptNameType,name)"], customRepresentation = Bahmni.ConceptSet.CustomRepresentationBuilder.build(fields, "setMembers", numberOfLevels), allConceptSections = [], init = function() { void 0 !== $scope.allTemplates && $scope.allTemplates.length > 0 || spinner.forPromise(conceptSetService.getConcept({ name: "All Observation Templates", v: "custom:" + customRepresentation }).then(function(response) { var allTemplates = response.data.results[0].setMembers; createConceptSections(allTemplates), $state.params.programUuid && showOnlyTemplatesFilledInProgram(), void 0 !== $scope.consultation.observationForms && $scope.consultation.observationForms.length > 0 ? concatObservationForms() : spinner.forPromise(formService.getFormList($scope.consultation.encounterUuid).then(function(response) { $scope.consultation.observationForms = getObservationForms(response.data), concatObservationForms() })) })) }, concatObservationForms = function() { if ($scope.allTemplates = getSelectedObsTemplate(allConceptSections), $scope.uniqueTemplates = _.uniqBy($scope.allTemplates, "label"), $scope.allTemplates = $scope.allTemplates.concat($scope.consultation.observationForms), 0 == $scope.consultation.selectedObsTemplate.length) { initializeDefaultTemplates(), $scope.consultation.observations && $scope.consultation.observations.length > 0 && addTemplatesInSavedOrder(); var templateToBeOpened = getLastVisitedTemplate() || _.first($scope.consultation.selectedObsTemplate); templateToBeOpened && openTemplate(templateToBeOpened) } }, addTemplatesInSavedOrder = function() { var templatePreference = JSON.parse(localStorage.getItem("templatePreference")); templatePreference && templatePreference.patientUuid === $scope.patient.uuid && !_.isEmpty(templatePreference.templates) && $rootScope.currentProvider.uuid === templatePreference.providerUuid ? insertInSavedOrder(templatePreference) : insertInDefaultOrder() }, insertInSavedOrder = function(templatePreference) { var templateNames = templatePreference.templates; _.each(templateNames, function(templateName) { var foundTemplates = _.filter($scope.allTemplates, function(allTemplate) { return allTemplate.conceptName === templateName }); foundTemplates.length > 0 && _.each(foundTemplates, function(template) { _.isEmpty(template.observations) || insertTemplate(template) }) }) }, insertInDefaultOrder = function() { _.each($scope.allTemplates, function(template) { template.observations.length > 0 && insertTemplate(template) }) }, insertTemplate = function(template) { !template || template.isDefault() || template.alwaysShow || $scope.consultation.selectedObsTemplate.push(template) }, getLastVisitedTemplate = function() { return _.find($scope.consultation.selectedObsTemplate, function(template) { return template.id === $scope.consultation.lastvisited }) }, openTemplate = function(template) { template.isOpen = !0, template.isLoaded = !0, template.klass = "active" }, initializeDefaultTemplates = function() { $scope.consultation.selectedObsTemplate = _.filter($scope.allTemplates.reverse(), function(template) { return template.isDefault() || template.alwaysShow }) }; $scope.filterTemplates = function() { return $scope.uniqueTemplates = _.uniqBy($scope.allTemplates, "label"), $scope.uniqueTemplates = $scope.uniqueTemplates.filter(function(template) { return !template.label.includes("Room To Assign Emergency") && !template.label.includes("Room To Assign") }), $scope.consultation.searchParameter && ($scope.uniqueTemplates = _.filter($scope.uniqueTemplates, function(template) { return _.includes(template.label.toLowerCase(), $scope.consultation.searchParameter.toLowerCase()) })), $scope.uniqueTemplates }; var showOnlyTemplatesFilledInProgram = function() { spinner.forPromise(conceptSetService.getObsTemplatesForProgram($state.params.programUuid).success(function(data) { data.results.length > 0 && data.results[0].mappings.length > 0 && (_.map(allConceptSections, function(conceptSection) { conceptSection.isAdded = !1, conceptSection.alwaysShow = !1 }), _.map(data.results[0].mappings, function(template) { var matchedTemplate = _.find(allConceptSections, { uuid: template.uuid }); matchedTemplate && (matchedTemplate.alwaysShow = !0) })) })) }, createConceptSections = function(allTemplates) { _.map(allTemplates, function(template) { var conceptSetExtension = _.find(extensions, function(extension) { return extension.extensionParams.conceptName === template.name.name }) || {}, conceptSetConfig = configs[template.name.name] || {}, observationsForTemplate = getObservationsForTemplate(template); observationsForTemplate && observationsForTemplate.length > 0 ? _.each(observationsForTemplate, function(observation) { allConceptSections.push(new Bahmni.ConceptSet.ConceptSetSection(conceptSetExtension, $rootScope.currentUser, conceptSetConfig, [observation], template)) }) : allConceptSections.push(new Bahmni.ConceptSet.ConceptSetSection(conceptSetExtension, $rootScope.currentUser, conceptSetConfig, [], template)) }) }, collectObservationsFromConceptSets = function() { $scope.consultation.observations = [], _.each($scope.consultation.selectedObsTemplate, function(conceptSetSection) { conceptSetSection.observations[0] && $scope.consultation.observations.push(conceptSetSection.observations[0]) }) }, getObservationsForTemplate = function(template) { return _.filter($scope.consultation.observations, function(observation) { return !observation.formFieldPath && observation.concept.uuid === template.uuid }) }, getSelectedObsTemplate = function(allConceptSections) { return allConceptSections.filter(function(conceptSet) { if (conceptSet.isAvailable($scope.context)) return !0 }) }; $scope.stopAutoClose = function($event) { $event.stopPropagation() }, $scope.addTemplate = function(template) { $scope.scrollingEnabled = !0, $scope.showTemplatesList = !1; var index = _.findLastIndex($scope.consultation.selectedObsTemplate, function(consultationTemplate) { return consultationTemplate.label == template.label }); if (index != -1 && $scope.consultation.selectedObsTemplate[index].allowAddMore) { var clonedObj = template.clone(); clonedObj.klass = "active", $scope.consultation.selectedObsTemplate.splice(index + 1, 0, clonedObj) } else template.toggle(), template.klass = "active", $scope.consultation.selectedObsTemplate.push(template); $scope.consultation.searchParameter = "", messagingService.showMessage("info", $translate.instant("CLINICAL_TEMPLATE_ADDED_SUCCESS_KEY", { label: template.label })) }, $scope.getNormalized = function(conceptName) { return conceptName.replace(/['\.\s\(\)\/,\\]+/g, "_") }, $scope.consultation.preSaveHandler.register("collectObservationsFromConceptSets", collectObservationsFromConceptSets); var getObservationForms = function(observationsForms) { var forms = [], observations = $scope.consultation.observations || []; return _.each(observationsForms, function(observationForm) { var formUuid = observationForm.formUuid || observationForm.uuid, formName = observationForm.name || observationForm.formName, formVersion = observationForm.version || observationForm.formVersion; forms.push(new Bahmni.ObservationForm(formUuid, $rootScope.currentUser, formName, formVersion, observations)) }), forms }; init() }]), angular.module("bahmni.clinical").controller("DrugOrderHistoryController", ["$scope", "$filter", "$stateParams", "activeDrugOrders", "treatmentConfig", "treatmentService", "spinner", "drugOrderHistoryHelper", "visitHistory", "$translate", "$rootScope", function($scope, $filter, $stateParams, activeDrugOrders, treatmentConfig, treatmentService, spinner, drugOrderHistoryHelper, visitHistory, $translate, $rootScope) { var DrugOrderViewModel = Bahmni.Clinical.DrugOrderViewModel, DateUtil = Bahmni.Common.Util.DateUtil, currentVisit = visitHistory.activeVisit, prescribedDrugOrders = []; $scope.dispensePrivilege = Bahmni.Clinical.Constants.dispensePrivilege, $scope.scheduledDate = DateUtil.getDateWithoutTime(DateUtil.addDays(DateUtil.now(), 1)); var createPrescriptionGroups = function(activeAndScheduledDrugOrders) { $scope.consultation.drugOrderGroups = [], createPrescribedDrugOrderGroups(), createRecentDrugOrderGroup(activeAndScheduledDrugOrders) }, getPreviousVisitDrugOrders = function() { var currentVisitIndex = _.findIndex($scope.consultation.drugOrderGroups, function(group) { return group.isCurrentVisit }); return $scope.consultation.drugOrderGroups[currentVisitIndex + 1] ? $scope.consultation.drugOrderGroups[currentVisitIndex + 1].drugOrders : [] }, sortOrderSetDrugsFollowedByDrugOrders = function(drugOrders, showOnlyActive) { var orderSetOrdersAndDrugOrders = _.groupBy(drugOrders, function(drugOrder) { return drugOrder.orderGroupUuid ? "orderSetOrders" : "drugOrders" }), refillableDrugOrders = drugOrderHistoryHelper.getRefillableDrugOrders(orderSetOrdersAndDrugOrders.drugOrders, getPreviousVisitDrugOrders(), showOnlyActive); return _(orderSetOrdersAndDrugOrders.orderSetOrders).concat(refillableDrugOrders).uniqBy("uuid").value() }, createRecentDrugOrderGroup = function(activeAndScheduledDrugOrders) { var showOnlyActive = treatmentConfig.drugOrderHistoryConfig.showOnlyActive, refillableGroup = { label: $translate.instant("MEDICATION_RECENT_TAB"), selected: !0, drugOrders: sortOrderSetDrugsFollowedByDrugOrders(activeAndScheduledDrugOrders, showOnlyActive) }; $scope.consultation.drugOrderGroups.unshift(refillableGroup), void 0 !== treatmentConfig.drugOrderHistoryConfig.numberOfVisits && null !== treatmentConfig.drugOrderHistoryConfig.numberOfVisits && 0 === treatmentConfig.drugOrderHistoryConfig.numberOfVisits && ($scope.consultation.drugOrderGroups = [$scope.consultation.drugOrderGroups[0]]) }, createPrescribedDrugOrderGroups = function() { if (0 === prescribedDrugOrders.length) return []; var drugOrderGroupedByDate = _.groupBy(prescribedDrugOrders, function(drugOrder) { return DateUtil.parse(drugOrder.visit.startDateTime) }), createDrugOrder = function(drugOrder) { return DrugOrderViewModel.createFromContract(drugOrder, treatmentConfig) }, drugOrderGroups = _.map(drugOrderGroupedByDate, function(drugOrders, visitStartDate) { return { label: $filter("bahmniDate")(visitStartDate), visitStartDate: DateUtil.parse(visitStartDate), drugOrders: drugOrders.map(createDrugOrder), isCurrentVisit: currentVisit && DateUtil.isSameDateTime(visitStartDate, currentVisit.startDatetime) } }); $scope.consultation.drugOrderGroups = $scope.consultation.drugOrderGroups.concat(drugOrderGroups), $scope.consultation.drugOrderGroups = _.sortBy($scope.consultation.drugOrderGroups, "visitStartDate").reverse() }; $scope.stoppedOrderReasons = treatmentConfig.stoppedOrderReasonConcepts; var init = function() { var numberOfVisits = treatmentConfig.drugOrderHistoryConfig.numberOfVisits ? treatmentConfig.drugOrderHistoryConfig.numberOfVisits : 3; spinner.forPromise(treatmentService.getPrescribedDrugOrders($stateParams.patientUuid, !0, numberOfVisits, $stateParams.dateEnrolled, $stateParams.dateCompleted).then(function(data) { prescribedDrugOrders = data, createPrescriptionGroups($scope.consultation.activeAndScheduledDrugOrders) })) }; $scope.getOrderReasonConcept = function(drugOrder) { if (drugOrder.orderReasonConcept) return drugOrder.orderReasonConcept.display || drugOrder.orderReasonConcept.name }, $scope.toggleShowAdditionalInstructions = function(line) { line.showAdditionalInstructions = !line.showAdditionalInstructions }, $scope.drugOrderGroupsEmpty = function() { return _.isEmpty($scope.consultation.drugOrderGroups) }, $scope.isDrugOrderGroupEmpty = function(drugOrders) { return _.isEmpty(drugOrders) }, $scope.showEffectiveFromDate = function(visitStartDate, effectiveStartDate) { return $filter("bahmniDate")(effectiveStartDate) !== $filter("bahmniDate")(visitStartDate) }, $scope.refill = function(drugOrder) { $rootScope.$broadcast("event:refillDrugOrder", drugOrder) }, $scope.refillAll = function(drugOrders) { $rootScope.$broadcast("event:refillDrugOrders", drugOrders) }, $scope.revise = function(drugOrder, drugOrders) { $scope.consultation.drugOrdersWithUpdatedOrderAttributes[drugOrder.uuid] && (delete $scope.consultation.drugOrdersWithUpdatedOrderAttributes[drugOrder.uuid], $scope.toggleDrugOrderAttribute(drugOrder.orderAttributes[0])), drugOrder.isEditAllowed && $rootScope.$broadcast("event:reviseDrugOrder", drugOrder, drugOrders) }, $scope.updateFormConditions = function(drugOrder) { var formCondition = Bahmni.ConceptSet.FormConditions.rules ? Bahmni.ConceptSet.FormConditions.rules["Medication Stop Reason"] : void 0; formCondition ? drugOrder.orderReasonConcept ? formCondition(drugOrder, drugOrder.orderReasonConcept.name.name) || disableAndClearReasonText(drugOrder) : disableAndClearReasonText(drugOrder) : drugOrder.orderReasonNotesEnabled = !0 }; var disableAndClearReasonText = function(drugOrder) { drugOrder.orderReasonText = null, drugOrder.orderReasonNotesEnabled = !1 }; $scope.discontinue = function(drugOrder) { drugOrder.isDiscontinuedAllowed && ($rootScope.$broadcast("event:discontinueDrugOrder", drugOrder), $scope.updateFormConditions(drugOrder)) }, $scope.undoDiscontinue = function(drugOrder) { $rootScope.$broadcast("event:undoDiscontinueDrugOrder", drugOrder) }, $scope.shouldBeDisabled = function(drugOrder, orderAttribute) { return !!drugOrder.isBeingEdited || (!drugOrder.isActive() || orderAttribute.obsUuid) }, $scope.updateOrderAttribute = function(drugOrder, orderAttribute, valueToSet) { $scope.shouldBeDisabled(drugOrder, orderAttribute) || ($scope.toggleDrugOrderAttribute(orderAttribute, valueToSet), $scope.consultation.drugOrdersWithUpdatedOrderAttributes[drugOrder.uuid] = drugOrder) }, $scope.toggleDrugOrderAttribute = function(orderAttribute, valueToSet) { orderAttribute.value = void 0 !== valueToSet ? valueToSet : !orderAttribute.value }, $scope.getOrderAttributes = function() { return treatmentConfig.orderAttributes }, $scope.updateAllOrderAttributesByName = function(orderAttribute, drugOrderGroup) { drugOrderGroup[orderAttribute.name] = drugOrderGroup[orderAttribute.name] || {}, drugOrderGroup[orderAttribute.name].selected = !drugOrderGroup[orderAttribute.name].selected, drugOrderGroup.drugOrders.forEach(function(drugOrder) { var selectedOrderAttribute = getAttribute(drugOrder, orderAttribute.name); $scope.updateOrderAttribute(drugOrder, selectedOrderAttribute, drugOrderGroup[orderAttribute.name].selected) }) }, $scope.allOrderAttributesOfNameSet = function(drugOrderGroup, orderAttributeName) { var allAttributesSelected = !0; drugOrderGroup.drugOrders.forEach(function(drugOrder) { var orderAttributeOfName = getAttribute(drugOrder, orderAttributeName); $scope.shouldBeDisabled(drugOrder, orderAttributeOfName) || orderAttributeOfName.value || (allAttributesSelected = !1) }), drugOrderGroup[orderAttributeName] = drugOrderGroup[orderAttributeName] || {}, drugOrderGroup[orderAttributeName].selected = allAttributesSelected }, $scope.canUpdateAtLeastOneOrderAttributeOfName = function(drugOrderGroup, orderAttributeName) { var canBeUpdated = !1; return drugOrderGroup.drugOrders.forEach(function(drugOrder) { var orderAttributeOfName = getAttribute(drugOrder, orderAttributeName); $scope.shouldBeDisabled(drugOrder, orderAttributeOfName) || (canBeUpdated = !0) }), canBeUpdated }, $scope.getMinDateForDiscontinue = function(drugOrder) { var minDate = DateUtil.today(); return DateUtil.isBeforeDate(drugOrder.effectiveStartDate, minDate) && (minDate = drugOrder.effectiveStartDate), DateUtil.getDateWithoutTime(minDate) }; var getAttribute = function(drugOrder, attributeName) { return _.find(drugOrder.orderAttributes, { name: attributeName }) }; init() }]), angular.module("bahmni.clinical").controller("CustomDrugOrderHistoryController", ["$scope", "treatmentConfig", function($scope, treatmentConfig) { var drugOrderHistoryConfig = treatmentConfig.drugOrderHistoryConfig || {}; $scope.treatmentConfig = treatmentConfig, $scope.drugOrderHistorySections = _.values(drugOrderHistoryConfig.sections) }]), angular.module("bahmni.clinical").controller("LatestPrescriptionPrintController", ["$scope", "visitActionsService", "messagingService", function($scope, visitActionsService, messagingService) { var print = function(visitStartDate, visitUuid) { visitActionsService.printPrescription($scope.patient, visitStartDate, visitUuid), messagingService.showMessage("info", "Please close this tab.") }; $scope.visitHistory.activeVisit ? print($scope.visitHistory.activeVisit.startDatetime, $scope.visitHistory.activeVisit.uuid) : messagingService.showMessage("error", "No Active visit found for this patient.") }]), angular.module("bahmni.clinical").controller("BacteriologyController", ["$scope", "$rootScope", "contextChangeHandler", "spinner", "conceptSetService", "messagingService", "bacteriologyConceptSet", "appService", "retrospectiveEntryService", function($scope, $rootScope, contextChangeHandler, spinner, conceptSetService, messagingService, bacteriologyConceptSet, appService, retrospectiveEntryService) { $scope.consultation.extensions = $scope.consultation.extensions ? $scope.consultation.extensions : { mdrtbSpecimen: [] }; var initializeBacteriologyScope = function() { $scope.savedSpecimens = $scope.consultation.savedSpecimens || $scope.consultation.extensions.mdrtbSpecimen, $scope.newSpecimens = $scope.consultation.newlyAddedSpecimens || [], $scope.deletedSpecimens = $scope.consultation.deletedSpecimens || [] }; initializeBacteriologyScope(), $scope.today = Bahmni.Common.Util.DateUtil.getDateWithoutTime(Bahmni.Common.Util.DateUtil.now()), $scope.isRetrospectiveMode = function() { return !_.isEmpty(retrospectiveEntryService.getRetrospectiveEntry()) }; var init = function() { appService.getAppDescriptor().getConfigValue("showSaveConfirmDialog") && $scope.$broadcast("event:pageUnload"); var additionalAttributes = _.find(bacteriologyConceptSet.setMembers, function(member) { return "Bacteriology Attributes" === member.conceptClass.name }); $scope.additionalAttributesConceptName = additionalAttributes && additionalAttributes.name.name; var results = _.find(bacteriologyConceptSet.setMembers, function(member) { return "Bacteriology Results" === member.conceptClass.name }); $scope.resultsConceptName = results && results.name.name; var sampleSource = _.find(bacteriologyConceptSet.setMembers, function(member) { return "Specimen Sample Source" === member.name.name }); $scope.allSamples = void 0 !== sampleSource && _.map(sampleSource.answers, function(answer) { return (new Bahmni.Common.Domain.ConceptMapper).map(answer) }), $scope.savedSpecimens && ($scope.savedSpecimens = _.sortBy($scope.savedSpecimens, "dateCollected").reverse()), 0 === $scope.newSpecimens.length && $scope.createNewSpecimen(), handleSampleTypeOther() }; $scope.createNewSpecimen = function() { var newSpecimen = new Bahmni.Clinical.Specimen(null, $scope.allSamples); $scope.newSpecimens.push(newSpecimen) }; var contextChange = function() { $scope.consultation.newlyAddedSpecimens = $scope.newSpecimens, $scope.consultation.deletedSpecimens = $scope.deletedSpecimens, $scope.consultation.savedSpecimens = $scope.savedSpecimens; var dirtySpecimens = _.filter($scope.newSpecimens, function(specimen) { return specimen.isDirty() }); return _.each(dirtySpecimens, function(dirtySpecimen) { dirtySpecimen.hasIllegalDateCollected = !dirtySpecimen.dateCollected, dirtySpecimen.hasIllegalType = !dirtySpecimen.type, dirtySpecimen.hasIllegalTypeFreeText = !dirtySpecimen.typeFreeText }), { allow: void 0 === dirtySpecimens[0] } }, saveSpecimens = function() { var savableSpecimens = _.filter($scope.newSpecimens, function(specimen) { return !specimen.isEmpty() || specimen.voidIfEmpty() }); savableSpecimens = savableSpecimens.concat($scope.deletedSpecimens); var specimenMapper = new Bahmni.Clinical.SpecimenMapper, specimens = []; _.each(savableSpecimens, function(specimen) { specimens.push(specimenMapper.mapSpecimenToObservation(specimen)) }), $scope.consultation.newlyAddedSpecimens = specimens, $scope.consultation.extensions.mdrtbSpecimen || ($scope.consultation.extensions.mdrtbSpecimen = []) }; $scope.editSpecimen = function(specimen) { $scope.savedSpecimens = _.without($scope.savedSpecimens, specimen), $scope.newSpecimens.push(new Bahmni.Clinical.Specimen(specimen, $scope.allSamples)), handleSampleTypeOther() }, $scope.handleUpdate = function() { handleSampleTypeOther() }, $scope.deleteSpecimen = function(specimen) { specimen.isExistingSpecimen() && (specimen.setMandatoryFieldsBeforeSavingVoidedSpecimen(), $scope.deletedSpecimens.push(specimen)), $scope.savedSpecimens = _.without($scope.savedSpecimens, specimen), $scope.newSpecimens = _.without($scope.newSpecimens, specimen), 0 === $scope.newSpecimens.length && $scope.createNewSpecimen() }, $scope.getDisplayName = function(specimen) { var type = specimen.type, displayName = type && (type.shortName ? type.shortName : type.name); return displayName === Bahmni.Clinical.Constants.bacteriologyConstants.otherSampleType && (displayName = specimen.typeFreeText), displayName }, $scope.consultation.preSaveHandler.register("bacteriologySaveHandlerKey", saveSpecimens), $scope.consultation.postSaveHandler.register("bacteriologyPostSaveHandlerKey", initializeBacteriologyScope); var handleSampleTypeOther = function() { for (var specimen in $scope.newSpecimens) $scope.newSpecimens[specimen].type && $scope.newSpecimens[specimen].type.name === Bahmni.Clinical.Constants.bacteriologyConstants.otherSampleType ? ($scope.newSpecimens[specimen].showTypeFreeText = !0, $scope.freeText && ($scope.newSpecimens[specimen].typeFreeText = $scope.freeText)) : ($scope.newSpecimens[specimen].showTypeFreeText = !1, $scope.newSpecimens[specimen].type && ($scope.freeText = $scope.newSpecimens[specimen].typeFreeText, $scope.newSpecimens[specimen].typeFreeText = null)) }; contextChangeHandler.add(contextChange), init() }]), Bahmni.Clinical.TabularLabOrderResults = function() { var TabularLabOrderResults = function(tabularResult, accessionConfig) { var self = this; this.tabularResult = tabularResult; var filterData = function(list, filteredOn) { var indices = _.uniq(_.map(self.tabularResult.values, filteredOn)); return _.filter(list, function(element) { return _.includes(indices, element.index) }) }, init = function() { if (accessionConfig && (accessionConfig.initialAccessionCount || accessionConfig.latestAccessionCount)) { var tabularValues = _.groupBy(self.tabularResult.values, function(value) { return new Date(value.accessionDateTime) }); tabularValues = _.sortBy(tabularValues, function(value) { return value[0].accessionDateTime }); var initial = _.first(tabularValues, accessionConfig.initialAccessionCount || 0), latest = _.last(tabularValues, accessionConfig.latestAccessionCount || 0); self.tabularResult.values = _.flatten(_.union(initial, latest)), self.tabularResult.dates = filterData(self.tabularResult.dates, "dateIndex"), self.tabularResult.orders = filterData(self.tabularResult.orders, "testOrderIndex") } }; init(), this.getDateLabels = function() { return this.tabularResult.dates.map(function(date) { return moment(date.date, "DD-MMM-YYYY", !0).isValid() && (date.date = moment(date.date, "DD-MMM-YYYY").toDate()), date }) }, this.getTestOrderLabels = function() { return this.tabularResult.orders }, this.hasRange = function(testOrderLabel) { return testOrderLabel.minNormal && testOrderLabel.maxNormal }, this.hasUnits = function(testOrderLabel) { return void 0 != testOrderLabel.testUnitOfMeasurement && null != testOrderLabel.testUnitOfMeasurement }, this.hasOrders = function() { return this.tabularResult.orders.length > 0 }, this.getResult = function(dateLabel, testOrderLabel) { var filteredResultValue = this.tabularResult.values.filter(function(value) { return value.dateIndex === dateLabel.index && value.testOrderIndex === testOrderLabel.index }); return 0 === filteredResultValue.length && (filteredResultValue = [{ result: " " }]), filteredResultValue }, this.hasUploadedFiles = function(dateLabel, testOrderLabel) { return this.getResult(dateLabel, testOrderLabel).some(function(res) { return res.uploadedFileName }) } }; return TabularLabOrderResults }(), angular.module("bahmni.clinical").directive("investigationTableRow", function() { var controller = function($scope) { var urlFrom = function(fileName) { return Bahmni.Common.Constants.labResultUploadedFileNameUrl + fileName }, defaultParams = { showDetailsButton: !0 }; $scope.params = angular.extend(defaultParams, $scope.params), $scope.hasNotes = function() { return !(!$scope.test.notes && !$scope.test.showNotes) }, $scope.showTestNotes = function() { return $scope.hasNotes($scope.test) }, $scope.test.showNotes = $scope.hasNotes(), $scope.test.showDetailsButton = $scope.params.showDetailsButton, $scope.test.labReportUrl = $scope.test.uploadedFileName ? urlFrom($scope.test.uploadedFileName) : null, $scope.toggle = function() { $scope.test.showDetails = !$scope.test.showDetails }, $scope.isValidResultToShow = function(result) { return void 0 != result && null != result && "undefined" != result.toLowerCase(result) && "null" != result.toLowerCase(result) } }; return { restrict: "A", controller: controller, scope: { test: "=", params: "=" }, templateUrl: "displaycontrols/investigationresults/views/investigationTableRow.html" } }), angular.module("bahmni.clinical").directive("investigationTable", function() { var controller = function($scope) { var defaultParams = { noLabOrdersMessage: "NO_LAB_ORDERS_FOR_PATIENT_MESSAGE_KEY", showNormalLabResults: !0, showAccessionNotes: !0, title: "Lab Investigations", translationKey: "LAB_INVESTIGATIONS_KEY" }, hasAbnormalTests = function(labOrderResult) { if (labOrderResult.isPanel) { var hasAbnormal = !1; return labOrderResult.tests.forEach(function(test) { test.abnormal && (hasAbnormal = !0) }), hasAbnormal } return labOrderResult.abnormal }; $scope.params = angular.extend(defaultParams, $scope.params), $scope.hasLabOrders = function() { return !!($scope.accessions && $scope.accessions.length > 0) || $scope.$emit("no-data-present-event") && !1 }, $scope.shouldShowResults = function(labOrderResult) { return $scope.params.showNormalLabResults || hasAbnormalTests(labOrderResult) }, $scope.toggle = function(item) { event.stopPropagation(), item.show = !item.show }, $scope.getAccessionDetailsFrom = function(labOrderResults) { var labResultLine = labOrderResults[0].isPanel ? labOrderResults[0].tests[0] : labOrderResults[0]; return { accessionUuid: labResultLine.accessionUuid, accessionDateTime: labResultLine.accessionDateTime, accessionNotes: labResultLine.accessionNotes } }, $scope.toggleAccession = function(labOrderResults) { labOrderResults.isOpen = !labOrderResults.isOpen }, $scope.showAccessionNotes = function(labOrderResults) { return $scope.getAccessionDetailsFrom(labOrderResults).accessionNotes && $scope.params.showAccessionNotes }, $scope.$watch("accessions", function() { $scope.accessions && $scope.accessions[0] && ($scope.accessions[0].isOpen = !0) }) }; return { restrict: "E", controller: controller, scope: { accessions: "=", params: "=" }, templateUrl: "displaycontrols/investigationresults/views/investigationTable.html" } }), angular.module("bahmni.clinical").directive("investigationChart", function() { var controller = function($scope) { var defaultParams = { noLabOrdersMessage: "No Lab Orders for this patient." }; $scope.params = angular.extend(defaultParams, $scope.params), $scope.showChart = !1, $scope.toggleChart = function() { $scope.showChart = !$scope.showChart }, $scope.getUploadedFileUrl = function(uploadedFileName) { return Bahmni.Common.Constants.labResultUploadedFileNameUrl + uploadedFileName } }; return { restrict: "E", controller: controller, scope: { accessions: "=", params: "=" }, templateUrl: "displaycontrols/investigationresults/views/investigationChart.html" } }), angular.module("bahmni.clinical").directive("investigationResults", ["labOrderResultService", "spinner", function(labOrderResultService, spinner) { var controller = function($scope) { var defaultParams = { showTable: !0, showChart: !0, numberOfVisits: 1 }; $scope.params = angular.extend(defaultParams, $scope.params); var params = { patientUuid: $scope.params.patientUuid, numberOfVisits: $scope.params.numberOfVisits, visitUuids: $scope.params.visitUuids, initialAccessionCount: $scope.params.initialAccessionCount, latestAccessionCount: $scope.params.latestAccessionCount }; $scope.initialization = labOrderResultService.getAllForPatient(params).then(function(results) { $scope.investigationResults = results }) }, link = function($scope, element) { spinner.forPromise($scope.initialization, element) }; return { restrict: "E", controller: controller, link: link, templateUrl: "displaycontrols/investigationresults/views/investigationResults.html", scope: { params: "=" } } }]), angular.module("bahmni.clinical").directive("treatmentData", ["treatmentService", "appService", "spinner", "$stateParams", "$q", "treatmentConfig", function(treatmentService, appService, spinner, $stateParams, $q, treatmentConfig) { var controller = function($scope) { var Constants = Bahmni.Clinical.Constants, defaultParams = { showListView: !0, showRoute: !1, showDrugForm: !1, numberOfVisits: 1 }; $scope.params = angular.extend(defaultParams, $scope.params); var init = function() { var getToDate = function() { return $scope.visitSummary.stopDateTime || Bahmni.Common.Util.DateUtil.now() }, programConfig = appService.getAppDescriptor().getConfigValue("program") || {}, startDate = null, endDate = null, getEffectiveOrdersOnly = !1; return programConfig.showDetailsWithinDateRange && (startDate = $stateParams.dateEnrolled, endDate = $stateParams.dateCompleted, (startDate || endDate) && ($scope.params.showOtherActive = !1), getEffectiveOrdersOnly = !0), $q.all([treatmentConfig(), treatmentService.getPrescribedAndActiveDrugOrders($scope.params.patientUuid, $scope.params.numberOfVisits, $scope.params.showOtherActive, $scope.params.visitUuids || [], startDate, endDate, getEffectiveOrdersOnly)]).then(function(results) { var config = results[0], drugOrderResponse = results[1].data, createDrugOrderViewModel = function(drugOrder) { return Bahmni.Clinical.DrugOrderViewModel.createFromContract(drugOrder, config) }; for (var key in drugOrderResponse) drugOrderResponse[key] = drugOrderResponse[key].map(createDrugOrderViewModel); var groupedByVisit = _.groupBy(drugOrderResponse.visitDrugOrders, function(drugOrder) { return drugOrder.visit.startDateTime }), treatmentSections = []; for (var key in groupedByVisit) { var values = Bahmni.Clinical.DrugOrder.Util.mergeContinuousTreatments(groupedByVisit[key]); treatmentSections.push({ visitDate: key, drugOrders: values }) } if (!_.isEmpty(drugOrderResponse[Constants.otherActiveDrugOrders])) { var mergedOtherActiveDrugOrders = Bahmni.Clinical.DrugOrder.Util.mergeContinuousTreatments(drugOrderResponse[Constants.otherActiveDrugOrders]); treatmentSections.push({ visitDate: Constants.otherActiveDrugOrders, drugOrders: mergedOtherActiveDrugOrders }) } $scope.treatmentSections = treatmentSections, $scope.visitSummary && ($scope.ipdDrugOrders = Bahmni.Clinical.VisitDrugOrder.createFromDrugOrders(drugOrderResponse.visitDrugOrders, $scope.visitSummary.startDateTime, getToDate())) }) }; $scope.initialization = init() }, link = function($scope, element) { spinner.forPromise($scope.initialization, element) }; return { restrict: "E", controller: controller, link: link, scope: { params: "=", visitSummary: "=?" }, templateUrl: "displaycontrols/treatmentData/views/treatmentData.html" } }]), angular.module("bahmni.clinical").directive("treatmentTable", function() { var controller = function($scope) { $scope.isOtherActiveSection = function(dateString) { return dateString === Bahmni.Clinical.Constants.otherActiveDrugOrders }, $scope.isDataPresent = function() { return !$scope.drugOrderSections || 0 != $scope.drugOrderSections.length || $scope.$emit("no-data-present-event") && !1 } }; return { templateUrl: "displaycontrols/treatmentData/views/treatmentTable.html", scope: { drugOrderSections: "=", params: "=" }, controller: controller } }), angular.module("bahmni.clinical").directive("treatmentChart", function() { var controller = function($scope) { $scope.atLeastOneDrugForDay = function(day) { var atLeastOneDrugForDay = !1; return $scope.ipdDrugOrders.getIPDDrugs().forEach(function(drug) { drug.isActiveOnDate(day.date) && (atLeastOneDrugForDay = !0) }), atLeastOneDrugForDay }, $scope.getVisitStopDateTime = function() { return $scope.visitSummary.stopDateTime || Bahmni.Common.Util.DateUtil.now() } }; return { templateUrl: "displaycontrols/treatmentData/views/treatmentChart.html", scope: { ipdDrugOrders: "=", visitSummary: "=", params: "=" }, controller: controller } }), angular.module("bahmni.clinical").directive("treatmentTableRow", function() { var controller = function($scope) { $scope.showDetails = !1, void 0 === $scope.params.showProvider && ($scope.params.showProvider = !0), $scope.toggle = function() { $scope.showDetails = !$scope.showDetails } }; return { restrict: "A", controller: controller, scope: { drugOrder: "=", params: "=" }, templateUrl: "displaycontrols/treatmentData/views/treatmentTableRow.html" } }), Bahmni.Clinical.DrugOrder.Util = { mergeContinuousTreatments: function(continuousDrugOrders) { var sortedDrugOrders = _.sortBy(continuousDrugOrders, "effectiveStartDate"), drugOrders = []; return sortedDrugOrders.forEach(function(drugOrder) { drugOrder.span = {}; var areValuesEqual = function(value1, value2) { return "boolean" == typeof value1 && "boolean" == typeof value2 ? value1 === value2 : value1 === value2 || _.isEmpty(value1) && _.isEmpty(value2) }, foundDrugOrder = _.find(drugOrders, function(existingOrder) { return areValuesEqual(existingOrder.drugNonCoded, drugOrder.drugNonCoded) && existingOrder.drug && drugOrder.drug && areValuesEqual(existingOrder.drug.uuid, drugOrder.drug.uuid) && areValuesEqual(existingOrder.instructions, drugOrder.instructions) && areValuesEqual(existingOrder.getDoseInformation(), drugOrder.getDoseInformation()) && areValuesEqual(existingOrder.route, drugOrder.route) && areValuesEqual(existingOrder.additionalInstructions, drugOrder.additionalInstructions) && areValuesEqual(existingOrder.asNeeded, drugOrder.asNeeded) && areValuesEqual(existingOrder.isDiscontinuedOrStopped(), drugOrder.isDiscontinuedOrStopped()) && Bahmni.Common.Util.DateUtil.diffInDaysRegardlessOfTime(new Date(existingOrder.lastStopDate), new Date(drugOrder.scheduledDate)) <= 1 }); foundDrugOrder ? (foundDrugOrder.span.hasOwnProperty(drugOrder.durationUnit) ? foundDrugOrder.span[drugOrder.durationUnit] += drugOrder.duration : foundDrugOrder.span[drugOrder.durationUnit] = drugOrder.duration, foundDrugOrder.lastStopDate = drugOrder.effectiveStopDate) : (drugOrder.span[drugOrder.durationUnit] = drugOrder.duration, drugOrder.lastStopDate = drugOrder.effectiveStopDate, drugOrders.push(drugOrder)) }), drugOrders }, sortDrugOrders: function(activeAndScheduledDrugOrders) { var descendingOrderFactor = -1; return Bahmni.Clinical.DrugOrder.Util.sortOrders(activeAndScheduledDrugOrders, descendingOrderFactor) }, sortDrugOrdersInChronologicalOrder: function(activeAndScheduledDrugOrders) { var ascendingOrderFactor = 1; return Bahmni.Clinical.DrugOrder.Util.sortOrders(activeAndScheduledDrugOrders, ascendingOrderFactor) }, sortOrders: function(drugOrders, sortOrderFactor) { if (_.isEmpty(drugOrders)) return []; var DateUtil = Bahmni.Common.Util.DateUtil; return drugOrders.sort(function(drug1, drug2) { var timeDifference = DateUtil.diffInSeconds(drug1.effectiveStartDate, drug2.effectiveStartDate); return DateUtil.isSameDate(drug1.effectiveStartDate, drug2.effectiveStartDate) ? 0 === timeDifference ? drug1.orderNumber - drug2.orderNumber : timeDifference : timeDifference * sortOrderFactor }) } }, angular.module("bahmni.clinical").directive("visitsTable", ["patientVisitHistoryService", "conceptSetService", "spinner", "$state", "$q", function(patientVisitHistoryService, conceptSetService, spinner, $state, $q) { var controller = function($scope) { var emitNoDataPresentEvent = function() { $scope.$emit("no-data-present-event") }; $scope.openVisit = function(visit) { $scope.$parent.closeThisDialog && $scope.$parent.closeThisDialog("closing modal"), $state.go("patient.dashboard.visit", { visitUuid: visit.uuid }) }, $scope.hasVisits = function() { return $scope.visits && $scope.visits.length > 0 }, $scope.params = angular.extend({ maximumNoOfVisits: 4, title: "Visits" }, $scope.params), $scope.noVisitsMessage = "No Visits for this patient.", $scope.toggle = function(visit) { visit.isOpen = !visit.isOpen, visit.cacheOpenedHtml = !0 }, $scope.filteredObservations = function(observation, observationTemplates) { var observationTemplateArray = []; for (var observationTemplateIndex in observationTemplates) observationTemplateArray.push(observationTemplates[observationTemplateIndex].display); var obsArrayFiltered = []; for (var ob in observation) _.includes(observationTemplateArray, observation[ob].concept.display) && obsArrayFiltered.push(observation[ob]); return obsArrayFiltered }, $scope.editConsultation = function(encounter) { showNotApplicablePopup(), $scope.$parent.closeThisDialog && $scope.$parent.closeThisDialog("closing modal"), $state.go("patient.dashboard.show.observations", { conceptSetGroupName: "observations", encounterUuid: encounter.uuid }) }, $scope.getDisplayName = function(data) { var concept = data.concept, displayName = data.concept.displayString; return concept.names && 1 === concept.names.length && "" !== concept.names[0].name ? displayName = concept.names[0].name : concept.names && 2 === concept.names.length && (displayName = _.find(concept.names, { conceptNameType: "SHORT" }).name), displayName }, $scope.getProviderDisplayName = function(encounter) { return encounter.encounterProviders.length > 0 ? encounter.encounterProviders[0].provider.display : null }; var getVisits = function() { return patientVisitHistoryService.getVisitHistory($scope.patientUuid) }, init = function() { return $q.all([getVisits()]).then(function(results) { $scope.visits = results[0].visits, $scope.patient = { uuid: $scope.patientUuid }, $scope.hasVisits() || emitNoDataPresentEvent() }) }; $scope.initialization = init(), $scope.params = angular.extend({ maximumNoOfVisits: 4, title: "Visits" }, $scope.params), $scope.noVisitsMessage = "No Visits for this patient." }, link = function($scope, element) { spinner.forPromise($scope.initialization, element) }; return { restrict: "E", link: link, controller: controller, templateUrl: "displaycontrols/allvisits/views/visitsTable.html", scope: { params: "=", patientUuid: "=" } } }]), angular.module("bahmni.clinical").directive("observationData", [function() { var controller = function($scope) { $scope.hasGroupMembers = function() { return $scope.observation.groupMembers && $scope.observation.groupMembers.length > 0 }, $scope.getDisplayValue = function() { return $scope.observation.value ? $scope.observation.value.display || $scope.observation.value : null } }; return { restrict: "E", template: "", scope: { observation: "=" }, controller: controller } }]), angular.module("bahmni.clinical").directive("observationGraph", ["appService", "observationsService", "patientService", "conceptSetService", "$q", "spinner", "$translate", function(appService, observationsService, patientService, conceptSetService, $q, spinner, $translate) { var generateGraph = function($scope, element, config, observationGraphModel) { var bindToElement = document.getElementById($scope.graphId), graphWidth = $(element).parent().width(), chart = Bahmni.Graph.c3Chart.create(); chart.render(bindToElement, graphWidth, config, observationGraphModel) }, link = function($scope, element) { if ($scope.graphId = "graph" + $scope.$id, $scope.params) { var config = new Bahmni.Clinical.ObservationGraphConfig($scope.params.config); config.validate($scope.params.title); var promises = [], numberOfLevels = 1, fields = ["uuid", "name", "names", "hiNormal", "lowNormal", "units", "datatype"], customRepresentation = Bahmni.ConceptSet.CustomRepresentationBuilder.build(fields, "setMembers", numberOfLevels), conceptValue = conceptSetService.getConcept({ name: config.getAllConcepts(), v: "custom:" + customRepresentation }); promises.push(conceptValue); var observationsPromise = observationsService.fetch($scope.patientUuid, config.getAllConcepts(), null, config.numberOfVisits, $scope.visitUuid, null, !1); promises.push(observationsPromise), config.displayForAge() && promises.push(patientService.getPatient($scope.patientUuid)), config.shouldDrawReferenceLines() && promises.push(appService.loadCsvFileFromConfig(config.getReferenceDataFileName())); var checkWhetherYAxisIsNumericDataType = function(yAxisConceptDetails) { if ("Numeric" !== yAxisConceptDetails.datatype.name) { var errorMsg = $translate.instant(Bahmni.Clinical.Constants.errorMessages.conceptNotNumeric).replace(":conceptName", yAxisConceptDetails.name.name).replace(":placeErrorAccurred", $scope.params.title + " config in growthChartReference.csv"); throw new Error(errorMsg) } }; spinner.forPromise($q.all(promises).then(function(results) { var referenceLines, yAxisConceptDetails = results[0].data && results[0].data.results && results[0].data.results[0], observations = results[1].data, patient = results[2] && results[2].data.person; if (config.shouldDrawReferenceLines()) { checkWhetherYAxisIsNumericDataType(yAxisConceptDetails); var referenceData = results[3].data, ageInMonths = Bahmni.Common.Util.AgeUtil.differenceInMonths(patient.birthdate), yAxisUnit = yAxisConceptDetails.units, observationGraphReferenceModel = new Bahmni.Clinical.ObservationGraphReference(referenceData, config, patient.gender, ageInMonths, yAxisUnit); observationGraphReferenceModel.validate(), referenceLines = observationGraphReferenceModel.createObservationGraphReferenceLines() } if (0 === observations.length) return void $scope.$emit("no-data-present-event"); void 0 !== yAxisConceptDetails && (config.lowNormal = yAxisConceptDetails.lowNormal, config.hiNormal = yAxisConceptDetails.hiNormal); var model = Bahmni.Clinical.ObservationGraph.create(observations, patient, config, referenceLines); generateGraph($scope, element, config, model) }), element) } }; return { restrict: "E", templateUrl: "displaycontrols/graph/views/observationGraph.html", scope: { params: "=", visitUuid: "=", patientUuid: "=" }, link: link } }]), function() { Bahmni = Bahmni || {}, Bahmni.Clinical = Bahmni.Clinical || {}, Bahmni.Clinical.ObservationGraph = function(model) { angular.extend(this, model) }; var fixCaseMismatchIssues = function(config, observations) { var conceptNamesFromConfig = config.yAxisConcepts.slice(0); conceptNamesFromConfig.push(config.xAxisConcept), _.each(observations, function(obs) { obs.concept.name = _.find(conceptNamesFromConfig, function(configConceptName) { return configConceptName.toLowerCase() === obs.concept.name.toLowerCase() }) }) }, createObservationPoint = function(config, obs, xAxisValues) { var observation = {}; return observation[config.xAxisConcept] = xAxisValues, observation[obs.concept.name] = obs.value, observation }, findMatchingLine = function(lines, obs) { return _(lines).find(function(line) { return line.name === obs.concept.name }) }; Bahmni.Clinical.ObservationGraph.create = function(allObservations, person, config, referenceLines) { fixCaseMismatchIssues(config, allObservations); var yAxisObservations = _.filter(allObservations, function(obs) { return obs.concept.name !== config.xAxisConcept }), xAxisObservations = _.filter(allObservations, function(obs) { return obs.concept.name === config.xAxisConcept }), lines = _(yAxisObservations).uniqBy(function(item) { return item.concept.name + item.concept.units }).map(function(item) { return new Bahmni.Clinical.ObservationGraphLine({ name: item.concept.name, units: item.concept.units, values: [] }) }).value(); if (_.forEach(yAxisObservations, function(yAxisObs) { var xValue; if (config.displayForObservationDateTime()) config.type = "timeseries", xValue = Bahmni.Common.Util.DateUtil.parseDatetime(yAxisObs.observationDateTime).toDate(); else if (config.displayForAge()) xValue = Bahmni.Common.Util.AgeUtil.differenceInMonths(person.birthdate, yAxisObs.observationDateTime); else { config.type = "indexed"; var matchingObservation = _.find(xAxisObservations, function(xObs) { return yAxisObs.observationDateTime === xObs.observationDateTime }); xValue = matchingObservation ? matchingObservation.value : void 0 } if (void 0 !== xValue) { var line = findMatchingLine(lines, yAxisObs), observationPoint = createObservationPoint(config, yAxisObs, xValue); line.addPoint(observationPoint) } }), void 0 !== referenceLines) { lines = lines.concat(referenceLines); var referenceLinesYAxisConcepts = _.map(referenceLines, "name"); config.yAxisConcepts = config.yAxisConcepts.concat(referenceLinesYAxisConcepts) } return new Bahmni.Clinical.ObservationGraph(lines) } }(), function() { Bahmni = Bahmni || {}, Bahmni.Clinical = Bahmni.Clinical || {}, Bahmni.Clinical.ObservationGraphLine = function(proto) { angular.extend(this, proto) }, Bahmni.Clinical.ObservationGraphLine.prototype.addPoint = function(point) { point[this.name] && this.values.push(point) } }(), function() { Bahmni = Bahmni || {}, Bahmni.Clinical = Bahmni.Clinical || {}, Bahmni.Clinical.ObservationGraphReference = function(csvString, config, gender, ageInMonths, yAxisUnit) { var that = this, monthBuffer = 1; this.config = config, this.csvString = csvString, this.yAxisUnit = yAxisUnit, this.referenceChartValues = asMatrix(this.csvString), this.header = this.referenceChartValues.shift(), this.ageColumnIndex = _.findIndex(this.header, function(columnName) { return columnName.toLowerCase() === Bahmni.Clinical.Constants.concepts.age.toLowerCase() }), this.genderColumnIndex = _.findIndex(this.header, function(columnName) { return columnName.toLowerCase() === Bahmni.Clinical.Constants.gender.toLowerCase() }); var maxNoOfMonths = ageInMonths + monthBuffer; this.referenceChartValues = _.filter(this.referenceChartValues, function(value) { return value[that.genderColumnIndex] === gender && (void 0 === maxNoOfMonths || value[that.ageColumnIndex] <= maxNoOfMonths) }) }; var asMatrix = function(csvString) { return _.map(csvString.split("\n"), function(line) { return line.split(",") }) }; Bahmni.Clinical.ObservationGraphReference.prototype.createValues = function(columnName) { var that = this; return _.map(this.referenceChartValues, function(rowOfValues) { var point = {}; return point[columnName] = rowOfValues[that.header.indexOf(columnName)], point[Bahmni.Clinical.Constants.concepts.age] = rowOfValues[that.ageColumnIndex], point }) }, Bahmni.Clinical.ObservationGraphReference.prototype.createObservationGraphReferenceLines = function() { var that = this, headersToBeExcluded = function(column, index) { return index === that.genderColumnIndex || index === that.ageColumnIndex }, newObservationGraphLine = function(columnName) { return new Bahmni.Clinical.ObservationGraphLine({ name: columnName, reference: !0, unit: that.yAxisUnit, values: that.createValues(columnName) }) }; return _(this.header).reject(headersToBeExcluded).map(newObservationGraphLine).value() }, Bahmni.Clinical.ObservationGraphReference.prototype.validate = function() { if (this.ageColumnIndex === -1) throw new Error("Age column is not defined in reference lines csv: " + this.config.getReferenceDataFileName()); if (this.genderColumnIndex === -1) throw new Error("Gender column is not defined in reference lines csv: " + this.config.getReferenceDataFileName()) } }(), function() { Bahmni = Bahmni || {}, Bahmni.Clinical = Bahmni.Clinical || {}, Bahmni.Clinical.ObservationGraphConfig = function(config) { angular.extend(this, config), this.shouldDrawReferenceLines() && (this.xAxisConcept = Bahmni.Clinical.Constants.concepts.age) }; var OBSERVATION_DATETIME = "observationdatetime", configPrototype = Bahmni.Clinical.ObservationGraphConfig.prototype; configPrototype.validate = function(title) { if (!this.yAxisConcepts || 0 === this.yAxisConcepts.length) throw new Error("y axis not defined for graph: " + title); if (!this.xAxisConcept && !this.shouldDrawReferenceLines()) throw new Error("x axis not defined for graph: " + title) }, configPrototype.displayForConcept = function() { return !(this.displayForAge() || this.displayForObservationDateTime()) }, configPrototype.displayForAge = function() { return this.xAxisConcept.toLowerCase() === Bahmni.Clinical.Constants.concepts.age.toLowerCase() }, configPrototype.displayForObservationDateTime = function() { return this.xAxisConcept.toLowerCase() === OBSERVATION_DATETIME }, configPrototype.getAllConcepts = function() { var concepts = this.yAxisConcepts.slice(0); return this.displayForConcept() && concepts.push(this.xAxisConcept), concepts }, configPrototype.shouldDrawReferenceLines = function() { return void 0 !== this.referenceData && this.yAxisConcepts && 1 === this.yAxisConcepts.length }, configPrototype.getReferenceDataFileName = function() { return this.referenceData } }(), angular.module("bahmni.clinical").directive("patientContext", ["$state", "$translate", "$sce", "patientService", "spinner", "appService", function($state, $translate, $sce, patientService, spinner, appService) { var controller = function($scope, $rootScope) { var patientContextConfig = appService.getAppDescriptor().getConfigValue("patientContext") || {}; $scope.initPromise = patientService.getPatientContext($scope.patient.uuid, $state.params.enrollment, patientContextConfig.personAttributes, patientContextConfig.programAttributes, patientContextConfig.additionalPatientIdentifiers), $scope.initPromise.then(function(response) { $scope.patientContext = response.data; var programAttributes = $scope.patientContext.programAttributes, personAttributes = $scope.patientContext.personAttributes; convertBooleanValuesToEnglish(personAttributes), convertBooleanValuesToEnglish(programAttributes); var preferredIdentifier = patientContextConfig.preferredIdentifier; preferredIdentifier && (programAttributes[preferredIdentifier] ? ($scope.patientContext.identifier = programAttributes[preferredIdentifier].value, delete programAttributes[preferredIdentifier]) : personAttributes[preferredIdentifier] && ($scope.patientContext.identifier = personAttributes[preferredIdentifier].value, delete personAttributes[preferredIdentifier])), $scope.showNameAndImage = void 0 === $scope.showNameAndImage || $scope.showNameAndImage, $scope.showNameAndImage && ($scope.patientContext.image = Bahmni.Common.Constants.patientImageUrlByPatientUuid + $scope.patientContext.uuid), $scope.patientContext.gender = $rootScope.genderMap[$scope.patientContext.gender] }) }, link = function($scope, element) { spinner.forPromise($scope.initPromise, element) }, convertBooleanValuesToEnglish = function(attributes) { var booleanMap = { "true": "Yes", "false": "No" }; _.forEach(attributes, function(value) { value.value = booleanMap[value.value] ? booleanMap[value.value] : value.value }) }; return { restrict: "E", templateUrl: "displaycontrols/patientContext/views/patientContext.html", scope: { patient: "=", showNameAndImage: "=?" }, controller: controller, link: link } }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.AdmissionDetails = Bahmni.Common.DisplayControl.AdmissionDetails || {}, angular.module("bahmni.common.displaycontrol.admissiondetails", []), angular.module("bahmni.common.displaycontrol.admissiondetails").directive("admissionDetails", ["bedService", function(bedService) { var controller = function($scope) { $scope.showDetailsButton = function(encounter) { return $scope.params && $scope.params.showDetailsButton && !encounter.notes }, $scope.toggle = function(element) { element.show = !element.show }, init($scope) }, isReady = function($scope) { return !_.isUndefined($scope.patientUuid) && !_.isUndefined($scope.visitSummary) }, onReady = function($scope) { var visitUuid = _.get($scope.visitSummary, "uuid"); bedService.getAssignedBedForPatient($scope.patientUuid, visitUuid).then(function(bedDetails) { $scope.bedDetails = bedDetails }) }, init = function($scope) { var stopWatching = $scope.$watchGroup(["patientUuid", "visitSummary"], function() { isReady($scope) && (stopWatching(), onReady($scope)) }); $scope.isDataPresent = function() { return !(!$scope.visitSummary || !$scope.visitSummary.admissionDetails && !$scope.visitSummary.dischargeDetails) || $scope.$emit("no-data-present-event") && !1 } }; return { restrict: "E", controller: controller, templateUrl: "../common/displaycontrols/admissiondetails/views/admissionDetails.html", scope: { params: "=", patientUuid: "=", visitSummary: "=" } } }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.DrugOrderDetails = Bahmni.Common.DisplayControl.DrugOrderDetails || {}, angular.module("bahmni.common.displaycontrol.drugOrderDetails", []), angular.module("bahmni.common.displaycontrol.drugOrderDetails").directive("drugOrderDetails", ["treatmentService", "spinner", "treatmentConfig", "$q", function(treatmentService, spinner, treatmentConfig, $q) { var controller = function($scope) { var init = function() { return $q.all([treatmentService.getAllDrugOrdersFor($scope.patient.uuid, $scope.section.dashboardConfig.drugConceptSet, void 0, void 0, $scope.enrollment), treatmentConfig()]).then(function(results) { var createDrugOrder = function(drugOrder) { var treatmentConfig = results[1]; return Bahmni.Clinical.DrugOrderViewModel.createFromContract(drugOrder, treatmentConfig) }, drugOrderResponse = results[0], drugOrders = drugOrderResponse.map(createDrugOrder); $scope.drugOrders = sortOrders(drugOrders), _.isEmpty($scope.drugOrders) && $scope.$emit("no-data-present-event") }) }; $scope.columnHeaders = ["DRUG_DETAILS_DRUG_NAME", "DRUG_DETAILS_DOSE_INFO", "DRUG_DETAILS_QUANTITY_TEXT", "DRUG_DETAILS_ROUTE", "DRUG_DETAILS_FREQUENCY", "DRUG_DETAILS_START_DATE", "DRUG_DETAILS_INSTRUCTIONS_TEXT", "DRUG_DETAILS_ADDITIONAL_INSTRUCTIONS"], $scope.showDetails = !1, $scope.toggle = function(drugOrder) { drugOrder.showDetails = !drugOrder.showDetails }; var sortOrders = function(response) { var drugOrderUtil = Bahmni.Clinical.DrugOrder.Util, sortedDrugOrders = []; if ($scope.section.dashboardConfig.showOnlyActive) { var activeAndScheduled = _.filter(response, function(order) { return order.isActive() || order.isScheduled() }); sortedDrugOrders.push(drugOrderUtil.sortDrugOrdersInChronologicalOrder(activeAndScheduled)) } else sortedDrugOrders.push(drugOrderUtil.sortDrugOrdersInChronologicalOrder(response)); return _.flatten(sortedDrugOrders) }; $scope.initialization = init() }, link = function($scope, element) { spinner.forPromise($scope.initialization, element) }; return { restrict: "E", controller: controller, link: link, scope: { section: "=", patient: "=", enrollment: "=" }, templateUrl: "../common/displaycontrols/drugOrderDetails/views/drugOrderDetails.html" } }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.DrugOrdersSection = Bahmni.Common.DisplayControl.DrugOrdersSection || {}, angular.module("bahmni.common.displaycontrol.drugOrdersSection", []), angular.module("bahmni.common.displaycontrol.drugOrdersSection").directive("drugOrdersSection", ["treatmentService", "spinner", "$rootScope", function(treatmentService, spinner, $rootScope) { var controller = function($scope) { var DateUtil = Bahmni.Common.Util.DateUtil; $scope.showAdditionalInstructions = !0, $scope.toggle = !0, $scope.toggleDisplay = function() { $scope.toggle = !$scope.toggle }; var treatmentConfigColumnHeaders = $scope.config.columnHeaders; $scope.columnHeaders = { drugName: treatmentConfigColumnHeaders && treatmentConfigColumnHeaders.drugName || "DRUG_DETAILS_DRUG_NAME", dosage: treatmentConfigColumnHeaders && treatmentConfigColumnHeaders.dosage || "DRUG_DETAILS_DOSE_INFO", route: treatmentConfigColumnHeaders && treatmentConfigColumnHeaders.route || "DRUG_DETAILS_ROUTE", duration: treatmentConfigColumnHeaders && treatmentConfigColumnHeaders.duration || "DRUG_DETAILS_DURATION", frequency: treatmentConfigColumnHeaders && treatmentConfigColumnHeaders.frequency || "DRUG_DETAILS_FREQUENCY", startDate: treatmentConfigColumnHeaders && treatmentConfigColumnHeaders.startDate || "DRUG_DETAILS_START_DATE", stopDate: treatmentConfigColumnHeaders && treatmentConfigColumnHeaders.stopDate || "DRUG_DETAILS_STOP_DATE", stopReason: treatmentConfigColumnHeaders && treatmentConfigColumnHeaders.stopReason || "DRUG_DETAILS_ORDER_REASON_CODED", instructions: treatmentConfigColumnHeaders && treatmentConfigColumnHeaders.instructions || "DRUG_DETAILS_INSTRUCTIONS_TEXT", quantity: treatmentConfigColumnHeaders && treatmentConfigColumnHeaders.quantity || "DRUG_DETAILS_QUANTITY_TEXT" }, $scope.scheduledDate = DateUtil.getDateWithoutTime(DateUtil.addDays(DateUtil.now(), 1)); var initialiseColumns = function() { var mandatoryColumns = ["drugName", "dosage", "startDate"], defaultColumns = ["frequency", "route"]; _.isEmpty($scope.config.columns) ? $scope.columns = _.union(mandatoryColumns, defaultColumns) : $scope.columns = _.union($scope.config.columns, defaultColumns, mandatoryColumns) }, mergeActiveAndScheduledWithDiscontinuedOrders = function() { _.each($scope.discontinuedDrugs, function(discontinuedDrug) { _.remove($scope.drugOrders, { uuid: discontinuedDrug.uuid }), $scope.drugOrders.push(discontinuedDrug) }) }, init = function() { return initialiseColumns(), _.isEmpty($scope.config.title) && _.isEmpty($scope.config.translationKey) && ($scope.config.title = "Drug Orders"), $scope.isOrderSet ? void($scope.isDrugOrderSet = !0) : treatmentService.getAllDrugOrdersFor($scope.patientUuid, $scope.config.includeConceptSet, $scope.config.excludeConceptSet, $scope.config.active, $scope.enrollment).then(function(drugOrderResponse) { var createDrugOrder = function(drugOrder) { return Bahmni.Clinical.DrugOrderViewModel.createFromContract(drugOrder, $scope.treatmentConfig) }; $scope.drugOrders = sortOrders(drugOrderResponse.map(createDrugOrder)), $scope.config.active && mergeActiveAndScheduledWithDiscontinuedOrders(), $scope.stoppedOrderReasons = $scope.treatmentConfig.stoppedOrderReasonConcepts }) }, sortOrders = function(drugOrders) { var drugOrderUtil = Bahmni.Clinical.DrugOrder.Util, sortedDrugOrders = []; return sortedDrugOrders.push(drugOrderUtil.sortDrugOrdersInChronologicalOrder(drugOrders)), _.flatten(sortedDrugOrders) }, clearOtherDrugOrderActions = function(revisedDrugOrder) { $scope.drugOrders.forEach(function(drugOrder) { drugOrder != revisedDrugOrder && (drugOrder.isDiscontinuedAllowed = !0, drugOrder.isBeingEdited = !1) }) }; $scope.$on("event:reviseDrugOrder", function(event, drugOrder) { clearOtherDrugOrderActions(drugOrder) }), $scope.refill = function(drugOrder) { $rootScope.$broadcast("event:refillDrugOrder", drugOrder) }, $scope.remove = function(drugOrder) { var promise = treatmentService.voidDrugOrder(drugOrder); spinner.forPromise(promise), promise.then(function() { $rootScope.$broadcast("event:sectionUpdated", drugOrder) }) }, $scope.$on("event:sectionUpdated", function() { init() }), $scope.revise = function(drugOrder, drugOrders) { drugOrder.isEditAllowed && $rootScope.$broadcast("event:reviseDrugOrder", drugOrder, drugOrders) }, $scope.checkConflictingDrug = function(drugOrder) { $rootScope.$broadcast("event:includeOrderSetDrugOrder", drugOrder) }, $scope.edit = function(drugOrder) { var index = _.indexOf($scope.drugOrders, drugOrder); $rootScope.$broadcast("event:editDrugOrder", drugOrder, index) }, $scope.toggleShowAdditionalInstructions = function(line) { line.showAdditionalInstructions = !line.showAdditionalInstructions }, $scope.discontinue = function(drugOrder) { drugOrder.isDiscontinuedAllowed && ($rootScope.$broadcast("event:discontinueDrugOrder", drugOrder), $scope.updateFormConditions(drugOrder)) }, $scope.undoDiscontinue = function(drugOrder) { $rootScope.$broadcast("event:undoDiscontinueDrugOrder", drugOrder) }, $scope.getMinDateForDiscontinue = function(drugOrder) { var minDate = DateUtil.today(); return DateUtil.isBeforeDate(drugOrder.effectiveStartDate, minDate) && (minDate = drugOrder.effectiveStartDate), DateUtil.getDateWithoutTime(minDate) }, $scope.updateFormConditions = function(drugOrder) { var formCondition = Bahmni.ConceptSet.FormConditions.rules ? Bahmni.ConceptSet.FormConditions.rules["Medication Stop Reason"] : void 0; formCondition ? drugOrder.orderReasonConcept ? formCondition(drugOrder, drugOrder.orderReasonConcept.name.name) || disableAndClearReasonText(drugOrder) : disableAndClearReasonText(drugOrder) : drugOrder.orderReasonNotesEnabled = !0 }; var disableAndClearReasonText = function(drugOrder) { drugOrder.orderReasonText = null, drugOrder.orderReasonNotesEnabled = !1 }, promise = init(); promise && spinner.forPromise(promise) }; return { restrict: "E", controller: controller, scope: { config: "=", patientUuid: "=", treatmentConfig: "=", discontinuedDrugs: "=", enrollment: "=", drugOrders: "=?", isOrderSet: "=?" }, templateUrl: "../common/displaycontrols/drugOrdersSection/views/drugOrdersSection.html" } }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.Diagnosis = Bahmni.Common.DisplayControl.Diagnosis || {}, angular.module("bahmni.common.displaycontrol.diagnosis", []), angular.module("bahmni.common.displaycontrol.diagnosis").filter("primaryDiagnosisFirst", function() { return function(diagnoses) { var primaryDiagnoses = _.filter(diagnoses, function(diagnosis) { return diagnosis.isPrimary() }), otherDiagnoses = _.filter(diagnoses, function(diagnosis) { return !diagnosis.isPrimary() }); return primaryDiagnoses.concat(otherDiagnoses) } }), angular.module("bahmni.common.displaycontrol.diagnosis").directive("bahmniDiagnosis", ["diagnosisService", "$q", "spinner", "$rootScope", "$filter", function(diagnosisService, $q, spinner, $rootScope, $filter) { var controller = function($scope) { var getAllDiagnosis = function() { return diagnosisService.getDiagnoses($scope.patientUuid, $scope.visitUuid).then(function(response) { var diagnosisMapper = new Bahmni.DiagnosisMapper($rootScope.diagnosisStatus); $scope.allDiagnoses = diagnosisMapper.mapDiagnoses(response.data), 0 == $scope.showRuledOutDiagnoses && ($scope.allDiagnoses = _.filter($scope.allDiagnoses, function(diagnoses) { return diagnoses.diagnosisStatus !== $rootScope.diagnosisStatus })), $scope.isDataPresent = function() { return !$scope.allDiagnoses || 0 != $scope.allDiagnoses.length || ($scope.$emit("no-data-present-event"), !1) } }) }; $scope.title = $scope.config.title, $scope.toggle = function(diagnosis, toggleLatest) { toggleLatest ? (diagnosis.showDetails = !1, diagnosis.showLatestDetails = !diagnosis.showLatestDetails) : (diagnosis.showLatestDetails = !1, diagnosis.showDetails = !diagnosis.showDetails) }; var getPromises = function() { return [getAllDiagnosis()] }; $scope.isLatestDiagnosis = function(diagnosis) { return !!diagnosis.latestDiagnosis && diagnosis.existingObs == diagnosis.latestDiagnosis.existingObs }, $scope.initialization = $q.all(getPromises()) }, link = function($scope, element) { spinner.forPromise($scope.initialization, element) }; return { restrict: "E", controller: controller, link: link, templateUrl: "../common/displaycontrols/diagnosis/views/diagnosisDisplayControl.html", scope: { patientUuid: "=", config: "=", visitUuid: "=?", showRuledOutDiagnoses: "=?", hideTitle: "=?", showLatestDiagnosis: "@showLatestDiagnosis" } } }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.Orders = Bahmni.Common.DisplayControl.Orders || {}, angular.module("bahmni.common.displaycontrol.orders", []); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.bacteriologyresults = Bahmni.Common.DisplayControl.bacteriologyresults || {}, angular.module("bahmni.common.displaycontrol.bacteriologyresults", []), angular.module("bahmni.common.displaycontrol.orders").directive("ordersControl", ["orderService", "orderTypeService", "$q", "spinner", "$filter", function(orderService, orderTypeService, $q, spinner, $filter) { var controller = function($scope) { $scope.orderTypeUuid = orderTypeService.getOrderTypeUuid($scope.orderType), null !== $scope.config.showHeader && void 0 !== $scope.config.showHeader || ($scope.config.showHeader = !0); var includeAllObs = !0, getOrders = function() { var params = { patientUuid: $scope.patient.uuid, orderTypeUuid: $scope.orderTypeUuid, conceptNames: $scope.config.conceptNames, includeObs: includeAllObs, numberOfVisits: $scope.config.numberOfVisits, obsIgnoreList: $scope.config.obsIgnoreList, visitUuid: $scope.visitUuid, orderUuid: $scope.orderUuid }; return orderService.getOrders(params).then(function(response) { $scope.bahmniOrders = response.data }) }, init = function() { return getOrders().then(function() { _.forEach($scope.bahmniOrders, function(order) { 0 === order.bahmniObservations.length && (order.hideIfEmpty = !0) }), _.isEmpty($scope.bahmniOrders) ? $scope.noOrdersMessage = $scope.getSectionTitle() : $scope.bahmniOrders[0].isOpen = !0 }) }; $scope.getTitle = function(order) { return order.conceptName + " on " + $filter("bahmniDateTime")(order.orderDate) + " by " + order.provider }, $scope.toggle = function(element) { element.isOpen = !element.isOpen }, $scope.dialogData = { patient: $scope.patient, section: $scope.section }, $scope.isClickable = function() { return $scope.isOnDashboard && $scope.section.expandedViewConfig }, $scope.hasTitleToBeShown = function() { return !$scope.isClickable() && $scope.getSectionTitle() }, $scope.message = Bahmni.Common.Constants.messageForNoFulfillment, $scope.getSectionTitle = function() { return $filter("titleTranslate")($scope.section) }, $scope.initialization = init() }, link = function($scope, element) { spinner.forPromise($scope.initialization, element) }; return { restrict: "E", controller: controller, link: link, templateUrl: "../common/displaycontrols/orders/views/ordersControl.html", scope: { patient: "=", section: "=", orderType: "=", orderUuid: "=", config: "=", isOnDashboard: "=", visitUuid: "=" } } }]), angular.module("bahmni.common.displaycontrol.bacteriologyresults").directive("bacteriologyResultsControl", ["bacteriologyResultsService", "appService", "$q", "spinner", "$filter", "ngDialog", "bacteriologyTabInitialization", "$controller", "consultationInitialization", "messagingService", "$rootScope", "$translate", function(bacteriologyResultsService, appService, $q, spinner, $filter, ngDialog, bacteriologyTabInitialization, $controller, consultationInitialization, messagingService, $rootScope, $translate) { var controller = function($scope) { var shouldPromptBeforeClose = !0, expandAllSpecimensIfDashboardIsBeingPrinted = function() { $rootScope.isBeingPrinted && _.each($scope.specimens, function(specimen) { specimen.isOpen = !0 }) }, init = function() { $scope.title = "bacteriology results"; var params = { patientUuid: $scope.patient.uuid, patientProgramUuid: $scope.enrollment }; return $scope.initializationPromise = bacteriologyTabInitialization().then(function(data) { $scope.bacteriologyTabData = data, bacteriologyResultsService.getBacteriologyResults(params).then(function(response) { handleResponse(response), expandAllSpecimensIfDashboardIsBeingPrinted() }) }), $scope.initializationPromise }, handleResponse = function(response) { if ($scope.observations = response.data.results, $scope.observations && $scope.observations.length > 0) { $scope.specimens = []; var sampleSource = _.find($scope.bacteriologyTabData.setMembers, function(member) { return member.name.name === Bahmni.Clinical.Constants.bacteriologyConstants.specimenSampleSourceConceptName }); $scope.allSamples = void 0 != sampleSource && _.map(sampleSource.answers, function(answer) { return (new Bahmni.Common.Domain.ConceptMapper).map(answer) }); var specimenMapper = new Bahmni.Clinical.SpecimenMapper, conceptsConfig = appService.getAppDescriptor().getConfigValue("conceptSetUI") || {}, dontSortByObsDateTime = !0; _.forEach($scope.observations, function(observation) { $scope.specimens.push(specimenMapper.mapObservationToSpecimen(observation, $scope.allSamples, conceptsConfig, dontSortByObsDateTime)) }) } else $scope.specimens = []; $scope.isDataPresent = function() { return !(!$scope.specimens || !$scope.specimens.length) || $scope.$emit("no-data-present-event") && !1 } }; $scope.editBacteriologySample = function(specimen) { var configForPrompt = appService.getAppDescriptor().getConfigValue("showSaveConfirmDialog"); $scope.editDialogInitializationPromise = consultationInitialization($scope.patient.uuid, null, null).then(function(consultationContext) { $scope.consultation = consultationContext, $scope.consultation.newlyAddedSpecimens = [], $scope.isOnDashboard = !0, $scope.consultation.newlyAddedSpecimens.push(specimen), $scope.dialogElement = ngDialog.open({ template: "../common/displaycontrols/bacteriologyresults/views/editBacteriologySample.html", scope: $scope, className: "ngdialog-theme-default ng-dialog-all-details-page ng-dialog-edit", controller: $controller("BacteriologyController", { $scope: $scope, bacteriologyConceptSet: $scope.bacteriologyTabData }), preCloseCallback: function() { return configForPrompt && shouldPromptBeforeClose ? !!confirm($translate.instant("POP_UP_CLOSE_DIALOG_MESSAGE_KEY")) && ($rootScope.hasVisitedConsultation || (window.onbeforeunload = null), init(), !0) : void init() } }), $scope.scrollOnEdit = "scrollOnEdit" }) }, $scope.saveBacteriologySample = function(specimen) { if (specimen.hasIllegalDateCollected = !specimen.dateCollected, specimen.hasIllegalType = !specimen.type, specimen.hasIllegalTypeFreeText = !specimen.typeFreeText, specimen.isDirty()) messagingService.showMessage("error", "{{'CLINICAL_FORM_ERRORS_MESSAGE_KEY' | translate }}"); else { shouldPromptBeforeClose = !1; var specimenMapper = new Bahmni.Clinical.SpecimenMapper; specimen.voidIfEmpty(), $scope.saveBacteriologyResultsPromise = bacteriologyResultsService.saveBacteriologyResults(specimenMapper.mapSpecimenToObservation(specimen)), $scope.saveBacteriologyResultsPromise.then(function() { $rootScope.hasVisitedConsultation || (window.onbeforeunload = null), $rootScope.hasVisitedConsultation = !1, ngDialog.close(), messagingService.showMessage("info", "{{'CLINICAL_SAVE_SUCCESS_MESSAGE_KEY' | translate}}") }) } }, $scope.getDisplayName = function(specimen) { var type = specimen.type, displayName = type.shortName ? type.shortName : type.name; return displayName === Bahmni.Clinical.Constants.bacteriologyConstants.otherSampleType && (displayName = specimen.typeFreeText), displayName }, $scope.hasResults = function(test) { return test && test.groupMembers }, init() }, link = function($scope, element) { $scope.$watch("initializationPromise", function() { $scope.initializationPromise && spinner.forPromise($scope.initializationPromise, element) }), $scope.$watch("editDialogInitializationPromise", function() { $scope.editDialogInitializationPromise && spinner.forPromise($scope.editDialogInitializationPromise, element) }), $scope.$watch("saveBacteriologyResultsPromise", function() { $scope.saveBacteriologyResultsPromise && spinner.forPromise($scope.saveBacteriologyResultsPromise, $("#" + $scope.dialogElement.id)) }) }; return { restrict: "E", controller: controller, templateUrl: "../common/displaycontrols/bacteriologyresults/views/bacteriologyResultsControl.html", scope: { patient: "=", section: "=", observationUuid: "=", config: "=", visitUuid: "=", enrollment: "@" }, link: link } }]), angular.module("bahmni.common.displaycontrol.orders").controller("AllOrdersDetailsController", ["$scope", function($scope) { $scope.patient = $scope.ngDialogData.patient, $scope.section = $scope.ngDialogData.section, $scope.title = $scope.section.title, $scope.config = $scope.ngDialogData.section ? $scope.ngDialogData.section.expandedViewConfig : {} }]), angular.module("bahmni.common.displaycontrol.programs", ["bahmni.common.domain", "bahmni.common.uiHelper"]), angular.module("bahmni.common.displaycontrol.programs").directive("programs", ["programService", "$state", "spinner", function(programService, $state, spinner) { var controller = function($scope) { $scope.initialization = programService.getPatientPrograms($scope.patient.uuid, !0, $state.params.enrollment).then(function(patientPrograms) { _.isEmpty(patientPrograms.activePrograms) && _.isEmpty(patientPrograms.endedPrograms) && $scope.$emit("no-data-present-event"), $scope.activePrograms = patientPrograms.activePrograms, $scope.pastPrograms = patientPrograms.endedPrograms }), $scope.hasPatientAnyActivePrograms = function() { return !_.isEmpty($scope.activePrograms) }, $scope.hasPatientAnyPastPrograms = function() { return !_.isEmpty($scope.pastPrograms) }, $scope.hasPatientAnyPrograms = function() { return $scope.hasPatientAnyPastPrograms() || $scope.hasPatientAnyActivePrograms() }, $scope.showProgramStateInTimeline = function() { return programService.getProgramStateConfig() }, $scope.hasStates = function(program) { return !_.isEmpty(program.states) }, $scope.getAttributeValue = function(attribute) { if (isDateFormat(attribute.attributeType.format)) return Bahmni.Common.Util.DateUtil.formatDateWithoutTime(attribute.value); if (isCodedConceptFormat(attribute.attributeType.format)) { var mrsAnswer = attribute.value, displayName = mrsAnswer.display; return mrsAnswer.names && 2 == mrsAnswer.names.length && "FULLY_SPECIFIED" == mrsAnswer.name.conceptNameType && (displayName = mrsAnswer.names[0].display == displayName ? mrsAnswer.names[1].display : mrsAnswer.names[0].display), displayName } return attribute.value }, $scope.isIncluded = function(attributeType, program) { return !(program.program && _.includes(attributeType.excludeFrom, program.program.name)) }; var isDateFormat = function(format) { return "org.openmrs.customdatatype.datatype.DateDatatype" == format }, isCodedConceptFormat = function(format) { return "org.bahmni.module.bahmnicore.customdatatype.datatype.CodedConceptDatatype" == format } }, link = function($scope, element) { spinner.forPromise($scope.initialization, element) }; return { restrict: "E", link: link, controller: controller, templateUrl: "../common/displaycontrols/programs/views/programs.html", scope: { patient: "=" } } }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.ObsToObsFlowSheet = Bahmni.Common.DisplayControl.ObsToObsFlowSheet || {}, angular.module("bahmni.common.displaycontrol.obsVsObsFlowSheet", []), angular.module("bahmni.common.displaycontrol.obsVsObsFlowSheet").directive("obsToObsFlowSheet", ["$translate", "spinner", "observationsService", "conceptSetService", "$q", "conceptSetUiConfigService", function($translate, spinner, observationsService, conceptSetService, $q, conceptSetUiConfigService) { var link = function($scope, element) { $scope.config = $scope.isOnDashboard ? $scope.section.dashboardConfig : $scope.section.expandedViewConfig, $scope.isEditable = $scope.config.isEditable; var patient = $scope.patient, getTemplateDisplayName = function() { return conceptSetService.getConcept({ name: $scope.config.templateName, v: "custom:(uuid,names,displayString)" }).then(function(result) { var templateConcept = result && result.data && result.data.results && result.data.results[0], displayName = templateConcept && templateConcept.displayString; templateConcept && templateConcept.names && 1 === templateConcept.names.length && "" != templateConcept.names[0].name ? displayName = templateConcept.names[0].name : templateConcept && templateConcept.names && 2 === templateConcept.names.length && (displayName = _.find(templateConcept.names, { conceptNameType: "SHORT" }).name), $scope.conceptDisplayName = displayName }) }; const removeEmptyRecords = function(records) { return records.headers = _.filter(records.headers, function(header) { return !_.every(records.rows, function(record) { return _.isEmpty(record.columns[header.name]) }) }), records }; var getObsInFlowSheet = function() { return observationsService.getObsInFlowSheet(patient.uuid, $scope.config.templateName, $scope.config.groupByConcept, $scope.config.orderByConcept, $scope.config.conceptNames, $scope.config.numberOfVisits, $scope.config.initialCount, $scope.config.latestCount, $scope.config.type, $scope.section.startDate, $scope.section.endDate, $scope.enrollment).success(function(data) { var obsInFlowSheet = data, groupByElement = _.find(obsInFlowSheet.headers, function(header) { return header.name === $scope.config.groupByConcept }); obsInFlowSheet.headers = _.without(obsInFlowSheet.headers, groupByElement), obsInFlowSheet.headers.unshift(groupByElement), $scope.config.hideEmptyRecords && (obsInFlowSheet = removeEmptyRecords(obsInFlowSheet)), $scope.obsTable = obsInFlowSheet, _.isEmpty($scope.obsTable.rows) && $scope.$emit("no-data-present-event") }) }, init = function() { return $q.all([getObsInFlowSheet(), getTemplateDisplayName()]).then(function() {}) }; $scope.isClickable = function() { return $scope.isOnDashboard && $scope.section.expandedViewConfig }, $scope.dialogData = { patient: $scope.patient, section: $scope.section }, $scope.getEditObsData = function(observation) { return { observation: { encounterUuid: observation.encounterUuid, uuid: observation.obsGroupUuid }, conceptSetName: $scope.config.templateName, conceptDisplayName: $scope.conceptDisplayName } }, $scope.getPivotOn = function() { return $scope.config.pivotOn }, $scope.getHeaderName = function(header) { var abbreviation = getSourceCode(header, $scope.section.headingConceptSource), headerName = abbreviation || header.shortName || header.name; return header.units && (headerName = headerName + " (" + header.units + ")"), headerName }; var getSourceCode = function(concept, conceptSource) { var result; return concept && concept.mappings && concept.mappings.length > 0 && (result = _.result(_.find(concept.mappings, { source: conceptSource }), "code"), result = $translate.instant(result)), result }, getName = function(obs) { return getSourceCode(obs.value, $scope.section.dataConceptSource) || obs && obs.value && obs.value.shortName || obs && obs.value && obs.value.name || obs.value }; $scope.commafy = function(observations) { var list = [], config = conceptSetUiConfigService.getConfig(), unBoolean = function(boolValue) { return boolValue ? $translate.instant("OBS_BOOLEAN_YES_KEY") : $translate.instant("OBS_BOOLEAN_NO_KEY") }; for (var index in observations) { var name = getName(observations[index]); if ("Boolean" === observations[index].concept.dataType && (name = unBoolean(name)), "Date" === observations[index].concept.dataType) { var conceptName = observations[index].concept.name; name = conceptName && config[conceptName] && 1 == config[conceptName].displayMonthAndYear ? Bahmni.Common.Util.DateUtil.getDateInMonthsAndYears(name) : Bahmni.Common.Util.DateUtil.formatDateWithoutTime(name) } list.push(name) } return list.join($scope.config && $scope.config.obsDelimiter ? $scope.config.obsDelimiter : ", ") }, $scope.isMonthAvailable = function() { return null != $scope.obsTable.rows[0].columns.Month }, $scope.hasPDFAsValue = function(data) { return !!data.value && data.value.indexOf(".pdf") > 0 }, spinner.forPromise(init(), element) }; return { restrict: "E", link: link, scope: { patient: "=", section: "=", visitSummary: "=", isOnDashboard: "=", enrollment: "=", startDate: "=", endDate: "=" }, templateUrl: "../common/displaycontrols/tabularview/views/obsToObsFlowSheet.html" } }]), angular.module("bahmni.common.displaycontrol.observation").controller("AllObsToObsFlowSheetDetailsController", ["$scope", function($scope) { $scope.patient = $scope.ngDialogData.patient, $scope.section = $scope.ngDialogData.section, $scope.config = $scope.ngDialogData.section ? $scope.ngDialogData.section.expandedViewConfig : {} }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.DrugOGram = Bahmni.Common.DisplayControl.DrugOGram || {}, angular.module("bahmni.common.displaycontrol", []), angular.module("bahmni.common.displaycontrol.chronicTreatmentChart", []), angular.module("bahmni.common.displaycontrol.chronicTreatmentChart").directive("chronicTreatmentChart", ["$translate", "spinner", "drugService", function($translate, spinner, drugService) { var link = function($scope, element) { $scope.config = $scope.isOnDashboard ? $scope.section.dashboardConfig : $scope.section.expandedViewConfig; var patient = $scope.patient, init = function() { return drugService.getRegimen(patient.uuid, $scope.enrollment, $scope.config.drugs).success(function(data) { var filterNullRow = function() { for (var row in $scope.regimen.rows) { var nullFlag = !0; for (var drug in $scope.regimen.rows[row].drugs) if ($scope.regimen.rows[row].drugs[drug]) { nullFlag = !1; break } nullFlag && $scope.regimen.rows.splice(row, 1) } }; $scope.regimen = data, _.isEmpty($scope.regimen.rows) && $scope.$emit("no-data-present-event"), filterNullRow() }) }; $scope.getAbbreviation = function(concept) { var result; return concept && concept.mappings && concept.mappings.length > 0 && $scope.section.headingConceptSource && (result = _.result(_.find(concept.mappings, { source: $scope.section.headingConceptSource }), "code"), result = $translate.instant(result)), result || concept.shortName || concept.name }, $scope.isMonthNumberRequired = function() { var month = $scope.regimen && $scope.regimen.rows && $scope.regimen.rows[0] && $scope.regimen.rows[0].month; return month }, $scope.isClickable = function() { return $scope.isOnDashboard && $scope.section.expandedViewConfig }, $scope.dialogData = { patient: $scope.patient, section: $scope.section, enrollment: $scope.enrollment }, spinner.forPromise(init(), element) }; return { restrict: "E", link: link, scope: { patient: "=", section: "=", isOnDashboard: "=", enrollment: "=" }, templateUrl: "../common/displaycontrols/chronicTreatmentChart/views/chronicTreatmentChart.html" } }]), angular.module("bahmni.common.displaycontrol.chronicTreatmentChart").filter("decimalFilter", function() { return function(value) { return isNaN(value) || "" === value ? value : (value = +value, Math.floor(value)) } }), angular.module("bahmni.common.displaycontrol.chronicTreatmentChart").controller("AllChronicTreatmentChartController", ["$scope", function($scope) { $scope.patient = $scope.ngDialogData.patient, $scope.enrollment = $scope.ngDialogData.enrollment, $scope.section = $scope.ngDialogData.section, $scope.config = $scope.ngDialogData.section ? $scope.ngDialogData.section.expandedViewConfig : {} }]), angular.module("bahmni.common.displaycontrol.dashboard").controller("PatientDashboardDiagnosisController", ["$scope", "ngDialog", function($scope, ngDialog) { $scope.section = $scope.dashboard.getSectionByType("diagnosis") || {}, $scope.openSummaryDialog = function() { ngDialog.open({ template: "../common/displaycontrols/dashboard/views/sections/diagnosisSummary.html", className: "ngdialog-theme-default ng-dialog-all-details-page", scope: $scope }) }; var cleanUpListener = $scope.$on("ngDialog.closing", function() { $("body").removeClass("ngdialog-open") }); $scope.$on("$destroy", cleanUpListener) }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.forms = Bahmni.Common.DisplayControl.forms || {}, angular.module("bahmni.common.displaycontrol.forms", []), angular.module("bahmni.clinical").controller("patientDashboardAllFormsController", ["$scope", function($scope) { $scope.patient = $scope.ngDialogData.patient, $scope.section = $scope.ngDialogData.section }]), angular.module("bahmni.common.displaycontrol.forms").directive("formsTable", ["conceptSetService", "spinner", "$q", "visitFormService", "appService", "$state", function(conceptSetService, spinner, $q, visitFormService, appService, $state) { var controller = function($scope) { $scope.shouldPromptBrowserReload = !0, $scope.showFormsDate = appService.getAppDescriptor().getConfigValue("showFormsDate"); var getAllObservationTemplates = function() { return conceptSetService.getConcept({ name: "All Observation Templates", v: "custom:(setMembers:(display))" }) }, obsFormData = function() { return visitFormService.formData($scope.patient.uuid, $scope.section.dashboardConfig.maximumNoOfVisits, $scope.section.formGroup, $state.params.enrollment) }, filterFormData = function(formData) { var filterList = []; return _.each(formData, function(item) { var foundElement = _.find(filterList, function(filteredItem) { return item.concept.uuid == filteredItem.concept.uuid }); void 0 == foundElement && filterList.push(item) }), filterList }, sortedFormDataByLatestDate = function(formData) { return _.sortBy(formData, "obsDatetime").reverse() }, init = function() { return $scope.noFormFoundMessage = "No Form found for this patient", $scope.isFormFound = !1, $q.all([getAllObservationTemplates(), obsFormData()]).then(function(results) { $scope.observationTemplates = results[0].data.results[0].setMembers; var sortedFormDataByDate = sortedFormDataByLatestDate(results[1].data.results); $scope.isOnDashboard ? $scope.formData = filterFormData(sortedFormDataByDate) : $scope.formData = sortedFormDataByDate, 0 == $scope.formData.length && ($scope.isFormFound = !0, $scope.$emit("no-data-present-event")) }) }; $scope.getDisplayName = function(data) { var concept = data.concept, displayName = data.concept.displayString; if (concept.names && 1 === concept.names.length && "" != concept.names[0].name) displayName = concept.names[0].name; else if (concept.names && 2 === concept.names.length) { var shortName = _.find(concept.names, { conceptNameType: "SHORT" }); displayName = shortName && shortName.name ? shortName.name : displayName } return displayName }, $scope.initialization = init(), $scope.getEditObsData = function(observation) { return { observation: observation, conceptSetName: observation.concept.displayString, conceptDisplayName: $scope.getDisplayName(observation) } }, $scope.shouldPromptBeforeClose = !0, $scope.getConfigToFetchDataAndShow = function(data) { return { patient: $scope.patient, config: { conceptNames: [data.concept.displayString], showGroupDateTime: !1, encounterUuid: data.encounterUuid, observationUuid: data.uuid }, section: { title: data.concept.displayString } } }, $scope.dialogData = { patient: $scope.patient, section: $scope.section } }, link = function($scope, element) { spinner.forPromise($scope.initialization, element) }; return { restrict: "E", controller: controller, link: link, templateUrl: "../common/displaycontrols/forms/views/formsTable.html", scope: { section: "=", patient: "=", isOnDashboard: "=" } } }]), angular.module("bahmni.clinical").service("visitFormService", ["$http", function($http) { var formData = function(patientUuid, numberOfVisits, formGroup, patientProgramUuid) { var params = { s: "byPatientUuid", patient: patientUuid, numberOfVisits: numberOfVisits, v: "visitFormDetails", conceptNames: formGroup || null, patientProgramUuid: patientProgramUuid }; return $http.get(Bahmni.Common.Constants.formDataUrl, { params: params }) }; return { formData: formData } }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.DisplayControl = Bahmni.Common.DisplayControl || {}, Bahmni.Common.DisplayControl.hint = Bahmni.Common.DisplayControl.hint || {}, angular.module("bahmni.common.displaycontrol.hint", []), angular.module("bahmni.common.displaycontrol.hint").directive("hint", [function() { var link = function($scope) { $scope.hintForNumericConcept = Bahmni.Common.Domain.Helper.getHintForNumericConcept($scope.conceptDetails) }; return { restrict: "E", link: link, template: '{{::hintForNumericConcept}}', scope: { conceptDetails: "=" } } }]), angular.module("bahmni.common.orders", []), angular.module("bahmni.common.orders").factory("orderService", ["$http", function($http) { var getOrders = function(data) { var params = { concept: data.conceptNames, includeObs: data.includeObs, patientUuid: data.patientUuid, numberOfVisits: data.numberOfVisits }; return data.obsIgnoreList && (params.obsIgnoreList = data.obsIgnoreList), data.orderTypeUuid && (params.orderTypeUuid = data.orderTypeUuid), data.orderUuid && (params.orderUuid = data.orderUuid), data.visitUuid && (params.visitUuid = data.visitUuid), data.locationUuids && data.locationUuids.length > 0 && (params.numberOfVisits = 0, params.locationUuids = data.locationUuids), $http.get(Bahmni.Common.Constants.bahmniOrderUrl, { params: params, withCredentials: !0 }) }; return { getOrders: getOrders } }]), angular.module("bahmni.common.orders").service("orderSetService", ["$http", "$q", function($http, $q) { this.getOrderSetsByQuery = function(name) { return $http.get(Bahmni.Common.Constants.orderSetUrl, { params: { v: "full", s: "byQuery", q: name } }) }, this.getCalculatedDose = function(patientUuid, drugName, baseDose, doseUnit, orderSetName, dosingRule, visitUuid) { if ("undefined" != typeof dosingRule && "" != dosingRule && null != dosingRule) { var requestString = JSON.stringify({ patientUuid: patientUuid, drugName: drugName, baseDose: baseDose, doseUnit: doseUnit, orderSetName: orderSetName, dosingRule: dosingRule, visitUuid: visitUuid }); return $http.get(Bahmni.Common.Constants.calculateDose, { params: { dosageRequest: requestString }, withCredentials: !0, headers: { Accept: "application/json", "Content-Type": "application/json" } }).then(function(response) { return { dose: round(response.data.value), doseUnit: response.data.doseUnit } }) } var deferred = $q.defer(); return deferred.resolve({ dose: baseDose, doseUnit: doseUnit }), deferred.promise }; var round = function(value) { var leastRoundableDose = .49, leastPrescribableDose = .1; return value = value <= leastRoundableDose ? value : _.round(value), value < leastPrescribableDose ? leastPrescribableDose : value } }]), angular.module("bahmni.common.bacteriologyresults", []), angular.module("bahmni.common.bacteriologyresults").factory("bacteriologyResultsService", ["$http", function($http) { var getBacteriologyResults = function(data) { var params = { patientUuid: data.patientUuid, name: "BACTERIOLOGY CONCEPT SET", v: "full" }; return data.patientProgramUuid && (params = { patientProgramUuid: data.patientProgramUuid, s: "byPatientProgram", v: "full" }), $http.get(Bahmni.Common.Constants.bahmniBacteriologyResultsUrl, { method: "GET", params: params, withCredentials: !0 }) }, saveBacteriologyResults = function(specimen) { return $http.post(Bahmni.Common.Constants.bahmniBacteriologyResultsUrl, specimen, { withCredentials: !0 }) }; return { getBacteriologyResults: getBacteriologyResults, saveBacteriologyResults: saveBacteriologyResults } }]); var Bahmni = Bahmni || {}; Bahmni.Common = Bahmni.Common || {}, Bahmni.Common.I18n = Bahmni.Common.I18n || {}, angular.module("bahmni.common.i18n", []), angular.module("bahmni.common.i18n", ["pascalprecht.translate"]).provider("$bahmniTranslate", ["$translateProvider", function($translateProvider) { this.init = function(options) { var preferredLanguage = window.localStorage.NG_TRANSLATE_LANG_KEY || "en"; $translateProvider.useLoader("mergeLocaleFilesService", options), $translateProvider.useSanitizeValueStrategy("escaped"), $translateProvider.preferredLanguage(preferredLanguage), $translateProvider.useLocalStorage() }, this.$get = [function() { return $translateProvider }] }]).filter("titleTranslate", ["$translate", function($translate) { return function(input) { return input ? input.translationKey ? $translate.instant(input.translationKey) : input.dashboardName ? input.dashboardName : input.title ? input.title : input.label ? input.label : input.display ? input.display : $translate.instant(input) : input } }]), angular.module("bahmni.common.i18n").service("mergeLocaleFilesService", ["$http", "$q", "mergeService", function($http, $q, mergeService) { return function(options) { var baseLocaleUrl = "../i18n/", customLocaleUrl = Bahmni.Common.Constants.rootDir + "/bahmni_config/openmrs/i18n/", loadFile = function(url) { return $http.get(url, { withCredentials: !0 }) }, mergeLocaleFile = function(options) { var fileURL = options.app + "/locale_" + options.key + ".json", loadBahmniTranslations = function() { return loadFile(baseLocaleUrl + fileURL).then(function(result) { return result }, function() {}) }, loadCustomTranslations = function() { return loadFile(customLocaleUrl + fileURL).then(function(result) { return result }, function() {}) }, mergeTranslations = function(result) { var baseFileData = result[0] ? result[0].data : void 0, customFileData = result[1] ? result[1].data : void 0; return options.shouldMerge || void 0 === options.shouldMerge ? mergeService.merge(baseFileData, customFileData) : [baseFileData, customFileData] }; return $q.all([loadBahmniTranslations(), loadCustomTranslations()]).then(mergeTranslations) }; return mergeLocaleFile(options) } }]), angular.module("bahmni.common.patient").directive("patientControlPanel", ["$q", "$rootScope", "$stateParams", "$state", "contextChangeHandler", "encounterService", "configurations", "clinicalAppConfigService", "$bahmniCookieStore", "$translate", function($q, $rootScope, $stateParams, $state, contextChangeHandler, encounterService, configurations, clinicalAppConfigService, $bahmniCookieStore, $translate) { var controller = function($scope) { $scope.activeVisit = $scope.visitHistory.activeVisit; var DateUtil = Bahmni.Common.Util.DateUtil, retrieveProviderCookieData = function() { return $bahmniCookieStore.get(Bahmni.Common.Constants.grantProviderAccessDataCookieName) }; $scope.encounterProvider = retrieveProviderCookieData(), $scope.isValidProvider = function() { return retrieveProviderCookieData() && retrieveProviderCookieData().value }, $scope.retrospectivePrivilege = Bahmni.Common.Constants.retrospectivePrivilege, $scope.encounterProviderPrivilege = Bahmni.Common.Constants.grantProviderAccess, $scope.today = DateUtil.getDateWithoutTime(DateUtil.now()), $scope.getDashboardLink = function() { var dashboardUrl = "#/" + $stateParams.configName + "/patient/" + $scope.patient.uuid + "/dashboard"; if ($stateParams.programUuid) { var programParams = "programUuid=" + $stateParams.programUuid + "&enrollment=" + $stateParams.enrollment + "&dateEnrolled=" + $stateParams.dateEnrolled; dashboardUrl = dashboardUrl + "?" + programParams } return dashboardUrl }, $scope.changeContext = function($event) { var allowContextChange = contextChangeHandler.execute().allow; return allowContextChange ? void $rootScope.toggleControlPanel() : void $event.preventDefault() }, $scope.isCurrentVisit = function(visit) { return $stateParams.visitUuid === visit.uuid }, $scope.isInEditEncounterMode = function() { return void 0 !== $stateParams.encounterUuid && "active" !== $stateParams.encounterUuid }; var getLinks = function() { var state = $state.current.name; if (state.match("patient.consultation")) return [{ text: $translate.instant("CONTROL_PANEL_DASHBOARD_TEXT"), icon: "btn-summary dashboard-btn", href: $scope.getDashboardLink() }]; var links = []; return $scope.activeVisit ? links.push({ text: $translate.instant("CONTROL_PANEL_CONSULTATION_TEXT"), icon: "btn-consultation dashboard-btn", href: "#" + clinicalAppConfigService.getConsultationBoardLink() }) : state.match("patient.visit") && links.push({ text: $translate.instant("CONTROL_PANEL_DASHBOARD_TEXT"), icon: "btn-summary dashboard-btn", href: $scope.getDashboardLink() }), links }; $scope.links = getLinks(); var cleanUpListenerStateChangeSuccess = $rootScope.$on("$stateChangeSuccess", function() { $scope.links = getLinks($state.current.name) }); $scope.$on("$destroy", cleanUpListenerStateChangeSuccess); var encounterTypeUuid = configurations.encounterConfig().getPatientDocumentEncounterTypeUuid(); $scope.documentsPromise = encounterService.getEncountersForEncounterType($scope.patient.uuid, encounterTypeUuid).then(function(response) { return (new Bahmni.Clinical.PatientFileObservationsMapper).map(response.data.results) }) }; return { restrict: "E", templateUrl: "patientcontrolpanel/views/controlPanel.html", controller: controller, scope: { patient: "=", visitHistory: "=", visit: "=", consultation: "=" } } }]), angular.module("bahmni.clinical").factory("initialization", ["$rootScope", "authenticator", "appService", "spinner", "configurations", "orderTypeService", "mergeService", "$q", "messagingService", function($rootScope, authenticator, appService, spinner, configurations, orderTypeService, mergeService, $q, messagingService) { return function(config) { var loadConfigPromise = function() { return configurations.load(["patientConfig", "encounterConfig", "consultationNoteConfig", "labOrderNotesConfig", "radiologyImpressionConfig", "allTestsAndPanelsConcept", "dosageFrequencyConfig", "dosageInstructionConfig", "stoppedOrderReasonConfig", "genderMap", "relationshipTypeMap", "defaultEncounterType"]).then(function() { $rootScope.genderMap = configurations.genderMap(), $rootScope.relationshipTypeMap = configurations.relationshipTypeMap(), $rootScope.diagnosisStatus = appService.getAppDescriptor().getConfig("diagnosisStatus") && appService.getAppDescriptor().getConfig("diagnosisStatus").value || "RULED OUT" }) }, checkPrivilege = function() { return appService.checkPrivilege("app:clinical") }, initApp = function() { return appService.initApp("clinical", { app: !0, extension: !0 }, config, ["dashboard", "visit", "medication"]) }, mergeFormConditions = function() { var formConditions = Bahmni.ConceptSet.FormConditions; formConditions && (formConditions.rules = mergeService.merge(formConditions.rules, formConditions.rulesOverride)) }; return spinner.forPromise(authenticator.authenticateUser().then(initApp).then(checkPrivilege).then(loadConfigPromise).then(mergeFormConditions).then(orderTypeService.loadAll)) } }]), angular.module("bahmni.clinical").factory("ordersTabInitialization", ["conceptSetService", "spinner", function(conceptSetService, spinner) { return function() { var allOrderables = spinner.forPromise(conceptSetService.getConcept({ name: "All Orderables", v: "custom:(uuid,name:(display,uuid),names:(display,conceptNameType,name),set,setMembers:(uuid,name:(display,uuid),names:(display,conceptNameType,name),set,setMembers:(uuid,name:(display,uuid),names:(display,conceptNameType,name),set,conceptClass:(uuid,name,description),setMembers:(uuid,name:(display,uuid),names:(display,conceptNameType,name),set,conceptClass:(uuid,name,description),setMembers:(uuid,name:(display,uuid),names:(display,conceptNameType,name),set,conceptClass:(uuid,name,description))))))" })).then(function(response) { var allOrderables = {}; return _.forEach(response.data.results[0].setMembers, function(orderable) { var conceptName = _.find(orderable.names, { conceptNameType: "SHORT" }) || _.find(orderable.names, { conceptNameType: "FULLY_SPECIFIED" }); conceptName = conceptName ? conceptName.name : conceptName, allOrderables["'" + conceptName + "'"] = orderable }), allOrderables }); return allOrderables } }]), angular.module("bahmni.clinical").factory("bacteriologyTabInitialization", ["conceptSetService", function(conceptSetService) { return function() { var conceptSetName = "BACTERIOLOGY CONCEPT SET"; return conceptSetService.getConcept({ name: conceptSetName, v: "custom:(uuid,setMembers:(uuid,name,conceptClass,answers:(uuid,name,mappings,names),setMembers:(uuid,name,conceptClass,answers:(uuid,name,mappings),setMembers:(uuid,name,conceptClass))))" }, !0).then(function(response) { return response.data.results[0] }) } }]), angular.module("bahmni.clinical").factory("patientInitialization", ["$q", "$rootScope", "patientService", "configurations", "$translate", function($q, $rootScope, patientService, configurations, $translate) { return function(patientUuid) { var getPatient = function() { var patientMapper = new Bahmni.PatientMapper(configurations.patientConfig(), $rootScope, $translate); return patientService.getPatient(patientUuid).then(function(openMRSPatientResponse) { var patient = patientMapper.map(openMRSPatientResponse.data); return { patient: patient } }) }; return getPatient() } }]), angular.module("bahmni.clinical").factory("visitHistoryInitialization", ["patientVisitHistoryService", "sessionService", "locationService", function(patientVisitHistoryService, sessionService, locationService) { return function(patientUuid) { var loginLocationUuid = sessionService.getLoginLocationUuid(); return locationService.getVisitLocation(loginLocationUuid).then(function(response) { var visitLocationUuid = response.data ? response.data.uuid : null; return patientVisitHistoryService.getVisitHistory(patientUuid, visitLocationUuid) }) } }]), angular.module("bahmni.clinical").factory("consultationInitialization", ["$q", "diagnosisService", "$rootScope", "encounterService", "sessionService", "configurations", "$bahmniCookieStore", "retrospectiveEntryService", "conditionsService", function($q, diagnosisService, $rootScope, encounterService, sessionService, configurations, $bahmniCookieStore, retrospectiveEntryService, conditionsService) { return function(patientUuid, encounterUuid, programUuid, enrollment, followUpConditionConcept) { "active" === encounterUuid && (encounterUuid = void 0); var getEncounterType = function() { return encounterService.getEncounterType(programUuid, sessionService.getLoginLocationUuid()) }, consultationMapper = new Bahmni.ConsultationMapper(configurations.dosageFrequencyConfig(), configurations.dosageInstructionConfig(), configurations.consultationNoteConcept(), configurations.labOrderNotesConcept(), followUpConditionConcept), dateUtil = Bahmni.Common.Util.DateUtil, getActiveEncounter = function() { var currentProviderUuid = $rootScope.currentProvider ? $rootScope.currentProvider.uuid : null, providerData = $bahmniCookieStore.get(Bahmni.Common.Constants.grantProviderAccessDataCookieName); return findEncounter(providerData, currentProviderUuid, null) }, getRetrospectiveEncounter = function() { var currentProviderUuid = $rootScope.currentProvider ? $rootScope.currentProvider.uuid : null, providerData = $bahmniCookieStore.get(Bahmni.Common.Constants.grantProviderAccessDataCookieName), encounterDateWithoutHours = dateUtil.getDateWithoutHours(retrospectiveEntryService.getRetrospectiveDate()), encounterDate = dateUtil.parseLongDateToServerFormat(encounterDateWithoutHours); return findEncounter(providerData, currentProviderUuid, encounterDate).then(function(consultation) { return consultation.encounterDateTime = encounterDateWithoutHours, consultation }) }, findEncounter = function(providerData, currentProviderUuid, encounterDate) { return getEncounterType().then(function(encounterType) { return encounterService.find({ patientUuid: patientUuid, providerUuids: _.isEmpty(providerData) ? [currentProviderUuid] : [providerData.uuid], includeAll: Bahmni.Common.Constants.includeAllObservations, encounterDateTimeFrom: encounterDate, encounterDateTimeTo: encounterDate, encounterTypeUuids: [encounterType.uuid], patientProgramUuid: enrollment, locationUuid: $bahmniCookieStore.get(Bahmni.Common.Constants.locationCookieName).uuid }).then(function(encounterTransactionResponse) { return consultationMapper.map(encounterTransactionResponse.data) }) }) }, getEncounter = function() { return encounterUuid ? encounterService.findByEncounterUuid(encounterUuid).then(function(response) { return consultationMapper.map(response.data) }) : _.isEmpty($rootScope.retrospectiveEntry) ? getActiveEncounter() : getRetrospectiveEncounter() }; return getEncounter().then(function(consultation) { return diagnosisService.populateDiagnosisInformation(patientUuid, consultation).then(function(diagnosisConsultation) { return diagnosisConsultation.preSaveHandler = new Bahmni.Clinical.Notifier, diagnosisConsultation.postSaveHandler = new Bahmni.Clinical.Notifier, diagnosisConsultation }) }).then(function(consultation) { return conditionsService.getConditions(patientUuid).then(function(conditions) { return consultation.conditions = conditions, consultation }) }) } }]), angular.module("bahmni.clinical").factory("visitSummaryInitialization", ["visitService", function(visitService) { return function(visitUuid) { return visitUuid ? visitService.getVisitSummary(visitUuid).then(function(visitSummaryResponse) { return new Bahmni.Common.VisitSummary(visitSummaryResponse.data) }) : null } }]), Bahmni.Clinical.Constants = function() { var orderTypes = { lab: "Lab Order", radiology: "Radiology Order" }, dosingTypes = { uniform: "uniform", variable: "variable" }, orderActions = { discontinue: "DISCONTINUE", "new": "NEW", revise: "REVISE" }, concepts = { age: "Age", weight: "Weight" }, errorMessages = { discontinuingAndOrderingSameDrug: "DISCONTINUING_AND_ORDERING_SAME_DRUG_NOT_ALLOWED", incompleteForm: "INCOMPLETE_FORM_ERROR_MESSAGE", invalidItems: "Highlighted items in New Prescription section are incomplete. Please edit or remove them to continue", conceptNotNumeric: "CONCEPT_NOT_NUMERIC" }, bacteriologyConstants = { otherSampleType: "Other", specimenSampleSourceConceptName: "Specimen Sample Source" }; return { patientsListUrl: "/patient/search", diagnosisObservationConceptName: "Visit Diagnoses", orderConceptName: "Diagnosis order", certaintyConceptName: "Diagnosis Certainty", nonCodedDiagnosisConceptName: "Non-coded Diagnosis", codedDiagnosisConceptName: "Coded Diagnosis", orderTypes: orderTypes, labOrderType: "Lab Order", drugOrderType: "Drug Order", labConceptSetName: "Lab Samples", testConceptName: "LabTest", labSetConceptName: "LabSet", labDepartmentsConceptSetName: "Lab Departments", otherInvestigationsConceptSetName: "Other Investigations", otherInvestigationCategoriesConceptSetName: "Other Investigations Categories", commentConceptName: "COMMENTS", messageForNoLabOrders: "NO_LAB_ORDERS_MESSAGE", messageForNoObservation: "NO_OBSERVATIONS_CAPTURED", messageForNoActiveVisit: "NO_ACTIVE_VISIT_MESSAGE", dischargeSummaryConceptName: "Discharge Summary", flexibleDosingInstructionsClass: "org.openmrs.module.bahmniemrapi.drugorder.dosinginstructions.FlexibleDosingInstructions", reviseAction: "REVISE", asDirectedInstruction: "As directed", dosingTypes: dosingTypes, orderActions: orderActions, errorMessages: errorMessages, caseIntakeConceptClass: "Case Intake", dialog: "DIALOG", dashboard: "DASHBOARD", "default": "DEFAULT", gender: "Gender", concepts: concepts, otherActiveDrugOrders: "Other Active DrugOrders", dispensePrivilege: "bahmni:clinical:dispense", mandatoryVisitConfigUrl: "config/visitMandatoryTab.json", defaultExtensionName: "default", bacteriologyConstants: bacteriologyConstants, globalPropertyToFetchActivePatients: "emrapi.sqlSearch.activePatients", adtPrivilege: "app:adt", adtForwardUrl: "../adt/#/patient/{{patientUuid}}/visit/{{visitUuid}}/" } }(), angular.module("consultation", ["ui.router", "bahmni.clinical", "bahmni.common.config", "bahmni.common.patient", "bahmni.common.uiHelper", "bahmni.common.patientSearch", "bahmni.common.obs", "bahmni.common.i18n", "bahmni.common.domain", "bahmni.common.conceptSet", "authentication", "bahmni.common.appFramework", "bahmni.common.displaycontrol.documents", "bahmni.common.displaycontrol.observation", "bahmni.common.displaycontrol.pivottable", "bahmni.common.displaycontrol.dashboard", "bahmni.common.gallery", "bahmni.common.displaycontrol.disposition", "bahmni.common.displaycontrol.custom", "bahmni.common.displaycontrol.admissiondetails", "bahmni.common.routeErrorHandler", "bahmni.common.displaycontrol.disposition", "httpErrorInterceptor", "pasvaz.bindonce", "infinite-scroll", "bahmni.common.util", "ngAnimate", "ngDialog", "bahmni.common.displaycontrol.patientprofile", "bahmni.common.displaycontrol.diagnosis", "bahmni.common.displaycontrol.conditionsList", "RecursionHelper", "ngSanitize", "bahmni.common.orders", "bahmni.common.displaycontrol.orders", "bahmni.common.displaycontrol.prescription", "bahmni.common.displaycontrol.navigationlinks", "bahmni.common.displaycontrol.programs", "bahmni.common.displaycontrol.pacsOrders", "bahmni.common.uicontrols", "bahmni.common.uicontrols.programmanagment", "pascalprecht.translate", "ngCookies", "monospaced.elastic", "bahmni.common.bacteriologyresults", "bahmni.common.displaycontrol.bacteriologyresults", "bahmni.common.displaycontrol.obsVsObsFlowSheet", "bahmni.common.displaycontrol.chronicTreatmentChart", "bahmni.common.displaycontrol.forms", "bahmni.common.displaycontrol.drugOrderDetails", "bahmni.common.displaycontrol.hint", "bahmni.common.displaycontrol.drugOrdersSection", "bahmni.common.attributeTypes", "bahmni.common.services", "bahmni.common.models"]), angular.module("consultation").config(["$stateProvider", "$httpProvider", "$urlRouterProvider", "$bahmniTranslateProvider", "$compileProvider", function($stateProvider, $httpProvider, $urlRouterProvider, $bahmniTranslateProvider, $compileProvider) { $urlRouterProvider.otherwise("/" + Bahmni.Clinical.Constants.defaultExtensionName + "/patient/search"); var patientSearchBackLink = { label: "", state: "search.patientsearch", accessKey: "p", id: "patients-link", icon: "fa-users" }, homeBackLink = { label: "", url: "../home/index.html", accessKey: "h", icon: "fa-home" }; $compileProvider.debugInfoEnabled(!1), $stateProvider.state("search", { "abstract": !0, views: { content: { template: '
' } }, data: { backLinks: [homeBackLink] }, resolve: { retrospectiveIntialization: function(retrospectiveEntryService) { return retrospectiveEntryService.initializeRetrospectiveEntry() } } }).state("search.patientsearch", { url: "/:configName/patient/search", views: { "patientSearchPage-header": { templateUrl: "../common/ui-helper/header.html", controller: "PatientListHeaderController" }, "patientSearchPage-content": { templateUrl: "../common/patient-search/views/patientsList.html", controller: "PatientsListController" } }, resolve: { initializeConfigs: function(initialization, $stateParams) { return $stateParams.configName = $stateParams.configName || Bahmni.Clinical.Constants.defaultExtensionName, patientSearchBackLink.state = 'search.patientsearch({configName: "' + $stateParams.configName + '"})', initialization($stateParams.configName) } } }).state("patient", { url: "/:configName/patient/:patientUuid?encounterUuid,programUuid,enrollment", "abstract": !0, data: { backLinks: [patientSearchBackLink] }, views: { content: { template: '
', controller: function($scope, patientContext) { $scope.patient = patientContext.patient } } }, resolve: { initialization: function(initialization, $stateParams) { return $stateParams.configName = $stateParams.configName || Bahmni.Clinical.Constants.defaultExtensionName, patientSearchBackLink.state = 'search.patientsearch({configName: "' + $stateParams.configName + '"})', initialization($stateParams.configName) }, patientContext: function(initialization, patientInitialization, $stateParams) { return patientInitialization($stateParams.patientUuid) } } }).state("patient.dashboard", { "abstract": !0, views: { content: { template: '
', controller: function($scope, visitHistory, consultationContext, followUpConditionConcept) { $scope.visitHistory = visitHistory, $scope.consultation = consultationContext, $scope.followUpConditionConcept = followUpConditionConcept, $scope.lastConsultationTabUrl = { url: void 0 } } } }, resolve: { visitHistory: function(visitHistoryInitialization, $stateParams, $rootScope) { return visitHistoryInitialization($stateParams.patientUuid, $rootScope.visitLocation) }, retrospectiveIntialization: function(retrospectiveEntryService) { return retrospectiveEntryService.initializeRetrospectiveEntry() }, followUpConditionConcept: function(conditionsService) { return conditionsService.getFollowUpConditionConcept().then(function(response) { return response.data.results[0] }) }, consultationContext: function(consultationInitialization, initialization, $stateParams, followUpConditionConcept) { return consultationInitialization($stateParams.patientUuid, $stateParams.encounterUuid, $stateParams.programUuid, $stateParams.enrollment, followUpConditionConcept) }, dashboardInitialization: function($rootScope, initialization, patientContext, clinicalDashboardConfig, userService) { return clinicalDashboardConfig.load().then(function() { return $rootScope.currentUser.addToRecentlyViewed(patientContext.patient, clinicalDashboardConfig.getMaxRecentlyViewedPatients()), userService.savePreferences() }) }, visitSummary: function(visitSummaryInitialization, initialization, visitHistory) { return visitHistory.activeVisit ? visitSummaryInitialization(visitHistory.activeVisit.uuid) : null }, visitConfig: function(initialization, visitTabConfig) { return visitTabConfig.load() } } }).state("patient.dashboard.show", { url: "/dashboard?dateEnrolled,dateCompleted", params: { dashboardCachebuster: null }, views: { "dashboard-header": { templateUrl: "dashboard/views/clinicalDashboardHeader.html", controller: "ConsultationController" }, "dashboard-content": { templateUrl: "dashboard/views/dashboard.html", controller: "PatientDashboardController" } } }).state("patient.dashboard.show.observations", { url: "/concept-set-group/:conceptSetGroupName", params: { cachebuster: null, lastOpenedTemplate: null }, views: { "consultation-content": { templateUrl: "consultation/views/conceptSet.html", controller: "ConceptSetPageController" } } }).state("patient.dashboard.show.diagnosis", { url: "/diagnosis", params: { cachebuster: null }, views: { "consultation-content": { templateUrl: "consultation/views/diagnosis.html", controller: "DiagnosisController" } } }).state("patient.dashboard.show.treatment", { "abstract": !0, params: { tabConfigName: null }, resolve: { treatmentConfig: function(initialization, treatmentConfig, $stateParams) { return treatmentConfig($stateParams.tabConfigName) } }, views: { "consultation-content": { controller: "TreatmentController", templateUrl: "consultation/views/treatment.html" } } }).state("patient.dashboard.show.treatment.page", { url: "/treatment?tabConfigName", params: { cachebuster: null }, resolve: { activeDrugOrders: function(treatmentService, $stateParams) { return treatmentService.getActiveDrugOrders($stateParams.patientUuid, $stateParams.dateEnrolled, $stateParams.dateCompleted) } }, views: { addTreatment: { controller: "AddTreatmentController", templateUrl: "consultation/views/treatmentSections/addTreatment.html", resolve: { treatmentConfig: "treatmentConfig" } }, defaultHistoryView: { controller: "DrugOrderHistoryController", templateUrl: "consultation/views/treatmentSections/drugOrderHistory.html" }, customHistoryView: { controller: "CustomDrugOrderHistoryController", templateUrl: "consultation/views/treatmentSections/customDrugOrderHistory.html" } } }).state("patient.dashboard.show.disposition", { url: "/disposition", params: { cachebuster: null }, views: { "consultation-content": { templateUrl: "consultation/views/disposition.html", controller: "DispositionController" } } }).state("patient.dashboard.show.summary", { url: "/consultation", params: { cachebuster: null }, views: { "consultation-content": { templateUrl: "consultation/views/consultation.html", controller: "ConsultationSummaryController" } } }).state("patient.dashboard.show.orders", { url: "/orders", params: { cachebuster: null }, views: { "consultation-content": { templateUrl: "consultation/views/orders.html", controller: "OrderController" } }, resolve: { allOrderables: function(ordersTabInitialization) { return ordersTabInitialization() } } }).state("patient.dashboard.show.bacteriology", { url: "/bacteriology", params: { cachebuster: null }, views: { "consultation-content": { templateUrl: "consultation/views/bacteriology.html", controller: "BacteriologyController" } }, resolve: { bacteriologyConceptSet: function(bacteriologyTabInitialization) { return bacteriologyTabInitialization() } } }).state("patient.dashboard.show.investigation", { url: "/investigation", params: { cachebuster: null }, views: { "consultation-content": { templateUrl: "consultation/views/investigations.html", controller: "InvestigationController" } } }).state("patient.visit", { "abstract": !0, views: { content: { template: '
', controller: function($scope, visitHistory) { $scope.visitHistory = visitHistory } } }, resolve: { visitHistory: function(visitHistoryInitialization, $stateParams) { return visitHistoryInitialization($stateParams.patientUuid) } } }).state("patient.visit.summaryprint", { url: "/latest-prescription-print", views: { "visit-content": { controller: "LatestPrescriptionPrintController" } } }).state("patient.dashboard.visit", { url: "/dashboard/visit/:visitUuid/:tab", data: { backLinks: [patientSearchBackLink] }, views: { "dashboard-header": { templateUrl: "common/views/visitHeader.html", controller: "VisitHeaderController" }, "dashboard-content": { templateUrl: "common/views/visit.html", controller: "VisitController" } }, resolve: { visitSummary: function(visitSummaryInitialization, $stateParams) { return visitSummaryInitialization($stateParams.visitUuid) } } }).state("patient.dashboard.visitPrint", { url: "/dashboard/visit/:visitUuid/:tab/:print", views: { "dashboard-content": { template: "
Print is getting ready
", controller: "VisitController" }, "print-content": { templateUrl: "common/views/visit.html" } }, resolve: { visitSummary: function(visitSummaryInitialization, $stateParams) { return visitSummaryInitialization($stateParams.visitUuid) } } }).state("patient.dashboard.observation", { url: "/dashboard/observation/:observationUuid", data: { backLinks: [homeBackLink] }, resolve: { observation: function(observationsService, $stateParams) { return observationsService.getRevisedObsByUuid($stateParams.observationUuid).then(function(results) { return results.data }) } }, views: { "dashboard-header": { templateUrl: "../common/ui-helper/header.html", controller: "PatientListHeaderController" }, "dashboard-content": { controller: function($scope, observation, patientContext) { $scope.observation = observation, $scope.patient = patientContext.patient }, template: '' } } }).state("patient.dahsboard.visit.tab", { url: "/:tab", data: { backLinks: [patientSearchBackLink] }, views: { "additional-header": { templateUrl: "common/views/visitHeader.html", controller: "VisitHeaderController" }, content: { templateUrl: "common/views/visit.html", controller: "VisitController" } }, resolve: { visitSummary: function(visitSummaryInitialization, $stateParams) { return visitSummaryInitialization($stateParams.visitUuid, $stateParams.tab) }, visitConfig: function(initialization, visitTabConfig) { return visitTabConfig.load() } } }).state("patient.patientProgram", { "abstract": !0, views: { content: { template: '
' } }, resolve: { retrospectiveIntialization: function(retrospectiveEntryService) { return retrospectiveEntryService.initializeRetrospectiveEntry() } } }).state("patient.patientProgram.show", { url: "/consultationContext", data: { backLinks: [patientSearchBackLink] }, views: { "patientProgram-header": { templateUrl: "../common/ui-helper/header.html", controller: "PatientListHeaderController" }, "patientProgram-content": { templateUrl: "common/views/consultationContext.html", controller: "consultationContextController" } }, resolve: { visitHistory: function(visitHistoryInitialization, $stateParams) { return visitHistoryInitialization($stateParams.patientUuid) } } }), $httpProvider.defaults.headers.common["Disable-WWW-Authenticate"] = !0, $bahmniTranslateProvider.init({ app: "clinical", shouldMerge: !0 }) }]).run(["stateChangeSpinner", "$rootScope", "auditLogService", "$window", function(stateChangeSpinner, $rootScope, auditLogService, $window) { moment.locale($window.localStorage.NG_TRANSLATE_LANG_KEY || "en"), FastClick.attach(document.body), stateChangeSpinner.activate(); var cleanUpStateChangeSuccess = $rootScope.$on("$stateChangeSuccess", function(event, toState, toParams) { auditLogService.log(toParams.patientUuid, Bahmni.Clinical.StateNameEvenTypeMap[toState.name], void 0, "MODULE_LABEL_CLINICAL_KEY"), $window.scrollTo(0, 0) }), cleanUpNgDialogOpened = $rootScope.$on("ngDialog.opened", function() { $("html").addClass("ngdialog-open") }), cleanUpNgDialogClosing = $rootScope.$on("ngDialog.closing", function() { $("html").removeClass("ngdialog-open") }); $rootScope.$on("$destroy", function() { cleanUpStateChangeSuccess(), cleanUpNgDialogOpened(), cleanUpNgDialogClosing() }) }]);