TT#47513 Grouped list of SoundItems

Change-Id: Iea2324bafa0f01100529b611037da9a631ce38f3
changes/50/27550/8
Robert Axelsen 7 years ago
parent da0da9d755
commit 8d95437a08

@ -628,7 +628,11 @@ export function getSoundHandles(options) {
options = _.merge(options, { options = _.merge(options, {
path: 'api/soundhandles/', path: 'api/soundhandles/',
root: '_embedded.ngcp:soundhandles', root: '_embedded.ngcp:soundhandles',
all: true all: true,
params: {
order_by: 'name',
order_by_direction: 'asc'
}
}); });
getList(options).then((list) => { getList(options).then((list) => {
// Ngcp-panel only lists three groups ('digits', 'music_on_hold' // Ngcp-panel only lists three groups ('digits', 'music_on_hold'
@ -697,14 +701,15 @@ export function getSoundFilesGrouped(options) {
return handles; return handles;
}).then((merged) => { }).then((merged) => {
let groupedFiles = { let groupedFiles = {
groups: _(merged) groups: _.sortBy(
_(merged)
.groupBy('group') .groupBy('group')
.map((items, group) => { .map((items, group) => {
return { return {
name: group, name: group,
handles: items handles: items
}; };
}).value() }).value(), 'name')
}; };
resolve(groupedFiles); resolve(groupedFiles);
}).catch((err)=>{ }).catch((err)=>{

@ -2,12 +2,32 @@
<q-field <q-field
class="csc-upload-field" class="csc-upload-field"
:icon="icon" :icon="icon"
:label="label"
> >
<div
v-if="label"
class="row items-end"
>
<slot
class="col-auto"
name="additional"
>
</slot>
<q-input
class="col-xl col-sm-12"
:disable="isPlaying"
dark
readonly
:value="inputValue"
:after="inputButtons"
/>
</div>
<q-input <q-input
v-if="floatLabel"
:disable="isPlaying" :disable="isPlaying"
dark dark
readonly readonly
:float-label="label" :float-label="floatLabel"
:value="inputValue" :value="inputValue"
:after="inputButtons" :after="inputButtons"
/> />
@ -38,6 +58,7 @@
/> />
</div> </div>
<csc-audio-player <csc-audio-player
v-if="!hidePlayer"
ref="audioPlayer" ref="audioPlayer"
:file-url="fileUrl" :file-url="fileUrl"
:loaded="loaded" :loaded="loaded"
@ -48,6 +69,7 @@
@stopped="audioPlayerStopped" @stopped="audioPlayerStopped"
/> />
<div <div
v-if="!hidePlayer"
class="csc-file-upload-actions" class="csc-file-upload-actions"
> >
<q-btn <q-btn
@ -110,7 +132,10 @@
'progress', 'progress',
'fileTypes', 'fileTypes',
'fileUrl', 'fileUrl',
'loaded' 'loaded',
'disabled',
'hidePlayer',
'floatLabel'
], ],
data () { data () {
return { return {
@ -133,7 +158,7 @@
inputButtons() { inputButtons() {
let buttons = []; let buttons = [];
let self = this; let self = this;
if (this.isPlaying) { if (this.isPlaying || this.disabled) {
buttons.push({ buttons.push({
icon: 'folder', icon: 'folder',
error: false, error: false,
@ -209,6 +234,9 @@
.q-field-icon .q-field-icon
color $primary color $primary
.items-end
margin-left -1.3rem
.csc-upload-field.csc-player-margin .csc-upload-field.csc-player-margin
margin-bottom 0 margin-bottom 0

@ -15,9 +15,10 @@
highlight highlight
> >
<q-item <q-item
v-for="language in languages" v-for="(language, index) in languages"
@click="changeLanguage(language[0])" @click="changeLanguage(language[0])"
class="csc-subitem" class="csc-subitem"
:key="index"
> >
<q-item-main <q-item-main
:label="language[1]" :label="language[1]"
@ -59,7 +60,7 @@
console.log(language); console.log(language);
this.$emit('change-language', language); this.$emit('change-language', language);
this.$refs.languageCollapsible.close(); this.$refs.languageCollapsible.close();
}, }
} }
} }
</script> </script>

@ -1,37 +1,24 @@
<template> <template>
<q-collapsible <q-collapsible
:label="group.name" :label="groupLabel"
> >
<q-list <q-list
striped-odd striped-odd
no-border no-border
multiline multiline
:highlight="!mobile"
> >
<q-item
v-if="!mobile"
>
<div class="col">
Handle
</div>
<div class="col">
Filename
</div>
<div class="col">
Loopplay
</div>
</q-item>
<csc-pbx-sound-item <csc-pbx-sound-item
v-for="item in group.handles" v-for="item in group.handles"
:key="item.id" :key="item.id"
:item="item" :item="item"
:mobile="mobile" :group="groupLabel"
/> />
</q-list> </q-list>
</q-collapsible> </q-collapsible>
</template> </template>
<script> <script>
import _ from 'lodash'
import CscPbxSoundItem from './CscPbxSoundItem' import CscPbxSoundItem from './CscPbxSoundItem'
import { import {
QList, QList,
@ -47,8 +34,7 @@
export default { export default {
name: 'csc-pbx-sound-group', name: 'csc-pbx-sound-group',
props: { props: {
group: Object, group: Object
mobile: Boolean
}, },
components: { components: {
CscPbxSoundItem, CscPbxSoundItem,
@ -69,6 +55,11 @@
mounted() { mounted() {
}, },
computed: { computed: {
groupLabel() {
let regex = /[-_]/g;
let name = _.capitalize(this.group.name.replace(regex, ' '));
return name;
}
}, },
methods: { methods: {
}, },

@ -1,60 +1,34 @@
<template> <template>
<q-item <q-item
highlight highlight
class="csc-sound-item"
> >
<q-item-main <q-item-main>
v-if="!mobile" <csc-sound-file-upload
class="row" :ref="refName"
> icon="music_note"
file-types=".wav,.mp3"
<!--NOTE: Would like some feedback on this, please. Made separate styling--> :label="handleName"
<!--for mobile/desktop, as with 60 or more items in some of the groups--> :value="fileLabel"
<!--I don't see a better way to display it. Will clean up css once--> :disabled="true"
<!--feedback is implemented--> :hide-player="!file"
<div class="col"> >
{{ item.handle }} <div
</div> slot="additional"
<div class="col"> >
{{ item.filename }} <q-toggle
</div> :class="loopClasses"
<div class="col"> :label="$t('pbxConfig.playingInLoop')"
<q-checkbox v-model="loop"
readonly :disable="true"
:value="loop" checked-icon="loop"
/> unchecked-icon="loop"
</div>
</q-item-main>
<q-item-main
v-if="mobile"
class="sound-item-row mobile"
>
<div>
<span class="item-sublabel">
Handle:
</span>
<span class="item-values">
{{ item.handle }}
</span>
</div>
<div>
<span class="item-sublabel">
Filename:
</span>
<span class="item-values">
{{ item.filename }}
</span>
</div>
<div>
<span class="item-sublabel">
Loopplay:
</span>
<span class="item-values">
<q-checkbox
readonly
:value="loop"
/> />
</span> <q-tooltip>
</div> {{ loopTooltipLabel }}
</q-tooltip>
</div>
</csc-sound-file-upload>
</q-item-main> </q-item-main>
</q-item> </q-item>
</template> </template>
@ -63,43 +37,66 @@
import { import {
QList, QList,
QItem, QItem,
QItemSide,
QItemMain, QItemMain,
QItemTile, QToggle,
QBtn, QTooltip
QIcon,
QCollapsible,
QCheckbox
} from 'quasar-framework' } from 'quasar-framework'
import CscSoundFileUpload from '../../form/CscSoundFileUpload'
export default { export default {
name: 'csc-pbx-sound-item', name: 'csc-pbx-sound-item',
props: { props: {
item: Object, item: Object,
mobile: Boolean group: String
}, },
components: { components: {
CscSoundFileUpload,
QList, QList,
QItem, QItem,
QItemSide,
QItemMain, QItemMain,
QItemTile, QToggle,
QBtn, QTooltip
QIcon,
QCollapsible,
QCheckbox
}, },
data () { data () {
return { return {
loop: this.hasLoop() loop: this.hasLoop(),
file: this.hasFile()
} }
}, },
mounted() { mounted() {
}, },
computed: { computed: {
handleName() {
return `${this.group}: ${this.item.handle}`;
},
refName() {
return `handle-${this.item.handle}`;
},
fileLabel() {
let noSound = this.$t('pbxConfig.noSoundUploaded');
return this.item.filename.length > 0 ? this.item.filename : noSound;
},
loopClasses() {
let classes = ['csc-additional'];
if(this.loop) {
classes.push('csc-toggle-enabled');
}
else {
classes.push('csc-toggle-disabled');
}
return classes;
},
loopTooltipLabel() {
return this.loop ?
this.$t('pbxConfig.dontPlayInLoop') :
this.$t('pbxConfig.playInLoop');
}
}, },
methods: { methods: {
hasLoop() { hasLoop() {
return !!this.item.loopplay; return !!this.item.loopplay;
},
hasFile() {
return this.item.filename.length > 0;
} }
}, },
watch: { watch: {
@ -109,21 +106,12 @@
<style lang="stylus" rel="stylesheet/stylus"> <style lang="stylus" rel="stylesheet/stylus">
@import '../../../themes/quasar.variables.styl'; @import '../../../themes/quasar.variables.styl';
@import '../../../themes/quasar.variables.styl';
.sound-item-row.mobile
padding 16px
padding-left 0px
display block
color $white
white-space nowrap
overflow hidden
font-size 16px
.item-values .csc-sound-item
color $white .q-field-icon
padding-left 12px
.item-sublabel .csc-upload-field
color $light margin 0 0 10px 0
</style> </style>

@ -7,7 +7,7 @@
> >
<q-icon <q-icon
size="24px" size="24px"
name="music_note" name="queue_music"
color="white" color="white"
/> />
</q-item-side> </q-item-side>
@ -63,8 +63,6 @@
v-for="(group, index) in set.groups" v-for="(group, index) in set.groups"
:group="group" :group="group"
:key="index" :key="index"
:highlight="!mobile"
:mobile="mobile"
/> />
</q-item-tile> </q-item-tile>
</q-item-main> </q-item-main>
@ -179,24 +177,4 @@
<style lang="stylus" rel="stylesheet/stylus"> <style lang="stylus" rel="stylesheet/stylus">
@import '../../../themes/quasar.variables.styl'; @import '../../../themes/quasar.variables.styl';
.csc-list-collapsible
margin-top $flex-gutter-md
.q-item
padding-left 0
.q-item-section
padding-top 0
.q-item-icon
color $primary
.q-collapsible-sub-item
padding 0
.csc-sublabel
color $light
margin-bottom $flex-gutter-sm
</style> </style>

@ -24,7 +24,7 @@
ref="uploadBusy" ref="uploadBusy"
icon="music_note" icon="music_note"
file-types=".wav,.mp3" file-types=".wav,.mp3"
:label="$t('voicebox.label.busyGreeting')" :float-label="$t('voicebox.label.busyGreeting')"
:value="busyGreetingLabel" :value="busyGreetingLabel"
:progress="uploadBusyProgress" :progress="uploadBusyProgress"
:uploading="uploadBusyGreetingRequesting" :uploading="uploadBusyGreetingRequesting"
@ -40,7 +40,7 @@
ref="uploadUnavail" ref="uploadUnavail"
icon="music_note" icon="music_note"
file-types=".wav,.mp3" file-types=".wav,.mp3"
:label="$t('voicebox.label.unavailGreeting')" :float-label="$t('voicebox.label.unavailGreeting')"
:value="unavailGreetingLabel" :value="unavailGreetingLabel"
:progress="uploadUnavailProgress" :progress="uploadUnavailProgress"
:uploading="uploadUnavailGreetingRequesting" :uploading="uploadUnavailGreetingRequesting"

@ -437,7 +437,11 @@
"callers": "callers", "callers": "callers",
"description": "Description", "description": "Description",
"removeSoundSetTitle": "Remove sound set", "removeSoundSetTitle": "Remove sound set",
"removeSoundSetText": "You are about to remove the {set} sound set" "removeSoundSetText": "You are about to remove the {set} sound set",
"noSoundUploaded": "No sound uploaded",
"playingInLoop": "Playing in loop",
"playInLoop": "Play sound in loop",
"dontPlayInLoop": "Don't play sound in loop"
}, },
"callBlocking": { "callBlocking": {
"privacyEnabledToast": "Your number is hidden to the callee", "privacyEnabledToast": "Your number is hidden to the callee",

@ -17,7 +17,7 @@
.csc-toggle-disabled .csc-toggle-disabled
.q-option-label .q-option-label
color: $faded color $faded
.csc-item-field .csc-item-field
.csc-item-value .csc-item-value
@ -109,6 +109,7 @@
color $body-color color $body-color
span span
color $body-color color $body-color
.csc-list-item.csc-item-collapsed.q-item .csc-list-item.csc-item-collapsed.q-item
.q-item-main .q-item-main
margin-left $flex-gutter-sm * 1.4 margin-left $flex-gutter-sm * 1.4
@ -132,9 +133,9 @@
margin 0 margin 0
.csc-item-expanded .csc-item-expanded
.csc-list-actions-pinned.q-item-side-right .csc-list-actions-pinned.q-item-side-right
top $flex-gutter-sm top $flex-gutter-sm
right $flex-gutter-sm right $flex-gutter-sm
margin auto margin auto
.q-item-main .q-item-main
padding-top $flex-gutter-md padding-top $flex-gutter-md
@ -188,3 +189,28 @@
.csc-item-highlight, .csc-item-highlight,
.csc-item-highlight:hover .csc-item-highlight:hover
background alpha($primary, 0.3) !important background alpha($primary, 0.3) !important
.csc-additional
padding-right $flex-gutter-lg
padding-bottom $flex-gutter-xs
.q-option-label
color $light
.csc-list-collapsible
margin-top $flex-gutter-md
.q-item
padding-left 0
margin-bottom 10px
.q-item-section
padding 10px 0 !important
.q-item-icon
color $primary
.csc-sublabel
color $light
margin-bottom $flex-gutter-sm
.q-item-label
padding-left $flex-gutter-sm
.q-item-link
background alpha(white, 0.04)
.q-item-link:hover
background alpha(white, 0.10)

Loading…
Cancel
Save