UNPKG

@nepwork/dashboards

Version:

Dashboards for emergencies and monitoring

257 lines (256 loc) 8.24 kB
/** * @license * Copyright Akveo. All Rights Reserved. * Licensed under the MIT License. See License.txt in the project root for license information. */ import { __decorate, __metadata } from "tslib"; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostBinding, HostListener, Input, Output, } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; /** * Chat form component. * * Show a message form with a send message button. * * ```ts * <nb-chat-form showButton="true" buttonIcon="nb-send"> * </nb-chat-form> * ``` * * When `[dropFiles]="true"` handles files drag&drop with a file preview. * * Drag & drop available for files and images: * @stacked-example(Drag & Drop Chat, chat/chat-drop.component) * * New message could be tracked outside by using `(send)` output. * * ```ts * <nb-chat-form (send)="onNewMessage($event)"> * </nb-chat-form> * * // ... * * onNewMessage({ message: string, files: any[] }) { * this.service.sendToServer(message, files); * } * ``` */ let NbChatFormComponent = class NbChatFormComponent { constructor(cd, domSanitizer) { this.cd = cd; this.domSanitizer = domSanitizer; this.status = 'basic'; this.inputFocus = false; this.inputHover = false; this.droppedFiles = []; this.imgDropTypes = ['image/png', 'image/jpeg', 'image/gif']; /** * Predefined message text * @type {string} */ this.message = ''; /** * Message placeholder text * @type {string} */ this.messagePlaceholder = 'Type a message'; /** * Send button title * @type {string} */ this.buttonTitle = ''; /** * Send button icon, shown if `buttonTitle` is empty * @type {string} */ this.buttonIcon = 'paper-plane-outline'; /** * Show send button * @type {boolean} */ this.showButton = true; /** * Show send button * @type {boolean} */ this.dropFiles = false; /** * File drop placeholder text * @type {string} */ this.dropFilePlaceholder = 'Drop file to send'; /** * * @type {EventEmitter<{ message: string, files: File[] }>} */ this.send = new EventEmitter(); this.fileOver = false; } onDrop(event) { if (this.dropFiles) { event.preventDefault(); event.stopPropagation(); this.fileOver = false; if (event.dataTransfer && event.dataTransfer.files) { for (const file of event.dataTransfer.files) { const res = file; if (this.imgDropTypes.includes(file.type)) { const fr = new FileReader(); fr.onload = (e) => { res.src = e.target.result; res.urlStyle = this.domSanitizer.bypassSecurityTrustStyle(`url(${res.src})`); this.cd.detectChanges(); }; fr.readAsDataURL(file); } this.droppedFiles.push(res); } } } } removeFile(file) { const index = this.droppedFiles.indexOf(file); if (index >= 0) { this.droppedFiles.splice(index, 1); } } onDragOver() { if (this.dropFiles) { this.fileOver = true; } } onDragLeave() { if (this.dropFiles) { this.fileOver = false; } } sendMessage() { if (this.droppedFiles.length || String(this.message).trim().length) { this.send.emit({ message: this.message, files: this.droppedFiles }); this.message = ''; this.droppedFiles = []; } } setStatus(status) { if (this.status !== status) { this.status = status; this.cd.detectChanges(); } } getInputStatus() { if (this.fileOver) { return this.getHighlightStatus(); } if (this.inputFocus || this.inputHover) { return this.status; } return 'basic'; } getButtonStatus() { return this.getHighlightStatus(); } getHighlightStatus() { if (this.status === 'basic' || this.status === 'control') { return 'primary'; } return this.status; } }; __decorate([ Input(), __metadata("design:type", String) ], NbChatFormComponent.prototype, "message", void 0); __decorate([ Input(), __metadata("design:type", String) ], NbChatFormComponent.prototype, "messagePlaceholder", void 0); __decorate([ Input(), __metadata("design:type", String) ], NbChatFormComponent.prototype, "buttonTitle", void 0); __decorate([ Input(), __metadata("design:type", String) ], NbChatFormComponent.prototype, "buttonIcon", void 0); __decorate([ Input(), __metadata("design:type", Boolean) ], NbChatFormComponent.prototype, "showButton", void 0); __decorate([ Input(), __metadata("design:type", Boolean) ], NbChatFormComponent.prototype, "dropFiles", void 0); __decorate([ Input(), __metadata("design:type", String) ], NbChatFormComponent.prototype, "dropFilePlaceholder", void 0); __decorate([ Output(), __metadata("design:type", Object) ], NbChatFormComponent.prototype, "send", void 0); __decorate([ HostBinding('class.file-over'), __metadata("design:type", Object) ], NbChatFormComponent.prototype, "fileOver", void 0); __decorate([ HostListener('drop', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], NbChatFormComponent.prototype, "onDrop", null); __decorate([ HostListener('dragover'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], NbChatFormComponent.prototype, "onDragOver", null); __decorate([ HostListener('dragleave'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], NbChatFormComponent.prototype, "onDragLeave", null); NbChatFormComponent = __decorate([ Component({ selector: 'nb-chat-form', template: ` <div class="dropped-files" *ngIf="droppedFiles?.length"> <ng-container *ngFor="let file of droppedFiles"> <div *ngIf="file.urlStyle" [style.background-image]="file.urlStyle"> <span class="remove" (click)="removeFile(file)">&times;</span> </div> <div> <nb-icon *ngIf="!file.urlStyle" icon="file-text-outline" pack="nebular-essentials"></nb-icon> <span class="remove" (click)="removeFile(file)">&times;</span> </div> </ng-container> </div> <div class="message-row"> <input nbInput fullWidth [status]="getInputStatus()" (focus)="inputFocus = true" (blur)="inputFocus = false" (mouseenter)="inputHover = true" (mouseleave)="inputHover = false" [(ngModel)]="message" [class.with-button]="showButton" type="text" placeholder="{{ fileOver ? dropFilePlaceholder : messagePlaceholder }}" (keyup.enter)="sendMessage()"> <button nbButton [status]="getButtonStatus()" *ngIf="showButton" [class.with-icon]="!buttonTitle" (click)="sendMessage()" class="send-button"> <nb-icon *ngIf="!buttonTitle; else title" [icon]="buttonIcon" pack="nebular-essentials"></nb-icon> <ng-template #title>{{ buttonTitle }}</ng-template> </button> </div> `, changeDetection: ChangeDetectionStrategy.OnPush }), __metadata("design:paramtypes", [ChangeDetectorRef, DomSanitizer]) ], NbChatFormComponent); export { NbChatFormComponent }; //# sourceMappingURL=chat-form.component.js.map