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)
(cherry picked from commit b72dd8dab6)
mr11.5.1
Debora Crescenzo 4 months ago
parent 22bf9f81bf
commit 2069ad4386

@ -41,14 +41,16 @@ export async function cfGetMostRecentDestinationSetByName (params) {
export async function cfLoadSourceSets (subscriberId) {
return getList({
resource: 'cfsourcesets',
params: (subscriberId) ? { subscriber_id: subscriberId } : {}
params: (subscriberId) ? { subscriber_id: subscriberId } : {},
all: true
})
}
export async function cfLoadTimeSets (subscriberId) {
return getList({
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
color="negative"
icon="delete"
@click="deleteSourceSetEvent"
@click="deleteTimeSetEvent"
/>
<q-btn
:label="$t('Save')"
@ -125,12 +125,14 @@ export default {
}
this.$emit('close')
},
async deleteSourceSetEvent () {
async deleteTimeSetEvent () {
await this.deleteTimeSet({
mapping: this.mapping,
id: this.timeSet.id,
subscriberId: this.subscriberId
})
this.$emit('close')
}
}
}

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

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

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

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

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

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

@ -34,6 +34,25 @@ export function getDayNameByNumber (dayNumber, isShortName = false) {
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) {
return times[0].year + '/' + times[0].month + '/' + times[0].mday
}
@ -73,6 +92,67 @@ export function timeSetOfficeHoursSameTime (times) {
return weekdaysStr
}
export function timeSetTimes () {
return '...'
export function timeSetTimes (timeSets) {
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 = [{
weekday: 1..7,
@ -72,7 +73,7 @@ export function validateHumanTimesets (hTimeset) {
/**
* 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}
* @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) {
kTimeset.forEach(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 = []) {
validateKamailioTimesets(kTimeset)
// convert Kamailio timeset into Human readable format
const hTimesetRaw = kTimeset.map(timesetItem => {
// convert Kamailio timeset into human readable format
const hTimesetRaw = kTimeset.map((timesetItem) => {
let { wday, hour, minute } = timesetItem
hour = getAsTrimmedString(hour)
minute = getAsTrimmedString(minute)
@ -378,7 +388,7 @@ export function kamailioTimesetToHuman (kTimeset = []) {
return res
}
// ---- implementation for date ranges ----
// ---- 2. Implementation for date ranges ----
// ------------------------------------------
/*
@ -672,7 +682,11 @@ export function humanDatesetToKamailio (hDateset = []) {
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) {
kDateset.forEach(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 = []) {
validateKamailioDatesets(kDateset)
// convert Kamailio dateset into Human readable format
const hDatesetRaw = kDateset.map(datesetItem => {
// convert Kamailio dateset into human readable format
const hDatesetRaw = kDateset.map((datesetItem) => {
let { year, month, mday } = datesetItem
year = getAsTrimmedString(year)
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",
"Application": "Anwendung",
"Apps": "Apps",
"April": "April",
"Assigned slot {slot}": "Zugewiesene Kurzwahl {slot}",
"Attach voicemail to email notification": "Voicemail als Anhang in E-Mail-Benachrichtigung",
"August": "August",
"Auto Attendant": "Anrufmenü",
"Block Incoming": "Eingehende Anrufe blockieren",
"Block Incoming/Outgoing": "Ein-/Ausgehende Anrufe blockieren",
@ -127,12 +129,15 @@
"Custom Announcement": "Benutzerdefinierte Ansage",
"Custom Announcements": "Individuelle Ansagen",
"Custom sound": "Benutzerdefinierter Sound",
"Custom time set": "Custom time set",
"Custom time sets": "Custom time sets",
"Customer Details": "Kunden-Details",
"Customer Phonebook": "Customer Phonebook",
"Daily": "Täglich",
"Dashboard": "Übersicht",
"Data is in the clipboard": "Daten wurden in die Zwischenablage kopiert",
"Data loading error": "Fehler beim Laden von Daten",
"December": "Dezember",
"Default": "Standard",
"Default sound": "Standard-Sound",
"Default sound set for all seats and groups": "Standard-Sound-Set für alle Nebenstellen und Gruppen",
@ -176,6 +181,7 @@
"End time": "Endzeit",
"English": "Deutsch",
"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",
"Extension": "Durchwahl",
"Extension Settings": "Erweiterungseinstellungen",
@ -185,6 +191,7 @@
"Fax to mail and sendfax": "„Fax to Mail“ und „Sendfax“",
"Fax2Mail": "Fax2Mail",
"Faxes": "Faxe",
"February": "Februar",
"File": "Datei",
"File Type": "Dateityp",
"Filter": "Filtern",
@ -251,8 +258,11 @@
"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.",
"Italian": "Italienisch",
"January": "Januar",
"Join conference": "Konferenz beitreten",
"Join conference with name": "Konferenz beitreten mit Name",
"July": "Juli",
"June": "Juni",
"Lamp/Key": "Lampe/Taste",
"Lamps/Keys": "Lampen/Tasten",
"Language": "Sprache",
@ -272,8 +282,10 @@
"Manager Secretary": "Geschäftsführungssekretariat",
"Manager Secretary feature": "Manager Sekretär Funktion",
"ManagerSecretary": "Geschäftsführungssekretariat",
"March": "März",
"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",
"May": "Mai",
"Me": "Ich",
"Messages": "Nachrichten",
"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",
"Normal": "Normal",
"Not modified yet": "Bisher nicht geändert",
"November": "November",
"Number": "Nummer",
"Number list": "Nummernliste",
"Number list name": "Name der Nummernliste",
"Numbers": "Nummern",
"October": "Oktober",
"Office Hours Announcement": "Bürozeiten Ansage",
"On weekdays": "An Werktagen",
"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 is not strong enough": "Passwort ist nicht sicher genug",
"Passwords must be equal": "Passwörter müssen übereinstimmen",
"Period": "Period",
"Phone model": "Telefonmodell",
"Phone number": "Rufnummer",
"Pilot": "Hauptteilnehmer",
@ -448,6 +463,7 @@
"Send": "Senden",
"Send Fax": "Sende Fax",
"Sending fax completed successfully.": "Fax wurde erfolgreich gesendet.",
"September": "September",
"Serial Ringing": "Serielles Klingeln",
"Session expired, please login again": "Sitzung abgelaufen, bitte erneut anmelden",
"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 unassign the speed dial slot. Please try again": "An error occured while trying to unassign the speed dial slot. Please try again",
"Apps": "Apps",
"April": "April",
"Assigned slot {slot}": "Assigned slot {slot}",
"Attach voicemail to email notification": "Attach voicemail to email notification",
"August": "August",
"Auto Attendant": "Auto Attendant",
"Block Incoming": "Block Incoming",
"Block Incoming/Outgoing": "Block Incoming/Outgoing",
@ -118,11 +120,14 @@
"Custom Announcement": "Custom Announcement",
"Custom Announcements": "Custom Announcements",
"Custom sound": "Custom sound",
"Custom time set": "Custom time set",
"Custom time sets": "Custom time sets",
"Customer Details": "Customer Details",
"Daily": "Daily",
"Dashboard": "Dashboard",
"Data is in the clipboard": "Data is in the clipboard",
"Data loading error": "Data loading error",
"December": "December",
"Default": "Default",
"Default sound": "Default sound",
"Default sound set for all seats and groups": "Default sound set for all seats and groups",
@ -162,6 +167,7 @@
"End time": "End time",
"English": "English",
"Enter a number to dial": "Enter a number to dial",
"Entity belongs to admin": "Entity belongs to admin",
"Expires": "Expires",
"Extension": "Extension",
"Extension Settings": "Extension Settings",
@ -170,6 +176,7 @@
"Fax to mail and sendfax": "Fax to Mail and Sendfax",
"Fax2Mail": "Fax2Mail",
"Faxes": "Faxes",
"February": "February",
"File": "File",
"File Type": "File Type",
"Filter": "Filter",
@ -233,6 +240,9 @@
"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.",
"Italian": "Italian",
"January": "January",
"July": "July",
"June": "June",
"Lamp/Key": "Lamp/Key",
"Lamps/Keys": "Lamps/Keys",
"Language": "Language",
@ -249,8 +259,10 @@
"Mail to Fax": "Mail to Fax",
"Manager Secretary": "Manager Secretary",
"Manager Secretary feature": "Manager Secretary feature",
"March": "March",
"Maximum allowed extension is {max}": "Maximum allowed extension is {max}",
"Maximum calls in queue": "Maximum calls in queue",
"May": "May",
"Me": "Me",
"Messages": "Messages",
"Minimum allowed extension is {min}": "Minimum allowed extension is {min}",
@ -299,10 +311,12 @@
"No speed dials found": "No speed dials found",
"Normal": "Normal",
"Not modified yet": "Not modified yet",
"November": "November",
"Number": "Number",
"Number list": "Number list",
"Number list name": "Number list name",
"Numbers": "Numbers",
"October": "October",
"Office Hours Announcement": "Office Hours Announcement",
"On weekdays": "On weekdays",
"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 is not strong enough": "Password is not strong enough",
"Passwords must be equal": "Passwords must be equal",
"Period": "Period",
"Phone model": "Phone model",
"Phone number": "Phone number",
"Pilot": "Pilot",
@ -412,6 +427,7 @@
"Send": "Send",
"Send Fax": "Send Fax",
"Sending fax completed successfully.": "Sending fax completed successfully.",
"September": "September",
"Serial Ringing": "Serial Ringing",
"Session expired, please login again": "Session expired, please login again",
"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.",
"Application": "Aplicación",
"Apps": "Aplicaciones",
"April": "Abril",
"Assigned slot {slot}": "Ranura {slot} asignada",
"Attach voicemail to email notification": "Adjuntar correo de voz a notificación de correo electrónico",
"August": "Agosto",
"Auto Attendant": "Asistente Automático",
"Block Incoming": "Bloquear Entrantes",
"Block Incoming/Outgoing": "Bloquear Entrantes/Salientes",
@ -127,12 +129,15 @@
"Custom Announcement": "Anuncio Personalizado",
"Custom Announcements": "Anuncios Personalizados",
"Custom sound": "Sonido personalizado",
"Custom time set": "Custom time set",
"Custom time sets": "Custom time sets",
"Customer Details": "Detalles de cliente",
"Customer Phonebook": "Customer Phonebook",
"Daily": "Diariamente",
"Dashboard": "Tablero",
"Data is in the clipboard": "Data is in the clipboard",
"Data loading error": "Data loading error",
"December": "Diciembre",
"Default": "Predeterminado",
"Default sound": "Sonido predeterminado",
"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",
"English": "Español",
"Enter a number to dial": "Introduzca un número para marcar",
"Entity belongs to admin": "Esta entidad pertenece a admin",
"Expires": "Expira",
"Extension": "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",
"Fax2Mail": "Fax2Mail",
"Faxes": "Faxes",
"February": "Febrero",
"File": "Archivo",
"File Type": "Tipos de archivo",
"Filter": "Filtrar",
@ -251,8 +258,11 @@
"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.",
"Italian": "Italiano",
"January": "Enero",
"Join conference": "Unirse a la conferencia",
"Join conference with name": "Unirse a la conferencia con nombre",
"July": "Julio",
"June": "Junio",
"Lamp/Key": "Indicador/Tecla",
"Lamps/Keys": "Indicadores/Teclas",
"Language": "Idioma",
@ -273,8 +283,10 @@
"Manager Secretary": "Jefe-Asistente",
"Manager Secretary feature": "Manager Secretary feature",
"ManagerSecretary": "Jefe-Asistente",
"March": "Marzo",
"Maximum allowed extension is {max}": "La extensión máxima permitida es {max}",
"Maximum calls in queue": "Máximo de llamadas en cola",
"May": "Mayo",
"Me": "Me",
"Messages": "Messages",
"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",
"Normal": "Normal",
"Not modified yet": "No se ha modificado todavía",
"November": "Noviembre",
"Number": "Número",
"Number list": "Lista de números",
"Number list name": "Nombre de la lista de números",
"Numbers": "Números",
"October": "Octubre",
"Office Hours Announcement": "Office Hours Announcement",
"On weekdays": "En días de la semana",
"Only incoming calls from listed numbers are allowed": "Permitir solo los números listados",
@ -350,6 +364,7 @@
"Password confirm": "Password confirm",
"Password is not strong enough": "La contraseña no es lo suficientemente fuerte",
"Passwords must be equal": "Las contraseñas deben ser iguales",
"Period": "Period",
"Phone model": "Modelo de teléfono",
"Phone number": "Número de teléfono",
"Pilot": "Piloto",
@ -448,6 +463,7 @@
"Send": "Enviar",
"Send Fax": "Enviar Fax",
"Sending fax completed successfully.": "Envío de fax completado exitosamente.",
"September": "Septiembre",
"Serial Ringing": "Llamada en serie",
"Session expired, please login again": "Session expired, please login again",
"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",
"Application": "Application",
"Apps": "Apps",
"April": "Avril",
"Assigned slot {slot}": "Emplacement {slot} attribué",
"Attach voicemail to email notification": "Joindre le message vocal à l'e-mail de notification",
"August": "Août",
"Auto Attendant": "Association auto",
"Block Incoming": "Bloquer les appels entrants",
"Block Incoming/Outgoing": "Bloquer les entrants/sortants",
@ -127,12 +129,15 @@
"Custom Announcement": "Annonce personnalisée",
"Custom Announcements": "Annonces personnalisées",
"Custom sound": "Son personnalisé",
"Custom time set": "Custom time set",
"Custom time sets": "Custom time sets",
"Customer Details": "Détails du client",
"Customer Phonebook": "Annuaire du client",
"Daily": "Quotidien",
"Dashboard": "Tableau de bord",
"Data is in the clipboard": "Données dans le presse-papiers",
"Data loading error": "Data loading error",
"December": "Décembre",
"Default": "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",
@ -176,6 +181,7 @@
"End time": "Date de fin",
"English": "Français",
"Enter a number to dial": "Enter a number to dial",
"Entity belongs to admin": "Cette entité appartient à ladministrateur",
"Expires": "Expire",
"Extension": "Extension",
"Extension Settings": "Paramètres des extensions",
@ -185,6 +191,7 @@
"Fax to mail and sendfax": "Fax à E-mail et Sendfax",
"Fax2Mail": "Fax2Mail",
"Faxes": "Télécopies",
"February": "Février",
"File": "Fichier",
"File Type": "Type de fichier",
"Filter": "Filtrer",
@ -251,8 +258,11 @@
"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.",
"Italian": "Italien",
"January": "Janvier",
"Join conference": "Rejoindre la conférence",
"Join conference with name": "Rejoindre la conférence avec le nom",
"July": "Juillet",
"June": "Juin",
"Lamp/Key": "Lampe/clé",
"Lamps/Keys": "Lampes/clés",
"Language": "Langue",
@ -272,8 +282,10 @@
"Manager Secretary": "Manager Secretary",
"Manager Secretary feature": "Manager Secretary feature",
"ManagerSecretary": "ManagerSecretary",
"March": "Mars",
"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",
"May": "Mai",
"Me": "Me",
"Messages": "Messages",
"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é",
"Normal": "Normal",
"Not modified yet": "Pas encore modifié",
"November": "Novembre",
"Number": "Numéro",
"Number list": "Liste de numéros",
"Number list name": "Nom de la liste de numéros",
"Numbers": "Nombres",
"October": "Octobre",
"Office Hours Announcement": "Office Hours Announcement",
"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",
@ -351,6 +365,7 @@
"Password confirm": "Password confirm",
"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",
"Period": "Period",
"Phone model": "Modèle du poste",
"Phone number": "Numéro de téléphone",
"Pilot": "Pilote",
@ -448,6 +463,7 @@
"Send": "Envoyer",
"Send Fax": "Envoyer un fax",
"Sending fax completed successfully.": "Le Fax a été envoyé avec succès.",
"September": "Septembre",
"Serial Ringing": "Sonnerie en série",
"Session expired, please login again": "Session expired, please login again",
"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 unassign the speed dial slot. Please try again": "Si è verificato un errore nella cancellazione della selezione rapida. Si prega di riprovare",
"Apps": "Apps",
"April": "Aprile",
"Assigned slot {slot}": "Slot assegnato: {slot}",
"Attach voicemail to email notification": "Allega messaggio vocale all'email di notifica",
"August": "Agosto",
"Auto Attendant": "Risponditore Automatico",
"Block Incoming": "Blocca entranti",
"Block Incoming/Outgoing": "Blocca entranti/uscenti",
@ -125,12 +127,15 @@
"Custom Announcement": "Custom Announcement",
"Custom Announcements": "Custom Announcements",
"Custom sound": "Audio personalizzato",
"Custom time set": "Custom time set",
"Custom time sets": "Custom time sets",
"Customer Details": "Dettagli cliente",
"Customer Phonebook": "Rubrica cliente",
"Daily": "Giornaliero",
"Dashboard": "Dashboard",
"Data is in the clipboard": "I dati sono negli appunti",
"Data loading error": "Errore nel caricamento dei dati",
"December": "Dicembre",
"Default": "Predefinito",
"Default sound": "Audio predefinito",
"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",
"English": "Italiano",
"Enter a number to dial": "Inserisci un numero per chiamare",
"Entity belongs to admin": "Questa entità appartiene ad admin",
"Expires": "Scade",
"Extension": "Interno",
"Extension Settings": "Impostazioni dell'Estensione",
@ -182,6 +188,7 @@
"Fax to mail and sendfax": "Fax to mail and sendfax",
"Fax2Mail": "Fax2Mail",
"Faxes": "Fax",
"February": "Febbraio",
"File": "File",
"File Type": "File Type",
"Filter": "Filtra",
@ -248,7 +255,10 @@
"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.",
"Italian": "Italian",
"January": "Gennaio",
"Join conference with name": "Partecipa alla conferenza con nome",
"July": "Luglio",
"June": "Giugno",
"Lamp/Key": "Lampada/Tasto",
"Lamps/Keys": "Lampade/Tasti",
"Language": "Lingua",
@ -267,8 +277,10 @@
"Mail to Fax": "Mail to Fax",
"Manager Secretary": "Segreteria",
"Manager Secretary feature": "Manager Secretary feature",
"March": "Marzo",
"Maximum allowed extension is {max}": "Maximum allowed extension is {max}",
"Maximum calls in queue": "Numero massimo di chiamate in coda",
"May": "Maggio",
"Me": "Me",
"Messages": "Messages",
"Minimum allowed extension is {min}": "Minimum allowed extension is {min}",
@ -320,10 +332,12 @@
"No speed dials found": "Nessuna impostazione di chiamata rapida",
"Normal": "Normale",
"Not modified yet": "Not modified yet",
"November": "Novembre",
"Number": "Numero",
"Number list": "Number list",
"Number list name": "Number list name",
"Numbers": "Numeri",
"October": "Ottobre",
"Office Hours Announcement": "Office Hours Announcement",
"On weekdays": "Nei giorni feriali",
"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 confirm": "Password confirm",
"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 number": "Numero di telefono",
"Pilot": "Pilota",
@ -441,6 +462,7 @@
"Send": "Invia",
"Send Fax": "Invia fax",
"Sending fax completed successfully.": "Fax inviato correttamente.",
"September": "Settembre",
"Serial Ringing": "Chiamata in sequenza",
"Session expired, please login again": "Session expired, please login again",
"Set your fax settings": "Set your fax settings",

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

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

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

@ -19,14 +19,17 @@ import {
cfUpdateTimeSetWeekdays
} from 'src/api/call-forwarding'
import {
v4
} from 'uuid'
import {
get,
getList,
patchReplace,
patchReplaceFull,
post, put, get, getList
post,
put
} from 'src/api/common'
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_PRIORITY = 0
@ -44,19 +47,16 @@ function createDefaultDestination (destination, defaultAnnouncementId) {
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 })
let res = null
if (subscriberId) {
res = await cfLoadMappingsFull(subscriberId)
} else {
res = await cfLoadMappingsFull(rootGetters['user/getSubscriberId'])
}
const subscriberId = id || rootGetters['user/getSubscriberId']
const mappingData = await cfLoadMappingsFull(subscriberId)
commit('dataSucceeded', {
mappings: res[0],
destinationSets: res[1].items,
sourceSets: res[2].items,
timeSets: res[3].items
mappings: mappingData[0],
destinationSets: mappingData[1].items,
sourceSets: mappingData[2].items,
timeSets: mappingData[3].items
})
dispatch('wait/end', WAIT_IDENTIFIER, { root: true })
}
@ -116,7 +116,19 @@ export async function deleteMapping ({ dispatch, commit, state, rootGetters }, p
fieldPath: payload.type,
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()
commit('dataSucceeded', {
mappings: patchRes,
@ -141,8 +153,8 @@ export async function toggleMapping ({ dispatch, commit, state, rootGetters }, p
dispatch('wait/end', WAIT_IDENTIFIER, { root: true })
}
export async function updateDestination ({ dispatch, commit, state, rootGetters }, payload) {
dispatch('wait/start', WAIT_IDENTIFIER, { root: true })
export async function updateDestination ({ dispatch, commit, state }, payload) {
dispatch('wait/start', 'csc-cf-destination-set-update', { root: true })
const destinations = _.cloneDeep(state.destinationSetMap[payload.destinationSetId].destinations)
destinations[payload.destinationIndex].destination = payload.destination
await patchReplace({
@ -155,7 +167,7 @@ export async function updateDestination ({ dispatch, commit, state, rootGetters
commit('dataSucceeded', {
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) {
@ -191,8 +203,8 @@ export async function rewriteDestination ({ dispatch, commit, state, rootGetters
}
}
export async function removeDestination ({ dispatch, commit, state, rootGetters }, payload) {
dispatch('wait/start', WAIT_IDENTIFIER, { root: true })
export async function removeDestination ({ dispatch, commit, state }, payload) {
dispatch('wait/start', 'csc-cf-destination-set-remove', { root: true })
const destinations = _.cloneDeep(state.destinationSetMap[payload.destinationSetId].destinations)
const updatedDestinations = destinations.reduce(($updatedDestinations, value, index) => {
if (index !== payload.destinationIndex) {
@ -210,19 +222,23 @@ export async function removeDestination ({ dispatch, commit, state, rootGetters
commit('dataSucceeded', {
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 })
const destinations = _.cloneDeep(state.destinationSetMap[payload.destinationSetId].destinations)
destinations[payload.destinationIndex].timeout = payload.destinationTimeout
await patchReplace({
resource: 'cfdestinationsets',
resourceId: payload.destinationSetId,
fieldPath: 'destinations',
value: destinations
})
try {
await patchReplace({
resource: 'cfdestinationsets',
resourceId: payload.destinationSetId,
fieldPath: 'destinations',
value: destinations
})
} catch (e) {
showGlobalError(e.message)
}
const destinationSets = await cfLoadDestinationSets()
commit('dataSucceeded', {
destinationSets: destinationSets.items
@ -230,7 +246,7 @@ export async function updateDestinationTimeout ({ dispatch, commit, state, rootG
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 })
const sourceSets = await cfLoadSourceSets()
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 {
dispatch('wait/start', 'csc-cf-source-set-create', { root: true })
await cfUpdateSourceSet(rootGetters['user/getSubscriberId'], payload)
@ -269,6 +285,14 @@ export async function updateSourceSet ({ dispatch, commit, rootGetters, state },
commit('dataSucceeded', {
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 {
dispatch('wait/end', 'csc-cf-source-set-create', { root: true })
}
@ -292,6 +316,8 @@ export async function deleteSourceSet ({ dispatch, commit, rootGetters, state },
mappings: updatedMappings,
sourceSets: sourceSets.items
})
} catch (e) {
showGlobalError(e.message)
} finally {
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 })
}
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 })
await cfUpdateTimeSetDate(payload.id, payload.date)
const timeSets = await cfLoadTimeSets()
commit('dataSucceeded', {
timeSets: timeSets.items
})
dispatch('wait/end', 'csc-cf-time-set-create', { root: true })
try {
await cfUpdateTimeSetDate(payload.id, payload.date)
const timeSets = await cfLoadTimeSets()
commit('dataSucceeded', {
timeSets: timeSets.items
})
} 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) {
@ -376,7 +407,17 @@ export async function deleteTimeSet ({ dispatch, commit, rootGetters, state }, p
fieldPath: payload.mapping.type,
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()
commit('dataSucceeded', {
mappings: updatedMappings,
@ -416,6 +457,8 @@ export async function doNotRingPrimaryNumber ({ commit, rootGetters, state }, pa
}
export async function updateRingTimeout ({ commit, rootGetters, state }, payload) {
// eslint-disable-next-line no-console
console.debug('aaa')
const updatedMappings = await patchReplaceFull({
resource: 'cfmappings',
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 })
}
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 })
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()
commit('dataSucceeded', {
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 })
}
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 })
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()
commit('dataSucceeded', {
timeSets: timeSets.items
@ -499,7 +564,7 @@ export async function createOfficeHours ({ dispatch, commit, rootGetters, state
if (payload.id) {
await cfDeleteTimeSet(payload.id)
}
const timeSets = await cfLoadTimeSets(rootGetters['user/getSubscriberId'])
const timeSets = await cfLoadTimeSets()
commit('dataSucceeded', {
mappings: updatedMappings,
timeSets: timeSets.items
@ -509,8 +574,13 @@ export async function createOfficeHours ({ dispatch, commit, rootGetters, state
export async function updateOfficeHours ({ dispatch, commit, rootGetters, state }, payload) {
dispatch('wait/start', 'csc-cf-time-set-create', { root: true })
await cfUpdateOfficeHours(payload.id, payload.times)
const timeSets = await cfLoadTimeSets(rootGetters['user/getSubscriberId'])
try {
await cfUpdateOfficeHours(payload.id, payload.times)
} catch (e) {
showGlobalError(e.message)
}
const timeSets = await cfLoadTimeSets()
commit('dataSucceeded', {
timeSets: timeSets.items
})
@ -543,15 +613,20 @@ export async function getAnnouncementById ({ dispatch, commit, rootGetters, stat
}
}
export async function updateAnnouncement ({ dispatch, commit, rootGetters, state }, payload) {
const destinations = _.cloneDeep(state.destinationSetMap[payload.destinationSetId].destinations)
destinations[payload.destinationIndex].announcement_id = payload.announcementId
await patchReplace({
resource: 'cfdestinationsets',
resourceId: payload.destinationSetId,
fieldPath: 'destinations',
value: destinations
})
export async function updateAnnouncement ({ dispatch, commit, state }, payload) {
try {
const destinations = _.cloneDeep(state.destinationSetMap[payload.destinationSetId].destinations)
destinations[payload.destinationIndex].announcement_id = payload.announcementId
await patchReplace({
resource: 'cfdestinationsets',
resourceId: payload.destinationSetId,
fieldPath: 'destinations',
value: destinations
})
} catch (e) {
showGlobalError(e.message)
}
const destinationSets = await cfLoadDestinationSets()
commit('dataSucceeded', {
destinationSets: destinationSets.items

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

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

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

Loading…
Cancel
Save