{"version":3,"sources":["webpack:///dist/app.c49420e8f9280dc70662.js","webpack:///./src/app/core/theme.service.ts","webpack:///./src/app/core/validation-helper.service.ts","webpack:///./src/app/shared/shared.module.ts","webpack:///./src/app/auth/auth-guard.service.ts","webpack:///./src/app/core/role.const.ts","webpack:///./src/app/admin/shared/user.service.ts","webpack:///./src/app/auth/change-password-dialog/change-password-dialog.component.ts","webpack:///./src/app/enquiry/shared/enquiry.service.ts","webpack:///./src/app/enquiry/shared/document.service.ts","webpack:///./src/app/enquiry/shared/email.service.ts","webpack:///./src/app/admin/theme-settings/theme-settings.component.ts","webpack:///./src/app/admin/user-detail/user-detail.component.ts","webpack:///./src/app/core/confirm-dialog/confirm-dialog.component.ts","webpack:///./src/app/admin/user-list/user-list.component.ts","webpack:///./src/app/login/login.component.ts","webpack:///./src/app/app-version.ts","webpack:///./src/app/perspective/perspective.component.ts","webpack:///./src/app/perspective/introducer-search.service.ts","webpack:///./src/app/enquiry/enquiry-detail/enquiry-detail.component.ts","webpack:///./src/app/enquiry/download-quote-dialog/download-quote-dialog.component.ts","webpack:///./src/app/enquiry/email-enquiry-dialog/email-enquiry-dialog.component.ts","webpack:///./src/app/enquiry/enquiry-list/enquiry-list.component.ts","webpack:///./src/app/enquiry/email-history-dialog/email-history-dialog.component.ts","webpack:///./src/app/core/snack-bar.service.ts","webpack:///./src/main.ts","webpack:///./src/app/app.module.ts","webpack:///./node_modules/@angular/common/locales/en-AU.js","webpack:///./src/app/admin/admin.module.ts","webpack:///./src/app/admin/admin-routing.module.ts","webpack:///./src/app/admin/theme-settings/theme-settings.component.html","webpack:///./src/app/admin/theme-settings/theme-settings.component.css","webpack:///./src/app/core/confirm-dialog/confirm-dialog.component.html","webpack:///./src/app/admin/user-detail/user-detail.component.html","webpack:///./src/app/admin/user-detail/user-detail.component.css","webpack:///./src/app/admin/user-list/user-list.component.html","webpack:///./src/app/admin/user-list/user-list.component.css","webpack:///./src/app/shared/faw-material.module.ts","webpack:///./src/app/app-routing.module.ts","webpack:///./src/app/auth/change-password-dialog/change-password-dialog.component.html","webpack:///./src/app/auth/change-password-dialog/change-password-dialog.component.css","webpack:///./src/app/login/login.component.html","webpack:///./src/content/faw-logo-login.png","webpack:///./src/app/login/login.component.css","webpack:///./src/app/perspective/perspective.component.html","webpack:///./src/app/auth/auth.module.ts","webpack:///./src/app/auth/unauth-redirect.interceptor.ts","webpack:///./src/app/core/core.module.ts","webpack:///./src/app/core/module-import-guard.ts","webpack:///./src/app/enquiry/enquiry.module.ts","webpack:///./src/app/enquiry/enquiry-routing.module.ts","webpack:///./src/app/core/at-least-one-validator.ts","webpack:///./src/app/enquiry/download-quote-dialog/download-quote-dialog.component.html","webpack:///./src/app/enquiry/download-quote-dialog/download-quote-dialog.component.css","webpack:///./src/app/enquiry/email-enquiry-dialog/email-enquiry-dialog.component.html","webpack:///./src/app/enquiry/email-enquiry-dialog/email-enquiry-dialog.component.css","webpack:///./src/app/enquiry/enquiry-detail/enquiry-detail.component.html","webpack:///./src/app/enquiry/enquiry-detail/enquiry-detail.component.css","webpack:///./src/app/enquiry/email-history-dialog/email-history-dialog.component.html","webpack:///./src/app/enquiry/email-history-dialog/email-history-dialog.component.css","webpack:///./src/app/enquiry/enquiry-list/enquiry-list.component.html","webpack:///./src/app/enquiry/enquiry-list/enquiry-list.component.css","webpack:///./src/app/app.component.ts","webpack:///./src/app/app.component.html","webpack:///./src/content/faw-logo-navbar.png","webpack:///./src/app/app.component.css","webpack:///./src/app/perspective/perspective.interceptor.ts","webpack:///./src/app/auth/auth.service.ts","webpack:///./src/app/shared/handle-error.ts","webpack:///./src/app/perspective/perspective.service.ts"],"names":["webpackJsonp","107","module","exports","__webpack_require__","__decorate","this","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","__metadata","k","v","metadata","value","core_1","http_1","handle_error_1","ThemeService","http","themesUrl","_activeTheme","JSON","parse","localStorage","getItem","prototype","get","primaryColour","enumerable","configurable","navbarLogo","fileContentBase64","set","setItem","stringify","getTheme","_this","toPromise","then","theme","activeTheme","catch","handleError","removeActiveTheme","removeItem","update","post","Injectable","HttpClient","108","ValidationHelperService","markAllTouched","control","hasOwnProperty","markAsTouched","onlySelf","ctrl","inner","controls","109","common_1","ngx_color_picker_1","flex_layout_1","forms_1","faw_material_module_1","SharedModule","NgModule","imports","CommonModule","ColorPickerModule","FlexLayoutModule","ReactiveFormsModule","FAWMaterialModule","130","router_1","auth_service_1","AuthGuard","authService","router","canActivate","route","state","url","checkLogin","loggedIn","redirectUrl","navigate","AuthService","Router","177","role","InjectionToken","Role","webUser","webAdmin","internalStaff","178","UserService","usersUrl","getUser","id","getListing","getOptions","resetPassword","userID","user","put","179","__param","paramIndex","decorator","material_1","snack_bar_service_1","validation_helper_service_1","ChangePasswordDialogComponent","fb","snackBarService","validationHelperService","data","dialogRef","changePasswordForm","group","newPassword","Validators","required","maxLength","confirmPassword","validator","checkPasswords","ngOnInit","passwordChangeMandatory","actionsDisabled","loading","notSame","onSubmit","invalid","dto","changePassword","openSnackBar","close","err","showPasswordMismatchError","confirmPasswordFC","touched","hasError","showSpinner","Component","template","styles","Inject","MAT_DIALOG_DATA","FormBuilder","SnackBarService","MatDialogRef","180","operators_1","EnquiryService","enquiriesUrl","defaultEnquiry","enquiryNumber","introducerRateChartID","assetTypeGroupID","costOfGoods","isAdvance","paymentFrequencyID","repayment","term","contactName","businessName","emailAddress","submittedOn","create","enq","getEnquiry","Promise","resolve","monthsAgo","params","HttpParams","String","getRepaymentOptions","calcParams","pipe","catchError","submit","181","DocumentService","downloadApplicationForm","enquiryID","responseType","observe","headers","HttpHeaders","downloadQuotePdf","docGenData","prepareQuoteDocGenData","showAssetCost","checkboxValues","repaymentOptions","map","checked","index","assign","filter","182","EmailService","sendEmail","email","272","theme_service_1","ThemeSettingsComponent","themeService","fileInputFC","FormControl","themeForm","themeSettings","primaryColourFC","setValue","showLoadingSpinner","showSaveSpinner","getPreviewLogo","imagePreview","navbarLogoFC","goToEnquiriesList","validImageFile","imgFile","type","size","onFileChange","event","reader","FileReader","files","file_1","readAsDataURL","onload","fileName","name","fileType","result","split","reset","save","loadingSave","273","rxjs_1","confirm_dialog_component_1","user_service_1","UserDetailComponent","activatedRoute","dialog","userService","ngUnsubscribe","Subject","userForm","username","nameTitleCode","firstName","middleName","lastName","phoneNumber","mobileNumber","jobTitle","isWebAdmin","isActive","isLocked","temporaryPassword","opts","userOpts","paramMap","switchMap","takeUntil","subscribe","patchValue","disable","temporaryPasswordFC","ngOnDestroy","next","complete","goToUsersList","prepareSaveUser","formModel","open","ConfirmDialogComponent","componentInstance","question","confirmButtonLabel","afterClosed","userConfirmed","res","userToSave","showTemporaryPassword","ActivatedRoute","MatDialog","274","cancelButtonLabel","actionConfirmed","275","UserListComponent","displayedColumns","filterFC","userDataSource","MatTableDataSource","valueChanges","val","ngAfterViewInit","sort","paginator","goToUser","ViewChild","MatPaginator","MatSort","276","perspective_service_1","change_password_dialog_component_1","role_const_1","app_version_1","LoginComponent","perspectiveService","appVersion","Version","releaseDate","ReleaseDate","loginForm","password","disableClose","redirect","valid","creds","login","profile","isRefreshPassword","error","message","activeIntroducer","PerspectiveService","277","278","introducer_search_service_1","PerspectiveComponent","introducerSearchService","searchFC","filteredIntroducers$","debounceTime","distinctUntilChanged","search","of","console","log","tap","setTimeout","searchInput","focus","setPerspective","e","option","MatInput","IntroducerSearchService","279","280","enquiry_service_1","at_least_one_validator_1","download_quote_dialog_component_1","email_enquiry_dialog_component_1","EnquiryDetailComponent","enquiryService","location","currencyInputRegex","_repaymentOptions$","BehaviorSubject","repaymentOptions$","asObservable","programFilterFC","repaymentOptionFC","createForm","content","frequencyTabGroup","loadingEnquiryOptions","introducerRateCharts","Error","uniquePrograms","Array","from","Set","irc","programID","label","programName","opt","self","findIndex","o","a","b","localeCompare","enquiry","enquiryForm","financeFG","phoneNumbersFG","savedIrc","find","firstIrcUsingDefaultProduct","productID","defaultProductID","updateFilteredIrcs","emitEvent","filteredIrcs","errorMessage","selectedIrc","checkSelectedIrcConfig","assetTypeGroupFC_1","assetTypeGroups","costOfGoodsFC","setValidators","pattern","min","minCostOfGoods","max","maxCostOfGoods","updateValueAndValidity","isAdvanceFC","allowInAdvance","allowInArrears","enable","loadingRepaymentOptions","selectedOpt","residualAmount","selectedIndex","paymentFrequencies","f","showRepaymentsSpinner","showSavingSpinner","showSubmissionSpinner","isValid","terms","finance","phoneNumbers","phone","mobile","atLeastOne","goodsDescription","abn","minLength","address","notes","getFilteredRepaymentOptions","getResidualLabel","labelResidualAsBalloon","getSelectedRepaymentOptionIndex","selectedOptIndex","getSingularFrequencyDesc","paymentFreq","singularDesc","isRepaymentOptionSelected","isSelected","openDownloadQuoteDialog","getValue","DownloadQuoteDialogComponent","selectedRepaymentIndex","openEmailEnquiryDialog","EmailEnquiryDialogComponent","autoFocus","applicationFormAvailable","prepareSaveEnquiry","assetTypeGroup","productName","assetTypeGroupName","paymentFrequencyName","downloadQuoteClicked","emailClicked","enquiryToSave","replaceState","showAssetTypeGroup","showFinanceForm","showFinanceInvalidMessage","showPhoneError","showProgramFilter","showRepaymentsList","showResidual","showResidualValue","loadingSubmission","showSubmittedRepaymentOption","defaultProductIrc","splice","unshift","MatTabGroup","Location","281","FileSaver","document_service_1","documentService","downloadQuoteForm","repaymentOptionCheckboxes","array","forEach","repaymentCheckboxesFA","push","displayPaymentFrequency","downloadQuote","some","quoteDocGenData","match","toString","replace","saveAs","body","282","email_service_1","emailService","emailForm","to","cc","bcc","subject","attachments","prefillEmail","userProfile","signature","fullName","concat","attachmentFG","attachmentsFA","prepareSendEmail","attachFiles","removeAttachment","removeAt","283","email_history_dialog_component_1","EnquiryListComponent","monthsAgoFC","monthOptions","dataSource","getEnquiries","goToEnquiry","goToNewEnquiry","openEmailHistoryDialog","EmailHistoryDialogComponent","width","284","getEmails","list","emailList","44","snackBar","action","duration","MatSnackBar","614","platform_browser_dynamic_1","app_module_1","enableProdMode","platformBrowserDynamic","bootstrapModule","AppModule","success","615","platform_browser_1","animations_1","angular_jwt_1","http_2","en_AU_1","registerLocaleData","default","admin_module_1","app_routing_module_1","auth_module_1","core_module_1","enquiry_module_1","shared_module_1","app_component_1","login_component_1","perspective_component_1","perspective_interceptor_1","BrowserModule","BrowserAnimationsModule","HttpClientModule","JwtModule","forRoot","config","tokenGetter","AdminModule","AppRoutingModule","AuthModule","CoreModule","EnquiryModule","declarations","AppComponent","providers","provide","HTTP_INTERCEPTORS","useClass","PerspectiveInterceptor","multi","LOCALE_ID","useValue","bootstrap","616","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","factory","undefined","apply","require","plural","n","Math","floor","abs","u","AUD","BDT","BOB","BRL","CAD","CNY","CUP","EGP","EUR","GBP","HKD","ILS","INR","ISK","JPY","KRW","MXN","NZD","PYG","SCR","SEK","TWD","USD","UYU","VND","XAF","XCD","XOF","XPF","617","admin_routing_module_1","theme_settings_component_1","user_detail_component_1","user_list_component_1","AdminRoutingModule","618","auth_guard_service_1","adminRoutes","path","component","RouterModule","forChild","619","620","621","622","623","624","625","626","MatAutocompleteModule","MatButtonModule","MatCardModule","MatCheckboxModule","MatChipsModule","MatDialogModule","MatIconModule","MatInputModule","MatListModule","MatMenuModule","MatOptionModule","MatPaginatorModule","MatProgressSpinnerModule","MatRadioModule","MatSelectModule","MatSidenavModule","MatSnackBarModule","MatSortModule","MatTableModule","MatTabsModule","MatToolbarModule","MatTooltipModule","MAT_LABEL_GLOBAL_OPTIONS","float","627","routes","redirectTo","pathMatch","628","629","630","631","p","632","633","634","unauth_redirect_interceptor_1","entryComponents","UnauthRedirectInterceptor","635","intercept","req","handle","HttpResponse","HttpErrorResponse","status","636","module_import_guard_1","parentModule","throwIfAlreadyLoaded","Optional","SkipSelf","637","moduleName","638","enquiry_routing_module_1","enquiry_detail_component_1","enquiry_list_component_1","EnquiryRoutingModule","639","enquiryRoutes","640","keys","641","642","643","644","645","646","647","648","649","650","651","toggleSearchInput","showSearch","searchValue","goTo","sidenav","showInternalStaffTools","logout","openChangePasswordDialog","perspectiveNotSet","userHasInternalStaffPermission","showWebAdminTools","userHasWebAdminPermission","MatSidenav","selector","652","653","654","655","656","getActiveIntroducerID","reqWithParam","clone","85","jwtService","_userProfile","handleTokenRequestError","errResponse","error_description","statusText","throwError","isTokenExpired","flatMap","access_token","removeActiveIntroducer","JwtHelperService","86","rejectWithMessage","displayMessage","logMessage","reject","87","_activeIntroducer","entityID"],"mappings":"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","file":"dist/app.c49420e8f9280dc70662.js","sourcesContent":["webpackJsonp([1],{\n\n/***/ 107:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar http_1 = __webpack_require__(33);\r\nvar handle_error_1 = __webpack_require__(86);\r\nvar ThemeService = /** @class */ (function () {\r\n function ThemeService(http) {\r\n this.http = http;\r\n this.themesUrl = \"api/themes\"; // url to web api\r\n this._activeTheme = JSON.parse(localStorage.getItem(\"active_theme\"));\r\n }\r\n Object.defineProperty(ThemeService.prototype, \"primaryColour\", {\r\n get: function () {\r\n return (this._activeTheme\r\n && this._activeTheme.primaryColour)\r\n ? this._activeTheme.primaryColour\r\n : null;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ThemeService.prototype, \"navbarLogo\", {\r\n get: function () {\r\n return (this._activeTheme\r\n && this._activeTheme.navbarLogo\r\n && this._activeTheme.navbarLogo.fileContentBase64)\r\n ? \"data:image/png;base64,\" + this._activeTheme.navbarLogo.fileContentBase64\r\n : null;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ThemeService.prototype, \"activeTheme\", {\r\n set: function (value) {\r\n // save to localStorage incase user refreshes the browser\r\n localStorage.setItem(\"active_theme\", JSON.stringify(value));\r\n this._activeTheme = value;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n ThemeService.prototype.getTheme = function () {\r\n var _this = this;\r\n return this.http.get(this.themesUrl)\r\n .toPromise()\r\n .then(function (theme) {\r\n _this.activeTheme = theme;\r\n return theme;\r\n })\r\n .catch(handle_error_1.handleError);\r\n };\r\n ThemeService.prototype.removeActiveTheme = function () {\r\n localStorage.removeItem(\"active_theme\");\r\n this._activeTheme = null;\r\n };\r\n ThemeService.prototype.update = function (theme) {\r\n var _this = this;\r\n return this.http.post(this.themesUrl, theme)\r\n .toPromise()\r\n .then(function () {\r\n // only replace the whole theme object if user attempted to upload a logo as part of the form submission,\r\n // to prevent the current logo from disappearing.\r\n if (theme.navbarLogo != null) {\r\n _this.activeTheme = theme;\r\n }\r\n else {\r\n _this._activeTheme.primaryColour = theme.primaryColour;\r\n }\r\n })\r\n .catch(handle_error_1.handleError);\r\n };\r\n ThemeService = __decorate([\r\n core_1.Injectable(),\r\n __metadata(\"design:paramtypes\", [http_1.HttpClient])\r\n ], ThemeService);\r\n return ThemeService;\r\n}());\r\nexports.ThemeService = ThemeService;\r\n\n\n/***/ }),\n\n/***/ 108:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar ValidationHelperService = /** @class */ (function () {\r\n function ValidationHelperService() {\r\n }\r\n // https://github.com/angular/angular/issues/11774#issuecomment-264706699\r\n ValidationHelperService.prototype.markAllTouched = function (control) {\r\n if (control.hasOwnProperty(\"controls\")) {\r\n control.markAsTouched({ onlySelf: true }); // mark group\r\n var ctrl = control;\r\n for (var inner in ctrl.controls) {\r\n this.markAllTouched(ctrl.controls[inner]);\r\n }\r\n }\r\n else {\r\n (control).markAsTouched({ onlySelf: true });\r\n }\r\n };\r\n ValidationHelperService = __decorate([\r\n core_1.Injectable(),\r\n __metadata(\"design:paramtypes\", [])\r\n ], ValidationHelperService);\r\n return ValidationHelperService;\r\n}());\r\nexports.ValidationHelperService = ValidationHelperService;\r\n\n\n/***/ }),\n\n/***/ 109:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar common_1 = __webpack_require__(3);\r\nvar ngx_color_picker_1 = __webpack_require__(271);\r\nvar flex_layout_1 = __webpack_require__(255);\r\nvar forms_1 = __webpack_require__(17);\r\nvar faw_material_module_1 = __webpack_require__(626);\r\nvar SharedModule = /** @class */ (function () {\r\n function SharedModule() {\r\n }\r\n SharedModule = __decorate([\r\n core_1.NgModule({\r\n imports: [\r\n common_1.CommonModule,\r\n ngx_color_picker_1.ColorPickerModule,\r\n flex_layout_1.FlexLayoutModule,\r\n forms_1.ReactiveFormsModule,\r\n faw_material_module_1.FAWMaterialModule,\r\n ],\r\n exports: [\r\n common_1.CommonModule,\r\n ngx_color_picker_1.ColorPickerModule,\r\n flex_layout_1.FlexLayoutModule,\r\n forms_1.ReactiveFormsModule,\r\n faw_material_module_1.FAWMaterialModule,\r\n ]\r\n })\r\n ], SharedModule);\r\n return SharedModule;\r\n}());\r\nexports.SharedModule = SharedModule;\r\n\n\n/***/ }),\n\n/***/ 130:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar router_1 = __webpack_require__(26);\r\nvar auth_service_1 = __webpack_require__(85);\r\nvar AuthGuard = /** @class */ (function () {\r\n function AuthGuard(authService, router) {\r\n this.authService = authService;\r\n this.router = router;\r\n }\r\n AuthGuard.prototype.canActivate = function (route, state) {\r\n var url = state.url;\r\n return this.checkLogin(url);\r\n };\r\n AuthGuard.prototype.checkLogin = function (url) {\r\n if (this.authService.loggedIn()) {\r\n return true;\r\n }\r\n this.authService.redirectUrl = url;\r\n this.router.navigate([\"/login\"]);\r\n return false;\r\n };\r\n AuthGuard = __decorate([\r\n core_1.Injectable(),\r\n __metadata(\"design:paramtypes\", [auth_service_1.AuthService, router_1.Router])\r\n ], AuthGuard);\r\n return AuthGuard;\r\n}());\r\nexports.AuthGuard = AuthGuard;\r\n\n\n/***/ }),\n\n/***/ 177:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\n// http://stackoverflow.com/a/40287063\r\nexports.role = new core_1.InjectionToken(\"role\");\r\nexports.Role = {\r\n webUser: \"WebUser\",\r\n webAdmin: \"WebAdmin\",\r\n internalStaff: \"InternalStaff\"\r\n};\r\n\n\n/***/ }),\n\n/***/ 178:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar http_1 = __webpack_require__(33);\r\nvar handle_error_1 = __webpack_require__(86);\r\nvar UserService = /** @class */ (function () {\r\n function UserService(http) {\r\n this.http = http;\r\n this.usersUrl = \"api/users\"; // url to web api\r\n }\r\n UserService.prototype.getUser = function (id) {\r\n var url = this.usersUrl + \"/\" + id;\r\n return this.http.get(url)\r\n .toPromise()\r\n .catch(handle_error_1.handleError);\r\n };\r\n UserService.prototype.getListing = function () {\r\n return this.http.get(this.usersUrl)\r\n .toPromise()\r\n .catch(handle_error_1.handleError);\r\n ;\r\n };\r\n UserService.prototype.getOptions = function () {\r\n var url = this.usersUrl + \"/options\";\r\n return this.http.get(url)\r\n .toPromise()\r\n .catch(handle_error_1.handleError);\r\n };\r\n UserService.prototype.resetPassword = function (userID) {\r\n var url = this.usersUrl + \"/\" + userID + \"/reset-password\";\r\n return this.http.post(url, null)\r\n .toPromise()\r\n .catch(handle_error_1.handleError);\r\n };\r\n UserService.prototype.update = function (user) {\r\n var url = this.usersUrl + \"/\" + user.id;\r\n return this.http.put(url, user)\r\n .toPromise()\r\n .then(function () { return user; })\r\n .catch(handle_error_1.handleError);\r\n };\r\n UserService = __decorate([\r\n core_1.Injectable(),\r\n __metadata(\"design:paramtypes\", [http_1.HttpClient])\r\n ], UserService);\r\n return UserService;\r\n}());\r\nexports.UserService = UserService;\r\n\n\n/***/ }),\n\n/***/ 179:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nvar __param = (this && this.__param) || function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar forms_1 = __webpack_require__(17);\r\nvar material_1 = __webpack_require__(29);\r\nvar auth_service_1 = __webpack_require__(85);\r\nvar snack_bar_service_1 = __webpack_require__(44);\r\nvar validation_helper_service_1 = __webpack_require__(108);\r\nvar ChangePasswordDialogComponent = /** @class */ (function () {\r\n function ChangePasswordDialogComponent(authService, fb, snackBarService, validationHelperService, data, dialogRef) {\r\n this.authService = authService;\r\n this.fb = fb;\r\n this.snackBarService = snackBarService;\r\n this.validationHelperService = validationHelperService;\r\n this.data = data;\r\n this.dialogRef = dialogRef;\r\n this.changePasswordForm = this.fb.group({\r\n newPassword: ['', [forms_1.Validators.required, forms_1.Validators.maxLength(100)]],\r\n confirmPassword: ['', [forms_1.Validators.required, forms_1.Validators.maxLength(100)]],\r\n }, { validator: this.checkPasswords }); // see https://stackoverflow.com/a/43493648\r\n }\r\n ChangePasswordDialogComponent.prototype.ngOnInit = function () {\r\n this.passwordChangeMandatory = this.data.passwordChangeMandatory;\r\n };\r\n Object.defineProperty(ChangePasswordDialogComponent.prototype, \"newPasswordFC\", {\r\n get: function () { return this.changePasswordForm.get(\"newPassword\"); },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ChangePasswordDialogComponent.prototype, \"confirmPasswordFC\", {\r\n get: function () { return this.changePasswordForm.get(\"confirmPassword\"); },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n ChangePasswordDialogComponent.prototype.actionsDisabled = function () {\r\n return this.loading;\r\n };\r\n ChangePasswordDialogComponent.prototype.checkPasswords = function (group) {\r\n var newPassword = group.get(\"newPassword\").value;\r\n var confirmPassword = group.get(\"confirmPassword\").value;\r\n return newPassword === confirmPassword ? null : { notSame: true };\r\n };\r\n ChangePasswordDialogComponent.prototype.onSubmit = function () {\r\n var _this = this;\r\n if (this.changePasswordForm.invalid) {\r\n this.validationHelperService.markAllTouched(this.changePasswordForm);\r\n return;\r\n }\r\n this.loading = true;\r\n var dto = this.changePasswordForm.value;\r\n this.authService.changePassword(dto)\r\n .then(function () {\r\n _this.loading = false;\r\n _this.snackBarService.openSnackBar(\"Password updated.\");\r\n _this.dialogRef.close();\r\n })\r\n .catch(function (err) {\r\n _this.loading = false;\r\n _this.snackBarService.openSnackBar(err);\r\n });\r\n };\r\n ChangePasswordDialogComponent.prototype.showPasswordMismatchError = function () {\r\n return this.confirmPasswordFC.touched && this.changePasswordForm.hasError(\"notSame\");\r\n };\r\n ChangePasswordDialogComponent.prototype.showSpinner = function () {\r\n return this.loading;\r\n };\r\n ChangePasswordDialogComponent = __decorate([\r\n core_1.Component({\r\n template: __webpack_require__(628),\r\n styles: [__webpack_require__(629)]\r\n }),\r\n __param(4, core_1.Inject(material_1.MAT_DIALOG_DATA)),\r\n __metadata(\"design:paramtypes\", [auth_service_1.AuthService,\r\n forms_1.FormBuilder,\r\n snack_bar_service_1.SnackBarService,\r\n validation_helper_service_1.ValidationHelperService, Object, material_1.MatDialogRef])\r\n ], ChangePasswordDialogComponent);\r\n return ChangePasswordDialogComponent;\r\n}());\r\nexports.ChangePasswordDialogComponent = ChangePasswordDialogComponent;\r\n\n\n/***/ }),\n\n/***/ 180:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar http_1 = __webpack_require__(33);\r\nvar operators_1 = __webpack_require__(6);\r\nvar handle_error_1 = __webpack_require__(86);\r\nvar EnquiryService = /** @class */ (function () {\r\n function EnquiryService(http) {\r\n this.http = http;\r\n this.enquiriesUrl = \"api/enquiries\"; // url to web api\r\n this.defaultEnquiry = {\r\n id: null,\r\n enquiryNumber: null,\r\n introducerRateChartID: null,\r\n assetTypeGroupID: null,\r\n costOfGoods: null,\r\n isAdvance: null,\r\n paymentFrequencyID: null,\r\n repayment: null,\r\n term: null,\r\n contactName: null,\r\n businessName: null,\r\n emailAddress: null,\r\n submittedOn: null,\r\n };\r\n }\r\n EnquiryService.prototype.create = function (enq) {\r\n return this.http.post(this.enquiriesUrl, enq)\r\n .toPromise()\r\n .catch(handle_error_1.handleError);\r\n };\r\n EnquiryService.prototype.getEnquiry = function (id) {\r\n if (!id) {\r\n return Promise.resolve(this.defaultEnquiry);\r\n }\r\n var url = this.enquiriesUrl + \"/\" + id;\r\n return this.http.get(url)\r\n .toPromise()\r\n .catch(handle_error_1.handleError);\r\n };\r\n // Virtual scroll EnquiryListing implementation - removed for now, since generated SQL is not compatible with SQL2008R2\r\n //getListing(skip: number, take: number, sortBy: string, sortDirection: string, searchString: string): Observable> {\r\n // return this.http.get>(this.enquiriesUrl, {\r\n // params: new HttpParams()\r\n // .set(\"skip\", (skip != null) ? String(skip) : \"\")\r\n // .set(\"take\", (take != null) ? String(take) : \"\")\r\n // .set(\"sortBy\", (sortBy != null) ? String(sortBy) : \"\")\r\n // .set(\"sortDirection\", (sortDirection != null) ? String(sortDirection) : \"\")\r\n // .set(\"searchString\", (searchString != null) ? String(searchString) : \"\")\r\n // })\r\n // .catch(handleError);;\r\n //}\r\n EnquiryService.prototype.getListing = function (monthsAgo) {\r\n return this.http.get(this.enquiriesUrl, {\r\n params: new http_1.HttpParams().set(\"monthsAgo\", (monthsAgo != null) ? String(monthsAgo) : \"\")\r\n })\r\n .toPromise()\r\n .catch(handle_error_1.handleError);\r\n ;\r\n };\r\n EnquiryService.prototype.getOptions = function () {\r\n var url = this.enquiriesUrl + \"/options\";\r\n return this.http.get(url)\r\n .toPromise()\r\n .catch(handle_error_1.handleError);\r\n };\r\n EnquiryService.prototype.getRepaymentOptions = function (calcParams) {\r\n return this.http.post(this.enquiriesUrl + \"/repayments\", calcParams)\r\n .pipe(operators_1.catchError(handle_error_1.handleError));\r\n };\r\n EnquiryService.prototype.submit = function (enq) {\r\n return this.http\r\n .post(this.enquiriesUrl + \"/submit\", enq, {\r\n params: new http_1.HttpParams().set(\"id\", (enq.id != null ? String(enq.id) : \"\"))\r\n })\r\n .toPromise()\r\n .catch(handle_error_1.handleError);\r\n };\r\n EnquiryService.prototype.update = function (enq) {\r\n var url = this.enquiriesUrl + \"/\" + enq.id;\r\n return this.http.put(url, enq)\r\n .toPromise()\r\n .then(function () { return enq; })\r\n .catch(handle_error_1.handleError);\r\n };\r\n EnquiryService = __decorate([\r\n core_1.Injectable(),\r\n __metadata(\"design:paramtypes\", [http_1.HttpClient])\r\n ], EnquiryService);\r\n return EnquiryService;\r\n}());\r\nexports.EnquiryService = EnquiryService;\r\n\n\n/***/ }),\n\n/***/ 181:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar http_1 = __webpack_require__(33);\r\nvar operators_1 = __webpack_require__(6);\r\nvar handle_error_1 = __webpack_require__(86);\r\nvar DocumentService = /** @class */ (function () {\r\n function DocumentService(http) {\r\n this.http = http;\r\n this.enquiriesUrl = \"api/enquiries\"; // url to web api\r\n }\r\n DocumentService.prototype.downloadApplicationForm = function (enquiryID) {\r\n var url = this.enquiriesUrl + \"/\" + enquiryID + \"/application\";\r\n return this.http\r\n .get(url, {\r\n responseType: \"blob\",\r\n observe: \"response\",\r\n headers: new http_1.HttpHeaders().set(\"Accept\", \"application/pdf\")\r\n })\r\n .pipe(operators_1.catchError(handle_error_1.handleError));\r\n };\r\n DocumentService.prototype.downloadQuotePdf = function (enquiryID, docGenData) {\r\n var url = this.enquiriesUrl + \"/\" + enquiryID + \"/pdf\";\r\n return this.http\r\n .post(url, docGenData, {\r\n responseType: \"blob\",\r\n observe: \"response\",\r\n headers: new http_1.HttpHeaders().set(\"Accept\", \"application/pdf\")\r\n })\r\n .pipe(operators_1.catchError(handle_error_1.handleError));\r\n };\r\n DocumentService.prototype.prepareQuoteDocGenData = function (showAssetCost, checkboxValues, repaymentOptions) {\r\n // includeRepaymentOpts will contain all the repayment options, but unchecked ones will be null\r\n var includeRepaymentOpts = checkboxValues.map(function (checked, index) {\r\n if (checked) {\r\n return Object.assign({}, repaymentOptions[index]);\r\n }\r\n });\r\n var docGenData = {\r\n showAssetCost: showAssetCost,\r\n repaymentOptions: includeRepaymentOpts.filter(function (r) { return r != null; })\r\n };\r\n return docGenData;\r\n };\r\n DocumentService = __decorate([\r\n core_1.Injectable(),\r\n __metadata(\"design:paramtypes\", [http_1.HttpClient])\r\n ], DocumentService);\r\n return DocumentService;\r\n}());\r\nexports.DocumentService = DocumentService;\r\n\n\n/***/ }),\n\n/***/ 182:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar http_1 = __webpack_require__(33);\r\nvar handle_error_1 = __webpack_require__(86);\r\nvar EmailService = /** @class */ (function () {\r\n function EmailService(http) {\r\n this.http = http;\r\n this.enquiriesUrl = \"api/enquiries\"; // url to web api\r\n }\r\n EmailService.prototype.getListing = function (enquiryID) {\r\n var url = this.enquiriesUrl + \"/\" + enquiryID + \"/emails\";\r\n return this.http.get(url)\r\n .toPromise()\r\n .catch(handle_error_1.handleError);\r\n };\r\n EmailService.prototype.sendEmail = function (enquiryID, email) {\r\n var url = this.enquiriesUrl + \"/\" + enquiryID + \"/emails\";\r\n return this.http.post(url, email)\r\n .toPromise()\r\n .catch(handle_error_1.handleError);\r\n };\r\n EmailService = __decorate([\r\n core_1.Injectable(),\r\n __metadata(\"design:paramtypes\", [http_1.HttpClient])\r\n ], EmailService);\r\n return EmailService;\r\n}());\r\nexports.EmailService = EmailService;\r\n\n\n/***/ }),\n\n/***/ 272:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar forms_1 = __webpack_require__(17);\r\nvar router_1 = __webpack_require__(26);\r\nvar snack_bar_service_1 = __webpack_require__(44);\r\nvar theme_service_1 = __webpack_require__(107);\r\nvar ThemeSettingsComponent = /** @class */ (function () {\r\n function ThemeSettingsComponent(fb, router, snackBarService, themeService) {\r\n this.fb = fb;\r\n this.router = router;\r\n this.snackBarService = snackBarService;\r\n this.themeService = themeService;\r\n this.fileInputFC = new forms_1.FormControl();\r\n this.themeForm = this.fb.group({\r\n primaryColour: ['', forms_1.Validators.maxLength(20)],\r\n navbarLogo: null\r\n });\r\n }\r\n ThemeSettingsComponent.prototype.ngOnInit = function () {\r\n var _this = this;\r\n this.loading = true;\r\n this.themeService.getTheme()\r\n .then(function (theme) {\r\n _this.loading = false;\r\n _this.themeSettings = theme;\r\n _this.primaryColourFC.setValue(theme.primaryColour);\r\n })\r\n .catch(function (err) {\r\n _this.loading = false;\r\n _this.snackBarService.openSnackBar(\"Error retrieving theme settings.\");\r\n });\r\n };\r\n Object.defineProperty(ThemeSettingsComponent.prototype, \"primaryColourFC\", {\r\n get: function () { return this.themeForm.get(\"primaryColour\"); },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ThemeSettingsComponent.prototype, \"navbarLogoFC\", {\r\n get: function () { return this.themeForm.get(\"navbarLogo\"); },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n ThemeSettingsComponent.prototype.actionsDisabled = function () {\r\n return this.showLoadingSpinner()\r\n || this.showSaveSpinner();\r\n };\r\n ThemeSettingsComponent.prototype.getPreviewLogo = function () {\r\n var imagePreview = null;\r\n if (this.navbarLogoFC != null && this.navbarLogoFC.value != null) {\r\n var selectedFile = this.navbarLogoFC.value;\r\n imagePreview = \"data:image/png;base64,\" + selectedFile.fileContentBase64;\r\n }\r\n return imagePreview;\r\n };\r\n ThemeSettingsComponent.prototype.goToEnquiriesList = function () {\r\n this.router.navigate([\"/enquiries\"]);\r\n };\r\n ThemeSettingsComponent.prototype.validImageFile = function (imgFile) {\r\n return (imgFile.type === \"image/png\"\r\n && imgFile.size <= 100000);\r\n };\r\n // refer to docs for File obj structure https://developer.mozilla.org/en-US/docs/Web/API/File\r\n // code modified from https://nehalist.io/uploading-files-in-angular2/\r\n ThemeSettingsComponent.prototype.onFileChange = function (event) {\r\n var _this = this;\r\n var reader = new FileReader();\r\n if (event.target.files && event.target.files.length > 0) {\r\n var file_1 = event.target.files[0];\r\n reader.readAsDataURL(file_1); // see https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL\r\n reader.onload = function () {\r\n if (_this.validImageFile(file_1)) {\r\n _this.navbarLogoFC.setValue({\r\n fileName: file_1.name,\r\n fileType: file_1.type,\r\n // readAsDataURL() returns a string in the form \"data:image/png;base64,JVBERi0x...\"\r\n fileContentBase64: reader.result.split(',')[1]\r\n });\r\n }\r\n else {\r\n _this.snackBarService.openSnackBar(\"Logo must be PNG and less than 100KB.\");\r\n }\r\n _this.fileInputFC.reset();\r\n };\r\n }\r\n };\r\n ThemeSettingsComponent.prototype.save = function () {\r\n //if (this.themeForm.invalid()) {\r\n // //this.validationHelperService.markAllTouched(this.themeForm);\r\n // this.snackBarService.openSnackBar(\"Please fill in required values.\");\r\n // return;\r\n //}\r\n var _this = this;\r\n this.loadingSave = true;\r\n var themeSettings = this.themeForm.value;\r\n this.themeService.update(themeSettings)\r\n .then(function () {\r\n _this.loadingSave = false;\r\n _this.snackBarService.openSnackBar(\"Theme settings updated.\");\r\n })\r\n .catch(function (err) {\r\n _this.loadingSave = false;\r\n _this.snackBarService.openSnackBar(err);\r\n });\r\n };\r\n ThemeSettingsComponent.prototype.showLoadingSpinner = function () {\r\n return this.loading;\r\n };\r\n ThemeSettingsComponent.prototype.showSaveSpinner = function () {\r\n return this.loadingSave;\r\n };\r\n ThemeSettingsComponent = __decorate([\r\n core_1.Component({\r\n template: __webpack_require__(619),\r\n styles: [__webpack_require__(620)]\r\n }),\r\n __metadata(\"design:paramtypes\", [forms_1.FormBuilder,\r\n router_1.Router,\r\n snack_bar_service_1.SnackBarService,\r\n theme_service_1.ThemeService])\r\n ], ThemeSettingsComponent);\r\n return ThemeSettingsComponent;\r\n}());\r\nexports.ThemeSettingsComponent = ThemeSettingsComponent;\r\n\n\n/***/ }),\n\n/***/ 273:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar forms_1 = __webpack_require__(17);\r\nvar router_1 = __webpack_require__(26);\r\nvar material_1 = __webpack_require__(29);\r\nvar rxjs_1 = __webpack_require__(4);\r\nvar operators_1 = __webpack_require__(6);\r\nvar confirm_dialog_component_1 = __webpack_require__(274);\r\nvar user_service_1 = __webpack_require__(178);\r\nvar snack_bar_service_1 = __webpack_require__(44);\r\nvar validation_helper_service_1 = __webpack_require__(108);\r\nvar UserDetailComponent = /** @class */ (function () {\r\n function UserDetailComponent(activatedRoute, dialog, fb, userService, router, snackBarService, validationHelperService) {\r\n this.activatedRoute = activatedRoute;\r\n this.dialog = dialog;\r\n this.fb = fb;\r\n this.userService = userService;\r\n this.router = router;\r\n this.snackBarService = snackBarService;\r\n this.validationHelperService = validationHelperService;\r\n this.ngUnsubscribe = new rxjs_1.Subject(); //see https://stackoverflow.com/a/41177163\r\n this.userForm = this.fb.group({\r\n username: '',\r\n nameTitleCode: '',\r\n firstName: ['', [forms_1.Validators.required, forms_1.Validators.maxLength(60)]],\r\n middleName: ['', forms_1.Validators.maxLength(60)],\r\n lastName: ['', [forms_1.Validators.required, forms_1.Validators.maxLength(60)]],\r\n emailAddress: ['', [forms_1.Validators.required, forms_1.Validators.maxLength(100)]],\r\n phoneNumber: ['', forms_1.Validators.maxLength(20)],\r\n mobileNumber: ['', forms_1.Validators.maxLength(20)],\r\n jobTitle: ['', forms_1.Validators.maxLength(250)],\r\n isWebAdmin: false,\r\n isActive: false,\r\n isLocked: false,\r\n temporaryPassword: ''\r\n });\r\n }\r\n UserDetailComponent.prototype.ngOnInit = function () {\r\n var _this = this;\r\n this.loading = true;\r\n this.userService.getOptions()\r\n .then(function (opts) {\r\n _this.userOpts = opts;\r\n _this.activatedRoute.paramMap\r\n .pipe(operators_1.switchMap(function (params) { return _this.userService.getUser(+params.get(\"id\")); }), // (+) converts string \"id\" to a number\r\n operators_1.takeUntil(_this.ngUnsubscribe))\r\n .subscribe(function (user) {\r\n _this.loading = false;\r\n _this.user = user;\r\n _this.userForm.patchValue(user);\r\n _this.userForm.get(\"username\").disable();\r\n _this.temporaryPasswordFC.disable();\r\n }, function (err) {\r\n _this.loading = false;\r\n _this.snackBarService.openSnackBar(\"Error retrieving user.\");\r\n });\r\n });\r\n };\r\n UserDetailComponent.prototype.ngOnDestroy = function () {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n };\r\n Object.defineProperty(UserDetailComponent.prototype, \"temporaryPasswordFC\", {\r\n get: function () { return this.userForm.get(\"temporaryPassword\"); },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n UserDetailComponent.prototype.actionsDisabled = function () {\r\n return this.showLoadingSpinner()\r\n || this.showSaveSpinner();\r\n };\r\n UserDetailComponent.prototype.goToUsersList = function () {\r\n this.router.navigate([\"/users\"]);\r\n };\r\n UserDetailComponent.prototype.prepareSaveUser = function () {\r\n var formModel = this.userForm.value;\r\n // note - username field will be disabled, currently ignored by the backend anyway\r\n var username = this.userForm.get(\"username\").value;\r\n var saveUser = {\r\n id: this.user.id,\r\n username: username,\r\n nameTitleCode: formModel.nameTitleCode,\r\n firstName: formModel.firstName,\r\n middleName: formModel.middleName,\r\n lastName: formModel.lastName,\r\n emailAddress: formModel.emailAddress,\r\n phoneNumber: formModel.phoneNumber,\r\n mobileNumber: formModel.mobileNumber,\r\n jobTitle: formModel.jobTitle,\r\n isWebAdmin: formModel.isWebAdmin,\r\n isActive: formModel.isActive,\r\n isLocked: formModel.isLocked,\r\n };\r\n return saveUser;\r\n };\r\n UserDetailComponent.prototype.resetPassword = function () {\r\n var _this = this;\r\n var dialogRef = this.dialog.open(confirm_dialog_component_1.ConfirmDialogComponent);\r\n dialogRef.componentInstance.question = \"Reset password?\";\r\n dialogRef.componentInstance.confirmButtonLabel = \"RESET\";\r\n dialogRef.afterClosed().subscribe(function (userConfirmed) {\r\n if (userConfirmed) {\r\n _this.loadingSave = true;\r\n _this.userService.resetPassword(_this.user.id)\r\n .then(function (res) {\r\n _this.loadingSave = false;\r\n _this.temporaryPasswordFC.setValue(res.temporaryPassword);\r\n _this.temporaryPasswordFC.disable();\r\n _this.snackBarService.openSnackBar(\"Password has been reset.\");\r\n })\r\n .catch(function (err) {\r\n _this.loadingSave = false;\r\n _this.snackBarService.openSnackBar(err);\r\n });\r\n }\r\n });\r\n };\r\n UserDetailComponent.prototype.save = function () {\r\n var _this = this;\r\n if (this.userForm.invalid) {\r\n this.validationHelperService.markAllTouched(this.userForm);\r\n this.snackBarService.openSnackBar(\"Please fill in required values.\");\r\n return;\r\n }\r\n this.loadingSave = true;\r\n var userToSave = this.prepareSaveUser();\r\n this.userService.update(userToSave)\r\n .then(function () {\r\n _this.loadingSave = false;\r\n _this.snackBarService.openSnackBar(\"User updated.\");\r\n _this.goToUsersList();\r\n })\r\n .catch(function (err) {\r\n _this.loadingSave = false;\r\n _this.snackBarService.openSnackBar(err);\r\n });\r\n };\r\n UserDetailComponent.prototype.showLoadingSpinner = function () {\r\n return this.loading;\r\n };\r\n UserDetailComponent.prototype.showSaveSpinner = function () {\r\n return this.loadingSave;\r\n };\r\n UserDetailComponent.prototype.showTemporaryPassword = function () {\r\n return this.temporaryPasswordFC.value;\r\n };\r\n UserDetailComponent = __decorate([\r\n core_1.Component({\r\n template: __webpack_require__(622),\r\n styles: [__webpack_require__(623)]\r\n }),\r\n __metadata(\"design:paramtypes\", [router_1.ActivatedRoute,\r\n material_1.MatDialog,\r\n forms_1.FormBuilder,\r\n user_service_1.UserService,\r\n router_1.Router,\r\n snack_bar_service_1.SnackBarService,\r\n validation_helper_service_1.ValidationHelperService])\r\n ], UserDetailComponent);\r\n return UserDetailComponent;\r\n}());\r\nexports.UserDetailComponent = UserDetailComponent;\r\n\n\n/***/ }),\n\n/***/ 274:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar material_1 = __webpack_require__(29);\r\nvar ConfirmDialogComponent = /** @class */ (function () {\r\n function ConfirmDialogComponent(dialogRef) {\r\n this.dialogRef = dialogRef;\r\n }\r\n ConfirmDialogComponent.prototype.ngOnInit = function () {\r\n this.confirmButtonLabel = this.confirmButtonLabel || \"CONFIRM\";\r\n this.cancelButtonLabel = this.cancelButtonLabel || \"CANCEL\";\r\n };\r\n ConfirmDialogComponent.prototype.actionConfirmed = function () {\r\n this.dialogRef.close(true);\r\n };\r\n ConfirmDialogComponent = __decorate([\r\n core_1.Component({\r\n template: __webpack_require__(621),\r\n }),\r\n __metadata(\"design:paramtypes\", [material_1.MatDialogRef])\r\n ], ConfirmDialogComponent);\r\n return ConfirmDialogComponent;\r\n}());\r\nexports.ConfirmDialogComponent = ConfirmDialogComponent;\r\n\n\n/***/ }),\n\n/***/ 275:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar forms_1 = __webpack_require__(17);\r\nvar material_1 = __webpack_require__(29);\r\nvar router_1 = __webpack_require__(26);\r\nvar rxjs_1 = __webpack_require__(4);\r\nvar operators_1 = __webpack_require__(6);\r\nvar user_service_1 = __webpack_require__(178);\r\nvar snack_bar_service_1 = __webpack_require__(44);\r\nvar UserListComponent = /** @class */ (function () {\r\n function UserListComponent(userService, router, snackBarService) {\r\n this.userService = userService;\r\n this.router = router;\r\n this.snackBarService = snackBarService;\r\n this.displayedColumns = [\"username\", \"fullName\", \"isWebAdmin\", \"isActive\", \"isLocked\", \"actions\"];\r\n this.ngUnsubscribe = new rxjs_1.Subject(); //see https://stackoverflow.com/a/41177163\r\n this.filterFC = new forms_1.FormControl();\r\n this.userDataSource = new material_1.MatTableDataSource();\r\n }\r\n UserListComponent.prototype.ngOnInit = function () {\r\n var _this = this;\r\n this.filterFC.valueChanges\r\n .pipe(operators_1.takeUntil(this.ngUnsubscribe))\r\n .subscribe(function (val) {\r\n _this.userDataSource.filter = val;\r\n });\r\n this.loading = true;\r\n this.userService.getListing()\r\n .then(function (data) {\r\n _this.loading = false;\r\n _this.userDataSource.data = data;\r\n })\r\n .catch(function (err) {\r\n _this.loading = false;\r\n _this.snackBarService.openSnackBar(err);\r\n });\r\n };\r\n UserListComponent.prototype.ngAfterViewInit = function () {\r\n this.userDataSource.sort = this.sort;\r\n this.userDataSource.paginator = this.paginator;\r\n };\r\n UserListComponent.prototype.ngOnDestroy = function () {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n };\r\n UserListComponent.prototype.goToUser = function (userID) {\r\n this.router.navigate([\"/users\", userID]);\r\n };\r\n __decorate([\r\n core_1.ViewChild(material_1.MatPaginator),\r\n __metadata(\"design:type\", material_1.MatPaginator)\r\n ], UserListComponent.prototype, \"paginator\", void 0);\r\n __decorate([\r\n core_1.ViewChild(material_1.MatSort),\r\n __metadata(\"design:type\", material_1.MatSort)\r\n ], UserListComponent.prototype, \"sort\", void 0);\r\n UserListComponent = __decorate([\r\n core_1.Component({\r\n template: __webpack_require__(624),\r\n styles: [__webpack_require__(625)]\r\n }),\r\n __metadata(\"design:paramtypes\", [user_service_1.UserService,\r\n router_1.Router,\r\n snack_bar_service_1.SnackBarService])\r\n ], UserListComponent);\r\n return UserListComponent;\r\n}());\r\nexports.UserListComponent = UserListComponent;\r\n\n\n/***/ }),\n\n/***/ 276:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nvar __param = (this && this.__param) || function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar router_1 = __webpack_require__(26);\r\nvar forms_1 = __webpack_require__(17);\r\nvar material_1 = __webpack_require__(29);\r\nvar auth_service_1 = __webpack_require__(85);\r\nvar perspective_service_1 = __webpack_require__(87);\r\nvar snack_bar_service_1 = __webpack_require__(44);\r\nvar change_password_dialog_component_1 = __webpack_require__(179);\r\nvar role_const_1 = __webpack_require__(177);\r\nvar app_version_1 = __webpack_require__(277);\r\nvar LoginComponent = /** @class */ (function () {\r\n function LoginComponent(dialog, fb, authService, perspectiveService, snackBarService, activatedRoute, router, role) {\r\n this.dialog = dialog;\r\n this.fb = fb;\r\n this.authService = authService;\r\n this.perspectiveService = perspectiveService;\r\n this.snackBarService = snackBarService;\r\n this.activatedRoute = activatedRoute;\r\n this.router = router;\r\n this.role = role;\r\n this.appVersion = app_version_1.appVersion.Version;\r\n this.releaseDate = app_version_1.appVersion.ReleaseDate;\r\n this.loginForm = this.fb.group({\r\n username: ['', [forms_1.Validators.required, forms_1.Validators.maxLength(100)]],\r\n password: ['', [forms_1.Validators.required, forms_1.Validators.maxLength(100)]],\r\n });\r\n }\r\n LoginComponent.prototype.ngOnInit = function () {\r\n // todo: fix this.. authService.logout causes 'expression changed after check' error with the toolbar? \r\n // also cant seem to read the query param if it's set from the unauth interceptor?\r\n //this.activatedRoute.paramMap.subscribe((params: ParamMap) => {\r\n // if (params.get(\"unauthRedirect\")) {\r\n // //this.snackBarService.openSnackBar(\"Unauthorized - please login.\");\r\n // //this.authService.logout();\r\n // }\r\n //});\r\n };\r\n LoginComponent.prototype.changePassword = function (role) {\r\n var _this = this;\r\n var dialogRef = this.dialog.open(change_password_dialog_component_1.ChangePasswordDialogComponent, {\r\n disableClose: true,\r\n data: {\r\n // todo: when password change is required, user can just login then refresh the browser to skip updating it\r\n passwordChangeMandatory: true\r\n }\r\n });\r\n dialogRef.afterClosed().subscribe(function () {\r\n _this.redirect(role);\r\n });\r\n };\r\n LoginComponent.prototype.onSubmit = function () {\r\n var _this = this;\r\n if (this.loginForm.valid) {\r\n this.loading = true;\r\n var creds = this.loginForm.value;\r\n this.authService.login(creds).subscribe(function (profile) {\r\n if (_this.authService.loggedIn()) {\r\n if (profile.isRefreshPassword) {\r\n _this.changePassword(profile.role);\r\n }\r\n else {\r\n _this.redirect(profile.role);\r\n }\r\n }\r\n }, function (error) {\r\n _this.loading = false;\r\n _this.message = error;\r\n });\r\n }\r\n else {\r\n this.message = \"Username and password are required.\";\r\n }\r\n };\r\n LoginComponent.prototype.redirect = function (role) {\r\n var redirect = this.authService.redirectUrl ? this.authService.redirectUrl : \"/enquiries/new\";\r\n // skip the perspective selection if one was already set in localStorage\r\n if (role === this.role.internalStaff && !this.perspectiveService.activeIntroducer) {\r\n redirect = \"/perspective\";\r\n }\r\n this.router.navigate([redirect]);\r\n };\r\n LoginComponent = __decorate([\r\n core_1.Component({\r\n template: __webpack_require__(630),\r\n styles: [__webpack_require__(632)]\r\n }),\r\n __param(7, core_1.Inject(role_const_1.role)),\r\n __metadata(\"design:paramtypes\", [material_1.MatDialog,\r\n forms_1.FormBuilder,\r\n auth_service_1.AuthService,\r\n perspective_service_1.PerspectiveService,\r\n snack_bar_service_1.SnackBarService,\r\n router_1.ActivatedRoute,\r\n router_1.Router, Object])\r\n ], LoginComponent);\r\n return LoginComponent;\r\n}());\r\nexports.LoginComponent = LoginComponent;\r\n\n\n/***/ }),\n\n/***/ 277:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.appVersion = {\r\n Version: \"1.0.7\",\r\n ReleaseDate: \"20181120\"\r\n};\r\n\n\n/***/ }),\n\n/***/ 278:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar forms_1 = __webpack_require__(17);\r\nvar router_1 = __webpack_require__(26);\r\nvar material_1 = __webpack_require__(29);\r\nvar rxjs_1 = __webpack_require__(4);\r\nvar operators_1 = __webpack_require__(6);\r\nvar perspective_service_1 = __webpack_require__(87);\r\nvar snack_bar_service_1 = __webpack_require__(44);\r\nvar introducer_search_service_1 = __webpack_require__(279);\r\nvar theme_service_1 = __webpack_require__(107);\r\nvar PerspectiveComponent = /** @class */ (function () {\r\n function PerspectiveComponent(perspectiveService, introducerSearchService, router, snackBarService, themeService) {\r\n var _this = this;\r\n this.perspectiveService = perspectiveService;\r\n this.introducerSearchService = introducerSearchService;\r\n this.router = router;\r\n this.snackBarService = snackBarService;\r\n this.themeService = themeService;\r\n this.searchFC = new forms_1.FormControl();\r\n this.filteredIntroducers$ = this.searchFC.valueChanges\r\n .pipe(operators_1.debounceTime(300), operators_1.distinctUntilChanged(), operators_1.switchMap(function (term) {\r\n _this.loading = true;\r\n return term\r\n ? _this.introducerSearchService.search(term)\r\n : rxjs_1.of([]);\r\n }), operators_1.catchError(function (error) {\r\n // TODO: add real error handling\r\n console.log(error);\r\n return rxjs_1.of([]);\r\n }), operators_1.tap(function () { _this.loading = false; }));\r\n }\r\n PerspectiveComponent.prototype.ngAfterViewInit = function () {\r\n var _this = this;\r\n // probably shouldnt need this setTimeout?\r\n // https://github.com/angular/material2/issues/1474#issuecomment-293683513\r\n setTimeout(function () {\r\n _this.searchInput.focus();\r\n });\r\n };\r\n PerspectiveComponent.prototype.setPerspective = function (e) {\r\n var _this = this;\r\n this.perspectiveService.activeIntroducer = e.option.value;\r\n this.themeService.getTheme()\r\n .catch(function (err) { return _this.snackBarService.openSnackBar(\"Error retrieving theme settings.\"); });\r\n this.router.navigate([\"/enquiries/new\"]);\r\n };\r\n __decorate([\r\n core_1.ViewChild(material_1.MatInput),\r\n __metadata(\"design:type\", material_1.MatInput)\r\n ], PerspectiveComponent.prototype, \"searchInput\", void 0);\r\n PerspectiveComponent = __decorate([\r\n core_1.Component({\r\n template: __webpack_require__(633),\r\n }),\r\n __metadata(\"design:paramtypes\", [perspective_service_1.PerspectiveService,\r\n introducer_search_service_1.IntroducerSearchService,\r\n router_1.Router,\r\n snack_bar_service_1.SnackBarService,\r\n theme_service_1.ThemeService])\r\n ], PerspectiveComponent);\r\n return PerspectiveComponent;\r\n}());\r\nexports.PerspectiveComponent = PerspectiveComponent;\r\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar http_1 = __webpack_require__(33);\r\nvar IntroducerSearchService = /** @class */ (function () {\r\n function IntroducerSearchService(http) {\r\n this.http = http;\r\n }\r\n IntroducerSearchService.prototype.search = function (term) {\r\n return this.http.get(\"api/profile/introducers/?name=\" + term);\r\n };\r\n IntroducerSearchService = __decorate([\r\n core_1.Injectable(),\r\n __metadata(\"design:paramtypes\", [http_1.HttpClient])\r\n ], IntroducerSearchService);\r\n return IntroducerSearchService;\r\n}());\r\nexports.IntroducerSearchService = IntroducerSearchService;\r\n\n\n/***/ }),\n\n/***/ 280:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar common_1 = __webpack_require__(3);\r\nvar forms_1 = __webpack_require__(17);\r\nvar material_1 = __webpack_require__(29);\r\nvar router_1 = __webpack_require__(26);\r\nvar rxjs_1 = __webpack_require__(4);\r\nvar operators_1 = __webpack_require__(6);\r\nvar enquiry_service_1 = __webpack_require__(180);\r\nvar snack_bar_service_1 = __webpack_require__(44);\r\nvar validation_helper_service_1 = __webpack_require__(108);\r\nvar at_least_one_validator_1 = __webpack_require__(640);\r\nvar download_quote_dialog_component_1 = __webpack_require__(281);\r\nvar email_enquiry_dialog_component_1 = __webpack_require__(282);\r\nvar EnquiryDetailComponent = /** @class */ (function () {\r\n function EnquiryDetailComponent(dialog, enquiryService, fb, activatedRoute, router, location, snackBarService, validationHelperService) {\r\n this.dialog = dialog;\r\n this.enquiryService = enquiryService;\r\n this.fb = fb;\r\n this.activatedRoute = activatedRoute;\r\n this.router = router;\r\n this.location = location;\r\n this.snackBarService = snackBarService;\r\n this.validationHelperService = validationHelperService;\r\n this.currencyInputRegex = /^[1-9]\\d*(\\.\\d+)?$/; // Temp (until we can use number input instead of text) currency input (no leading zeroes). Use this - https://regexr.com/\r\n this.ngUnsubscribe = new rxjs_1.Subject(); //see https://stackoverflow.com/a/41177163\r\n // using BehaviorSubject since we need to be able to push the current repaymentOpts into the email/download quote dialogs when they are opened.\r\n // see section on BehaviorSubject - http://blog.angular-university.io/how-to-build-angular2-apps-using-rxjs-observable-data-services-pitfalls-to-avoid/\r\n this._repaymentOptions$ = new rxjs_1.BehaviorSubject([]);\r\n this.repaymentOptions$ = this._repaymentOptions$.asObservable();\r\n this.programFilterFC = new forms_1.FormControl();\r\n this.repaymentOptionFC = new forms_1.FormControl();\r\n this.createForm();\r\n }\r\n Object.defineProperty(EnquiryDetailComponent.prototype, \"content\", {\r\n set: function (content) {\r\n this.frequencyTabGroup = content;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n EnquiryDetailComponent.prototype.ngOnInit = function () {\r\n var _this = this;\r\n this.loadingEnquiryOptions = true;\r\n // get the enquiryOptions, and then the existing enquiry (or a default one if new)\r\n this.enquiryService.getOptions()\r\n .then(function (data) {\r\n _this.opts = data;\r\n if (_this.opts.introducerRateCharts.length === 0) {\r\n throw new Error(\"No finance types have been made available to this supplier - enquiries cannot be created.\");\r\n }\r\n _this.uniquePrograms = Array.from(// make an array of DropdownOption from this.introducerRateCharts\r\n new Set(_this.opts.introducerRateCharts\r\n .map(function (irc) {\r\n return {\r\n id: irc.programID,\r\n label: irc.programName,\r\n };\r\n })\r\n .filter(function (opt, index, self) {\r\n return index === self.findIndex(function (o) { return (o.id === opt.id); });\r\n })\r\n .sort(function (a, b) { return a.label.localeCompare(b.label); }) // es6 sort https://stackoverflow.com/a/35092754\r\n ));\r\n _this.activatedRoute.paramMap\r\n .pipe(operators_1.takeUntil(_this.ngUnsubscribe), operators_1.switchMap(function (params) { return _this.enquiryService.getEnquiry(+params.get(\"id\")); }) // (+) converts string \"id\" to a number\r\n )\r\n .subscribe(function (enq) {\r\n _this.loadingEnquiryOptions = false;\r\n _this.enquiry = enq;\r\n _this.enquiryForm.patchValue(_this.enquiry);\r\n _this.financeFG.patchValue(_this.enquiry);\r\n _this.phoneNumbersFG.get(\"phone\").setValue(_this.enquiry.phoneNumber);\r\n _this.phoneNumbersFG.get(\"mobile\").setValue(_this.enquiry.mobileNumber);\r\n // The vendor program filter dropdown doesn't actually get saved with the rest of the form,\r\n // it's just a presentation component that filters the \"Finance Type\" (introducerRateChartID) dropdown for the user.\r\n // Having to split this into two dropdowns (Vendor Program / Finance Type), even though its just a single object (IntroducerRateChart)\r\n // has resulted in a bit of extra logic, but FAW have asked for it this way as it may be easier for the user.\r\n var savedIrc = _this.opts.introducerRateCharts.find(function (irc) { return irc.id === _this.enquiry.introducerRateChartID; });\r\n var firstIrcUsingDefaultProduct = _this.opts.introducerRateCharts.filter(function (i) { return i.productID === _this.opts.defaultProductID; })[0];\r\n var programID;\r\n if (savedIrc) {\r\n programID = savedIrc.programID;\r\n }\r\n else if (firstIrcUsingDefaultProduct) {\r\n programID = firstIrcUsingDefaultProduct.programID;\r\n }\r\n else {\r\n programID = _this.uniquePrograms[0].id;\r\n }\r\n _this.updateFilteredIrcs(programID);\r\n _this.programFilterFC.setValue(programID, { emitEvent: false });\r\n if (!_this.enquiry.id && _this.filteredIrcs.length > 0) {\r\n _this.financeFG.get(\"introducerRateChartID\").setValue(_this.filteredIrcs[0].id);\r\n }\r\n if (_this.enquiry.submittedOn != null) {\r\n _this.programFilterFC.disable({ emitEvent: false });\r\n _this.enquiryForm.disable({ emitEvent: false });\r\n }\r\n }, function (err) { return _this.snackBarService.openSnackBar(\"Error retrieving enquiry.\"); });\r\n })\r\n .catch(function (err) {\r\n _this.loadingEnquiryOptions = false;\r\n _this.errorMessage = err;\r\n });\r\n // when a vendor program is selected, filter the introducerRateChartID dropdown and select the first one\r\n this.programFilterFC.valueChanges\r\n .pipe(operators_1.takeUntil(this.ngUnsubscribe))\r\n .subscribe(function (val) {\r\n _this.updateFilteredIrcs(val);\r\n _this.financeFG.get(\"introducerRateChartID\").setValue(_this.filteredIrcs[0].id);\r\n });\r\n // update form validators and assetTypeGroup dropdown when the introducerRateChart dropdown changes\r\n this.financeFG.get(\"introducerRateChartID\").valueChanges\r\n .pipe(operators_1.takeUntil(this.ngUnsubscribe))\r\n .subscribe(function (val) {\r\n _this.selectedIrc = _this.opts.introducerRateCharts.find(function (i) { return i.id === val; });\r\n if (_this.selectedIrc && _this.checkSelectedIrcConfig()) {\r\n var assetTypeGroupFC_1 = _this.financeFG.get(\"assetTypeGroupID\");\r\n if (!_this.selectedIrc.assetTypeGroups.find(function (a) { return a.id === assetTypeGroupFC_1.value; })) {\r\n assetTypeGroupFC_1.setValue(_this.selectedIrc.assetTypeGroups[0].id);\r\n }\r\n _this.costOfGoodsFC.setValidators([\r\n forms_1.Validators.required,\r\n forms_1.Validators.pattern(_this.currencyInputRegex),\r\n forms_1.Validators.min(_this.selectedIrc.minCostOfGoods),\r\n forms_1.Validators.max(_this.selectedIrc.maxCostOfGoods)\r\n ]);\r\n _this.costOfGoodsFC.updateValueAndValidity();\r\n var isAdvanceFC = _this.financeFG.get(\"isAdvance\");\r\n isAdvanceFC.setValue(_this.selectedIrc.allowInAdvance);\r\n (_this.selectedIrc.allowInAdvance && _this.selectedIrc.allowInArrears)\r\n ? isAdvanceFC.enable()\r\n : isAdvanceFC.disable();\r\n }\r\n });\r\n // automatically get repayment options when the finance area of the form is valid\r\n this.financeFG.valueChanges\r\n .pipe(operators_1.takeUntil(this.ngUnsubscribe), operators_1.debounceTime(500), //TODO: debounce also happens on initial load when opening an existing enquiry..\r\n operators_1.distinctUntilChanged(), //TODO: doesnt do anything?\r\n operators_1.switchMap(function (val) {\r\n _this.repaymentOptionFC.reset();\r\n if (_this.financeFG.valid) {\r\n _this.loadingRepaymentOptions = true;\r\n return _this.getRepaymentOptions();\r\n }\r\n else {\r\n return rxjs_1.of([]);\r\n }\r\n }), operators_1.tap(function (opts) {\r\n _this.loadingRepaymentOptions = false;\r\n _this._repaymentOptions$.next(opts);\r\n // if opening an existing enquiry, search for a matching repayment option and 'select' it\r\n var selectedOpt = opts.find(function (r) {\r\n return r.paymentFrequencyID === _this.enquiry.paymentFrequencyID\r\n && r.repayment === _this.enquiry.repayment\r\n && r.term === _this.enquiry.term\r\n && r.residualAmount === _this.enquiry.residualAmount;\r\n });\r\n if (selectedOpt) {\r\n _this.repaymentOptionFC.setValue(selectedOpt);\r\n // ensure the correct payment frequency tab is active on load\r\n if (_this.frequencyTabGroup) {\r\n _this.frequencyTabGroup.selectedIndex = _this.selectedIrc.paymentFrequencies.findIndex(function (f) { return f.id == selectedOpt.paymentFrequencyID; });\r\n }\r\n }\r\n }), operators_1.catchError(function (err) {\r\n _this.errorMessage = err;\r\n return rxjs_1.of([]);\r\n }))\r\n .subscribe();\r\n };\r\n EnquiryDetailComponent.prototype.ngOnDestroy = function () {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n };\r\n EnquiryDetailComponent.prototype.actionsDisabled = function () {\r\n if (this.enquiry) {\r\n return (this.enquiry.submittedOn != null)\r\n || this.loadingEnquiryOptions\r\n || this.showRepaymentsSpinner()\r\n || this.showSavingSpinner()\r\n || this.showSubmissionSpinner()\r\n || this.errorMessage != null;\r\n }\r\n else {\r\n return true;\r\n }\r\n };\r\n Object.defineProperty(EnquiryDetailComponent.prototype, \"costOfGoodsFC\", {\r\n get: function () { return this.enquiryForm.get(\"finance.costOfGoods\"); },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(EnquiryDetailComponent.prototype, \"financeFG\", {\r\n get: function () { return this.enquiryForm.get(\"finance\"); },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(EnquiryDetailComponent.prototype, \"phoneNumbersFG\", {\r\n get: function () { return this.enquiryForm.get(\"phoneNumbers\"); },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n EnquiryDetailComponent.prototype.checkSelectedIrcConfig = function () {\r\n var isValid = this.selectedIrc.terms != null\r\n && this.selectedIrc.terms.length > 0\r\n && this.selectedIrc.paymentFrequencies != null\r\n && this.selectedIrc.paymentFrequencies.length > 0\r\n && this.selectedIrc.assetTypeGroups != null\r\n && this.selectedIrc.assetTypeGroups.length > 0;\r\n this.errorMessage = isValid ? null : \"Rates configuration error.\";\r\n return isValid;\r\n };\r\n EnquiryDetailComponent.prototype.createForm = function () {\r\n this.enquiryForm = this.fb.group({\r\n // separate 'finance' formGroup so we can just validate this before getting repayment options\r\n finance: this.fb.group({\r\n introducerRateChartID: ['', forms_1.Validators.required],\r\n assetTypeGroupID: ['', forms_1.Validators.required],\r\n costOfGoods: ['', [forms_1.Validators.required, forms_1.Validators.pattern(this.currencyInputRegex)]],\r\n isAdvance: ['', forms_1.Validators.required],\r\n }),\r\n phoneNumbers: this.fb.group({\r\n phone: ['', forms_1.Validators.maxLength(20)],\r\n mobile: ['', forms_1.Validators.maxLength(20)],\r\n }, { validator: at_least_one_validator_1.atLeastOne(forms_1.Validators.required) }),\r\n goodsDescription: ['', forms_1.Validators.maxLength(1000)],\r\n contactName: ['', [forms_1.Validators.required, forms_1.Validators.maxLength(100)]],\r\n businessName: ['', [forms_1.Validators.required, forms_1.Validators.maxLength(100)]],\r\n abn: ['', [forms_1.Validators.minLength(11), forms_1.Validators.maxLength(11)]],\r\n emailAddress: ['', forms_1.Validators.maxLength(100)],\r\n address: ['', forms_1.Validators.maxLength(200)],\r\n notes: ['', forms_1.Validators.maxLength(500)],\r\n });\r\n };\r\n EnquiryDetailComponent.prototype.getFilteredRepaymentOptions = function (paymentFrequencyID, opts) {\r\n return opts.filter(function (r) { return r.paymentFrequencyID == paymentFrequencyID; });\r\n };\r\n EnquiryDetailComponent.prototype.getRepaymentOptions = function () {\r\n var calcParams = {\r\n introducerRateChartID: this.financeFG.get(\"introducerRateChartID\").value,\r\n assetTypeGroupID: this.financeFG.get(\"assetTypeGroupID\").value,\r\n costOfGoods: this.financeFG.get(\"costOfGoods\").value,\r\n isAdvance: this.financeFG.get(\"isAdvance\").value\r\n };\r\n return this.enquiryService.getRepaymentOptions(calcParams);\r\n };\r\n EnquiryDetailComponent.prototype.getResidualLabel = function () {\r\n return (this.selectedIrc && this.selectedIrc.labelResidualAsBalloon)\r\n ? \"Balloon\"\r\n : \"Residual\";\r\n };\r\n EnquiryDetailComponent.prototype.getSelectedRepaymentOptionIndex = function (opts) {\r\n var selectedOptIndex = null;\r\n var selectedOpt = this.repaymentOptionFC.value;\r\n if (selectedOpt) {\r\n selectedOptIndex = opts.findIndex(function (r) {\r\n return r.paymentFrequencyID === selectedOpt.paymentFrequencyID\r\n && r.repayment === selectedOpt.repayment\r\n && r.term === selectedOpt.term\r\n && r.residualAmount === selectedOpt.residualAmount;\r\n });\r\n }\r\n return selectedOptIndex;\r\n };\r\n EnquiryDetailComponent.prototype.getSingularFrequencyDesc = function (paymentFreq) {\r\n var singularDesc = null;\r\n switch (paymentFreq) {\r\n case 'Weekly':\r\n singularDesc = 'Week';\r\n break;\r\n case 'Monthly':\r\n singularDesc = 'Month';\r\n break;\r\n case 'Quarterly':\r\n singularDesc = 'Quarter';\r\n break;\r\n case 'Annual':\r\n singularDesc = 'Year';\r\n break;\r\n case 'Fortnightly':\r\n singularDesc = 'Fortnight';\r\n break;\r\n default:\r\n singularDesc = 'Period';\r\n break;\r\n }\r\n return singularDesc;\r\n };\r\n EnquiryDetailComponent.prototype.goToEnquiriesList = function () {\r\n this.router.navigate([\"/enquiries\"]);\r\n };\r\n EnquiryDetailComponent.prototype.isRepaymentOptionSelected = function (opt) {\r\n var isSelected = false;\r\n var selectedOpt = this.repaymentOptionFC.value;\r\n if (selectedOpt) {\r\n isSelected =\r\n opt.paymentFrequencyID === selectedOpt.paymentFrequencyID\r\n && opt.repayment === selectedOpt.repayment\r\n && opt.term === selectedOpt.term\r\n && opt.residualAmount === selectedOpt.residualAmount;\r\n }\r\n return isSelected;\r\n };\r\n EnquiryDetailComponent.prototype.openDownloadQuoteDialog = function () {\r\n var opts = this._repaymentOptions$.getValue();\r\n var selectedOptIndex = this.getSelectedRepaymentOptionIndex(opts);\r\n var dialogRef = this.dialog.open(download_quote_dialog_component_1.DownloadQuoteDialogComponent, {\r\n data: {\r\n enquiryID: this.enquiry.id,\r\n repaymentOptions: opts,\r\n selectedRepaymentIndex: selectedOptIndex\r\n }\r\n });\r\n };\r\n EnquiryDetailComponent.prototype.openEmailEnquiryDialog = function () {\r\n var opts = this._repaymentOptions$.getValue();\r\n var selectedOptIndex = this.getSelectedRepaymentOptionIndex(opts);\r\n var dialogRef = this.dialog.open(email_enquiry_dialog_component_1.EmailEnquiryDialogComponent, {\r\n //height: '80%',\r\n //width: '80%',\r\n disableClose: true,\r\n autoFocus: false,\r\n data: {\r\n applicationFormAvailable: this.selectedIrc.applicationFormAvailable,\r\n enquiry: this.enquiry,\r\n repaymentOptions: opts,\r\n selectedRepaymentIndex: selectedOptIndex\r\n }\r\n });\r\n };\r\n // see https://angular.io/guide/reactive-forms#save-form-data\r\n EnquiryDetailComponent.prototype.prepareSaveEnquiry = function () {\r\n var formModel = this.enquiryForm.value;\r\n var isAdvance = this.financeFG.get(\"isAdvance\").value; // because the FormControl may be disabled\r\n var selectedOpt = this.repaymentOptionFC.value;\r\n // assigning a few extra fields here just so we don't need to look up the ID values again on the backend, before sending the email\r\n var assetTypeGroup = this.selectedIrc.assetTypeGroups.find(function (i) { return i.id === formModel.finance.assetTypeGroupID; });\r\n var saveEnquiry = {\r\n id: this.enquiry.id,\r\n enquiryNumber: \"\",\r\n // from formModel.finance\r\n introducerRateChartID: formModel.finance.introducerRateChartID,\r\n productName: this.selectedIrc.productName,\r\n programName: this.selectedIrc.programName,\r\n assetTypeGroupID: formModel.finance.assetTypeGroupID,\r\n assetTypeGroupName: assetTypeGroup.label,\r\n costOfGoods: formModel.finance.costOfGoods,\r\n isAdvance: isAdvance,\r\n // from formModel.phoneNumbers\r\n phoneNumber: formModel.phoneNumbers.phone,\r\n mobileNumber: formModel.phoneNumbers.mobile,\r\n // from formModel\r\n goodsDescription: formModel.goodsDescription,\r\n contactName: formModel.contactName,\r\n businessName: formModel.businessName,\r\n abn: formModel.abn,\r\n emailAddress: formModel.emailAddress,\r\n address: formModel.address,\r\n notes: formModel.notes,\r\n // from selected RepaymentOption\r\n paymentFrequencyID: selectedOpt ? selectedOpt.paymentFrequencyID : null,\r\n paymentFrequencyName: selectedOpt ? selectedOpt.paymentFrequencyName : null,\r\n repayment: selectedOpt ? selectedOpt.repayment : null,\r\n term: selectedOpt ? selectedOpt.term : null,\r\n residualAmount: selectedOpt ? selectedOpt.residualAmount : null,\r\n };\r\n return saveEnquiry;\r\n };\r\n EnquiryDetailComponent.prototype.save = function (downloadQuoteClicked, emailClicked) {\r\n var _this = this;\r\n if (this.enquiryForm.invalid) {\r\n this.validationHelperService.markAllTouched(this.enquiryForm);\r\n this.snackBarService.openSnackBar(\"Please fill in required values.\");\r\n return;\r\n }\r\n this.loadingSave = true;\r\n var enquiryToSave = this.prepareSaveEnquiry();\r\n if (enquiryToSave.id != null) {\r\n this.enquiryService.update(enquiryToSave)\r\n .then(function () {\r\n _this.loadingSave = false;\r\n _this.enquiry = Object.assign({}, enquiryToSave);\r\n _this.snackBarService.openSnackBar(\"Enquiry updated.\");\r\n // TODO: this could be implemented better..\r\n if (downloadQuoteClicked) {\r\n _this.openDownloadQuoteDialog();\r\n }\r\n else if (emailClicked) {\r\n _this.openEmailEnquiryDialog();\r\n }\r\n })\r\n .catch(function (err) {\r\n _this.loadingSave = false;\r\n _this.snackBarService.openSnackBar(err);\r\n });\r\n }\r\n else {\r\n this.enquiryService.create(enquiryToSave)\r\n .then(function (enq) {\r\n _this.loadingSave = false;\r\n _this.enquiry = Object.assign({}, enquiryToSave);\r\n _this.enquiry.id = enq.id;\r\n _this.snackBarService.openSnackBar(\"Enquiry saved.\");\r\n // Replace \"/new\" in the URL with \"/{id}\"\r\n // This was added because of the default behaviour in iOS Safari when downloading a PDF from the email/quote dialogs.\r\n // Safari will open the PDF in the current tab, and then the user would need to click the back button on their phone, so\r\n // we'd need the ID in the URL to ensure the enquiry data is reloaded when they navigate back.\r\n _this.location.replaceState(\"/enquiries/\" + _this.enquiry.id);\r\n if (downloadQuoteClicked) {\r\n _this.openDownloadQuoteDialog();\r\n }\r\n else if (emailClicked) {\r\n _this.openEmailEnquiryDialog();\r\n }\r\n })\r\n .catch(function (err) {\r\n _this.loadingSave = false;\r\n _this.snackBarService.openSnackBar(err);\r\n });\r\n }\r\n };\r\n EnquiryDetailComponent.prototype.showAssetTypeGroup = function () {\r\n return this.selectedIrc && this.selectedIrc.assetTypeGroups.length > 1;\r\n };\r\n EnquiryDetailComponent.prototype.showFinanceForm = function () {\r\n return this.enquiry != null && this.opts != null;\r\n };\r\n EnquiryDetailComponent.prototype.showFinanceInvalidMessage = function () {\r\n return this.financeFG.invalid;\r\n };\r\n EnquiryDetailComponent.prototype.showPhoneError = function () {\r\n return this.phoneNumbersFG.touched && this.phoneNumbersFG.hasError(\"atLeastOne\");\r\n };\r\n EnquiryDetailComponent.prototype.showProgramFilter = function () {\r\n return this.uniquePrograms && this.uniquePrograms.length > 1;\r\n };\r\n EnquiryDetailComponent.prototype.showRepaymentsList = function () {\r\n return !this.loadingRepaymentOptions && this.financeFG.valid;\r\n };\r\n EnquiryDetailComponent.prototype.showRepaymentsSpinner = function () {\r\n return this.loadingRepaymentOptions && this.financeFG.valid;\r\n };\r\n EnquiryDetailComponent.prototype.showResidual = function () {\r\n return this.selectedIrc && this.selectedIrc.showResidualValue;\r\n };\r\n EnquiryDetailComponent.prototype.showSavingSpinner = function () {\r\n return this.loadingSave;\r\n };\r\n EnquiryDetailComponent.prototype.showSubmissionSpinner = function () {\r\n return this.loadingSubmission;\r\n };\r\n EnquiryDetailComponent.prototype.showSubmittedRepaymentOption = function () {\r\n return this.enquiry && (this.enquiry.submittedOn != null);\r\n };\r\n EnquiryDetailComponent.prototype.submit = function () {\r\n var _this = this;\r\n if (this.enquiryForm.invalid || !this.repaymentOptionFC.value) {\r\n this.validationHelperService.markAllTouched(this.enquiryForm);\r\n this.snackBarService.openSnackBar(\"Please fill in required values and select a repayment option.\");\r\n return;\r\n }\r\n this.loadingSubmission = true;\r\n var enquiryToSave = this.prepareSaveEnquiry();\r\n this.enquiryService.submit(enquiryToSave)\r\n .then(function () {\r\n _this.loadingSubmission = false;\r\n _this.snackBarService.openSnackBar(\"Enquiry submitted.\");\r\n _this.goToEnquiriesList();\r\n })\r\n .catch(function (err) {\r\n _this.loadingSubmission = false;\r\n _this.snackBarService.openSnackBar(err);\r\n });\r\n };\r\n EnquiryDetailComponent.prototype.updateFilteredIrcs = function (programID) {\r\n var _this = this;\r\n this.filteredIrcs = this.opts.introducerRateCharts.filter(function (irc) { return irc.programID == programID; });\r\n // FAW always want the default product (currently Operating Lease) to appear at the top of the dropdown\r\n var index = this.filteredIrcs.findIndex(function (i) { return i.productID === _this.opts.defaultProductID; });\r\n if (index > -1) {\r\n var defaultProductIrc = this.filteredIrcs.splice(index, 1)[0];\r\n this.filteredIrcs.unshift(defaultProductIrc);\r\n }\r\n };\r\n __decorate([\r\n core_1.ViewChild(material_1.MatTabGroup),\r\n __metadata(\"design:type\", material_1.MatTabGroup),\r\n __metadata(\"design:paramtypes\", [material_1.MatTabGroup])\r\n ], EnquiryDetailComponent.prototype, \"content\", null);\r\n EnquiryDetailComponent = __decorate([\r\n core_1.Component({\r\n template: __webpack_require__(645),\r\n styles: [__webpack_require__(646)]\r\n }),\r\n __metadata(\"design:paramtypes\", [material_1.MatDialog,\r\n enquiry_service_1.EnquiryService,\r\n forms_1.FormBuilder,\r\n router_1.ActivatedRoute,\r\n router_1.Router,\r\n common_1.Location,\r\n snack_bar_service_1.SnackBarService,\r\n validation_helper_service_1.ValidationHelperService])\r\n ], EnquiryDetailComponent);\r\n return EnquiryDetailComponent;\r\n}());\r\nexports.EnquiryDetailComponent = EnquiryDetailComponent;\r\n\n\n/***/ }),\n\n/***/ 281:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nvar __param = (this && this.__param) || function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar forms_1 = __webpack_require__(17);\r\nvar material_1 = __webpack_require__(29);\r\nvar FileSaver = __webpack_require__(176);\r\nvar document_service_1 = __webpack_require__(181);\r\nvar snack_bar_service_1 = __webpack_require__(44);\r\nvar DownloadQuoteDialogComponent = /** @class */ (function () {\r\n function DownloadQuoteDialogComponent(documentService, fb, snackBarService, data, dialogRef) {\r\n this.documentService = documentService;\r\n this.fb = fb;\r\n this.snackBarService = snackBarService;\r\n this.data = data;\r\n this.dialogRef = dialogRef;\r\n this.downloadQuoteForm = this.fb.group({\r\n showAssetCost: [true, forms_1.Validators.required],\r\n repaymentOptionCheckboxes: this.fb.array([]),\r\n });\r\n }\r\n DownloadQuoteDialogComponent.prototype.ngOnInit = function () {\r\n var _this = this;\r\n this.enquiryID = this.data.enquiryID;\r\n this.repaymentOptions = this.data.repaymentOptions;\r\n var selectedRepaymentIndex = this.data.selectedRepaymentIndex;\r\n this.repaymentOptions.forEach(function (opt, index) {\r\n _this.repaymentCheckboxesFA.push(new forms_1.FormControl(index === selectedRepaymentIndex));\r\n });\r\n };\r\n Object.defineProperty(DownloadQuoteDialogComponent.prototype, \"repaymentCheckboxesFA\", {\r\n get: function () { return this.downloadQuoteForm.get(\"repaymentOptionCheckboxes\"); },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n DownloadQuoteDialogComponent.prototype.displayPaymentFrequency = function (index) {\r\n return (index == 0)\r\n || (this.repaymentOptions[index - 1].paymentFrequencyID != this.repaymentOptions[index].paymentFrequencyID);\r\n };\r\n DownloadQuoteDialogComponent.prototype.downloadQuote = function () {\r\n var _this = this;\r\n var checkboxValues = this.repaymentCheckboxesFA.value;\r\n if (!checkboxValues.some(function (checked) { return checked === true; })) {\r\n this.snackBarService.openSnackBar(\"Please select at least one repayment option.\");\r\n return;\r\n }\r\n this.showSpinner = true;\r\n var showAssetCost = this.downloadQuoteForm.get('showAssetCost').value;\r\n var quoteDocGenData = this.documentService.prepareQuoteDocGenData(showAssetCost, checkboxValues, this.repaymentOptions);\r\n this.documentService.downloadQuotePdf(this.enquiryID, quoteDocGenData)\r\n .subscribe(function (res) {\r\n _this.showSpinner = false;\r\n var fileName = res.headers.get(\"Content-Disposition\").match(/\"(.*?)\"/g).toString(); // get the string between the quotes, but includes the quotes\r\n fileName = fileName.replace(/[\"]+/g, ''); // remove the quotes\r\n FileSaver.saveAs(res.body, fileName);\r\n }, function (err) {\r\n _this.showSpinner = false;\r\n _this.snackBarService.openSnackBar(err);\r\n }, function () {\r\n _this.dialogRef.close();\r\n });\r\n };\r\n DownloadQuoteDialogComponent = __decorate([\r\n core_1.Component({\r\n template: __webpack_require__(641),\r\n styles: [__webpack_require__(642)]\r\n }),\r\n __param(3, core_1.Inject(material_1.MAT_DIALOG_DATA)),\r\n __metadata(\"design:paramtypes\", [document_service_1.DocumentService,\r\n forms_1.FormBuilder,\r\n snack_bar_service_1.SnackBarService, Object, material_1.MatDialogRef])\r\n ], DownloadQuoteDialogComponent);\r\n return DownloadQuoteDialogComponent;\r\n}());\r\nexports.DownloadQuoteDialogComponent = DownloadQuoteDialogComponent;\r\n\n\n/***/ }),\n\n/***/ 282:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nvar __param = (this && this.__param) || function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar forms_1 = __webpack_require__(17);\r\nvar material_1 = __webpack_require__(29);\r\nvar FileSaver = __webpack_require__(176);\r\nvar auth_service_1 = __webpack_require__(85);\r\nvar email_service_1 = __webpack_require__(182);\r\nvar document_service_1 = __webpack_require__(181);\r\nvar snack_bar_service_1 = __webpack_require__(44);\r\nvar validation_helper_service_1 = __webpack_require__(108);\r\nvar EmailEnquiryDialogComponent = /** @class */ (function () {\r\n function EmailEnquiryDialogComponent(authService, documentService, emailService, fb, snackBarService, validationHelperService, data, dialogRef) {\r\n this.authService = authService;\r\n this.documentService = documentService;\r\n this.emailService = emailService;\r\n this.fb = fb;\r\n this.snackBarService = snackBarService;\r\n this.validationHelperService = validationHelperService;\r\n this.data = data;\r\n this.dialogRef = dialogRef;\r\n this.fileInputFC = new forms_1.FormControl();\r\n this.emailForm = this.fb.group({\r\n showAssetCost: [true, forms_1.Validators.required],\r\n repaymentOptionCheckboxes: this.fb.array([]),\r\n to: ['', [forms_1.Validators.required, forms_1.Validators.maxLength(300)]],\r\n cc: ['', forms_1.Validators.maxLength(300)],\r\n bcc: ['', forms_1.Validators.maxLength(300)],\r\n subject: ['Enquiry', forms_1.Validators.maxLength(300)],\r\n body: ['', forms_1.Validators.required],\r\n attachments: this.fb.array([])\r\n });\r\n }\r\n EmailEnquiryDialogComponent.prototype.ngOnInit = function () {\r\n var _this = this;\r\n this.applicationFormAvailable = this.data.applicationFormAvailable;\r\n this.enquiry = this.data.enquiry;\r\n this.repaymentOptions = this.data.repaymentOptions;\r\n var selectedRepaymentIndex = this.data.selectedRepaymentIndex;\r\n this.repaymentOptions.forEach(function (opt, index) {\r\n _this.repaymentCheckboxesFA.push(new forms_1.FormControl(index === selectedRepaymentIndex));\r\n });\r\n this.prefillEmail();\r\n };\r\n Object.defineProperty(EmailEnquiryDialogComponent.prototype, \"repaymentCheckboxesFA\", {\r\n get: function () { return this.emailForm.get(\"repaymentOptionCheckboxes\"); },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(EmailEnquiryDialogComponent.prototype, \"attachmentsFA\", {\r\n get: function () { return this.emailForm.get(\"attachments\"); },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n EmailEnquiryDialogComponent.prototype.prefillEmail = function () {\r\n var profile = this.authService.userProfile;\r\n this.emailForm.get(\"to\").setValue(this.enquiry.emailAddress);\r\n this.emailForm.get(\"bcc\").setValue(profile.emailAddress);\r\n var signature = profile.fullName;\r\n if (profile.jobTitle) {\r\n signature = signature.concat(\"\\n\", profile.jobTitle);\r\n }\r\n if (profile.phoneNumber) {\r\n signature = signature.concat(\"\\nPh. \", profile.phoneNumber);\r\n }\r\n if (profile.mobileNumber) {\r\n signature = signature.concat(\"\\nMob. \", profile.mobileNumber);\r\n }\r\n if (profile.emailAddress) {\r\n signature = signature.concat(\"\\n\", profile.emailAddress);\r\n }\r\n var body = \"Dear \" + this.enquiry.contactName + \",\\n\\n\\n\\n\" + signature;\r\n this.emailForm.get(\"body\").setValue(body);\r\n };\r\n EmailEnquiryDialogComponent.prototype.displayPaymentFrequency = function (index) {\r\n return (index == 0)\r\n || (this.repaymentOptions[index - 1].paymentFrequencyID != this.repaymentOptions[index].paymentFrequencyID);\r\n };\r\n EmailEnquiryDialogComponent.prototype.downloadApplicationForm = function () {\r\n var _this = this;\r\n this.showSpinner = true;\r\n this.documentService.downloadApplicationForm(this.enquiry.id)\r\n .subscribe(function (res) {\r\n _this.showSpinner = false;\r\n var fileName = res.headers.get(\"Content-Disposition\").match(/\"(.*?)\"/g).toString(); // get the string between the quotes, but includes the quotes\r\n fileName = fileName.replace(/[\"]+/g, ''); // remove the quotes\r\n FileSaver.saveAs(res.body, fileName);\r\n }, function (err) {\r\n _this.showSpinner = false;\r\n _this.snackBarService.openSnackBar(err);\r\n });\r\n };\r\n EmailEnquiryDialogComponent.prototype.downloadQuote = function () {\r\n var _this = this;\r\n var checkboxValues = this.repaymentCheckboxesFA.value;\r\n if (!checkboxValues.some(function (checked) { return checked === true; })) {\r\n this.snackBarService.openSnackBar(\"Please select at least one repayment option.\");\r\n return;\r\n }\r\n this.showSpinner = true;\r\n var showAssetCost = this.emailForm.get('showAssetCost').value;\r\n var quoteDocGenData = this.documentService.prepareQuoteDocGenData(showAssetCost, checkboxValues, this.repaymentOptions);\r\n this.documentService.downloadQuotePdf(this.enquiry.id, quoteDocGenData)\r\n .subscribe(function (res) {\r\n _this.showSpinner = false;\r\n var fileName = res.headers.get(\"Content-Disposition\").match(/\"(.*?)\"/g).toString(); // get the string between the quotes, but includes the quotes\r\n fileName = fileName.replace(/[\"]+/g, ''); // remove the quotes\r\n FileSaver.saveAs(res.body, fileName);\r\n }, function (err) {\r\n _this.showSpinner = false;\r\n _this.snackBarService.openSnackBar(err);\r\n });\r\n };\r\n // refer to docs for File obj structure https://developer.mozilla.org/en-US/docs/Web/API/File\r\n // code modified from https://nehalist.io/uploading-files-in-angular2/\r\n EmailEnquiryDialogComponent.prototype.onFileChange = function (event) {\r\n var _this = this;\r\n var reader = new FileReader();\r\n if (event.target.files && event.target.files.length > 0) {\r\n var file_1 = event.target.files[0];\r\n reader.readAsDataURL(file_1); // see https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL\r\n reader.onload = function () {\r\n var attachmentFG = _this.fb.group({\r\n fileName: file_1.name,\r\n fileType: file_1.type,\r\n // readAsDataURL() returns a string in the form \"data:application/pdf;base64,JVBERi0x...\"\r\n fileContentBase64: reader.result.split(',')[1]\r\n });\r\n _this.attachmentsFA.push(attachmentFG);\r\n _this.fileInputFC.reset();\r\n };\r\n }\r\n };\r\n EmailEnquiryDialogComponent.prototype.prepareSendEmail = function () {\r\n var formModel = this.emailForm.value;\r\n var checkboxValues = this.repaymentCheckboxesFA.value;\r\n var showAssetCost = this.emailForm.get(\"showAssetCost\").value;\r\n var docGenData = this.documentService.prepareQuoteDocGenData(showAssetCost, checkboxValues, this.repaymentOptions);\r\n // shallow copy.. deep copy shouldnt be necessary in this instance since attachment files aren't saved\r\n var attachFiles = this.attachmentsFA.value;\r\n var emailToSend = {\r\n quoteDocGenData: docGenData,\r\n to: formModel.to,\r\n cc: formModel.cc,\r\n bcc: formModel.bcc,\r\n subject: formModel.subject,\r\n body: formModel.body,\r\n attachments: attachFiles\r\n };\r\n return emailToSend;\r\n };\r\n EmailEnquiryDialogComponent.prototype.removeAttachment = function (index) {\r\n this.attachmentsFA.removeAt(index);\r\n };\r\n EmailEnquiryDialogComponent.prototype.sendEmail = function () {\r\n var _this = this;\r\n var checkboxValues = this.repaymentCheckboxesFA.value;\r\n if (!checkboxValues.some(function (checked) { return checked === true; }) || this.emailForm.invalid) {\r\n this.validationHelperService.markAllTouched(this.emailForm);\r\n this.snackBarService.openSnackBar(\"Please select at least one repayment option and fill in required values.\");\r\n return;\r\n }\r\n this.showSpinner = true;\r\n var email = this.prepareSendEmail();\r\n this.emailService.sendEmail(this.enquiry.id, email)\r\n .then(function () {\r\n _this.showSpinner = false;\r\n _this.snackBarService.openSnackBar(\"Email sent.\");\r\n _this.dialogRef.close();\r\n })\r\n .catch(function (err) {\r\n _this.showSpinner = false;\r\n _this.snackBarService.openSnackBar(err);\r\n });\r\n };\r\n EmailEnquiryDialogComponent = __decorate([\r\n core_1.Component({\r\n template: __webpack_require__(643),\r\n styles: [__webpack_require__(644)]\r\n }),\r\n __param(6, core_1.Inject(material_1.MAT_DIALOG_DATA)),\r\n __metadata(\"design:paramtypes\", [auth_service_1.AuthService,\r\n document_service_1.DocumentService,\r\n email_service_1.EmailService,\r\n forms_1.FormBuilder,\r\n snack_bar_service_1.SnackBarService,\r\n validation_helper_service_1.ValidationHelperService, Object, material_1.MatDialogRef])\r\n ], EmailEnquiryDialogComponent);\r\n return EmailEnquiryDialogComponent;\r\n}());\r\nexports.EmailEnquiryDialogComponent = EmailEnquiryDialogComponent;\r\n\n\n/***/ }),\n\n/***/ 283:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar forms_1 = __webpack_require__(17);\r\nvar material_1 = __webpack_require__(29);\r\nvar router_1 = __webpack_require__(26);\r\nvar rxjs_1 = __webpack_require__(4);\r\nvar operators_1 = __webpack_require__(6);\r\nvar enquiry_service_1 = __webpack_require__(180);\r\nvar snack_bar_service_1 = __webpack_require__(44);\r\nvar email_history_dialog_component_1 = __webpack_require__(284);\r\nvar EnquiryListComponent = /** @class */ (function () {\r\n function EnquiryListComponent(activatedRoute, dialog, enquiryService, router, snackBarService) {\r\n this.activatedRoute = activatedRoute;\r\n this.dialog = dialog;\r\n this.enquiryService = enquiryService;\r\n this.router = router;\r\n this.snackBarService = snackBarService;\r\n this.displayedColumns = [\"enquiryNumber\", \"businessName\", \"contactName\", \"product\", \"costOfGoods\",\r\n \"term\", \"repayment\", \"createdOn\", \"lastEmailSentOn\", \"submittedOn\", \"actions\"];\r\n this.ngUnsubscribe = new rxjs_1.Subject(); //see https://stackoverflow.com/a/41177163\r\n this.monthsAgoFC = new forms_1.FormControl();\r\n this.filterFC = new forms_1.FormControl();\r\n this.monthOptions = [1, 3, 6, 12];\r\n this.dataSource = new material_1.MatTableDataSource();\r\n }\r\n EnquiryListComponent.prototype.ngOnInit = function () {\r\n var _this = this;\r\n this.monthsAgoFC.valueChanges\r\n .pipe(operators_1.takeUntil(this.ngUnsubscribe))\r\n .subscribe(function (val) {\r\n _this.getEnquiries(val);\r\n });\r\n this.filterFC.valueChanges\r\n .pipe(operators_1.takeUntil(this.ngUnsubscribe), operators_1.debounceTime(500), operators_1.distinctUntilChanged())\r\n .subscribe(function (val) {\r\n _this.dataSource.filter = val;\r\n });\r\n this.monthsAgoFC.setValue(12);\r\n this.activatedRoute.paramMap\r\n .pipe(operators_1.takeUntil(this.ngUnsubscribe))\r\n .subscribe(function (params) { return _this.filterFC.setValue(params.get(\"search\")); }, function (err) { return console.log(err); });\r\n };\r\n EnquiryListComponent.prototype.ngAfterViewInit = function () {\r\n this.dataSource.sort = this.sort;\r\n this.dataSource.paginator = this.paginator;\r\n };\r\n EnquiryListComponent.prototype.ngOnDestroy = function () {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n };\r\n EnquiryListComponent.prototype.getEnquiries = function (monthsAgo) {\r\n var _this = this;\r\n this.loading = true;\r\n this.enquiryService.getListing(monthsAgo)\r\n .then(function (data) {\r\n _this.loading = false;\r\n _this.dataSource.data = data;\r\n })\r\n .catch(function (err) {\r\n _this.loading = false;\r\n _this.snackBarService.openSnackBar(err);\r\n });\r\n };\r\n EnquiryListComponent.prototype.goToEnquiry = function (enquiryID) {\r\n this.router.navigate([\"enquiries\", enquiryID]);\r\n };\r\n EnquiryListComponent.prototype.goToNewEnquiry = function () {\r\n this.router.navigate([\"enquiries/new\"]);\r\n };\r\n EnquiryListComponent.prototype.openEmailHistoryDialog = function (enquiryID) {\r\n var dialogRef = this.dialog.open(email_history_dialog_component_1.EmailHistoryDialogComponent, {\r\n width: \"800px\",\r\n data: {\r\n enquiryID: enquiryID\r\n }\r\n });\r\n };\r\n __decorate([\r\n core_1.ViewChild(material_1.MatPaginator),\r\n __metadata(\"design:type\", material_1.MatPaginator)\r\n ], EnquiryListComponent.prototype, \"paginator\", void 0);\r\n __decorate([\r\n core_1.ViewChild(material_1.MatSort),\r\n __metadata(\"design:type\", material_1.MatSort)\r\n ], EnquiryListComponent.prototype, \"sort\", void 0);\r\n EnquiryListComponent = __decorate([\r\n core_1.Component({\r\n template: __webpack_require__(649),\r\n styles: [__webpack_require__(650)]\r\n }),\r\n __metadata(\"design:paramtypes\", [router_1.ActivatedRoute,\r\n material_1.MatDialog,\r\n enquiry_service_1.EnquiryService,\r\n router_1.Router,\r\n snack_bar_service_1.SnackBarService])\r\n ], EnquiryListComponent);\r\n return EnquiryListComponent;\r\n}());\r\nexports.EnquiryListComponent = EnquiryListComponent;\r\n\n\n/***/ }),\n\n/***/ 284:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nvar __param = (this && this.__param) || function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar material_1 = __webpack_require__(29);\r\nvar email_service_1 = __webpack_require__(182);\r\nvar snack_bar_service_1 = __webpack_require__(44);\r\nvar EmailHistoryDialogComponent = /** @class */ (function () {\r\n function EmailHistoryDialogComponent(data, dialogRef, emailService, snackBarService) {\r\n this.data = data;\r\n this.dialogRef = dialogRef;\r\n this.emailService = emailService;\r\n this.snackBarService = snackBarService;\r\n }\r\n EmailHistoryDialogComponent.prototype.ngOnInit = function () {\r\n this.enquiryID = this.data.enquiryID;\r\n this.getEmails();\r\n };\r\n EmailHistoryDialogComponent.prototype.getEmails = function () {\r\n var _this = this;\r\n this.loading = true;\r\n this.emailService.getListing(this.enquiryID)\r\n .then(function (list) {\r\n _this.loading = false;\r\n _this.emailList = list;\r\n })\r\n .catch(function (err) {\r\n _this.loading = false;\r\n _this.snackBarService.openSnackBar(err);\r\n });\r\n };\r\n EmailHistoryDialogComponent = __decorate([\r\n core_1.Component({\r\n template: __webpack_require__(647),\r\n styles: [__webpack_require__(648)]\r\n }),\r\n __param(0, core_1.Inject(material_1.MAT_DIALOG_DATA)),\r\n __metadata(\"design:paramtypes\", [Object, material_1.MatDialogRef,\r\n email_service_1.EmailService,\r\n snack_bar_service_1.SnackBarService])\r\n ], EmailHistoryDialogComponent);\r\n return EmailHistoryDialogComponent;\r\n}());\r\nexports.EmailHistoryDialogComponent = EmailHistoryDialogComponent;\r\n\n\n/***/ }),\n\n/***/ 44:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar material_1 = __webpack_require__(29);\r\nvar SnackBarService = /** @class */ (function () {\r\n function SnackBarService(snackBar) {\r\n this.snackBar = snackBar;\r\n }\r\n SnackBarService.prototype.openSnackBar = function (message, action) {\r\n this.snackBar.open(message, action || \"DISMISS\", {\r\n duration: 3000,\r\n });\r\n };\r\n SnackBarService = __decorate([\r\n core_1.Injectable(),\r\n __metadata(\"design:paramtypes\", [material_1.MatSnackBar])\r\n ], SnackBarService);\r\n return SnackBarService;\r\n}());\r\nexports.SnackBarService = SnackBarService;\r\n\n\n/***/ }),\n\n/***/ 614:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar platform_browser_dynamic_1 = __webpack_require__(248);\r\nvar core_1 = __webpack_require__(1);\r\nvar app_module_1 = __webpack_require__(615);\r\nif (true) {\r\n core_1.enableProdMode();\r\n}\r\nplatform_browser_dynamic_1.platformBrowserDynamic().bootstrapModule(app_module_1.AppModule)\r\n .then(function (success) { return console.log(\"Bootstrap success.\"); })\r\n .catch(function (err) { return console.error(err); });\r\n\n\n/***/ }),\n\n/***/ 615:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar platform_browser_1 = __webpack_require__(39);\r\nvar animations_1 = __webpack_require__(35);\r\nvar http_1 = __webpack_require__(33);\r\nvar angular_jwt_1 = __webpack_require__(172);\r\nvar http_2 = __webpack_require__(33);\r\nvar common_1 = __webpack_require__(3);\r\nvar en_AU_1 = __webpack_require__(616);\r\ncommon_1.registerLocaleData(en_AU_1.default);\r\nvar admin_module_1 = __webpack_require__(617);\r\nvar app_routing_module_1 = __webpack_require__(627);\r\nvar auth_module_1 = __webpack_require__(634);\r\nvar core_module_1 = __webpack_require__(636);\r\nvar enquiry_module_1 = __webpack_require__(638);\r\nvar shared_module_1 = __webpack_require__(109);\r\nvar app_component_1 = __webpack_require__(651);\r\nvar introducer_search_service_1 = __webpack_require__(279);\r\nvar login_component_1 = __webpack_require__(276);\r\nvar perspective_component_1 = __webpack_require__(278);\r\nvar perspective_interceptor_1 = __webpack_require__(656);\r\nvar perspective_service_1 = __webpack_require__(87);\r\nvar AppModule = /** @class */ (function () {\r\n function AppModule() {\r\n }\r\n AppModule = __decorate([\r\n core_1.NgModule({\r\n imports: [\r\n platform_browser_1.BrowserModule,\r\n animations_1.BrowserAnimationsModule,\r\n http_1.HttpClientModule,\r\n angular_jwt_1.JwtModule.forRoot({\r\n config: {\r\n tokenGetter: function () {\r\n return localStorage.getItem(\"access_token\");\r\n }\r\n }\r\n }),\r\n admin_module_1.AdminModule,\r\n app_routing_module_1.AppRoutingModule,\r\n auth_module_1.AuthModule,\r\n core_module_1.CoreModule,\r\n enquiry_module_1.EnquiryModule,\r\n shared_module_1.SharedModule,\r\n ],\r\n declarations: [\r\n app_component_1.AppComponent,\r\n login_component_1.LoginComponent,\r\n perspective_component_1.PerspectiveComponent\r\n ],\r\n providers: [\r\n perspective_service_1.PerspectiveService,\r\n introducer_search_service_1.IntroducerSearchService,\r\n { provide: http_2.HTTP_INTERCEPTORS, useClass: perspective_interceptor_1.PerspectiveInterceptor, multi: true },\r\n { provide: core_1.LOCALE_ID, useValue: \"en-AU\" }\r\n ],\r\n bootstrap: [app_component_1.AppComponent]\r\n })\r\n ], AppModule);\r\n return AppModule;\r\n}());\r\nexports.AppModule = AppModule;\r\n\n\n/***/ }),\n\n/***/ 616:\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n(function (factory) {\n if (typeof module === \"object\" && typeof module.exports === \"object\") {\n var v = factory(null, exports);\n if (v !== undefined) module.exports = v;\n }\n else if (true) {\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n }\n})(function (require, exports) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n // THIS CODE IS GENERATED - DO NOT MODIFY\n // See angular/tools/gulp-tasks/cldr/extract.js\n var u = undefined;\n function plural(n) {\n var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\\.?/, '').length;\n if (i === 1 && v === 0)\n return 1;\n return 5;\n }\n exports.default = [\n 'en-AU', [['am', 'pm'], u, u], u,\n [\n ['Su.', 'M.', 'Tu.', 'W.', 'Th.', 'F.', 'Sa.'],\n ['Sun.', 'Mon.', 'Tue.', 'Wed.', 'Thu.', 'Fri.', 'Sat.'],\n ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n ['Su.', 'Mon.', 'Tu.', 'Wed.', 'Th.', 'Fri.', 'Sat.']\n ],\n u,\n [\n ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n ['Jan.', 'Feb.', 'Mar.', 'Apr.', 'May', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Oct.', 'Nov.', 'Dec.'],\n [\n 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September',\n 'October', 'November', 'December'\n ]\n ],\n u, [['B', 'A'], ['BC', 'AD'], ['Before Christ', 'Anno Domini']], 0, [6, 0],\n ['d/M/yy', 'd MMM y', 'd MMMM y', 'EEEE, d MMMM y'],\n ['h:mm a', 'h:mm:ss a', 'h:mm:ss a z', 'h:mm:ss a zzzz'], ['{1}, {0}', u, '{1} \\'at\\' {0}', u],\n ['.', ',', ';', '%', '+', '-', 'e', '×', '‰', '∞', 'NaN', '.'],\n ['#,##0.###', '#,##0%', '¤#,##0.00', '#E0'], '$', 'Australian Dollar', {\n 'AUD': ['$'],\n 'BDT': [u, 'Tk'],\n 'BOB': [u, '$b'],\n 'BRL': [u, 'R$'],\n 'CAD': [u, '$'],\n 'CNY': [u, '¥'],\n 'CUP': [u, '₱'],\n 'EGP': [u, '£'],\n 'EUR': [u, '€'],\n 'GBP': [u, '£'],\n 'HKD': [u, '$'],\n 'ILS': [u, '₪'],\n 'INR': [u, '₹'],\n 'ISK': [u, 'Kr'],\n 'JPY': [u, '¥'],\n 'KRW': [u, '₩'],\n 'MXN': [u, '$'],\n 'NZD': [u, '$'],\n 'PYG': [u, 'Gs'],\n 'SCR': ['Rs'],\n 'SEK': [u, 'Kr'],\n 'TWD': [u, '$'],\n 'USD': [u, '$'],\n 'UYU': [u, '$U'],\n 'VND': [u, '₫'],\n 'XAF': [],\n 'XCD': [u, '$'],\n 'XOF': [],\n 'XPF': ['CFP']\n },\n plural\n ];\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW4tQVUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9lbi1BVS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxrQkFBZTtRQUNiLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hDO1lBQ0UsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7WUFDOUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDeEQsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDOUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7U0FDdEQ7UUFDRCxDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1lBQzVELENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDL0Y7Z0JBQ0UsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXO2dCQUNyRixTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVU7YUFDbEM7U0FDRjtRQUNELENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixDQUFDO1FBQ25ELENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQzlGLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDOUQsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsbUJBQW1CLEVBQUU7WUFDckUsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQ2hCLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7WUFDaEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDYixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQ2hCLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUM7U0FDZjtRQUNELE1BQU07S0FDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBUSElTIENPREUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIE1PRElGWVxuLy8gU2VlIGFuZ3VsYXIvdG9vbHMvZ3VscC10YXNrcy9jbGRyL2V4dHJhY3QuanNcblxuY29uc3QgdSA9IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSksIHYgPSBuLnRvU3RyaW5nKCkucmVwbGFjZSgvXlteLl0qXFwuPy8sICcnKS5sZW5ndGg7XG4gIGlmIChpID09PSAxICYmIHYgPT09IDApIHJldHVybiAxO1xuICByZXR1cm4gNTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW1xuICAnZW4tQVUnLCBbWydhbScsICdwbSddLCB1LCB1XSwgdSxcbiAgW1xuICAgIFsnU3UuJywgJ00uJywgJ1R1LicsICdXLicsICdUaC4nLCAnRi4nLCAnU2EuJ10sXG4gICAgWydTdW4uJywgJ01vbi4nLCAnVHVlLicsICdXZWQuJywgJ1RodS4nLCAnRnJpLicsICdTYXQuJ10sXG4gICAgWydTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSddLFxuICAgIFsnU3UuJywgJ01vbi4nLCAnVHUuJywgJ1dlZC4nLCAnVGguJywgJ0ZyaS4nLCAnU2F0LiddXG4gIF0sXG4gIHUsXG4gIFtcbiAgICBbJ0onLCAnRicsICdNJywgJ0EnLCAnTScsICdKJywgJ0onLCAnQScsICdTJywgJ08nLCAnTicsICdEJ10sXG4gICAgWydKYW4uJywgJ0ZlYi4nLCAnTWFyLicsICdBcHIuJywgJ01heScsICdKdW4uJywgJ0p1bC4nLCAnQXVnLicsICdTZXAuJywgJ09jdC4nLCAnTm92LicsICdEZWMuJ10sXG4gICAgW1xuICAgICAgJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJyxcbiAgICAgICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ1xuICAgIF1cbiAgXSxcbiAgdSwgW1snQicsICdBJ10sIFsnQkMnLCAnQUQnXSwgWydCZWZvcmUgQ2hyaXN0JywgJ0Fubm8gRG9taW5pJ11dLCAwLCBbNiwgMF0sXG4gIFsnZC9NL3l5JywgJ2QgTU1NIHknLCAnZCBNTU1NIHknLCAnRUVFRSwgZCBNTU1NIHknXSxcbiAgWydoOm1tIGEnLCAnaDptbTpzcyBhJywgJ2g6bW06c3MgYSB6JywgJ2g6bW06c3MgYSB6enp6J10sIFsnezF9LCB7MH0nLCB1LCAnezF9IFxcJ2F0XFwnIHswfScsIHVdLFxuICBbJy4nLCAnLCcsICc7JywgJyUnLCAnKycsICctJywgJ2UnLCAnw5cnLCAn4oCwJywgJ+KInicsICdOYU4nLCAnLiddLFxuICBbJyMsIyMwLiMjIycsICcjLCMjMCUnLCAnwqQjLCMjMC4wMCcsICcjRTAnXSwgJyQnLCAnQXVzdHJhbGlhbiBEb2xsYXInLCB7XG4gICAgJ0FVRCc6IFsnJCddLFxuICAgICdCRFQnOiBbdSwgJ1RrJ10sXG4gICAgJ0JPQic6IFt1LCAnJGInXSxcbiAgICAnQlJMJzogW3UsICdSJCddLFxuICAgICdDQUQnOiBbdSwgJyQnXSxcbiAgICAnQ05ZJzogW3UsICfCpSddLFxuICAgICdDVVAnOiBbdSwgJ+KCsSddLFxuICAgICdFR1AnOiBbdSwgJ8KjJ10sXG4gICAgJ0VVUic6IFt1LCAn4oKsJ10sXG4gICAgJ0dCUCc6IFt1LCAnwqMnXSxcbiAgICAnSEtEJzogW3UsICckJ10sXG4gICAgJ0lMUyc6IFt1LCAn4oKqJ10sXG4gICAgJ0lOUic6IFt1LCAn4oK5J10sXG4gICAgJ0lTSyc6IFt1LCAnS3InXSxcbiAgICAnSlBZJzogW3UsICfCpSddLFxuICAgICdLUlcnOiBbdSwgJ+KCqSddLFxuICAgICdNWE4nOiBbdSwgJyQnXSxcbiAgICAnTlpEJzogW3UsICckJ10sXG4gICAgJ1BZRyc6IFt1LCAnR3MnXSxcbiAgICAnU0NSJzogWydScyddLFxuICAgICdTRUsnOiBbdSwgJ0tyJ10sXG4gICAgJ1RXRCc6IFt1LCAnJCddLFxuICAgICdVU0QnOiBbdSwgJyQnXSxcbiAgICAnVVlVJzogW3UsICckVSddLFxuICAgICdWTkQnOiBbdSwgJ+KCqyddLFxuICAgICdYQUYnOiBbXSxcbiAgICAnWENEJzogW3UsICckJ10sXG4gICAgJ1hPRic6IFtdLFxuICAgICdYUEYnOiBbJ0NGUCddXG4gIH0sXG4gIHBsdXJhbFxuXTtcbiJdfQ==\n\n/***/ }),\n\n/***/ 617:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar admin_routing_module_1 = __webpack_require__(618);\r\nvar shared_module_1 = __webpack_require__(109);\r\nvar user_service_1 = __webpack_require__(178);\r\nvar theme_settings_component_1 = __webpack_require__(272);\r\nvar user_detail_component_1 = __webpack_require__(273);\r\nvar user_list_component_1 = __webpack_require__(275);\r\nvar AdminModule = /** @class */ (function () {\r\n function AdminModule() {\r\n }\r\n AdminModule = __decorate([\r\n core_1.NgModule({\r\n imports: [\r\n admin_routing_module_1.AdminRoutingModule,\r\n shared_module_1.SharedModule,\r\n ],\r\n declarations: [\r\n theme_settings_component_1.ThemeSettingsComponent,\r\n user_detail_component_1.UserDetailComponent,\r\n user_list_component_1.UserListComponent,\r\n ],\r\n providers: [\r\n user_service_1.UserService\r\n ]\r\n })\r\n ], AdminModule);\r\n return AdminModule;\r\n}());\r\nexports.AdminModule = AdminModule;\r\n\n\n/***/ }),\n\n/***/ 618:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar router_1 = __webpack_require__(26);\r\nvar auth_guard_service_1 = __webpack_require__(130);\r\nvar theme_settings_component_1 = __webpack_require__(272);\r\nvar user_detail_component_1 = __webpack_require__(273);\r\nvar user_list_component_1 = __webpack_require__(275);\r\nvar adminRoutes = [\r\n { path: \"theme\", component: theme_settings_component_1.ThemeSettingsComponent, canActivate: [auth_guard_service_1.AuthGuard] },\r\n { path: \"users\", component: user_list_component_1.UserListComponent, canActivate: [auth_guard_service_1.AuthGuard] },\r\n { path: \"users/:id\", component: user_detail_component_1.UserDetailComponent, canActivate: [auth_guard_service_1.AuthGuard] },\r\n];\r\nvar AdminRoutingModule = /** @class */ (function () {\r\n function AdminRoutingModule() {\r\n }\r\n AdminRoutingModule = __decorate([\r\n core_1.NgModule({\r\n imports: [router_1.RouterModule.forChild(adminRoutes)],\r\n exports: [router_1.RouterModule]\r\n })\r\n ], AdminRoutingModule);\r\n return AdminRoutingModule;\r\n}());\r\nexports.AdminRoutingModule = AdminRoutingModule;\r\n\n\n/***/ }),\n\n/***/ 619:\n/***/ (function(module, exports) {\n\nmodule.exports = \"
\\r\\n \\r\\n \\r\\n format_color_fill\\r\\n Theme Settings\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n

Select toolbar colour:

\\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n

Upload a new logo. It will be displayed in the navbar, and on generated quote documents. The image should:

\\r\\n
    \\r\\n
  • Not be larger than 300x50 px (will be scaled).
  • \\r\\n
  • Ideally have a transparent background.
  • \\r\\n
  • Must be PNG format.
  • \\r\\n
  • Must be less than 100KB in size.
  • \\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n

\\r\\n Selected: {{navbarLogoFC?.value?.fileName}}\\r\\n

\\r\\n\\r\\n
\\r\\n \\\"preview-logo\\\"\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\";\n\n/***/ }),\n\n/***/ 620:\n/***/ (function(module, exports) {\n\nmodule.exports = \".file-chooser {\\r\\n cursor: pointer;\\r\\n max-width: 120px;\\r\\n}\"\n\n/***/ }),\n\n/***/ 621:\n/***/ (function(module, exports) {\n\nmodule.exports = \"

Confirm Action

\\r\\n\\r\\n\\r\\n

{{question}}

\\r\\n
\\r\\n\\r\\n\\r\\n \\r\\n \\r\\n\";\n\n/***/ }),\n\n/***/ 622:\n/***/ (function(module, exports) {\n\nmodule.exports = \"
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n person_outline\\r\\n Manage User\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n {{opt.label}}\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 60 characters.\\r\\n Required.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 60 characters.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 60 characters.\\r\\n Required.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 100 characters.\\r\\n Required.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 100 characters.\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n Administrator\\r\\n Active\\r\\n Locked\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\";\n\n/***/ }),\n\n/***/ 623:\n/***/ (function(module, exports) {\n\nmodule.exports = \".info-area {\\r\\n margin: 10px;\\r\\n}\\r\\n\\r\\n.reset {\\r\\n margin-top: 10px;\\r\\n margin-bottom: 20px;\\r\\n}\"\n\n/***/ }),\n\n/***/ 624:\n/***/ (function(module, exports) {\n\nmodule.exports = \"
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Username\\r\\n \\r\\n \\r\\n {{ row.username }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Full Name\\r\\n \\r\\n \\r\\n {{ row.fullName }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Role\\r\\n \\r\\n \\r\\n {{ row.isWebAdmin ? 'Admin' : 'User' }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Active\\r\\n \\r\\n \\r\\n {{ row.isActive ? 'Yes' : 'No' }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Locked\\r\\n \\r\\n \\r\\n {{ row.isLocked ? 'Yes' : 'No' }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Actions\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
\";\n\n/***/ }),\n\n/***/ 625:\n/***/ (function(module, exports) {\n\nmodule.exports = \".container {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.user-table {\\r\\n overflow: auto;\\r\\n min-width: 700px;\\r\\n}\\r\\n\\r\\n.mat-column-username,\\r\\n.mat-column-fullName {\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n min-width: 170px;\\r\\n}\\r\\n\\r\\n.mat-column-isWebAdmin,\\r\\n.mat-column-isActive,\\r\\n.mat-column-isLocked,\\r\\n.mat-column-actions {\\r\\n min-width: 60px;\\r\\n max-width: 100px;\\r\\n}\"\n\n/***/ }),\n\n/***/ 626:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar material_1 = __webpack_require__(29);\r\nvar FAWMaterialModule = /** @class */ (function () {\r\n function FAWMaterialModule() {\r\n }\r\n FAWMaterialModule = __decorate([\r\n core_1.NgModule({\r\n imports: [\r\n material_1.MatAutocompleteModule,\r\n material_1.MatButtonModule,\r\n material_1.MatCardModule,\r\n material_1.MatCheckboxModule,\r\n material_1.MatChipsModule,\r\n material_1.MatDialogModule,\r\n material_1.MatIconModule,\r\n material_1.MatInputModule,\r\n material_1.MatListModule,\r\n material_1.MatMenuModule,\r\n material_1.MatOptionModule,\r\n material_1.MatPaginatorModule,\r\n material_1.MatProgressSpinnerModule,\r\n material_1.MatRadioModule,\r\n material_1.MatSelectModule,\r\n material_1.MatSidenavModule,\r\n material_1.MatSnackBarModule,\r\n material_1.MatSortModule,\r\n material_1.MatTableModule,\r\n material_1.MatTabsModule,\r\n material_1.MatToolbarModule,\r\n material_1.MatTooltipModule\r\n ],\r\n exports: [\r\n material_1.MatAutocompleteModule,\r\n material_1.MatButtonModule,\r\n material_1.MatCardModule,\r\n material_1.MatCheckboxModule,\r\n material_1.MatChipsModule,\r\n material_1.MatDialogModule,\r\n material_1.MatIconModule,\r\n material_1.MatInputModule,\r\n material_1.MatListModule,\r\n material_1.MatMenuModule,\r\n material_1.MatOptionModule,\r\n material_1.MatPaginatorModule,\r\n material_1.MatProgressSpinnerModule,\r\n material_1.MatRadioModule,\r\n material_1.MatSelectModule,\r\n material_1.MatSidenavModule,\r\n material_1.MatSnackBarModule,\r\n material_1.MatSortModule,\r\n material_1.MatTableModule,\r\n material_1.MatTabsModule,\r\n material_1.MatToolbarModule,\r\n material_1.MatTooltipModule\r\n ],\r\n providers: [\r\n { provide: material_1.MAT_LABEL_GLOBAL_OPTIONS, useValue: { float: \"always\" } }\r\n ]\r\n })\r\n ], FAWMaterialModule);\r\n return FAWMaterialModule;\r\n}());\r\nexports.FAWMaterialModule = FAWMaterialModule;\r\n\n\n/***/ }),\n\n/***/ 627:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar router_1 = __webpack_require__(26);\r\nvar auth_guard_service_1 = __webpack_require__(130);\r\nvar login_component_1 = __webpack_require__(276);\r\nvar perspective_component_1 = __webpack_require__(278);\r\nvar routes = [\r\n { path: \"login\", component: login_component_1.LoginComponent },\r\n { path: \"perspective\", component: perspective_component_1.PerspectiveComponent, canActivate: [auth_guard_service_1.AuthGuard] },\r\n { path: \"\", redirectTo: \"/login\", pathMatch: \"full\" },\r\n];\r\nvar AppRoutingModule = /** @class */ (function () {\r\n function AppRoutingModule() {\r\n }\r\n AppRoutingModule = __decorate([\r\n core_1.NgModule({\r\n imports: [router_1.RouterModule.forRoot(routes)],\r\n exports: [router_1.RouterModule]\r\n })\r\n ], AppRoutingModule);\r\n return AppRoutingModule;\r\n}());\r\nexports.AppRoutingModule = AppRoutingModule;\r\n\n\n/***/ }),\n\n/***/ 628:\n/***/ (function(module, exports) {\n\nmodule.exports = \"

Change Password

\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n warning\\r\\n Your account is using a temporary password, please update it before proceeding.\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n Max length 100 characters.\\r\\n Required.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 100 characters.\\r\\n Required.\\r\\n \\r\\n Passwords do not match.\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\";\n\n/***/ }),\n\n/***/ 629:\n/***/ (function(module, exports) {\n\nmodule.exports = \".message {\\r\\n margin-bottom: 20px;\\r\\n}\"\n\n/***/ }),\n\n/***/ 630:\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = \"
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n warning\\r\\n {{message}}\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n ← Back to Finance@work Pty Ltd\\r\\n\\r\\n
\\r\\n Version {{appVersion}} [{{releaseDate}}]\\r\\n
\\r\\n
\\r\\n
\";\n\n/***/ }),\n\n/***/ 631:\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"assets/faw-logo-login.38f2d32a6cbeed57ad808e55446c4a64.png\";\n\n/***/ }),\n\n/***/ 632:\n/***/ (function(module, exports) {\n\nmodule.exports = \".login-container {\\r\\n padding: 8% 0 0;\\r\\n}\\r\\n\\r\\n.message-text {\\r\\n padding: 5px;\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.login-form-field label {\\r\\n cursor: pointer;\\r\\n color: #72777c;\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.login-form-field label input {\\r\\n background: #fbfbfb;\\r\\n\\r\\n font-size: 24px;\\r\\n width: 100%;\\r\\n padding: 3px;\\r\\n margin: 2px 6px 16px 0;\\r\\n\\r\\n border: 1px solid #ddd;\\r\\n box-shadow: inset 0 1px 2px rgba(0,0,0,.07);\\r\\n /*background-color: #fff;*/\\r\\n color: #32373c;\\r\\n outline: 0;\\r\\n transition: 50ms border-color ease-in-out;\\r\\n}\\r\\n\\r\\n.login-form-field label input:focus {\\r\\n border-color: #5b9dd9;\\r\\n box-shadow: 0 0 2px rgba(30,140,190,.8);\\r\\n}\\r\\n\\r\\n.login-button {\\r\\n background-color: #0085ba;\\r\\n color: #fff;\\r\\n}\\r\\n\\r\\n.link-text:hover {\\r\\n color: #00a0d2;\\r\\n}\\r\\n\\r\\n.link-text {\\r\\n font-size: 13px;\\r\\n text-decoration: none;\\r\\n color: #555d66;\\r\\n transition-property: border,background,color;\\r\\n transition-duration: .05s;\\r\\n transition-timing-function: ease-in-out;\\r\\n outline: 0;\\r\\n}\"\n\n/***/ }),\n\n/***/ 633:\n/***/ (function(module, exports) {\n\nmodule.exports = \"
\\r\\n \\r\\n \\r\\n visibility\\r\\n {{perspectiveService.activeIntroducer ? 'Change' : 'Set'}} Perspective\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{sup.entityNumber}} | {{sup.entityName}} |\\r\\n Trading as \\\"{{sup.tradingAs || '(Unspecified)'}}\\\"\\r\\n \\r\\n \\r\\n Set your perspective to a specific supplier.\\r\\n \\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\";\n\n/***/ }),\n\n/***/ 634:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar http_1 = __webpack_require__(33);\r\nvar shared_module_1 = __webpack_require__(109);\r\nvar change_password_dialog_component_1 = __webpack_require__(179);\r\nvar auth_guard_service_1 = __webpack_require__(130);\r\nvar auth_service_1 = __webpack_require__(85);\r\nvar unauth_redirect_interceptor_1 = __webpack_require__(635);\r\nvar AuthModule = /** @class */ (function () {\r\n function AuthModule() {\r\n }\r\n AuthModule = __decorate([\r\n core_1.NgModule({\r\n imports: [\r\n shared_module_1.SharedModule,\r\n ],\r\n declarations: [\r\n change_password_dialog_component_1.ChangePasswordDialogComponent,\r\n ],\r\n exports: [\r\n change_password_dialog_component_1.ChangePasswordDialogComponent,\r\n ],\r\n entryComponents: [\r\n change_password_dialog_component_1.ChangePasswordDialogComponent\r\n ],\r\n providers: [\r\n auth_guard_service_1.AuthGuard,\r\n auth_service_1.AuthService,\r\n {\r\n provide: http_1.HTTP_INTERCEPTORS,\r\n useClass: unauth_redirect_interceptor_1.UnauthRedirectInterceptor,\r\n multi: true\r\n }\r\n ]\r\n })\r\n ], AuthModule);\r\n return AuthModule;\r\n}());\r\nexports.AuthModule = AuthModule;\r\n\n\n/***/ }),\n\n/***/ 635:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar http_1 = __webpack_require__(33);\r\nvar router_1 = __webpack_require__(26);\r\nvar operators_1 = __webpack_require__(6);\r\nvar UnauthRedirectInterceptor = /** @class */ (function () {\r\n function UnauthRedirectInterceptor(router) {\r\n this.router = router;\r\n }\r\n // see https://medium.com/@ryanchenkie_40935/angular-authentication-using-the-http-client-and-http-interceptors-2f9d1540eb8\r\n UnauthRedirectInterceptor.prototype.intercept = function (req, next) {\r\n var _this = this;\r\n return next.handle(req)\r\n .pipe(operators_1.tap(function (event) {\r\n if (event instanceof http_1.HttpResponse) {\r\n // do stuff with response if you want\r\n }\r\n }, function (err) {\r\n // todo: logic to use refresh token would go here instead of just redirecting...\r\n if (err instanceof http_1.HttpErrorResponse) {\r\n if (err.status === 401 || err.status === 403) {\r\n _this.router.navigate([\"/login\"]);\r\n }\r\n }\r\n }));\r\n };\r\n UnauthRedirectInterceptor = __decorate([\r\n core_1.Injectable(),\r\n __metadata(\"design:paramtypes\", [router_1.Router])\r\n ], UnauthRedirectInterceptor);\r\n return UnauthRedirectInterceptor;\r\n}());\r\nexports.UnauthRedirectInterceptor = UnauthRedirectInterceptor;\r\n\n\n/***/ }),\n\n/***/ 636:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nvar __param = (this && this.__param) || function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar router_1 = __webpack_require__(26);\r\nvar shared_module_1 = __webpack_require__(109);\r\nvar confirm_dialog_component_1 = __webpack_require__(274);\r\nvar module_import_guard_1 = __webpack_require__(637);\r\nvar snack_bar_service_1 = __webpack_require__(44);\r\nvar theme_service_1 = __webpack_require__(107);\r\nvar validation_helper_service_1 = __webpack_require__(108);\r\nvar role_const_1 = __webpack_require__(177);\r\nvar CoreModule = /** @class */ (function () {\r\n function CoreModule(parentModule) {\r\n module_import_guard_1.throwIfAlreadyLoaded(parentModule, \"CoreModule\");\r\n }\r\n CoreModule = __decorate([\r\n core_1.NgModule({\r\n imports: [\r\n router_1.RouterModule,\r\n shared_module_1.SharedModule\r\n ],\r\n declarations: [\r\n confirm_dialog_component_1.ConfirmDialogComponent,\r\n ],\r\n exports: [\r\n confirm_dialog_component_1.ConfirmDialogComponent,\r\n ],\r\n entryComponents: [\r\n confirm_dialog_component_1.ConfirmDialogComponent\r\n ],\r\n providers: [\r\n snack_bar_service_1.SnackBarService,\r\n theme_service_1.ThemeService,\r\n validation_helper_service_1.ValidationHelperService,\r\n { provide: role_const_1.role, useValue: role_const_1.Role }\r\n ]\r\n }),\r\n __param(0, core_1.Optional()), __param(0, core_1.SkipSelf()),\r\n __metadata(\"design:paramtypes\", [CoreModule])\r\n ], CoreModule);\r\n return CoreModule;\r\n}());\r\nexports.CoreModule = CoreModule;\r\n\n\n/***/ }),\n\n/***/ 637:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nfunction throwIfAlreadyLoaded(parentModule, moduleName) {\r\n if (parentModule) {\r\n throw new Error(moduleName + \" has already been loaded. Import Core modules in the AppModule only.\");\r\n }\r\n}\r\nexports.throwIfAlreadyLoaded = throwIfAlreadyLoaded;\r\n\n\n/***/ }),\n\n/***/ 638:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar enquiry_routing_module_1 = __webpack_require__(639);\r\nvar shared_module_1 = __webpack_require__(109);\r\nvar email_service_1 = __webpack_require__(182);\r\nvar enquiry_service_1 = __webpack_require__(180);\r\nvar document_service_1 = __webpack_require__(181);\r\nvar download_quote_dialog_component_1 = __webpack_require__(281);\r\nvar email_enquiry_dialog_component_1 = __webpack_require__(282);\r\nvar email_history_dialog_component_1 = __webpack_require__(284);\r\nvar enquiry_detail_component_1 = __webpack_require__(280);\r\nvar enquiry_list_component_1 = __webpack_require__(283);\r\nvar EnquiryModule = /** @class */ (function () {\r\n function EnquiryModule() {\r\n }\r\n EnquiryModule = __decorate([\r\n core_1.NgModule({\r\n imports: [\r\n enquiry_routing_module_1.EnquiryRoutingModule,\r\n shared_module_1.SharedModule,\r\n ],\r\n declarations: [\r\n download_quote_dialog_component_1.DownloadQuoteDialogComponent,\r\n email_enquiry_dialog_component_1.EmailEnquiryDialogComponent,\r\n email_history_dialog_component_1.EmailHistoryDialogComponent,\r\n enquiry_detail_component_1.EnquiryDetailComponent,\r\n enquiry_list_component_1.EnquiryListComponent,\r\n ],\r\n entryComponents: [\r\n download_quote_dialog_component_1.DownloadQuoteDialogComponent,\r\n email_enquiry_dialog_component_1.EmailEnquiryDialogComponent,\r\n email_history_dialog_component_1.EmailHistoryDialogComponent,\r\n ],\r\n providers: [\r\n email_service_1.EmailService,\r\n enquiry_service_1.EnquiryService,\r\n document_service_1.DocumentService,\r\n ]\r\n })\r\n ], EnquiryModule);\r\n return EnquiryModule;\r\n}());\r\nexports.EnquiryModule = EnquiryModule;\r\n\n\n/***/ }),\n\n/***/ 639:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar router_1 = __webpack_require__(26);\r\nvar auth_guard_service_1 = __webpack_require__(130);\r\nvar enquiry_detail_component_1 = __webpack_require__(280);\r\nvar enquiry_list_component_1 = __webpack_require__(283);\r\nvar enquiryRoutes = [\r\n { path: \"enquiries\", component: enquiry_list_component_1.EnquiryListComponent, canActivate: [auth_guard_service_1.AuthGuard] },\r\n { path: \"enquiries/new\", component: enquiry_detail_component_1.EnquiryDetailComponent, canActivate: [auth_guard_service_1.AuthGuard] },\r\n { path: \"enquiries/:id\", component: enquiry_detail_component_1.EnquiryDetailComponent, canActivate: [auth_guard_service_1.AuthGuard] },\r\n];\r\nvar EnquiryRoutingModule = /** @class */ (function () {\r\n function EnquiryRoutingModule() {\r\n }\r\n EnquiryRoutingModule = __decorate([\r\n core_1.NgModule({\r\n imports: [router_1.RouterModule.forChild(enquiryRoutes)],\r\n exports: [router_1.RouterModule]\r\n })\r\n ], EnquiryRoutingModule);\r\n return EnquiryRoutingModule;\r\n}());\r\nexports.EnquiryRoutingModule = EnquiryRoutingModule;\r\n\n\n/***/ }),\n\n/***/ 640:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n// see https://stackoverflow.com/a/45514884\r\nexports.atLeastOne = function (validator) { return function (group) {\r\n var hasAtLeastOne = group && group.controls && Object.keys(group.controls)\r\n .some(function (k) { return !validator(group.controls[k]); });\r\n return hasAtLeastOne ? null : {\r\n atLeastOne: true,\r\n };\r\n}; };\r\n\n\n/***/ }),\n\n/***/ 641:\n/***/ (function(module, exports) {\n\nmodule.exports = \"

Download Quote

\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n

Document Settings

\\r\\n Show Asset Cost\\r\\n\\r\\n

Select repayment options to include in the quote document:

\\r\\n
\\r\\n
\\r\\n
\\r\\n {{opt.paymentFrequencyName}}\\r\\n
\\r\\n \\r\\n {{opt.repayment | currency:'AUD'}} over {{opt.term}} mths \\r\\n {{opt.residualLabelAsBalloon ? 'BA' : 'RV'}} {{opt.residualAmount | currency:'AUD'}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n\";\n\n/***/ }),\n\n/***/ 642:\n/***/ (function(module, exports) {\n\nmodule.exports = \".doc-settings-area {\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n.doc-settings-title {\\r\\n font-weight: bold;\\r\\n margin-top: 0px;\\r\\n}\\r\\n\\r\\n.payment-frequency-heading {\\r\\n margin-bottom: 8px;\\r\\n}\"\n\n/***/ }),\n\n/***/ 643:\n/***/ (function(module, exports) {\n\nmodule.exports = \"

Email

\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n

Document Settings

\\r\\n Show Asset Cost\\r\\n\\r\\n

Select repayment options to include in the quote document:

\\r\\n
\\r\\n
\\r\\n
\\r\\n {{opt.paymentFrequencyName}}\\r\\n
\\r\\n \\r\\n {{opt.repayment | currency:'AUD'}} over {{opt.term}} mths\\r\\n {{opt.residualLabelAsBalloon ? 'BA' : 'RV'}} {{opt.residualAmount | currency:'AUD'}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n Max length 300 characters.\\r\\n Required.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 300 characters.\\r\\n Use a comma to separate multiple emails.\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n Max length 300 characters.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 300 characters.\\r\\n Use a comma to separate multiple emails.\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n The generated quote document and an application form (if one is available) will be attached automatically, preview either with the buttons below.\\r\\n
\\r\\n
\\r\\n warning\\r\\n

iPhone Safari users please note - viewing these files will navigate you away from this web app. Pressing your phone's back button will return you to this enquiry screen, but your email draft and document settings (see above) will be lost.

\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n {{attachment.value.fileName}}\\r\\n clear\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n Required.\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n\";\n\n/***/ }),\n\n/***/ 644:\n/***/ (function(module, exports) {\n\nmodule.exports = \".info-area {\\r\\n max-width: 800px;\\r\\n}\\r\\n\\r\\n.file-area {\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.attachment-list {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.doc-settings-area {\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n.doc-settings-title {\\r\\n font-weight: bold;\\r\\n margin-top: 0px;\\r\\n}\\r\\n\\r\\n.chip-button {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.payment-frequency-heading {\\r\\n margin-bottom: 8px;\\r\\n}\"\n\n/***/ }),\n\n/***/ 645:\n/***/ (function(module, exports) {\n\nmodule.exports = \"
\\r\\n warning\\r\\n {{ errorMessage }}\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n {{ enquiry?.id ? 'Editing' : 'New' }} Enquiry\\r\\n
\\r\\n\\r\\n \\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n looks_one\\r\\n
Provide Quote Details
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n {{opt.label}}\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n {{irc.productName}}\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n {{assetTypeGroup.label}}\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n Max length 1000 characters.\\r\\n \\r\\n\\r\\n
\\r\\n \\r\\n $  \\r\\n \\r\\n \\r\\n {{selectedIrc?.costOfGoodsIncGST ? 'Incl. GST' : 'Excl. GST'}}\\r\\n Minimum {{selectedIrc.minCostOfGoods | currency:'AUD'}}\\r\\n Maximum {{selectedIrc.maxCostOfGoods | currency:'AUD'}}\\r\\n Required.\\r\\n Please enter a number.\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n Payment in Advance\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n looks_two\\r\\n
Select Repayment Option
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n

Submitted Repayment Option

\\r\\n \\r\\n \\r\\n done\\r\\n

{{enquiry.repayment | currency:'AUD'}} per {{getSingularFrequencyDesc(enquiry.paymentFrequencyName)}}

\\r\\n

For {{enquiry.term}} months

\\r\\n

{{getResidualLabel()}}: {{enquiry.residualAmount | currency:'AUD'}}

\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n

Please enter financial details to view repayment options.

\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
    \\r\\n
  • \\r\\n\\r\\n

    {{freq.label}}

    \\r\\n
    \\r\\n\\r\\n
    \\r\\n {{opt.repayment | currency:'AUD'}}\\r\\n per {{getSingularFrequencyDesc(opt.paymentFrequencyName)}}\\r\\n for {{opt.term}} months\\r\\n \\r\\n {{getResidualLabel()}} {{opt.residualAmount | currency:'AUD'}}\\r\\n \\r\\n
    \\r\\n
    \\r\\n
  • \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n looks_3\\r\\n
Provide Contact Details
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n Max length 100 characters.\\r\\n Required.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 100 characters.\\r\\n Required.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n {{abnInput.value.length}} / 11\\r\\n \\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n Please provide either a phone or mobile number.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n Max length 100 characters.\\r\\n Required.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 200 characters.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 500 characters.\\r\\n \\r\\n\\r\\n
\\r\\n Submitted on {{enquiry?.submittedOn | date:'medium'}}.\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\";\n\n/***/ }),\n\n/***/ 646:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/* IE specific fix. IE seems to have trouble with the mat-card heights, and\\r\\n we don't really need to worry about mobile layout for IE https://stackoverflow.com/a/36448860 \\r\\n The enquiry detail screen is currently the only page where we want the mat-card heights to match like this.\\r\\n*/\\r\\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\\r\\n mat-card {\\r\\n min-height: 740px;\\r\\n }\\r\\n}\\r\\n\\r\\n.message {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.header-icon {\\r\\n color: grey;\\r\\n}\\r\\n\\r\\n.section-header {\\r\\n margin-top: 15px;\\r\\n margin-bottom: 15px;\\r\\n}\\r\\n\\r\\n/* Repayments grid CSS below\\r\\n * Modified from http://webdesign.tutsplus.com/tutorials/build-a-responsive-pricing-table-with-neat-hover-states--webdesign-12037\\r\\n * Demo: http://source.tutsplus.com/webdesign/tutorials/025_css-pricing-tables/index.html\\r\\n*/\\r\\n\\r\\n/*----------\\r\\nBlocks\\r\\n----------*/\\r\\n/*Pricing table and price blocks*/\\r\\n.pricing-table {\\r\\n\\tline-height: 150%; \\r\\n\\tfont-size: 12px; \\r\\n\\tmax-width: 800px; \\r\\n\\tpadding: 10px;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\t\\t\\r\\n.price-block {\\r\\n\\ttext-align: center; \\r\\n\\twidth: 100%; \\r\\n\\tcolor: #fff; \\r\\n\\tfloat: left; \\r\\n\\tlist-style-type: none; \\r\\n\\ttransition: all 0.25s; \\r\\n\\tposition: relative; \\r\\n\\tbox-sizing: border-box;\\r\\n\\tmargin-bottom: 10px; \\r\\n\\tborder-bottom: 1px solid transparent; \\r\\n}\\r\\n\\t\\t\\r\\n/*Price heads*/\\r\\n.pricing-table h4 {\\r\\n\\ttext-transform: uppercase; \\r\\n\\tpadding: 5px 0; \\r\\n\\tbackground: #666; \\r\\n\\tmargin: -10px 0 1px 0;\\r\\n}\\r\\n\\t\\t\\r\\n/*Price tags*/\\r\\n.price {\\r\\n\\tdisplay: table; \\r\\n\\tbackground: #777; \\r\\n\\twidth: 100%; \\r\\n\\theight: 70px; \\r\\n}\\r\\n\\r\\n.price-figure {\\r\\n\\tfont-size: 18px; \\r\\n\\ttext-transform: uppercase; \\r\\n\\tvertical-align: middle; \\r\\n\\tdisplay: table-cell;\\r\\n border-bottom: 1px solid #ccc; \\r\\n padding: 5px;\\r\\n}\\r\\n\\r\\n.price-number {\\r\\n\\tfont-weight: bold; \\r\\n\\tdisplay: block;\\r\\n}\\r\\n\\r\\n.price-tenure {\\r\\n\\tfont-size: 11px; \\r\\n display: block;\\r\\n}\\r\\n\\t\\t\\r\\n/*Features*/\\r\\n.features {\\r\\n\\tbackground: #DEF0F4; \\r\\n\\tcolor: #000;\\r\\n padding-left: 0px;\\r\\n}\\r\\n\\r\\n.features li {\\r\\n\\tpadding: 8px 15px;\\r\\n\\tborder-bottom: 1px solid #ccc; \\r\\n\\tfont-size: 11px; \\r\\n\\tlist-style-type: none;\\r\\n}\\r\\n\\t\\t\\r\\n.footer {\\r\\n\\tpadding: 10px; \\r\\n\\tbackground: #DEF0F4;\\r\\n}\\r\\n\\r\\n.action-button {\\r\\n\\ttext-decoration: none; \\r\\n\\tcolor: #fff; \\r\\n\\tfont-weight: bold; \\r\\n\\tborder-radius: 5px; \\r\\n\\tbackground: linear-gradient(#666, #333); \\r\\n\\tpadding: 5px 20px; \\r\\n\\tfont-size: 11px; \\r\\n\\ttext-transform: uppercase;\\r\\n}\\r\\n\\r\\n.price-block-selected {\\r\\n\\tbox-shadow: 0 0 0px 5px rgba(0, 0, 0, 0.5); \\r\\n\\ttransform: scale(1.04) translateY(-5px); \\r\\n\\tz-index: 1; \\r\\n\\tborder-bottom: 0 none;\\r\\n}\\r\\n\\r\\n.price-block-selected .price-selected {\\r\\n\\tbackground: #419639;\\r\\n}\\r\\n\\r\\n.price-block-selected h4 {\\r\\n\\tbackground: #555;\\r\\n}\\r\\n\\t\\t\\r\\n@media only screen and (min-width : 480px) and (max-width : 768px) {\\r\\n\\t.price-block {width: 50%;}\\r\\n\\t.price-block:nth-child(odd) {border-right: 1px solid transparent;}\\r\\n\\t.price-block:nth-child(3) {clear: both;}\\r\\n}\\r\\n@media only screen and (min-width : 768px){\\r\\n\\t.price-block {width: 33%;}\\r\\n\\t.price-block {border-right: 1px solid transparent; border-bottom: 0 none;}\\r\\n\\t.price-block:last-child {border-right: 0 none;}\\r\\n}\"\n\n/***/ }),\n\n/***/ 647:\n/***/ (function(module, exports) {\n\nmodule.exports = \"

Email History

\\r\\n\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n

Quote emailed at {{email.createdOn | date:'medium'}} by {{email.createdBy}}

\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n To:\\r\\n {{email.to}}\\r\\n
\\r\\n
\\r\\n CC:\\r\\n {{email.cc}}\\r\\n
\\r\\n
\\r\\n BCC:\\r\\n {{email.bcc}}\\r\\n
\\r\\n
\\r\\n User Attached Files:\\r\\n {{email.attachmentFileNames}}\\r\\n
\\r\\n
\\r\\n Subject:\\r\\n {{email.subject}}\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n Asset Cost Shown:\\r\\n {{email.quoteDocGenData?.showAssetCost ? 'Yes' : 'No'}}\\r\\n
\\r\\n
\\r\\n Included Repayment Options:\\r\\n
\\r\\n
    \\r\\n
  • \\r\\n {{opt.paymentFrequencyName}} for {{opt.term}} months: {{opt.repayment | currency:'AUD'}}\\r\\n
    \\r\\n Balloon Amount: \\r\\n Residual Value: \\r\\n {{opt.residualAmount | currency:'AUD'}}\\r\\n
    \\r\\n
  • \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n \\r\\n\";\n\n/***/ }),\n\n/***/ 648:\n/***/ (function(module, exports) {\n\nmodule.exports = \".email-history-spinner {\\r\\n height: 130px; /* Prevents the scrollbar from appearing on the dialog since the spinner height changes during animation */\\r\\n}\\r\\n\\r\\n.email-content {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.label {\\r\\n font-weight: 600;\\r\\n margin-right: 5px;\\r\\n}\"\n\n/***/ }),\n\n/***/ 649:\n/***/ (function(module, exports) {\n\nmodule.exports = \"
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n Last {{numMonths > 1 ? numMonths + ' Months' : 'Month' }}\\r\\n \\r\\n All Time\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n clear\\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Reference\\r\\n \\r\\n \\r\\n {{ row.enquiryNumber }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Business Name\\r\\n \\r\\n \\r\\n {{ row.businessName }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Contact Name\\r\\n \\r\\n \\r\\n {{ row.contactName }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Product\\r\\n \\r\\n \\r\\n {{ row.product }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Cost of Goods\\r\\n \\r\\n \\r\\n {{ row.costOfGoods | currency:'AUD' }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Term\\r\\n \\r\\n \\r\\n {{ row.term }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Repayment\\r\\n \\r\\n \\r\\n {{ row.repayment | currency:'AUD' }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Created\\r\\n \\r\\n \\r\\n {{ row.createdOn | date:'dd/MM/yyyy' }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Last Email Sent\\r\\n \\r\\n \\r\\n {{ row.lastEmailSentOn | date:'dd/MM/yyyy' }}\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Submitted\\r\\n \\r\\n \\r\\n {{ row.submittedOn | date:'dd/MM/yyyy' }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Actions\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
\";\n\n/***/ }),\n\n/***/ 650:\n/***/ (function(module, exports) {\n\nmodule.exports = \".container {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.search-box {\\r\\n width: 250px;\\r\\n}\\r\\n\\r\\n.clear-search {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.enquiry-table {\\r\\n /*overflow: auto;*/\\r\\n min-width: 1200px;\\r\\n}\\r\\n\\r\\n.table-footer {\\r\\n margin-top: 10px;\\r\\n color: rgba(0,0,0,.54);\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.mat-column-businessName,\\r\\n.mat-column-contactName {\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.mat-column-product,\\r\\n.mat-column-createdOn,\\r\\n.mat-column-lastEmailSentOn,\\r\\n.mat-column-submittedOn {\\r\\n max-width: 130px;\\r\\n}\\r\\n\\r\\n.mat-column-enquiryNumber,\\r\\n.mat-column-costOfGoods,\\r\\n.mat-column-repayment {\\r\\n max-width: 100px;\\r\\n}\\r\\n\\r\\n.mat-column-term,\\r\\n.mat-column-actions {\\r\\n max-width: 50px;\\r\\n}\"\n\n/***/ }),\n\n/***/ 651:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar material_1 = __webpack_require__(29);\r\nvar router_1 = __webpack_require__(26);\r\nvar auth_service_1 = __webpack_require__(85);\r\nvar perspective_service_1 = __webpack_require__(87);\r\nvar theme_service_1 = __webpack_require__(107);\r\nvar change_password_dialog_component_1 = __webpack_require__(179);\r\nvar app_version_1 = __webpack_require__(277);\r\n__webpack_require__(652); //App-wide styles\r\nvar AppComponent = /** @class */ (function () {\r\n function AppComponent(authService, dialog, perspectiveService, router, themeService) {\r\n this.authService = authService;\r\n this.dialog = dialog;\r\n this.perspectiveService = perspectiveService;\r\n this.router = router;\r\n this.themeService = themeService;\r\n this.appVersion = app_version_1.appVersion.Version;\r\n this.releaseDate = app_version_1.appVersion.ReleaseDate;\r\n }\r\n AppComponent.prototype.ngOnInit = function () {\r\n };\r\n AppComponent.prototype.toggleSearchInput = function () {\r\n var _this = this;\r\n this.showSearch = !this.showSearch;\r\n if (this.showSearch) {\r\n // probably shouldnt need this setTimeout?\r\n // https://github.com/angular/material2/issues/1474#issuecomment-293683513\r\n setTimeout(function () {\r\n _this.searchInput.focus();\r\n });\r\n }\r\n };\r\n AppComponent.prototype.onSubmit = function (searchValue) {\r\n this.router.navigate([\"/enquiries\", { \"search\": searchValue }]);\r\n this.searchInput.value = \"\";\r\n this.toggleSearchInput();\r\n };\r\n AppComponent.prototype.goTo = function (route) {\r\n this.sidenav.close();\r\n // force internal staff to set perspective before navigating\r\n if (this.showInternalStaffTools() && !this.perspectiveService.activeIntroducer) {\r\n this.router.navigate([\"/perspective\"]);\r\n }\r\n else {\r\n this.router.navigate([route]);\r\n }\r\n };\r\n AppComponent.prototype.logout = function () {\r\n this.sidenav.close();\r\n this.authService.logout();\r\n this.router.navigate([\"/login\"]);\r\n };\r\n AppComponent.prototype.openChangePasswordDialog = function () {\r\n this.sidenav.close();\r\n var dialogRef = this.dialog.open(change_password_dialog_component_1.ChangePasswordDialogComponent, {\r\n disableClose: true,\r\n data: {\r\n passwordChangeMandatory: false\r\n }\r\n });\r\n };\r\n AppComponent.prototype.perspectiveNotSet = function () {\r\n return this.authService\r\n && this.authService.userHasInternalStaffPermission\r\n && this.perspectiveService\r\n && !this.perspectiveService.activeIntroducer;\r\n };\r\n AppComponent.prototype.showInternalStaffTools = function () {\r\n return this.authService && this.authService.userHasInternalStaffPermission;\r\n };\r\n AppComponent.prototype.showWebAdminTools = function () {\r\n return this.authService && this.authService.userHasWebAdminPermission;\r\n };\r\n __decorate([\r\n core_1.ViewChild(material_1.MatInput),\r\n __metadata(\"design:type\", material_1.MatInput)\r\n ], AppComponent.prototype, \"searchInput\", void 0);\r\n __decorate([\r\n core_1.ViewChild(\"sidenav\"),\r\n __metadata(\"design:type\", material_1.MatSidenav)\r\n ], AppComponent.prototype, \"sidenav\", void 0);\r\n AppComponent = __decorate([\r\n core_1.Component({\r\n selector: \"faw-app\",\r\n template: __webpack_require__(653),\r\n styles: [__webpack_require__(655)]\r\n }),\r\n __metadata(\"design:paramtypes\", [auth_service_1.AuthService,\r\n material_1.MatDialog,\r\n perspective_service_1.PerspectiveService,\r\n router_1.Router,\r\n theme_service_1.ThemeService])\r\n ], AppComponent);\r\n return AppComponent;\r\n}());\r\nexports.AppComponent = AppComponent;\r\n\n\n/***/ }),\n\n/***/ 652:\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n\n/***/ 653:\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = \"\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n visibility\\r\\n {{perspectiveService.activeIntroducer.entityName}}\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n

{{authService.userProfile?.fullName}}

\\r\\n

{{authService.userProfile?.jobTitle}}

\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n Enquiries\\r\\n view_list\\r\\n \\r\\n\\r\\n \\r\\n Perspective\\r\\n visibility\\r\\n \\r\\n\\r\\n \\r\\n Manage Users\\r\\n people\\r\\n \\r\\n\\r\\n \\r\\n Theme Settings\\r\\n format_color_fill\\r\\n \\r\\n\\r\\n \\r\\n Change Password\\r\\n lock\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n Sign Out\\r\\n exit_to_app\\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n Version {{appVersion}} [{{releaseDate}}]\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n
\";\n\n/***/ }),\n\n/***/ 654:\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"assets/faw-logo-navbar.b27db7a4734bc135b391a03ab2d33393.png\";\n\n/***/ }),\n\n/***/ 655:\n/***/ (function(module, exports) {\n\nmodule.exports = \".version-text {\\r\\n text-align: right; \\r\\n padding-top: 10px; \\r\\n padding-right: 10px; \\r\\n font-size: 12px\\r\\n}\"\n\n/***/ }),\n\n/***/ 656:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar perspective_service_1 = __webpack_require__(87);\r\n// see https://angular.io/guide/http#intercepting-all-requests-or-responses\r\n// this interceptor appends the active introducer ID to the query string of any request - only relevent for internal staff users.\r\nvar PerspectiveInterceptor = /** @class */ (function () {\r\n function PerspectiveInterceptor(perspectiveService) {\r\n this.perspectiveService = perspectiveService;\r\n }\r\n PerspectiveInterceptor.prototype.intercept = function (req, next) {\r\n var activeIntroducerID = this.perspectiveService.getActiveIntroducerID();\r\n if (activeIntroducerID) {\r\n var reqWithParam = req.clone({ params: req.params.set(\"activeIntroducerID\", this.perspectiveService.getActiveIntroducerID()) });\r\n return next.handle(reqWithParam);\r\n }\r\n else {\r\n return next.handle(req);\r\n }\r\n };\r\n PerspectiveInterceptor = __decorate([\r\n core_1.Injectable(),\r\n __metadata(\"design:paramtypes\", [perspective_service_1.PerspectiveService])\r\n ], PerspectiveInterceptor);\r\n return PerspectiveInterceptor;\r\n}());\r\nexports.PerspectiveInterceptor = PerspectiveInterceptor;\r\n\n\n/***/ }),\n\n/***/ 85:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nvar __param = (this && this.__param) || function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar http_1 = __webpack_require__(33);\r\nvar router_1 = __webpack_require__(26);\r\nvar angular_jwt_1 = __webpack_require__(172);\r\nvar rxjs_1 = __webpack_require__(4);\r\nvar operators_1 = __webpack_require__(6);\r\nvar handle_error_1 = __webpack_require__(86);\r\nvar perspective_service_1 = __webpack_require__(87);\r\nvar role_const_1 = __webpack_require__(177);\r\nvar theme_service_1 = __webpack_require__(107);\r\nvar AuthService = /** @class */ (function () {\r\n function AuthService(http, jwtService, perspectiveService, role, router, themeService) {\r\n this.http = http;\r\n this.jwtService = jwtService;\r\n this.perspectiveService = perspectiveService;\r\n this.role = role;\r\n this.router = router;\r\n this.themeService = themeService;\r\n this._userProfile = JSON.parse(localStorage.getItem(\"profile\"));\r\n }\r\n ;\r\n Object.defineProperty(AuthService.prototype, \"userProfile\", {\r\n get: function () {\r\n return this._userProfile;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(AuthService.prototype, \"userHasInternalStaffPermission\", {\r\n get: function () {\r\n return this._userProfile\r\n ? this._userProfile.role === this.role.internalStaff\r\n : false;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(AuthService.prototype, \"userHasWebAdminPermission\", {\r\n get: function () {\r\n return this._userProfile\r\n ? (this._userProfile.role === this.role.internalStaff || this._userProfile.role === this.role.webAdmin)\r\n : false;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n AuthService.prototype.handleTokenRequestError = function (errResponse) {\r\n var message;\r\n if (errResponse.error != null && errResponse.error.error === \"invalid_grant\") {\r\n var oauthError = errResponse.error;\r\n message = oauthError.error_description;\r\n }\r\n else {\r\n message = errResponse.statusText + \" (\" + errResponse.status + \")\";\r\n }\r\n return rxjs_1.throwError(message);\r\n };\r\n AuthService.prototype.changePassword = function (dto) {\r\n var url = \"api/profile/change-password\";\r\n return this.http.post(url, dto)\r\n .toPromise()\r\n .catch(handle_error_1.handleError);\r\n };\r\n AuthService.prototype.loggedIn = function () {\r\n if (this.jwtService.tokenGetter()) {\r\n return (!this.jwtService.isTokenExpired() && this.userProfile != null);\r\n }\r\n else {\r\n return false;\r\n }\r\n };\r\n AuthService.prototype.login = function (creds) {\r\n var _this = this;\r\n var body = \"grant_type=password&username=\" + creds.username + \"&password=\" + creds.password;\r\n return this.http\r\n .post(\"api/connect/token\", body, {\r\n headers: new http_1.HttpHeaders().set(\"Content-Type\", \"application/x-www-form-urlencoded\")\r\n })\r\n .pipe(operators_1.catchError(this.handleTokenRequestError), operators_1.flatMap(function (data) {\r\n localStorage.setItem(\"access_token\", data.access_token);\r\n return _this.http.get(\"api/profile\")\r\n .toPromise()\r\n .then(function (profile) {\r\n localStorage.setItem(\"profile\", JSON.stringify(profile));\r\n _this._userProfile = profile;\r\n // internal staff have their theme set via the perspective component\r\n if (!_this.userHasInternalStaffPermission) {\r\n // themeService has its own \"handleError\" function\r\n _this.themeService.getTheme()\r\n .catch(function (err) { return console.log(\"Error retrieving theme settings.\"); });\r\n }\r\n return profile;\r\n })\r\n .catch(handle_error_1.handleError);\r\n }));\r\n };\r\n AuthService.prototype.logout = function () {\r\n localStorage.removeItem(\"access_token\");\r\n localStorage.removeItem(\"profile\");\r\n this._userProfile = null;\r\n this.themeService.removeActiveTheme();\r\n // only relevant for internal staff users\r\n this.perspectiveService.removeActiveIntroducer();\r\n };\r\n AuthService = __decorate([\r\n core_1.Injectable(),\r\n __param(3, core_1.Inject(role_const_1.role)),\r\n __metadata(\"design:paramtypes\", [http_1.HttpClient,\r\n angular_jwt_1.JwtHelperService,\r\n perspective_service_1.PerspectiveService, Object, router_1.Router,\r\n theme_service_1.ThemeService])\r\n ], AuthService);\r\n return AuthService;\r\n}());\r\nexports.AuthService = AuthService;\r\n\n\n/***/ }),\n\n/***/ 86:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nfunction handleError(err) {\r\n var rejectWithMessage = \"Unexpected error occurred - please contact an administrator if the issue persists.\";\r\n if (err.error instanceof Error) {\r\n // A client-side or network error occurred. Handle it accordingly.\r\n rejectWithMessage = \"Client error occurred - please contact an administrator if the issue persists.\";\r\n console.log(\"Client error: \" + err.error.message);\r\n }\r\n else if (err.error && err.error.displayMessage) {\r\n // if the response body is json and \"displayMessage\" exists, then assume it's\r\n // an instance of PortalServerErrorException\r\n rejectWithMessage = \"Server error (\" + err.status + \"): \" + err.error.displayMessage;\r\n console.log(\"Server error (\" + err.status + \"): \" + err.error.logMessage);\r\n }\r\n else {\r\n // The backend returned an unsuccessful response code.\r\n // The response body may contain clues as to what went wrong,\r\n if (err.status == 401) {\r\n rejectWithMessage = \"Security token expired - please login again.\";\r\n }\r\n else {\r\n rejectWithMessage = \"Server error (\" + err.status + \") - please contact an administrator if the issue persists.\";\r\n console.log(\"Server error (\" + err.status + \"): \" + err.error);\r\n }\r\n }\r\n return Promise.reject(rejectWithMessage);\r\n}\r\nexports.handleError = handleError;\r\n\n\n/***/ }),\n\n/***/ 87:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (this && this.__metadata) || function (k, v) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar core_1 = __webpack_require__(1);\r\nvar PerspectiveService = /** @class */ (function () {\r\n function PerspectiveService() {\r\n this._activeIntroducer = JSON.parse(localStorage.getItem(\"active_introducer\"));\r\n }\r\n Object.defineProperty(PerspectiveService.prototype, \"activeIntroducer\", {\r\n get: function () {\r\n //if (!this.activeIntroducer) {\r\n // this.router.navigate([\"/perspective\"]);\r\n //}\r\n return this._activeIntroducer;\r\n },\r\n set: function (value) {\r\n // save to localStorage incase user refreshes the browser\r\n localStorage.setItem(\"active_introducer\", JSON.stringify(value));\r\n this._activeIntroducer = value;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n PerspectiveService.prototype.getActiveIntroducerID = function () {\r\n return this._activeIntroducer\r\n ? this._activeIntroducer.entityID.toString()\r\n : null;\r\n };\r\n PerspectiveService.prototype.removeActiveIntroducer = function () {\r\n localStorage.removeItem(\"active_introducer\");\r\n this._activeIntroducer = null;\r\n };\r\n PerspectiveService = __decorate([\r\n core_1.Injectable(),\r\n __metadata(\"design:paramtypes\", [])\r\n ], PerspectiveService);\r\n return PerspectiveService;\r\n}());\r\nexports.PerspectiveService = PerspectiveService;\r\n\n\n/***/ })\n\n},[614]);\n\n\n// WEBPACK FOOTER //\n// dist/app.c49420e8f9280dc70662.js","import { Injectable } from \"@angular/core\";\r\nimport { HttpClient, HttpErrorResponse, HttpHeaders, HttpResponse } from \"@angular/common/http\";\r\nimport { Observable } from \"rxjs\";\r\nimport { catchError } from \"rxjs/operators\";\r\n\r\nimport { Theme } from \"./theme.model\";\r\nimport { handleError } from \"../shared/handle-error\";\r\n\r\n@Injectable()\r\nexport class ThemeService {\r\n private themesUrl = \"api/themes\"; // url to web api\r\n private _activeTheme: Theme;\r\n\r\n constructor(private http: HttpClient) {\r\n this._activeTheme = JSON.parse(localStorage.getItem(\"active_theme\"));\r\n }\r\n\r\n get primaryColour(): string {\r\n return (this._activeTheme\r\n && this._activeTheme.primaryColour)\r\n ? this._activeTheme.primaryColour\r\n : null;\r\n }\r\n\r\n get navbarLogo(): string {\r\n return (this._activeTheme\r\n && this._activeTheme.navbarLogo\r\n && this._activeTheme.navbarLogo.fileContentBase64)\r\n ? `data:image/png;base64,${this._activeTheme.navbarLogo.fileContentBase64}`\r\n : null;\r\n }\r\n\r\n private set activeTheme(value: Theme) {\r\n // save to localStorage incase user refreshes the browser\r\n localStorage.setItem(\"active_theme\", JSON.stringify(value))\r\n this._activeTheme = value;\r\n }\r\n\r\n getTheme(): Promise {\r\n return this.http.get(this.themesUrl)\r\n .toPromise()\r\n .then(theme => {\r\n this.activeTheme = theme;\r\n return theme;\r\n })\r\n .catch(handleError);\r\n }\r\n\r\n removeActiveTheme(): void {\r\n localStorage.removeItem(\"active_theme\");\r\n this._activeTheme = null;\r\n }\r\n\r\n update(theme: Theme): Promise {\r\n return this.http.post(this.themesUrl, theme)\r\n .toPromise()\r\n .then(() => {\r\n // only replace the whole theme object if user attempted to upload a logo as part of the form submission,\r\n // to prevent the current logo from disappearing.\r\n if (theme.navbarLogo != null) {\r\n this.activeTheme = theme;\r\n } else {\r\n this._activeTheme.primaryColour = theme.primaryColour;\r\n }\r\n })\r\n .catch(handleError);\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/core/theme.service.ts","import { Injectable } from \"@angular/core\";\r\nimport { FormControl, AbstractControl } from \"@angular/forms\";\r\n\r\n@Injectable()\r\nexport class ValidationHelperService {\r\n constructor() { }\r\n\r\n // https://github.com/angular/angular/issues/11774#issuecomment-264706699\r\n markAllTouched(control: AbstractControl) {\r\n if (control.hasOwnProperty(\"controls\")) {\r\n control.markAsTouched({ onlySelf: true }) // mark group\r\n let ctrl = control;\r\n for (let inner in ctrl.controls) {\r\n this.markAllTouched(ctrl.controls[inner] as AbstractControl);\r\n }\r\n }\r\n else {\r\n ((control)).markAsTouched({ onlySelf: true });\r\n }\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/core/validation-helper.service.ts","import { NgModule } from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { ColorPickerModule } from \"ngx-color-picker\";\r\nimport { FlexLayoutModule } from \"@angular/flex-layout\";\r\nimport { ReactiveFormsModule } from \"@angular/forms\";\r\n\r\nimport { FAWMaterialModule } from \"./faw-material.module\";\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n ColorPickerModule,\r\n FlexLayoutModule,\r\n ReactiveFormsModule,\r\n\r\n FAWMaterialModule,\r\n ],\r\n\r\n exports: [\r\n CommonModule,\r\n ColorPickerModule,\r\n FlexLayoutModule,\r\n ReactiveFormsModule,\r\n\r\n FAWMaterialModule,\r\n ]\r\n})\r\n\r\nexport class SharedModule { }\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/shared/shared.module.ts","import { Injectable } from \"@angular/core\";\r\nimport { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from \"@angular/router\";\r\n\r\nimport { AuthService } from \"./auth.service\";\r\n\r\n@Injectable()\r\nexport class AuthGuard implements CanActivate {\r\n constructor(private authService: AuthService, private router: Router) { }\r\n\r\n canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\r\n let url: string = state.url;\r\n return this.checkLogin(url);\r\n }\r\n\r\n checkLogin(url: string): boolean {\r\n if (this.authService.loggedIn()) { return true; }\r\n this.authService.redirectUrl = url;\r\n this.router.navigate([\"/login\"]);\r\n\r\n return false;\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/auth/auth-guard.service.ts","import { InjectionToken } from \"@angular/core\";\r\n\r\n// http://stackoverflow.com/a/40287063\r\nexport let role = new InjectionToken(\"role\");\r\n\r\nexport interface Role {\r\n webUser: string;\r\n webAdmin: string;\r\n internalStaff: string;\r\n}\r\n\r\nexport const Role: Role = {\r\n webUser: \"WebUser\",\r\n webAdmin: \"WebAdmin\",\r\n internalStaff: \"InternalStaff\"\r\n};\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/core/role.const.ts","import { Injectable } from \"@angular/core\";\r\nimport { HttpClient, HttpErrorResponse, HttpParams, HttpHeaders, HttpResponse } from \"@angular/common/http\";\r\nimport { Observable } from \"rxjs\";\r\nimport { catchError } from \"rxjs/operators\";\r\n\r\nimport { handleError } from \"../../shared/handle-error\";\r\nimport { TemporaryPassword } from \"./temporary-password.model\";\r\nimport { User } from \"./user.model\";\r\nimport { UserListing } from \"./user-listing.model\";\r\nimport { UserOptions } from \"./user-options.model\";\r\n\r\n@Injectable()\r\nexport class UserService {\r\n private usersUrl = \"api/users\"; // url to web api\r\n\r\n constructor(private http: HttpClient) { }\r\n\r\n getUser(id: number): Promise {\r\n const url = `${this.usersUrl}/${id}`;\r\n return this.http.get(url)\r\n .toPromise()\r\n .catch(handleError);\r\n }\r\n\r\n getListing(): Promise {\r\n return this.http.get(this.usersUrl)\r\n .toPromise()\r\n .catch(handleError);;\r\n }\r\n\r\n getOptions(): Promise {\r\n const url = `${this.usersUrl}/options`;\r\n return this.http.get(url)\r\n .toPromise()\r\n .catch(handleError);\r\n }\r\n\r\n resetPassword(userID: number): Promise {\r\n const url = `${this.usersUrl}/${userID}/reset-password`;\r\n return this.http.post(url, null)\r\n .toPromise()\r\n .catch(handleError);\r\n }\r\n\r\n update(user: User): Promise {\r\n const url = `${this.usersUrl}/${user.id}`;\r\n return this.http.put(url, user)\r\n .toPromise()\r\n .then(() => user)\r\n .catch(handleError);\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/admin/shared/user.service.ts","import { Component, OnInit, Inject } from \"@angular/core\";\r\nimport { FormBuilder, FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from \"@angular/material\";\r\n\r\nimport { AuthService } from \"../../auth/auth.service\";\r\nimport { SnackBarService } from \"../../core/snack-bar.service\";\r\nimport { ValidationHelperService } from \"../../core/validation-helper.service\";\r\n\r\nimport { ChangePassword } from \"./change-password.model\";\r\n\r\n@Component({\r\n template: require('./change-password-dialog.component.html'),\r\n styles: [require('./change-password-dialog.component.css')]\r\n})\r\nexport class ChangePasswordDialogComponent implements OnInit {\r\n changePasswordForm: FormGroup;\r\n passwordChangeMandatory: boolean;\r\n loading: boolean;\r\n\r\n constructor(\r\n private authService: AuthService,\r\n private fb: FormBuilder,\r\n private snackBarService: SnackBarService,\r\n private validationHelperService: ValidationHelperService,\r\n @Inject(MAT_DIALOG_DATA) public data: any,\r\n public dialogRef: MatDialogRef) {\r\n\r\n this.changePasswordForm = this.fb.group({\r\n newPassword: ['', [Validators.required, Validators.maxLength(100)]],\r\n confirmPassword: ['', [Validators.required, Validators.maxLength(100)]],\r\n }, { validator: this.checkPasswords }); // see https://stackoverflow.com/a/43493648\r\n }\r\n\r\n ngOnInit() {\r\n this.passwordChangeMandatory = this.data.passwordChangeMandatory as boolean;\r\n }\r\n\r\n get newPasswordFC(): FormControl { return this.changePasswordForm.get(\"newPassword\") as FormControl; }\r\n get confirmPasswordFC(): FormControl { return this.changePasswordForm.get(\"confirmPassword\") as FormControl; }\r\n\r\n actionsDisabled(): boolean {\r\n return this.loading;\r\n }\r\n\r\n checkPasswords(group: FormGroup) {\r\n const newPassword = group.get(\"newPassword\").value;\r\n const confirmPassword = group.get(\"confirmPassword\").value;\r\n\r\n return newPassword === confirmPassword ? null : { notSame: true };\r\n }\r\n\r\n onSubmit(): void {\r\n if (this.changePasswordForm.invalid) {\r\n this.validationHelperService.markAllTouched(this.changePasswordForm);\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n const dto: ChangePassword = this.changePasswordForm.value;\r\n\r\n this.authService.changePassword(dto)\r\n .then(() => {\r\n this.loading = false;\r\n this.snackBarService.openSnackBar(\"Password updated.\");\r\n this.dialogRef.close();\r\n })\r\n .catch(err => {\r\n this.loading = false;\r\n this.snackBarService.openSnackBar(err);\r\n });\r\n }\r\n\r\n showPasswordMismatchError(): boolean {\r\n return this.confirmPasswordFC.touched && this.changePasswordForm.hasError(\"notSame\");\r\n }\r\n\r\n showSpinner(): boolean {\r\n return this.loading;\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/auth/change-password-dialog/change-password-dialog.component.ts","import { Injectable } from \"@angular/core\";\r\nimport { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Observable } from \"rxjs\";\r\nimport { catchError } from \"rxjs/operators\";\r\n\r\nimport { Enquiry } from \"./enquiry.model\";\r\nimport { EnquiryListing } from \"./enquiry-listing.model\";\r\nimport { EnquiryOptions } from \"./enquiry-options.model\";\r\nimport { QuoteDocGenData } from \"./quote-doc-gen-data.model\";\r\nimport { RepaymentCalculation } from \"./repayment-calculation.model\";\r\nimport { RepaymentOption } from \"./repayment-option.model\";\r\nimport { handleError } from \"../../shared/handle-error\";\r\nimport { VirtualRepeatContainer } from \"../../shared/virtual-repeat-container.model\";\r\n\r\n@Injectable()\r\nexport class EnquiryService {\r\n private enquiriesUrl = \"api/enquiries\"; // url to web api\r\n private defaultEnquiry: Enquiry;\r\n\r\n constructor(\r\n private http: HttpClient) {\r\n\r\n this.defaultEnquiry = {\r\n id: null,\r\n enquiryNumber: null,\r\n introducerRateChartID: null,\r\n assetTypeGroupID: null,\r\n costOfGoods: null,\r\n isAdvance: null,\r\n paymentFrequencyID: null,\r\n repayment: null,\r\n term: null,\r\n contactName: null,\r\n businessName: null,\r\n emailAddress: null,\r\n submittedOn: null,\r\n }\r\n }\r\n\r\n create(enq: Enquiry): Promise {\r\n return this.http.post(this.enquiriesUrl, enq)\r\n .toPromise()\r\n .catch(handleError);\r\n }\r\n\r\n getEnquiry(id: number): Promise {\r\n if (!id) {\r\n return Promise.resolve(this.defaultEnquiry);\r\n }\r\n\r\n const url = `${this.enquiriesUrl}/${id}`;\r\n return this.http.get(url)\r\n .toPromise()\r\n .catch(handleError);\r\n }\r\n\r\n // Virtual scroll EnquiryListing implementation - removed for now, since generated SQL is not compatible with SQL2008R2\r\n //getListing(skip: number, take: number, sortBy: string, sortDirection: string, searchString: string): Observable> {\r\n // return this.http.get>(this.enquiriesUrl, {\r\n // params: new HttpParams()\r\n // .set(\"skip\", (skip != null) ? String(skip) : \"\")\r\n // .set(\"take\", (take != null) ? String(take) : \"\")\r\n // .set(\"sortBy\", (sortBy != null) ? String(sortBy) : \"\")\r\n // .set(\"sortDirection\", (sortDirection != null) ? String(sortDirection) : \"\")\r\n // .set(\"searchString\", (searchString != null) ? String(searchString) : \"\")\r\n // })\r\n // .catch(handleError);;\r\n //}\r\n\r\n getListing(monthsAgo: number): Promise {\r\n return this.http.get(this.enquiriesUrl, {\r\n params: new HttpParams().set(\"monthsAgo\", (monthsAgo != null) ? String(monthsAgo) : \"\")\r\n })\r\n .toPromise()\r\n .catch(handleError);;\r\n }\r\n\r\n getOptions(): Promise {\r\n const url = `${this.enquiriesUrl}/options`;\r\n return this.http.get(url)\r\n .toPromise()\r\n .catch(handleError);\r\n }\r\n\r\n getRepaymentOptions(calcParams: RepaymentCalculation): Observable {\r\n return this.http.post(`${this.enquiriesUrl}/repayments`, calcParams)\r\n .pipe(catchError(handleError));\r\n }\r\n\r\n submit(enq: Enquiry): Promise {\r\n return this.http\r\n .post(`${this.enquiriesUrl}/submit`, enq, {\r\n params: new HttpParams().set(\"id\", (enq.id != null ? String(enq.id) : \"\"))\r\n })\r\n .toPromise()\r\n .catch(handleError);\r\n }\r\n\r\n update(enq: Enquiry): Promise {\r\n const url = `${this.enquiriesUrl}/${enq.id}`;\r\n return this.http.put(url, enq)\r\n .toPromise()\r\n .then(() => enq)\r\n .catch(handleError);\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/enquiry/shared/enquiry.service.ts","import { Injectable } from \"@angular/core\";\r\nimport { HttpClient, HttpErrorResponse, HttpHeaders, HttpResponse } from \"@angular/common/http\";\r\nimport { Observable } from \"rxjs\";\r\nimport { catchError } from \"rxjs/operators\";\r\n\r\nimport { QuoteDocGenData } from \"./quote-doc-gen-data.model\";\r\nimport { RepaymentOption } from \"./repayment-option.model\";\r\nimport { handleError } from \"../../shared/handle-error\";\r\n\r\n@Injectable()\r\nexport class DocumentService {\r\n private enquiriesUrl = \"api/enquiries\"; // url to web api\r\n\r\n constructor(private http: HttpClient) {}\r\n\r\n downloadApplicationForm(enquiryID: number): Observable> {\r\n const url = `${this.enquiriesUrl}/${enquiryID}/application`;\r\n return this.http\r\n .get(url, {\r\n responseType: \"blob\",\r\n observe: \"response\", // observing the full response object since we want to extract the generated fileName from a http header\r\n headers: new HttpHeaders().set(\"Accept\", \"application/pdf\")\r\n })\r\n .pipe(catchError(handleError));\r\n }\r\n\r\n downloadQuotePdf(enquiryID: number, docGenData: QuoteDocGenData): Observable> {\r\n const url = `${this.enquiriesUrl}/${enquiryID}/pdf`;\r\n return this.http\r\n .post(url, docGenData, {\r\n responseType: \"blob\",\r\n observe: \"response\", // observing the full response object since we want to extract the generated fileName from a http header\r\n headers: new HttpHeaders().set(\"Accept\", \"application/pdf\")\r\n })\r\n .pipe(catchError(handleError));\r\n }\r\n\r\n prepareQuoteDocGenData(showAssetCost: boolean, checkboxValues: boolean[], repaymentOptions: RepaymentOption[]): QuoteDocGenData {\r\n // includeRepaymentOpts will contain all the repayment options, but unchecked ones will be null\r\n const includeRepaymentOpts: RepaymentOption[] = checkboxValues.map(\r\n (checked: boolean, index) => {\r\n if (checked) {\r\n return Object.assign({}, repaymentOptions[index]);\r\n }\r\n });\r\n\r\n const docGenData: QuoteDocGenData = {\r\n showAssetCost: showAssetCost,\r\n repaymentOptions: includeRepaymentOpts.filter(r => r != null)\r\n };\r\n\r\n return docGenData;\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/enquiry/shared/document.service.ts","import { Injectable } from \"@angular/core\";\r\nimport { HttpClient, HttpErrorResponse, HttpHeaders, HttpResponse } from \"@angular/common/http\";\r\nimport { Observable } from \"rxjs\";\r\nimport { catchError } from \"rxjs/operators\";\r\n\r\nimport { Email } from \"./email.model\";\r\nimport { EmailListing } from \"./email-listing.model\";\r\nimport { handleError } from \"../../shared/handle-error\";\r\n\r\n@Injectable()\r\nexport class EmailService {\r\n private enquiriesUrl = \"api/enquiries\"; // url to web api\r\n\r\n constructor(private http: HttpClient) { }\r\n\r\n getListing(enquiryID: number): Promise {\r\n const url = `${this.enquiriesUrl}/${enquiryID}/emails`;\r\n return this.http.get(url)\r\n .toPromise()\r\n .catch(handleError);\r\n }\r\n\r\n sendEmail(enquiryID: number, email: Email): Promise {\r\n const url = `${this.enquiriesUrl}/${enquiryID}/emails`;\r\n return this.http.post(url, email)\r\n .toPromise()\r\n .catch(handleError);\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/enquiry/shared/email.service.ts","import { Component, OnInit } from \"@angular/core\";\r\nimport { FormBuilder, FormGroup, FormControl, Validators } from \"@angular/forms\";\r\nimport { Router } from \"@angular/router\";\r\n\r\nimport { SnackBarService } from \"../../core/snack-bar.service\";\r\nimport { ThemeService } from \"../../core/theme.service\";\r\n\r\nimport { FileDto } from \"../../shared/file-dto.model\";\r\nimport { Theme } from \"../../core/theme.model\";\r\n\r\n@Component({\r\n template: require('./theme-settings.component.html'),\r\n styles: [require('./theme-settings.component.css')]\r\n})\r\nexport class ThemeSettingsComponent implements OnInit {\r\n fileInputFC: FormControl;\r\n loading: boolean;\r\n loadingSave: boolean;\r\n themeForm: FormGroup;\r\n themeSettings: Theme;\r\n\r\n constructor(\r\n private fb: FormBuilder,\r\n private router: Router,\r\n private snackBarService: SnackBarService,\r\n private themeService: ThemeService) {\r\n\r\n this.fileInputFC = new FormControl();\r\n this.themeForm = this.fb.group({\r\n primaryColour: ['', Validators.maxLength(20)],\r\n navbarLogo: null\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.loading = true;\r\n\r\n this.themeService.getTheme()\r\n .then(theme => {\r\n this.loading = false;\r\n this.themeSettings = theme;\r\n this.primaryColourFC.setValue(theme.primaryColour);\r\n })\r\n .catch(err => {\r\n this.loading = false;\r\n this.snackBarService.openSnackBar(\"Error retrieving theme settings.\");\r\n });\r\n }\r\n\r\n get primaryColourFC(): FormControl { return this.themeForm.get(\"primaryColour\") as FormControl }\r\n get navbarLogoFC(): FormControl { return this.themeForm.get(\"navbarLogo\") as FormControl; }\r\n\r\n actionsDisabled(): boolean {\r\n return this.showLoadingSpinner()\r\n || this.showSaveSpinner();\r\n }\r\n\r\n getPreviewLogo(): string {\r\n let imagePreview: string = null;\r\n if (this.navbarLogoFC != null && this.navbarLogoFC.value != null) {\r\n const selectedFile = this.navbarLogoFC.value as FileDto;\r\n imagePreview = `data:image/png;base64,${selectedFile.fileContentBase64}`;\r\n }\r\n\r\n return imagePreview;\r\n }\r\n\r\n goToEnquiriesList(): void {\r\n this.router.navigate([\"/enquiries\"]);\r\n }\r\n\r\n validImageFile(imgFile: File): boolean {\r\n return (imgFile.type === \"image/png\"\r\n && imgFile.size <= 100000);\r\n }\r\n\r\n // refer to docs for File obj structure https://developer.mozilla.org/en-US/docs/Web/API/File\r\n // code modified from https://nehalist.io/uploading-files-in-angular2/\r\n onFileChange(event: any) {\r\n let reader = new FileReader();\r\n if (event.target.files && event.target.files.length > 0) {\r\n let file = event.target.files[0];\r\n reader.readAsDataURL(file); // see https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL\r\n reader.onload = () => {\r\n\r\n if (this.validImageFile(file)) {\r\n this.navbarLogoFC.setValue({\r\n fileName: file.name,\r\n fileType: file.type,\r\n // readAsDataURL() returns a string in the form \"data:image/png;base64,JVBERi0x...\"\r\n fileContentBase64: (reader.result as string).split(',')[1]\r\n })\r\n } else {\r\n this.snackBarService.openSnackBar(\"Logo must be PNG and less than 100KB.\");\r\n }\r\n\r\n this.fileInputFC.reset();\r\n };\r\n }\r\n }\r\n\r\n save(): void {\r\n //if (this.themeForm.invalid()) {\r\n // //this.validationHelperService.markAllTouched(this.themeForm);\r\n // this.snackBarService.openSnackBar(\"Please fill in required values.\");\r\n // return;\r\n //}\r\n\r\n this.loadingSave = true;\r\n const themeSettings = this.themeForm.value as Theme;\r\n\r\n this.themeService.update(themeSettings)\r\n .then(() => {\r\n this.loadingSave = false;\r\n this.snackBarService.openSnackBar(\"Theme settings updated.\");\r\n })\r\n .catch(err => {\r\n this.loadingSave = false;\r\n this.snackBarService.openSnackBar(err);\r\n });\r\n }\r\n\r\n showLoadingSpinner(): boolean {\r\n return this.loading;\r\n }\r\n\r\n showSaveSpinner(): boolean {\r\n return this.loadingSave;\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/admin/theme-settings/theme-settings.component.ts","import { Component, OnInit } from \"@angular/core\";\r\nimport { FormBuilder, FormGroup, FormControl, Validators } from \"@angular/forms\";\r\nimport { ActivatedRoute, ParamMap, Router } from \"@angular/router\";\r\nimport { MatDialog, MatDialogConfig } from \"@angular/material\";\r\nimport { Observable, Subject } from \"rxjs\";\r\nimport { switchMap, takeUntil } from \"rxjs/operators\";\r\n\r\nimport { ConfirmDialogComponent } from \"../../core/confirm-dialog/confirm-dialog.component\";\r\nimport { UserService } from \"../shared/user.service\";\r\nimport { SnackBarService } from \"../../core/snack-bar.service\";\r\nimport { ValidationHelperService } from \"../../core/validation-helper.service\";\r\n\r\nimport { TemporaryPassword } from \"../shared/temporary-password.model\";\r\nimport { User } from \"../shared/user.model\";\r\nimport { UserOptions } from \"../shared/user-options.model\";\r\n\r\n@Component({\r\n template: require('./user-detail.component.html'),\r\n styles: [require('./user-detail.component.css')]\r\n})\r\nexport class UserDetailComponent implements OnInit {\r\n loading: boolean;\r\n loadingSave: boolean;\r\n user: User;\r\n userForm: FormGroup;\r\n userOpts: UserOptions;\r\n\r\n private ngUnsubscribe: Subject = new Subject(); //see https://stackoverflow.com/a/41177163\r\n\r\n constructor(\r\n private activatedRoute: ActivatedRoute,\r\n private dialog: MatDialog,\r\n private fb: FormBuilder,\r\n private userService: UserService,\r\n private router: Router,\r\n private snackBarService: SnackBarService,\r\n private validationHelperService: ValidationHelperService) {\r\n\r\n this.userForm = this.fb.group({\r\n username: '',\r\n nameTitleCode: '',\r\n firstName: ['', [Validators.required, Validators.maxLength(60)]],\r\n middleName: ['', Validators.maxLength(60)],\r\n lastName: ['', [Validators.required, Validators.maxLength(60)]],\r\n emailAddress: ['', [Validators.required, Validators.maxLength(100)]],\r\n phoneNumber: ['', Validators.maxLength(20)],\r\n mobileNumber: ['', Validators.maxLength(20)],\r\n jobTitle: ['', Validators.maxLength(250)],\r\n isWebAdmin: false,\r\n isActive: false,\r\n isLocked: false,\r\n temporaryPassword: ''\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.loading = true;\r\n\r\n this.userService.getOptions()\r\n .then(opts => {\r\n this.userOpts = opts;\r\n\r\n this.activatedRoute.paramMap\r\n .pipe(\r\n switchMap((params: ParamMap) => this.userService.getUser(+params.get(\"id\"))), // (+) converts string \"id\" to a number\r\n takeUntil(this.ngUnsubscribe)\r\n )\r\n .subscribe(user => {\r\n this.loading = false;\r\n this.user = user;\r\n this.userForm.patchValue(user);\r\n this.userForm.get(\"username\").disable();\r\n this.temporaryPasswordFC.disable();\r\n },\r\n err => {\r\n this.loading = false;\r\n this.snackBarService.openSnackBar(\"Error retrieving user.\");\r\n });\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n get temporaryPasswordFC(): FormControl { return this.userForm.get(\"temporaryPassword\") as FormControl; }\r\n\r\n actionsDisabled(): boolean {\r\n return this.showLoadingSpinner()\r\n || this.showSaveSpinner();\r\n }\r\n\r\n goToUsersList(): void {\r\n this.router.navigate([\"/users\"]);\r\n }\r\n\r\n prepareSaveUser(): User {\r\n const formModel = this.userForm.value;\r\n // note - username field will be disabled, currently ignored by the backend anyway\r\n const username = this.userForm.get(\"username\").value as string;\r\n\r\n const saveUser: User = {\r\n id: this.user.id,\r\n username: username,\r\n nameTitleCode: formModel.nameTitleCode as string,\r\n firstName: formModel.firstName as string,\r\n middleName: formModel.middleName as string,\r\n lastName: formModel.lastName as string,\r\n emailAddress: formModel.emailAddress as string,\r\n phoneNumber: formModel.phoneNumber as string,\r\n mobileNumber: formModel.mobileNumber as string,\r\n jobTitle: formModel.jobTitle as string,\r\n isWebAdmin: formModel.isWebAdmin as boolean,\r\n isActive: formModel.isActive as boolean,\r\n isLocked: formModel.isLocked as boolean,\r\n };\r\n\r\n return saveUser;\r\n }\r\n\r\n resetPassword(): void {\r\n let dialogRef = this.dialog.open(ConfirmDialogComponent);\r\n dialogRef.componentInstance.question = \"Reset password?\";\r\n dialogRef.componentInstance.confirmButtonLabel = \"RESET\";\r\n\r\n dialogRef.afterClosed().subscribe(userConfirmed => {\r\n if (userConfirmed) {\r\n this.loadingSave = true;\r\n\r\n this.userService.resetPassword(this.user.id)\r\n .then(res => {\r\n this.loadingSave = false;\r\n \r\n this.temporaryPasswordFC.setValue(res.temporaryPassword);\r\n this.temporaryPasswordFC.disable();\r\n\r\n this.snackBarService.openSnackBar(\"Password has been reset.\");\r\n })\r\n .catch(err => {\r\n this.loadingSave = false;\r\n this.snackBarService.openSnackBar(err);\r\n });\r\n }\r\n });\r\n }\r\n\r\n save(): void {\r\n if (this.userForm.invalid) {\r\n this.validationHelperService.markAllTouched(this.userForm);\r\n this.snackBarService.openSnackBar(\"Please fill in required values.\");\r\n return;\r\n }\r\n\r\n this.loadingSave = true;\r\n const userToSave = this.prepareSaveUser();\r\n\r\n this.userService.update(userToSave)\r\n .then(() => {\r\n this.loadingSave = false;\r\n this.snackBarService.openSnackBar(\"User updated.\");\r\n this.goToUsersList();\r\n })\r\n .catch(err => {\r\n this.loadingSave = false;\r\n this.snackBarService.openSnackBar(err);\r\n });\r\n }\r\n\r\n showLoadingSpinner(): boolean {\r\n return this.loading;\r\n }\r\n\r\n showSaveSpinner(): boolean {\r\n return this.loadingSave;\r\n }\r\n\r\n showTemporaryPassword(): boolean {\r\n return this.temporaryPasswordFC.value;\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/admin/user-detail/user-detail.component.ts","import { Component, OnInit } from \"@angular/core\";\r\nimport { MatDialogRef } from \"@angular/material\";\r\n\r\n@Component({\r\n template: require('./confirm-dialog.component.html'),\r\n //styles: [require('./confirm-dialog.component.css')]\r\n})\r\nexport class ConfirmDialogComponent implements OnInit {\r\n question: string;\r\n confirmButtonLabel: string;\r\n cancelButtonLabel: string;\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef) { }\r\n\r\n ngOnInit() {\r\n this.confirmButtonLabel = this.confirmButtonLabel || \"CONFIRM\";\r\n this.cancelButtonLabel = this.cancelButtonLabel || \"CANCEL\";\r\n }\r\n\r\n actionConfirmed() {\r\n this.dialogRef.close(true);\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/core/confirm-dialog/confirm-dialog.component.ts","import { Component, OnInit, AfterViewInit, OnDestroy, ViewChild } from \"@angular/core\";\r\nimport { FormControl } from \"@angular/forms\";\r\nimport { MatPaginator, MatSort, MatTableDataSource } from \"@angular/material\";\r\nimport { Router } from \"@angular/router\";\r\nimport { Subject } from \"rxjs\";\r\nimport { catchError, takeUntil } from \"rxjs/operators\";\r\n\r\nimport { UserService } from \"../shared/user.service\";\r\nimport { SnackBarService } from \"../../core/snack-bar.service\";\r\n\r\nimport { UserListing } from \"../shared/user-listing.model\";\r\n\r\n@Component({\r\n template: require('./user-list.component.html'),\r\n styles: [require('./user-list.component.css')]\r\n})\r\nexport class UserListComponent implements OnInit, AfterViewInit, OnDestroy {\r\n @ViewChild(MatPaginator) paginator: MatPaginator;\r\n @ViewChild(MatSort) sort: MatSort;\r\n\r\n displayedColumns = [\"username\", \"fullName\", \"isWebAdmin\", \"isActive\", \"isLocked\", \"actions\"];\r\n filterFC: FormControl;\r\n loading: boolean;\r\n userDataSource: MatTableDataSource;\r\n\r\n private ngUnsubscribe: Subject = new Subject(); //see https://stackoverflow.com/a/41177163\r\n\r\n constructor(\r\n private userService: UserService,\r\n private router: Router,\r\n private snackBarService: SnackBarService) {\r\n\r\n this.filterFC = new FormControl();\r\n this.userDataSource = new MatTableDataSource();\r\n }\r\n\r\n ngOnInit() {\r\n this.filterFC.valueChanges\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(val => {\r\n this.userDataSource.filter = val;\r\n });\r\n\r\n this.loading = true;\r\n this.userService.getListing()\r\n .then(data => {\r\n this.loading = false;\r\n this.userDataSource.data = data;\r\n })\r\n .catch(err => {\r\n this.loading = false;\r\n this.snackBarService.openSnackBar(err);\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.userDataSource.sort = this.sort;\r\n this.userDataSource.paginator = this.paginator;\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n goToUser(userID: number): void {\r\n this.router.navigate([\"/users\", userID]);\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/admin/user-list/user-list.component.ts","import { Component, OnInit, Inject } from \"@angular/core\";\r\nimport { ActivatedRoute, ParamMap, Router } from \"@angular/router\";\r\nimport { FormBuilder, FormGroup, FormControl, Validators } from '@angular/forms';\r\nimport { MatDialog, MatDialogConfig } from \"@angular/material\";\r\n\r\nimport { AuthService } from \"../auth/auth.service\";\r\nimport { PerspectiveService } from \"../perspective/perspective.service\";\r\nimport { SnackBarService } from \"../core/snack-bar.service\";\r\n\r\nimport { ChangePasswordDialogComponent } from \"../auth/change-password-dialog/change-password-dialog.component\";\r\nimport { UserCredentials } from \"./user-credentials.model\";\r\nimport { role, Role } from \"../core/role.const\";\r\nimport { appVersion } from \"../app-version\";\r\n\r\n@Component({\r\n template: require('./login.component.html'),\r\n styles: [require('./login.component.css')]\r\n})\r\nexport class LoginComponent implements OnInit {\r\n appVersion: string = appVersion.Version;\r\n releaseDate: string = appVersion.ReleaseDate;\r\n loading: boolean;\r\n message: string;\r\n loginForm: FormGroup;\r\n\r\n constructor(\r\n private dialog: MatDialog,\r\n private fb: FormBuilder,\r\n private authService: AuthService,\r\n private perspectiveService: PerspectiveService,\r\n private snackBarService: SnackBarService,\r\n private activatedRoute: ActivatedRoute,\r\n private router: Router,\r\n @Inject(role) private role: Role) {\r\n\r\n this.loginForm = this.fb.group({\r\n username: ['', [Validators.required, Validators.maxLength(100)]],\r\n password: ['', [Validators.required, Validators.maxLength(100)]],\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n // todo: fix this.. authService.logout causes 'expression changed after check' error with the toolbar? \r\n // also cant seem to read the query param if it's set from the unauth interceptor?\r\n //this.activatedRoute.paramMap.subscribe((params: ParamMap) => {\r\n // if (params.get(\"unauthRedirect\")) {\r\n // //this.snackBarService.openSnackBar(\"Unauthorized - please login.\");\r\n // //this.authService.logout();\r\n // }\r\n //});\r\n }\r\n\r\n changePassword(role: string): void {\r\n let dialogRef = this.dialog.open(ChangePasswordDialogComponent, {\r\n disableClose: true,\r\n data: {\r\n // todo: when password change is required, user can just login then refresh the browser to skip updating it\r\n passwordChangeMandatory: true\r\n }\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(() => {\r\n this.redirect(role);\r\n });\r\n }\r\n\r\n onSubmit(): void {\r\n if (this.loginForm.valid) {\r\n this.loading = true;\r\n const creds = this.loginForm.value as UserCredentials;\r\n\r\n this.authService.login(creds).subscribe(\r\n profile => {\r\n if (this.authService.loggedIn()) {\r\n if (profile.isRefreshPassword) {\r\n this.changePassword(profile.role);\r\n } else {\r\n this.redirect(profile.role);\r\n }\r\n }\r\n },\r\n error => {\r\n this.loading = false;\r\n this.message = error;\r\n }\r\n );\r\n } else {\r\n this.message = \"Username and password are required.\";\r\n }\r\n }\r\n\r\n redirect(role: string): void {\r\n let redirect = this.authService.redirectUrl ? this.authService.redirectUrl : \"/enquiries/new\";\r\n\r\n // skip the perspective selection if one was already set in localStorage\r\n if (role === this.role.internalStaff && !this.perspectiveService.activeIntroducer) {\r\n redirect = \"/perspective\";\r\n }\r\n\r\n this.router.navigate([redirect]);\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/login/login.component.ts","export const appVersion = {\r\n Version: \"1.0.7\", // should match Git tag version\r\n ReleaseDate: \"20181120\"\r\n};\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/app-version.ts","import { AfterViewInit, Component, ViewChild } from \"@angular/core\";\r\nimport { FormControl } from \"@angular/forms\";\r\nimport { Router } from \"@angular/router\";\r\nimport { MatAutocompleteSelectedEvent, MatInput } from \"@angular/material\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { catchError, debounceTime, distinctUntilChanged, switchMap, tap } from \"rxjs/operators\";\r\n\r\nimport { PerspectiveService } from \"./perspective.service\";\r\nimport { SnackBarService } from \"../core/snack-bar.service\";\r\nimport { IntroducerSearchService } from \"./introducer-search.service\";\r\nimport { ThemeService } from \"../core/theme.service\";\r\n\r\nimport { Introducer } from \"./introducer.model\";\r\n\r\n@Component({\r\n template: require('./perspective.component.html'),\r\n //styles: [require('./perspective.component.css')],\r\n //providers: [PerspectiveService]\r\n})\r\nexport class PerspectiveComponent implements AfterViewInit {\r\n @ViewChild(MatInput) searchInput: MatInput;\r\n\r\n filteredIntroducers$: Observable;\r\n loading: boolean;\r\n searchFC: FormControl;\r\n\r\n constructor(\r\n private perspectiveService: PerspectiveService,\r\n private introducerSearchService: IntroducerSearchService,\r\n private router: Router,\r\n private snackBarService: SnackBarService,\r\n private themeService: ThemeService) {\r\n\r\n this.searchFC = new FormControl();\r\n this.filteredIntroducers$ = this.searchFC.valueChanges\r\n .pipe(\r\n debounceTime(300),\r\n distinctUntilChanged(),\r\n switchMap(term => {\r\n this.loading = true;\r\n return term\r\n ? this.introducerSearchService.search(term)\r\n : of([])\r\n }),\r\n catchError(error => {\r\n // TODO: add real error handling\r\n console.log(error);\r\n return of([]);\r\n }),\r\n tap(() => { this.loading = false; })\r\n );\r\n }\r\n\r\n ngAfterViewInit() {\r\n // probably shouldnt need this setTimeout?\r\n // https://github.com/angular/material2/issues/1474#issuecomment-293683513\r\n setTimeout(() => {\r\n this.searchInput.focus();\r\n });\r\n }\r\n\r\n setPerspective(e: MatAutocompleteSelectedEvent): void {\r\n this.perspectiveService.activeIntroducer = e.option.value as Introducer;\r\n\r\n this.themeService.getTheme()\r\n .catch(err => this.snackBarService.openSnackBar(\"Error retrieving theme settings.\"));\r\n\r\n this.router.navigate([\"/enquiries/new\"]);\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/perspective/perspective.component.ts","import { Injectable } from \"@angular/core\";\r\nimport { HttpClient } from \"@angular/common/http\";\r\nimport { Router } from \"@angular/router\";\r\nimport { Observable } from \"rxjs\";\r\nimport { catchError } from \"rxjs/operators\";\r\n\r\nimport { Introducer } from \"./introducer.model\";\r\n\r\n@Injectable()\r\nexport class IntroducerSearchService {\r\n constructor(private http: HttpClient) { }\r\n\r\n search(term: string): Observable {\r\n return this.http.get(`api/profile/introducers/?name=${term}`);\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/perspective/introducer-search.service.ts","import { Component, OnInit, OnDestroy, ViewChild } from \"@angular/core\";\r\nimport { Location } from \"@angular/common\";\r\nimport { FormBuilder, FormGroup, FormControl, Validators } from \"@angular/forms\";\r\nimport { MatDialog, MatDialogConfig, MatTabGroup } from \"@angular/material\";\r\nimport { ActivatedRoute, ParamMap, Router } from \"@angular/router\";\r\nimport { BehaviorSubject, Observable, Subject, of } from \"rxjs\";\r\nimport { catchError, debounceTime, distinctUntilChanged, tap, switchMap, takeUntil } from \"rxjs/operators\";\r\n\r\nimport { EnquiryService } from \"../shared/enquiry.service\";\r\nimport { SnackBarService } from \"../../core/snack-bar.service\";\r\nimport { ValidationHelperService } from \"../../core/validation-helper.service\";\r\n\r\nimport { atLeastOne } from \"../../core/at-least-one-validator\";\r\nimport { DownloadQuoteDialogComponent } from \"../download-quote-dialog/download-quote-dialog.component\";\r\nimport { DropdownOption } from \"../../shared/dropdown-option.model\";\r\nimport { EmailEnquiryDialogComponent } from \"../email-enquiry-dialog/email-enquiry-dialog.component\";\r\nimport { Enquiry } from \"../shared/enquiry.model\";\r\nimport { EnquiryOptions } from \"../shared/enquiry-options.model\";\r\nimport { IntroducerRateChart } from \"../shared/introducer-rate-chart.model\";\r\nimport { RepaymentCalculation } from \"../shared/repayment-calculation.model\";\r\nimport { RepaymentOption } from \"../shared/repayment-option.model\";\r\n\r\n@Component({\r\n template: require('./enquiry-detail.component.html'),\r\n styles: [require('./enquiry-detail.component.css')]\r\n})\r\nexport class EnquiryDetailComponent implements OnInit, OnDestroy {\r\n enquiry: Enquiry;\r\n enquiryForm: FormGroup;\r\n opts: EnquiryOptions;\r\n errorMessage: string;\r\n filteredIrcs: IntroducerRateChart[];\r\n loadingEnquiryOptions: boolean;\r\n loadingRepaymentOptions: boolean;\r\n loadingSave: boolean;\r\n loadingSubmission: boolean;\r\n programFilterFC: FormControl;\r\n selectedIrc: IntroducerRateChart;\r\n repaymentOptionFC: FormControl;\r\n uniquePrograms: DropdownOption[];\r\n\r\n private currencyInputRegex = /^[1-9]\\d*(\\.\\d+)?$/; // Temp (until we can use number input instead of text) currency input (no leading zeroes). Use this - https://regexr.com/\r\n private ngUnsubscribe: Subject = new Subject(); //see https://stackoverflow.com/a/41177163\r\n \r\n // the payment frequency tab group is not created until the repayment options are loaded, so we need \r\n // this setter to init the ViewChild property (it is called automatically when the relevent *ngIf is true)\r\n // see https://stackoverflow.com/a/41095677\r\n private frequencyTabGroup: MatTabGroup;\r\n @ViewChild(MatTabGroup) set content(content: MatTabGroup) {\r\n this.frequencyTabGroup = content;\r\n }\r\n\r\n // using BehaviorSubject since we need to be able to push the current repaymentOpts into the email/download quote dialogs when they are opened.\r\n // see section on BehaviorSubject - http://blog.angular-university.io/how-to-build-angular2-apps-using-rxjs-observable-data-services-pitfalls-to-avoid/\r\n private _repaymentOptions$: BehaviorSubject = new BehaviorSubject([]);\r\n public readonly repaymentOptions$: Observable = this._repaymentOptions$.asObservable();\r\n \r\n constructor(\r\n private dialog: MatDialog,\r\n private enquiryService: EnquiryService,\r\n private fb: FormBuilder,\r\n private activatedRoute: ActivatedRoute,\r\n private router: Router,\r\n private location: Location,\r\n private snackBarService: SnackBarService,\r\n private validationHelperService: ValidationHelperService) {\r\n\r\n this.programFilterFC = new FormControl();\r\n this.repaymentOptionFC = new FormControl();\r\n this.createForm();\r\n }\r\n\r\n ngOnInit() {\r\n this.loadingEnquiryOptions = true;\r\n\r\n // get the enquiryOptions, and then the existing enquiry (or a default one if new)\r\n this.enquiryService.getOptions()\r\n .then(data => {\r\n this.opts = data;\r\n \r\n if (this.opts.introducerRateCharts.length === 0) {\r\n throw new Error(\"No finance types have been made available to this supplier - enquiries cannot be created.\");\r\n }\r\n \r\n this.uniquePrograms = Array.from( // make an array of DropdownOption from this.introducerRateCharts\r\n new Set(this.opts.introducerRateCharts\r\n .map(irc => {\r\n return {\r\n id: irc.programID,\r\n label: irc.programName,\r\n } as DropdownOption\r\n })\r\n .filter((opt, index, self) => // then remove the duplicate objects https://stackoverflow.com/a/36744732\r\n index === self.findIndex((o) => (\r\n o.id === opt.id\r\n )))\r\n .sort((a, b) => a.label.localeCompare(b.label)) // es6 sort https://stackoverflow.com/a/35092754\r\n )\r\n );\r\n\r\n this.activatedRoute.paramMap\r\n .pipe(\r\n takeUntil(this.ngUnsubscribe),\r\n switchMap((params: ParamMap) => this.enquiryService.getEnquiry(+params.get(\"id\"))) // (+) converts string \"id\" to a number\r\n )\r\n .subscribe(enq => {\r\n this.loadingEnquiryOptions = false;\r\n this.enquiry = enq;\r\n\r\n this.enquiryForm.patchValue(this.enquiry);\r\n this.financeFG.patchValue(this.enquiry);\r\n this.phoneNumbersFG.get(\"phone\").setValue(this.enquiry.phoneNumber);\r\n this.phoneNumbersFG.get(\"mobile\").setValue(this.enquiry.mobileNumber);\r\n\r\n // The vendor program filter dropdown doesn't actually get saved with the rest of the form,\r\n // it's just a presentation component that filters the \"Finance Type\" (introducerRateChartID) dropdown for the user.\r\n // Having to split this into two dropdowns (Vendor Program / Finance Type), even though its just a single object (IntroducerRateChart)\r\n // has resulted in a bit of extra logic, but FAW have asked for it this way as it may be easier for the user.\r\n const savedIrc = this.opts.introducerRateCharts.find(irc => irc.id === this.enquiry.introducerRateChartID);\r\n const firstIrcUsingDefaultProduct = this.opts.introducerRateCharts.filter(i => i.productID === this.opts.defaultProductID)[0];\r\n\r\n let programID: number;\r\n if (savedIrc) {\r\n programID = savedIrc.programID\r\n } else if (firstIrcUsingDefaultProduct) {\r\n programID = firstIrcUsingDefaultProduct.programID;\r\n } else {\r\n programID = this.uniquePrograms[0].id;\r\n }\r\n\r\n this.updateFilteredIrcs(programID);\r\n this.programFilterFC.setValue(programID, { emitEvent: false });\r\n if (!this.enquiry.id && this.filteredIrcs.length > 0) {\r\n this.financeFG.get(\"introducerRateChartID\").setValue(this.filteredIrcs[0].id);\r\n }\r\n\r\n if (this.enquiry.submittedOn != null) {\r\n this.programFilterFC.disable({ emitEvent: false });\r\n this.enquiryForm.disable({ emitEvent: false });\r\n }\r\n },\r\n err => this.snackBarService.openSnackBar(\"Error retrieving enquiry.\"));\r\n })\r\n .catch(err => {\r\n this.loadingEnquiryOptions = false;\r\n this.errorMessage = err;\r\n });\r\n\r\n // when a vendor program is selected, filter the introducerRateChartID dropdown and select the first one\r\n this.programFilterFC.valueChanges\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(val => {\r\n this.updateFilteredIrcs(val);\r\n this.financeFG.get(\"introducerRateChartID\").setValue(this.filteredIrcs[0].id);\r\n });\r\n\r\n // update form validators and assetTypeGroup dropdown when the introducerRateChart dropdown changes\r\n this.financeFG.get(\"introducerRateChartID\").valueChanges\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(val => {\r\n this.selectedIrc = this.opts.introducerRateCharts.find(i => i.id === val);\r\n\r\n if (this.selectedIrc && this.checkSelectedIrcConfig()) {\r\n const assetTypeGroupFC = this.financeFG.get(\"assetTypeGroupID\") as FormControl;\r\n if (!this.selectedIrc.assetTypeGroups.find(a => a.id === assetTypeGroupFC.value)) {\r\n assetTypeGroupFC.setValue(this.selectedIrc.assetTypeGroups[0].id);\r\n }\r\n \r\n this.costOfGoodsFC.setValidators(\r\n [\r\n Validators.required,\r\n Validators.pattern(this.currencyInputRegex),\r\n Validators.min(this.selectedIrc.minCostOfGoods),\r\n Validators.max(this.selectedIrc.maxCostOfGoods)\r\n ]);\r\n this.costOfGoodsFC.updateValueAndValidity();\r\n\r\n const isAdvanceFC = this.financeFG.get(\"isAdvance\") as FormControl;\r\n isAdvanceFC.setValue(this.selectedIrc.allowInAdvance);\r\n (this.selectedIrc.allowInAdvance && this.selectedIrc.allowInArrears)\r\n ? isAdvanceFC.enable()\r\n : isAdvanceFC.disable();\r\n }\r\n });\r\n\r\n // automatically get repayment options when the finance area of the form is valid\r\n this.financeFG.valueChanges\r\n .pipe(\r\n takeUntil(this.ngUnsubscribe),\r\n debounceTime(500), //TODO: debounce also happens on initial load when opening an existing enquiry..\r\n distinctUntilChanged(), //TODO: doesnt do anything?\r\n switchMap(val => {\r\n this.repaymentOptionFC.reset();\r\n\r\n if (this.financeFG.valid) {\r\n this.loadingRepaymentOptions = true;\r\n return this.getRepaymentOptions();\r\n } else {\r\n return of([]);\r\n }\r\n }),\r\n tap(opts => {\r\n this.loadingRepaymentOptions = false;\r\n this._repaymentOptions$.next(opts);\r\n\r\n // if opening an existing enquiry, search for a matching repayment option and 'select' it\r\n const selectedOpt = opts.find(r =>\r\n r.paymentFrequencyID === this.enquiry.paymentFrequencyID\r\n && r.repayment === this.enquiry.repayment\r\n && r.term === this.enquiry.term\r\n && r.residualAmount === this.enquiry.residualAmount);\r\n\r\n if (selectedOpt) {\r\n this.repaymentOptionFC.setValue(selectedOpt);\r\n\r\n // ensure the correct payment frequency tab is active on load\r\n if (this.frequencyTabGroup) {\r\n this.frequencyTabGroup.selectedIndex = this.selectedIrc.paymentFrequencies.findIndex(f => f.id == selectedOpt.paymentFrequencyID);\r\n }\r\n }\r\n }),\r\n catchError(err => {\r\n this.errorMessage = err;\r\n return of([]);\r\n })\r\n )\r\n .subscribe();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n \r\n actionsDisabled(): boolean {\r\n if (this.enquiry) {\r\n return (this.enquiry.submittedOn != null)\r\n || this.loadingEnquiryOptions\r\n || this.showRepaymentsSpinner()\r\n || this.showSavingSpinner()\r\n || this.showSubmissionSpinner()\r\n || this.errorMessage != null;\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n get costOfGoodsFC(): FormControl { return this.enquiryForm.get(\"finance.costOfGoods\") as FormControl; }\r\n get financeFG(): FormGroup { return this.enquiryForm.get(\"finance\") as FormGroup; }\r\n get phoneNumbersFG(): FormGroup { return this.enquiryForm.get(\"phoneNumbers\") as FormGroup; }\r\n\r\n checkSelectedIrcConfig(): boolean {\r\n var isValid =\r\n this.selectedIrc.terms != null\r\n && this.selectedIrc.terms.length > 0\r\n && this.selectedIrc.paymentFrequencies != null\r\n && this.selectedIrc.paymentFrequencies.length > 0\r\n && this.selectedIrc.assetTypeGroups != null\r\n && this.selectedIrc.assetTypeGroups.length > 0;\r\n\r\n this.errorMessage = isValid ? null : \"Rates configuration error.\";\r\n\r\n return isValid;\r\n }\r\n\r\n createForm(): void {\r\n this.enquiryForm = this.fb.group({\r\n // separate 'finance' formGroup so we can just validate this before getting repayment options\r\n finance: this.fb.group({\r\n introducerRateChartID: ['', Validators.required],\r\n assetTypeGroupID: ['', Validators.required],\r\n costOfGoods: ['', [Validators.required, Validators.pattern(this.currencyInputRegex)]],\r\n isAdvance: ['', Validators.required],\r\n }),\r\n\r\n phoneNumbers: this.fb.group({\r\n phone: ['', Validators.maxLength(20)],\r\n mobile: ['', Validators.maxLength(20)],\r\n }, { validator: atLeastOne(Validators.required) }),\r\n\r\n goodsDescription: ['', Validators.maxLength(1000)],\r\n contactName: ['', [Validators.required, Validators.maxLength(100)]],\r\n businessName: ['', [Validators.required, Validators.maxLength(100)]],\r\n abn: ['', [Validators.minLength(11), Validators.maxLength(11)]],\r\n emailAddress: ['', Validators.maxLength(100)],\r\n address: ['', Validators.maxLength(200)],\r\n notes: ['', Validators.maxLength(500)],\r\n });\r\n }\r\n\r\n getFilteredRepaymentOptions(paymentFrequencyID: number, opts: RepaymentOption[]): RepaymentOption[] {\r\n return opts.filter(r => r.paymentFrequencyID == paymentFrequencyID);\r\n }\r\n\r\n getRepaymentOptions(): Observable {\r\n const calcParams: RepaymentCalculation = {\r\n introducerRateChartID: this.financeFG.get(\"introducerRateChartID\").value,\r\n assetTypeGroupID: this.financeFG.get(\"assetTypeGroupID\").value,\r\n costOfGoods: this.financeFG.get(\"costOfGoods\").value,\r\n isAdvance: this.financeFG.get(\"isAdvance\").value\r\n }\r\n\r\n return this.enquiryService.getRepaymentOptions(calcParams);\r\n }\r\n\r\n getResidualLabel(): string {\r\n return (this.selectedIrc && this.selectedIrc.labelResidualAsBalloon)\r\n ? \"Balloon\"\r\n : \"Residual\";\r\n }\r\n\r\n getSelectedRepaymentOptionIndex(opts: RepaymentOption[]): number {\r\n let selectedOptIndex = null;\r\n\r\n const selectedOpt = this.repaymentOptionFC.value as RepaymentOption;\r\n if (selectedOpt) {\r\n selectedOptIndex = opts.findIndex(r =>\r\n r.paymentFrequencyID === selectedOpt.paymentFrequencyID\r\n && r.repayment === selectedOpt.repayment\r\n && r.term === selectedOpt.term\r\n && r.residualAmount === selectedOpt.residualAmount);\r\n }\r\n\r\n return selectedOptIndex;\r\n }\r\n\r\n getSingularFrequencyDesc(paymentFreq: string): string {\r\n let singularDesc: string = null;\r\n switch (paymentFreq) {\r\n case 'Weekly':\r\n singularDesc = 'Week';\r\n break;\r\n case 'Monthly':\r\n singularDesc = 'Month';\r\n break;\r\n case 'Quarterly':\r\n singularDesc = 'Quarter';\r\n break;\r\n case 'Annual':\r\n singularDesc = 'Year';\r\n break;\r\n case 'Fortnightly':\r\n singularDesc = 'Fortnight';\r\n break;\r\n default:\r\n singularDesc = 'Period';\r\n break;\r\n }\r\n\r\n return singularDesc;\r\n }\r\n\r\n goToEnquiriesList(): void {\r\n this.router.navigate([\"/enquiries\"]);\r\n }\r\n\r\n isRepaymentOptionSelected(opt: RepaymentOption): boolean {\r\n let isSelected = false;\r\n\r\n const selectedOpt = this.repaymentOptionFC.value as RepaymentOption;\r\n if (selectedOpt) {\r\n isSelected =\r\n opt.paymentFrequencyID === selectedOpt.paymentFrequencyID\r\n && opt.repayment === selectedOpt.repayment\r\n && opt.term === selectedOpt.term\r\n && opt.residualAmount === selectedOpt.residualAmount;\r\n }\r\n\r\n return isSelected;\r\n }\r\n\r\n openDownloadQuoteDialog() {\r\n const opts = this._repaymentOptions$.getValue();\r\n const selectedOptIndex = this.getSelectedRepaymentOptionIndex(opts);\r\n\r\n let dialogRef = this.dialog.open(DownloadQuoteDialogComponent, {\r\n data: {\r\n enquiryID: this.enquiry.id,\r\n repaymentOptions: opts,\r\n selectedRepaymentIndex: selectedOptIndex\r\n }\r\n });\r\n }\r\n\r\n openEmailEnquiryDialog() {\r\n const opts = this._repaymentOptions$.getValue();\r\n const selectedOptIndex = this.getSelectedRepaymentOptionIndex(opts);\r\n\r\n let dialogRef = this.dialog.open(EmailEnquiryDialogComponent, {\r\n //height: '80%',\r\n //width: '80%',\r\n disableClose: true,\r\n autoFocus: false, // added this because iOS Safari was autofocusing the first causing immediate scrolling down to \"Subject\" input on the dialog\r\n data: {\r\n applicationFormAvailable: this.selectedIrc.applicationFormAvailable,\r\n enquiry: this.enquiry,\r\n repaymentOptions: opts,\r\n selectedRepaymentIndex: selectedOptIndex\r\n }\r\n });\r\n }\r\n\r\n // see https://angular.io/guide/reactive-forms#save-form-data\r\n prepareSaveEnquiry(): Enquiry {\r\n const formModel = this.enquiryForm.value;\r\n const isAdvance = this.financeFG.get(\"isAdvance\").value as boolean; // because the FormControl may be disabled\r\n const selectedOpt = this.repaymentOptionFC.value as RepaymentOption;\r\n\r\n // assigning a few extra fields here just so we don't need to look up the ID values again on the backend, before sending the email\r\n const assetTypeGroup = this.selectedIrc.assetTypeGroups.find(i => i.id === formModel.finance.assetTypeGroupID);\r\n\r\n const saveEnquiry: Enquiry = {\r\n id: this.enquiry.id,\r\n enquiryNumber: \"\", // generated by backend on enquiry creation\r\n\r\n // from formModel.finance\r\n introducerRateChartID: formModel.finance.introducerRateChartID as number,\r\n productName: this.selectedIrc.productName,\r\n programName: this.selectedIrc.programName,\r\n assetTypeGroupID: formModel.finance.assetTypeGroupID as number,\r\n assetTypeGroupName: assetTypeGroup.label,\r\n costOfGoods: formModel.finance.costOfGoods as number,\r\n isAdvance: isAdvance,\r\n\r\n // from formModel.phoneNumbers\r\n phoneNumber: formModel.phoneNumbers.phone as string,\r\n mobileNumber: formModel.phoneNumbers.mobile as string,\r\n\r\n // from formModel\r\n goodsDescription: formModel.goodsDescription as string,\r\n contactName: formModel.contactName as string,\r\n businessName: formModel.businessName as string,\r\n abn: formModel.abn as string,\r\n emailAddress: formModel.emailAddress as string,\r\n address: formModel.address as string,\r\n notes: formModel.notes as string,\r\n\r\n // from selected RepaymentOption\r\n paymentFrequencyID: selectedOpt ? selectedOpt.paymentFrequencyID : null,\r\n paymentFrequencyName: selectedOpt ? selectedOpt.paymentFrequencyName : null,\r\n repayment: selectedOpt ? selectedOpt.repayment : null,\r\n term: selectedOpt ? selectedOpt.term : null,\r\n residualAmount: selectedOpt ? selectedOpt.residualAmount : null,\r\n };\r\n\r\n return saveEnquiry;\r\n }\r\n\r\n save(downloadQuoteClicked: boolean, emailClicked: boolean): void {\r\n if (this.enquiryForm.invalid) {\r\n this.validationHelperService.markAllTouched(this.enquiryForm);\r\n this.snackBarService.openSnackBar(\"Please fill in required values.\");\r\n return;\r\n }\r\n\r\n this.loadingSave = true;\r\n const enquiryToSave = this.prepareSaveEnquiry();\r\n\r\n if (enquiryToSave.id != null) {\r\n this.enquiryService.update(enquiryToSave)\r\n .then(() => {\r\n this.loadingSave = false;\r\n this.enquiry = Object.assign({}, enquiryToSave);\r\n this.snackBarService.openSnackBar(\"Enquiry updated.\");\r\n\r\n // TODO: this could be implemented better..\r\n if (downloadQuoteClicked) {\r\n this.openDownloadQuoteDialog();\r\n } else if (emailClicked) {\r\n this.openEmailEnquiryDialog();\r\n }\r\n })\r\n .catch(err => {\r\n this.loadingSave = false;\r\n this.snackBarService.openSnackBar(err);\r\n });\r\n } else {\r\n this.enquiryService.create(enquiryToSave)\r\n .then(enq => {\r\n this.loadingSave = false;\r\n this.enquiry = Object.assign({}, enquiryToSave);\r\n this.enquiry.id = enq.id;\r\n this.snackBarService.openSnackBar(\"Enquiry saved.\");\r\n\r\n // Replace \"/new\" in the URL with \"/{id}\"\r\n // This was added because of the default behaviour in iOS Safari when downloading a PDF from the email/quote dialogs.\r\n // Safari will open the PDF in the current tab, and then the user would need to click the back button on their phone, so\r\n // we'd need the ID in the URL to ensure the enquiry data is reloaded when they navigate back.\r\n this.location.replaceState(\"/enquiries/\" + this.enquiry.id);\r\n\r\n if (downloadQuoteClicked) {\r\n this.openDownloadQuoteDialog();\r\n } else if (emailClicked) {\r\n this.openEmailEnquiryDialog();\r\n }\r\n })\r\n .catch(err => {\r\n this.loadingSave = false;\r\n this.snackBarService.openSnackBar(err);\r\n });\r\n }\r\n }\r\n\r\n showAssetTypeGroup(): boolean {\r\n return this.selectedIrc && this.selectedIrc.assetTypeGroups.length > 1;\r\n }\r\n\r\n showFinanceForm(): boolean {\r\n return this.enquiry != null && this.opts != null;\r\n }\r\n\r\n showFinanceInvalidMessage(): boolean {\r\n return this.financeFG.invalid;\r\n }\r\n\r\n showPhoneError(): boolean {\r\n return this.phoneNumbersFG.touched && this.phoneNumbersFG.hasError(\"atLeastOne\");\r\n }\r\n\r\n showProgramFilter(): boolean {\r\n return this.uniquePrograms && this.uniquePrograms.length > 1;\r\n }\r\n\r\n showRepaymentsList(): boolean {\r\n return !this.loadingRepaymentOptions && this.financeFG.valid;\r\n }\r\n\r\n showRepaymentsSpinner(): boolean {\r\n return this.loadingRepaymentOptions && this.financeFG.valid;\r\n }\r\n\r\n showResidual(): boolean {\r\n return this.selectedIrc && this.selectedIrc.showResidualValue;\r\n }\r\n\r\n showSavingSpinner(): boolean {\r\n return this.loadingSave;\r\n }\r\n\r\n showSubmissionSpinner(): boolean {\r\n return this.loadingSubmission;\r\n }\r\n\r\n showSubmittedRepaymentOption(): boolean {\r\n return this.enquiry && (this.enquiry.submittedOn != null);\r\n }\r\n\r\n submit(): void {\r\n if (this.enquiryForm.invalid || !this.repaymentOptionFC.value) {\r\n this.validationHelperService.markAllTouched(this.enquiryForm);\r\n this.snackBarService.openSnackBar(\"Please fill in required values and select a repayment option.\");\r\n return;\r\n }\r\n\r\n this.loadingSubmission = true;\r\n const enquiryToSave = this.prepareSaveEnquiry();\r\n\r\n this.enquiryService.submit(enquiryToSave)\r\n .then(() => {\r\n this.loadingSubmission = false;\r\n this.snackBarService.openSnackBar(\"Enquiry submitted.\");\r\n this.goToEnquiriesList();\r\n })\r\n .catch(err => {\r\n this.loadingSubmission = false;\r\n this.snackBarService.openSnackBar(err);\r\n });\r\n }\r\n\r\n updateFilteredIrcs(programID: number): void {\r\n this.filteredIrcs = this.opts.introducerRateCharts.filter(irc => irc.programID == programID);\r\n\r\n // FAW always want the default product (currently Operating Lease) to appear at the top of the dropdown\r\n const index = this.filteredIrcs.findIndex(i => i.productID === this.opts.defaultProductID)\r\n if (index > -1) {\r\n let defaultProductIrc = this.filteredIrcs.splice(index, 1)[0];\r\n this.filteredIrcs.unshift(defaultProductIrc);\r\n }\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/enquiry/enquiry-detail/enquiry-detail.component.ts","import { Component, OnInit, Inject } from \"@angular/core\";\r\nimport { FormArray, FormBuilder, FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from \"@angular/material\";\r\nimport * as FileSaver from \"file-saver\";\r\n\r\nimport { DocumentService } from \"../shared/document.service\";\r\nimport { SnackBarService } from \"../../core/snack-bar.service\";\r\n\r\nimport { QuoteDocGenData } from \"../shared/quote-doc-gen-data.model\";\r\nimport { RepaymentOption } from \"../shared/repayment-option.model\";\r\n\r\n@Component({\r\n template: require('./download-quote-dialog.component.html'),\r\n styles: [require('./download-quote-dialog.component.css')]\r\n})\r\nexport class DownloadQuoteDialogComponent implements OnInit {\r\n downloadQuoteForm: FormGroup;\r\n enquiryID: number;\r\n repaymentOptions: RepaymentOption[];\r\n showSpinner: boolean;\r\n\r\n constructor(\r\n private documentService: DocumentService,\r\n private fb: FormBuilder,\r\n private snackBarService: SnackBarService,\r\n @Inject(MAT_DIALOG_DATA) public data: any,\r\n public dialogRef: MatDialogRef) {\r\n\r\n this.downloadQuoteForm = this.fb.group({\r\n showAssetCost: [true, Validators.required],\r\n repaymentOptionCheckboxes: this.fb.array([]),\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.enquiryID = this.data.enquiryID as number;\r\n this.repaymentOptions = this.data.repaymentOptions as RepaymentOption[];\r\n const selectedRepaymentIndex = this.data.selectedRepaymentIndex as number;\r\n\r\n this.repaymentOptions.forEach((opt, index) => {\r\n this.repaymentCheckboxesFA.push(new FormControl(index === selectedRepaymentIndex));\r\n });\r\n }\r\n\r\n get repaymentCheckboxesFA(): FormArray { return this.downloadQuoteForm.get(\"repaymentOptionCheckboxes\") as FormArray; }\r\n\r\n displayPaymentFrequency(index: number): boolean {\r\n return (index == 0)\r\n || (this.repaymentOptions[index - 1].paymentFrequencyID != this.repaymentOptions[index].paymentFrequencyID)\r\n }\r\n\r\n downloadQuote(): void {\r\n const checkboxValues: boolean[] = this.repaymentCheckboxesFA.value;\r\n if (!checkboxValues.some(checked => checked === true)) {\r\n this.snackBarService.openSnackBar(\"Please select at least one repayment option.\");\r\n return;\r\n }\r\n\r\n this.showSpinner = true;\r\n const showAssetCost = this.downloadQuoteForm.get('showAssetCost').value as boolean;\r\n const quoteDocGenData = this.documentService.prepareQuoteDocGenData(showAssetCost, checkboxValues, this.repaymentOptions);\r\n \r\n this.documentService.downloadQuotePdf(this.enquiryID, quoteDocGenData)\r\n .subscribe(\r\n res => {\r\n this.showSpinner = false;\r\n var fileName = res.headers.get(\"Content-Disposition\").match(/\"(.*?)\"/g).toString(); // get the string between the quotes, but includes the quotes\r\n fileName = fileName.replace(/[\"]+/g, ''); // remove the quotes\r\n\r\n FileSaver.saveAs(res.body, fileName);\r\n },\r\n err => {\r\n this.showSpinner = false;\r\n this.snackBarService.openSnackBar(err as string)\r\n },\r\n () => {\r\n this.dialogRef.close();\r\n });\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/enquiry/download-quote-dialog/download-quote-dialog.component.ts","import { Component, OnInit, Inject } from \"@angular/core\";\r\nimport { FormArray, FormBuilder, FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from \"@angular/material\";\r\nimport * as FileSaver from \"file-saver\";\r\n\r\nimport { AuthService } from \"../../auth/auth.service\";\r\nimport { EmailService } from \"../shared/email.service\";\r\nimport { DocumentService } from \"../shared/document.service\";\r\nimport { SnackBarService } from \"../../core/snack-bar.service\";\r\nimport { ValidationHelperService } from \"../../core/validation-helper.service\";\r\n\r\nimport { Email } from \"../shared/email.model\";\r\nimport { Enquiry } from \"../shared/enquiry.model\";\r\nimport { FileDto } from \"../../shared/file-dto.model\";\r\nimport { QuoteDocGenData } from \"../shared/quote-doc-gen-data.model\";\r\nimport { RepaymentOption } from \"../shared/repayment-option.model\";\r\n\r\n@Component({\r\n template: require('./email-enquiry-dialog.component.html'),\r\n styles: [require('./email-enquiry-dialog.component.css')]\r\n})\r\nexport class EmailEnquiryDialogComponent implements OnInit {\r\n applicationFormAvailable: boolean;\r\n emailForm: FormGroup;\r\n enquiry: Enquiry;\r\n fileInputFC: FormControl;\r\n repaymentOptions: RepaymentOption[];\r\n showSpinner: boolean;\r\n\r\n constructor(\r\n private authService: AuthService,\r\n private documentService: DocumentService,\r\n private emailService: EmailService,\r\n private fb: FormBuilder,\r\n private snackBarService: SnackBarService,\r\n private validationHelperService: ValidationHelperService,\r\n @Inject(MAT_DIALOG_DATA) public data: any,\r\n public dialogRef: MatDialogRef) {\r\n\r\n this.fileInputFC = new FormControl();\r\n this.emailForm = this.fb.group({\r\n showAssetCost: [true, Validators.required],\r\n repaymentOptionCheckboxes: this.fb.array([]),\r\n\r\n to: ['', [Validators.required, Validators.maxLength(300)]],\r\n cc: ['', Validators.maxLength(300)],\r\n bcc: ['', Validators.maxLength(300)],\r\n subject: ['Enquiry', Validators.maxLength(300)],\r\n body: ['', Validators.required],\r\n\r\n attachments: this.fb.array([])\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.applicationFormAvailable = this.data.applicationFormAvailable as boolean;\r\n this.enquiry = this.data.enquiry as Enquiry;\r\n this.repaymentOptions = this.data.repaymentOptions as RepaymentOption[];\r\n const selectedRepaymentIndex = this.data.selectedRepaymentIndex as number;\r\n\r\n this.repaymentOptions.forEach((opt, index) => {\r\n this.repaymentCheckboxesFA.push(new FormControl(index === selectedRepaymentIndex));\r\n });\r\n\r\n this.prefillEmail();\r\n }\r\n\r\n get repaymentCheckboxesFA(): FormArray { return this.emailForm.get(\"repaymentOptionCheckboxes\") as FormArray; }\r\n get attachmentsFA(): FormArray { return this.emailForm.get(\"attachments\") as FormArray; }\r\n\r\n prefillEmail(): void {\r\n const profile = this.authService.userProfile;\r\n\r\n this.emailForm.get(\"to\").setValue(this.enquiry.emailAddress);\r\n this.emailForm.get(\"bcc\").setValue(profile.emailAddress);\r\n\r\n let signature = profile.fullName;\r\n if (profile.jobTitle) { signature = signature.concat(\"\\n\", profile.jobTitle); }\r\n if (profile.phoneNumber) { signature = signature.concat(\"\\nPh. \", profile.phoneNumber); }\r\n if (profile.mobileNumber) { signature = signature.concat(\"\\nMob. \", profile.mobileNumber); }\r\n if (profile.emailAddress) { signature = signature.concat(\"\\n\", profile.emailAddress); }\r\n\r\n let body = `Dear ${this.enquiry.contactName},\\n\\n\\n\\n${signature}`\r\n this.emailForm.get(\"body\").setValue(body);\r\n }\r\n\r\n displayPaymentFrequency(index: number): boolean {\r\n return (index == 0)\r\n || (this.repaymentOptions[index - 1].paymentFrequencyID != this.repaymentOptions[index].paymentFrequencyID)\r\n }\r\n\r\n downloadApplicationForm(): void {\r\n this.showSpinner = true;\r\n\r\n this.documentService.downloadApplicationForm(this.enquiry.id)\r\n .subscribe(\r\n res => {\r\n this.showSpinner = false;\r\n var fileName = res.headers.get(\"Content-Disposition\").match(/\"(.*?)\"/g).toString(); // get the string between the quotes, but includes the quotes\r\n fileName = fileName.replace(/[\"]+/g, ''); // remove the quotes\r\n\r\n FileSaver.saveAs(res.body, fileName);\r\n },\r\n err => {\r\n this.showSpinner = false;\r\n this.snackBarService.openSnackBar(err as string)\r\n });\r\n }\r\n\r\n downloadQuote(): void {\r\n const checkboxValues: boolean[] = this.repaymentCheckboxesFA.value;\r\n if (!checkboxValues.some(checked => checked === true)) {\r\n this.snackBarService.openSnackBar(\"Please select at least one repayment option.\");\r\n return;\r\n }\r\n\r\n this.showSpinner = true;\r\n const showAssetCost = this.emailForm.get('showAssetCost').value as boolean;\r\n const quoteDocGenData = this.documentService.prepareQuoteDocGenData(showAssetCost, checkboxValues, this.repaymentOptions);\r\n\r\n this.documentService.downloadQuotePdf(this.enquiry.id, quoteDocGenData)\r\n .subscribe(\r\n res => {\r\n this.showSpinner = false;\r\n var fileName = res.headers.get(\"Content-Disposition\").match(/\"(.*?)\"/g).toString(); // get the string between the quotes, but includes the quotes\r\n fileName = fileName.replace(/[\"]+/g, ''); // remove the quotes\r\n\r\n FileSaver.saveAs(res.body, fileName);\r\n },\r\n err => {\r\n this.showSpinner = false;\r\n this.snackBarService.openSnackBar(err as string)\r\n });\r\n }\r\n\r\n // refer to docs for File obj structure https://developer.mozilla.org/en-US/docs/Web/API/File\r\n // code modified from https://nehalist.io/uploading-files-in-angular2/\r\n onFileChange(event: any) {\r\n let reader = new FileReader();\r\n if (event.target.files && event.target.files.length > 0) {\r\n let file = event.target.files[0];\r\n reader.readAsDataURL(file); // see https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL\r\n reader.onload = () => {\r\n\r\n let attachmentFG: FormGroup = this.fb.group({\r\n fileName: file.name,\r\n fileType: file.type,\r\n // readAsDataURL() returns a string in the form \"data:application/pdf;base64,JVBERi0x...\"\r\n fileContentBase64: (reader.result as string).split(',')[1]\r\n });\r\n\r\n this.attachmentsFA.push(attachmentFG);\r\n this.fileInputFC.reset();\r\n };\r\n }\r\n }\r\n\r\n prepareSendEmail(): Email {\r\n const formModel = this.emailForm.value;\r\n const checkboxValues: boolean[] = this.repaymentCheckboxesFA.value;\r\n\r\n const showAssetCost = this.emailForm.get(\"showAssetCost\").value as boolean;\r\n const docGenData = this.documentService.prepareQuoteDocGenData(showAssetCost, checkboxValues, this.repaymentOptions);\r\n\r\n // shallow copy.. deep copy shouldnt be necessary in this instance since attachment files aren't saved\r\n const attachFiles = this.attachmentsFA.value as FileDto[] \r\n\r\n const emailToSend: Email = {\r\n quoteDocGenData: docGenData,\r\n to: formModel.to as string,\r\n cc: formModel.cc as string,\r\n bcc: formModel.bcc as string,\r\n subject: formModel.subject as string,\r\n body: formModel.body as string,\r\n\r\n attachments: attachFiles\r\n };\r\n\r\n return emailToSend;\r\n }\r\n\r\n removeAttachment(index: number): void {\r\n this.attachmentsFA.removeAt(index);\r\n }\r\n\r\n sendEmail() {\r\n const checkboxValues: boolean[] = this.repaymentCheckboxesFA.value;\r\n if (!checkboxValues.some(checked => checked === true) || this.emailForm.invalid) {\r\n this.validationHelperService.markAllTouched(this.emailForm);\r\n this.snackBarService.openSnackBar(\"Please select at least one repayment option and fill in required values.\");\r\n return;\r\n }\r\n\r\n this.showSpinner = true;\r\n const email = this.prepareSendEmail();\r\n\r\n this.emailService.sendEmail(this.enquiry.id, email)\r\n .then(() => {\r\n this.showSpinner = false;\r\n this.snackBarService.openSnackBar(\"Email sent.\");\r\n this.dialogRef.close();\r\n })\r\n .catch(err => {\r\n this.showSpinner = false;\r\n this.snackBarService.openSnackBar(err);\r\n });\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/enquiry/email-enquiry-dialog/email-enquiry-dialog.component.ts","import { Component, OnInit, AfterViewInit, OnDestroy, ViewChild } from \"@angular/core\";\r\nimport { FormControl } from \"@angular/forms\";\r\nimport { MatPaginator, MatSort, MatTableDataSource, MatDialog } from \"@angular/material\";\r\nimport { ActivatedRoute, ParamMap, Router } from \"@angular/router\";\r\nimport { Subject } from \"rxjs\";\r\nimport { catchError, debounceTime, distinctUntilChanged, takeUntil } from \"rxjs/operators\";\r\n\r\nimport { EnquiryService } from \"../shared/enquiry.service\";\r\nimport { SnackBarService } from \"../../core/snack-bar.service\";\r\n\r\nimport { EmailHistoryDialogComponent } from \"../email-history-dialog/email-history-dialog.component\";\r\nimport { EnquiryListing } from \"../shared/enquiry-listing.model\";\r\n\r\n@Component({\r\n template: require('./enquiry-list.component.html'),\r\n styles: [require('./enquiry-list.component.css')]\r\n})\r\nexport class EnquiryListComponent implements OnInit, AfterViewInit, OnDestroy {\r\n @ViewChild(MatPaginator) paginator: MatPaginator;\r\n @ViewChild(MatSort) sort: MatSort;\r\n\r\n displayedColumns =\r\n [\"enquiryNumber\", \"businessName\", \"contactName\", \"product\", \"costOfGoods\",\r\n \"term\", \"repayment\", \"createdOn\", \"lastEmailSentOn\", \"submittedOn\", \"actions\"];\r\n dataSource: MatTableDataSource;\r\n filterFC: FormControl;\r\n loading: boolean;\r\n monthsAgoFC: FormControl;\r\n monthOptions: number[];\r\n\r\n private ngUnsubscribe: Subject = new Subject(); //see https://stackoverflow.com/a/41177163\r\n\r\n constructor(\r\n private activatedRoute: ActivatedRoute,\r\n private dialog: MatDialog,\r\n private enquiryService: EnquiryService,\r\n private router: Router,\r\n private snackBarService: SnackBarService) {\r\n\r\n this.monthsAgoFC = new FormControl();\r\n this.filterFC = new FormControl();\r\n this.monthOptions = [1, 3, 6, 12];\r\n this.dataSource = new MatTableDataSource();\r\n }\r\n\r\n ngOnInit() {\r\n this.monthsAgoFC.valueChanges\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(val => {\r\n this.getEnquiries(val);\r\n });\r\n\r\n this.filterFC.valueChanges\r\n .pipe(\r\n takeUntil(this.ngUnsubscribe),\r\n debounceTime(500),\r\n distinctUntilChanged()\r\n )\r\n .subscribe(val => {\r\n this.dataSource.filter = val;\r\n });\r\n\r\n this.monthsAgoFC.setValue(12);\r\n\r\n this.activatedRoute.paramMap\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe((params: ParamMap) => this.filterFC.setValue(params.get(\"search\")), err => console.log(err));\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.dataSource.sort = this.sort;\r\n this.dataSource.paginator = this.paginator;\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n getEnquiries(monthsAgo: number): void {\r\n this.loading = true;\r\n this.enquiryService.getListing(monthsAgo)\r\n .then(data => {\r\n this.loading = false;\r\n this.dataSource.data = data;\r\n })\r\n .catch(err => {\r\n this.loading = false;\r\n this.snackBarService.openSnackBar(err);\r\n });\r\n }\r\n\r\n goToEnquiry(enquiryID: number): void {\r\n this.router.navigate([\"enquiries\", enquiryID]);\r\n }\r\n\r\n goToNewEnquiry(): void {\r\n this.router.navigate([\"enquiries/new\"]);\r\n }\r\n\r\n openEmailHistoryDialog(enquiryID: number) {\r\n let dialogRef = this.dialog.open(EmailHistoryDialogComponent, {\r\n width: \"800px\",\r\n data: {\r\n enquiryID: enquiryID\r\n }\r\n });\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/enquiry/enquiry-list/enquiry-list.component.ts","import { Component, Inject, OnInit } from \"@angular/core\";\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from \"@angular/material\";\r\n\r\nimport { EmailService } from \"../shared/email.service\";\r\nimport { SnackBarService } from \"../../core/snack-bar.service\";\r\n\r\nimport { EmailListing } from \"../shared/email-listing.model\";\r\n\r\n@Component({\r\n template: require('./email-history-dialog.component.html'),\r\n styles: [require('./email-history-dialog.component.css')]\r\n})\r\nexport class EmailHistoryDialogComponent implements OnInit {\r\n emailList: EmailListing[];\r\n enquiryID: number;\r\n loading: boolean;\r\n\r\n constructor(\r\n @Inject(MAT_DIALOG_DATA) public data: any,\r\n public dialogRef: MatDialogRef,\r\n private emailService: EmailService,\r\n private snackBarService: SnackBarService) { }\r\n\r\n ngOnInit() {\r\n this.enquiryID = this.data.enquiryID as number;\r\n this.getEmails();\r\n }\r\n\r\n getEmails(): void {\r\n this.loading = true;\r\n this.emailService.getListing(this.enquiryID)\r\n .then(list => {\r\n this.loading = false;\r\n this.emailList = list;\r\n })\r\n .catch(err => {\r\n this.loading = false;\r\n this.snackBarService.openSnackBar(err);\r\n });\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/enquiry/email-history-dialog/email-history-dialog.component.ts","import { Injectable } from \"@angular/core\";\r\nimport { MatSnackBar } from \"@angular/material\";\r\n\r\n@Injectable()\r\nexport class SnackBarService {\r\n constructor(private snackBar: MatSnackBar) { }\r\n\r\n openSnackBar(message: string, action?: string) {\r\n this.snackBar.open(message, action || \"DISMISS\", {\r\n duration: 3000,\r\n });\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/core/snack-bar.service.ts","import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\r\nimport { enableProdMode } from '@angular/core';\r\n\r\nimport { AppModule } from './app/app.module';\r\n\r\nif (process.env.ENV === 'production') {\r\n enableProdMode();\r\n}\r\n\r\nplatformBrowserDynamic().bootstrapModule(AppModule)\r\n .then(success => console.log(`Bootstrap success.`))\r\n .catch(err => console.error(err));\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/main.ts","import { LOCALE_ID, NgModule } from \"@angular/core\";\r\nimport { BrowserModule } from \"@angular/platform-browser\";\r\nimport { BrowserAnimationsModule } from \"@angular/platform-browser/animations\";\r\nimport { HttpClientModule } from \"@angular/common/http\";\r\nimport { JwtModule } from \"@auth0/angular-jwt\";\r\nimport { HTTP_INTERCEPTORS } from \"@angular/common/http\";\r\n\r\nimport { registerLocaleData } from \"@angular/common\";\r\nimport localeEnAu from \"@angular/common/locales/en-AU\";\r\nregisterLocaleData(localeEnAu);\r\n\r\nimport { AdminModule } from \"./admin/admin.module\";\r\nimport { AppRoutingModule } from \"./app-routing.module\";\r\nimport { AuthModule } from \"./auth/auth.module\";\r\nimport { CoreModule } from \"./core/core.module\";\r\nimport { EnquiryModule } from \"./enquiry/enquiry.module\";\r\nimport { SharedModule } from \"./shared/shared.module\";\r\n\r\nimport { AppComponent } from \"./app.component\";\r\nimport { IntroducerSearchService } from \"./perspective/introducer-search.service\";\r\nimport { LoginComponent } from \"./login/login.component\";\r\nimport { PerspectiveComponent } from \"./perspective/perspective.component\";\r\nimport { PerspectiveInterceptor } from \"./perspective/perspective.interceptor\";\r\nimport { PerspectiveService } from \"./perspective/perspective.service\";\r\n\r\n@NgModule({\r\n imports: [\r\n BrowserModule,\r\n BrowserAnimationsModule,\r\n HttpClientModule,\r\n JwtModule.forRoot({\r\n config: {\r\n tokenGetter: () => {\r\n return localStorage.getItem(\"access_token\");\r\n }\r\n }\r\n }),\r\n\r\n AdminModule,\r\n AppRoutingModule,\r\n AuthModule,\r\n CoreModule,\r\n EnquiryModule,\r\n SharedModule,\r\n ],\r\n\r\n declarations: [\r\n AppComponent,\r\n LoginComponent,\r\n PerspectiveComponent\r\n ],\r\n\r\n providers: [\r\n PerspectiveService,\r\n IntroducerSearchService,\r\n\r\n { provide: HTTP_INTERCEPTORS, useClass: PerspectiveInterceptor, multi: true },\r\n { provide: LOCALE_ID, useValue: \"en-AU\" }\r\n ],\r\n\r\n bootstrap: [AppComponent]\r\n})\r\nexport class AppModule { }\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/app.module.ts","/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n(function (factory) {\n if (typeof module === \"object\" && typeof module.exports === \"object\") {\n var v = factory(null, exports);\n if (v !== undefined) module.exports = v;\n }\n else if (typeof define === \"function\" && define.amd) {\n define(\"@angular/common/locales/en-AU\", [\"require\", \"exports\"], factory);\n }\n})(function (require, exports) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n // THIS CODE IS GENERATED - DO NOT MODIFY\n // See angular/tools/gulp-tasks/cldr/extract.js\n var u = undefined;\n function plural(n) {\n var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\\.?/, '').length;\n if (i === 1 && v === 0)\n return 1;\n return 5;\n }\n exports.default = [\n 'en-AU', [['am', 'pm'], u, u], u,\n [\n ['Su.', 'M.', 'Tu.', 'W.', 'Th.', 'F.', 'Sa.'],\n ['Sun.', 'Mon.', 'Tue.', 'Wed.', 'Thu.', 'Fri.', 'Sat.'],\n ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n ['Su.', 'Mon.', 'Tu.', 'Wed.', 'Th.', 'Fri.', 'Sat.']\n ],\n u,\n [\n ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n ['Jan.', 'Feb.', 'Mar.', 'Apr.', 'May', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Oct.', 'Nov.', 'Dec.'],\n [\n 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September',\n 'October', 'November', 'December'\n ]\n ],\n u, [['B', 'A'], ['BC', 'AD'], ['Before Christ', 'Anno Domini']], 0, [6, 0],\n ['d/M/yy', 'd MMM y', 'd MMMM y', 'EEEE, d MMMM y'],\n ['h:mm a', 'h:mm:ss a', 'h:mm:ss a z', 'h:mm:ss a zzzz'], ['{1}, {0}', u, '{1} \\'at\\' {0}', u],\n ['.', ',', ';', '%', '+', '-', 'e', '×', '‰', '∞', 'NaN', '.'],\n ['#,##0.###', '#,##0%', '¤#,##0.00', '#E0'], '$', 'Australian Dollar', {\n 'AUD': ['$'],\n 'BDT': [u, 'Tk'],\n 'BOB': [u, '$b'],\n 'BRL': [u, 'R$'],\n 'CAD': [u, '$'],\n 'CNY': [u, '¥'],\n 'CUP': [u, '₱'],\n 'EGP': [u, '£'],\n 'EUR': [u, '€'],\n 'GBP': [u, '£'],\n 'HKD': [u, '$'],\n 'ILS': [u, '₪'],\n 'INR': [u, '₹'],\n 'ISK': [u, 'Kr'],\n 'JPY': [u, '¥'],\n 'KRW': [u, '₩'],\n 'MXN': [u, '$'],\n 'NZD': [u, '$'],\n 'PYG': [u, 'Gs'],\n 'SCR': ['Rs'],\n 'SEK': [u, 'Kr'],\n 'TWD': [u, '$'],\n 'USD': [u, '$'],\n 'UYU': [u, '$U'],\n 'VND': [u, '₫'],\n 'XAF': [],\n 'XCD': [u, '$'],\n 'XOF': [],\n 'XPF': ['CFP']\n },\n plural\n ];\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW4tQVUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9lbi1BVS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxrQkFBZTtRQUNiLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hDO1lBQ0UsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7WUFDOUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDeEQsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDOUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7U0FDdEQ7UUFDRCxDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1lBQzVELENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDL0Y7Z0JBQ0UsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXO2dCQUNyRixTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVU7YUFDbEM7U0FDRjtRQUNELENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixDQUFDO1FBQ25ELENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQzlGLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDOUQsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsbUJBQW1CLEVBQUU7WUFDckUsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQ2hCLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7WUFDaEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDYixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQ2hCLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUM7U0FDZjtRQUNELE1BQU07S0FDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBUSElTIENPREUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIE1PRElGWVxuLy8gU2VlIGFuZ3VsYXIvdG9vbHMvZ3VscC10YXNrcy9jbGRyL2V4dHJhY3QuanNcblxuY29uc3QgdSA9IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSksIHYgPSBuLnRvU3RyaW5nKCkucmVwbGFjZSgvXlteLl0qXFwuPy8sICcnKS5sZW5ndGg7XG4gIGlmIChpID09PSAxICYmIHYgPT09IDApIHJldHVybiAxO1xuICByZXR1cm4gNTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW1xuICAnZW4tQVUnLCBbWydhbScsICdwbSddLCB1LCB1XSwgdSxcbiAgW1xuICAgIFsnU3UuJywgJ00uJywgJ1R1LicsICdXLicsICdUaC4nLCAnRi4nLCAnU2EuJ10sXG4gICAgWydTdW4uJywgJ01vbi4nLCAnVHVlLicsICdXZWQuJywgJ1RodS4nLCAnRnJpLicsICdTYXQuJ10sXG4gICAgWydTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSddLFxuICAgIFsnU3UuJywgJ01vbi4nLCAnVHUuJywgJ1dlZC4nLCAnVGguJywgJ0ZyaS4nLCAnU2F0LiddXG4gIF0sXG4gIHUsXG4gIFtcbiAgICBbJ0onLCAnRicsICdNJywgJ0EnLCAnTScsICdKJywgJ0onLCAnQScsICdTJywgJ08nLCAnTicsICdEJ10sXG4gICAgWydKYW4uJywgJ0ZlYi4nLCAnTWFyLicsICdBcHIuJywgJ01heScsICdKdW4uJywgJ0p1bC4nLCAnQXVnLicsICdTZXAuJywgJ09jdC4nLCAnTm92LicsICdEZWMuJ10sXG4gICAgW1xuICAgICAgJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJyxcbiAgICAgICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ1xuICAgIF1cbiAgXSxcbiAgdSwgW1snQicsICdBJ10sIFsnQkMnLCAnQUQnXSwgWydCZWZvcmUgQ2hyaXN0JywgJ0Fubm8gRG9taW5pJ11dLCAwLCBbNiwgMF0sXG4gIFsnZC9NL3l5JywgJ2QgTU1NIHknLCAnZCBNTU1NIHknLCAnRUVFRSwgZCBNTU1NIHknXSxcbiAgWydoOm1tIGEnLCAnaDptbTpzcyBhJywgJ2g6bW06c3MgYSB6JywgJ2g6bW06c3MgYSB6enp6J10sIFsnezF9LCB7MH0nLCB1LCAnezF9IFxcJ2F0XFwnIHswfScsIHVdLFxuICBbJy4nLCAnLCcsICc7JywgJyUnLCAnKycsICctJywgJ2UnLCAnw5cnLCAn4oCwJywgJ+KInicsICdOYU4nLCAnLiddLFxuICBbJyMsIyMwLiMjIycsICcjLCMjMCUnLCAnwqQjLCMjMC4wMCcsICcjRTAnXSwgJyQnLCAnQXVzdHJhbGlhbiBEb2xsYXInLCB7XG4gICAgJ0FVRCc6IFsnJCddLFxuICAgICdCRFQnOiBbdSwgJ1RrJ10sXG4gICAgJ0JPQic6IFt1LCAnJGInXSxcbiAgICAnQlJMJzogW3UsICdSJCddLFxuICAgICdDQUQnOiBbdSwgJyQnXSxcbiAgICAnQ05ZJzogW3UsICfCpSddLFxuICAgICdDVVAnOiBbdSwgJ+KCsSddLFxuICAgICdFR1AnOiBbdSwgJ8KjJ10sXG4gICAgJ0VVUic6IFt1LCAn4oKsJ10sXG4gICAgJ0dCUCc6IFt1LCAnwqMnXSxcbiAgICAnSEtEJzogW3UsICckJ10sXG4gICAgJ0lMUyc6IFt1LCAn4oKqJ10sXG4gICAgJ0lOUic6IFt1LCAn4oK5J10sXG4gICAgJ0lTSyc6IFt1LCAnS3InXSxcbiAgICAnSlBZJzogW3UsICfCpSddLFxuICAgICdLUlcnOiBbdSwgJ+KCqSddLFxuICAgICdNWE4nOiBbdSwgJyQnXSxcbiAgICAnTlpEJzogW3UsICckJ10sXG4gICAgJ1BZRyc6IFt1LCAnR3MnXSxcbiAgICAnU0NSJzogWydScyddLFxuICAgICdTRUsnOiBbdSwgJ0tyJ10sXG4gICAgJ1RXRCc6IFt1LCAnJCddLFxuICAgICdVU0QnOiBbdSwgJyQnXSxcbiAgICAnVVlVJzogW3UsICckVSddLFxuICAgICdWTkQnOiBbdSwgJ+KCqyddLFxuICAgICdYQUYnOiBbXSxcbiAgICAnWENEJzogW3UsICckJ10sXG4gICAgJ1hPRic6IFtdLFxuICAgICdYUEYnOiBbJ0NGUCddXG4gIH0sXG4gIHBsdXJhbFxuXTtcbiJdfQ==\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@angular/common/locales/en-AU.js\n// module id = 616\n// module chunks = 1","import { NgModule } from \"@angular/core\";\r\n\r\nimport { AdminRoutingModule } from \"./admin-routing.module\";\r\nimport { SharedModule } from \"../shared/shared.module\";\r\n\r\nimport { UserService } from \"./shared/user.service\";\r\n\r\nimport { ThemeSettingsComponent } from \"./theme-settings/theme-settings.component\";\r\nimport { UserDetailComponent } from \"./user-detail/user-detail.component\";\r\nimport { UserListComponent } from \"./user-list/user-list.component\";\r\n\r\n@NgModule({\r\n imports: [\r\n AdminRoutingModule,\r\n SharedModule,\r\n ],\r\n\r\n declarations: [\r\n ThemeSettingsComponent,\r\n UserDetailComponent,\r\n UserListComponent,\r\n ],\r\n\r\n providers: [\r\n UserService\r\n ]\r\n})\r\nexport class AdminModule { }\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/admin/admin.module.ts","import { NgModule } from \"@angular/core\";\r\nimport { RouterModule, Routes } from \"@angular/router\";\r\n\r\nimport { AuthGuard } from \"../auth/auth-guard.service\";\r\nimport { ThemeSettingsComponent } from \"./theme-settings/theme-settings.component\";\r\nimport { UserDetailComponent } from \"./user-detail/user-detail.component\";\r\nimport { UserListComponent } from \"./user-list/user-list.component\";\r\n\r\nconst adminRoutes: Routes = [\r\n { path: \"theme\", component: ThemeSettingsComponent, canActivate: [AuthGuard] },\r\n { path: \"users\", component: UserListComponent, canActivate: [AuthGuard] },\r\n { path: \"users/:id\", component: UserDetailComponent, canActivate: [AuthGuard] },\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(adminRoutes)],\r\n exports: [RouterModule]\r\n})\r\n\r\nexport class AdminRoutingModule { }\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/admin/admin-routing.module.ts","module.exports = \"
\\r\\n \\r\\n \\r\\n format_color_fill\\r\\n Theme Settings\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n

Select toolbar colour:

\\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n

Upload a new logo. It will be displayed in the navbar, and on generated quote documents. The image should:

\\r\\n
    \\r\\n
  • Not be larger than 300x50 px (will be scaled).
  • \\r\\n
  • Ideally have a transparent background.
  • \\r\\n
  • Must be PNG format.
  • \\r\\n
  • Must be less than 100KB in size.
  • \\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n

\\r\\n Selected: {{navbarLogoFC?.value?.fileName}}\\r\\n

\\r\\n\\r\\n
\\r\\n \\\"preview-logo\\\"\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/admin/theme-settings/theme-settings.component.html\n// module id = 619\n// module chunks = 1","module.exports = \".file-chooser {\\r\\n cursor: pointer;\\r\\n max-width: 120px;\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/admin/theme-settings/theme-settings.component.css\n// module id = 620\n// module chunks = 1","module.exports = \"

Confirm Action

\\r\\n\\r\\n\\r\\n

{{question}}

\\r\\n
\\r\\n\\r\\n\\r\\n \\r\\n \\r\\n\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/core/confirm-dialog/confirm-dialog.component.html\n// module id = 621\n// module chunks = 1","module.exports = \"
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n person_outline\\r\\n Manage User\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n {{opt.label}}\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 60 characters.\\r\\n Required.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 60 characters.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 60 characters.\\r\\n Required.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 100 characters.\\r\\n Required.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 100 characters.\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n Administrator\\r\\n Active\\r\\n Locked\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/admin/user-detail/user-detail.component.html\n// module id = 622\n// module chunks = 1","module.exports = \".info-area {\\r\\n margin: 10px;\\r\\n}\\r\\n\\r\\n.reset {\\r\\n margin-top: 10px;\\r\\n margin-bottom: 20px;\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/admin/user-detail/user-detail.component.css\n// module id = 623\n// module chunks = 1","module.exports = \"
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Username\\r\\n \\r\\n \\r\\n {{ row.username }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Full Name\\r\\n \\r\\n \\r\\n {{ row.fullName }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Role\\r\\n \\r\\n \\r\\n {{ row.isWebAdmin ? 'Admin' : 'User' }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Active\\r\\n \\r\\n \\r\\n {{ row.isActive ? 'Yes' : 'No' }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Locked\\r\\n \\r\\n \\r\\n {{ row.isLocked ? 'Yes' : 'No' }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Actions\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/admin/user-list/user-list.component.html\n// module id = 624\n// module chunks = 1","module.exports = \".container {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.user-table {\\r\\n overflow: auto;\\r\\n min-width: 700px;\\r\\n}\\r\\n\\r\\n.mat-column-username,\\r\\n.mat-column-fullName {\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n min-width: 170px;\\r\\n}\\r\\n\\r\\n.mat-column-isWebAdmin,\\r\\n.mat-column-isActive,\\r\\n.mat-column-isLocked,\\r\\n.mat-column-actions {\\r\\n min-width: 60px;\\r\\n max-width: 100px;\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/admin/user-list/user-list.component.css\n// module id = 625\n// module chunks = 1","import { NgModule } from \"@angular/core\";\r\nimport {\r\n MAT_LABEL_GLOBAL_OPTIONS,\r\n MatAutocompleteModule,\r\n MatButtonModule,\r\n MatCardModule,\r\n MatCheckboxModule,\r\n MatChipsModule,\r\n MatDialogModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatListModule,\r\n MatMenuModule,\r\n MatOptionModule,\r\n MatPaginatorModule,\r\n MatProgressSpinnerModule,\r\n MatRadioModule,\r\n MatSelectModule,\r\n MatSidenavModule,\r\n MatSnackBarModule,\r\n MatSortModule,\r\n MatTableModule,\r\n MatTabsModule,\r\n MatToolbarModule,\r\n MatTooltipModule\r\n} from \"@angular/material\";\r\n\r\n@NgModule({\r\n imports: [\r\n MatAutocompleteModule,\r\n MatButtonModule,\r\n MatCardModule,\r\n MatCheckboxModule,\r\n MatChipsModule,\r\n MatDialogModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatListModule,\r\n MatMenuModule,\r\n MatOptionModule,\r\n MatPaginatorModule,\r\n MatProgressSpinnerModule,\r\n MatRadioModule,\r\n MatSelectModule,\r\n MatSidenavModule,\r\n MatSnackBarModule,\r\n MatSortModule,\r\n MatTableModule,\r\n MatTabsModule,\r\n MatToolbarModule,\r\n MatTooltipModule\r\n ],\r\n\r\n exports: [\r\n MatAutocompleteModule,\r\n MatButtonModule,\r\n MatCardModule,\r\n MatCheckboxModule,\r\n MatChipsModule,\r\n MatDialogModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatListModule,\r\n MatMenuModule,\r\n MatOptionModule,\r\n MatPaginatorModule,\r\n MatProgressSpinnerModule,\r\n MatRadioModule,\r\n MatSelectModule,\r\n MatSidenavModule,\r\n MatSnackBarModule,\r\n MatSortModule,\r\n MatTableModule,\r\n MatTabsModule,\r\n MatToolbarModule,\r\n MatTooltipModule\r\n ],\r\n\r\n providers: [\r\n { provide: MAT_LABEL_GLOBAL_OPTIONS, useValue: { float: \"always\" } }\r\n ]\r\n})\r\n\r\nexport class FAWMaterialModule { }\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/shared/faw-material.module.ts","import { NgModule } from \"@angular/core\";\r\nimport { RouterModule, Routes } from \"@angular/router\";\r\n\r\nimport { AuthGuard } from \"./auth/auth-guard.service\";\r\nimport { LoginComponent } from \"./login/login.component\";\r\nimport { PerspectiveComponent } from \"./perspective/perspective.component\";\r\n\r\nconst routes: Routes = [\r\n { path: \"login\", component: LoginComponent },\r\n { path: \"perspective\", component: PerspectiveComponent, canActivate: [AuthGuard] },\r\n\r\n { path: \"\", redirectTo: \"/login\", pathMatch: \"full\" },\r\n //{ path: \"**\", component: PageNotFoundComponent }\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forRoot(routes)],\r\n exports: [RouterModule]\r\n})\r\n\r\nexport class AppRoutingModule { }\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/app-routing.module.ts","module.exports = \"

Change Password

\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n warning\\r\\n Your account is using a temporary password, please update it before proceeding.\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n Max length 100 characters.\\r\\n Required.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 100 characters.\\r\\n Required.\\r\\n \\r\\n Passwords do not match.\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/auth/change-password-dialog/change-password-dialog.component.html\n// module id = 628\n// module chunks = 1","module.exports = \".message {\\r\\n margin-bottom: 20px;\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/auth/change-password-dialog/change-password-dialog.component.css\n// module id = 629\n// module chunks = 1","module.exports = \"
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n warning\\r\\n {{message}}\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n ← Back to Finance@work Pty Ltd\\r\\n\\r\\n
\\r\\n Version {{appVersion}} [{{releaseDate}}]\\r\\n
\\r\\n
\\r\\n
\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/login/login.component.html\n// module id = 630\n// module chunks = 1","module.exports = __webpack_public_path__ + \"assets/faw-logo-login.38f2d32a6cbeed57ad808e55446c4a64.png\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/content/faw-logo-login.png\n// module id = 631\n// module chunks = 1","module.exports = \".login-container {\\r\\n padding: 8% 0 0;\\r\\n}\\r\\n\\r\\n.message-text {\\r\\n padding: 5px;\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.login-form-field label {\\r\\n cursor: pointer;\\r\\n color: #72777c;\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.login-form-field label input {\\r\\n background: #fbfbfb;\\r\\n\\r\\n font-size: 24px;\\r\\n width: 100%;\\r\\n padding: 3px;\\r\\n margin: 2px 6px 16px 0;\\r\\n\\r\\n border: 1px solid #ddd;\\r\\n box-shadow: inset 0 1px 2px rgba(0,0,0,.07);\\r\\n /*background-color: #fff;*/\\r\\n color: #32373c;\\r\\n outline: 0;\\r\\n transition: 50ms border-color ease-in-out;\\r\\n}\\r\\n\\r\\n.login-form-field label input:focus {\\r\\n border-color: #5b9dd9;\\r\\n box-shadow: 0 0 2px rgba(30,140,190,.8);\\r\\n}\\r\\n\\r\\n.login-button {\\r\\n background-color: #0085ba;\\r\\n color: #fff;\\r\\n}\\r\\n\\r\\n.link-text:hover {\\r\\n color: #00a0d2;\\r\\n}\\r\\n\\r\\n.link-text {\\r\\n font-size: 13px;\\r\\n text-decoration: none;\\r\\n color: #555d66;\\r\\n transition-property: border,background,color;\\r\\n transition-duration: .05s;\\r\\n transition-timing-function: ease-in-out;\\r\\n outline: 0;\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/login/login.component.css\n// module id = 632\n// module chunks = 1","module.exports = \"
\\r\\n \\r\\n \\r\\n visibility\\r\\n {{perspectiveService.activeIntroducer ? 'Change' : 'Set'}} Perspective\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{sup.entityNumber}} | {{sup.entityName}} |\\r\\n Trading as \\\"{{sup.tradingAs || '(Unspecified)'}}\\\"\\r\\n \\r\\n \\r\\n Set your perspective to a specific supplier.\\r\\n \\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/perspective/perspective.component.html\n// module id = 633\n// module chunks = 1","import { NgModule } from \"@angular/core\";\r\nimport { HTTP_INTERCEPTORS } from \"@angular/common/http\";\r\n\r\nimport { SharedModule } from \"../shared/shared.module\";\r\n\r\nimport { ChangePasswordDialogComponent } from \"./change-password-dialog/change-password-dialog.component\";\r\nimport { AuthGuard } from \"./auth-guard.service\";\r\nimport { AuthService } from \"./auth.service\";\r\nimport { UnauthRedirectInterceptor } from \"./unauth-redirect.interceptor\";\r\n\r\n@NgModule({\r\n imports: [\r\n SharedModule,\r\n ],\r\n\r\n declarations: [\r\n ChangePasswordDialogComponent,\r\n ],\r\n\r\n exports: [\r\n ChangePasswordDialogComponent,\r\n ],\r\n\r\n entryComponents: [\r\n ChangePasswordDialogComponent\r\n ],\r\n\r\n providers: [\r\n AuthGuard,\r\n AuthService,\r\n\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: UnauthRedirectInterceptor,\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class AuthModule { }\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/auth/auth.module.ts","import { Injectable } from \"@angular/core\";\r\nimport { HttpRequest, HttpErrorResponse, HttpResponse, HttpInterceptor, HttpHandler, HttpEvent } from \"@angular/common/http\";\r\nimport { Router } from \"@angular/router\";\r\nimport { Observable } from \"rxjs\";\r\nimport { tap } from \"rxjs/operators\";\r\n\r\nimport { SnackBarService } from \"../core/snack-bar.service\";\r\n\r\n@Injectable()\r\nexport class UnauthRedirectInterceptor implements HttpInterceptor {\r\n\r\n constructor(private router: Router) { }\r\n\r\n // see https://medium.com/@ryanchenkie_40935/angular-authentication-using-the-http-client-and-http-interceptors-2f9d1540eb8\r\n\r\n intercept(req: HttpRequest, next: HttpHandler): Observable> {\r\n\r\n return next.handle(req)\r\n .pipe(\r\n tap((event: HttpEvent) => {\r\n if (event instanceof HttpResponse) {\r\n // do stuff with response if you want\r\n }\r\n }, (err: any) => {\r\n // todo: logic to use refresh token would go here instead of just redirecting...\r\n if (err instanceof HttpErrorResponse) {\r\n if (err.status === 401 || err.status === 403) {\r\n this.router.navigate([\"/login\"]);\r\n }\r\n }\r\n }));\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/auth/unauth-redirect.interceptor.ts","import { NgModule, Optional, SkipSelf } from \"@angular/core\";\r\nimport { RouterModule } from \"@angular/router\";\r\n\r\nimport { SharedModule } from \"../shared/shared.module\";\r\n\r\nimport { ConfirmDialogComponent } from \"./confirm-dialog/confirm-dialog.component\";\r\nimport { throwIfAlreadyLoaded } from \"./module-import-guard\";\r\nimport { SnackBarService } from \"./snack-bar.service\";\r\nimport { ThemeService } from \"./theme.service\";\r\nimport { ValidationHelperService } from \"./validation-helper.service\";\r\nimport { role, Role } from \"./role.const\";\r\n\r\n@NgModule({\r\n imports: [\r\n RouterModule,\r\n SharedModule\r\n ],\r\n\r\n declarations: [\r\n ConfirmDialogComponent,\r\n ],\r\n\r\n exports: [\r\n ConfirmDialogComponent,\r\n ],\r\n\r\n entryComponents: [\r\n ConfirmDialogComponent\r\n ],\r\n\r\n providers: [\r\n SnackBarService,\r\n ThemeService,\r\n ValidationHelperService,\r\n\r\n { provide: role, useValue: Role }\r\n ]\r\n})\r\n\r\nexport class CoreModule {\r\n constructor( @Optional() @SkipSelf() parentModule: CoreModule) {\r\n throwIfAlreadyLoaded(parentModule, \"CoreModule\");\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/core/core.module.ts","export function throwIfAlreadyLoaded(parentModule: any, moduleName: string) {\r\n if (parentModule) {\r\n throw new Error(`${moduleName} has already been loaded. Import Core modules in the AppModule only.`);\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/core/module-import-guard.ts","import { NgModule } from \"@angular/core\";\r\n\r\nimport { EnquiryRoutingModule } from \"./enquiry-routing.module\";\r\nimport { SharedModule } from \"../shared/shared.module\";\r\n\r\nimport { EmailService } from \"./shared/email.service\";\r\nimport { EnquiryService } from \"./shared/enquiry.service\";\r\nimport { DocumentService } from \"./shared/document.service\";\r\n\r\nimport { DownloadQuoteDialogComponent } from \"./download-quote-dialog/download-quote-dialog.component\";\r\nimport { EmailEnquiryDialogComponent } from \"./email-enquiry-dialog/email-enquiry-dialog.component\";\r\nimport { EmailHistoryDialogComponent } from \"./email-history-dialog/email-history-dialog.component\";\r\nimport { EnquiryDetailComponent } from \"./enquiry-detail/enquiry-detail.component\";\r\nimport { EnquiryListComponent } from \"./enquiry-list/enquiry-list.component\";\r\n\r\n@NgModule({\r\n imports: [\r\n EnquiryRoutingModule,\r\n SharedModule,\r\n ],\r\n\r\n declarations: [\r\n DownloadQuoteDialogComponent,\r\n EmailEnquiryDialogComponent,\r\n EmailHistoryDialogComponent,\r\n EnquiryDetailComponent,\r\n EnquiryListComponent,\r\n ],\r\n\r\n entryComponents: [\r\n DownloadQuoteDialogComponent,\r\n EmailEnquiryDialogComponent,\r\n EmailHistoryDialogComponent,\r\n ],\r\n\r\n providers: [\r\n EmailService,\r\n EnquiryService,\r\n DocumentService,\r\n ]\r\n})\r\nexport class EnquiryModule { }\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/enquiry/enquiry.module.ts","import { NgModule } from \"@angular/core\";\r\nimport { RouterModule, Routes } from \"@angular/router\";\r\n\r\nimport { AuthGuard } from \"../auth/auth-guard.service\";\r\nimport { EnquiryDetailComponent } from \"./enquiry-detail/enquiry-detail.component\";\r\nimport { EnquiryListComponent } from \"./enquiry-list/enquiry-list.component\";\r\n\r\nconst enquiryRoutes: Routes = [\r\n { path: \"enquiries\", component: EnquiryListComponent, canActivate: [AuthGuard] },\r\n { path: \"enquiries/new\", component: EnquiryDetailComponent, canActivate: [AuthGuard] },\r\n { path: \"enquiries/:id\", component: EnquiryDetailComponent, canActivate: [AuthGuard] },\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(enquiryRoutes)],\r\n exports: [RouterModule]\r\n})\r\n\r\nexport class EnquiryRoutingModule { }\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/enquiry/enquiry-routing.module.ts","import { FormGroup, ValidatorFn, ValidationErrors } from \"@angular/forms\";\r\n\r\n// see https://stackoverflow.com/a/45514884\r\nexport const atLeastOne = (validator: ValidatorFn) => (\r\n group: FormGroup,\r\n): ValidationErrors | null => {\r\n const hasAtLeastOne = group && group.controls && Object.keys(group.controls)\r\n .some(k => !validator(group.controls[k]));\r\n\r\n return hasAtLeastOne ? null : {\r\n atLeastOne: true,\r\n };\r\n};\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/core/at-least-one-validator.ts","module.exports = \"

Download Quote

\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n

Document Settings

\\r\\n Show Asset Cost\\r\\n\\r\\n

Select repayment options to include in the quote document:

\\r\\n
\\r\\n
\\r\\n
\\r\\n {{opt.paymentFrequencyName}}\\r\\n
\\r\\n \\r\\n {{opt.repayment | currency:'AUD'}} over {{opt.term}} mths \\r\\n {{opt.residualLabelAsBalloon ? 'BA' : 'RV'}} {{opt.residualAmount | currency:'AUD'}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/enquiry/download-quote-dialog/download-quote-dialog.component.html\n// module id = 641\n// module chunks = 1","module.exports = \".doc-settings-area {\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n.doc-settings-title {\\r\\n font-weight: bold;\\r\\n margin-top: 0px;\\r\\n}\\r\\n\\r\\n.payment-frequency-heading {\\r\\n margin-bottom: 8px;\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/enquiry/download-quote-dialog/download-quote-dialog.component.css\n// module id = 642\n// module chunks = 1","module.exports = \"

Email

\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n

Document Settings

\\r\\n Show Asset Cost\\r\\n\\r\\n

Select repayment options to include in the quote document:

\\r\\n
\\r\\n
\\r\\n
\\r\\n {{opt.paymentFrequencyName}}\\r\\n
\\r\\n \\r\\n {{opt.repayment | currency:'AUD'}} over {{opt.term}} mths\\r\\n {{opt.residualLabelAsBalloon ? 'BA' : 'RV'}} {{opt.residualAmount | currency:'AUD'}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n Max length 300 characters.\\r\\n Required.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 300 characters.\\r\\n Use a comma to separate multiple emails.\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n Max length 300 characters.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 300 characters.\\r\\n Use a comma to separate multiple emails.\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n The generated quote document and an application form (if one is available) will be attached automatically, preview either with the buttons below.\\r\\n
\\r\\n
\\r\\n warning\\r\\n

iPhone Safari users please note - viewing these files will navigate you away from this web app. Pressing your phone's back button will return you to this enquiry screen, but your email draft and document settings (see above) will be lost.

\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n {{attachment.value.fileName}}\\r\\n clear\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n Required.\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/enquiry/email-enquiry-dialog/email-enquiry-dialog.component.html\n// module id = 643\n// module chunks = 1","module.exports = \".info-area {\\r\\n max-width: 800px;\\r\\n}\\r\\n\\r\\n.file-area {\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.attachment-list {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.doc-settings-area {\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n.doc-settings-title {\\r\\n font-weight: bold;\\r\\n margin-top: 0px;\\r\\n}\\r\\n\\r\\n.chip-button {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.payment-frequency-heading {\\r\\n margin-bottom: 8px;\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/enquiry/email-enquiry-dialog/email-enquiry-dialog.component.css\n// module id = 644\n// module chunks = 1","module.exports = \"
\\r\\n warning\\r\\n {{ errorMessage }}\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n {{ enquiry?.id ? 'Editing' : 'New' }} Enquiry\\r\\n
\\r\\n\\r\\n \\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n looks_one\\r\\n
Provide Quote Details
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n {{opt.label}}\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n {{irc.productName}}\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n {{assetTypeGroup.label}}\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n Max length 1000 characters.\\r\\n \\r\\n\\r\\n
\\r\\n \\r\\n $  \\r\\n \\r\\n \\r\\n {{selectedIrc?.costOfGoodsIncGST ? 'Incl. GST' : 'Excl. GST'}}\\r\\n Minimum {{selectedIrc.minCostOfGoods | currency:'AUD'}}\\r\\n Maximum {{selectedIrc.maxCostOfGoods | currency:'AUD'}}\\r\\n Required.\\r\\n Please enter a number.\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n Payment in Advance\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n looks_two\\r\\n
Select Repayment Option
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n

Submitted Repayment Option

\\r\\n \\r\\n \\r\\n done\\r\\n

{{enquiry.repayment | currency:'AUD'}} per {{getSingularFrequencyDesc(enquiry.paymentFrequencyName)}}

\\r\\n

For {{enquiry.term}} months

\\r\\n

{{getResidualLabel()}}: {{enquiry.residualAmount | currency:'AUD'}}

\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n

Please enter financial details to view repayment options.

\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
    \\r\\n
  • \\r\\n\\r\\n

    {{freq.label}}

    \\r\\n
    \\r\\n\\r\\n
    \\r\\n {{opt.repayment | currency:'AUD'}}\\r\\n per {{getSingularFrequencyDesc(opt.paymentFrequencyName)}}\\r\\n for {{opt.term}} months\\r\\n \\r\\n {{getResidualLabel()}} {{opt.residualAmount | currency:'AUD'}}\\r\\n \\r\\n
    \\r\\n
    \\r\\n
  • \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n looks_3\\r\\n
Provide Contact Details
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n Max length 100 characters.\\r\\n Required.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 100 characters.\\r\\n Required.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n {{abnInput.value.length}} / 11\\r\\n \\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n Please provide either a phone or mobile number.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n Max length 100 characters.\\r\\n Required.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 200 characters.\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Max length 500 characters.\\r\\n \\r\\n\\r\\n
\\r\\n Submitted on {{enquiry?.submittedOn | date:'medium'}}.\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/enquiry/enquiry-detail/enquiry-detail.component.html\n// module id = 645\n// module chunks = 1","module.exports = \"/* IE specific fix. IE seems to have trouble with the mat-card heights, and\\r\\n we don't really need to worry about mobile layout for IE https://stackoverflow.com/a/36448860 \\r\\n The enquiry detail screen is currently the only page where we want the mat-card heights to match like this.\\r\\n*/\\r\\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\\r\\n mat-card {\\r\\n min-height: 740px;\\r\\n }\\r\\n}\\r\\n\\r\\n.message {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.header-icon {\\r\\n color: grey;\\r\\n}\\r\\n\\r\\n.section-header {\\r\\n margin-top: 15px;\\r\\n margin-bottom: 15px;\\r\\n}\\r\\n\\r\\n/* Repayments grid CSS below\\r\\n * Modified from http://webdesign.tutsplus.com/tutorials/build-a-responsive-pricing-table-with-neat-hover-states--webdesign-12037\\r\\n * Demo: http://source.tutsplus.com/webdesign/tutorials/025_css-pricing-tables/index.html\\r\\n*/\\r\\n\\r\\n/*----------\\r\\nBlocks\\r\\n----------*/\\r\\n/*Pricing table and price blocks*/\\r\\n.pricing-table {\\r\\n\\tline-height: 150%; \\r\\n\\tfont-size: 12px; \\r\\n\\tmax-width: 800px; \\r\\n\\tpadding: 10px;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\t\\t\\r\\n.price-block {\\r\\n\\ttext-align: center; \\r\\n\\twidth: 100%; \\r\\n\\tcolor: #fff; \\r\\n\\tfloat: left; \\r\\n\\tlist-style-type: none; \\r\\n\\ttransition: all 0.25s; \\r\\n\\tposition: relative; \\r\\n\\tbox-sizing: border-box;\\r\\n\\tmargin-bottom: 10px; \\r\\n\\tborder-bottom: 1px solid transparent; \\r\\n}\\r\\n\\t\\t\\r\\n/*Price heads*/\\r\\n.pricing-table h4 {\\r\\n\\ttext-transform: uppercase; \\r\\n\\tpadding: 5px 0; \\r\\n\\tbackground: #666; \\r\\n\\tmargin: -10px 0 1px 0;\\r\\n}\\r\\n\\t\\t\\r\\n/*Price tags*/\\r\\n.price {\\r\\n\\tdisplay: table; \\r\\n\\tbackground: #777; \\r\\n\\twidth: 100%; \\r\\n\\theight: 70px; \\r\\n}\\r\\n\\r\\n.price-figure {\\r\\n\\tfont-size: 18px; \\r\\n\\ttext-transform: uppercase; \\r\\n\\tvertical-align: middle; \\r\\n\\tdisplay: table-cell;\\r\\n border-bottom: 1px solid #ccc; \\r\\n padding: 5px;\\r\\n}\\r\\n\\r\\n.price-number {\\r\\n\\tfont-weight: bold; \\r\\n\\tdisplay: block;\\r\\n}\\r\\n\\r\\n.price-tenure {\\r\\n\\tfont-size: 11px; \\r\\n display: block;\\r\\n}\\r\\n\\t\\t\\r\\n/*Features*/\\r\\n.features {\\r\\n\\tbackground: #DEF0F4; \\r\\n\\tcolor: #000;\\r\\n padding-left: 0px;\\r\\n}\\r\\n\\r\\n.features li {\\r\\n\\tpadding: 8px 15px;\\r\\n\\tborder-bottom: 1px solid #ccc; \\r\\n\\tfont-size: 11px; \\r\\n\\tlist-style-type: none;\\r\\n}\\r\\n\\t\\t\\r\\n.footer {\\r\\n\\tpadding: 10px; \\r\\n\\tbackground: #DEF0F4;\\r\\n}\\r\\n\\r\\n.action-button {\\r\\n\\ttext-decoration: none; \\r\\n\\tcolor: #fff; \\r\\n\\tfont-weight: bold; \\r\\n\\tborder-radius: 5px; \\r\\n\\tbackground: linear-gradient(#666, #333); \\r\\n\\tpadding: 5px 20px; \\r\\n\\tfont-size: 11px; \\r\\n\\ttext-transform: uppercase;\\r\\n}\\r\\n\\r\\n.price-block-selected {\\r\\n\\tbox-shadow: 0 0 0px 5px rgba(0, 0, 0, 0.5); \\r\\n\\ttransform: scale(1.04) translateY(-5px); \\r\\n\\tz-index: 1; \\r\\n\\tborder-bottom: 0 none;\\r\\n}\\r\\n\\r\\n.price-block-selected .price-selected {\\r\\n\\tbackground: #419639;\\r\\n}\\r\\n\\r\\n.price-block-selected h4 {\\r\\n\\tbackground: #555;\\r\\n}\\r\\n\\t\\t\\r\\n@media only screen and (min-width : 480px) and (max-width : 768px) {\\r\\n\\t.price-block {width: 50%;}\\r\\n\\t.price-block:nth-child(odd) {border-right: 1px solid transparent;}\\r\\n\\t.price-block:nth-child(3) {clear: both;}\\r\\n}\\r\\n@media only screen and (min-width : 768px){\\r\\n\\t.price-block {width: 33%;}\\r\\n\\t.price-block {border-right: 1px solid transparent; border-bottom: 0 none;}\\r\\n\\t.price-block:last-child {border-right: 0 none;}\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/enquiry/enquiry-detail/enquiry-detail.component.css\n// module id = 646\n// module chunks = 1","module.exports = \"

Email History

\\r\\n\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n

Quote emailed at {{email.createdOn | date:'medium'}} by {{email.createdBy}}

\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n To:\\r\\n {{email.to}}\\r\\n
\\r\\n
\\r\\n CC:\\r\\n {{email.cc}}\\r\\n
\\r\\n
\\r\\n BCC:\\r\\n {{email.bcc}}\\r\\n
\\r\\n
\\r\\n User Attached Files:\\r\\n {{email.attachmentFileNames}}\\r\\n
\\r\\n
\\r\\n Subject:\\r\\n {{email.subject}}\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n Asset Cost Shown:\\r\\n {{email.quoteDocGenData?.showAssetCost ? 'Yes' : 'No'}}\\r\\n
\\r\\n
\\r\\n Included Repayment Options:\\r\\n
\\r\\n
    \\r\\n
  • \\r\\n {{opt.paymentFrequencyName}} for {{opt.term}} months: {{opt.repayment | currency:'AUD'}}\\r\\n
    \\r\\n Balloon Amount: \\r\\n Residual Value: \\r\\n {{opt.residualAmount | currency:'AUD'}}\\r\\n
    \\r\\n
  • \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n \\r\\n\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/enquiry/email-history-dialog/email-history-dialog.component.html\n// module id = 647\n// module chunks = 1","module.exports = \".email-history-spinner {\\r\\n height: 130px; /* Prevents the scrollbar from appearing on the dialog since the spinner height changes during animation */\\r\\n}\\r\\n\\r\\n.email-content {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.label {\\r\\n font-weight: 600;\\r\\n margin-right: 5px;\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/enquiry/email-history-dialog/email-history-dialog.component.css\n// module id = 648\n// module chunks = 1","module.exports = \"
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n Last {{numMonths > 1 ? numMonths + ' Months' : 'Month' }}\\r\\n \\r\\n All Time\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n clear\\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Reference\\r\\n \\r\\n \\r\\n {{ row.enquiryNumber }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Business Name\\r\\n \\r\\n \\r\\n {{ row.businessName }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Contact Name\\r\\n \\r\\n \\r\\n {{ row.contactName }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Product\\r\\n \\r\\n \\r\\n {{ row.product }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Cost of Goods\\r\\n \\r\\n \\r\\n {{ row.costOfGoods | currency:'AUD' }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Term\\r\\n \\r\\n \\r\\n {{ row.term }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Repayment\\r\\n \\r\\n \\r\\n {{ row.repayment | currency:'AUD' }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Created\\r\\n \\r\\n \\r\\n {{ row.createdOn | date:'dd/MM/yyyy' }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Last Email Sent\\r\\n \\r\\n \\r\\n {{ row.lastEmailSentOn | date:'dd/MM/yyyy' }}\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Submitted\\r\\n \\r\\n \\r\\n {{ row.submittedOn | date:'dd/MM/yyyy' }}\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n Actions\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/enquiry/enquiry-list/enquiry-list.component.html\n// module id = 649\n// module chunks = 1","module.exports = \".container {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.search-box {\\r\\n width: 250px;\\r\\n}\\r\\n\\r\\n.clear-search {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.enquiry-table {\\r\\n /*overflow: auto;*/\\r\\n min-width: 1200px;\\r\\n}\\r\\n\\r\\n.table-footer {\\r\\n margin-top: 10px;\\r\\n color: rgba(0,0,0,.54);\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.mat-column-businessName,\\r\\n.mat-column-contactName {\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.mat-column-product,\\r\\n.mat-column-createdOn,\\r\\n.mat-column-lastEmailSentOn,\\r\\n.mat-column-submittedOn {\\r\\n max-width: 130px;\\r\\n}\\r\\n\\r\\n.mat-column-enquiryNumber,\\r\\n.mat-column-costOfGoods,\\r\\n.mat-column-repayment {\\r\\n max-width: 100px;\\r\\n}\\r\\n\\r\\n.mat-column-term,\\r\\n.mat-column-actions {\\r\\n max-width: 50px;\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/enquiry/enquiry-list/enquiry-list.component.css\n// module id = 650\n// module chunks = 1","import { Component, OnInit, ViewChild } from \"@angular/core\";\r\nimport { FormGroup, FormControl } from '@angular/forms';\r\nimport { MatDialog, MatDialogConfig, MatInput, MatSidenav } from \"@angular/material\";\r\nimport { Router } from '@angular/router';\r\n\r\nimport { AuthService } from \"./auth/auth.service\";\r\nimport { PerspectiveService } from \"./perspective/perspective.service\";\r\nimport { ThemeService } from \"./core/theme.service\";\r\n\r\nimport { ChangePasswordDialogComponent } from \"./auth/change-password-dialog/change-password-dialog.component\";\r\n\r\nimport { appVersion } from \"./app-version\";\r\n\r\nimport \"../faw-styles.css\"; //App-wide styles\r\n\r\n@Component({\r\n selector: \"faw-app\",\r\n template: require('./app.component.html'),\r\n styles: [require('./app.component.css')]\r\n})\r\n\r\nexport class AppComponent implements OnInit {\r\n @ViewChild(MatInput) public searchInput: MatInput;\r\n @ViewChild(\"sidenav\") public sidenav: MatSidenav;\r\n\r\n appVersion: string = appVersion.Version;\r\n releaseDate: string = appVersion.ReleaseDate;\r\n showSearch: boolean;\r\n\r\n constructor(\r\n private authService: AuthService,\r\n private dialog: MatDialog,\r\n private perspectiveService: PerspectiveService,\r\n private router: Router,\r\n private themeService: ThemeService) { }\r\n\r\n ngOnInit() {\r\n\r\n }\r\n\r\n toggleSearchInput() {\r\n this.showSearch = !this.showSearch;\r\n if (this.showSearch) {\r\n // probably shouldnt need this setTimeout?\r\n // https://github.com/angular/material2/issues/1474#issuecomment-293683513\r\n setTimeout(() => {\r\n this.searchInput.focus();\r\n });\r\n }\r\n }\r\n\r\n onSubmit(searchValue: string) {\r\n this.router.navigate([\"/enquiries\", { \"search\": searchValue }]);\r\n this.searchInput.value = \"\";\r\n this.toggleSearchInput();\r\n }\r\n\r\n goTo(route: string) {\r\n this.sidenav.close();\r\n\r\n // force internal staff to set perspective before navigating\r\n if (this.showInternalStaffTools() && !this.perspectiveService.activeIntroducer) {\r\n this.router.navigate([\"/perspective\"]);\r\n } else {\r\n this.router.navigate([route]);\r\n }\r\n }\r\n\r\n logout() {\r\n this.sidenav.close();\r\n this.authService.logout();\r\n this.router.navigate([\"/login\"]);\r\n }\r\n\r\n openChangePasswordDialog(): void {\r\n this.sidenav.close();\r\n let dialogRef = this.dialog.open(ChangePasswordDialogComponent, {\r\n disableClose: true,\r\n data: {\r\n passwordChangeMandatory: false\r\n }\r\n });\r\n }\r\n\r\n perspectiveNotSet(): boolean {\r\n return this.authService\r\n && this.authService.userHasInternalStaffPermission\r\n && this.perspectiveService\r\n && !this.perspectiveService.activeIntroducer;\r\n }\r\n\r\n showInternalStaffTools(): boolean {\r\n return this.authService && this.authService.userHasInternalStaffPermission;\r\n }\r\n\r\n showWebAdminTools(): boolean {\r\n return this.authService && this.authService.userHasWebAdminPermission;\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/app.component.ts","module.exports = \"\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n visibility\\r\\n {{perspectiveService.activeIntroducer.entityName}}\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n

{{authService.userProfile?.fullName}}

\\r\\n

{{authService.userProfile?.jobTitle}}

\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n Enquiries\\r\\n view_list\\r\\n \\r\\n\\r\\n \\r\\n Perspective\\r\\n visibility\\r\\n \\r\\n\\r\\n \\r\\n Manage Users\\r\\n people\\r\\n \\r\\n\\r\\n \\r\\n Theme Settings\\r\\n format_color_fill\\r\\n \\r\\n\\r\\n \\r\\n Change Password\\r\\n lock\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n Sign Out\\r\\n exit_to_app\\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n Version {{appVersion}} [{{releaseDate}}]\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n
\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/app.component.html\n// module id = 653\n// module chunks = 1","module.exports = __webpack_public_path__ + \"assets/faw-logo-navbar.b27db7a4734bc135b391a03ab2d33393.png\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/content/faw-logo-navbar.png\n// module id = 654\n// module chunks = 1","module.exports = \".version-text {\\r\\n text-align: right; \\r\\n padding-top: 10px; \\r\\n padding-right: 10px; \\r\\n font-size: 12px\\r\\n}\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/app.component.css\n// module id = 655\n// module chunks = 1","import { Injectable, Injector } from \"@angular/core\";\r\nimport { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from \"@angular/common/http\";\r\nimport { Observable } from \"rxjs\";\r\n\r\nimport { PerspectiveService } from \"./perspective.service\";\r\n\r\n// see https://angular.io/guide/http#intercepting-all-requests-or-responses\r\n// this interceptor appends the active introducer ID to the query string of any request - only relevent for internal staff users.\r\n\r\n@Injectable()\r\nexport class PerspectiveInterceptor implements HttpInterceptor {\r\n constructor(private perspectiveService: PerspectiveService) { }\r\n\r\n intercept(req: HttpRequest, next: HttpHandler): Observable> {\r\n const activeIntroducerID = this.perspectiveService.getActiveIntroducerID();\r\n\r\n if (activeIntroducerID) {\r\n const reqWithParam = req.clone({ params: req.params.set(\"activeIntroducerID\", this.perspectiveService.getActiveIntroducerID()) })\r\n return next.handle(reqWithParam);\r\n } else {\r\n return next.handle(req);\r\n }\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/perspective/perspective.interceptor.ts","import { Injectable, Inject } from \"@angular/core\";\r\nimport { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams } from \"@angular/common/http\";\r\nimport { Router } from \"@angular/router\";\r\nimport { JwtHelperService } from \"@auth0/angular-jwt\";\r\nimport { Observable, throwError } from \"rxjs\";\r\nimport { catchError, flatMap } from \"rxjs/operators\";\r\n\r\nimport { handleError } from \"../shared/handle-error\";\r\nimport { PerspectiveService } from \"../perspective/perspective.service\";\r\nimport { role, Role } from \"../core/role.const\";\r\nimport { ThemeService } from \"../core/theme.service\";\r\n\r\nimport { ChangePassword } from \"./change-password-dialog/change-password.model\";\r\nimport { Profile } from \"./profile.model\";\r\nimport { OAuth2TokenResponseSuccess } from \"./oauth2-token-response-success.model\";\r\nimport { OAuth2TokenResponseError } from \"./oauth2-token-response-error.model\";\r\nimport { UserCredentials } from \"../login/user-credentials.model\";\r\n\r\n@Injectable()\r\nexport class AuthService {\r\n redirectUrl: string;\r\n\r\n private _userProfile: Profile;\r\n\r\n constructor(\r\n private http: HttpClient,\r\n private jwtService: JwtHelperService,\r\n private perspectiveService: PerspectiveService,\r\n @Inject(role) private role: Role,\r\n private router: Router,\r\n private themeService: ThemeService) {\r\n\r\n this._userProfile = JSON.parse(localStorage.getItem(\"profile\"));\r\n };\r\n\r\n get userProfile(): Profile {\r\n return this._userProfile;\r\n }\r\n\r\n get userHasInternalStaffPermission(): boolean {\r\n return this._userProfile\r\n ? this._userProfile.role === this.role.internalStaff\r\n : false;\r\n }\r\n\r\n get userHasWebAdminPermission(): boolean {\r\n return this._userProfile\r\n ? (this._userProfile.role === this.role.internalStaff || this._userProfile.role === this.role.webAdmin)\r\n : false;\r\n }\r\n\r\n private handleTokenRequestError(errResponse: HttpErrorResponse) {\r\n let message: string;\r\n\r\n if (errResponse.error != null && errResponse.error.error === \"invalid_grant\") {\r\n const oauthError = errResponse.error as OAuth2TokenResponseError;\r\n message = oauthError.error_description;\r\n } else {\r\n message = `${errResponse.statusText} (${errResponse.status})`;\r\n }\r\n\r\n return throwError(message);\r\n }\r\n\r\n changePassword(dto: ChangePassword): Promise {\r\n const url = \"api/profile/change-password\";\r\n return this.http.post(url, dto)\r\n .toPromise()\r\n .catch(handleError);\r\n }\r\n\r\n loggedIn(): boolean {\r\n if (this.jwtService.tokenGetter()) {\r\n return (!this.jwtService.isTokenExpired() && this.userProfile != null);\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n login(creds: UserCredentials): Observable {\r\n const body = `grant_type=password&username=${creds.username}&password=${creds.password}`;\r\n\r\n return this.http\r\n .post(\"api/connect/token\", body, {\r\n headers: new HttpHeaders().set(\"Content-Type\", \"application/x-www-form-urlencoded\")\r\n })\r\n .pipe(\r\n catchError(this.handleTokenRequestError),\r\n flatMap(data => {\r\n localStorage.setItem(\"access_token\", data.access_token);\r\n\r\n return this.http.get(\"api/profile\")\r\n .toPromise()\r\n .then(profile => {\r\n localStorage.setItem(\"profile\", JSON.stringify(profile))\r\n this._userProfile = profile;\r\n\r\n // internal staff have their theme set via the perspective component\r\n if (!this.userHasInternalStaffPermission) {\r\n // themeService has its own \"handleError\" function\r\n this.themeService.getTheme()\r\n .catch(err => console.log(\"Error retrieving theme settings.\"));\r\n }\r\n\r\n return profile;\r\n })\r\n .catch(handleError);\r\n })\r\n );\r\n }\r\n\r\n logout(): void {\r\n localStorage.removeItem(\"access_token\");\r\n localStorage.removeItem(\"profile\");\r\n this._userProfile = null;\r\n\r\n this.themeService.removeActiveTheme();\r\n // only relevant for internal staff users\r\n this.perspectiveService.removeActiveIntroducer();\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/auth/auth.service.ts","export function handleError(err: any): Promise {\r\n let rejectWithMessage = \"Unexpected error occurred - please contact an administrator if the issue persists.\";\r\n\r\n if (err.error instanceof Error) {\r\n // A client-side or network error occurred. Handle it accordingly.\r\n rejectWithMessage = `Client error occurred - please contact an administrator if the issue persists.`;\r\n console.log(`Client error: ${err.error.message}`);\r\n } else if (err.error && err.error.displayMessage) {\r\n // if the response body is json and \"displayMessage\" exists, then assume it's\r\n // an instance of PortalServerErrorException\r\n rejectWithMessage = `Server error (${err.status}): ${err.error.displayMessage}`;\r\n console.log(`Server error (${err.status}): ${err.error.logMessage}`);\r\n } else {\r\n // The backend returned an unsuccessful response code.\r\n // The response body may contain clues as to what went wrong,\r\n if (err.status == 401) {\r\n rejectWithMessage = `Security token expired - please login again.`\r\n }\r\n else {\r\n rejectWithMessage = `Server error (${err.status}) - please contact an administrator if the issue persists.`\r\n console.log(`Server error (${err.status}): ${err.error}`);\r\n }\r\n }\r\n\r\n return Promise.reject(rejectWithMessage);\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/shared/handle-error.ts","import { Injectable } from \"@angular/core\";\r\nimport { Introducer } from \"./introducer.model\";\r\n\r\n@Injectable()\r\nexport class PerspectiveService {\r\n private _activeIntroducer: Introducer;\r\n\r\n constructor() {\r\n this._activeIntroducer = JSON.parse(localStorage.getItem(\"active_introducer\"));\r\n }\r\n\r\n get activeIntroducer(): Introducer {\r\n //if (!this.activeIntroducer) {\r\n // this.router.navigate([\"/perspective\"]);\r\n //}\r\n\r\n return this._activeIntroducer;\r\n }\r\n\r\n set activeIntroducer(value: Introducer) {\r\n // save to localStorage incase user refreshes the browser\r\n localStorage.setItem(\"active_introducer\", JSON.stringify(value))\r\n this._activeIntroducer = value;\r\n }\r\n\r\n getActiveIntroducerID(): string {\r\n return this._activeIntroducer\r\n ? this._activeIntroducer.entityID.toString()\r\n : null;\r\n }\r\n\r\n removeActiveIntroducer(): void {\r\n localStorage.removeItem(\"active_introducer\");\r\n this._activeIntroducer = null;\r\n }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./node_modules/angular2-template-loader!./src/app/perspective/perspective.service.ts"],"sourceRoot":""}