파일업로드 유효성 체크 적용
This commit is contained in:
		
							parent
							
								
									ebc5744442
								
							
						
					
					
						commit
						f6ac17924f
					
				| @ -584,12 +584,16 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { | |||||||
|           info.sentMessageJson || info.sentMessage |           info.sentMessageJson || info.sentMessage | ||||||
|         ); |         ); | ||||||
| 
 | 
 | ||||||
|         this.snackBarPreviewEvent = this.snackBarService.open(message, this.translateService.instant('common.messages.confirm'), { |         this.snackBarPreviewEvent = this.snackBarService.open( | ||||||
|  |           message, | ||||||
|  |           this.translateService.instant('common.messages.confirm'), | ||||||
|  |           { | ||||||
|             // duration: 3000,
 |             // duration: 3000,
 | ||||||
|             verticalPosition: 'bottom', |             verticalPosition: 'bottom', | ||||||
|             horizontalPosition: 'center', |             horizontalPosition: 'center', | ||||||
|             panelClass: ['chat-snackbar-class'] |             panelClass: ['chat-snackbar-class'] | ||||||
|         }); |           } | ||||||
|  |         ); | ||||||
|         this.snackBarPreviewEvent.onAction().subscribe(() => { |         this.snackBarPreviewEvent.onAction().subscribe(() => { | ||||||
|           this.setEventMoreInit(); |           this.setEventMoreInit(); | ||||||
|           this.scrollToBottom(); |           this.scrollToBottom(); | ||||||
| @ -1052,6 +1056,68 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { | |||||||
| 
 | 
 | ||||||
|     const allObservables: Observable<FileTalkSaveResponse>[] = []; |     const allObservables: Observable<FileTalkSaveResponse>[] = []; | ||||||
| 
 | 
 | ||||||
|  |     const fileAllowSize = | ||||||
|  |       !!this.sessionVerInfo && this.sessionVerInfo.fileAllowSize | ||||||
|  |         ? this.sessionVerInfo.fileAllowSize | ||||||
|  |         : environment.productConfig.CommonSetting.defaultFileAllowSize; | ||||||
|  | 
 | ||||||
|  |     if (fileAllowSize > 0) { | ||||||
|  |       if ( | ||||||
|  |         fileUploadItems.filter( | ||||||
|  |           fui => fui.file.size > fileAllowSize * 1024 * 1024 | ||||||
|  |         ).length | ||||||
|  |       ) { | ||||||
|  |         this.dialogService.open< | ||||||
|  |           AlertDialogComponent, | ||||||
|  |           AlertDialogData, | ||||||
|  |           AlertDialogResult | ||||||
|  |         >(AlertDialogComponent, { | ||||||
|  |           width: '360px', | ||||||
|  |           data: { | ||||||
|  |             title: '', | ||||||
|  |             message: this.translateService.instant( | ||||||
|  |               'common.file.errors.oversize', | ||||||
|  |               { | ||||||
|  |                 maxSize: fileAllowSize | ||||||
|  |               } | ||||||
|  |             ) | ||||||
|  |           } | ||||||
|  |         }); | ||||||
|  |         if (!!this.fileUploadQueue) { | ||||||
|  |           this.fileUploadQueue.onUploadComplete(); | ||||||
|  |         } | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     const checkExt = this.commonApiService.acceptableExtensionForFileTalk( | ||||||
|  |       fileUploadItems.map(fui => FileUtil.getExtension(fui.file.name)) | ||||||
|  |     ); | ||||||
|  |     if (!checkExt.accept) { | ||||||
|  |       if (!!this.fileUploadQueue) { | ||||||
|  |         this.fileUploadQueue.onUploadComplete(); | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       this.dialogService.open< | ||||||
|  |         AlertDialogComponent, | ||||||
|  |         AlertDialogData, | ||||||
|  |         AlertDialogResult | ||||||
|  |       >(AlertDialogComponent, { | ||||||
|  |         data: { | ||||||
|  |           title: 'Alert', | ||||||
|  |           html: `${this.translateService.instant( | ||||||
|  |             'common.file.errors.notSupporedType' | ||||||
|  |           )} ${ | ||||||
|  |             checkExt.reject.length > 0 | ||||||
|  |               ? '<br/>(' + checkExt.reject.join(',') + ')' | ||||||
|  |               : '' | ||||||
|  |           }` | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  | 
 | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     for (const fileUploadItem of fileUploadItems) { |     for (const fileUploadItem of fileUploadItems) { | ||||||
|       let thumbnail: File; |       let thumbnail: File; | ||||||
|       if ( |       if ( | ||||||
| @ -1127,6 +1193,10 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { | |||||||
|             this.translateService.instant('common.file.errors.failToUpload'), |             this.translateService.instant('common.file.errors.failToUpload'), | ||||||
|             this.translateService.instant('common.file.errors.label') |             this.translateService.instant('common.file.errors.label') | ||||||
|           ); |           ); | ||||||
|  | 
 | ||||||
|  |           if (!!this.fileUploadQueue) { | ||||||
|  |             this.fileUploadQueue.onUploadComplete(); | ||||||
|  |           } | ||||||
|         }, |         }, | ||||||
|         () => { |         () => { | ||||||
|           this.fileUploadQueue.onUploadComplete(); |           this.fileUploadQueue.onUploadComplete(); | ||||||
|  | |||||||
| @ -11,6 +11,7 @@ | |||||||
|       [detail]="data.detail" |       [detail]="data.detail" | ||||||
|       [detailContents]="data.detailContents" |       [detailContents]="data.detailContents" | ||||||
|       [curReceiverList]="data.receiverList" |       [curReceiverList]="data.receiverList" | ||||||
|  |       [fileAllowSize]="fileAllowSize" | ||||||
|       (send)="onSend($event)" |       (send)="onSend($event)" | ||||||
|       (selectReceiver)="onSelectReceiver($event)" |       (selectReceiver)="onSelectReceiver($event)" | ||||||
|       (cancel)="onCancel()" |       (cancel)="onCancel()" | ||||||
|  | |||||||
| @ -7,13 +7,11 @@ import { | |||||||
|   DetailResponse, |   DetailResponse, | ||||||
|   DetailContent, |   DetailContent, | ||||||
|   MessageApiService, |   MessageApiService, | ||||||
|   DetailReceiver, |  | ||||||
|   MessageType |   MessageType | ||||||
| } from '@ucap-webmessenger/api-message'; | } from '@ucap-webmessenger/api-message'; | ||||||
| 
 | 
 | ||||||
| import { LoginResponse } from '@ucap-webmessenger/protocol-authentication'; | import { LoginResponse } from '@ucap-webmessenger/protocol-authentication'; | ||||||
| import { NGXLogger } from 'ngx-logger'; | import { NGXLogger } from 'ngx-logger'; | ||||||
| import { MessageStatusCode } from '@ucap-webmessenger/api'; |  | ||||||
| import { | import { | ||||||
|   WriteComponent as UCapMessageWriteComponent, |   WriteComponent as UCapMessageWriteComponent, | ||||||
|   Message, |   Message, | ||||||
| @ -25,10 +23,17 @@ import { | |||||||
|   CreateChatDialogData, |   CreateChatDialogData, | ||||||
|   CreateChatDialogResult |   CreateChatDialogResult | ||||||
| } from '../chat/create-chat.dialog.component'; | } from '../chat/create-chat.dialog.component'; | ||||||
| import { UserSelectDialogType, EnvironmentsInfo } from '@app/types'; | import { | ||||||
|  |   UserSelectDialogType, | ||||||
|  |   EnvironmentsInfo, | ||||||
|  |   KEY_VER_INFO | ||||||
|  | } from '@app/types'; | ||||||
| import { take } from 'rxjs/operators'; | import { take } from 'rxjs/operators'; | ||||||
| import { UserInfoSS } from '@ucap-webmessenger/protocol-query'; | import { UserInfoSS } from '@ucap-webmessenger/protocol-query'; | ||||||
| import { TranslateService } from '@ngx-translate/core'; | import { TranslateService } from '@ngx-translate/core'; | ||||||
|  | import { VersionInfo2Response } from '@ucap-webmessenger/api-public'; | ||||||
|  | import { SessionStorageService } from '@ucap-webmessenger/web-storage'; | ||||||
|  | import { environment } from '../../../../../environments/environment'; | ||||||
| 
 | 
 | ||||||
| export interface MessageWriteDialogData { | export interface MessageWriteDialogData { | ||||||
|   loginRes: LoginResponse; |   loginRes: LoginResponse; | ||||||
| @ -57,6 +62,10 @@ export class MessageWriteDialogComponent implements OnInit { | |||||||
|   @ViewChild('messageWrite', { static: true }) |   @ViewChild('messageWrite', { static: true }) | ||||||
|   messageWrite: UCapMessageWriteComponent; |   messageWrite: UCapMessageWriteComponent; | ||||||
| 
 | 
 | ||||||
|  |   sessionVerInfo: VersionInfo2Response; | ||||||
|  | 
 | ||||||
|  |   fileAllowSize: number; | ||||||
|  | 
 | ||||||
|   isModify = false; |   isModify = false; | ||||||
| 
 | 
 | ||||||
|   constructor( |   constructor( | ||||||
| @ -68,11 +77,21 @@ export class MessageWriteDialogComponent implements OnInit { | |||||||
|     private messageApiService: MessageApiService, |     private messageApiService: MessageApiService, | ||||||
|     private snackBarService: SnackBarService, |     private snackBarService: SnackBarService, | ||||||
|     private translateService: TranslateService, |     private translateService: TranslateService, | ||||||
|  |     private sessionStorageService: SessionStorageService, | ||||||
|     private logger: NGXLogger, |     private logger: NGXLogger, | ||||||
|     private dialogService: DialogService |     private dialogService: DialogService | ||||||
|   ) {} |   ) {} | ||||||
| 
 | 
 | ||||||
|   ngOnInit(): void { |   ngOnInit(): void { | ||||||
|  |     this.sessionVerInfo = this.sessionStorageService.get<VersionInfo2Response>( | ||||||
|  |       KEY_VER_INFO | ||||||
|  |     ); | ||||||
|  | 
 | ||||||
|  |     this.fileAllowSize = | ||||||
|  |       !!this.sessionVerInfo && this.sessionVerInfo.fileAllowSize | ||||||
|  |         ? this.sessionVerInfo.fileAllowSize | ||||||
|  |         : environment.productConfig.CommonSetting.defaultFileAllowSize; | ||||||
|  | 
 | ||||||
|     if (!!this.data.detail && !!this.data.detail.msgInfo) { |     if (!!this.data.detail && !!this.data.detail.msgInfo) { | ||||||
|       this.isModify = true; |       this.isModify = true; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -349,12 +349,13 @@ | |||||||
|       "errors": { |       "errors": { | ||||||
|         "label": "File errors", |         "label": "File errors", | ||||||
|         "failToUpload": "File upload failed.", |         "failToUpload": "File upload failed.", | ||||||
|         "failToSave": "File save failed.", |         "failToSave": "File save failed. Please 'Save As'.", | ||||||
|         "failToSaveSomeOfAll": "Some of file(s) save failed", |         "failToSaveSomeOfAll": "Some of file(s) save failed. Please 'Save As'.", | ||||||
|         "failToSpecifyPath": "Specifing of save path failed.", |         "failToSpecifyPath": "Specifing of save path failed.", | ||||||
|         "expired": "This file has expired", |         "expired": "This file has expired", | ||||||
|         "noPreview": "This file does not support preview.", |         "noPreview": "This file does not support preview.", | ||||||
|         "notSupporedType": "File format is not supported." |         "notSupporedType": "File format is not supported.", | ||||||
|  |         "oversize": "You cannot upload files larger than {{size}} megabytes." | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "clipboard": { |     "clipboard": { | ||||||
|  | |||||||
| @ -349,12 +349,13 @@ | |||||||
|       "errors": { |       "errors": { | ||||||
|         "label": "파일 에러", |         "label": "파일 에러", | ||||||
|         "failToUpload": "파일 업로드에 실패하였습니다.", |         "failToUpload": "파일 업로드에 실패하였습니다.", | ||||||
|         "failToSave": "파일 저장에 실패하였습니다.", |         "failToSave": "파일 저장에 실패하였습니다. '다른 이름으로 저장' 하십시요.", | ||||||
|         "failToSaveSomeOfAll": "파일 저장 중 일부 파일이 실패하였습니다.", |         "failToSaveSomeOfAll": "파일 저장 중 일부 파일이 실패하였습니다. '다른 이름으로 저장' 하십시요.", | ||||||
|         "failToSpecifyPath": "저장경로 지정에 실패하였습니다.", |         "failToSpecifyPath": "저장경로 지정에 실패하였습니다.", | ||||||
|         "expired": "기간이 만료된 파일입니다", |         "expired": "기간이 만료된 파일입니다", | ||||||
|         "noPreview": "미리보기를 지원하지 않는 파일입니다.", |         "noPreview": "미리보기를 지원하지 않는 파일입니다.", | ||||||
|         "notSupporedType": "지원하지 않는 파일형식입니다." |         "notSupporedType": "지원하지 않는 파일형식입니다.", | ||||||
|  |         "oversize": "{{maxSize}}MB 이상 파일을 업로드 할 수 없습니다." | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "clipboard": { |     "clipboard": { | ||||||
|  | |||||||
| @ -64,6 +64,8 @@ export const environment: Environment = { | |||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     CommonSetting: { |     CommonSetting: { | ||||||
|  |       defaultFileAllowSize: 100, | ||||||
|  | 
 | ||||||
|       editableProfileImage: false, |       editableProfileImage: false, | ||||||
| 
 | 
 | ||||||
|       useMyDeptGroup: true, |       useMyDeptGroup: true, | ||||||
|  | |||||||
| @ -64,6 +64,8 @@ export const environment: Environment = { | |||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     CommonSetting: { |     CommonSetting: { | ||||||
|  |       defaultFileAllowSize: 100, | ||||||
|  | 
 | ||||||
|       editableProfileImage: false, |       editableProfileImage: false, | ||||||
| 
 | 
 | ||||||
|       useMyDeptGroup: true, |       useMyDeptGroup: true, | ||||||
|  | |||||||
| @ -64,6 +64,8 @@ export const environment: Environment = { | |||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     CommonSetting: { |     CommonSetting: { | ||||||
|  |       defaultFileAllowSize: 100, | ||||||
|  | 
 | ||||||
|       editableProfileImage: true, |       editableProfileImage: true, | ||||||
| 
 | 
 | ||||||
|       useMyDeptGroup: false, |       useMyDeptGroup: false, | ||||||
|  | |||||||
| @ -64,6 +64,8 @@ export const environment: Environment = { | |||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     CommonSetting: { |     CommonSetting: { | ||||||
|  |       defaultFileAllowSize: 100, | ||||||
|  | 
 | ||||||
|       editableProfileImage: true, |       editableProfileImage: true, | ||||||
| 
 | 
 | ||||||
|       useMyDeptGroup: false, |       useMyDeptGroup: false, | ||||||
|  | |||||||
| @ -64,6 +64,9 @@ export interface Environment { | |||||||
|     defaultSettings: Settings; |     defaultSettings: Settings; | ||||||
| 
 | 
 | ||||||
|     CommonSetting: { |     CommonSetting: { | ||||||
|  |       /** 파일업로드 제한 사이즈 (mb) */ | ||||||
|  |       defaultFileAllowSize: number; | ||||||
|  | 
 | ||||||
|       /** 내 프로필 이미지 수정 가능 여부 */ |       /** 내 프로필 이미지 수정 가능 여부 */ | ||||||
|       editableProfileImage: boolean; |       editableProfileImage: boolean; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -11,7 +11,13 @@ import { | |||||||
|   Input |   Input | ||||||
| } from '@angular/core'; | } from '@angular/core'; | ||||||
| 
 | 
 | ||||||
| import { ucapAnimations, DialogService } from '@ucap-webmessenger/ui'; | import { | ||||||
|  |   ucapAnimations, | ||||||
|  |   DialogService, | ||||||
|  |   AlertDialogResult, | ||||||
|  |   AlertDialogComponent, | ||||||
|  |   AlertDialogData | ||||||
|  | } from '@ucap-webmessenger/ui'; | ||||||
| 
 | 
 | ||||||
| import { NGXLogger } from 'ngx-logger'; | import { NGXLogger } from 'ngx-logger'; | ||||||
| 
 | 
 | ||||||
| @ -36,7 +42,8 @@ import { | |||||||
| } from '../dialogs/schedule-send.dialog.component'; | } from '../dialogs/schedule-send.dialog.component'; | ||||||
| import { RoleCode } from '@ucap-webmessenger/protocol-authentication'; | import { RoleCode } from '@ucap-webmessenger/protocol-authentication'; | ||||||
| import { EmployeeType } from '@ucap-webmessenger/protocol-room'; | import { EmployeeType } from '@ucap-webmessenger/protocol-room'; | ||||||
| import { contentTracing } from 'electron'; | import { TranslateService } from '@ngx-translate/core'; | ||||||
|  | import { CommonApiService } from '@ucap-webmessenger/api-common'; | ||||||
| 
 | 
 | ||||||
| const ATTR_FILE = 'UCAP_ATTR_FILE'; | const ATTR_FILE = 'UCAP_ATTR_FILE'; | ||||||
| 
 | 
 | ||||||
| @ -79,19 +86,18 @@ export class WriteComponent implements OnInit, OnDestroy, AfterViewInit { | |||||||
|   detailContents?: string; |   detailContents?: string; | ||||||
|   @Input() |   @Input() | ||||||
|   isModify = false; |   isModify = false; | ||||||
|  |   @Input() | ||||||
|  |   fileAllowSize: number; | ||||||
| 
 | 
 | ||||||
|   @Output() |   @Output() | ||||||
|   send = new EventEmitter<Message | MessageModify>(); |   send = new EventEmitter<Message | MessageModify>(); | ||||||
| 
 |  | ||||||
|   @Output() |   @Output() | ||||||
|   cancel = new EventEmitter<void>(); |   cancel = new EventEmitter<void>(); | ||||||
| 
 |  | ||||||
|   @Output() |   @Output() | ||||||
|   selectReceiver = new EventEmitter<UserInfo[]>(); |   selectReceiver = new EventEmitter<UserInfo[]>(); | ||||||
| 
 | 
 | ||||||
|   @ViewChild('editor', { static: true }) |   @ViewChild('editor', { static: true }) | ||||||
|   editor: ElementRef<HTMLDivElement>; |   editor: ElementRef<HTMLDivElement>; | ||||||
| 
 |  | ||||||
|   @ViewChild('fileInput', { static: true }) |   @ViewChild('fileInput', { static: true }) | ||||||
|   fileInput: ElementRef<HTMLInputElement>; |   fileInput: ElementRef<HTMLInputElement>; | ||||||
| 
 | 
 | ||||||
| @ -106,6 +112,8 @@ export class WriteComponent implements OnInit, OnDestroy, AfterViewInit { | |||||||
|     private formBuilder: FormBuilder, |     private formBuilder: FormBuilder, | ||||||
|     private dialogService: DialogService, |     private dialogService: DialogService, | ||||||
|     private changeDetectorRef: ChangeDetectorRef, |     private changeDetectorRef: ChangeDetectorRef, | ||||||
|  |     private translateService: TranslateService, | ||||||
|  |     private commonApiService: CommonApiService, | ||||||
|     private logger: NGXLogger |     private logger: NGXLogger | ||||||
|   ) {} |   ) {} | ||||||
| 
 | 
 | ||||||
| @ -157,6 +165,10 @@ export class WriteComponent implements OnInit, OnDestroy, AfterViewInit { | |||||||
|     this.fileInput.nativeElement.onchange = async () => { |     this.fileInput.nativeElement.onchange = async () => { | ||||||
|       const fileList: FileList = self.fileInput.nativeElement.files; |       const fileList: FileList = self.fileInput.nativeElement.files; | ||||||
| 
 | 
 | ||||||
|  |       if (!this.validUploadFile(fileList)) { | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|       for (let i = 0; i < fileList.length; i++) { |       for (let i = 0; i < fileList.length; i++) { | ||||||
|         const file = fileList.item(i); |         const file = fileList.item(i); | ||||||
| 
 | 
 | ||||||
| @ -179,6 +191,10 @@ export class WriteComponent implements OnInit, OnDestroy, AfterViewInit { | |||||||
|     this.fileInput.nativeElement.onchange = () => { |     this.fileInput.nativeElement.onchange = () => { | ||||||
|       const fileList: FileList = this.fileInput.nativeElement.files; |       const fileList: FileList = this.fileInput.nativeElement.files; | ||||||
| 
 | 
 | ||||||
|  |       if (!this.validUploadFile(fileList)) { | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|       if (!self.attachmentList) { |       if (!self.attachmentList) { | ||||||
|         self.attachmentList = []; |         self.attachmentList = []; | ||||||
|       } |       } | ||||||
| @ -194,6 +210,65 @@ export class WriteComponent implements OnInit, OnDestroy, AfterViewInit { | |||||||
|     }; |     }; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   validUploadFile(fileList: FileList): boolean { | ||||||
|  |     let valid = true; | ||||||
|  |     if (this.fileAllowSize > 0) { | ||||||
|  |       for (let i = 0; i < fileList.length; i++) { | ||||||
|  |         const file = fileList.item(i); | ||||||
|  |         if (file.size > this.fileAllowSize * 1024 * 1024) { | ||||||
|  |           valid = false; | ||||||
|  |           break; | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |       if (!valid) { | ||||||
|  |         this.dialogService.open< | ||||||
|  |           AlertDialogComponent, | ||||||
|  |           AlertDialogData, | ||||||
|  |           AlertDialogResult | ||||||
|  |         >(AlertDialogComponent, { | ||||||
|  |           width: '360px', | ||||||
|  |           data: { | ||||||
|  |             title: '', | ||||||
|  |             message: this.translateService.instant( | ||||||
|  |               'common.file.errors.oversize', | ||||||
|  |               { | ||||||
|  |                 maxSize: this.fileAllowSize | ||||||
|  |               } | ||||||
|  |             ) | ||||||
|  |           } | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         return valid; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     const checkExt = this.commonApiService.acceptableExtensionForFileTalk( | ||||||
|  |       FileUtil.getExtensions(fileList) | ||||||
|  |     ); | ||||||
|  |     if (!checkExt.accept) { | ||||||
|  |       this.dialogService.open< | ||||||
|  |         AlertDialogComponent, | ||||||
|  |         AlertDialogData, | ||||||
|  |         AlertDialogResult | ||||||
|  |       >(AlertDialogComponent, { | ||||||
|  |         data: { | ||||||
|  |           title: 'Alert', | ||||||
|  |           html: `${this.translateService.instant( | ||||||
|  |             'common.file.errors.notSupporedType' | ||||||
|  |           )} ${ | ||||||
|  |             checkExt.reject.length > 0 | ||||||
|  |               ? '<br/>(' + checkExt.reject.join(',') + ')' | ||||||
|  |               : '' | ||||||
|  |           }` | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  | 
 | ||||||
|  |       return valid; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return valid; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   onPasteEditor(event: ClipboardEvent) { |   onPasteEditor(event: ClipboardEvent) { | ||||||
|     const text = document.createTextNode( |     const text = document.createTextNode( | ||||||
|       event.clipboardData.getData('text/plain') |       event.clipboardData.getData('text/plain') | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user