{"version":3,"file":"app.cb022db3afb0d6633c25.bundle.js","mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACPA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;ACHA;AACA;AACA;AAEA;AACA;AACA;AACA;AAKA;AAEA;AACA;AAGA;AAGA;AAUA;AAAA;AALA;AAMA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAIA;;;;;;AAGA;AACA;;AAAA;AACA;AACA;AACA;AACA;;;;;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAGA;;;;;;AAGA;;;;AAEA;;AAAA;AACA;AACA;;AAAA;;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;AANA;;;;;;AAQA;AAtHA;AADA;AAWA;AAVA;AAuHA;AAAA;AAvHA;;;;;;;;;;;;;;;;;;;;;ACrBA;AACA;AACA;AAEA;AAGA;AAIA;AACA;AACA;AACA;AAGA;;;;;;AAGA;AACA;AACA;AACA;AACA;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;;;AAEA;AACA;;;;;AAEA;AAhDA;AADA;AAKA;AAJA;AAiDA;AAAA;AAjDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACPA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AAAA;AACA;AACA;AAAA;AAEA;AAAA;AAeA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;AClDA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AAIA;AAUA;AAJA;AACA;AAIA;AACA;AACA;AACA;AACA;AAEA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AA/DA;AADA;AAWA;AAVA;AAgEA;AAAA;AAhEA;;;;;;;;;;;;;;;;;;;;;;;;;;ACZA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AAGA;AAGA;AACA;AACA;AACA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA5CA;AADA;AAIA;AAHA;AA6CA;AAAA;AA7CA;;;;;;;;;;;;;;;;;;ACdA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;ACdA;AACA;AACA;AAEA;AAEA;AAEA;AAEA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AAIA;AACA;AACA;AACA;AACA;AAAA;;AAEA;AAoBA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAQA;AAAA;;AAGA;AAiBA;AAfA;AACA;AAEA;AAEA;AAWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAGA;AAAA;AAEA;AACA;AAEA;AACA;AACA;;;AAJA;AAMA;AAAA;AAEA;AACA;AAEA;AACA;AACA;;;AAJA;AAMA;AAAA;AAEA;AACA;AAEA;AACA;AACA;;;AAJA;AAMA;AAAA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAlBA;AAoBA;AAiBA;AAEA;AACA;AApBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAAA;AAOA;AAAA;AACA;AACA;;;AAAA;AAEA;AAAA;AAEA;AACA;;;AAAA;AAEA;AAAA;AAEA;AACA;;;AAAA;AAEA;AAAA;AAEA;AACA;;;AAAA;AAEA;AAAA;AAEA;AACA;;;AAAA;AAEA;AAAA;AAEA;AACA;AAEA;AACA;AACA;;;AAJA;AAMA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAGA;;;;;;;AAIA;AACA;AACA;AACA;AAAA;;AAFA;AAIA;AACA;AACA;AACA;;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;;;;AAIA;AACA;;;;AAIA;AACA;AACA;;;;;AAEA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;;;;;;AAEA;AACA;AACA;AACA;AAAA;AAEA;;;;AAEA;AACA;AACA;AACA;AAAA;;AAHA;AAKA;AAEA;AACA;AACA;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AAAA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;;;;;AAIA;AACA;AACA;;;;;AAEA;AAGA;;;;;;AAEA;AACA;AACA;AAAA;AAEA;;;;AAEA;AACA;AACA;AACA;AAAA;;AAHA;AAKA;AACA;AACA;AACA;;AAAA;AACA;AAEA;;AAAA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;;;;;AAIA;AACA;;;;;AAEA;AAGA;;;;;;AAGA;;;;AAEA;AACA;AACA;AAAA;;AAFA;AAIA;AACA;AACA;;AAAA;AACA;AACA;AACA;AACA;AAEA;;AAAA;AACA;;;;AAIA;AACA;AACA;AACA;;;;;AAEA;AAGA;;;;;;AAEA;AACA;AAAA;AAEA;;;;AAEA;AACA;AACA;AACA;AAAA;;AAHA;AAKA;AACA;AACA;AAEA;;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;;;;;AAIA;AACA;;;;;AAEA;AAGA;;;;;;AAEA;AACA;AACA;AAAA;AAEA;;;;AAEA;AACA;AACA;AACA;AAAA;;AAHA;AAKA;AACA;AACA;AAEA;;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;;;;;AAIA;AACA;;;;;AAEA;AA7WA;AAAA;;;AAGA;AAMA;AAAA;;;AAGA;AAMA;AAAA;;;AAGA;AAMA;AAAA;;;AAGA;AAqCA;AAAA;;;AAGA;AAMA;AAAA;;;AAGA;AAEA;AAAA;;;AAGA;AAEA;AAAA;;;AAGA;AAEA;AAAA;;;AAGA;AAEA;AAAA;;;AAGA;AApIA;AADA;AAkBA;AAjBA;AA+YA;AAAA;AA/YA;;;;;;;;;;;;;;;;ACzFA;AAEA","sources":["webpack://synergyne_aurelia_webapp/./src/clinic-account.ts?fcf7","webpack://synergyne_aurelia_webapp/./src/clinic-analyzes.ts?bca8","webpack://synergyne_aurelia_webapp/./src/clinic-upload.ts?025c","webpack://synergyne_aurelia_webapp/./src/patient-analysis.ts?ab41","webpack://synergyne_aurelia_webapp/./src/home.ts?2240","webpack://synergyne_aurelia_webapp/./src/login.ts?c8ea","webpack://synergyne_aurelia_webapp/./src/css/app.css","webpack://synergyne_aurelia_webapp/./src/css/message-dialog.css","webpack://synergyne_aurelia_webapp/./src/app.html","webpack://synergyne_aurelia_webapp/./src/common/message-dialog.html","webpack://synergyne_aurelia_webapp/./src/app.ts","webpack://synergyne_aurelia_webapp/./src/common/authenticated-step.ts","webpack://synergyne_aurelia_webapp/./src/common/constants.ts","webpack://synergyne_aurelia_webapp/./src/common/message-dialog.ts","webpack://synergyne_aurelia_webapp/./src/common/navbar-tab-prerender-step.ts","webpack://synergyne_aurelia_webapp/./src/main.ts","webpack://synergyne_aurelia_webapp/./src/models/user.ts","webpack://synergyne_aurelia_webapp/./src/resources/index.ts"],"sourcesContent":["module.exports = function(cb) {\n\trequire.ensure([], function(require) {\n\t\tcb(require(\"!!../node_modules/ts-loader/index.js!./clinic-account.ts\"));\n\t}, \"clinic-interface\");\n}","module.exports = function(cb) {\n\trequire.ensure([], function(require) {\n\t\tcb(require(\"!!../node_modules/ts-loader/index.js!./clinic-analyzes.ts\"));\n\t}, \"clinic-interface\");\n}","module.exports = function(cb) {\n\trequire.ensure([], function(require) {\n\t\tcb(require(\"!!../node_modules/ts-loader/index.js!./clinic-upload.ts\"));\n\t}, \"clinic-interface\");\n}","module.exports = function(cb) {\n\trequire.ensure([], function(require) {\n\t\tcb(require(\"!!../node_modules/ts-loader/index.js!./patient-analysis.ts\"));\n\t}, \"clinic-interface\");\n}","module.exports = function(cb) {\n\trequire.ensure([], function(require) {\n\t\tcb(require(\"!!../node_modules/ts-loader/index.js!./home.ts\"));\n\t}, \"home\");\n}","module.exports = function(cb) {\n\trequire.ensure([], function(require) {\n\t\tcb(require(\"!!../node_modules/ts-loader/index.js!./login.ts\"));\n\t}, \"login\");\n}","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\na {\\n cursor: pointer;\\n}\\na.active {\\n background-color: var(--light-primary);\\n}\\nbutton {\\n display: grid;\\n align-content: center;\\n justify-content: center;\\n padding: 0.2rem 0.6rem;\\n}\\nbutton:not(.disabled) {\\n cursor: pointer;\\n}\\nbutton.disabled {\\n opacity: 0.65;\\n pointer-events: none;\\n}\\nbutton.active {\\n background-color: var(--primary);\\n}\\nbutton.warning {\\n background-color: var(--warning);\\n}\\npre {\\n font-family: inherit;\\n}\\ninput.is-invalid, select.is-invalid {\\n border-color: var(--danger);\\n}\\n\\n\\n.error-title {\\n color: var(--danger);\\n}\\n\\n.question-title {\\n color: var(--info);\\n}\\n\\n.success-title {\\n color: var(--success);\\n}\\n\\n.warning-title {\\n color: var(--warning);\\n}\\n\\n.information-title {\\n color: var(--info);\\n}\\n\\n.input-label {\\n font-weight: bold;\\n}\\n.section-label {\\n font-weight: bold;\\n font-size: 1.1rem;\\n}\\n\\n.invisible {\\n visibility: hidden;\\n}\\n.visible {\\n visibility: visible;\\n}\\n\\n\\n#navbar {\\n display: grid;\\n grid-template-columns: 10rem 10rem 10rem 10rem 1fr 7rem 7rem;\\n background-color: var(--primary);\\n color: white;\\n text-align: center;\\n line-height: calc(1.25rem + 2 * 8px);\\n font-family: \\\"Roboto\\\";\\n font-size: 1.25rem;\\n}\\n#navbar > a {\\n text-decoration: none;\\n color: inherit;\\n}\\n#navbar > a:not(.active):hover {\\n color: rgba(255, 255, 255, 0.75);\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/css/app.css\"],\"names\":[],\"mappings\":\";AACA;EACE,eAAe;AACjB;AACA;EACE,sCAAsC;AACxC;AACA;EACE,aAAa;EACb,qBAAqB;EACrB,uBAAuB;EACvB,sBAAsB;AACxB;AACA;EACE,eAAe;AACjB;AACA;EACE,aAAa;EACb,oBAAoB;AACtB;AACA;EACE,gCAAgC;AAClC;AACA;EACE,gCAAgC;AAClC;AACA;EACE,oBAAoB;AACtB;AACA;EACE,2BAA2B;AAC7B;;;AAGA;EACE,oBAAoB;AACtB;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,iBAAiB;AACnB;AACA;EACE,iBAAiB;EACjB,iBAAiB;AACnB;;AAEA;EACE,kBAAkB;AACpB;AACA;EACE,mBAAmB;AACrB;;;AAGA;EACE,aAAa;EACb,4DAA4D;EAC5D,gCAAgC;EAChC,YAAY;EACZ,kBAAkB;EAClB,oCAAoC;EACpC,qBAAqB;EACrB,kBAAkB;AACpB;AACA;EACE,qBAAqB;EACrB,cAAc;AAChB;AACA;EACE,gCAAgC;AAClC\",\"sourcesContent\":[\"\\na {\\n cursor: pointer;\\n}\\na.active {\\n background-color: var(--light-primary);\\n}\\nbutton {\\n display: grid;\\n align-content: center;\\n justify-content: center;\\n padding: 0.2rem 0.6rem;\\n}\\nbutton:not(.disabled) {\\n cursor: pointer;\\n}\\nbutton.disabled {\\n opacity: 0.65;\\n pointer-events: none;\\n}\\nbutton.active {\\n background-color: var(--primary);\\n}\\nbutton.warning {\\n background-color: var(--warning);\\n}\\npre {\\n font-family: inherit;\\n}\\ninput.is-invalid, select.is-invalid {\\n border-color: var(--danger);\\n}\\n\\n\\n.error-title {\\n color: var(--danger);\\n}\\n\\n.question-title {\\n color: var(--info);\\n}\\n\\n.success-title {\\n color: var(--success);\\n}\\n\\n.warning-title {\\n color: var(--warning);\\n}\\n\\n.information-title {\\n color: var(--info);\\n}\\n\\n.input-label {\\n font-weight: bold;\\n}\\n.section-label {\\n font-weight: bold;\\n font-size: 1.1rem;\\n}\\n\\n.invisible {\\n visibility: hidden;\\n}\\n.visible {\\n visibility: visible;\\n}\\n\\n\\n#navbar {\\n display: grid;\\n grid-template-columns: 10rem 10rem 10rem 10rem 1fr 7rem 7rem;\\n background-color: var(--primary);\\n color: white;\\n text-align: center;\\n line-height: calc(1.25rem + 2 * 8px);\\n font-family: \\\"Roboto\\\";\\n font-size: 1.25rem;\\n}\\n#navbar > a {\\n text-decoration: none;\\n color: inherit;\\n}\\n#navbar > a:not(.active):hover {\\n color: rgba(255, 255, 255, 0.75);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"ux-dialog-overlay {\\n background-color: rgba(0, 0, 0, 0.5);\\n}\\nux-dialog-overlay.active {\\n opacity: 1;\\n position: fixed;\\n width: 100vw;\\n height: 100vh;\\n}\\nux-dialog-container {\\n position: fixed;\\n width: 100vw;\\n height: 100vh;\\n display: grid;\\n grid-template-rows: 1fr auto 1fr;\\n grid-template-columns: 1fr auto 1fr;\\n}\\nux-dialog-container > div {\\n grid-row: 2/3;\\n grid-column: 2/3;\\n}\\n\\n#message-ux-dialog {\\n display: grid;\\n grid-template-rows: auto auto auto;\\n background-color: white;\\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\\n padding: 1rem;\\n}\\n\\n/* Based on bootstrap H4 */\\n#message-dialog-header {\\n font-size: 1.5rem;\\n line-height: 2rem;\\n padding-left: 1rem;\\n}\\n\\n#message-ux-dialog-body {\\n padding-top: 0;\\n padding-bottom: 0;\\n display: grid;\\n}\\n\\n#message-dialog-footer {\\n display: grid;\\n justify-content: center;\\n grid-template-columns: auto auto;\\n column-gap: 1rem;\\n}\\n\\n#message-dialog-footer > button {\\n margin: 0.5rem 0 0.5rem 0;\\n}\\n\\n#message-dialog-primary-button {\\n background-color: var(--primary);\\n}\\n\\n#message-dialog-secondary-button {\\n background-color: var(--grey);\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/css/message-dialog.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,oCAAoC;AACtC;AACA;EACE,UAAU;EACV,eAAe;EACf,YAAY;EACZ,aAAa;AACf;AACA;EACE,eAAe;EACf,YAAY;EACZ,aAAa;EACb,aAAa;EACb,gCAAgC;EAChC,mCAAmC;AACrC;AACA;EACE,aAAa;EACb,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,kCAAkC;EAClC,uBAAuB;EACvB,yCAAyC;EACzC,aAAa;AACf;;AAEA,0BAA0B;AAC1B;EACE,iBAAiB;EACjB,iBAAiB;EACjB,kBAAkB;AACpB;;AAEA;EACE,cAAc;EACd,iBAAiB;EACjB,aAAa;AACf;;AAEA;EACE,aAAa;EACb,uBAAuB;EACvB,gCAAgC;EAChC,gBAAgB;AAClB;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,gCAAgC;AAClC;;AAEA;EACE,6BAA6B;AAC/B\",\"sourcesContent\":[\"ux-dialog-overlay {\\n background-color: rgba(0, 0, 0, 0.5);\\n}\\nux-dialog-overlay.active {\\n opacity: 1;\\n position: fixed;\\n width: 100vw;\\n height: 100vh;\\n}\\nux-dialog-container {\\n position: fixed;\\n width: 100vw;\\n height: 100vh;\\n display: grid;\\n grid-template-rows: 1fr auto 1fr;\\n grid-template-columns: 1fr auto 1fr;\\n}\\nux-dialog-container > div {\\n grid-row: 2/3;\\n grid-column: 2/3;\\n}\\n\\n#message-ux-dialog {\\n display: grid;\\n grid-template-rows: auto auto auto;\\n background-color: white;\\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\\n padding: 1rem;\\n}\\n\\n/* Based on bootstrap H4 */\\n#message-dialog-header {\\n font-size: 1.5rem;\\n line-height: 2rem;\\n padding-left: 1rem;\\n}\\n\\n#message-ux-dialog-body {\\n padding-top: 0;\\n padding-bottom: 0;\\n display: grid;\\n}\\n\\n#message-dialog-footer {\\n display: grid;\\n justify-content: center;\\n grid-template-columns: auto auto;\\n column-gap: 1rem;\\n}\\n\\n#message-dialog-footer > button {\\n margin: 0.5rem 0 0.5rem 0;\\n}\\n\\n#message-dialog-primary-button {\\n background-color: var(--primary);\\n}\\n\\n#message-dialog-secondary-button {\\n background-color: var(--grey);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Module\nvar code = \"\\n \\n \\n \\n ${row.title}\\n \\n Research\\n \\n Logout\\n \\n \\n Matris™\\n \\n \\n \\n\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n \\n \\n ${title}\\n \\n ${subTitle}\\n ${line}\\n \\n \\n \\n \\n\\n\";\n// Exports\nexport default code;","import {DialogService} from \"aurelia-dialog\";\nimport {EventAggregator} from \"aurelia-event-aggregator\";\nimport {inject, LogManager, PLATFORM} from \"aurelia-framework\";\nimport {Router, RouterConfiguration, RouteConfig} from \"aurelia-router\";\nimport {UserType} from \"./models/user\";\nimport \"whatwg-fetch\";\nimport {AuthenticatedStep} from \"./common/authenticated-step\";\nimport {MessageDialog, MessageDialogType} from \"./common/message-dialog\";\n// import {CLINIC_ACCOUNT_ROUTE_NAME, CLINIC_ANALYSES_ROUTE_NAME, CLINIC_UPLOAD_ROUTE_NAME, HOME_ROUTE_NAME, LOGIN_ROUTE_NAME,\n// NavbarTabPrerenderStep, PATIENT_ANALYSIS_ROUTE_NAME, STAFF_ACCOUNT_CREATE_CLINIC_NAME, STAFF_ACCOUNT_CREATE_CLINIC_ROUTE,\n// STAFF_ACCOUNT_CREATE_USER_NAME, STAFF_ACCOUNT_CREATE_USER_ROUTE, STAFF_ACCOUNT_MAINTENANCE_NAME, STAFF_ACCOUNT_MAINTENANCE_ROUTE,\n// STAFF_ACCOUNT_MODIFY_CLINIC_NAME, STAFF_ACCOUNT_MODIFY_CLINIC_ROUTE, STAFF_ACCOUNT_MODIFY_USER_NAME, STAFF_ACCOUNT_MODIFY_USER_ROUTE} from \"./common/navbar-tab-prerender-step\";\nimport {CLINIC_ACCOUNT_ROUTE_NAME, CLINIC_ANALYSES_ROUTE_NAME, CLINIC_UPLOAD_ROUTE_NAME, HOME_ROUTE_NAME, LOGIN_ROUTE_NAME,\n NavbarTabPrerenderStep, PATIENT_ANALYSIS_ROUTE_NAME} from \"./common/navbar-tab-prerender-step\";\nimport environment from \"../config/environment.json\";\nimport {User} from \"./models/user\";\n\n\nlet logger = LogManager.getLogger(\"logger\");\n\n@inject(User, EventAggregator, DialogService)\nexport class App {\n private user: User;\n private router: Router;\n private eventAggregator: EventAggregator;\n private dialogService: DialogService;\n private DEFAULT_USER = UserType.DEFAULT_USER;\n private intervalHandler: any;\n isResearchUrl: boolean;\n\n\n constructor(user: User, eventAggregator: EventAggregator, dialogService: DialogService) {\n this.user = user;\n this.eventAggregator = eventAggregator;\n this.dialogService = dialogService;\n logger.debug(\"App.constructor:\", this, this.user, this.DEFAULT_USER);\n this.isResearchUrl = RegExp(environment.researchUrlRegex).test(window.location.hostname);\n\n this.eventAggregator.subscribe(environment.refreshTimerChannel, (start: boolean) => {\n logger.debug(\"App.eventAggregator:\", environment.refreshTimerChannel, start);\n if (start) {\n this.intervalHandler = setInterval(() => {\n logger.debug(\"App.interval:\");\n this.eventAggregator.publish(environment.refreshViewChannel, true);\n }, environment.refreshViewDelay);\n } else {\n clearInterval(this.intervalHandler);\n }\n });\n }\n\n\n // @ts-ignore\n async activate(params: any, routeConfig: RouteConfig) {\n let result: boolean;\n\n logger.debug(\"App.activate1:\");\n result = await this.user.isAuthenticated();\n if (result) {\n logger.debug(\"App.activate2: restarting refresh timer\");\n this.eventAggregator.publish(environment.refreshTimerChannel, true);\n }\n }\n\n\n configureRouter(config: RouterConfiguration, router: Router) {\n logger.debug(\"App.configureRouter:\", this, this.user, HOME_ROUTE_NAME);\n this.router = router;\n config.title = \"Synergyne\";\n config.addPipelineStep(\"authorize\", AuthenticatedStep);\n config.addPipelineStep(\"preRender\", NavbarTabPrerenderStep);\n config.mapUnknownRoutes({route: \"unknown\", redirect: \"#/\"});\n // Note: A literal string must be used with PLATFORM.moduleName\n config.map([\n {\n route: [\"\", \"home\"],\n name: HOME_ROUTE_NAME,\n moduleId: PLATFORM.moduleName(\"home\", \"home\"),\n nav: false,\n settings: {secured: true, displayPage: false}},\n {\n route: \"login\",\n name: LOGIN_ROUTE_NAME,\n moduleId: PLATFORM.moduleName(\"login\", \"login\"),\n nav: true,\n title: \"Login\",\n settings: {secured: false, displayPage: false}},\n {\n route: \"clinic/analyses\",\n name: CLINIC_ANALYSES_ROUTE_NAME,\n moduleId: PLATFORM.moduleName(\"clinic-analyzes\", \"clinic-interface\"),\n nav: true,\n title: \"Analyses\",\n settings: {secured: true, displayPage: false}},\n {\n route: \"clinic/upload\",\n name: CLINIC_UPLOAD_ROUTE_NAME,\n moduleId: PLATFORM.moduleName(\"clinic-upload\", \"clinic-interface\"),\n nav: true,\n title: \"New Upload\",\n settings: {secured: true, displayPage: false}},\n {\n route: \"clinic/account\",\n name: CLINIC_ACCOUNT_ROUTE_NAME,\n moduleId: PLATFORM.moduleName(\"clinic-account\", \"clinic-interface\"),\n nav: true,\n title: \"Account\",\n settings: {secured: true, displayPage: false}},\n {\n route: \"clinic/analysis/:analysisId?\",\n href: \"#/clinic/analysis\",\n name: PATIENT_ANALYSIS_ROUTE_NAME,\n moduleId: PLATFORM.moduleName(\"patient-analysis\", \"clinic-interface\"),\n nav: true,\n title: \"Patient Analysis\",\n settings: {secured: true, displayPage: false}},\n ]);\n }\n\n\n async logout() {\n let response: boolean;\n\n logger.debug(\"App.logout1:\", this.user, this.user.loginType);\n try {\n response = await this.user.logout();\n logger.debug(\"App.logout2:\", response);\n await this.router.navigateToRoute(\"login\");\n }\n catch (reason) {\n logger.debug(\"App.logout4:\", reason.message);\n await this.dialogService.open({viewModel: MessageDialog,\n model: {\n type: MessageDialogType.error,\n twoButton: false,\n title: \"Logout Failed\",\n subTitle: \"The logout failed with the message:\",\n message: reason.message}});\n }\n }\n}\n","import {inject, LogManager} from \"aurelia-framework\";\nimport {NavigationInstruction, Next, Redirect} from \"aurelia-router\";\nimport {User, UserType} from \"../models/user\";\n// import { STAFF_ACCOUNT_MAINTENANCE_ROUTE } from \"./navbar-tab-prerender-step\";\nlet logger = LogManager.getLogger(\"logger\");\n\n@inject(User)\nexport class AuthenticatedStep {\n user: User;\n\n\n constructor(user: User) {\n logger.debug(\"AuthenticatedStep.constructor:\", user);\n this.user = user;\n }\n\n\n async run(instruction: NavigationInstruction, next: Next) {\n let authenticated: Boolean;\n\n logger.debug(\"AuthenticatedStep.run1:\");\n let isRouteSecured = instruction.getAllInstructions().some((i) => i.config.settings.secured);\n logger.debug(\"AuthenticatedStep.run2:\", isRouteSecured, instruction.config.name);\n if (isRouteSecured) {\n authenticated = await this.user.isAuthenticated();\n logger.debug(\"AuthenticatedStep.run3:\", this.user.loginType, authenticated);\n if (authenticated) {\n if (instruction.config.name !== \"home\") {\n logger.debug(\"AuthenticatedStep.run4:\");\n return next();\n }\n else {\n switch (this.user.loginType) {\n case UserType.CLINIC_USER:\n logger.debug(\"AuthenticatedStep.run5:\");\n return next.cancel(new Redirect(\"clinic/analyses\"));\n\n case UserType.STAFF_USER:\n case UserType.ANALYSIS_USER:\n case UserType.REVIEW_USER:\n return next.cancel(new Redirect(window.location.origin + '/synadmin'));\n\n case UserType.DEFAULT_USER:\n logger.debug(\"AuthenticatedStep.run7:\");\n return next.cancel(new Redirect(\"login\"));\n }\n }\n } else {\n logger.debug(\"AuthenticatedStep.run8: \", this.user.loginType, authenticated);\n return next.cancel(new Redirect(\"login\"));\n }\n } else {\n logger.debug(\"AuthenticatedStep.run9:\");\n return next();\n }\n }\n}\n","export const INVALID_EMAIL_ADDRESS = \"invalidEmail\";\n\nexport const CycleTypeStrings = [\"fresh\", \"frozen\", \"natural\", \"naturalfet\"];\nexport const EmbryoTypeStrings = [\"notReported\", \"patientEmbryo\", \"donorEmbryo\", \"donorOocyte\"];\nexport const AcceptMimeTypesStrings = [\"image/png\", \"image/jpeg\", \"image/tiff\"];\n\nexport const AccountTokenName = \"account-token\";\nexport const AnalysisImagesTokenName = \"analysisImages\";\nexport const BillableTokenName = \"billable\";\nexport const ClinicCommentTokenName = \"clinicComment\";\nexport const ClinicIdTokenName = \"clinicId\";\nexport const CycleTypeTokenName = \"cycleType\";\nexport const EmbryoTypeTokenName = \"embryoType\"\nexport const DateOfBirthTokenName = \"dateOfBirth\";\nexport const DoctorTokenName = \"doctor\";\nexport const PatientIdTokenName = \"patientId\";\n\nexport const BadRequestStatusCode = 400;\nexport const UnauthorizedStatusCode = 401;\nexport const NotFoundStatusCode = 404;\nexport const InternalServerErrorStatusCode = 500;\nexport const InternalServerErrorStatusText = \"InternalServerError\";\n\nexport const AccountDisabledStatusText = \"AccountDisabled\";\nexport const ExtraAuthRequiredStatusText = \"ExtraAuth\";\nexport const MaximumFailedLoginAttemptsExceededStatusText = \"MaxLogins\";\nexport const UnauthorizedStatusText = \"Unauthorized\";\nexport const NotFoundStatusText = \"NotFoundError\";\nexport const InvalidUserPWStatusText = \"InvalidUserPW\";\n\n\nexport enum SortBy {\n SUBMIT_DATE,\n PATIENT_ID}\n\nexport class AnalysisObject {\n id: string;\n submitDate: string;\n patientId: string;\n dateOfBirth: string;\n doctor: string;\n reviewDate: string;\n status: string;\n matrisScore: number;\n blinded: boolean;\n clinicComment: string;\n reviewClinicComment: string;\n reviewComment: string;\n isBillable: boolean;\n imageCount: number;\n}\n","import {DialogController} from \"aurelia-dialog\";\nimport {inject} from \"aurelia-framework\";\n\nexport enum MessageDialogType {\n error,\n question,\n success,\n warning,\n information}\n\n\n@inject(DialogController)\nexport class MessageDialog {\n controller: DialogController;\n title: string;\n subTitle: string;\n message: string[];\n twoButtons: boolean;\n okButtonString = \"Ok\";\n cancelButtonString = \"Cancel\";\n titleClass: string;\n\n constructor(controller: DialogController) {\n this.controller = controller;\n this.controller.settings.overlayDismiss = false;\n this.controller.settings.keyboard = [\"Escape\"];\n this.controller.settings.centerHorizontalOnly = true;\n }\n\n activate(value: {title: string, subTitle: string, message: string,\n twoButtons: boolean, okButtonString: string, cancelButtonString: string,\n type: MessageDialogType, overlayClickDismiss: boolean}) {\n this.title = value.title;\n this.subTitle = value.subTitle;\n this.message = value.message.split(\"\\n\");\n this.twoButtons = value.twoButtons;\n if (value.okButtonString) {\n this.okButtonString = value.okButtonString;\n }\n if (value.cancelButtonString) {\n this.cancelButtonString = value.cancelButtonString;\n }\n if (value.overlayClickDismiss) {\n this.controller.settings.overlayDismiss = true;\n }\n\n switch (value.type) {\n case MessageDialogType.error:\n this.titleClass = \"fa fa-lg fa-minus-circle error-title\";\n break;\n\n case MessageDialogType.question:\n this.titleClass = \"fa fa-lg fa-question-circle question-title\";\n break;\n\n case MessageDialogType.success:\n this.titleClass = \"fa fa-lg fa-check-circle success-title\";\n break;\n\n case MessageDialogType.warning:\n this.titleClass = \"fa fa-lg fa-exclamation-circle warning-title\";\n break;\n\n case MessageDialogType.information:\n this.titleClass = \"fa fa-lg fa-info-circle information-title\";\n break;\n\n default:\n this.titleClass = \"fa fa-lg fa-info-circle information-title\";\n break;\n }\n }\n\n click() {\n console.log(\"abcd\");\n }\n}\n","import {inject, LogManager} from \"aurelia-framework\";\nimport {NavigationInstruction, Next} from \"aurelia-router\";\nimport {User, UserType} from \"../models/user\";\n\nexport let HOME_ROUTE_NAME = \"home\";\nexport let LOGIN_ROUTE_NAME = \"login\";\nexport let CLINIC_ANALYSES_ROUTE_NAME = \"clinic-analyses\";\nexport let CLINIC_UPLOAD_ROUTE_NAME = \"clinic-upload\";\nexport let CLINIC_ACCOUNT_ROUTE_NAME = \"clinic-account\";\nexport let PATIENT_ANALYSIS_ROUTE_NAME = \"patient-analysis\";\n\n\nlet logger = LogManager.getLogger(\"logger\");\n\n@inject(User)\nexport class NavbarTabPrerenderStep {\n user: User;\n\n constructor(user: User) {\n logger.debug(\"NavbarTabPrerenderStep.constructor:\", user);\n this.user = user;\n }\n\n run(instruction: NavigationInstruction, next: Next) {\n logger.debug(\"NavbarTabPrerenderStep.run:\", this.user.loginType, this.user.loginName);\n instruction.router.routes.forEach((route) => {\n switch (route.name) {\n case HOME_ROUTE_NAME:\n route.settings.displayPage = false;\n break;\n\n case LOGIN_ROUTE_NAME:\n route.settings.displayPage = (route.name === instruction.config.name);\n break;\n\n case CLINIC_ANALYSES_ROUTE_NAME:\n route.settings.displayPage = (this.user.loginType === UserType.CLINIC_USER);\n break;\n\n case CLINIC_UPLOAD_ROUTE_NAME:\n route.settings.displayPage = ((this.user.loginType === UserType.CLINIC_USER) && !this.user.isReadOnly);\n break;\n\n case CLINIC_ACCOUNT_ROUTE_NAME:\n route.settings.displayPage = (this.user.loginType === UserType.CLINIC_USER);\n break;\n\n case PATIENT_ANALYSIS_ROUTE_NAME:\n route.settings.displayPage = ((this.user.loginType === UserType.CLINIC_USER) && (route.name === instruction.config.name));\n break;\n\n default:\n route.settings.displayPage = true;\n logger.debug(\"NavbarTabPrerenderStep.run: default match\");\n break;\n }\n logger.debug(\"NavbarTabPrerenderStep.run:\", route.route, route.name, route.settings.displayPage);\n });\n return next();\n }\n}\n","import {Aurelia} from 'aurelia-framework';\nimport environment from '../config/environment.json';\nimport {PLATFORM} from 'aurelia-pal';\n\nexport function configure(aurelia: Aurelia): void {\n aurelia.use\n .standardConfiguration()\n .feature(PLATFORM.moduleName('resources/index'));\n\n aurelia.use.developmentLogging(environment.debug ? 'debug' : 'warn');\n\n aurelia.use.plugin(PLATFORM.moduleName('aurelia-dialog'), config => {config.useDefaults; config.useCSS('');});\n\n aurelia.start().then(() => aurelia.setRoot(PLATFORM.moduleName('app')));\n}\n","import {computedFrom} from \"aurelia-binding\";\nimport {HttpClient, HttpClientConfiguration} from \"aurelia-fetch-client\";\nimport {inject, LogManager, NewInstance} from \"aurelia-framework\";\nimport {Clinic} from \"./clinic\";\nimport {AccountTokenName, BadRequestStatusCode, ExtraAuthRequiredStatusText,\n MaximumFailedLoginAttemptsExceededStatusText, UnauthorizedStatusCode, UnauthorizedStatusText, INVALID_EMAIL_ADDRESS} from \"../common/constants\";\nimport environment from \"../../config/environment.json\";\n\nlet logger = LogManager.getLogger(\"logger\");\n\nexport enum UserType {\n CLINIC_USER,\n STAFF_USER,\n ANALYSIS_USER,\n REVIEW_USER,\n DEFAULT_USER}\n\nexport class ServerAuthResponse {\n isAuthenticated: boolean;\n errorMessage: string;\n\n constructor(isAuthenticated: boolean, errorMessage: string) {\n this.isAuthenticated = isAuthenticated;\n this.errorMessage = errorMessage;\n }\n}\n\nexport class AuthenticatedUser {\n loginName: string;\n loginType: UserType;\n trainee: boolean;\n email: string;\n cellNumber: string;\n readOnly: boolean;\n disabled: boolean;\n clinics: Clinic[];\n accountMaintenancePriv: boolean;\n summaryCSVPriv: boolean;\n weeklyReportPriv: boolean;\n salesReportPriv: boolean;\n invoicePriv: boolean;\n analysisAccessPriv: boolean;\n clinicFilePriv: boolean;\n staffFilePriv: boolean;\n authenticated: boolean;\n errorMessage: string;\n\n constructor(loginName: string = \"\", loginType: string = \"\", email: string = \"\", cellNumber: string = \"\",\n readonly: boolean = true, disabled: boolean = true, trainee: boolean = true, clinics: Clinic[] = []) {\n this.loginName = loginName;\n // this.loginType = this.findUserTypeString(loginType);\n this.trainee = trainee;\n this.email = email;\n this.cellNumber = cellNumber;\n this.readOnly = readonly;\n this.disabled = disabled;\n this.clinics = clinics;\n this.accountMaintenancePriv = false;\n this.summaryCSVPriv = false;\n this.weeklyReportPriv = false;\n this.salesReportPriv = false;\n this.invoicePriv = false;\n this.analysisAccessPriv = false;\n this.clinicFilePriv = false;\n this.staffFilePriv = false;\n this.authenticated = false;\n this.errorMessage = \"\";\n\n // if (this.loginType === undefined) this.loginType = UserType.DEFAULT_USER;\n }\n\n setPrivileges(user: AuthenticatedUser) {\n this.accountMaintenancePriv = user.accountMaintenancePriv;\n this.summaryCSVPriv = user.summaryCSVPriv;\n this.weeklyReportPriv = user.weeklyReportPriv;\n this.salesReportPriv = user.salesReportPriv;\n this.invoicePriv = user.invoicePriv;\n this.analysisAccessPriv = user.analysisAccessPriv;\n this.clinicFilePriv = user.clinicFilePriv;\n this.staffFilePriv = user.staffFilePriv;\n }\n\n // TODO: not used\n // findUserTypeString(userType: string): UserType {\n // let ttt: UserType;\n // ttt = userTypeMap[userType];\n // return ttt;\n // }\n}\n\n@inject(NewInstance.of(HttpClient))\nexport class User {\n private http: HttpClient;\n private authenticated: boolean = false;\n private authenticationChecked: boolean = false;\n private _loginName: string;\n private _loginType: UserType = UserType.DEFAULT_USER;\n private _email: string;\n private _selectedClinic: number = 0;\n private _clinicName: string;\n private _clinicId: string;\n private _clinicNumber: string;\n private _clinicDoctors: string;\n private _doesOHIPFundingApply: boolean;\n private _clinics: Clinic[];\n private _readOnly: boolean;\n private _accountMaintenancePriv: boolean;\n\n constructor(http: HttpClient) {\n logger.debug(\"User.constructor:\");\n this.http = http.configure((c: HttpClientConfiguration) => {\n c\n .withBaseUrl(window.location.protocol + \"//\" + window.location.host + environment.userUrl)\n .withDefaults({\n credentials: environment.fetchRequestCredentials,\n headers: {\n \"Accept\": \"application/json\",\n \"X-Requested-With\": \"Fetch\"}});\n });\n this.clearAuthentication();\n this.clinics = [];\n }\n\n\n @computedFrom(\"_loginName\")\n get loginName(): string {\n return this._loginName;\n }\n\n set loginName(value: string) {\n this._loginName = value;\n }\n\n @computedFrom(\"_loginType\")\n get loginType(): UserType {\n return this._loginType;\n }\n\n set loginType(value: UserType) {\n this._loginType = value;\n }\n\n @computedFrom(\"_email\")\n get email(): string {\n return this._email;\n }\n\n set email(value: string) {\n this._email = value;\n }\n\n @computedFrom(\"_clinics\")\n get clinics(): Clinic[] {\n return this._clinics;\n }\n\n set clinics(value: Clinic[]) {\n if (value && (value.length !== 0)) {\n this._clinics = Object.assign(new Array(), value);\n this._clinicName = this._clinics[this._selectedClinic].clinicName;\n this._clinicId = this._clinics[this._selectedClinic].clinicId;\n this._clinicNumber = this._clinics[this._selectedClinic].clinicNumber;\n this._clinicDoctors = this._clinics[this._selectedClinic].clinicDoctors;\n this._doesOHIPFundingApply = this._clinics[this._selectedClinic].doesOHIPFundingApply;\n } else {\n this._clinics = [];\n this._clinicName = \"\";\n this._clinicId = \"\";\n this._clinicNumber = \"\";\n this._clinicDoctors = \"\";\n this._doesOHIPFundingApply = false;\n }\n }\n\n set selectedClinic(value: number) {\n this._selectedClinic = value;\n if (this._clinics.length !== 0) {\n this._clinicName = this._clinics[this._selectedClinic].clinicName;\n this._clinicId = this._clinics[this._selectedClinic].clinicId;\n this._clinicNumber = this._clinics[this._selectedClinic].clinicNumber;\n this._clinicDoctors = this._clinics[this._selectedClinic].clinicDoctors;\n this._doesOHIPFundingApply = this._clinics[this._selectedClinic].doesOHIPFundingApply;\n } else {\n this._clinicName = \"\";\n this._clinicId = \"\";\n this._clinicNumber = \"\";\n this._clinicDoctors = \"\";\n this._doesOHIPFundingApply = false;\n }\n }\n\n @computedFrom(\"_selectedClinic\")\n get selectedClinic(): number {\n return this._selectedClinic;\n }\n\n get clinicId(): string {\n return this._clinicId;\n }\n\n @computedFrom(\"_clinicName\")\n get clinicName(): string {\n return this._clinicName;\n }\n\n @computedFrom(\"_clinicNumber\")\n get clinicNumber(): string {\n return this._clinicNumber;\n }\n\n @computedFrom(\"_clinicDoctors\")\n get clinicDoctors(): string {\n return this._clinicDoctors;\n }\n\n @computedFrom(\"_doesOHIPFundingApply\")\n get doesOHIPFundingApply(): boolean {\n return this._doesOHIPFundingApply;\n }\n\n @computedFrom(\"_readOnly\")\n get isReadOnly(): boolean {\n return this._readOnly;\n }\n\n set isReadOnly(value: boolean) {\n this._readOnly = value;\n }\n\n hasAccountMaintenancePriv(): boolean {\n return this._accountMaintenancePriv;\n }\n\n setAccountMaintenancePriv(value: boolean) {\n this._accountMaintenancePriv = value;\n }\n\n setBaseUrl(url: string) {\n this.http.baseUrl = url + environment.userUrl;\n }\n\n genHeaders(): {} {\n let headers = new Headers();\n // Have to use literal values for the keys\n headers.append(\"Content-Type\", \"application/json\");\n headers.append(\"account-token\", sessionStorage.getItem(AccountTokenName)!);\n return headers;\n }\n\n\n async isAuthenticated() {\n let response: Response;\n\n try {\n if (!this.authenticationChecked) {\n response = await this.http.fetch(environment.isAuthenticatedUrl, {\n method: \"get\",\n headers: { \"Content-Type\": \"application/json\" }});\n\n logger.debug(\"User.isAuthenticated1:\", response.status);\n if (response.ok) {\n let authenticatedUser: AuthenticatedUser;\n authenticatedUser = await response.json();\n // let authenticatedUser: AuthenticatedUser = Object.assign(new AuthenticatedUser(), data);\n logger.debug(\"User.isAuthenticated2:\", authenticatedUser);\n this.authenticated = authenticatedUser.authenticated;\n this.authenticationChecked = true;\n this.loginName = authenticatedUser.loginName;\n this.loginType = authenticatedUser.loginType;\n this.email = authenticatedUser.email;\n this.clinics = authenticatedUser.clinics;\n this.isReadOnly = authenticatedUser.readOnly;\n this._accountMaintenancePriv = authenticatedUser.accountMaintenancePriv;\n return this.authenticated;\n } else {\n let statusText = await response.text();\n if (response.status === UnauthorizedStatusCode) {\n throw new Error(UnauthorizedStatusText);\n } else {\n throw new Error(`${response.status} : ${statusText}`);\n }\n }\n }\n else {\n logger.debug(\"User.isAuthenticated3:\", this.authenticated);\n return this.authenticated;\n }\n }\n catch (reason) {\n logger.debug(\"User.isAuthenticated4:\", reason.message);\n this.clearAuthentication();\n throw reason;\n }\n}\n\n\n clearAuthentication() {\n logger.debug(\"User.clearAuthentication:\");\n this.authenticated = false;\n this.authenticationChecked = false;\n this.loginType = UserType.DEFAULT_USER;\n this.isReadOnly = true;\n }\n\n\n async login(userName: string, password: string, extraAuthCode?: string) {\n let response: Response;\n const cred = {\n userName: userName,\n password: password,\n code: extraAuthCode};\n\n logger.debug(\"User.login1:\", userName, password, extraAuthCode);\n try {\n response = await this.http.fetch(environment.loginUrl, {\n method: \"post\",\n body: JSON.stringify(cred),\n headers: { \"Content-Type\": \"application/json\" }});\n\n logger.debug(\"User.login2:\", response.status);\n\n if (response.ok) {\n let data: any;\n data = await response.json();\n let authenticatedUser: AuthenticatedUser = Object.assign(new AuthenticatedUser(), data[1]);\n sessionStorage.setItem(AccountTokenName, data[0]);\n logger.debug(\"User.login3:\", authenticatedUser, authenticatedUser.loginName, authenticatedUser.errorMessage);\n this.authenticated = authenticatedUser.authenticated;\n this.authenticationChecked = true;\n this.loginName = authenticatedUser.loginName;\n this.loginType = authenticatedUser.loginType;\n this.email = authenticatedUser.email;\n this.clinics = authenticatedUser.clinics;\n this.isReadOnly = authenticatedUser.readOnly;\n this.setAccountMaintenancePriv(authenticatedUser.accountMaintenancePriv);\n return new ServerAuthResponse(this.authenticated, authenticatedUser.errorMessage);\n } else {\n let statusText = await response.text();\n if (response.status === UnauthorizedStatusCode) {\n if ((statusText === ExtraAuthRequiredStatusText) || (statusText === MaximumFailedLoginAttemptsExceededStatusText)) {\n throw new Error(statusText);\n } else {\n throw new Error(UnauthorizedStatusText);\n }\n } else {\n throw new Error(statusText);\n }\n }\n }\n catch (reason) {\n logger.debug(\"User.login4:\", reason.message);\n this.clearAuthentication();\n throw reason;\n }\n }\n\n\n async requestCode(userName: string, password: string) {\n let response: Response;\n const cred = {\n userName: userName,\n password: password};\n\n logger.debug(\"User.requestCode1:\", userName, password);\n try {\n response = await this.http.fetch(environment.requestCodeUrl, {\n method: \"post\",\n body: JSON.stringify(cred),\n headers: {\"Content-Type\": \"application/json\"}});\n\n logger.debug(\"User.requestCode2:\");\n if (response.ok) {\n let data: boolean;\n data = await response.json();\n return data;\n } else {\n let statusText = await response.text();\n if (response.status === UnauthorizedStatusCode) {\n if ((statusText === ExtraAuthRequiredStatusText) || (statusText === MaximumFailedLoginAttemptsExceededStatusText)) {\n throw new Error(statusText);\n } else {\n throw new Error(UnauthorizedStatusText);\n }\n } else {\n throw new Error(statusText);\n }\n }\n }\n catch (reason) {\n logger.debug(\"User.requestCode3:\", reason.message);\n throw reason;\n }\n }\n\n\n async logout() {\n let response: Response;\n\n logger.debug(\"User.logout1\");\n try {\n response = await this.http.fetch(environment.logoutUrl, {\n method: \"get\",\n headers: { \"Content-Type\": \"application/json\" }});\n\n if (response.ok) {\n let data: any;\n data = await response.json();\n this.authenticated = false;\n this.authenticationChecked = false;\n this.loginType = UserType.DEFAULT_USER;\n return data;\n } else {\n let statusText = await response.text();\n throw new Error(statusText);\n }\n }\n catch (reason) {\n logger.debug(\"User.logout2:\", reason.message);\n this.authenticated = false;\n this.authenticationChecked = false;\n throw new Error(\"Communication with the server failed\");\n }\n }\n\n\n async changeEmail(newEmail: string) {\n let response: Response;\n const data = {\n email: newEmail};\n\n logger.debug(\"User.changeEmail:\", newEmail);\n try {\n response = await this.http.fetch(environment.changeEmailUrl, {\n method: \"post\",\n body: JSON.stringify(data),\n headers: this.genHeaders()});\n\n logger.debug(\"User.changeEmail2:\", response.status);\n if (response.ok) {\n return;\n } else {\n let statusText = await response.text();\n if (response.status === UnauthorizedStatusCode) {\n throw new Error(UnauthorizedStatusText);\n } else if (response.status === BadRequestStatusCode) {\n throw new Error(INVALID_EMAIL_ADDRESS);\n } else {\n throw new Error(`${response.status} : ${statusText}`);\n }\n }\n }\n catch (reason) {\n logger.debug(\"User.changeEmail3:\", reason.message);\n throw reason;\n }\n }\n\n\n async changePassword(curPass: string, newPass: string) {\n let response: Response;\n const data = {\n curPass: curPass,\n newPass: newPass};\n\n logger.debug(\"User.changePassword1:\", curPass, newPass);\n try {\n response = await this.http.fetch(environment.changePasswordUrl, {\n method: \"post\",\n body: JSON.stringify(data),\n headers: this.genHeaders()});\n\n logger.debug(\"User.changePassword2:\", response.status);\n if (response.ok) {\n return;\n } else {\n let statusText = await response.text();\n if (response.status === UnauthorizedStatusCode) {\n throw new Error(UnauthorizedStatusText);\n } else if (response.status === BadRequestStatusCode) {\n throw new Error(statusText);\n } else {\n throw new Error(`${response.status} : ${statusText}`);\n }\n }\n }\n catch (reason) {\n logger.debug(\"User.changePassword3:\", reason.message);\n throw reason;\n }\n }\n}\n","import {FrameworkConfiguration} from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration): void {\n //config.globalResources([]);\n}\n"],"names":[],"sourceRoot":""}
${subTitle}