121
121
>
122
122
{{ typingUsers(room) }}
123
123
</div >
124
- <div v-if =" room.unreadCount" class =" vac-room-badge" >
125
- {{ room.unreadCount }}
124
+ <div class =" vac-room-options-container" >
125
+ <div v-if =" room.unreadCount" class =" vac-room-badge-container" >
126
+ <div class =" vac-room-badge" >
127
+ {{ room.unreadCount }}
128
+ </div >
129
+ </div >
130
+ <slot name =" room-list-options" v-bind =" { room }" >
131
+ <div
132
+ class =" vac-svg-button vac-list-room-options"
133
+ v-if =" roomActions.length"
134
+ @click.stop =" roomMenuOpened = room.roomId"
135
+ >
136
+ <slot name =" room-list-options-icon" >
137
+ <svg-icon name =" dropdown" param =" room" />
138
+ </slot >
139
+ </div >
140
+ <transition name =" vac-slide-left" v-if =" roomActions.length" >
141
+ <div
142
+ v-if =" roomMenuOpened === room.roomId"
143
+ v-click-outside =" closeRoomMenu"
144
+ class =" vac-menu-options"
145
+ >
146
+ <div class =" vac-menu-list" >
147
+ <div v-for =" action in roomActions" :key =" action.name" >
148
+ <div
149
+ class =" vac-menu-item"
150
+ @click.stop =" roomActionHandler(action, room)"
151
+ >
152
+ {{ action.title }}
153
+ </div >
154
+ </div >
155
+ </div >
156
+ </div >
157
+ </transition >
158
+ </slot >
126
159
</div >
127
160
</div >
128
161
</div >
147
180
148
181
<script >
149
182
import InfiniteLoading from ' vue-infinite-loading'
183
+ import vClickOutside from ' v-click-outside'
150
184
import Loader from ' ./Loader'
151
185
import SvgIcon from ' ./SvgIcon'
152
186
import FormatMessage from ' ./FormatMessage'
@@ -158,6 +192,10 @@ export default {
158
192
name: ' rooms-list' ,
159
193
components: { InfiniteLoading, Loader, SvgIcon, FormatMessage },
160
194
195
+ directives: {
196
+ clickOutside: vClickOutside .directive
197
+ },
198
+
161
199
props: {
162
200
currentUserId: { type: [String , Number ], required: true },
163
201
textMessages: { type: Object , required: true },
@@ -168,15 +206,17 @@ export default {
168
206
rooms: { type: Array , required: true },
169
207
loadingRooms: { type: Boolean , required: true },
170
208
roomsLoaded: { type: Boolean , required: true },
171
- room: { type: Object , required: true }
209
+ room: { type: Object , required: true },
210
+ roomActions: { type: Array , required: true }
172
211
},
173
212
174
213
data () {
175
214
return {
176
215
filteredRooms: this .rooms || [],
177
216
infiniteState: null ,
178
217
loadingMoreRooms: false ,
179
- selectedRoomId: ' '
218
+ selectedRoomId: ' ' ,
219
+ roomMenuOpened: null
180
220
}
181
221
},
182
222
@@ -285,6 +325,13 @@ export default {
285
325
room .lastMessage .distributed ||
286
326
room .lastMessage .seen )
287
327
)
328
+ },
329
+ roomActionHandler (action , room ) {
330
+ this .closeRoomMenu ()
331
+ this .$emit (' room-action-handler' , { action, roomId: room .roomId })
332
+ },
333
+ closeRoomMenu () {
334
+ this .roomMenuOpened = null
288
335
}
289
336
}
290
337
}
@@ -376,7 +423,7 @@ export default {
376
423
display : flex ;
377
424
flex : 1 1 100% ;
378
425
margin-bottom : 5px ;
379
- padding : 0 16 px ;
426
+ padding : 0 14 px ;
380
427
position : relative ;
381
428
min-height : 71px ;
382
429
@@ -470,6 +517,11 @@ export default {
470
517
fill : var (--chat-room-color-message );
471
518
}
472
519
520
+ .vac-room-options-container {
521
+ display : flex ;
522
+ margin-left : auto ;
523
+ }
524
+
473
525
.vac-room-badge {
474
526
background-color : var (--chat-room-bg-color-badge );
475
527
color : var (--chat-room-color-badge );
@@ -478,13 +530,21 @@ export default {
478
530
height : 13px ;
479
531
width : auto ;
480
532
min-width : 13px ;
533
+ margin-left : 5px ;
481
534
border-radius : 50% ;
482
535
display : flex ;
483
536
align-items : center ;
484
537
justify-content : center ;
485
538
padding : 3px ;
486
539
}
487
540
541
+ .vac-list-room-options {
542
+ height : 19px ;
543
+ width : 19px ;
544
+ align-items : center ;
545
+ margin-left : 5px ;
546
+ }
547
+
488
548
@media only screen and (max-width : 768px ) {
489
549
.vac-box-search {
490
550
height : 58px ;
0 commit comments