TT#21502 Fix store undefined issue

CallForward: Fix race condition problem with destinations being
populated before sourceset specific store has been created

Change-Id: I37e86e21102bce433235ac7050e8a27103a66779
changes/16/15416/7
Robert Axelsen 8 years ago
parent 1a046586ef
commit 483bb04351

@ -165,53 +165,42 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', {
return mapping.length !== 0; return mapping.length !== 0;
}, },
buildArrayOfModels: function (cfMappings, cfType, routeTimeset, cfdestinationsets, cftRingTimeout, arrayOfModels) { buildArrayOfModels: function (cfMappings, cfType, routeTimeset, cfdestinationsets, cftRingTimeout, arrayOfModels, hasCftAndCfuMappings) {
var $cf = this; var $cf = this;
Ext.each(cfMappings, function(mapping, j) { Ext.each(cfMappings, function(mapping, j) {
var cfmappings = {}; var currentMapping = {};
if (cfType === 'cfu' && j === 1) { return false; }; currentMapping.destinationsetName = mapping.destinationset;
cfmappings.destinationsetName = mapping.destinationset; currentMapping.sourcesetName = mapping.sourceset;
cfmappings.sourcesetName = mapping.sourceset; currentMapping.timesetName = mapping.timeset;
cfmappings.timesetName = mapping.timeset; if (currentMapping.timesetName == routeTimeset) {
if (cfmappings.timesetName == routeTimeset) {
// A destinationset can be used as mapping for mutiple call forwarding types, so
// we can not break out of this loop better than we already are. _modelCreated
// is already in place to make sure we don't go deeper in the loops if the current
// cftype already has that destinationset added as model
Ext.each(cfdestinationsets, function(cfdestinationset) { Ext.each(cfdestinationsets, function(cfdestinationset) {
if (cfType !== 'cft' || !hasCftAndCfuMappings && cfType === 'cft') { if (cfType.match(/(cfb|cfna)/) || cfType === 'cfu' && cfMappings[0].destinationset === mapping.destinationset || !hasCftAndCfuMappings && cfType === 'cft') {
if (cfdestinationset.name == cfmappings.destinationsetName && !cfmappings._modelCreated) { // _modelCreated check in place to make sure we don't add the destinationset more
// than one time if the cftype already has that destinationset added as model
if (cfdestinationset.name == currentMapping.destinationsetName && !currentMapping._modelCreated) {
cfdestinationset.destinations = $cf.sortDestinationsetByPriority(cfdestinationset.destinations); cfdestinationset.destinations = $cf.sortDestinationsetByPriority(cfdestinationset.destinations);
if (cfType === 'cft' && cfMappings[0].destinationset === mapping.destinationset) { if (cfType === 'cft' && cfMappings[0].destinationset === mapping.destinationset) {
$cf.addCftOwnPhone(cfdestinationset.destinations, cftRingTimeout); $cf.addCftOwnPhone(cfdestinationset.destinations, cftRingTimeout);
}; };
// We can not break out of this one, as we need all destinations of the given
// destinationset added to the store
for (item in cfdestinationset.destinations) { for (item in cfdestinationset.destinations) {
var destinationToDisplayInGrid = $cf.getDestinationFromSipId(cfdestinationset.destinations[item].destination); var destinationToDisplayInGrid = $cf.getDestinationFromSipId(cfdestinationset.destinations[item].destination);
var destinationAnnouncementId = cfdestinationset.announcement_id;
var destination = cfdestinationset.destinations[item].destination;
var priority = cfdestinationset.destinations[item].priority;
var timeout = cfdestinationset.destinations[item].timeout;
var destinationId = cfdestinationset.id;
var destinationName = cfdestinationset.name;
// Removes timeout if destination is not a number // Removes timeout if destination is not a number
var ringFor = !Ext.isNumber(parseInt(destinationToDisplayInGrid)) ? '' : cfdestinationset.destinations[item].timeout; var ringFor = !Ext.isNumber(parseInt(destinationToDisplayInGrid)) ? '' : cfdestinationset.destinations[item].timeout;
var cbModel = Ext.create('NgcpCsc.model.CallForwardDestination', { var cbModel = Ext.create('NgcpCsc.model.CallForwardDestination', {
type: cfType, type: cfType,
destination_displayed: destinationToDisplayInGrid, destination_displayed: destinationToDisplayInGrid,
destination: destination, destination: cfdestinationset.destinations[item].destination,
destination_announcement_id: destinationAnnouncementId, destination_announcement_id: cfdestinationset.announcement_id,
priority: priority, priority: cfdestinationset.destinations[item].priority,
timeout_displayed: ringFor, timeout_displayed: ringFor,
timeout: timeout, timeout: cfdestinationset.destinations[item].timeout,
sourceset: cfmappings.sourcesetName, sourceset: currentMapping.sourcesetName,
timeset: cfmappings.timesetName, timeset: currentMapping.timesetName,
destinationset_id: destinationId, destinationset_id: cfdestinationset.id,
destinationset_name: destinationName destinationset_name: cfdestinationset.name
}); });
arrayOfModels.push(cbModel); arrayOfModels.push(cbModel);
cfmappings._modelCreated = true; currentMapping._modelCreated = true;
} }
} }
}; };
@ -233,6 +222,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', {
var arrayOfModels = []; var arrayOfModels = [];
var currentRoute = window.location.hash; var currentRoute = window.location.hash;
var routeTimeset = this.getTimesetFromRoute(currentRoute); var routeTimeset = this.getTimesetFromRoute(currentRoute);
$vm.set('destStoresPopulated', false);
$vm.set('cft_ringtimeout', cftRingTimeout); $vm.set('cft_ringtimeout', cftRingTimeout);
store.removeAll(); store.removeAll();
Ext.Ajax.request({ Ext.Ajax.request({
@ -243,11 +233,12 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', {
var cfdestinationsets = decodedResponse._embedded['ngcp:cfdestinationsets']; var cfdestinationsets = decodedResponse._embedded['ngcp:cfdestinationsets'];
$cf.buildArrayOfModels(cfbMappings, 'cfb', routeTimeset, cfdestinationsets, cftRingTimeout, arrayOfModels); $cf.buildArrayOfModels(cfbMappings, 'cfb', routeTimeset, cfdestinationsets, cftRingTimeout, arrayOfModels);
$cf.buildArrayOfModels(cfuMappings, 'cfu', routeTimeset, cfdestinationsets, cftRingTimeout, arrayOfModels); $cf.buildArrayOfModels(cfuMappings, 'cfu', routeTimeset, cfdestinationsets, cftRingTimeout, arrayOfModels);
$cf.buildArrayOfModels(cftMappings, 'cft', routeTimeset, cfdestinationsets, cftRingTimeout, arrayOfModels); $cf.buildArrayOfModels(cftMappings, 'cft', routeTimeset, cfdestinationsets, cftRingTimeout, arrayOfModels, hasCftAndCfuMappings);
$cf.buildArrayOfModels(cfnaMappings, 'cfna', routeTimeset, cfdestinationsets, cftRingTimeout, arrayOfModels); $cf.buildArrayOfModels(cfnaMappings, 'cfna', routeTimeset, cfdestinationsets, cftRingTimeout, arrayOfModels);
$cf.addOwnPhoneToEmptyOnline(); $cf.addOwnPhoneToEmptyOnline();
if (arrayOfModels.length > 0) { if (arrayOfModels.length > 0) {
$cf.populateDestinationStores(arrayOfModels); $vm.set('arrayOfDestModels', arrayOfModels);
$cf.populateDestinationStores();
}; };
}; };
}, },
@ -259,7 +250,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', {
}, },
destinationIdExistsInArray: function(arr, id) { hasDestinationWithId: function(arr, id) {
return arr.some(function(arrObj) { return arr.some(function(arrObj) {
return id == arrObj.id; return id == arrObj.id;
}); });
@ -275,7 +266,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', {
Ext.each(store.getRange(), function(record) { Ext.each(store.getRange(), function(record) {
var data = record.getData(); var data = record.getData();
if (data.destination !== 'own phone') { if (data.destination !== 'own phone') {
switch (recordsToSend.length === 0 || !me.destinationIdExistsInArray(recordsToSend, data.destinationset_id)) { switch (recordsToSend.length === 0 || !me.hasDestinationWithId(recordsToSend, data.destinationset_id)) {
case true: case true:
// if recordsToSend array is empty or recordsToSend does not already contain current destinationset already // if recordsToSend array is empty or recordsToSend does not already contain current destinationset already
if (data.timeout) { if (data.timeout) {
@ -622,21 +613,24 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', {
}); });
}, },
populateDestinationStores: function(models) { populateDestinationStores: function() {
var $cf = this; var $cf = this;
var $vm = $cf.getViewModel();
var store; var store;
var stores = []; var stores = [];
var models = $vm.get('arrayOfDestModels');
if (models && !$vm.get('destStoresPopulated')) {
Ext.each(models, function(model) { Ext.each(models, function(model) {
var sourcename = $cf.getSourceNameFromSourceSet(model.get('sourceset')); var sourcename = $cf.getSourceNameFromSourceSet(model.get('sourceset'));
var timename = $cf.getTimeNameFromTimeSet(model.get('timeset')); var timename = $cf.getTimeNameFromTimeSet(model.get('timeset'));
var type = $cf.getGridCategoryFromType(model.get('type')); var type = $cf.getGridCategoryFromType(model.get('type'));
var storeName = sourcename + timename + type; var storeName = sourcename + timename + type;
store = Ext.getStore(storeName); store = Ext.getStore(storeName);
if(!store._emptied){ if (store) {
if (!store._emptied) {
store.removeAll(); store.removeAll();
store._emptied = true; store._emptied = true;
} }
if (store) {
store.add(model); store.add(model);
stores.push(store); stores.push(store);
} }
@ -648,6 +642,8 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', {
store._emptied = false; store._emptied = false;
}); });
}; };
$vm.set('destStoresPopulated', true);
};
}, },
addOwnPhoneToEmptyOnline: function () { addOwnPhoneToEmptyOnline: function () {
@ -717,6 +713,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', {
return; return;
} }
}); });
$cf.populateDestinationStores();
} else { } else {
var models = []; var models = [];
Ext.Ajax.request({ Ext.Ajax.request({

@ -35,7 +35,9 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardModel', {
after_hours_exists_in_api: false, after_hours_exists_in_api: false,
company_hours_exists_in_api: false, company_hours_exists_in_api: false,
last_store_synced: '', last_store_synced: '',
cft_ringtimeout: '15' cft_ringtimeout: '15',
arrayOfDestModels: null,
destStoresPopulated: false
}, },
formulas: { formulas: {

Loading…
Cancel
Save