diff --git a/app/model/CallForward.js b/app/model/CallForward.js deleted file mode 100644 index b15e7760..00000000 --- a/app/model/CallForward.js +++ /dev/null @@ -1,42 +0,0 @@ -Ext.define('NgcpCsc.model.CallForward', { - extend: 'Ext.data.Model', - - fields: [{ - name: 'id', - type: 'string' - }, { - name: 'type', - type: 'auto' - }, { - name: 'destination_cleaned', - type: 'auto' - }, { - name: 'destination_announcement_id', - type: 'auto' - }, { - name: 'destination', - type: 'auto' - }, { - name: 'priority', - type: 'auto' - }, { - name: 'simple_destination', - type: 'auto' - }, { - name: 'ring_for', - type: 'auto' - }, { - name: 'sourceset', - type: 'auto' - }, { - name: 'timeset', - type: 'auto' - }, { - name: 'destinationset_id', - type: 'auto' - }, { - name: 'destinationset_name', - type: 'auto' - }] - -}); diff --git a/app/model/CallForwardDestination.js b/app/model/CallForwardDestination.js new file mode 100644 index 00000000..c50b3732 --- /dev/null +++ b/app/model/CallForwardDestination.js @@ -0,0 +1,53 @@ +Ext.define('NgcpCsc.model.CallForwardDestination', { + extend: 'Ext.data.Model', + + fields: [{ + name: 'id', + type: 'string' + }, + { + name: 'type' + }, + { + name: 'destination_displayed' + }, + { + name: 'destination' + }, + { + name: 'after_termination', + defaultValue: false + }, + { + name: 'destination_announcement_id', + defaultValue: null + }, + { + name: 'priority', + defaultValue: '1' + }, + { + name: 'timeout_displayed' + }, + { + name: 'timeout' + }, + { + name: 'sourceset' + }, + { + name: 'timeset' + }, + { + name: 'destinationset_id' + }, + { + name: 'destinationset_name' + }, + { + name: 'label', + defaultValue: '' + } + ] + +}); diff --git a/app/model/CallForwardSourceset.js b/app/model/CallForwardSourceset.js index ecc13f39..8f65f3c0 100644 --- a/app/model/CallForwardSourceset.js +++ b/app/model/CallForwardSourceset.js @@ -5,14 +5,11 @@ Ext.define('NgcpCsc.model.CallForwardSourceset', { name: 'id', type: 'string' }, { - name: 'sourceset_name', - type: 'auto' + name: 'sourceset_name' }, { - name: 'sourceset_id', - type: 'auto' + name: 'sourceset_id' }, { - name: 'source', - type: 'auto' + name: 'source' }, { name: 'edit', type: 'boolean' diff --git a/app/model/CallForwardTimeset.js b/app/model/CallForwardTimeset.js index 9c8a0773..0ed9203b 100644 --- a/app/model/CallForwardTimeset.js +++ b/app/model/CallForwardTimeset.js @@ -5,23 +5,17 @@ Ext.define('NgcpCsc.model.CallForwardTimeset', { name: 'id', type: 'string' }, { - name: 'timeset_name', - type: 'auto' + name: 'timeset_name' }, { - name: 'timeset_id', - type: 'auto' + name: 'timeset_id' }, { - name: 'time_from', - type: 'auto' + name: 'time_from' }, { - name: 'time_to', - type: 'auto' + name: 'time_to' }, { - name: 'day', - type: 'auto' + name: 'day' }, { - name: 'closed', - type: 'auto' + name: 'closed' }] }); diff --git a/app/store/CallForward.js b/app/store/CallForwardDestinations.js similarity index 71% rename from app/store/CallForward.js rename to app/store/CallForwardDestinations.js index f9eca466..e4e115ae 100644 --- a/app/store/CallForward.js +++ b/app/store/CallForwardDestinations.js @@ -1,9 +1,9 @@ -Ext.define('NgcpCsc.store.CallForward', { +Ext.define('NgcpCsc.store.CallForwardDestinations', { extend: 'Ext.data.Store', - storeId: 'CallForward', + storeId: 'CallForwardDestinations', - model: 'NgcpCsc.model.CallForward', + model: 'NgcpCsc.model.CallForwardDestination', proxy: { type: 'ngcp-api', diff --git a/classic/sass/src/view/pages/callforward/CallForward.scss b/classic/sass/src/view/pages/callforward/CallForward.scss index 5b57b235..93a55780 100644 --- a/classic/sass/src/view/pages/callforward/CallForward.scss +++ b/classic/sass/src/view/pages/callforward/CallForward.scss @@ -92,3 +92,12 @@ } } } + +.below-termination { + background: #FFB0C4; + color: grey; +} +.above-termination { + background: #B0FFC5; + color: black; +} diff --git a/classic/src/view/login/LoginController.js b/classic/src/view/login/LoginController.js index e5c71d12..97a190fa 100644 --- a/classic/src/view/login/LoginController.js +++ b/classic/src/view/login/LoginController.js @@ -50,20 +50,6 @@ Ext.define('NgcpCsc.view.login.LoginController', { } }, - loadSubscriberDomain: function () { - Ext.Ajax.request({ - url: window.location.origin + '/api/subscribers/' + localStorage.getItem('subscriber_id'), - success: function(response, opts) { - var decodedResponse = Ext.decode(response.responseText); - var domain = decodedResponse.domain; - localStorage.setItem('domain', domain); - }, - failure: function(response, opts) { - console.log('server-side failure with status code ' + response.status); - } - }); - }, - unsuccessLogin: function(response) { localStorage.removeItem('jwt'); Ext.Msg.alert('Error', 'Username or Password not valid!'); diff --git a/classic/src/view/pages/callforward/CallForwardController.js b/classic/src/view/pages/callforward/CallForwardController.js index d7ec2ba8..6db40286 100644 --- a/classic/src/view/pages/callforward/CallForwardController.js +++ b/classic/src/view/pages/callforward/CallForwardController.js @@ -21,12 +21,23 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { } }, - destinationDropped: function (node, data, overModel, dropPosition, eOpts) { - // TODO: Leaving uncommented code here for upcoming task #17654 - // var store = Ext.getStore('everybody-always-CallForwardBusy'); - // Ext.each(store.getRange(), function(record) { - // console.log(record.get('destination_cleaned')); - // }) + destinationDropped: function(node, data, overModel, dropPosition, eOpts) { + var dropRec = data.records[0]; + var store = overModel.store; + var recIndex = store.indexOf(dropRec); + var adjacentRec = dropPosition === 'before' ? store.getAt(recIndex+1) : store.getAt(recIndex-1); + var destinationsetId = adjacentRec.get('destinationset_id') === dropRec.get('destinationset_id') ? dropRec.get('destinationset_id') : adjacentRec.get('destinationset_id'); + var destinationsetName = adjacentRec.get('destinationset_name') === dropRec.get('destinationset_name') ? dropRec.get('destinationset_name') : adjacentRec.get('destinationset_name'); + var afterTermination = adjacentRec.get('after_termination') === dropRec.get('after_termination') ? dropRec.get('after_termination') : adjacentRec.get('after_termination'); + var priority = adjacentRec.get('priority') === dropRec.get('priority') ? dropRec.get('priority') : adjacentRec.get('priority'); + var type = adjacentRec.get('type') === dropRec.get('type') ? dropRec.get('type') : adjacentRec.get('type'); + dropRec.set('destinationset_id', destinationsetId); + dropRec.set('destinationset_name', destinationsetName); + dropRec.set('after_termination', afterTermination); + dropRec.set('priority', priority); + dropRec.set('type', type); + this.setLabelTerminationType(store); + store.sync(); }, cfTimesetStoreLoaded: function(store, data) { @@ -46,7 +57,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { if (/(After|Company)\s(Hours)/.test(timesetName)) { var times = me.getModelValuesFromTimesData(timeset.times[0]); Ext.each(times.days, function (weekday) { - var cfModel = Ext.create('NgcpCsc.model.CallForward', { + var cfModel = Ext.create('NgcpCsc.model.CallForwardDestination', { id: Ext.id(), timeset_name: timesetName, timeset_id: timesetId, @@ -95,7 +106,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { var sourcesetId = sourceset.id; me.setVmToTrue(sourcesetName); Ext.each(sourceset.sources, function (sourceEntry) { - var cfModel = Ext.create('NgcpCsc.model.CallForward', { + var cfModel = Ext.create('NgcpCsc.model.CallForwardDestination', { id: Ext.id(), sourceset_name: sourcesetName, sourceset_id: sourcesetId, @@ -125,6 +136,24 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { }; }, + sortDestinationsetByPriority: function (destinations) { + var sorted = destinations.sort(function(a, b) { + return parseFloat(a.priority) - parseFloat(b.priority); + }); + return sorted; + }, + + addCftOwnPhone: function (destinations) { + if (destinations.length > 0) { + destinations.unshift({ + "announcement_id": null, + "destination": "own phone", + "priority": 1, + "timeout": 15 + }) + } + }, + cfStoreLoaded: function(store, data) { var me = this; var cfTypeArrayOfObjects = [data.get('cfu'), data.get('cft'), data.get('cfb'), data.get('cfna')]; @@ -143,9 +172,11 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { var decodedResponse = Ext.decode(response.responseText); if (decodedResponse._embedded) { var destinationsets = decodedResponse._embedded['ngcp:cfdestinationsets']; + destinationsets[0].destinations = me.sortDestinationsetByPriority(destinationsets[0].destinations); me.getView()._preventReLoad = true; // assumes there is no need to reload the store Ext.each(cfTypeArrayOfObjects, function (cfTypeObjects, index) { var cfType = cfTypes[index]; + cfType !== 'cft' && me.addCftOwnPhone(destinationsets[0].destinations); // if 'cft' we invoke addCftOwnPhone() Ext.each(cfTypeObjects, function(cfTypeObject) { var destinationsetName = cfTypeObject.destinationset; var sourcesetName = cfTypeObject.sourceset; @@ -154,22 +185,23 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { Ext.each(destinationsets, function(destinationset) { if (destinationset.name == destinationsetName) { for (item in destinationset.destinations) { - var destinationToUse = me.getDestinationFromSipId(destinationset.destinations[item].destination); + var destinationToDisplayInGrid = me.getDestinationFromSipId(destinationset.destinations[item].destination); var destinationAnnouncementId = destinationset.announcement_id; var destination = destinationset.destinations[item].destination; var priority = destinationset.destinations[item].priority; - var simpleDestination = destinationset.destinations[item].simple_destination; + var timeout = destinationset.destinations[item].timeout; var destinationId = destinationset.id; var destinationName = destinationset.name; - var ringFor = destinationToUse == 'Voicemail' ? '' : destinationset.destinations[item].timeout; - var cbModel = Ext.create('NgcpCsc.model.CallForward', { + // Removes timeout if destination is not a number + var ringFor = !Ext.isNumber(parseInt(destinationToDisplayInGrid)) ? '' : destinationset.destinations[item].timeout; + var cbModel = Ext.create('NgcpCsc.model.CallForwardDestination', { type: cfType, - destination_cleaned: destinationToUse, - destination_announcement_id: destinationAnnouncementId, + destination_displayed: destinationToDisplayInGrid, destination: destination, + destination_announcement_id: destinationAnnouncementId, priority: priority, - simple_destination: simpleDestination, - ring_for: ringFor, + timeout_displayed: ringFor, + timeout: timeout, sourceset: sourcesetName, timeset: timesetName, destinationset_id: destinationId, @@ -202,24 +234,34 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { }, cfStoreBeforeSync: function(store, options) { - // TODO: #17654 Ensure we also have ability to display and write all - // required destination types, like voicemail, fax, conference, etc var me = this; var recordsToSend = []; delete options['destroy']; delete options['create']; + delete options['update']; Ext.each(store.getRange(), function(record) { var data = record.getData(); - switch (recordsToSend.length === 0 || !me.destinationIdExistsInArray(recordsToSend, data.destinationset_id)) { - case true: - recordsToSend.push({id: data.destinationset_id, records: [{ "announcement_id": null, "destination": data.simple_destination, "priority": data.priority, "timeout": data.ring_for }]}); - break; - case false: - recordsToSend.forEach(function (obj, index) { - if (obj.id == data.destinationset_id) { - recordsToSend[index].records.push({ "announcement_id": null, "destination": data.simple_destination, "priority": data.priority, "timeout": data.ring_for }); - } - }) + if (data.destination !== 'own phone') { + switch (recordsToSend.length === 0 || !me.destinationIdExistsInArray(recordsToSend, data.destinationset_id)) { + case true: + recordsToSend.push({id: data.destinationset_id, records: [{ + "announcement_id": null, + "destination": data.destination, + "priority": data.priority, + "timeout": data.timeout }]}); + break; + case false: + recordsToSend.forEach(function (obj, index) { + if (obj.id == data.destinationset_id) { + recordsToSend[index].records.push({ + "announcement_id": null, + "destination": data.destination, + "priority": data.priority, + "timeout": data.timeout }); + }; + }); + break; + }; }; }); Ext.each(recordsToSend, function (obj) { @@ -274,54 +316,36 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { return false; }, - timesBasedOnRecords: function (store) { - // TODO: Started this, but then discovered the issue leading to creation - // of #18401. Leaving the code in place for upcoming task #18401 - var recordsToSend = []; - Ext.each(store.getRange(), function(record) { - var data = record.getData(); - // console.log(data.time_from); - // console.log(data.time_to); - // For fields of data that have been changed in the grid, data is in - // this format: - // Tue Jan 01 2008 13:00:00 GMT+0100 (CET) - }); - return recordsToSend; - }, - cfTimesetBeforeSync: function (store, options) { delete options['destroy']; delete options['create']; delete options['update']; - var timesetId = store.last().get('timeset_id'); - // var recordsToSend = this.timesBasedOnRecords(store); - // TODO: Example ajax request for #18401 - // Ext.Ajax.request({ - // url: '/api/cftimesets/' + timesetId, - // method: 'PATCH', - // headers: { 'Content-Type': 'application/json-patch+json' }, - // jsonData: [{ - // "op": "add", - // "path": "/times", - // "value": recordsToSend - // }], - // success: function(response, opts) { - // console.log('server-side success with status code ' + response.status); - // }, - // failure: function(response, opts) { - // console.log('server-side failure with status code ' + response.status); - // } - // }); return false; }, getDestinationFromSipId: function (destination) { - var splitDestination = destination.split(/(:|@)/); - if (splitDestination[4] == 'voicebox.local') { - return 'Voicemail'; - } else { - return splitDestination[2]; - } + var splitDestination = destination === 'own phone' ? [null, null, 'own phone', null, null] : destination.split(/(:|@)/); + switch (splitDestination[4]) { + case 'voicebox.local': + return 'Voicemail'; + break; + case 'conference.local': + return 'Conference'; + break; + case 'fax2mail.local': + return 'Fax2Mail'; + break; + default: + // Returns parsed destination URI/Number types to make them + // human readable in grid, as well as for any app.local types + // that might exist (callingcard, callthrough, autoattendant, + // officehours, customhours, localuser) + if (!Ext.isNumber(parseInt(splitDestination[2]))) { + return Ext.util.Format.capitalize(splitDestination[2]); + } else { + return splitDestination[2]; + }; + }; }, getGridCategoryFromType: function (type) { @@ -336,7 +360,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { case 'cfna': return 'CallForwardOffline'; break; - } + }; }, getTypeFromTypeName: function (type) { @@ -350,7 +374,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { case 'Offline': return 'cfna'; break; - } + }; }, getSourceNameFromSourceSet: function (sourceset) { @@ -364,7 +388,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { case null: return 'everybody-'; break; - } + }; }, getSourceSetFromSourceName: function (sourceset) { @@ -378,7 +402,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { case null: return null; break; - } + }; }, getTimeNameFromTimeSet: function (timeset) { @@ -465,12 +489,60 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { }; }, + setLabelTerminationType: function (store) { + var terminationPositionRecord = store.findRecord('destination_displayed', /(Voicemail|Fax2Mail|Conference|Custom-hours|Office-hours|Auto-attendant|Callthrough|Callingcard)/); + var storeCount = store.getCount(); + // Sets after_termination value for all records after first non-number + if (terminationPositionRecord && terminationPositionRecord.get('destination_displayed')) { + var terminationPositionIndex = store.indexOf(terminationPositionRecord); + var terminationTrueIndexRange = []; + var terminationFalseIndexRange = []; + for (i = terminationPositionIndex+1; i < storeCount; i++) { + terminationTrueIndexRange.push(i); + }; + for (i = terminationPositionIndex; i >= 0; i--) { + terminationFalseIndexRange.push(i); + }; + terminationTrueIndexRange.map(function (index) { + store.getAt(index).set('after_termination', true); + }); + terminationFalseIndexRange.map(function (index) { + store.getAt(index).set('after_termination', false); + }); + }; + // Set all cft records to after_termination true if cfu records exist + if (store.findRecord('type', 'cfu') && store.findRecord('type', 'cft')) { + Ext.each(store.getRange(), function(record) { + if (!record.get('after_termination') && record.get('type') === 'cft') { + record.set('after_termination', true); + }; + }); + }; + // Sorts "own phone" to top plus prevents it from being reordered + Ext.each(store.getRange(), function(record) { + if (record.get('destination') === 'own phone') { + record.set('label', 'first ring'); + record.set('after_termination', false); + store.remove(record); + store.insert(0, record); + }; + }); + // Sets "first ring", "then forward to ..." and "" (empty) labels + Ext.each(store.getRange(), function(record, index) { + if (index === 0) { + record.set('label', 'first ring'); + } else if (index === 1) { + record.set('label', 'then forward to ...'); + } else { + record.set('label', ''); + } + }); + }, + populateDestinationStores: function (models) { var me = this; - var gridName = this.getGridCategoryFromType(models[0].get('type')); var store; - // TODO: #17654 New grid logic and styling with conditions for cft/cfu, - // and remove first ring section + var stores = []; Ext.each(models, function (model) { var sourcename = me.getSourceNameFromSourceSet(model.get('sourceset')); var timename = me.getTimeNameFromTimeSet(model.get('timeset')); @@ -479,10 +551,14 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { store = Ext.getStore(storeName); if (store) { store.add(model); + stores.push(store); } }); if (store) { - store.commitChanges(); + Ext.each(stores, function (store) { + store.commitChanges(); + me.setLabelTerminationType(store); + }); } }, @@ -661,7 +737,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { }, success: function(response, opts) { var sourcesetId = response.getResponseHeader('Location').split('/')[3]; - var cfSourcesetModel = Ext.create('NgcpCsc.model.CallForward', { + var cfSourcesetModel = Ext.create('NgcpCsc.model.CallForwardSourceset', { id: Ext.id(), source: " ", sourceset_name: sourcesetName, @@ -720,11 +796,13 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { }, confirmCFRemoval: function(record) { + var me = this; var store = record.store; if(store){ store.remove(record); store.sync(); - } + me.setLabelTerminationType(store); + }; }, getStoresArrayFromRoute: function(currentRoute, currentSourceset) { @@ -779,12 +857,14 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { }, renderDestinationColumn: function(value, metaData, record) { - if (record.get('ring_for') === '' && !Ext.isNumber(parseInt(value))) { + if (record.get('timeout_displayed') === '' && !Ext.isNumber(parseInt(value))) { return Ext.String.format('{0}', value); + } else if (record.get('destination') === 'own phone') { + return Ext.String.format('own phone and ring for {0} secs', record.get('timeout_displayed')); } else if (Ext.isNumber(parseInt(value))) { - return Ext.String.format('+{0} and ring for {1} secs', value, record.get('ring_for')); + return Ext.String.format('+{0} and ring for {1} secs', value, record.get('timeout_displayed')); } else { - return Ext.String.format('{0} and ring for {1} secs', value, record.get('ring_for')); + return Ext.String.format('{0} and ring for {1} secs', value, record.get('timeout_displayed')); }; }, @@ -942,8 +1022,8 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { var simpleDestination = destination; var priority = 1; var storeCount = store.getCount(); - var ringFor = destination == 'Voicemail' ? '' : timeout; - var destinationCleaned = destination; + // Removes timeout if destination is not a number + var ringFor = !Ext.isNumber(parseInt(destination)) ? '' : timeout; var storeIdSplit = store.storeId.split('-'); var newSourcesetName = storeIdSplit[0] == 'everybody' ? null : storeIdSplit[0]; var newTimesetName = storeIdSplit[1] == 'always' ? null : storeIdSplit[1]; @@ -951,39 +1031,36 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { var newSourceset = this.getSourceSetFromSourceName(newSourcesetName); var newTimeset = this.getTimeSetFromTimeSource(newTimesetName); var newType = this.getTypeFromTypeName(newTypeName); - var newDomain = localStorage.getItem('domain'); - // TODO: #17654 Consider the fact that one destinationset can be in - // several grids, so if you write one, update all other grids with - // that same destinationset id + var newDestination = destination === 'Voicemail' ? 'voicebox' : destination.toLowerCase(); + // TODO: Sets default timeout to 10 for non-number types, as can not be + // set to null. Not sure if this has any implication, so needs to be + // checked with Andreas + var newTimeout = !timeout ? '10' : timeout; if (!store.last()) { // if store empty we need to create new destset var newDestinationsetName = 'csc_defined_' + newType; var subscriberId = localStorage.getItem('subscriber_id'); Ext.Ajax.request({ url: '/api/cfdestinationsets/', method: 'POST', - defaultHeaders: 'Prefer: return=representation', jsonData: { name: newDestinationsetName, subscriber_id: subscriberId }, success: function(response, opts) { var destinationsetId = response.getResponseHeader('Location').split('/')[3]; - var cfModel = Ext.create('NgcpCsc.model.CallForward', { + var cfModel = Ext.create('NgcpCsc.model.CallForwardDestination', { type: newType, - destination_cleaned: destinationCleaned, - destination_announcement_id: null, - destination: 'sip:' + destination + '@' + newDomain, - // Keeping priority 1 as default for now, as we'll handle priotity - // with grid "drag-and-drop" widget plugin in upcoming task - priority: 1, - simple_destination: destination, - ring_for: ringFor, + destination_displayed: destination, + destination: newDestination, + timeout_displayed: ringFor, + timeout: newTimeout, sourceset: newSourceset, timeset: newTimeset, destinationset_id: destinationsetId, destinationset_name: newDestinationsetName }); store.add(cfModel); + me.setLabelTerminationType(store); store.sync(); // Creates new sourceset/timeset if variable is not set to null newSourceset && me.createNewStandardSet('/api/cfsourcesets/', newSourceset, subscriberId); @@ -996,20 +1073,30 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { }); } else { var lastRecordInStore = store.last(); - var cfModel = Ext.create('NgcpCsc.model.CallForward', { + var afterTermination = false; + switch (true) { + case (!lastRecordInStore.get('after_termination') && !Ext.isNumber(parseInt(lastRecordInStore.get('destination_displayed')))): + afterTermination = true; + break; + case (lastRecordInStore.get('after_termination')): + afterTermination = true; + break; + }; + var cfModel = Ext.create('NgcpCsc.model.CallForwardDestination', { type: lastRecordInStore.get('type'), - destination_cleaned: destinationCleaned, - destination_announcement_id: null, - destination: 'sip:' + destination + '@' + newDomain, - priority: 1, - simple_destination: destination, - ring_for: ringFor, + destination_displayed: destination, + destination: newDestination, + after_termination: afterTermination, + priority: lastRecordInStore.get('priority'), + timeout_displayed: ringFor, + timeout: newTimeout, sourceset: lastRecordInStore.get('sourceset'), timeset: lastRecordInStore.get('timeset'), destinationset_id: lastRecordInStore.get('destinationset_id'), destinationset_name: lastRecordInStore.get('destinationset_name') }); store.add(cfModel); + me.setLabelTerminationType(store); store.sync(); } }, @@ -1040,9 +1127,4 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { store.sync(); } - // TODO #18401, maybe use a blur or change listener on editors in grid - // editingTimeDone: function () { - // - // } - }); diff --git a/classic/src/view/pages/callforward/CallForwardMainForm.js b/classic/src/view/pages/callforward/CallForwardMainForm.js index 5284ff9d..eab01896 100644 --- a/classic/src/view/pages/callforward/CallForwardMainForm.js +++ b/classic/src/view/pages/callforward/CallForwardMainForm.js @@ -37,17 +37,20 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardMainForm', { store: storeListB }); var busyGrid = Ext.create('NgcpCsc.view.pages.callforward.CallForwardMainGrid', { - store: Ext.create('NgcpCsc.store.CallForward', { + id: this._firstprefix + this._secondprefix + 'CallForwardBusy', + store: Ext.create('NgcpCsc.store.CallForwardDestinations', { storeId: this._firstprefix + this._secondprefix + 'CallForwardBusy' }) }); var onlineGrid = Ext.create('NgcpCsc.view.pages.callforward.CallForwardMainGrid', { - store: Ext.create('NgcpCsc.store.CallForward', { + id: this._firstprefix + this._secondprefix + 'CallForwardOnline', + store: Ext.create('NgcpCsc.store.CallForwardDestinations', { storeId: this._firstprefix + this._secondprefix + 'CallForwardOnline' }) }); var offlineGrid = Ext.create('NgcpCsc.view.pages.callforward.CallForwardMainGrid', { - store: Ext.create('NgcpCsc.store.CallForward', { + id: this._firstprefix + this._secondprefix + 'CallForwardOffline', + store: Ext.create('NgcpCsc.store.CallForwardDestinations', { storeId: this._firstprefix + this._secondprefix + 'CallForwardOffline' }) }); @@ -94,20 +97,11 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardMainForm', { layout: 'hbox', margin: '15 0 0 0', items: [ - // NOTE: Commenting out this now, and will tackle it as part of #17651 - // { - // xtype: 'button', - // html: Ngcp.csc.locales.callforward.change_title[localStorage.getItem('languageSelected')], - // id: this._firstprefix + this._secondprefix + 'lista_titleField-showButton', - // margin: '0 0 0 500', - // handler: 'toggleChangeTitle' - // }, { xtype: 'button', text: Ngcp.csc.locales.callforward.add_new_source[localStorage.getItem('languageSelected')], id: this._firstprefix + this._secondprefix + 'addListAButton', margin: '0 0 0 620', - // margin: '0 0 0 10', width: 135, listeners: { click: 'addEmptySourcesetRow' @@ -158,21 +152,12 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardMainForm', { hidden: '{list_b}' }, items: [ - // NOTE: Commenting out this now, and will tackle it as part of #17651 - // { - // xtype: 'button', - // html: Ngcp.csc.locales.callforward.change_title[localStorage.getItem('languageSelected')], - // id: this._firstprefix + this._secondprefix + 'listb_titleField-showButton', - // margin: '0 0 0 500', - // handler: 'toggleChangeTitle' - // }, { xtype: 'button', text: Ngcp.csc.locales.callforward.add_new_source[localStorage.getItem('languageSelected')], id: this._firstprefix + this._secondprefix + 'addListBButton', width: 135, margin: '0 0 0 620', - // margin: '0 0 0 10', listeners: { click: 'addEmptySourcesetRow' } @@ -182,60 +167,11 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardMainForm', { xtype: 'container', userCls: 'cf-text cf-subheader', html: Ngcp.csc.locales.callforward.when_phone_online[localStorage.getItem('languageSelected')] - }, { - xtype: 'panel', - layout: 'hbox', - id: this._firstprefix + this._secondprefix + 'onlineFirstRingFields', - padding: '0 11 0 0', - width: 500, - margin: '0 0 0 50', - items: [{ - xtype: 'combo', - store: 'FirstRingActions', - valueField: 'name', - displayField: 'name', - id: this._firstprefix + this._secondprefix + 'onlineFirstDest', - fieldLabel: Ngcp.csc.locales.callforward.first_ring[localStorage.getItem('languageSelected')], - value: 'Own phone', - allowBlank: false, - editable: false, - listeners: { - change: 'selectRing' - }, - flex: 5 - }, { - xtype: 'numberfield', - step: 10, - minValue:0, - maxValue: 300, - value: '10', - id: this._firstprefix + this._secondprefix + 'onlineFirstTimeout', - allowBlank: false, - editable: true, - flex: 4, - margin: '0 0 0 10', - bind: { - hidden: '{online_first_timeout_hidden}' - }, - fieldLabel: Ngcp.csc.locales.callforward.and_ring_for[localStorage.getItem('languageSelected')] - }, { - xtype: 'container', - html: Ngcp.csc.locales.callforward.secs[localStorage.getItem('languageSelected')], - padding: '7 0 0 20', - flex: 1, - bind: { - hidden: '{online_first_timeout_hidden}' - } - }] }, { xtype: 'container', layout: 'hbox', margin: '10 0 0 50', - items: [{ - xtype: 'container', - html: Ngcp.csc.locales.callforward.then_forward_to[localStorage.getItem('languageSelected')], - userCls: 'cf-thentext' - }, + items: [ onlineGrid ] }, { @@ -337,11 +273,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardMainForm', { xtype: 'container', layout: 'hbox', margin: '10 0 0 50', - items: [{ - xtype: 'container', - html: Ngcp.csc.locales.callforward.forward_to[localStorage.getItem('languageSelected')], - userCls: 'cf-thentext' - }, + items: [ busyGrid ] }, { @@ -443,11 +375,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardMainForm', { xtype: 'container', layout: 'hbox', margin: '10 0 0 50', - items: [{ - xtype: 'container', - html: Ngcp.csc.locales.callforward.forward_to[localStorage.getItem('languageSelected')], - userCls: 'cf-thentext' - }, + items: [ offlineGrid ] }, { diff --git a/classic/src/view/pages/callforward/CallForwardMainGrid.js b/classic/src/view/pages/callforward/CallForwardMainGrid.js index b61f90c9..b74d852d 100644 --- a/classic/src/view/pages/callforward/CallForwardMainGrid.js +++ b/classic/src/view/pages/callforward/CallForwardMainGrid.js @@ -14,30 +14,22 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardMainGrid', { dragText: Ngcp.csc.locales.callforward.drag_text[localStorage.getItem('languageSelected')] }, markDirty: false, - emptyText: Ngcp.csc.locales.callforward.nowhere[localStorage.getItem('languageSelected')], + emptyText: Ngcp.csc.locales.callforward.forward_to[localStorage.getItem('languageSelected')] + '<span style="padding-left: 40px;">' + Ngcp.csc.locales.callforward.nowhere[localStorage.getItem('languageSelected')] + '</span>', deferEmptyText: false, stripeRows: false, listeners: { drop: 'destinationDropped' + }, + getRowClass: function(record, index) { + var afterTermination = record.get('after_termination'); + if (afterTermination) { + return 'below-termination'; + } else { + return 'above-termination'; + } } }, - // TODO: Leaving this for PUT/PATCH task, as it might make sense to use - // with unmask triggered in controller - // listeners: { - // render: function(grid) { - // grid.body.mask('Loading...'); - // var store = grid.getStore(); - // Ext.defer(function() { - // store.load; - // }, 100); - // Ext.defer(function() { - // grid.body.unmask(); - // }, 600); - // }, - // delay: 200 - // }, - plugins: { ptype: 'cellediting', clicksToEdit: 1 @@ -47,7 +39,10 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardMainGrid', { var me = this; me.columns = [{ - dataIndex: 'destination_cleaned', // Renderer also uses ring_for value + dataIndex: 'label', + width: 135 + }, { + dataIndex: 'destination_displayed', // Renderer also uses ring_for value width: 285, renderer: 'renderDestinationColumn' }, { diff --git a/classic/src/view/pages/callforward/CallForwardTimesetGrid.js b/classic/src/view/pages/callforward/CallForwardTimesetGrid.js index d2e6678c..5514c48d 100644 --- a/classic/src/view/pages/callforward/CallForwardTimesetGrid.js +++ b/classic/src/view/pages/callforward/CallForwardTimesetGrid.js @@ -7,11 +7,6 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardTimesetGrid', { markDirty: false }, - // TODO: #18401 - // listeners: { - // edit: 'editingTimeDone' - // }, - initComponent: function() { this.columns = { defaults: { @@ -25,7 +20,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardTimesetGrid', { flex: 1 }, { text: Ngcp.csc.locales.common.from[localStorage.getItem('languageSelected')], - dataIndex: 'time_from', // TODO: #18401 Add listener + dataIndex: 'time_from', xtype: 'widgetcolumn', editable: false, flex: 1, @@ -39,7 +34,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardTimesetGrid', { } }, { text: Ngcp.csc.locales.common.to[localStorage.getItem('languageSelected')], - dataIndex: 'time_to', // TODO: #18401 Add listener + dataIndex: 'time_to', xtype: 'widgetcolumn', editable: false, flex: 1, diff --git a/classic/src/view/pages/callforward/afterhours/AfterHours.js b/classic/src/view/pages/callforward/afterhours/AfterHours.js index 4e5dacb2..42e46781 100644 --- a/classic/src/view/pages/callforward/afterhours/AfterHours.js +++ b/classic/src/view/pages/callforward/afterhours/AfterHours.js @@ -6,7 +6,7 @@ Ext.define('NgcpCsc.view.pages.callforward.afterhours.Afterhours', { ui: 'cf-mainform', initComponent: function() { - var cfInitialStore = Ext.create('NgcpCsc.store.CallForward', { + var cfInitialStore = Ext.create('NgcpCsc.store.CallForwardDestinations', { storeId: 'CallForwardAfterHours', _type: 'afterHours', autoLoad: true, diff --git a/classic/src/view/pages/callforward/always/Always.js b/classic/src/view/pages/callforward/always/Always.js index 4a270ffa..760488cb 100644 --- a/classic/src/view/pages/callforward/always/Always.js +++ b/classic/src/view/pages/callforward/always/Always.js @@ -8,7 +8,7 @@ Ext.define('NgcpCsc.view.pages.callforward.always.Always', { viewModel: 'callforward', initComponent: function() { - var cfInitialStore = Ext.create('NgcpCsc.store.CallForward',{ + var cfInitialStore = Ext.create('NgcpCsc.store.CallForwardDestinations',{ storeId: 'CallForwardAlways', _type: 'always', autoLoad: true, diff --git a/classic/src/view/pages/callforward/companyhours/CompanyHours.js b/classic/src/view/pages/callforward/companyhours/CompanyHours.js index 91d48fc5..41af35b1 100644 --- a/classic/src/view/pages/callforward/companyhours/CompanyHours.js +++ b/classic/src/view/pages/callforward/companyhours/CompanyHours.js @@ -6,7 +6,7 @@ Ext.define('NgcpCsc.view.pages.callforward.companyhours.Companyhours', { ui: 'cf-mainform', initComponent: function() { - var cfInitialStore = Ext.create('NgcpCsc.store.CallForward', { + var cfInitialStore = Ext.create('NgcpCsc.store.CallForwardDestinations', { storeId: 'CallForwardCompanyHours', _type: 'companyHours', autoLoad: true,