Change-Id: Ibf6cfc82f56ae62fd1ec7997e160ca2e8025749dmr10.0
parent
22739de401
commit
116773786b
@ -0,0 +1,133 @@
|
||||
<template>
|
||||
<q-card
|
||||
dark
|
||||
bordered
|
||||
class="my-card csc-card-style column csc-item-odd no-wrap"
|
||||
>
|
||||
<q-card-section>
|
||||
<div class="text-h6 text-center">
|
||||
{{ title }}
|
||||
</div>
|
||||
</q-card-section>
|
||||
|
||||
<q-separator
|
||||
dark
|
||||
inset
|
||||
/>
|
||||
|
||||
<q-card-section>
|
||||
<div
|
||||
v-if="!loading && error"
|
||||
class="text-h2 text-center csc-card-data-error"
|
||||
>
|
||||
N/A
|
||||
</div>
|
||||
<div
|
||||
v-if="!loading && !error"
|
||||
class="text-h2 text-center"
|
||||
>
|
||||
{{ count }}
|
||||
</div>
|
||||
<div
|
||||
class="text-h2 text-center"
|
||||
>
|
||||
<csc-spinner
|
||||
v-if="loading"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
v-if="!error"
|
||||
class="text-center"
|
||||
>
|
||||
{{ countTitle }}
|
||||
</div>
|
||||
</q-card-section>
|
||||
|
||||
<q-separator
|
||||
dark
|
||||
inset
|
||||
/>
|
||||
|
||||
<q-card-section
|
||||
class="csc-card-list"
|
||||
/>
|
||||
|
||||
<q-separator
|
||||
dark
|
||||
inset
|
||||
/>
|
||||
|
||||
<q-card-section
|
||||
class="text-center"
|
||||
>
|
||||
<q-btn
|
||||
color="primary"
|
||||
unelevated
|
||||
flat
|
||||
:label="buttonTitle"
|
||||
:to="routeTo"
|
||||
/>
|
||||
</q-card-section>
|
||||
</q-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import CscSpinner from 'components/CscSpinner'
|
||||
export default {
|
||||
name: 'CscCardDashboard',
|
||||
components: {
|
||||
CscSpinner
|
||||
},
|
||||
props: {
|
||||
title: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
count: {
|
||||
type: Number,
|
||||
default: 0
|
||||
},
|
||||
countTitle: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
buttonTitle: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
itemsList: {
|
||||
type: Array,
|
||||
default () {
|
||||
return []
|
||||
}
|
||||
},
|
||||
routeTo: {
|
||||
type: [Object, String],
|
||||
required: true
|
||||
},
|
||||
loading: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
error: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="stylus" rel="stylesheet/stylus">
|
||||
.csc-card-style
|
||||
margin 10px
|
||||
width 30%
|
||||
height max-content
|
||||
min-width 284px
|
||||
|
||||
.csc-card-data-error
|
||||
color: $negative
|
||||
padding-bottom: 22px
|
||||
|
||||
.csc-card-list
|
||||
min-height: 316px
|
||||
</style>
|
@ -0,0 +1,113 @@
|
||||
<template>
|
||||
<csc-page
|
||||
id="csc-page-dashboard"
|
||||
class="row justify-center"
|
||||
>
|
||||
<csc-card-dashboard
|
||||
:title="$t('Voicebox Messages')"
|
||||
:count="voicemailsCount"
|
||||
:count-title="$t('New Messages')"
|
||||
:button-title="$t('View Voicebox Messages')"
|
||||
:items-list="voicemailItems"
|
||||
:route-to="{ name: 'CscConversations', params: { initialTab: 'voicemail' } }"
|
||||
:loading="$wait.is('getVoicemailsData')"
|
||||
:error="voicemailsError"
|
||||
/>
|
||||
<csc-card-dashboard
|
||||
:title="$t('Call List')"
|
||||
:count="callsCount"
|
||||
:count-title="$t('Recent Calls')"
|
||||
:button-title="$t('View Call List')"
|
||||
:items-list="callItems"
|
||||
:route-to="{ name: 'CscConversations', params: { initialTab: 'call' } }"
|
||||
:loading="$wait.is('getCallsData')"
|
||||
:error="callsError"
|
||||
/>
|
||||
<csc-card-dashboard
|
||||
:title="$t('Registered Devices')"
|
||||
:count="registeredDevicesCount"
|
||||
:count-title="$t('Registered Devices')"
|
||||
:button-title="$t('View All Registered Devices')"
|
||||
:items-list="registeredDevicesItems"
|
||||
:route-to="{ name: 'RegisteredDevices', params: { initialTab: 'null' } }"
|
||||
:loading="$wait.is('getRegisteredDevicesData')"
|
||||
:error="registeredDevicesError"
|
||||
/>
|
||||
</csc-page>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import CscCardDashboard from 'components/pages/Dashboard/CscCardDashboard'
|
||||
import CscPage from 'components/CscPage'
|
||||
import { mapWaitingActions } from 'vue-wait'
|
||||
import {
|
||||
showGlobalError
|
||||
} from 'src/helpers/ui'
|
||||
export default {
|
||||
name: 'CscPageDashboard',
|
||||
components: {
|
||||
CscCardDashboard,
|
||||
CscPage
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
callItems: [],
|
||||
voicemailItems: [],
|
||||
registeredDevicesItems: [],
|
||||
callsCount: 0,
|
||||
voicemailsCount: 0,
|
||||
registeredDevicesCount: 0,
|
||||
voicemailsError: false,
|
||||
callsError: false,
|
||||
registeredDevicesError: false
|
||||
}
|
||||
},
|
||||
mounted () {
|
||||
this.loadDatas()
|
||||
},
|
||||
methods: {
|
||||
...mapWaitingActions('dashboard', {
|
||||
getCallsData: 'getCallsData',
|
||||
getVoicemailsData: 'getVoicemailsData',
|
||||
getRegisteredDevicesData: 'getRegisteredDevicesData'
|
||||
}),
|
||||
async loadDatas () {
|
||||
const values = await Promise.allSettled([
|
||||
this.getCallsData(),
|
||||
this.getVoicemailsData(),
|
||||
this.getRegisteredDevicesData()
|
||||
])
|
||||
this.checkResponses('calls', values[0])
|
||||
this.checkResponses('voicemails', values[1])
|
||||
this.checkResponses('registered-devices', values[2])
|
||||
},
|
||||
checkResponses (type, response) {
|
||||
if (type === 'calls') {
|
||||
if (response.status === 'rejected') {
|
||||
this.callsError = true
|
||||
showGlobalError(response?.reason?.data?.message)
|
||||
} else {
|
||||
this.callsCount = response.value.totalCount
|
||||
this.callItems = response.value.items
|
||||
}
|
||||
} else if (type === 'voicemails') {
|
||||
if (response.status === 'rejected') {
|
||||
this.voicemailsError = true
|
||||
showGlobalError(response?.reason?.data?.message)
|
||||
} else {
|
||||
this.voicemailsCount = response.value.totalCount
|
||||
this.voicemailItems = response.value.items
|
||||
}
|
||||
} else if (type === 'registered-devices') {
|
||||
if (response.status === 'rejected') {
|
||||
this.registeredDevicesError = true
|
||||
showGlobalError(response?.reason?.data?.message)
|
||||
} else {
|
||||
this.registeredDevicesCount = response.value.totalCount
|
||||
this.registeredDevicesItems = response.value.items
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
@ -0,0 +1,39 @@
|
||||
import {
|
||||
getAllVoicemails,
|
||||
getAllCalls
|
||||
} from '../api/conversations'
|
||||
import {
|
||||
getSubscriberRegistrations
|
||||
} from '../api/subscriber'
|
||||
|
||||
export default {
|
||||
namespaced: true,
|
||||
getters: {
|
||||
getSubscriberId (state, getters, rootState, rootGetters) {
|
||||
return parseInt(rootGetters['user/getSubscriberId'])
|
||||
}
|
||||
},
|
||||
actions: {
|
||||
async getVoicemailsData (context) {
|
||||
const res = await getAllVoicemails({
|
||||
subscriberId: context.getters.getSubscriberId,
|
||||
rows: 5
|
||||
})
|
||||
return res
|
||||
},
|
||||
async getCallsData (context) {
|
||||
const res = await getAllCalls({
|
||||
subscriberId: context.getters.getSubscriberId,
|
||||
rows: 5
|
||||
})
|
||||
return res
|
||||
},
|
||||
async getRegisteredDevicesData (context) {
|
||||
const res = await getSubscriberRegistrations({
|
||||
subscriber_id: context.getters.getSubscriberId,
|
||||
rows: 5
|
||||
})
|
||||
return res
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in new issue