From f5a698a187922e4842fa3bc3c0871807eb91bfce Mon Sep 17 00:00:00 2001 From: SHAOJIAHAO <55341701@qq.com> Date: Tue, 6 Sep 2022 17:27:54 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=96=B0=E5=A2=9E]=E8=81=8A=E5=A4=A9=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 15 +++ package.json | 1 + src/app/app.module.ts | 3 +- .../chat-window/chat-window.component.html | 25 ++++- .../chat-window/chat-window.component.scss | 95 +++++++++++++++++- .../chat-window/chat-window.component.ts | 79 ++++++++++++++- src/app/home/home.module.ts | 6 +- .../station-task-apply.component.html | 8 +- .../station-task-apply.component.scss | 7 +- .../station-task-apply.component.ts | 19 ++-- .../zhi-indicators.component.ts | 1 - src/assets/images/icon/chat.png | Bin 0 -> 1317 bytes 12 files changed, 236 insertions(+), 23 deletions(-) create mode 100644 src/assets/images/icon/chat.png diff --git a/package-lock.json b/package-lock.json index c7600f3..fd53c1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2223,6 +2223,21 @@ "fast-deep-equal": "^3.1.3" } }, + "angular2-draggable": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/angular2-draggable/-/angular2-draggable-2.3.2.tgz", + "integrity": "sha512-rw2O/icgVang8uSVIU7nmm59f1DceSAUQkOuSGYnKbv/h8EbhJ9099sCjh/I5LymZBza1XPKeFZofIvhekdE+A==", + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.nlark.com/ansi-colors/download/ansi-colors-4.1.1.tgz", diff --git a/package.json b/package.json index 09ebcac..8e91bea 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@angular/router": "~13.1.0", "@microsoft/signalr": "^6.0.8", "@types/file-saver": "^2.0.5", + "angular2-draggable": "^2.3.2", "echarts": "^5.3.3", "file-saver": "^2.0.5", "js-base64": "^3.7.2", diff --git a/src/app/app.module.ts b/src/app/app.module.ts index e6c2010..64c360d 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -30,7 +30,8 @@ registerLocaleData(zh); HttpClientModule, NzNotificationModule, NzMessageModule, - NzModalModule + NzModalModule, + ], // providers: [httpInterceptorProviders, CacheTokenService, TreeService, // { provide: RouteReuseStrategy, useClass: CustomReuseStrategy }], diff --git a/src/app/home/commonComponents/chat-window/chat-window.component.html b/src/app/home/commonComponents/chat-window/chat-window.component.html index 5877ca1..cff2243 100644 --- a/src/app/home/commonComponents/chat-window/chat-window.component.html +++ b/src/app/home/commonComponents/chat-window/chat-window.component.html @@ -1,3 +1,24 @@ -<div class="chatbox"> - +<div class="chatbox" ngDraggable [preventDefaultEvent]="true" [handle]="dragheader"> + <div class="titlebox"> + <span class="titlename" #dragheader> + 历下区A消防救援站群聊(3) + </span> + <span class="close" nz-icon nzType="close" nzTheme="outline" (click)="close()"></span> + </div> + <div class="chatcontent" id="chatcontent"> + <div class="chatitem" *ngFor="let item of data" [ngClass]="{'chatitemMe': item.name == '我'}"> + <div class="name"> + {{item.name}} + </div> + <div class="chatmessage"> + {{item.content}} + </div> + </div> + </div> + <div class="inputarea"> + <textarea rows="4" nz-input [nzBorderless]="true" [(ngModel)]="text"></textarea> + </div> + <div class="btnbox"> + <button nz-button nzType="primary" (click)="send()">发送</button> + </div> </div> \ No newline at end of file diff --git a/src/app/home/commonComponents/chat-window/chat-window.component.scss b/src/app/home/commonComponents/chat-window/chat-window.component.scss index 0c482dc..52c45cf 100644 --- a/src/app/home/commonComponents/chat-window/chat-window.component.scss +++ b/src/app/home/commonComponents/chat-window/chat-window.component.scss @@ -1,7 +1,98 @@ .chatbox { - width: 478px; - height: 734px; + width: 500px; + height: 580px; background: #F5F6F8; border-radius: 4px 4px 4px 4px; opacity: 1; + position: absolute; + display: flex; + flex-direction: column; + border: 1px solid rgb(216, 209, 209); +} + +.titlebox { + display: flex; + align-items: center; + justify-content: space-between; + height: 46px; + border-bottom: 1px solid #E4E7EC; + box-sizing: border-box; + padding: 0 18px; + + .titlename { + flex: 1; + cursor: move; + text-align: left; + } + + .close { + cursor: pointer; + } +} + +.chatcontent { + flex: 1; + overflow-y: auto; + box-sizing: border-box; + padding: 0 18px; + + .chatitem { + display: flex; + flex-direction: column; + margin: 12px 0; + + .name { + text-align: left; + color: gray; + font-size: 12px; + margin-bottom: 3px; + } + + .chatmessage { + + background-color: #fff; + box-sizing: border-box; + padding: 6px 8px; + text-align: left; + width: fit-content; + width: -webkit-fit-content; + width: -moz-fit-content; + + } + } + + .chatitemMe { + .name { + text-align: right; + } + + .chatmessage { + display: flex; + align-self: flex-end; + background: #89d961; + } + } + +} + +.inputarea { + height: 120px; + border-top: 1px solid #E4E7EC; + + textarea { + height: 100%; + background: #F5F6F8; + resize: none; + } +} + +.btnbox { + display: flex; + height: 56px; + align-items: center; + justify-content: flex-end; + + button { + margin-right: 18px; + } } diff --git a/src/app/home/commonComponents/chat-window/chat-window.component.ts b/src/app/home/commonComponents/chat-window/chat-window.component.ts index 8208e11..f630006 100644 --- a/src/app/home/commonComponents/chat-window/chat-window.component.ts +++ b/src/app/home/commonComponents/chat-window/chat-window.component.ts @@ -1,4 +1,7 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, ElementRef, OnInit, NgZone, Input, Inject } from '@angular/core'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { debounceTime, fromEvent } from 'rxjs'; +import { StationTaskApplyComponent } from '../../task/station-task-apply/station-task-apply.component'; @Component({ selector: 'app-chat-window', @@ -6,10 +9,82 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./chat-window.component.scss'] }) export class ChatWindowComponent implements OnInit { + @Input() public taskId: any;//父组件传进来的任务id - constructor() { } + constructor(private ngZone: NgZone, private element: ElementRef, private message: NzMessageService, + @Inject(StationTaskApplyComponent) private parentComponent: any) { } + + + + chatcontent ngOnInit(): void { + this.chatcontent = this.element.nativeElement.querySelector(`#chatcontent`) + setTimeout(() => { + this.scrollToBottom() + }, 0); + } + text = '' + data = [ + { name: '小王', content: '说三道四的数据库的技术框架的开始倒计时打开双击打开双击打开双击打开速度加快速度加快速度加快是昆明昆明昆明的技术框架的历下区A消防救援站正在执行熟悉演练任务~' }, + { name: '小李', content: '收到~' }, + { name: '炒鸡消防站', content: '~' }, + { name: '我', content: '说三道四的数据库的技术框架的开始倒计时打开双击打开双击打开双击打开速度加快速度加快速度加快是昆明昆明昆明的技术框架的历下区A消防救援站正在执行熟悉演练任务~' }, + { name: '阿玉', content: 'fdff~' }, + { name: '我', content: '咋了~' }, + { name: '阿玉', content: 'hahah~' } + ] + + + close() { + // let obj = { + // name: "小虎", + // content: '测试数据' + // } + // this.ngZone.run(() => { + // this.data.push(obj) + // //如果此时滚动条在最底部 + // if (this.chatcontent.scrollHeight - (this.chatcontent.scrollTop + this.chatcontent.clientHeight) == 0) { + // setTimeout(() => { + // this.scrollToBottom() + // }, 0); + // } + // }) + this.parentComponent.closechat() } + send() { + if (!this.text) { + this.message.create('warning', '输入不能为空'); + return + } + let obj = { + name: "我", + content: this.text + } + this.data.push(obj) + setTimeout(() => { + this.scrollToBottom() + }, 0); + this.text = '' + } + scrollToBottom() { + this.chatcontent.scrollTop = this.chatcontent.scrollHeight + } + + //是否滚动到底部 + // isScrollBottom = true + + ngAfterViewInit(): void { + // let tableHeader = this.element.nativeElement.querySelector(`.ant-table-header`).clientHeight + // fromEvent(this.chatcontent as HTMLCanvasElement, 'scroll').pipe(debounceTime(100)).subscribe(async (event: any) => { //监听 DOM 滚动事件 + // //如果滚动到底部 + // if (event.target.scrollHeight - (event.target.scrollTop + event.target.clientHeight) == 0) { + // this.isScrollBottom = true + // } else { + // this.isScrollBottom = false + // } + // }); + + } } diff --git a/src/app/home/home.module.ts b/src/app/home/home.module.ts index ddb5dd9..ea5a3ba 100644 --- a/src/app/home/home.module.ts +++ b/src/app/home/home.module.ts @@ -69,8 +69,9 @@ import { NzBadgeModule } from 'ng-zorro-antd/badge'; import { NzListModule } from 'ng-zorro-antd/list'; import { OperationLogComponent } from './basic-info/unit-details/operation-log/operation-log.component'; import { NzDividerModule } from 'ng-zorro-antd/divider'; -import { AppModule } from '../app.module'; +import { AppModule } from '../app.module'; import { ChatWindowComponent } from './commonComponents/chat-window/chat-window.component'; +import { AngularDraggableModule } from 'angular2-draggable'; @NgModule({ declarations: [ NavComponent, @@ -146,7 +147,8 @@ import { ChatWindowComponent } from './commonComponents/chat-window/chat-window. NzNotificationModule, NzBadgeModule, NzListModule, - NzDividerModule + NzDividerModule, + AngularDraggableModule ], entryComponents: [AddroleComponent, EditroleComponent, AdduserComponent, EdituserComponent, AddorComponent, EditorComponent, ApplyComponent, ApplyLookComponent, LookTaskComponent, AllotPersonComponent, EditOrComponent, CreateTaskComponent] }) diff --git a/src/app/home/task/station-task-apply/station-task-apply.component.html b/src/app/home/task/station-task-apply/station-task-apply.component.html index 017b9d7..dbb4722 100644 --- a/src/app/home/task/station-task-apply/station-task-apply.component.html +++ b/src/app/home/task/station-task-apply/station-task-apply.component.html @@ -100,7 +100,7 @@ 单位名称 </span> </div> - <div class="flexcol"> + <div class="flexcol flexcollevel"> <span> {{item.company.useNature}} </span> @@ -192,7 +192,7 @@ </div> <div class="flexcol"> <span> - <span class="blue" (click)="xxx()">消息</span> + <img style="cursor: pointer;width: 36px;height: 28px;" src="../../../../assets/images/icon/chat.png" (click)="openchat()" alt=""> </span> <span> 消息 @@ -212,7 +212,7 @@ </div> - <div *ngIf="ischat" style="position: absolute;"> - <app-chat-window></app-chat-window> + <div *ngIf="ischat" style="position: absolute;left: 30%;top: 12%;"> + <app-chat-window [taskId]="'1234'"></app-chat-window> </div> </div> \ No newline at end of file diff --git a/src/app/home/task/station-task-apply/station-task-apply.component.scss b/src/app/home/task/station-task-apply/station-task-apply.component.scss index cadaf0b..7052485 100644 --- a/src/app/home/task/station-task-apply/station-task-apply.component.scss +++ b/src/app/home/task/station-task-apply/station-task-apply.component.scss @@ -171,6 +171,7 @@ div { flex: 1; overflow: hidden; + span { display: inline-block; width: 100%; @@ -203,9 +204,11 @@ } } - + .flexcollevel{ + flex: 2.5; + } .flexcolassistant { - flex: 1.5; + flex: 2.5; overflow: hidden; .assistant { diff --git a/src/app/home/task/station-task-apply/station-task-apply.component.ts b/src/app/home/task/station-task-apply/station-task-apply.component.ts index 4d41138..cc1fba5 100644 --- a/src/app/home/task/station-task-apply/station-task-apply.component.ts +++ b/src/app/home/task/station-task-apply/station-task-apply.component.ts @@ -356,6 +356,8 @@ export class StationTaskApplyComponent implements OnInit { } + + look(item) { const modal = this.modal.create({ nzTitle: '详情', @@ -403,18 +405,21 @@ export class StationTaskApplyComponent implements OnInit { } ischat = false - xxx() { + openchat() { this.ischat = true } + public closechat() { + this.ischat = false + } } export enum ApprovalStatus { - 未派发 = 0, - 待处理 = 1, - 通过 = 2, - 驳回 = 3, - 待检查 = 4, - 已检查 = 5, + 未派发, + 待处理, + 通过, + 驳回, + 待检查, + 已检查, } export enum TaskType { 双随机, diff --git a/src/app/home/task/zhi-indicators/zhi-indicators.component.ts b/src/app/home/task/zhi-indicators/zhi-indicators.component.ts index cb84d07..dbb0735 100644 --- a/src/app/home/task/zhi-indicators/zhi-indicators.component.ts +++ b/src/app/home/task/zhi-indicators/zhi-indicators.component.ts @@ -10,7 +10,6 @@ import { NzModalService } from 'ng-zorro-antd/modal'; import { EditOrComponent } from './edit-or/edit-or.component'; import { AllotPersonComponent } from '../da-subordinate-audit/allot-person/allot-person.component'; -import signalR from '../../../../signalR' @Component({ selector: 'app-zhi-indicators', templateUrl: './zhi-indicators.component.html', diff --git a/src/assets/images/icon/chat.png b/src/assets/images/icon/chat.png new file mode 100644 index 0000000000000000000000000000000000000000..7fb10d63bae6b7d3a50d46a202a58d2359254419 GIT binary patch literal 1317 zcmV+=1={+FP)<h;3K|Lk000e1NJLTq001!n001Zm1^@s6S49#}00004b3#c}2nYxW zd<bNS000EsNkl<ZSVzrS?O7T@5T3;(kLZtR1u+$bR1mB{(E`K@zzW0)0u@LKP@saG z6^IoCE71J#<B7>_-dS!h<7T<rgX7WtBXE1W^Uln^^UkU$VCVsDJZjpBHPw}(Elsqc zh-%{12|iEoEW(`e`W}q}mMv`xY?(bC22|IYjxnQNWJiF!B~8Ohg-)ssVt`8>UJ$<q zRQs*zYf<C9mTKx&0Y)_dY)Ruk5O)LGg%?lpV56)(5t(sCQDa$Ac?RO)jG9`}X<5e0 zbvVTU<nuCsq#%;~|Go?Wc1@1RnxgHpQ_Fy0_PN*eqs$b_a7J%!kJ@EA%Ye8$qYmhi zS!n44Z1;1mLR)1<Lva)yG~F!KdQI0zrT*Ir4c|3rY@?6b^U2+}x<?m9ZBffS%wV}| zgt}ARr#{Xc7s(xpQF|1MW;Xjx5U~hE5Una2<wZ^1pVJV?cZ#CVn-3#SkT%^%7#qiQ zjC5`0z2ke%tfn;eRfT%9m`&ZC)1@OJ=GiNKhjYF{)MoGB52%G`be#n`UB-w;gn6a_ zuHrkuPGw9?TQMSqPc_(;rkkN?O-H=0YamAg&&wO|+Tkj4ALnd<RoNI~VEEI84CxoC z6RaGbG_?Wdz*>m4`s@32C@n4*1U$92Pu=@708ps>({WM7=e)ema-)$!G16Yqhr}t* zfGE)GE%NpKqOm|Yub^IQh%Bd1%WOvU4Zk%PUE8cRt!0r-F+OvMNQa+sBqIF%vgk%| z#P$mE7Q*qeYyfF02_RC&a3mHkbRr5YTUfrAUeGKML)B0h(ostOICnH~7C?c+ba4^t zx!25i(WWd%1L?Xsl^y5cVZi`JH|A8*F(^`*9)$4yV-XfAx?j@oOw$$;-+<s~pdgLs zJ>X!UO;9QyvX)J)qJ|ZnZ%YFo@PAT#fnEZtR1(AmzSmu&OrH*rF|%01s01_EtAC&v zKnf$PtBhmMQ5(?DqY(Cd^ehOeS4vY90z%50H)xKm!ARvB)=@UUEwDV6vmltp{q1Rt zGg6>-Bp|E?^G0GOh@?(2qk;ELOYAggBdl)=XByxXyi6w<ese~U<DrM0J^K`+DknV& zgL2c!NC?b<UYbb#V|sd!0whTUGKlPZsQPVAC!DvAn@;jzv&_l8vH_STN-rBYv#Rq# zD-{~2DFDWhd0+I<=FOM2jY%aFgj`I@3C|`b<nZ1k(KivkZ|4~^&vV&ITUiqfBCE1n zT9tD+IzHJvkKyti**aK)2nR8vATj{lVAO5iVw15IX_AE&HQuz*F|Lymb^J^KhA!?C ziY@?4k2t^)pP{TqCUoC)&FO`nX`EbjTqF{12ROo^YWfOM!bAp0Vr+z{9LZu90wP(b zC0kpcyblH;JHU`W!EIy`5At>95U!l8D7x~2O5Qt2E)&w5cdjFR>A+2w>wsVows{Hx z@a!N$>f?LcN6~Jp$u$Fnz-_HNdcJyLCk2Dx0?5}b^DvIlO(=Bm?k)`H|8b->M*?ve za0Ea@?$`5L+h7nOIUG92Z8h;;1Wz~k#si?teQ*(Gdl3*8tn6d>vKjPwV$+Fx6e&Zp z9Q2|f*f1A}rO_hA^2I^8K&;1QG0RKSR{_EYqzDVX8W0S`x!m^lCBCS<DiA3U6g4hv bp>+Ni<4s?<PAG)P00000NkvXXu0mjfxH(s4 literal 0 HcmV?d00001