@ -5,45 +5,45 @@ import { Template } from 'meteor/templating';
import { settings } from '../../../../settings' ;
import { hasPermission } from '../../../../authorization' ;
import { Users } from '../../../../models' ;
import { LivechatQueueUser } from '../../collections/LivechatQueueUser' ;
import './livechatQueue.html' ;
import { APIClient } from '../../../../utils/client' ;
const QUEUE _COUNT = 50 ;
Template . livechatQueue . helpers ( {
departments ( ) {
return Template . instance ( ) . departments . get ( ) . filter ( ( department ) => department . enabled === true ) ;
} ,
users ( ) {
const users = [ ] ;
const showOffline = Template . instance ( ) . showOffline . get ( ) ;
LivechatQueueUser . find ( {
departmentId : this . _id ,
} , {
sort : {
count : 1 ,
order : 1 ,
username : 1 ,
} ,
} ) . forEach ( ( user ) => {
const options = { fields : { _id : 1 } } ;
const userFilter = { _id : user . agentId , status : { $ne : 'offline' } } ;
const agent = Template . instance ( ) . agents . get ( ) . find ( ( agent ) => agent . _id === user . agentId && agent . statusLivechat === 'available' ) ;
if ( showOffline [ this . _id ] || ( Meteor . users . findOne ( userFilter , options ) && agent ) ) {
users . push ( user ) ;
}
} ) ;
return users ;
onSelectAgents ( ) {
return Template . instance ( ) . onSelectAgents ;
} ,
agentModifier ( ) {
return ( filter , text = '' ) => {
const f = filter . get ( ) ;
return ` @ ${ f . length === 0 ? text : text . replace ( new RegExp ( filter . get ( ) ) , ( part ) => ` <strong> ${ part } </strong> ` ) } ` ;
} ;
} ,
selectedAgents ( ) {
return Template . instance ( ) . selectedAgents . get ( ) ;
} ,
onClickTagAgent ( ) {
return Template . instance ( ) . onClickTagAgent ;
} ,
queue ( ) {
return Template . instance ( ) . queue . get ( ) ;
} ,
isLoading ( ) {
return Template . instance ( ) . isLoading . get ( ) ;
} ,
hasPermission ( ) {
const user = Users . findOne ( Meteor . userId ( ) , { fields : { statusLivechat : 1 } } ) ;
return hasPermission ( Meteor . userId ( ) , 'view-livechat-queue' ) || ( user . statusLivechat === 'available' && settings . get ( 'Livechat_show_queue_list_link' ) ) ;
} ,
hasMore ( ) {
const instance = Template . instance ( ) ;
const queue = instance . queue . get ( ) ;
return instance . total . get ( ) > queue . length ;
} ,
} ) ;
Template . livechatQueue . events ( {
@ -54,17 +54,67 @@ Template.livechatQueue.events({
instance . showOffline . set ( showOffline ) ;
} ,
'submit form' ( event , instance ) {
event . preventDefault ( ) ;
instance . queue . set ( [ ] ) ;
instance . offset . set ( 0 ) ;
const filter = { } ;
$ ( ':input' , event . currentTarget ) . each ( function ( ) {
if ( ! this . name ) {
return ;
}
const value = $ ( this ) . val ( ) ;
filter [ this . name ] = value ;
} ) ;
const agents = instance . selectedAgents . get ( ) ;
if ( agents && agents . length > 0 ) {
filter . agent = agents [ 0 ] . _id ;
}
instance . filter . set ( filter ) ;
} ,
'click .js-load-more' ( event , instance ) {
instance . offset . set ( instance . offset . get ( ) + QUEUE _COUNT ) ;
} ,
} ) ;
Template . livechatQueue . onCreated ( async function ( ) {
this . showOffline = new ReactiveVar ( { } ) ;
this . agents = new ReactiveVar ( [ ] ) ;
this . selectedAgents = new ReactiveVar ( [ ] ) ;
this . departments = new ReactiveVar ( [ ] ) ;
this . limit = new ReactiveVar ( 20 ) ;
this . filter = new ReactiveVar ( { } ) ;
this . queue = new ReactiveVar ( [ ] ) ;
this . isLoading = new ReactiveVar ( true ) ;
this . offset = new ReactiveVar ( 0 ) ;
this . total = new ReactiveVar ( 0 ) ;
this . subscribe ( 'livechat:queue' ) ;
const { users } = await APIClient . v1 . get ( 'livechat/users/agent' ) ;
const { departments } = await APIClient . v1 . get ( 'livechat/department?sort={"name": 1}' ) ;
this . onSelectAgents = ( { item : agent } ) => {
this . selectedAgents . set ( [ agent ] ) ;
} ;
this . agents . set ( users ) ;
this . onClickTagAgent = ( { username } ) => {
this . selectedAgents . set ( this . selectedAgents . get ( ) . filter ( ( user ) => user . username !== username ) ) ;
} ;
this . autorun ( async ( ) => {
this . isLoading . set ( true ) ;
const filter = this . filter . get ( ) ;
const offset = this . offset . get ( ) ;
let query = ` includeOfflineAgents= ${ filter . agentStatus === 'offline' } ` ;
if ( filter . agent ) {
query += ` &agentId= ${ filter . agent } ` ;
}
if ( filter . department ) {
query += ` &departmentId= ${ filter . department } ` ;
}
const { queue , total } = await APIClient . v1 . get ( ` livechat/queue? ${ query } &count= ${ QUEUE _COUNT } &offset= ${ offset } ` ) ;
this . total . set ( total ) ;
this . queue . set ( this . queue . get ( ) . concat ( queue ) ) ;
this . isLoading . set ( false ) ;
} ) ;
const { departments } = await APIClient . v1 . get ( 'livechat/department?sort={"name": 1}' ) ;
this . departments . set ( departments ) ;
} ) ;