MT#61635 CF bugfixes

This commit fixes the following bugs:
* On refresh The PBX Seat Page crashes because the
  seat id in the state goes back to null.
* PBX Seats and Groups pages' reactivity is not
  working, in fact the components are not refreshed
  upon manually changing the group or seat id in the URL.
* When user changes a destination that belonged
  to admin user the app was getting stuck in an
  infinite loop now we show the permission error.
* When user deletes a CF previously set by the admin,
  or a mapping containing the above, the app was crashing.
  We now delete the mapping and show a warning informing
  the user if the associated destination set belongs
  to admin.
* When seat user creates a new CF all CF previously
  created by admin were disappearing because only
  destinations filtered by csc users were retrieved
  after the creation fo a new mapping instead of all
  the available destinations.
* Time set created in admin were visualised as "...".
  We now show the string "Custom time set" and show
  a formatted summary of the details on click.
* Not all timesets were shown in call forward page
  because of the missing parameter "all: true" in
  the getList config. getList or pagination in csc
  needs proper reviewing.

Change-Id: I06faa0a1fd0db003cb7ed81328147897386830ff
(cherry picked from commit 12043c549d)
mr11.5
Debora Crescenzo 5 months ago committed by Crescenzo Debora
parent 14f2332d7b
commit b72dd8dab6

@ -41,14 +41,16 @@ export async function cfGetMostRecentDestinationSetByName (params) {
export async function cfLoadSourceSets (subscriberId) { export async function cfLoadSourceSets (subscriberId) {
return getList({ return getList({
resource: 'cfsourcesets', resource: 'cfsourcesets',
params: (subscriberId) ? { subscriber_id: subscriberId } : {} params: (subscriberId) ? { subscriber_id: subscriberId } : {},
all: true
}) })
} }
export async function cfLoadTimeSets (subscriberId) { export async function cfLoadTimeSets (subscriberId) {
return getList({ return getList({
resource: 'cftimesets', resource: 'cftimesets',
params: (subscriberId) ? { subscriber_id: subscriberId } : {} params: (subscriberId) ? { subscriber_id: subscriberId } : {},
all: true
}) })
} }

@ -0,0 +1,33 @@
<template>
<csc-cf-condition-popup
ref="popup"
>
<csc-cf-group-condition-custom
:times="times"
@close="closePopup"
/>
</csc-cf-condition-popup>
</template>
<script>
import CscCfConditionPopup from 'components/call-forwarding/CscCfConditionPopup'
import CscCfGroupConditionCustom from 'components/call-forwarding/CscCfGroupConditionCustom'
export default {
name: 'CscCfConditionPopupCustom',
components: {
CscCfConditionPopup,
CscCfGroupConditionCustom
},
props: {
times: {
type: Object,
required: true
}
},
methods: {
closePopup () {
this.$refs.popup.close()
}
}
}
</script>

@ -0,0 +1,50 @@
<template>
<csc-cf-group-condition
:title="$t('Custom time set')"
icon="today"
:loading="$wait.is('csc-cf-time-set-create')"
v-bind="$attrs"
@close="$emit('close')"
>
<q-list
separator
class="q-pa-md"
>
<q-item
v-for="(date, index) in times"
:key="index"
>
<q-item-section>
<q-item-label overline>
{{ $t('Period') }}
</q-item-label>
<q-item-label>
{{ date.from }}
</q-item-label>
<q-item-label>
{{ date.to }}
</q-item-label>
</q-item-section>
</q-item>
</q-list>
</csc-cf-group-condition>
</template>
<script>
import CscCfGroupCondition from 'components/call-forwarding/CscCfGroupCondition'
export default {
name: 'CscCfGroupConditionOfficeHours',
components: {
CscCfGroupCondition
},
props: {
times: {
type: Object,
required: true
}
},
emits: ['close', 'back']
}
</script>

@ -23,7 +23,7 @@
flat flat
color="negative" color="negative"
icon="delete" icon="delete"
@click="deleteSourceSetEvent" @click="deleteTimeSetEvent"
/> />
<q-btn <q-btn
:label="$t('Save')" :label="$t('Save')"
@ -125,12 +125,14 @@ export default {
} }
this.$emit('close') this.$emit('close')
}, },
async deleteSourceSetEvent () { async deleteTimeSetEvent () {
await this.deleteTimeSet({ await this.deleteTimeSet({
mapping: this.mapping, mapping: this.mapping,
id: this.timeSet.id, id: this.timeSet.id,
subscriberId: this.subscriberId subscriberId: this.subscriberId
}) })
this.$emit('close')
} }
} }
} }

@ -42,7 +42,7 @@
flat flat
color="negative" color="negative"
icon="delete" icon="delete"
@click="deleteSourceSetEvent" @click="deleteTimeSetEvent"
/> />
<q-btn <q-btn
v-if="!invalidDateset" v-if="!invalidDateset"
@ -144,12 +144,14 @@ export default {
} }
this.$emit('close') this.$emit('close')
}, },
async deleteSourceSetEvent () { async deleteTimeSetEvent () {
await this.deleteTimeSet({ await this.deleteTimeSet({
mapping: this.mapping, mapping: this.mapping,
id: this.timeSet.id, id: this.timeSet.id,
subscriberId: this.subscriberId subscriberId: this.subscriberId
}) })
this.$emit('close')
} }
} }
} }

@ -469,15 +469,13 @@ export default {
} }
}, },
async deleteTimeSetEvent () { async deleteTimeSetEvent () {
try { await this.deleteTimeSet({
await this.deleteTimeSet({ mapping: this.mapping,
mapping: this.mapping, id: this.timeSet.id,
id: this.timeSet.id, subscriberId: this.subscriberId
subscriberId: this.subscriberId })
})
} catch (e) { this.$emit('close')
showGlobalError(e)
}
} }
} }
} }

@ -117,6 +117,8 @@ export default {
id: this.timeSet.id, id: this.timeSet.id,
subscriberId: this.subscriberId subscriberId: this.subscriberId
}) })
this.$emit('close')
} }
} }
} }

