{"version":3,"file":"564.c73f427d9eb254e5.js","mappings":"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","names":["FileDropDirective","constructor","this","EventEmitter","onDragOver","evt","preventDefault","stopPropagation","fileOver","onDragLeave","ondrop","files","dataTransfer","length","fileDropped","emit","selectors","ctx","i0","ctx_r6","ctx_r8","ctx_r11","ctx_r13","AzureFileUploadControl","http","elementRef","blobStorage","sanitizer","fileService","Enumerable","name","canPreview","icon","color","_","mimeType","mimeTypes","firstOrDefault","x","existingFileType","writeValue","value","dimensions","requiredDimensions","sanitizedSrc","bypassSecurityTrustResourceUrl","src","downloadFile","selectedFile","objectUrl","URL","createObjectURL","a","document","createElement","href","download","existingFileName","downloadFileName","click","revokeObjectURL","get","responseType","subscribe","result","registerOnChange","fn","propagateChange","registerOnTouched","propagateTouch","clearImage","imagePreview","validate","invalidDimensionsError","invalidDimensions","isNotImageError","invalidFileType","isRequired","onChange","onTouch","onFileDropped","$event","previewImage","Upload","Promise","resolve","url","filename","getSASForVideoContainer","azureContainer","sasResult","uploadFile","progress","percentComplete","error","console","log","fileName","uri","type","uploadComplete","file","uploadToBlobStorage","container","containerName","storageAccessToken","sasToken","storageUri","pipe","map","mapProgress","acceptedFileTypes","any","reader","FileReader","readAsDataURL","parent","onload","_event","img","Image","width","height","immediateUpload","target","fileBrowseHandler","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","multi","NG_VALIDATORS","decls","ctx_r10","ctx_r12","AddUsersModalComponent","userData","settings","instructorData","orgData","activeModal","toastr","fb","Subject","filterChanged","debounceTime","distinctUntilChanged","model","checkExistingEmail","ngOnInit","user","UserViewModel","setupForm","val","formGroup","controls","email","valid","userExists","StringViewModel","lookupUserByEmail","found","existingUser","u","linkExistingUser","linkFunction","id","dismiss","onSave","markAllControlsDirty","submitComplete","resetButton","reject","formData","Object","assign","update","save","create","job","success","group","firstName","Validators","lastName","valueChanges","next","initialized","onCancel"],"sourceRoot":"webpack:///","sources":["./src/app/_directives/filedrop.directive.ts","./src/app/_controls/image-uploader.ts","./src/app/organization/admin/settings/users/add-users-modal.component.html","./src/app/organization/admin/settings/users/add-users-modal.component.ts"],"sourcesContent":["import {\r\n Directive,\r\n Output,\r\n Input,\r\n EventEmitter,\r\n HostBinding,\r\n HostListener\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[fileDrop]'\r\n})\r\nexport class FileDropDirective {\r\n @HostBinding('class.fileover') fileOver: boolean;\r\n @HostBinding('class') elementClass = 'file-drop';\r\n @Output() fileDropped = new EventEmitter();\r\n\r\n // Dragover listener\r\n @HostListener('dragover', ['$event']) onDragOver(evt) {\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n this.fileOver = true;\r\n }\r\n\r\n // Dragleave listener\r\n @HostListener('dragleave', ['$event']) public onDragLeave(evt) {\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n this.fileOver = false;\r\n }\r\n\r\n // Drop listener\r\n @HostListener('drop', ['$event']) public ondrop(evt) {\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n this.fileOver = false;\r\n let files = evt.dataTransfer.files;\r\n if (files.length > 0) {\r\n this.fileDropped.emit(files);\r\n }\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Component, Input, forwardRef, ElementRef, Output, EventEmitter } from '@angular/core';\r\nimport { ControlValueAccessor, FormControl, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\r\nimport Enumerable from 'linq';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { AzureBlobSASViewModel } from '../_models/generatedModels';\r\nimport { ISasToken } from '../_services/azureStorage';\r\nimport { BlobStorageService } from '../_services/blob-storage.service';\r\nimport { FileService } from '../_services/generatedServices';\r\n\r\ninterface IUploadProgress {\r\n filename: string;\r\n progress: number;\r\n}\r\n\r\n//https://www.talkingdotnet.com/show-image-preview-before-uploading-using-angular-7/\r\n//https://blog.angular-university.io/angular-file-upload/\r\n\r\n@Component({\r\n selector: 'azure-file-upload',\r\n template: `\r\n
\r\n
= 0\" class=\"upload-progress\">\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n

\r\n
{{ existingFileName }}
\r\n
\r\n
\r\n
\r\n
\r\n \r\n

\r\n

drop file here

\r\n

or

\r\n \r\n (Required dimensions: {{ requiredDimensions }})\r\n
\r\n
\r\n
\r\n `,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AzureFileUploadControl),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => AzureFileUploadControl),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class AzureFileUploadControl implements ControlValueAccessor {\r\n value: string;\r\n @Input() azureContainer = 'images';\r\n @Input() requiredDimensions: string;\r\n @Input() isRequired: boolean;\r\n @Input() src: string;\r\n @Input() existingFileType: string;\r\n @Input() existingFileName: string;\r\n @Input() downloadFileName: string; //only used when existingFileName is not set\r\n @Input() immediateUpload: boolean;\r\n @Input() acceptedFileTypes: string[] = ['image/png', 'image/jpeg', 'image/jpg', 'image/gif'];\r\n @Output() uploadComplete: EventEmitter = new EventEmitter();\r\n @Output() invalidFileType: EventEmitter = new EventEmitter();\r\n\r\n mimeTypes = Enumerable.from([\r\n { name: 'image/png', canPreview: true, icon: 'fas fa-file-image', color: '#183153' },\r\n { name: 'image/jpeg', canPreview: true, icon: 'fas fa-file-image', color: '#183153' },\r\n { name: 'image/gif', canPreview: true, icon: 'fas fa-file-image', color: '#183153' },\r\n { name: 'image/svg+xml', canPreview: false, icon: 'fas fa-file-image', color: '#183153' },\r\n { name: 'image/vnd.adobe.photoshop', canPreview: false, icon: 'fas fa-file-image', color: '#183153' },\r\n { name: 'image/webp', canPreview: true, icon: 'fas fa-file-image', color: '#183153' },\r\n { name: 'image/bmp', canPreview: true, icon: 'fas fa-file-image', color: '#183153' },\r\n { name: 'image/tiff', canPreview: true, icon: 'fas fa-file-image', color: '#183153' },\r\n { name: 'application/pdf', canPreview: false, icon: 'fas fa-file-pdf', color: 'darkred' },\r\n { name: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', canPreview: false, icon: 'fas fa-file-word', color: '#183153' },\r\n { name: 'application/msword', canPreview: false, icon: 'fas fa-file-word', color: '#183153' },\r\n { name: 'application/postscript', canPreview: false, icon: 'fas fa-file-image', color: '#183153' },\r\n { name: 'video/mp4', canPreview: false, icon: 'fas fa-file-video', color: '#183153' },\r\n { name: 'video/quicktime', canPreview: false, icon: 'fas fa-file-video', color: '#183153' },\r\n { name: 'video/x-ms-wmv', canPreview: false, icon: 'fas fa-file-video', color: '#183153' },\r\n { name: 'video/x-flv', canPreview: false, icon: 'fas fa-file-video', color: '#183153' },\r\n { name: 'video/x-ms-asf', canPreview: false, icon: 'fas fa-file-video', color: '#183153' },\r\n { name: 'video/x-msvideo', canPreview: false, icon: 'fas fa-file-video', color: '#183153' },\r\n { name: 'video/webm', canPreview: false, icon: 'fas fa-file-video', color: '#183153' },\r\n { name: 'video/mpeg', canPreview: false, icon: 'fas fa-file-video', color: '#183153' },\r\n { name: 'application/vnd.ms-excel', canPreview: false, icon: 'fas fa-file-excel', color: '#1d6f42' },\r\n { name: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', canPreview: false, icon: 'fas fa-file-excel', color: '#1d6f42' },\r\n ]);\r\n\r\n selectedFile: any;\r\n sanitizedSrc: SafeUrl;\r\n canPreview = false;\r\n isNotImageError = false;\r\n invalidDimensionsError = false;\r\n imagePreview: string | ArrayBuffer | SafeUrl;\r\n dimensions: string;\r\n percentComplete: number;\r\n\r\n constructor(private http: HttpClient, elementRef: ElementRef, private blobStorage: BlobStorageService, private sanitizer: DomSanitizer, private fileService: FileService) {}\r\n\r\n propagateChange = (_: any) => {};\r\n propagateTouch = () => {};\r\n\r\n get mimeType() {\r\n return this.mimeTypes.firstOrDefault((x) => x.name === this.existingFileType);\r\n }\r\n\r\n writeValue(value: string): void {\r\n this.dimensions = this.requiredDimensions;\r\n\r\n if (this.existingFileType == null || this.mimeTypes.firstOrDefault((x) => x.name == this.existingFileType)?.canPreview) {\r\n this.canPreview = true;\r\n this.sanitizedSrc = this.sanitizer.bypassSecurityTrustResourceUrl(this.src);\r\n } else {\r\n this.canPreview = false;\r\n }\r\n\r\n this.value = value;\r\n }\r\n\r\n downloadFile() {\r\n if (this.selectedFile) {\r\n const objectUrl = URL.createObjectURL(this.selectedFile);\r\n const a = document.createElement('a');\r\n a.href = objectUrl;\r\n a.download = this.existingFileName || this.downloadFileName;\r\n a.click();\r\n URL.revokeObjectURL(objectUrl);\r\n } else {\r\n this.http.get(this.src, { responseType: 'blob' }).subscribe((result) => {\r\n const a = document.createElement('a');\r\n const objectUrl = URL.createObjectURL(result);\r\n a.href = objectUrl;\r\n a.download = this.existingFileName || this.downloadFileName;\r\n a.click();\r\n URL.revokeObjectURL(objectUrl);\r\n });\r\n }\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.propagateChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.propagateTouch = fn;\r\n }\r\n\r\n clearImage() {\r\n this.value = null;\r\n this.imagePreview = null;\r\n this.existingFileName = null;\r\n this.selectedFile = null;\r\n this.existingFileType = null;\r\n this.dimensions = this.requiredDimensions;\r\n this.propagateChange(this.value);\r\n }\r\n\r\n validate({ value }: FormControl) {\r\n this.invalidDimensionsError = this.requiredDimensions && this.dimensions != this.requiredDimensions;\r\n\r\n if (this.invalidDimensionsError) {\r\n return { invalidDimensions: true };\r\n }\r\n\r\n if (this.isNotImageError) {\r\n return { invalidFileType: true };\r\n }\r\n\r\n if (this.isRequired && !this.selectedFile && !this.value) {\r\n return { isRequired: true };\r\n }\r\n }\r\n\r\n onChange() {\r\n this.propagateChange(this.value);\r\n this.propagateTouch();\r\n }\r\n\r\n onTouch() {\r\n this.propagateTouch();\r\n }\r\n\r\n onFileDropped($event) {\r\n this.previewImage($event[0]);\r\n }\r\n\r\n public Upload(): Promise {\r\n return new Promise((resolve) => {\r\n let result = {} as any;\r\n result.name = this.value;\r\n result.url = null;\r\n result.filename = this.existingFileName || null;\r\n result.mimeType = this.existingFileType || null;\r\n \r\n if (!this.selectedFile) {\r\n resolve(result);\r\n return;\r\n }\r\n\r\n this.fileService.getSASForVideoContainer(this.selectedFile.name, this.azureContainer).subscribe((sasResult) => {\r\n this.uploadFile(this.selectedFile, sasResult).subscribe(\r\n (progress) => {\r\n if (progress.progress === 0) {\r\n this.percentComplete = 1;\r\n } else {\r\n this.percentComplete = progress.progress;\r\n }\r\n },\r\n (error) => {\r\n resolve(result);\r\n console.log('upload error', error);\r\n },\r\n () => {\r\n console.log('Upload complete');\r\n this.value = sasResult.fileName;\r\n this.percentComplete = -1;\r\n\r\n result.name = sasResult.fileName;\r\n result.url = sasResult.uri;\r\n result.filename = this.selectedFile.name;\r\n result.mimeType = this.selectedFile.type;\r\n this.propagateChange(this.value);\r\n resolve(result);\r\n this.uploadComplete.emit(result);\r\n }\r\n );\r\n });\r\n });\r\n }\r\n\r\n uploadFile(file: File, sasResult: AzureBlobSASViewModel): Observable {\r\n const sasToken: ISasToken = {\r\n container: sasResult.containerName,\r\n filename: sasResult.fileName,\r\n storageAccessToken: sasResult.sasToken,\r\n storageUri: sasResult.storageUri,\r\n };\r\n\r\n return this.blobStorage.uploadToBlobStorage(sasToken, file).pipe(map((progress) => this.mapProgress(file, progress)));\r\n }\r\n\r\n private mapProgress(file: File, progress: number): IUploadProgress {\r\n return {\r\n filename: file.name,\r\n progress: progress,\r\n };\r\n }\r\n // public Upload(): Promise {\r\n // return new Promise((resolve) => {\r\n // if (this.selectedFile) {\r\n // const formData = new FormData();\r\n // formData.append('files', this.selectedFile);\r\n // this.http.post(this.uploadUrl, formData).subscribe((result: any) => {\r\n // this.value = result.name;\r\n // result.filename = this.selectedFile.name;\r\n // result.mimeType = this.selectedFile.type;\r\n // this.propagateChange(this.value);\r\n // resolve(this.value);\r\n // this.uploadComplete.emit(result);\r\n // });\r\n // } else {\r\n // resolve(this.value);\r\n // }\r\n // });\r\n // }\r\n\r\n previewImage(file: any) {\r\n var mimeType = file.type;\r\n\r\n if (this.acceptedFileTypes && this.acceptedFileTypes.length > 0 && !Enumerable.from(this.acceptedFileTypes).any((x) => x == mimeType)) {\r\n this.isNotImageError = true;\r\n this.onChange();\r\n console.log('Invalid file type');\r\n this.invalidFileType.emit(file);\r\n return;\r\n } else {\r\n this.isNotImageError = false;\r\n }\r\n\r\n this.selectedFile = file;\r\n var reader = new FileReader();\r\n reader.readAsDataURL(this.selectedFile);\r\n var parent = this;\r\n reader.onload = (_event) => {\r\n this.existingFileType = file.type;\r\n this.existingFileName = file.name;\r\n\r\n this.mimeTypes.firstOrDefault((x) => x.name == file.type)?.canPreview;\r\n\r\n if (this.mimeTypes.firstOrDefault((x) => x.name == file.type)?.canPreview) {\r\n this.canPreview = true;\r\n var img = new Image();\r\n img.onload = () => {\r\n parent.dimensions = `${img.width}x${img.height}`;\r\n console.log(parent.dimensions);\r\n console.log(img.width + 'x' + img.height);\r\n parent.onChange();\r\n\r\n this.invalidDimensionsError = parent.requiredDimensions && parent.dimensions != parent.requiredDimensions;\r\n if (this.invalidDimensionsError) {\r\n console.log('invalid dimensions');\r\n console.log(parent.requiredDimensions);\r\n console.log(parent.dimensions);\r\n img.src = '';\r\n parent.imagePreview = '';\r\n return null;\r\n }\r\n\r\n if (this.immediateUpload) {\r\n this.Upload();\r\n }\r\n };\r\n img.src = reader.result;\r\n this.imagePreview = this.sanitizer.bypassSecurityTrustResourceUrl(_event.target.result);\r\n } else {\r\n this.dimensions = this.requiredDimensions;\r\n this.canPreview = false;\r\n if (this.immediateUpload) {\r\n this.Upload();\r\n }\r\n }\r\n };\r\n }\r\n\r\n fileBrowseHandler($event) {\r\n var file = $event.target.files[0];\r\n this.previewImage(file);\r\n }\r\n}\r\n","\r\n
\r\n
\r\n
\r\n
Add {{title}}
\r\n
Edit {{title}}
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
Email is required
\r\n
\r\n
\r\n
\r\n

\r\n Hold the phone! It looks like a user with the email address {{ formGroup.controls.email.value }} already exists in {{settings.brand.brandName}}.\r\n

\r\n
\r\n
\r\n \r\n
\r\n
\r\n
{{existingUser.firstName}} {{existingUser.lastName}}, {{existingUser.credentials}}
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
Start by entering the user's email
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
First Name is required
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
Last Name is 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
\r\n
\r\n
\r\n
\r\n
\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\nimport { CreateInstructorViewModel, StringViewModel, UserLookupViewModel, UserViewModel } from 'src/app/_models/generatedModels';\r\nimport { InstructorService, OrganizationService, UserService } from 'src/app/_services/generatedServices';\r\nimport { SettingsProvider } from 'src/app/_services/settingsProvider.service';\r\nimport { ToasterService } from 'src/app/_services/toaster.service';\r\n\r\n@Component({\r\n selector: 'bxl-add-users-modal',\r\n templateUrl: 'add-users-modal.component.html',\r\n})\r\nexport class AddUsersModalComponent implements OnInit {\r\n initialized = false;\r\n userExists = false;\r\n textEditMode = false;\r\n existingUser: UserLookupViewModel;\r\n public formGroup: FormGroup;\r\n uploadUrl: string;\r\n avatar: string;\r\n submitComplete: Promise<{}> | undefined;\r\n @Input() userId: any;\r\n @Input() user: UserViewModel;\r\n @Input() title: string = 'Admin User';\r\n @Input() linkFunction: (userId: any) => void;\r\n\r\n filterChanged: Subject = new Subject();\r\n\r\n constructor(private userData: UserService, public settings: SettingsProvider, private instructorData: InstructorService, private orgData: OrganizationService, private activeModal: NgbActiveModal, private toastr: ToasterService, private fb: FormBuilder) {\r\n this.filterChanged.pipe(debounceTime(500), distinctUntilChanged()).subscribe((model) => {\r\n this.checkExistingEmail(model);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.user == null) {\r\n this.user = new UserViewModel();\r\n }\r\n this.setupForm();\r\n }\r\n\r\n checkExistingEmail(val: string) {\r\n let emailValid = this.formGroup.controls.email.valid;\r\n if (!emailValid) {\r\n this.userExists = false;\r\n return;\r\n }\r\n\r\n let model = new StringViewModel();\r\n model.value = val;\r\n this.orgData.lookupUserByEmail(model).subscribe((result) => {\r\n this.userExists = result.found;\r\n\r\n if (result.found) {\r\n this.existingUser = result;\r\n } else {\r\n this.existingUser = null;\r\n }\r\n\r\n console.log(this.userExists);\r\n });\r\n }\r\n\r\n linkExistingUser() {\r\n console.log('here');\r\n this.linkFunction(this.existingUser.id);\r\n this.activeModal.dismiss();\r\n }\r\n\r\n onSave() {\r\n if (!this.formGroup.valid) {\r\n this.formGroup.markAllControlsDirty();\r\n this.toastr.error('Please fill out all required fields', 'Error');\r\n return;\r\n }\r\n\r\n this.submitComplete = new Promise((resetButton: any, reject) => {\r\n const formData: CreateInstructorViewModel = Object.assign({}, this.user, this.formGroup.value);\r\n\r\n if (this.user.id != null) {\r\n this.update(formData, resetButton);\r\n } else {\r\n this.save(formData, resetButton);\r\n }\r\n });\r\n }\r\n\r\n save(formData: CreateInstructorViewModel, resetButton: () => any) {\r\n this.instructorData.create(formData).subscribe(\r\n (job) => {\r\n this.linkFunction(job.id);\r\n this.activeModal.dismiss();\r\n this.toastr.success('User Added', 'Success');\r\n resetButton();\r\n },\r\n (error) => resetButton()\r\n );\r\n }\r\n\r\n update(formData: CreateInstructorViewModel, resetButton: () => any) {\r\n this.instructorData.update(this.user.id, formData).subscribe(\r\n (job) => {\r\n this.activeModal.dismiss();\r\n this.toastr.success('User Updated', 'Success');\r\n resetButton();\r\n },\r\n (error) => resetButton()\r\n );\r\n }\r\n\r\n setupForm(): any {\r\n this.formGroup = this.fb.group({\r\n firstName: [this.user.firstName, [Validators.required]],\r\n lastName: [this.user.lastName, [Validators.required]],\r\n email: [this.user.email, Validators.compose([Validators.required, Validators.email])],\r\n });\r\n\r\n this.formGroup.controls.email.valueChanges.subscribe((val) => {\r\n console.log(val);\r\n this.filterChanged.next(val);\r\n });\r\n\r\n this.initialized = true;\r\n }\r\n\r\n onCancel() {\r\n this.activeModal.dismiss();\r\n }\r\n}\r\n"]}