diff --git a/app/utils/locales.js b/app/utils/locales.js index 9e1fd334..9b099acd 100644 --- a/app/utils/locales.js +++ b/app/utils/locales.js @@ -777,6 +777,9 @@ Ext.define('Ngcp.csc.locales', { fr: 'CALL FORWARD', sp: 'CALL FORWARD' }, + add_new_period: { + en: 'ADD NEW PERIOD' + }, time_one: { en: 'Always', it: 'Always', diff --git a/classic/src/view/pages/callforward/CallForwardController.js b/classic/src/view/pages/callforward/CallForwardController.js index 4f97b3ce..68ed7841 100644 --- a/classic/src/view/pages/callforward/CallForwardController.js +++ b/classic/src/view/pages/callforward/CallForwardController.js @@ -41,15 +41,15 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { store.sync(); }, - checkIncompatibleTimeset: function(timeSlot){ + checkIncompatibleTimeset: function(timeSlot) { var mday = timeSlot.mday; var minute = timeSlot.minute; var month = timeSlot.month; var year = timeSlot.year; - return mday || minute || month || year; + return mday || minute || month || year; }, - parseTimesetApiToRecords: function(times, timesetName) { + parseTimesetApiToRecords: function(times, timesetName, timesetId) { var retData = []; var me = this; var vm = me.getViewModel(); @@ -63,14 +63,16 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { 7: 'Saturday' }; Ext.each(times, function(timeSlot) { - var days = timeSlot.wday.split('-'); - var fromHour = timeSlot.hour ? parseInt(timeSlot.hour.split('-')[0]) : null; - var toHour = timeSlot.hour ? parseInt(timeSlot.hour.split('-')[1]) : null; var checkIncompatibleTimeset = me.checkIncompatibleTimeset(timeSlot); - if(checkIncompatibleTimeset){ + if (checkIncompatibleTimeset || !timeSlot.wday || !timeSlot.hour) { vm.set(me.getTimesetPrexifFromName(timesetName) + '_add_text', '
' + Ngcp.csc.locales.callforward.invalid_times[localStorage.getItem('languageSelected')] + '
'); + vm.set(me.getTimesetPrexifFromName(timesetName) + '_is_invalid', timesetId); return; } + var days = timeSlot.wday ? timeSlot.wday.split('-') : []; + var fromHour = timeSlot.hour ? parseInt(timeSlot.hour.split('-')[0]) : null; + var toHour = timeSlot.hour ? parseInt(timeSlot.hour.split('-')[1]) : null; + if (days.length > 1) { var fromDay = parseInt(days[0]); var toDay = parseInt(days[1]); @@ -93,22 +95,22 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { }, sortTimeSlots: function(timeSlot1, timeSlot2) { - switch(true){ + switch (true) { case timeSlot1.dayArrIndex < timeSlot2.dayArrIndex: return -1; - break; + break; case timeSlot1.dayArrIndex > timeSlot2.dayArrIndex: return 1; - break; + break; default: return 0; } }, - unmaskDestinationGrids: function () { + unmaskDestinationGrids: function() { var stores = this.getStoresByStatus('all'); var moduleName = this.getModuleFromRoute(); - Ext.each(stores.keys, function (storeName) { + Ext.each(stores.keys, function(storeName) { if (storeName.indexOf(moduleName) > -1) { var grid = Ext.getCmp(storeName); if (grid && grid.body) { @@ -135,7 +137,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { var timesetName = timeset.name; var timesetId = timeset.id; if (/(After|Company)\s(Hours)/.test(timesetName)) { - var times = me.parseTimesetApiToRecords(timeset.times, timesetName); + var times = me.parseTimesetApiToRecords(timeset.times, timesetName, timeset.id); Ext.each(times, function(time) { var cfModel = Ext.create('NgcpCsc.model.CallForwardDestination', { id: Ext.id(), @@ -146,18 +148,18 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { day: time.day }); arrayOfModels.push(cfModel); - me.setVmToTrue(timesetName, true); + me.setVm(timesetName, true); }); }; }); if (arrayOfModels.length > 0) { me.populateTimesetStores(arrayOfModels); - }else{ - me.setVmToTrue(me.getTimesetFromRoute(currentRoute), false); + } else { + me.setVm(me.getTimesetFromRoute(currentRoute), false); } }, - setVmToTrue: function(name, exists) { + setVm: function(name, exists) { var vm = this.getViewModel(); switch (name) { case 'After Hours': @@ -501,8 +503,54 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { }); return false; }, + createTimesetReq: function(timesetName, subscriberId, store) { + var me = this; + Ext.Ajax.request({ + url: '/api/cftimesets/', + method: 'POST', + jsonData: { + name: timesetName, + subscriber_id: subscriberId, + times: [{ + wday: '1', + hour: '0' + }] // we need to create a default valid period + }, + success: function(response, opts) { + store.load(); + } + }); + }, + + createTimeset: function() { + var vm = this.getViewModel(); + var me = this; + var currentRoute = window.location.hash; + var timesetName = me.getTimesetFromRoute(currentRoute); + var subscriberId = localStorage.getItem('subscriber_id'); + var store = Ext.getStore(me.getModuleFromRoute() + '-Timeset'); + switch (true) { + case !!vm.get(me.getTimesetPrexifFromName(timesetName) + '_is_invalid'): + // if timeset is invalid it's deleted and recreated with the same name + Ext.Ajax.request({ + url: '/api/cftimesets/' + vm.get(me.getTimesetPrexifFromName(timesetName) + '_is_invalid'), + method: 'DELETE', + success: function(response, opts) { + vm.set(me.getTimesetPrexifFromName(timesetName) + '_is_invalid', null); + me.createTimesetReq(timesetName, subscriberId, store); + } + }); + break; + case !vm.get(me.getTimesetPrexifFromName(timesetName) + '_exists_in_api'): + me.createTimesetReq(timesetName, subscriberId, store); + break + default: + me.setVm(timesetName, true); + } + }, cfTimesetBeforeSync: function(store, options) { + // TODO delete options['destroy']; delete options['create']; delete options['update']; @@ -737,26 +785,26 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { }; }, - getStoresByStatus: function (status) { + getStoresByStatus: function(status) { var stores; switch (status) { case 'all': - stores = Ext.data.StoreManager.filterBy(function (item, key) { + stores = Ext.data.StoreManager.filterBy(function(item, key) { return (key.indexOf('CallForward') > -1); }); break; case 'online': - stores = Ext.data.StoreManager.filterBy(function (item, key) { + stores = Ext.data.StoreManager.filterBy(function(item, key) { return (key.indexOf('CallForwardOnline') > -1); }); break; case 'busy': - stores = Ext.data.StoreManager.filterBy(function (item, key) { + stores = Ext.data.StoreManager.filterBy(function(item, key) { return (key.indexOf('CallForwardBusy') > -1); }); break; case 'offline': - stores = Ext.data.StoreManager.filterBy(function (item, key) { + stores = Ext.data.StoreManager.filterBy(function(item, key) { return (key.indexOf('CallForwardOffline') > -1); }); break; @@ -764,7 +812,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { return stores; }, - addOwnPhoneToEmptyOnline: function () { + addOwnPhoneToEmptyOnline: function() { var $cf = this; var $vm = $cf.getViewModel(); var timeout = $vm.get('cftRingTimeout'); @@ -1264,29 +1312,6 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { }; }, - - createNewStandardSet: function(url, name, subscriberId) { - var vm = this.getViewModel(); - Ext.Ajax.request({ - url: url, - method: 'POST', - jsonData: { - name: name, - subscriber_id: subscriberId - }, - success: function(response, opts) { - switch (name) { - case 'After Hours': - vm.set('after_hours_exists_in_api', true); - break; - case 'Company Hours': - vm.set('company_hours_exists_in_api', true); - break; - } - } - }); - }, - createNewMapping: function(subscriberId, newType, newDestinationsetName, newSourceset, newTimeset) { Ext.Ajax.request({ url: '/api/cfmappings/' + localStorage.getItem('subscriber_id'), @@ -1438,6 +1463,12 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardController', { var store = grid.getStore() var rec = store.getAt(rowIndex); store.remove(rec); + }, + addNewPeriod: function(btn) { + var grid = btn.up('[name=timesetCont]').down('grid'); + var store = grid.getStore(); + var newModel = Ext.create('NgcpCsc.model.CallForwardTimeset'); + store.add(newModel); } }); diff --git a/classic/src/view/pages/callforward/CallForwardTimesetGrid.js b/classic/src/view/pages/callforward/CallForwardTimesetGrid.js index 6836fd81..003feb07 100644 --- a/classic/src/view/pages/callforward/CallForwardTimesetGrid.js +++ b/classic/src/view/pages/callforward/CallForwardTimesetGrid.js @@ -16,7 +16,16 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardTimesetGrid', { items: [{ text: Ngcp.csc.locales.common.day[localStorage.getItem('languageSelected')], dataIndex: 'day', - flex: 1 + xtype: 'widgetcolumn', + editable: true, + flex: 1, + widget: { + xtype: 'combo', + bind: { + value: '{record.day}' + }, + store: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] + } }, { text: Ngcp.csc.locales.common.from[localStorage.getItem('languageSelected')], dataIndex: 'time_from', @@ -26,6 +35,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardTimesetGrid', { widget: { xtype: 'timefield', margin: '8 0 0 0', + increment: 60, tooltip: Ngcp.csc.locales.callforward.tooltips.change_time_from[localStorage.getItem('languageSelected')], bind: { value: '{record.time_from}' @@ -40,6 +50,7 @@ Ext.define('NgcpCsc.view.pages.callforward.CallForwardTimesetGrid', { widget: { xtype: 'timefield', margin: '8 0 0 0', + increment: 60, tooltip: Ngcp.csc.locales.callforward.tooltips.change_time_to[localStorage.getItem('languageSelected')], bind: { value: '{record.time_to}' diff --git a/classic/src/view/pages/callforward/afterhours/AfterHours.js b/classic/src/view/pages/callforward/afterhours/AfterHours.js index 7bc92aa9..2c266252 100644 --- a/classic/src/view/pages/callforward/afterhours/AfterHours.js +++ b/classic/src/view/pages/callforward/afterhours/AfterHours.js @@ -35,7 +35,8 @@ Ext.define('NgcpCsc.view.pages.callforward.afterhours.Afterhours', { xtype: 'container', items: [{ xtype: 'panel', - id: 'collapsePanel-afterHours', + name: 'timesetCont', + id: 'collapsePanel-afterhours', title: Ngcp.csc.locales.callforward.for_calls_during_after_hours[localStorage.getItem('languageSelected')], width: '100%', collapsible: true, @@ -65,23 +66,38 @@ Ext.define('NgcpCsc.view.pages.callforward.afterhours.Afterhours', { },{ flex: 1, xtype: 'button', + handler: 'createTimeset', text: Ngcp.csc.locales.common.create[localStorage.getItem('languageSelected')] }] }] }, callForwardAfterGrid, { - text: Ngcp.csc.locales.common.save_caps[localStorage.getItem('languageSelected')], - xtype: 'button', - cls: 'x-btn-left', - id: 'afterHours-saveButton', - width: 135, - margin: '10 0 10 623', - listeners: { - click: 'saveTimesetGrid' - }, + margin: '10 0 10 0', + layout: 'hbox', + width: '100%', bind: { hidden: '{!after_hours_exists_in_api}' - } + }, + items: [{ + flex: 6 + },{ + flex: 2, + margin: '0 5 0 0', + text: Ngcp.csc.locales.callforward.add_new_period[localStorage.getItem('languageSelected')], + xtype: 'button', + id: 'afterhours-addNewPeriodButton', + listeners: { + click: 'addNewPeriod' + }, + }, { + text: Ngcp.csc.locales.common.save_caps[localStorage.getItem('languageSelected')], + xtype: 'button', + cls: 'x-btn-left', + id: 'afterhours-saveButton', + listeners: { + click: 'saveTimesetGrid' + } + }] } ] }] diff --git a/classic/src/view/pages/callforward/companyhours/CompanyHours.js b/classic/src/view/pages/callforward/companyhours/CompanyHours.js index 8097024a..48789cae 100644 --- a/classic/src/view/pages/callforward/companyhours/CompanyHours.js +++ b/classic/src/view/pages/callforward/companyhours/CompanyHours.js @@ -35,7 +35,8 @@ Ext.define('NgcpCsc.view.pages.callforward.companyhours.Companyhours', { xtype: 'container', items: [{ xtype: 'panel', - id: 'collapsePanel-companyHours', + name: 'timesetCont', + id: 'collapsePanel-companyhours', title: Ngcp.csc.locales.callforward.for_calls_during_company_hours[localStorage.getItem('languageSelected')], width: '100%', collapsible: true, @@ -65,23 +66,38 @@ Ext.define('NgcpCsc.view.pages.callforward.companyhours.Companyhours', { },{ flex: 1, xtype: 'button', + handler: 'createTimeset', text: Ngcp.csc.locales.common.create[localStorage.getItem('languageSelected')] }] }] }, callForwardCompanyGrid, { - text: Ngcp.csc.locales.common.save_caps[localStorage.getItem('languageSelected')], - xtype: 'button', - id: 'companyHours-saveButton', - cls: 'x-btn-left', - width: 135, - margin: '10 0 10 585', - listeners: { - click: 'saveTimesetGrid' - }, + margin: '10 0 10 0', + layout: 'hbox', + width: '100%', bind: { hidden: '{!company_hours_exists_in_api}' - } + }, + items: [{ + flex: 6 + },{ + flex: 2, + margin: '0 5 0 0', + text: Ngcp.csc.locales.callforward.add_new_period[localStorage.getItem('languageSelected')], + xtype: 'button', + id: 'companyhours-addNewPeriodButton', + listeners: { + click: 'addNewPeriod' + }, + }, { + flex: 1, + text: Ngcp.csc.locales.common.save_caps[localStorage.getItem('languageSelected')], + xtype: 'button', + id: 'companyhours-saveButton', + listeners: { + click: 'saveTimesetGrid' + } + }] } ] }]