@ -265,7 +265,7 @@ export default {
}).onOk(async data => { }).onOk(async data => {
this.$wait.start(this.waitIdentifier) this.$wait.start(this.waitIdentifier)
if (this.destinationSet.destinations.length > 1) { if (this.destinationSet.destinations.length > 1) {
await this.removeDestination(payload) await this.triggerRemoveDestination(payload)
this.setAnnouncement() this.setAnnouncement()
} else { } else {
this.$emit('delete-last', payload) this.$emit('delete-last', payload)
@ -273,6 +273,13 @@ export default {
this.$wait.end(this.waitIdentifier) this.$wait.end(this.waitIdentifier)
}) })
}, },
async triggerRemoveDestination (payload) {
try {
await this.removeDestination(payload)
} catch (e) {
showGlobalError(e.message)
}
},
async updateDestinationTimeoutEvent (payload) { async updateDestinationTimeoutEvent (payload) {
this.$wait.start(this.waitIdentifier) this.$wait.start(this.waitIdentifier)
await this.updateDestinationTimeout(payload) await this.updateDestinationTimeout(payload)

@ -144,7 +144,6 @@
> >
{{ $t('office hours are') }} {{ $t('office hours are') }}
<span <span
:class="clickableClasses" :class="clickableClasses"
> >
<q-icon <q-icon
@ -161,12 +160,15 @@
/> />
</span> </span>
</template> </template>
<span <template v-else>
v-else <span :class="clickableClasses">
:class="clickableClasses" {{ $t('Custom time set') }}
> <csc-cf-condition-popup-custom
{{ $filters.timeSetTimes(timeSet.times) }} data-cy="csc-condtion-custom"
</span> :times="$filters.timeSetTimes(timeSet.times)"
/>
</span>
</template>
</template> </template>
<template <template
v-if="!sourceSet || !timeSet" v-if="!sourceSet || !timeSet"
@ -365,9 +367,10 @@ import CscMoreMenu from 'components/CscMoreMenu'
import CscPopupMenuItemDelete from 'components/CscPopupMenuItemDelete' import CscPopupMenuItemDelete from 'components/CscPopupMenuItemDelete'
import CscPopupMenuItem from 'components/CscPopupMenuItem' import CscPopupMenuItem from 'components/CscPopupMenuItem'
import CscCfConditionPopupAll from 'components/call-forwarding/CscCfConditionPopupAll' import CscCfConditionPopupAll from 'components/call-forwarding/CscCfConditionPopupAll'
import CscCfConditionPopupDate from 'components/call-forwarding/CscCfConditionPopupDate'
import CscCfConditionPopupCallFrom from 'components/call-forwarding/CscCfConditionPopupCallFrom' import CscCfConditionPopupCallFrom from 'components/call-forwarding/CscCfConditionPopupCallFrom'
import CscCfConditionPopupCallNotFrom from 'components/call-forwarding/CscCfConditionPopupCallNotFrom' import CscCfConditionPopupCallNotFrom from 'components/call-forwarding/CscCfConditionPopupCallNotFrom'
import CscCfConditionPopupCustom from 'components/call-forwarding/CscCfConditionPopupCustom'
import CscCfConditionPopupDate from 'components/call-forwarding/CscCfConditionPopupDate'
import CscCfConditionPopupDateRange from 'components/call-forwarding/CscCfConditionPopupDateRange' import CscCfConditionPopupDateRange from 'components/call-forwarding/CscCfConditionPopupDateRange'
import CscCfConditionPopupWeekdays from 'components/call-forwarding/CscCfConditionPopupWeekdays' import CscCfConditionPopupWeekdays from 'components/call-forwarding/CscCfConditionPopupWeekdays'
import CscCfConditionPopupOfficeHours from 'components/call-forwarding/CscCfConditionPopupOfficeHours' import CscCfConditionPopupOfficeHours from 'components/call-forwarding/CscCfConditionPopupOfficeHours'
@ -375,6 +378,7 @@ import destination from 'src/mixins/destination'
export default { export default {
name: 'CscCfGroupTitle', name: 'CscCfGroupTitle',
components: { components: {
CscCfConditionPopupCustom,
CscCfConditionPopupOfficeHours, CscCfConditionPopupOfficeHours,
CscCfConditionPopupWeekdays, CscCfConditionPopupWeekdays,
CscCfConditionPopupDateRange, CscCfConditionPopupDateRange,

@ -109,7 +109,7 @@ export default {
props: { props: {
id: { id: {
type: String, type: String,
default: '' required: true
} }
}, },
data () { data () {
@ -146,8 +146,8 @@ export default {
return null return null
} }
}, },
mounted () { async mounted () {
this.loadMappingsFull(this.id) await this.loadMappingsFull(this.id)
}, },
methods: { methods: {
...mapActions('callForwarding', [ ...mapActions('callForwarding', [

@ -34,6 +34,25 @@ export function getDayNameByNumber (dayNumber, isShortName = false) {
return isShortName ? daysShortNamesMap[dayNumber] : daysNamesMap[dayNumber] return isShortName ? daysShortNamesMap[dayNumber] : daysNamesMap[dayNumber]
} }
export function getMonthNameByNumber (monthNumber) {
const monthsNamesMap = [
i18n.global.tc('January'),
i18n.global.tc('February'),
i18n.global.tc('March'),
i18n.global.tc('April'),
i18n.global.tc('May'),
i18n.global.tc('June'),
i18n.global.tc('July'),
i18n.global.tc('August'),
i18n.global.tc('September'),
i18n.global.tc('October'),
i18n.global.tc('November'),
i18n.global.tc('December')
]
return monthsNamesMap[monthNumber]
}
export function timeSetDateExact (times) { export function timeSetDateExact (times) {
return times[0].year + '/' + times[0].month + '/' + times[0].mday return times[0].year + '/' + times[0].month + '/' + times[0].mday
} }
@ -73,6 +92,67 @@ export function timeSetOfficeHoursSameTime (times) {
return weekdaysStr return weekdaysStr
} }
export function timeSetTimes () { export function timeSetTimes (timeSets) {
return '...' return timeSets.map((timeSet) => {
const timeSetMap = createTimeSetMap(timeSet)
const from = formatTimeSetValues(timeSetMap, 'from')
const to = formatTimeSetValues(timeSetMap, 'to')
return {
from: formatTimeString(from),
to: formatTimeString(to)
}
})
}
function createTimeSetMap (timeSet) {
const timeSetMap = {
hour: { from: null, to: null },
mday: { from: null, to: null },
minute: { from: null, to: null },
month: { from: null, to: null },
wday: { from: null, to: null },
year: { from: null, to: null }
}
Object.keys(timeSet).forEach((key) => {
// 1. Case: not set
if (timeSet[key] === null) {
timeSetMap[key] = { from: null, to: null }
// 2. Case: range
} else if (timeSet[key].includes('-')) {
const [from, to] = timeSet[key].split('-')
timeSetMap[key] = { from, to }
// 3. Case: single value
} else {
timeSetMap[key] = { from: timeSet[key], to: null }
}
})
return timeSetMap
}
function formatTimeSetValues (timeSetMap, type) {
const defaultTime = '00'
const defaultDay = 'DD'
const defaultMonth = 'MM'
const defaultYear = 'YYYY'
return {
year: timeSetMap.year[type] || defaultYear,
month: getMonthNameByNumber(timeSetMap.month[type]) || defaultMonth,
wDay: getDayNameByNumber(timeSetMap.wday[type]) ? `${getDayNameByNumber(timeSetMap.wday[type])},` : '',
mDay: timeSetMap.mday[type] || defaultDay,
hour: formatTime(timeSetMap.hour[type]) || defaultTime,
minutes: formatTime(timeSetMap.minute[type]) || defaultTime
}
}
function formatTimeString (timeSetValues) {
return `${timeSetValues.mDay} ${timeSetValues.month} ${timeSetValues.year}, ${timeSetValues.wDay} ${timeSetValues.hour}:${timeSetValues.minutes}`
}
function formatTime (time) {
return (time !== null && time < 10) ? `0${time}` : time
} }

@ -1,4 +1,5 @@
// ---- 1. Implementation for Times ranges and day of the week ----
// ------------------------------------------
/* /*
humanReadableTimeset = [{ humanReadableTimeset = [{
weekday: 1..7, weekday: 1..7,
@ -72,7 +73,7 @@ export function validateHumanTimesets (hTimeset) {
/** /**
* Function resort timesets by "weekday" and "from" and combines closest timesets or duplicates * Function resort timesets by "weekday" and "from" and combines closest timesets or duplicates
* Important! Before use this function please validate you timeses for correctness. * Important! Before use this function please validate you timesets for correctness.
* @param hTimeset {humanReadableTimeset} * @param hTimeset {humanReadableTimeset}
* @returns {humanReadableTimeset} * @returns {humanReadableTimeset}
*/ */
@ -289,7 +290,11 @@ export function validateKamailioRange (kamailioRangeStr = '', minValue, maxValue
} }
} }
} }
/**
* Validates Kamailio Timesets with day of week to human readable format
* @param kTimeset {Array} - Kamailio timeset with day of the week, hour and minute
* throws {Error} - if the Kamailio timeset has invalid format
*/
export function validateKamailioTimesets (kTimeset) { export function validateKamailioTimesets (kTimeset) {
kTimeset.forEach(timesetItem => { kTimeset.forEach(timesetItem => {
let { wday, hour, minute } = timesetItem let { wday, hour, minute } = timesetItem
@ -318,11 +323,16 @@ export function validateKamailioTimesets (kTimeset) {
}) })
} }
/**
* Converts Kamailio timeset with day of week to human readable format
* @param kTimeset {Array} - Kamailio timeset with day of the week, hour and minute
* retuns {Array} - human readable timeset with weekday, from and to
*/
export function kamailioTimesetToHuman (kTimeset = []) { export function kamailioTimesetToHuman (kTimeset = []) {
validateKamailioTimesets(kTimeset) validateKamailioTimesets(kTimeset)
// convert Kamailio timeset into Human readable format // convert Kamailio timeset into human readable format
const hTimesetRaw = kTimeset.map(timesetItem => { const hTimesetRaw = kTimeset.map((timesetItem) => {
let { wday, hour, minute } = timesetItem let { wday, hour, minute } = timesetItem
hour = getAsTrimmedString(hour) hour = getAsTrimmedString(hour)
minute = getAsTrimmedString(minute) minute = getAsTrimmedString(minute)
@ -378,7 +388,7 @@ export function kamailioTimesetToHuman (kTimeset = []) {
return res return res
} }
// ---- implementation for date ranges ---- // ---- 2. Implementation for date ranges ----
// ------------------------------------------ // ------------------------------------------
/* /*
@ -672,7 +682,11 @@ export function humanDatesetToKamailio (hDateset = []) {
return kamailioDateset return kamailioDateset
} }
/**
* Validates Kamailio Datesets Ranges (Year, Month, Day)
* @param kDateset {Array} - Kamailio Dateset (Year, Month, Day)
* throws {Error} - if the Kamailio dateset has invalid format
*/
export function validateKamailioDatesets (kDateset) { export function validateKamailioDatesets (kDateset) {
kDateset.forEach(datesetItem => { kDateset.forEach(datesetItem => {
let { year, month, mday } = datesetItem let { year, month, mday } = datesetItem
@ -700,12 +714,16 @@ export function validateKamailioDatesets (kDateset) {
}) })
}) })
} }
/**
* Converts Kamailio Dateset to human readable Date Range format
* @param kDateset {Date} - Kamaillio Dateset with Year, Month and Day
* retun {Array} - human readable data range with from and to year, month and day.
*/
export function kamailioDatesetToHuman (kDateset = []) { export function kamailioDatesetToHuman (kDateset = []) {
validateKamailioDatesets(kDateset) validateKamailioDatesets(kDateset)
// convert Kamailio dateset into Human readable format // convert Kamailio dateset into human readable format
const hDatesetRaw = kDateset.map(datesetItem => { const hDatesetRaw = kDateset.map((datesetItem) => {
let { year, month, mday } = datesetItem let { year, month, mday } = datesetItem
year = getAsTrimmedString(year) year = getAsTrimmedString(year)
month = getAsTrimmedString(month) month = getAsTrimmedString(month)

@ -47,8 +47,10 @@
"An error occured while trying to unassign the speed dial slot. Please try again": "Kurzwahl-Eintrag konnte nicht geändert werden. Bitte erneut versuchen", "An error occured while trying to unassign the speed dial slot. Please try again": "Kurzwahl-Eintrag konnte nicht geändert werden. Bitte erneut versuchen",
"Application": "Anwendung", "Application": "Anwendung",
"Apps": "Apps", "Apps": "Apps",
"April": "April",
"Assigned slot {slot}": "Zugewiesene Kurzwahl {slot}", "Assigned slot {slot}": "Zugewiesene Kurzwahl {slot}",
"Attach voicemail to email notification": "Voicemail als Anhang in E-Mail-Benachrichtigung", "Attach voicemail to email notification": "Voicemail als Anhang in E-Mail-Benachrichtigung",
"August": "August",
"Auto Attendant": "Anrufmenü", "Auto Attendant": "Anrufmenü",
"Block Incoming": "Eingehende Anrufe blockieren", "Block Incoming": "Eingehende Anrufe blockieren",
"Block Incoming/Outgoing": "Ein-/Ausgehende Anrufe blockieren", "Block Incoming/Outgoing": "Ein-/Ausgehende Anrufe blockieren",
@ -127,12 +129,15 @@
"Custom Announcement": "Benutzerdefinierte Ansage", "Custom Announcement": "Benutzerdefinierte Ansage",
"Custom Announcements": "Individuelle Ansagen", "Custom Announcements": "Individuelle Ansagen",
"Custom sound": "Benutzerdefinierter Sound", "Custom sound": "Benutzerdefinierter Sound",
"Custom time set": "Custom time set",
"Custom time sets": "Custom time sets",
"Customer Details": "Kunden-Details", "Customer Details": "Kunden-Details",
"Customer Phonebook": "Customer Phonebook", "Customer Phonebook": "Customer Phonebook",
"Daily": "Täglich", "Daily": "Täglich",
"Dashboard": "Übersicht", "Dashboard": "Übersicht",
"Data is in the clipboard": "Daten wurden in die Zwischenablage kopiert", "Data is in the clipboard": "Daten wurden in die Zwischenablage kopiert",
"Data loading error": "Fehler beim Laden von Daten", "Data loading error": "Fehler beim Laden von Daten",
"December": "Dezember",
"Default": "Standard", "Default": "Standard",
"Default sound": "Standard-Sound", "Default sound": "Standard-Sound",
"Default sound set for all seats and groups": "Standard-Sound-Set für alle Nebenstellen und Gruppen", "Default sound set for all seats and groups": "Standard-Sound-Set für alle Nebenstellen und Gruppen",
@ -176,6 +181,7 @@
"End time": "Endzeit", "End time": "Endzeit",
"English": "Deutsch", "English": "Deutsch",
"Enter a number to dial": "Geben Sie eine Telefonnummer zum Anwählen an", "Enter a number to dial": "Geben Sie eine Telefonnummer zum Anwählen an",
"Entity belongs to admin": "Diese Einheit gehört dem Admin",
"Expires": "Läuft aus", "Expires": "Läuft aus",
"Extension": "Durchwahl", "Extension": "Durchwahl",
"Extension Settings": "Erweiterungseinstellungen", "Extension Settings": "Erweiterungseinstellungen",
@ -185,6 +191,7 @@
"Fax to mail and sendfax": "„Fax to Mail“ und „Sendfax“", "Fax to mail and sendfax": "„Fax to Mail“ und „Sendfax“",
"Fax2Mail": "Fax2Mail", "Fax2Mail": "Fax2Mail",
"Faxes": "Faxe", "Faxes": "Faxe",
"February": "Februar",
"File": "Datei", "File": "Datei",
"File Type": "Dateityp", "File Type": "Dateityp",
"Filter": "Filtern", "Filter": "Filtern",
@ -251,8 +258,11 @@
"Input a valid phone number": "Geben Sie eine gültige Telefonnummer ein", "Input a valid phone number": "Geben Sie eine gültige Telefonnummer ein",
"Interval when the secret key is automatically renewed.": "Zeitraum, nach dem der Geheimschlüssel automatisch erneuert wird.", "Interval when the secret key is automatically renewed.": "Zeitraum, nach dem der Geheimschlüssel automatisch erneuert wird.",
"Italian": "Italienisch", "Italian": "Italienisch",
"January": "Januar",
"Join conference": "Konferenz beitreten", "Join conference": "Konferenz beitreten",
"Join conference with name": "Konferenz beitreten mit Name", "Join conference with name": "Konferenz beitreten mit Name",
"July": "Juli",
"June": "Juni",
"Lamp/Key": "Lampe/Taste", "Lamp/Key": "Lampe/Taste",
"Lamps/Keys": "Lampen/Tasten", "Lamps/Keys": "Lampen/Tasten",
"Language": "Sprache", "Language": "Sprache",
@ -272,8 +282,10 @@
"Manager Secretary": "Geschäftsführungssekretariat", "Manager Secretary": "Geschäftsführungssekretariat",
"Manager Secretary feature": "Manager Sekretär Funktion", "Manager Secretary feature": "Manager Sekretär Funktion",
"ManagerSecretary": "Geschäftsführungssekretariat", "ManagerSecretary": "Geschäftsführungssekretariat",
"March": "März",
"Maximum allowed extension is {max}": "Die maximal zulässige Länge der Durchwahl ist {max}", "Maximum allowed extension is {max}": "Die maximal zulässige Länge der Durchwahl ist {max}",
"Maximum calls in queue": "Maximale Anzahl an Anrufen in der Warteschlange", "Maximum calls in queue": "Maximale Anzahl an Anrufen in der Warteschlange",
"May": "Mai",
"Me": "Ich", "Me": "Ich",
"Messages": "Nachrichten", "Messages": "Nachrichten",
"Minimum allowed extension is {min}": "Die minimal zulässige Länge der Durchwahlnummer ist {min}", "Minimum allowed extension is {min}": "Die minimal zulässige Länge der Durchwahlnummer ist {min}",
@ -327,10 +339,12 @@
"No speed dials found": "Keine Kurzwahl gefunden", "No speed dials found": "Keine Kurzwahl gefunden",
"Normal": "Normal", "Normal": "Normal",
"Not modified yet": "Bisher nicht geändert", "Not modified yet": "Bisher nicht geändert",
"November": "November",
"Number": "Nummer", "Number": "Nummer",
"Number list": "Nummernliste", "Number list": "Nummernliste",
"Number list name": "Name der Nummernliste", "Number list name": "Name der Nummernliste",
"Numbers": "Nummern", "Numbers": "Nummern",
"October": "Oktober",
"Office Hours Announcement": "Bürozeiten Ansage", "Office Hours Announcement": "Bürozeiten Ansage",
"On weekdays": "An Werktagen", "On weekdays": "An Werktagen",
"Only incoming calls from listed numbers are allowed": "Es sind nur eingehende Anrufe von aufgelisteten Nummern erlaubt", "Only incoming calls from listed numbers are allowed": "Es sind nur eingehende Anrufe von aufgelisteten Nummern erlaubt",
@ -351,6 +365,7 @@
"Password confirm": "Passwort bestätigen", "Password confirm": "Passwort bestätigen",
"Password is not strong enough": "Passwort ist nicht sicher genug", "Password is not strong enough": "Passwort ist nicht sicher genug",
"Passwords must be equal": "Passwörter müssen übereinstimmen", "Passwords must be equal": "Passwörter müssen übereinstimmen",
"Period": "Period",
"Phone model": "Telefonmodell", "Phone model": "Telefonmodell",
"Phone number": "Rufnummer", "Phone number": "Rufnummer",
"Pilot": "Hauptteilnehmer", "Pilot": "Hauptteilnehmer",
@ -448,6 +463,7 @@
"Send": "Senden", "Send": "Senden",
"Send Fax": "Sende Fax", "Send Fax": "Sende Fax",
"Sending fax completed successfully.": "Fax wurde erfolgreich gesendet.", "Sending fax completed successfully.": "Fax wurde erfolgreich gesendet.",
"September": "September",
"Serial Ringing": "Serielles Klingeln", "Serial Ringing": "Serielles Klingeln",
"Session expired, please login again": "Sitzung abgelaufen, bitte erneut anmelden", "Session expired, please login again": "Sitzung abgelaufen, bitte erneut anmelden",
"Set your Extension settings": "Legen Sie Ihre Erweiterungseinstellungen fest", "Set your Extension settings": "Legen Sie Ihre Erweiterungseinstellungen fest",

@ -45,8 +45,10 @@
"An error occured while trying to send the fax. Please try again": "An error occured while trying to send the fax. Please try again", "An error occured while trying to send the fax. Please try again": "An error occured while trying to send the fax. Please try again",
"An error occured while trying to unassign the speed dial slot. Please try again": "An error occured while trying to unassign the speed dial slot. Please try again", "An error occured while trying to unassign the speed dial slot. Please try again": "An error occured while trying to unassign the speed dial slot. Please try again",
"Apps": "Apps", "Apps": "Apps",
"April": "April",
"Assigned slot {slot}": "Assigned slot {slot}", "Assigned slot {slot}": "Assigned slot {slot}",
"Attach voicemail to email notification": "Attach voicemail to email notification", "Attach voicemail to email notification": "Attach voicemail to email notification",
"August": "August",
"Auto Attendant": "Auto Attendant", "Auto Attendant": "Auto Attendant",
"Block Incoming": "Block Incoming", "Block Incoming": "Block Incoming",
"Block Incoming/Outgoing": "Block Incoming/Outgoing", "Block Incoming/Outgoing": "Block Incoming/Outgoing",
@ -118,11 +120,14 @@
"Custom Announcement": "Custom Announcement", "Custom Announcement": "Custom Announcement",
"Custom Announcements": "Custom Announcements", "Custom Announcements": "Custom Announcements",
"Custom sound": "Custom sound", "Custom sound": "Custom sound",
"Custom time set": "Custom time set",
"Custom time sets": "Custom time sets",
"Customer Details": "Customer Details", "Customer Details": "Customer Details",
"Daily": "Daily", "Daily": "Daily",
"Dashboard": "Dashboard", "Dashboard": "Dashboard",
"Data is in the clipboard": "Data is in the clipboard", "Data is in the clipboard": "Data is in the clipboard",
"Data loading error": "Data loading error", "Data loading error": "Data loading error",
"December": "December",
"Default": "Default", "Default": "Default",
"Default sound": "Default sound", "Default sound": "Default sound",
"Default sound set for all seats and groups": "Default sound set for all seats and groups", "Default sound set for all seats and groups": "Default sound set for all seats and groups",
@ -162,6 +167,7 @@
"End time": "End time", "End time": "End time",
"English": "English", "English": "English",
"Enter a number to dial": "Enter a number to dial", "Enter a number to dial": "Enter a number to dial",
"Entity belongs to admin": "Entity belongs to admin",
"Expires": "Expires", "Expires": "Expires",
"Extension": "Extension", "Extension": "Extension",
"Extension Settings": "Extension Settings", "Extension Settings": "Extension Settings",
@ -170,6 +176,7 @@
"Fax to mail and sendfax": "Fax to Mail and Sendfax", "Fax to mail and sendfax": "Fax to Mail and Sendfax",
"Fax2Mail": "Fax2Mail", "Fax2Mail": "Fax2Mail",
"Faxes": "Faxes", "Faxes": "Faxes",
"February": "February",
"File": "File", "File": "File",
"File Type": "File Type", "File Type": "File Type",
"Filter": "Filter", "Filter": "Filter",
@ -233,6 +240,9 @@
"Input a valid phone number": "Input a valid phone number", "Input a valid phone number": "Input a valid phone number",
"Interval when the secret key is automatically renewed.": "Interval when the secret key is automatically renewed.", "Interval when the secret key is automatically renewed.": "Interval when the secret key is automatically renewed.",
"Italian": "Italian", "Italian": "Italian",
"January": "January",
"July": "July",
"June": "June",
"Lamp/Key": "Lamp/Key", "Lamp/Key": "Lamp/Key",
"Lamps/Keys": "Lamps/Keys", "Lamps/Keys": "Lamps/Keys",
"Language": "Language", "Language": "Language",
@ -249,8 +259,10 @@
"Mail to Fax": "Mail to Fax", "Mail to Fax": "Mail to Fax",
"Manager Secretary": "Manager Secretary", "Manager Secretary": "Manager Secretary",
"Manager Secretary feature": "Manager Secretary feature", "Manager Secretary feature": "Manager Secretary feature",
"March": "March",
"Maximum allowed extension is {max}": "Maximum allowed extension is {max}", "Maximum allowed extension is {max}": "Maximum allowed extension is {max}",
"Maximum calls in queue": "Maximum calls in queue", "Maximum calls in queue": "Maximum calls in queue",
"May": "May",
"Me": "Me", "Me": "Me",
"Messages": "Messages", "Messages": "Messages",
"Minimum allowed extension is {min}": "Minimum allowed extension is {min}", "Minimum allowed extension is {min}": "Minimum allowed extension is {min}",
@ -299,10 +311,12 @@
"No speed dials found": "No speed dials found", "No speed dials found": "No speed dials found",
"Normal": "Normal", "Normal": "Normal",
"Not modified yet": "Not modified yet", "Not modified yet": "Not modified yet",
"November": "November",
"Number": "Number", "Number": "Number",
"Number list": "Number list", "Number list": "Number list",
"Number list name": "Number list name", "Number list name": "Number list name",
"Numbers": "Numbers", "Numbers": "Numbers",
"October": "October",
"Office Hours Announcement": "Office Hours Announcement", "Office Hours Announcement": "Office Hours Announcement",
"On weekdays": "On weekdays", "On weekdays": "On weekdays",
"Only incoming calls from listed numbers are allowed": "Only incoming calls from listed numbers are allowed", "Only incoming calls from listed numbers are allowed": "Only incoming calls from listed numbers are allowed",
@ -321,6 +335,7 @@
"Password confirm": "Password confirm", "Password confirm": "Password confirm",
"Password is not strong enough": "Password is not strong enough", "Password is not strong enough": "Password is not strong enough",
"Passwords must be equal": "Passwords must be equal", "Passwords must be equal": "Passwords must be equal",
"Period": "Period",
"Phone model": "Phone model", "Phone model": "Phone model",
"Phone number": "Phone number", "Phone number": "Phone number",
"Pilot": "Pilot", "Pilot": "Pilot",
@ -412,6 +427,7 @@
"Send": "Send", "Send": "Send",
"Send Fax": "Send Fax", "Send Fax": "Send Fax",
"Sending fax completed successfully.": "Sending fax completed successfully.", "Sending fax completed successfully.": "Sending fax completed successfully.",
"September": "September",
"Serial Ringing": "Serial Ringing", "Serial Ringing": "Serial Ringing",
"Session expired, please login again": "Session expired, please login again", "Session expired, please login again": "Session expired, please login again",
"Set your Extension settings": "Set your Extension settings", "Set your Extension settings": "Set your Extension settings",

@ -47,8 +47,10 @@
"An error occured while trying to unassign the speed dial slot. Please try again": "Se produjo un error al intentar remover la ranura de marcación rápida. Por favor, inténtelo nuevamente.", "An error occured while trying to unassign the speed dial slot. Please try again": "Se produjo un error al intentar remover la ranura de marcación rápida. Por favor, inténtelo nuevamente.",
"Application": "Aplicación", "Application": "Aplicación",
"Apps": "Aplicaciones", "Apps": "Aplicaciones",
"April": "Abril",
"Assigned slot {slot}": "Ranura {slot} asignada", "Assigned slot {slot}": "Ranura {slot} asignada",
"Attach voicemail to email notification": "Adjuntar correo de voz a notificación de correo electrónico", "Attach voicemail to email notification": "Adjuntar correo de voz a notificación de correo electrónico",
"August": "Agosto",
"Auto Attendant": "Asistente Automático", "Auto Attendant": "Asistente Automático",
"Block Incoming": "Bloquear Entrantes", "Block Incoming": "Bloquear Entrantes",
"Block Incoming/Outgoing": "Bloquear Entrantes/Salientes", "Block Incoming/Outgoing": "Bloquear Entrantes/Salientes",
@ -127,12 +129,15 @@
"Custom Announcement": "Anuncio Personalizado", "Custom Announcement": "Anuncio Personalizado",
"Custom Announcements": "Anuncios Personalizados", "Custom Announcements": "Anuncios Personalizados",
"Custom sound": "Sonido personalizado", "Custom sound": "Sonido personalizado",
"Custom time set": "Custom time set",
"Custom time sets": "Custom time sets",
"Customer Details": "Detalles de cliente", "Customer Details": "Detalles de cliente",
"Customer Phonebook": "Customer Phonebook", "Customer Phonebook": "Customer Phonebook",
"Daily": "Diariamente", "Daily": "Diariamente",
"Dashboard": "Tablero", "Dashboard": "Tablero",
"Data is in the clipboard": "Data is in the clipboard", "Data is in the clipboard": "Data is in the clipboard",
"Data loading error": "Data loading error", "Data loading error": "Data loading error",
"December": "Diciembre",
"Default": "Predeterminado", "Default": "Predeterminado",
"Default sound": "Sonido predeterminado", "Default sound": "Sonido predeterminado",
"Default sound set for all seats and groups": "Conjunto de sonido predeterminado para todos los asientos y grupos", "Default sound set for all seats and groups": "Conjunto de sonido predeterminado para todos los asientos y grupos",
@ -176,6 +181,7 @@
"End time": "Hora de finalización", "End time": "Hora de finalización",
"English": "Español", "English": "Español",
"Enter a number to dial": "Introduzca un número para marcar", "Enter a number to dial": "Introduzca un número para marcar",
"Entity belongs to admin": "Esta entidad pertenece a admin",
"Expires": "Expira", "Expires": "Expira",
"Extension": "Extensión", "Extension": "Extensión",
"Extension Settings": "Configuración de la extensión", "Extension Settings": "Configuración de la extensión",
@ -185,6 +191,7 @@
"Fax to mail and sendfax": "Fax a Correo y Envío de Fax", "Fax to mail and sendfax": "Fax a Correo y Envío de Fax",
"Fax2Mail": "Fax2Mail", "Fax2Mail": "Fax2Mail",
"Faxes": "Faxes", "Faxes": "Faxes",
"February": "Febrero",
"File": "Archivo", "File": "Archivo",
"File Type": "Tipos de archivo", "File Type": "Tipos de archivo",
"Filter": "Filtrar", "Filter": "Filtrar",
@ -251,8 +258,11 @@
"Input a valid phone number": "Ingrese un número de teléfono válido", "Input a valid phone number": "Ingrese un número de teléfono válido",
"Interval when the secret key is automatically renewed.": "Intervalo en el que la clave secreta se renueva automáticamente.", "Interval when the secret key is automatically renewed.": "Intervalo en el que la clave secreta se renueva automáticamente.",
"Italian": "Italiano", "Italian": "Italiano",
"January": "Enero",
"Join conference": "Unirse a la conferencia", "Join conference": "Unirse a la conferencia",
"Join conference with name": "Unirse a la conferencia con nombre", "Join conference with name": "Unirse a la conferencia con nombre",
"July": "Julio",
"June": "Junio",
"Lamp/Key": "Indicador/Tecla", "Lamp/Key": "Indicador/Tecla",
"Lamps/Keys": "Indicadores/Teclas", "Lamps/Keys": "Indicadores/Teclas",
"Language": "Idioma", "Language": "Idioma",
@ -273,8 +283,10 @@
"Manager Secretary": "Jefe-Asistente", "Manager Secretary": "Jefe-Asistente",
"Manager Secretary feature": "Manager Secretary feature", "Manager Secretary feature": "Manager Secretary feature",
"ManagerSecretary": "Jefe-Asistente", "ManagerSecretary": "Jefe-Asistente",
"March": "Marzo",
"Maximum allowed extension is {max}": "La extensión máxima permitida es {max}", "Maximum allowed extension is {max}": "La extensión máxima permitida es {max}",
"Maximum calls in queue": "Máximo de llamadas en cola", "Maximum calls in queue": "Máximo de llamadas en cola",
"May": "Mayo",
"Me": "Me", "Me": "Me",
"Messages": "Messages", "Messages": "Messages",
"Minimum allowed extension is {min}": "La extensión mínima permitida es {min}", "Minimum allowed extension is {min}": "La extensión mínima permitida es {min}",
@ -326,10 +338,12 @@
"No speed dials found": "No se encontraron marcaciones rápidas", "No speed dials found": "No se encontraron marcaciones rápidas",
"Normal": "Normal", "Normal": "Normal",
"Not modified yet": "No se ha modificado todavía", "Not modified yet": "No se ha modificado todavía",
"November": "Noviembre",
"Number": "Número", "Number": "Número",
"Number list": "Lista de números", "Number list": "Lista de números",
"Number list name": "Nombre de la lista de números", "Number list name": "Nombre de la lista de números",
"Numbers": "Números", "Numbers": "Números",
"October": "Octubre",
"Office Hours Announcement": "Office Hours Announcement", "Office Hours Announcement": "Office Hours Announcement",
"On weekdays": "En días de la semana", "On weekdays": "En días de la semana",
"Only incoming calls from listed numbers are allowed": "Permitir solo los números listados", "Only incoming calls from listed numbers are allowed": "Permitir solo los números listados",
@ -350,6 +364,7 @@
"Password confirm": "Password confirm", "Password confirm": "Password confirm",
"Password is not strong enough": "La contraseña no es lo suficientemente fuerte", "Password is not strong enough": "La contraseña no es lo suficientemente fuerte",
"Passwords must be equal": "Las contraseñas deben ser iguales", "Passwords must be equal": "Las contraseñas deben ser iguales",
"Period": "Period",
"Phone model": "Modelo de teléfono", "Phone model": "Modelo de teléfono",
"Phone number": "Número de teléfono", "Phone number": "Número de teléfono",
"Pilot": "Piloto", "Pilot": "Piloto",
@ -448,6 +463,7 @@
"Send": "Enviar", "Send": "Enviar",
"Send Fax": "Enviar Fax", "Send Fax": "Enviar Fax",
"Sending fax completed successfully.": "Envío de fax completado exitosamente.", "Sending fax completed successfully.": "Envío de fax completado exitosamente.",
"September": "Septiembre",
"Serial Ringing": "Llamada en serie", "Serial Ringing": "Llamada en serie",
"Session expired, please login again": "Session expired, please login again", "Session expired, please login again": "Session expired, please login again",
"Session language successfully changed": "Idioma de la sesión modificado exitosamente.", "Session language successfully changed": "Idioma de la sesión modificado exitosamente.",

@ -47,8 +47,10 @@
"An error occured while trying to unassign the speed dial slot. Please try again": "Une erreur est survenue lors de la séassignation de l'emplacement de numérotation abrégée. Veuillez réessayer", "An error occured while trying to unassign the speed dial slot. Please try again": "Une erreur est survenue lors de la séassignation de l'emplacement de numérotation abrégée. Veuillez réessayer",
"Application": "Application", "Application": "Application",
"Apps": "Apps", "Apps": "Apps",
"April": "Avril",
"Assigned slot {slot}": "Emplacement {slot} attribué", "Assigned slot {slot}": "Emplacement {slot} attribué",
"Attach voicemail to email notification": "Joindre le message vocal à l'e-mail de notification", "Attach voicemail to email notification": "Joindre le message vocal à l'e-mail de notification",
"August": "Août",
"Auto Attendant": "Association auto", "Auto Attendant": "Association auto",
"Block Incoming": "Bloquer les appels entrants", "Block Incoming": "Bloquer les appels entrants",
"Block Incoming/Outgoing": "Bloquer les entrants/sortants", "Block Incoming/Outgoing": "Bloquer les entrants/sortants",
@ -127,12 +129,15 @@
"Custom Announcement": "Annonce personnalisée", "Custom Announcement": "Annonce personnalisée",
"Custom Announcements": "Annonces personnalisées", "Custom Announcements": "Annonces personnalisées",
"Custom sound": "Son personnalisé", "Custom sound": "Son personnalisé",
"Custom time set": "Custom time set",
"Custom time sets": "Custom time sets",
"Customer Details": "Détails du client", "Customer Details": "Détails du client",
"Customer Phonebook": "Annuaire du client", "Customer Phonebook": "Annuaire du client",
"Daily": "Quotidien", "Daily": "Quotidien",
"Dashboard": "Tableau de bord", "Dashboard": "Tableau de bord",
"Data is in the clipboard": "Données dans le presse-papiers", "Data is in the clipboard": "Données dans le presse-papiers",
"Data loading error": "Data loading error", "Data loading error": "Data loading error",
"December": "Décembre",
"Default": "Défaut", "Default": "Défaut",
"Default sound": "Son par défaut", "Default sound": "Son par défaut",
"Default sound set for all seats and groups": "Son par défaut défini pour tous les sièges et groupes", "Default sound set for all seats and groups": "Son par défaut défini pour tous les sièges et groupes",
@ -176,6 +181,7 @@
"End time": "Date de fin", "End time": "Date de fin",
"English": "Français", "English": "Français",
"Enter a number to dial": "Enter a number to dial", "Enter a number to dial": "Enter a number to dial",
"Entity belongs to admin": "Cette entité appartient à ladministrateur",
"Expires": "Expire", "Expires": "Expire",
"Extension": "Extension", "Extension": "Extension",
"Extension Settings": "Paramètres des extensions", "Extension Settings": "Paramètres des extensions",
@ -185,6 +191,7 @@
"Fax to mail and sendfax": "Fax à E-mail et Sendfax", "Fax to mail and sendfax": "Fax à E-mail et Sendfax",
"Fax2Mail": "Fax2Mail", "Fax2Mail": "Fax2Mail",
"Faxes": "Télécopies", "Faxes": "Télécopies",
"February": "Février",
"File": "Fichier", "File": "Fichier",
"File Type": "Type de fichier", "File Type": "Type de fichier",
"Filter": "Filtrer", "Filter": "Filtrer",
@ -251,8 +258,11 @@
"Input a valid phone number": "Saisissez un numéro de téléphone valide", "Input a valid phone number": "Saisissez un numéro de téléphone valide",
"Interval when the secret key is automatically renewed.": "Intervalle où la clé secrète est automatiquement renouvelée.", "Interval when the secret key is automatically renewed.": "Intervalle où la clé secrète est automatiquement renouvelée.",
"Italian": "Italien", "Italian": "Italien",
"January": "Janvier",
"Join conference": "Rejoindre la conférence", "Join conference": "Rejoindre la conférence",
"Join conference with name": "Rejoindre la conférence avec le nom", "Join conference with name": "Rejoindre la conférence avec le nom",
"July": "Juillet",
"June": "Juin",
"Lamp/Key": "Lampe/clé", "Lamp/Key": "Lampe/clé",
"Lamps/Keys": "Lampes/clés", "Lamps/Keys": "Lampes/clés",
"Language": "Langue", "Language": "Langue",
@ -272,8 +282,10 @@
"Manager Secretary": "Manager Secretary", "Manager Secretary": "Manager Secretary",
"Manager Secretary feature": "Manager Secretary feature", "Manager Secretary feature": "Manager Secretary feature",
"ManagerSecretary": "ManagerSecretary", "ManagerSecretary": "ManagerSecretary",
"March": "Mars",
"Maximum allowed extension is {max}": "L'extension maximale autorisée est de {max}", "Maximum allowed extension is {max}": "L'extension maximale autorisée est de {max}",
"Maximum calls in queue": "Nombre maximum d'appels dans la file d'attente", "Maximum calls in queue": "Nombre maximum d'appels dans la file d'attente",
"May": "Mai",
"Me": "Me", "Me": "Me",
"Messages": "Messages", "Messages": "Messages",
"Minimum allowed extension is {min}": "L'extension minimale autorisée est de {min}", "Minimum allowed extension is {min}": "L'extension minimale autorisée est de {min}",
@ -327,10 +339,12 @@
"No speed dials found": "Aucun numéro abrégé trouvé", "No speed dials found": "Aucun numéro abrégé trouvé",
"Normal": "Normal", "Normal": "Normal",
"Not modified yet": "Pas encore modifié", "Not modified yet": "Pas encore modifié",
"November": "Novembre",
"Number": "Numéro", "Number": "Numéro",
"Number list": "Liste de numéros", "Number list": "Liste de numéros",
"Number list name": "Nom de la liste de numéros", "Number list name": "Nom de la liste de numéros",
"Numbers": "Nombres", "Numbers": "Nombres",
"October": "Octobre",
"Office Hours Announcement": "Office Hours Announcement", "Office Hours Announcement": "Office Hours Announcement",
"On weekdays": "Les jours de semaine", "On weekdays": "Les jours de semaine",
"Only incoming calls from listed numbers are allowed": "Seuls les appels entrants provenant des numéros listés sont autorisés", "Only incoming calls from listed numbers are allowed": "Seuls les appels entrants provenant des numéros listés sont autorisés",
@ -351,6 +365,7 @@
"Password confirm": "Password confirm", "Password confirm": "Password confirm",
"Password is not strong enough": "Le mot de passe n'est pas assez fort", "Password is not strong enough": "Le mot de passe n'est pas assez fort",
"Passwords must be equal": "Les mots de passe doivent être égaux", "Passwords must be equal": "Les mots de passe doivent être égaux",
"Period": "Period",
"Phone model": "Modèle du poste", "Phone model": "Modèle du poste",
"Phone number": "Numéro de téléphone", "Phone number": "Numéro de téléphone",
"Pilot": "Pilote", "Pilot": "Pilote",
@ -448,6 +463,7 @@
"Send": "Envoyer", "Send": "Envoyer",
"Send Fax": "Envoyer un fax", "Send Fax": "Envoyer un fax",
"Sending fax completed successfully.": "Le Fax a été envoyé avec succès.", "Sending fax completed successfully.": "Le Fax a été envoyé avec succès.",
"September": "Septembre",
"Serial Ringing": "Sonnerie en série", "Serial Ringing": "Sonnerie en série",
"Session expired, please login again": "Session expired, please login again", "Session expired, please login again": "Session expired, please login again",
"Set your Extension settings": "Définir les paramètres de votre extensions", "Set your Extension settings": "Définir les paramètres de votre extensions",

@ -45,8 +45,10 @@
"An error occured while trying to send the fax. Please try again": "Si è verificato un errore durante l'invio del fax. Si prega di riprovare", "An error occured while trying to send the fax. Please try again": "Si è verificato un errore durante l'invio del fax. Si prega di riprovare",
"An error occured while trying to unassign the speed dial slot. Please try again": "Si è verificato un errore nella cancellazione della selezione rapida. Si prega di riprovare", "An error occured while trying to unassign the speed dial slot. Please try again": "Si è verificato un errore nella cancellazione della selezione rapida. Si prega di riprovare",
"Apps": "Apps", "Apps": "Apps",
"April": "Aprile",
"Assigned slot {slot}": "Slot assegnato: {slot}", "Assigned slot {slot}": "Slot assegnato: {slot}",
"Attach voicemail to email notification": "Allega messaggio vocale all'email di notifica", "Attach voicemail to email notification": "Allega messaggio vocale all'email di notifica",
"August": "Agosto",
"Auto Attendant": "Risponditore Automatico", "Auto Attendant": "Risponditore Automatico",
"Block Incoming": "Blocca entranti", "Block Incoming": "Blocca entranti",
"Block Incoming/Outgoing": "Blocca entranti/uscenti", "Block Incoming/Outgoing": "Blocca entranti/uscenti",
@ -125,12 +127,15 @@
"Custom Announcement": "Custom Announcement", "Custom Announcement": "Custom Announcement",
"Custom Announcements": "Custom Announcements", "Custom Announcements": "Custom Announcements",
"Custom sound": "Audio personalizzato", "Custom sound": "Audio personalizzato",
"Custom time set": "Custom time set",
"Custom time sets": "Custom time sets",
"Customer Details": "Dettagli cliente", "Customer Details": "Dettagli cliente",
"Customer Phonebook": "Rubrica cliente", "Customer Phonebook": "Rubrica cliente",
"Daily": "Giornaliero", "Daily": "Giornaliero",
"Dashboard": "Dashboard", "Dashboard": "Dashboard",
"Data is in the clipboard": "I dati sono negli appunti", "Data is in the clipboard": "I dati sono negli appunti",
"Data loading error": "Errore nel caricamento dei dati", "Data loading error": "Errore nel caricamento dei dati",
"December": "Dicembre",
"Default": "Predefinito", "Default": "Predefinito",
"Default sound": "Audio predefinito", "Default sound": "Audio predefinito",
"Default sound set for all seats and groups": "Set di suoni predefinito per tutte le postazioni e i gruppi", "Default sound set for all seats and groups": "Set di suoni predefinito per tutte le postazioni e i gruppi",
@ -173,6 +178,7 @@
"End time": "End time", "End time": "End time",
"English": "Italiano", "English": "Italiano",
"Enter a number to dial": "Inserisci un numero per chiamare", "Enter a number to dial": "Inserisci un numero per chiamare",
"Entity belongs to admin": "Questa entità appartiene ad admin",
"Expires": "Scade", "Expires": "Scade",
"Extension": "Interno", "Extension": "Interno",
"Extension Settings": "Impostazioni dell'Estensione", "Extension Settings": "Impostazioni dell'Estensione",
@ -182,6 +188,7 @@
"Fax to mail and sendfax": "Fax to mail and sendfax", "Fax to mail and sendfax": "Fax to mail and sendfax",
"Fax2Mail": "Fax2Mail", "Fax2Mail": "Fax2Mail",
"Faxes": "Fax", "Faxes": "Fax",
"February": "Febbraio",
"File": "File", "File": "File",
"File Type": "File Type", "File Type": "File Type",
"Filter": "Filtra", "Filter": "Filtra",
@ -248,7 +255,10 @@
"Input a valid phone number": "Inserire un numero di telefono valido", "Input a valid phone number": "Inserire un numero di telefono valido",
"Interval when the secret key is automatically renewed.": "Interval when the secret key is automatically renewed.", "Interval when the secret key is automatically renewed.": "Interval when the secret key is automatically renewed.",
"Italian": "Italian", "Italian": "Italian",
"January": "Gennaio",
"Join conference with name": "Partecipa alla conferenza con nome", "Join conference with name": "Partecipa alla conferenza con nome",
"July": "Luglio",
"June": "Giugno",
"Lamp/Key": "Lampada/Tasto", "Lamp/Key": "Lampada/Tasto",
"Lamps/Keys": "Lampade/Tasti", "Lamps/Keys": "Lampade/Tasti",
"Language": "Lingua", "Language": "Lingua",
@ -267,8 +277,10 @@
"Mail to Fax": "Mail to Fax", "Mail to Fax": "Mail to Fax",
"Manager Secretary": "Segreteria", "Manager Secretary": "Segreteria",
"Manager Secretary feature": "Manager Secretary feature", "Manager Secretary feature": "Manager Secretary feature",
"March": "Marzo",
"Maximum allowed extension is {max}": "Maximum allowed extension is {max}", "Maximum allowed extension is {max}": "Maximum allowed extension is {max}",
"Maximum calls in queue": "Numero massimo di chiamate in coda", "Maximum calls in queue": "Numero massimo di chiamate in coda",
"May": "Maggio",
"Me": "Me", "Me": "Me",
"Messages": "Messages", "Messages": "Messages",
"Minimum allowed extension is {min}": "Minimum allowed extension is {min}", "Minimum allowed extension is {min}": "Minimum allowed extension is {min}",
@ -320,10 +332,12 @@
"No speed dials found": "Nessuna impostazione di chiamata rapida", "No speed dials found": "Nessuna impostazione di chiamata rapida",
"Normal": "Normale", "Normal": "Normale",
"Not modified yet": "Not modified yet", "Not modified yet": "Not modified yet",
"November": "Novembre",
"Number": "Numero", "Number": "Numero",
"Number list": "Number list", "Number list": "Number list",
"Number list name": "Number list name", "Number list name": "Number list name",
"Numbers": "Numeri", "Numbers": "Numeri",
"October": "Ottobre",
"Office Hours Announcement": "Office Hours Announcement", "Office Hours Announcement": "Office Hours Announcement",
"On weekdays": "Nei giorni feriali", "On weekdays": "Nei giorni feriali",
"Only incoming calls from listed numbers are allowed": "Solo ammesse solo chiamate dai numeri in elenco", "Only incoming calls from listed numbers are allowed": "Solo ammesse solo chiamate dai numeri in elenco",
@ -343,7 +357,14 @@
"Password changed successfully": "Password changed successfully", "Password changed successfully": "Password changed successfully",
"Password confirm": "Password confirm", "Password confirm": "Password confirm",
"Password is not strong enough": "Password is not strong enough", "Password is not strong enough": "Password is not strong enough",
"Passwords must be equal": "Passwords must be equal", "Password is not strong enough, add more digits": "Password is not strong enough, add more digits",
"Password is not strong enough, add more lowercase letters": "Password is not strong enough, add more lowercase letters",
"Password is not strong enough, add more special characters": "Password is not strong enough, add more special characters",
"Password is not strong enough, add more uppercase letters": "Password is not strong enough, add more uppercase letters",
"Password must be at least {max} characters long": "Password must be at least {max} characters long",
"Password must be at least {min} characters long": "Password must be at least {min} characters long",
"Passwords must be equal": "Le passwords devono essere identiche",
"Period": "Period",
"Phone model": "Modello telefono", "Phone model": "Modello telefono",
"Phone number": "Numero di telefono", "Phone number": "Numero di telefono",
"Pilot": "Pilota", "Pilot": "Pilota",
@ -441,6 +462,7 @@
"Send": "Invia", "Send": "Invia",
"Send Fax": "Invia fax", "Send Fax": "Invia fax",
"Sending fax completed successfully.": "Fax inviato correttamente.", "Sending fax completed successfully.": "Fax inviato correttamente.",
"September": "Settembre",
"Serial Ringing": "Chiamata in sequenza", "Serial Ringing": "Chiamata in sequenza",
"Session expired, please login again": "Session expired, please login again", "Session expired, please login again": "Session expired, please login again",
"Set your fax settings": "Set your fax settings", "Set your fax settings": "Set your fax settings",

@ -90,16 +90,12 @@
</template> </template>
<script> <script>
import CscCfGroup from 'components/call-forwarding/CscCfGroup' import CscCfGroup from 'components/call-forwarding/CscCfGroup'
import {
mapActions,
mapState,
mapGetters
} from 'vuex'
import CscPopupMenuItem from 'components/CscPopupMenuItem' import CscPopupMenuItem from 'components/CscPopupMenuItem'
import CscPopupMenu from 'components/CscPopupMenu' import CscPopupMenu from 'components/CscPopupMenu'
import CscSpinner from 'components/CscSpinner' import CscSpinner from 'components/CscSpinner'
import CscCfGroupItemPrimaryNumber from 'components/call-forwarding/CscCfGroupItemPrimaryNumber' import CscCfGroupItemPrimaryNumber from 'components/call-forwarding/CscCfGroupItemPrimaryNumber'
import CscPageSticky from 'components/CscPageSticky' import CscPageSticky from 'components/CscPageSticky'
import { mapActions, mapGetters, mapState } from 'vuex'
export default { export default {
name: 'CscPageCf', name: 'CscPageCf',
components: { components: {

@ -242,6 +242,7 @@
<csc-call-forward-details <csc-call-forward-details
v-else v-else
:id="id" :id="id"
:key="id"
/> />
</csc-page-sticky-tabs> </csc-page-sticky-tabs>
</template> </template>
@ -373,6 +374,13 @@ export default {
} }
}, },
watch: { watch: {
async $route (to) {
if (this.id !== to.params.id) {
this.id = to.params.id
this.selectGroup(this.id)
await this.loadMappingsFull(this.id)
}
},
groupSelected () { groupSelected () {
this.changes = this.getGroupData() this.changes = this.getGroupData()
this.soundSet = this.getSoundSetByGroupId(this.groupSelected.id) this.soundSet = this.getSoundSetByGroupId(this.groupSelected.id)
@ -385,9 +393,9 @@ export default {
} }
} }
}, },
mounted () { async mounted () {
this.selectGroup(this.id) this.selectGroup(this.id)
this.loadMappingsFull(this.id) await this.loadMappingsFull(this.id)
}, },
beforeUnmount () { beforeUnmount () {
this.resetSelectedGroup() this.resetSelectedGroup()

@ -297,6 +297,7 @@
<csc-call-forward-details <csc-call-forward-details
v-else v-else
:id="id" :id="id"
:key="id"
/> />
</csc-page-sticky-tabs> </csc-page-sticky-tabs>
</template> </template>
@ -392,7 +393,14 @@ export default {
'getCurrentCli', 'getCurrentCli',
'getIntraPbx', 'getIntraPbx',
'getSeatUpdateToastMessage', 'getSeatUpdateToastMessage',
'isSeatLoading' 'isSeatLoading',
'isSeatMapByIdEmpty',
'getAnnouncementCfu',
'getAnnouncementCallSetup',
'getAnnouncementToCallee',
'getIgnoreCfWhenHunting',
'getCstaClient',
'getCstaController'
]), ]),
...mapGetters('pbx', [ ...mapGetters('pbx', [
'getExtensionHint', 'getExtensionHint',
@ -499,6 +507,12 @@ export default {
} }
}, },
watch: { watch: {
async $route (to) {
if (this.id !== to.params.id) {
this.id = to.params.id
this.selectSeat(this.id)
}
},
seatSelected () { seatSelected () {
this.soundSet = this.getSoundSetBySeatId(this.seatSelected.id) this.soundSet = this.getSoundSetBySeatId(this.seatSelected.id)
this.loadPreferences(this.seatSelected.id).then((preferences) => { this.loadPreferences(this.seatSelected.id).then((preferences) => {
@ -546,7 +560,11 @@ export default {
} }
}, },
async mounted () { async mounted () {
this.selectSeat(this.id) if (this.isSeatMapByIdEmpty) {
await this.loadSeatListItems()
}
this.selectSeat(this.$route.params.id)
await this.loadAnnouncements() await this.loadAnnouncements()
// await this.getNcosLevelsSubscriber() // await this.getNcosLevelsSubscriber()
await this.getNcosSetSubscriber() await this.getNcosSetSubscriber()
@ -564,6 +582,7 @@ export default {
'setIntraPbx', 'setIntraPbx',
'setMusicOnHold', 'setMusicOnHold',
'setSeatSoundSet', 'setSeatSoundSet',
'loadSeatListItems',
'loadPreferences', 'loadPreferences',
'setCli', 'setCli',
'setNcosSet', 'setNcosSet',

@ -19,14 +19,17 @@ import {
cfUpdateTimeSetWeekdays cfUpdateTimeSetWeekdays
} from 'src/api/call-forwarding' } from 'src/api/call-forwarding'
import { import {
v4 get,
} from 'uuid' getList,
import {
patchReplace, patchReplace,
patchReplaceFull, patchReplaceFull,
post, put, get, getList post,
put
} from 'src/api/common' } from 'src/api/common'
import _ from 'lodash' import _ from 'lodash'
import { i18n } from 'src/boot/i18n'
import { showGlobalError, showGlobalWarning } from 'src/helpers/ui'
import { v4 } from 'uuid'
const DEFAULT_RING_TIMEOUT = 60 const DEFAULT_RING_TIMEOUT = 60
const DEFAULT_PRIORITY = 0 const DEFAULT_PRIORITY = 0
@ -44,19 +47,16 @@ function createDefaultDestination (destination, defaultAnnouncementId) {
return payload return payload
} }
export async function loadMappingsFull ({ dispatch, commit, rootGetters }, subscriberId) { export async function loadMappingsFull ({ dispatch, commit, rootGetters }, id) {
dispatch('wait/start', WAIT_IDENTIFIER, { root: true }) dispatch('wait/start', WAIT_IDENTIFIER, { root: true })
let res = null const subscriberId = id || rootGetters['user/getSubscriberId']
if (subscriberId) { const mappingData = await cfLoadMappingsFull(subscriberId)
res = await cfLoadMappingsFull(subscriberId)
} else {
res = await cfLoadMappingsFull(rootGetters['user/getSubscriberId'])
}
commit('dataSucceeded', { commit('dataSucceeded', {
mappings: res[0], mappings: mappingData[0],
destinationSets: res[1].items, destinationSets: mappingData[1].items,
sourceSets: res[2].items, sourceSets: mappingData[2].items,
timeSets: res[3].items timeSets: mappingData[3].items
}) })
dispatch('wait/end', WAIT_IDENTIFIER, { root: true }) dispatch('wait/end', WAIT_IDENTIFIER, { root: true })
} }
@ -116,7 +116,19 @@ export async function deleteMapping ({ dispatch, commit, state, rootGetters }, p
fieldPath: payload.type, fieldPath: payload.type,
value: updatedMappings value: updatedMappings
}) })
await cfDeleteDestinationSet(payload.destinationset_id)
try {
await cfDeleteDestinationSet(payload.destinationset_id)
} catch (e) {
if (e.code === 404 && e.message === 'Entity \'cfdestinationset\' not found.') {
// This happens when CF was set by Admin therefore current
// csc user doesn't have rights to delete the entity
showGlobalWarning(i18n.global.tc('Entity belongs to admin'))
} else {
showGlobalError(e.message)
}
}
const destinationSets = await cfLoadDestinationSets() const destinationSets = await cfLoadDestinationSets()
commit('dataSucceeded', { commit('dataSucceeded', {
mappings: patchRes, mappings: patchRes,
@ -141,8 +153,8 @@ export async function toggleMapping ({ dispatch, commit, state, rootGetters }, p
dispatch('wait/end', WAIT_IDENTIFIER, { root: true }) dispatch('wait/end', WAIT_IDENTIFIER, { root: true })
} }
export async function updateDestination ({ dispatch, commit, state, rootGetters }, payload) { export async function updateDestination ({ dispatch, commit, state }, payload) {
dispatch('wait/start', WAIT_IDENTIFIER, { root: true }) dispatch('wait/start', 'csc-cf-destination-set-update', { root: true })
const destinations = _.cloneDeep(state.destinationSetMap[payload.destinationSetId].destinations) const destinations = _.cloneDeep(state.destinationSetMap[payload.destinationSetId].destinations)
destinations[payload.destinationIndex].destination = payload.destination destinations[payload.destinationIndex].destination = payload.destination
await patchReplace({ await patchReplace({
@ -155,7 +167,7 @@ export async function updateDestination ({ dispatch, commit, state, rootGetters
commit('dataSucceeded', { commit('dataSucceeded', {
destinationSets: destinationSets.items destinationSets: destinationSets.items
}) })
dispatch('wait/end', WAIT_IDENTIFIER, { root: true }) dispatch('wait/end', 'csc-cf-destination-set-update', { root: true })
} }
export async function addDestination ({ dispatch, commit, state, rootGetters }, payload) { export async function addDestination ({ dispatch, commit, state, rootGetters }, payload) {
@ -191,8 +203,8 @@ export async function rewriteDestination ({ dispatch, commit, state, rootGetters
} }
} }
export async function removeDestination ({ dispatch, commit, state, rootGetters }, payload) { export async function removeDestination ({ dispatch, commit, state }, payload) {
dispatch('wait/start', WAIT_IDENTIFIER, { root: true }) dispatch('wait/start', 'csc-cf-destination-set-remove', { root: true })
const destinations = _.cloneDeep(state.destinationSetMap[payload.destinationSetId].destinations) const destinations = _.cloneDeep(state.destinationSetMap[payload.destinationSetId].destinations)
const updatedDestinations = destinations.reduce(($updatedDestinations, value, index) => { const updatedDestinations = destinations.reduce(($updatedDestinations, value, index) => {
if (index !== payload.destinationIndex) { if (index !== payload.destinationIndex) {
@ -210,19 +222,23 @@ export async function removeDestination ({ dispatch, commit, state, rootGetters
commit('dataSucceeded', { commit('dataSucceeded', {
destinationSets: destinationSets.items destinationSets: destinationSets.items
}) })
dispatch('wait/end', WAIT_IDENTIFIER, { root: true }) dispatch('wait/end', 'csc-cf-destination-set-remove', { root: true })
} }
export async function updateDestinationTimeout ({ dispatch, commit, state, rootGetters }, payload) { export async function updateDestinationTimeout ({ dispatch, commit, state }, payload) {
dispatch('wait/start', WAIT_IDENTIFIER, { root: true }) dispatch('wait/start', WAIT_IDENTIFIER, { root: true })
const destinations = _.cloneDeep(state.destinationSetMap[payload.destinationSetId].destinations) const destinations = _.cloneDeep(state.destinationSetMap[payload.destinationSetId].destinations)
destinations[payload.destinationIndex].timeout = payload.destinationTimeout destinations[payload.destinationIndex].timeout = payload.destinationTimeout
await patchReplace({ try {
resource: 'cfdestinationsets', await patchReplace({
resourceId: payload.destinationSetId, resource: 'cfdestinationsets',
fieldPath: 'destinations', resourceId: payload.destinationSetId,
value: destinations fieldPath: 'destinations',
}) value: destinations
})
} catch (e) {
showGlobalError(e.message)
}
const destinationSets = await cfLoadDestinationSets() const destinationSets = await cfLoadDestinationSets()
commit('dataSucceeded', { commit('dataSucceeded', {
destinationSets: destinationSets.items destinationSets: destinationSets.items
@ -230,7 +246,7 @@ export async function updateDestinationTimeout ({ dispatch, commit, state, rootG
dispatch('wait/end', WAIT_IDENTIFIER, { root: true }) dispatch('wait/end', WAIT_IDENTIFIER, { root: true })
} }
export async function loadSourceSets ({ dispatch, commit, rootGetters }) { export async function loadSourceSets ({ dispatch, commit }) {
dispatch('wait/start', 'csc-cf-sourcesets', { root: true }) dispatch('wait/start', 'csc-cf-sourcesets', { root: true })
const sourceSets = await cfLoadSourceSets() const sourceSets = await cfLoadSourceSets()
commit('dataSucceeded', { commit('dataSucceeded', {
@ -261,7 +277,7 @@ export async function createSourceSet ({ dispatch, commit, rootGetters, state },
} }
} }
export async function updateSourceSet ({ dispatch, commit, rootGetters, state }, payload) { export async function updateSourceSet ({ dispatch, commit, rootGetters }, payload) {
try { try {
dispatch('wait/start', 'csc-cf-source-set-create', { root: true }) dispatch('wait/start', 'csc-cf-source-set-create', { root: true })
await cfUpdateSourceSet(rootGetters['user/getSubscriberId'], payload) await cfUpdateSourceSet(rootGetters['user/getSubscriberId'], payload)
@ -269,6 +285,14 @@ export async function updateSourceSet ({ dispatch, commit, rootGetters, state },
commit('dataSucceeded', { commit('dataSucceeded', {
sourceSets: sourceSets.items sourceSets: sourceSets.items
}) })
} catch (e) {
if (e.code === 404 && e.message === 'Entity \'sourceset\' not found.') {
// This happens when CF was set by Admin therefore current
// csc user doesn't have rights to delete the entity
showGlobalWarning(i18n.global.tc('Entity belongs to admin'))
} else {
showGlobalError(e.message)
}
} finally { } finally {
dispatch('wait/end', 'csc-cf-source-set-create', { root: true }) dispatch('wait/end', 'csc-cf-source-set-create', { root: true })
} }
@ -292,6 +316,8 @@ export async function deleteSourceSet ({ dispatch, commit, rootGetters, state },
mappings: updatedMappings, mappings: updatedMappings,
sourceSets: sourceSets.items sourceSets: sourceSets.items
}) })
} catch (e) {
showGlobalError(e.message)
} finally { } finally {
dispatch('wait/end', 'csc-cf-source-set-create', { root: true }) dispatch('wait/end', 'csc-cf-source-set-create', { root: true })
} }
@ -355,14 +381,19 @@ export async function createTimeSetDate ({ dispatch, commit, rootGetters, state
dispatch('wait/end', 'csc-cf-time-set-create', { root: true }) dispatch('wait/end', 'csc-cf-time-set-create', { root: true })
} }
export async function updateTimeSetDate ({ dispatch, commit, rootGetters, state }, payload) { export async function updateTimeSetDate ({ dispatch, commit }, payload) {
dispatch('wait/start', 'csc-cf-time-set-create', { root: true }) dispatch('wait/start', 'csc-cf-time-set-create', { root: true })
await cfUpdateTimeSetDate(payload.id, payload.date) try {
const timeSets = await cfLoadTimeSets() await cfUpdateTimeSetDate(payload.id, payload.date)
commit('dataSucceeded', { const timeSets = await cfLoadTimeSets()
timeSets: timeSets.items commit('dataSucceeded', {
}) timeSets: timeSets.items
dispatch('wait/end', 'csc-cf-time-set-create', { root: true }) })
} catch (e) {
showGlobalError(e.message)
} finally {
dispatch('wait/end', 'csc-cf-time-set-create', { root: true })
}
} }
export async function deleteTimeSet ({ dispatch, commit, rootGetters, state }, payload) { export async function deleteTimeSet ({ dispatch, commit, rootGetters, state }, payload) {
@ -376,7 +407,17 @@ export async function deleteTimeSet ({ dispatch, commit, rootGetters, state }, p
fieldPath: payload.mapping.type, fieldPath: payload.mapping.type,
value: updatedMapping value: updatedMapping
}) })
await cfDeleteTimeSet(payload.id) try {
await cfDeleteTimeSet(payload.id)
} catch (e) {
if (e.code === 404 && e.message === 'Entity \'cftimeset\' not found.') {
// This happens when CF was set by Admin therefore current
// csc user doesn't have rights to delete the entity
showGlobalWarning(i18n.global.tc('Entity belongs to admin'))
} else {
showGlobalError(e.message)
}
}
const timeSets = await cfLoadTimeSets() const timeSets = await cfLoadTimeSets()
commit('dataSucceeded', { commit('dataSucceeded', {
mappings: updatedMappings, mappings: updatedMappings,
@ -416,6 +457,8 @@ export async function doNotRingPrimaryNumber ({ commit, rootGetters, state }, pa
} }
export async function updateRingTimeout ({ commit, rootGetters, state }, payload) { export async function updateRingTimeout ({ commit, rootGetters, state }, payload) {
// eslint-disable-next-line no-console
console.debug('aaa')
const updatedMappings = await patchReplaceFull({ const updatedMappings = await patchReplaceFull({
resource: 'cfmappings', resource: 'cfmappings',
resourceId: (payload.subscriberId) ? payload.subscriberId : rootGetters['user/getSubscriberId'], resourceId: (payload.subscriberId) ? payload.subscriberId : rootGetters['user/getSubscriberId'],
@ -446,9 +489,20 @@ export async function createTimeSetDateRange ({ dispatch, commit, rootGetters, s
dispatch('wait/end', 'csc-cf-time-set-create', { root: true }) dispatch('wait/end', 'csc-cf-time-set-create', { root: true })
} }
export async function updateTimeSetDateRange ({ dispatch, commit, rootGetters, state }, payload) { export async function updateTimeSetDateRange ({ dispatch, commit }, payload) {
dispatch('wait/start', 'csc-cf-time-set-create', { root: true }) dispatch('wait/start', 'csc-cf-time-set-create', { root: true })
await cfUpdateTimeSetDateRange(payload.id, payload.date) try {
await cfUpdateTimeSetDateRange(payload.id, payload.date)
} catch (e) {
if (e.code === 404 && e.message === 'Entity \'timeset\' not found.') {
// This happens when CF was set by Admin therefore current
// csc user doesn't have rights to delete the entity
showGlobalWarning(i18n.global.tc('Entity belongs to admin'))
} else {
showGlobalError(e.message)
}
}
const timeSets = await cfLoadTimeSets() const timeSets = await cfLoadTimeSets()
commit('dataSucceeded', { commit('dataSucceeded', {
timeSets: timeSets.items timeSets: timeSets.items
@ -475,9 +529,20 @@ export async function createTimeSetWeekdays ({ dispatch, commit, rootGetters, st
dispatch('wait/end', 'csc-cf-time-set-create', { root: true }) dispatch('wait/end', 'csc-cf-time-set-create', { root: true })
} }
export async function updateTimeSetWeekdays ({ dispatch, commit, rootGetters, state }, payload) { export async function updateTimeSetWeekdays ({ dispatch, commit }, payload) {
dispatch('wait/start', 'csc-cf-time-set-create', { root: true }) dispatch('wait/start', 'csc-cf-time-set-create', { root: true })
await cfUpdateTimeSetWeekdays(payload.id, payload.weekdays) try {
await cfUpdateTimeSetWeekdays(payload.id, payload.weekdays)
} catch (e) {
if (e.code === 404 && e.message === 'Entity \'timeset\' not found.') {
// This happens when CF was set by Admin therefore current
// csc user doesn't have rights to delete the entity
showGlobalWarning(i18n.global.tc('Entity belongs to admin'))
} else {
showGlobalError(e.message)
}
}
const timeSets = await cfLoadTimeSets() const timeSets = await cfLoadTimeSets()
commit('dataSucceeded', { commit('dataSucceeded', {
timeSets: timeSets.items timeSets: timeSets.items
@ -499,7 +564,7 @@ export async function createOfficeHours ({ dispatch, commit, rootGetters, state
if (payload.id) { if (payload.id) {
await cfDeleteTimeSet(payload.id) await cfDeleteTimeSet(payload.id)
} }
const timeSets = await cfLoadTimeSets(rootGetters['user/getSubscriberId']) const timeSets = await cfLoadTimeSets()
commit('dataSucceeded', { commit('dataSucceeded', {
mappings: updatedMappings, mappings: updatedMappings,
timeSets: timeSets.items timeSets: timeSets.items
@ -509,8 +574,13 @@ export async function createOfficeHours ({ dispatch, commit, rootGetters, state
export async function updateOfficeHours ({ dispatch, commit, rootGetters, state }, payload) { export async function updateOfficeHours ({ dispatch, commit, rootGetters, state }, payload) {
dispatch('wait/start', 'csc-cf-time-set-create', { root: true }) dispatch('wait/start', 'csc-cf-time-set-create', { root: true })
await cfUpdateOfficeHours(payload.id, payload.times) try {
const timeSets = await cfLoadTimeSets(rootGetters['user/getSubscriberId']) await cfUpdateOfficeHours(payload.id, payload.times)
} catch (e) {
showGlobalError(e.message)
}
const timeSets = await cfLoadTimeSets()
commit('dataSucceeded', { commit('dataSucceeded', {
timeSets: timeSets.items timeSets: timeSets.items
}) })
@ -543,15 +613,20 @@ export async function getAnnouncementById ({ dispatch, commit, rootGetters, stat
} }
} }
export async function updateAnnouncement ({ dispatch, commit, rootGetters, state }, payload) { export async function updateAnnouncement ({ dispatch, commit, state }, payload) {
const destinations = _.cloneDeep(state.destinationSetMap[payload.destinationSetId].destinations) try {
destinations[payload.destinationIndex].announcement_id = payload.announcementId const destinations = _.cloneDeep(state.destinationSetMap[payload.destinationSetId].destinations)
await patchReplace({ destinations[payload.destinationIndex].announcement_id = payload.announcementId
resource: 'cfdestinationsets', await patchReplace({
resourceId: payload.destinationSetId, resource: 'cfdestinationsets',
fieldPath: 'destinations', resourceId: payload.destinationSetId,
value: destinations fieldPath: 'destinations',
}) value: destinations
})
} catch (e) {
showGlobalError(e.message)
}
const destinationSets = await cfLoadDestinationSets() const destinationSets = await cfLoadDestinationSets()
commit('dataSucceeded', { commit('dataSucceeded', {
destinationSets: destinationSets.items destinationSets: destinationSets.items

@ -6,6 +6,7 @@ export function dataSucceeded (state, res) {
destinationSetMap[destinationSet.id] = destinationSet destinationSetMap[destinationSet.id] = destinationSet
}) })
state.destinationSetMap = destinationSetMap state.destinationSetMap = destinationSetMap
state.destinationSets = res.destinationSets
} }
if (res.sourceSets) { if (res.sourceSets) {
const sourceSetMap = {} const sourceSetMap = {}

@ -56,6 +56,9 @@ export default {
isSeatListEmpty (state) { isSeatListEmpty (state) {
return state.seatListItems.length && state.seatListItems.length === 0 return state.seatListItems.length && state.seatListItems.length === 0
}, },
isSeatMapByIdEmpty (state) {
return Object.keys(state.seatMapById).length === 0
},
isSeatListRequesting (state) { isSeatListRequesting (state) {
return state.seatListState === RequestState.requesting return state.seatListState === RequestState.requesting
}, },

@ -2,8 +2,8 @@
import { createLocalVue, shallowMount } from 'test-utils' import { createLocalVue, shallowMount } from 'test-utils'
import Vuex from 'vuex' import Vuex from 'vuex'
import VueRouter from 'vue-router' import * as VueRouter from 'vue-router'
import Quasar, { Cookies } from 'quasar' import { Cookies, Quasar } from 'quasar'
const mockSsrContext = () => { const mockSsrContext = () => {
return { return {
@ -46,10 +46,10 @@ export const mountQuasar = (component, options = {}) => {
} }
// mock vue-i18n // mock vue-i18n
const $t = () => {} const $t = () => { }
const $tc = () => {} const $tc = () => { }
const $n = () => {} const $n = () => { }
const $d = () => {} const $d = () => { }
return shallowMount(component, { return shallowMount(component, {
localVue: localVue, localVue: localVue,

Loading…
Cancel
Save