From f3ed61615e478ef3c4c24a98a564d2dfb288583d Mon Sep 17 00:00:00 2001 From: Andrea Bianco Date: Tue, 7 Apr 2020 11:17:41 +0200 Subject: [PATCH] Built motion from commit (unavailable).|2.4.13 --- apidoc/api_data.js | 232 ++- apidoc/api_data.json | 232 ++- apidoc/api_project.js | 2 +- apidoc/api_project.json | 2 +- public/app/main/apps/dashboards/i18n/en.json | 33 +- public/app/main/apps/dashboards/i18n/it.json | 67 +- public/app/toolbar/i18n/en.json | 5 +- public/assets/images/business/voiceRecordings.jpg | Bin 0 -> 2993 bytes .../plugins/jabra/jabra.browser.integration-2.0.js | 2504 +++++++++----------- public/index.html | 10 +- public/scripts/app.80a701c6.js | 1 - public/scripts/app.c0aabc4d.js | 1 + public/scripts/vendor.cfb793d7.js | 1 - public/scripts/vendor.dbbe263c.js | 1 + public/styles/app.30778b9e.css | 1 - public/styles/app.4e96988b.css | 1 + server/api/action/action.attributes.js | 2 +- server/api/action/action.controller.js | 2 +- server/api/action/action.model.js | 2 +- server/api/action/action.rpc.js | 2 +- server/api/action/index.js | 2 +- .../analyticCustomReport.attributes.js | 2 +- .../analyticCustomReport.controller.js | 2 +- .../analyticCustomReport.model.js | 2 +- .../analyticCustomReport.rpc.js | 2 +- server/api/analyticCustomReport/index.js | 2 +- .../analyticDefaultReport.attributes.js | 2 +- .../analyticDefaultReport.controller.js | 2 +- .../analyticDefaultReport.model.js | 2 +- .../analyticDefaultReport.rpc.js | 2 +- server/api/analyticDefaultReport/index.js | 2 +- .../analyticExtractedReport.attributes.js | 2 +- .../analyticExtractedReport.controller.js | 2 +- .../analyticExtractedReport.model.js | 2 +- .../analyticExtractedReport.rpc.js | 2 +- server/api/analyticExtractedReport/index.js | 2 +- .../analyticFieldReport.attributes.js | 2 +- .../analyticFieldReport.controller.js | 2 +- .../analyticFieldReport.model.js | 2 +- .../analyticFieldReport/analyticFieldReport.rpc.js | 2 +- server/api/analyticFieldReport/index.js | 2 +- .../analyticMetric/analyticMetric.attributes.js | 2 +- .../analyticMetric/analyticMetric.controller.js | 2 +- server/api/analyticMetric/analyticMetric.model.js | 2 +- server/api/analyticMetric/analyticMetric.rpc.js | 2 +- server/api/analyticMetric/index.js | 2 +- .../analyticTreeReport.attributes.js | 2 +- .../analyticTreeReport.controller.js | 2 +- .../analyticTreeReport/analyticTreeReport.model.js | 2 +- .../analyticTreeReport/analyticTreeReport.rpc.js | 2 +- server/api/analyticTreeReport/index.js | 2 +- server/api/attachment/attachment.attributes.js | 2 +- server/api/attachment/attachment.controller.js | 2 +- server/api/attachment/attachment.model.js | 2 +- server/api/attachment/attachment.rpc.js | 2 +- server/api/attachment/index.js | 2 +- server/api/authGoogle/authGoogle.controller.js | 2 +- server/api/authGoogle/index.js | 2 +- server/api/authLocal/authLocal.controller.js | 2 +- server/api/authLocal/index.js | 2 +- server/api/automation/automation.attributes.js | 2 +- server/api/automation/automation.controller.js | 2 +- server/api/automation/automation.model.js | 2 +- server/api/automation/automation.rpc.js | 2 +- server/api/automation/index.js | 2 +- server/api/campaign/campaign.attributes.js | 2 +- server/api/campaign/campaign.controller.js | 2 +- server/api/campaign/campaign.model.js | 2 +- server/api/campaign/campaign.rpc.js | 2 +- server/api/campaign/index.js | 2 +- server/api/cannedAnswer/cannedAnswer.attributes.js | 2 +- server/api/cannedAnswer/cannedAnswer.controller.js | 2 +- server/api/cannedAnswer/cannedAnswer.model.js | 2 +- server/api/cannedAnswer/cannedAnswer.rpc.js | 2 +- server/api/cannedAnswer/index.js | 2 +- server/api/cdr/cdr.attributes.js | 2 +- server/api/cdr/cdr.controller.js | 2 +- server/api/cdr/cdr.model.js | 2 +- server/api/cdr/cdr.rpc.js | 2 +- server/api/cdr/index.js | 2 +- .../chatApplication/chatApplication.attributes.js | 2 +- .../chatApplication/chatApplication.controller.js | 2 +- .../api/chatApplication/chatApplication.model.js | 2 +- server/api/chatApplication/chatApplication.rpc.js | 2 +- server/api/chatApplication/index.js | 2 +- server/api/chatGroup/chatGroup.attributes.js | 2 +- server/api/chatGroup/chatGroup.controller.js | 2 +- server/api/chatGroup/chatGroup.events.js | 2 +- server/api/chatGroup/chatGroup.model.js | 2 +- server/api/chatGroup/chatGroup.rpc.js | 2 +- server/api/chatGroup/chatGroup.socket.js | 2 +- server/api/chatGroup/index.js | 2 +- .../chatInteraction/chatInteraction.attributes.js | 2 +- .../chatInteraction/chatInteraction.controller.js | 2 +- .../api/chatInteraction/chatInteraction.events.js | 2 +- .../api/chatInteraction/chatInteraction.model.js | 2 +- server/api/chatInteraction/chatInteraction.rpc.js | 2 +- .../api/chatInteraction/chatInteraction.socket.js | 2 +- server/api/chatInteraction/index.js | 2 +- .../chatInternalMessage.attributes.js | 2 +- .../chatInternalMessage.controller.js | 2 +- .../chatInternalMessage.events.js | 2 +- .../chatInternalMessage.model.js | 2 +- .../chatInternalMessage/chatInternalMessage.rpc.js | 2 +- .../chatInternalMessage.socket.js | 2 +- server/api/chatInternalMessage/index.js | 2 +- server/api/chatMessage/chatMessage.attributes.js | 2 +- server/api/chatMessage/chatMessage.controller.js | 2 +- server/api/chatMessage/chatMessage.events.js | 2 +- server/api/chatMessage/chatMessage.model.js | 2 +- server/api/chatMessage/chatMessage.rpc.js | 2 +- server/api/chatMessage/chatMessage.socket.js | 2 +- server/api/chatMessage/index.js | 2 +- .../chatOfflineMessage.attributes.js | 2 +- .../chatOfflineMessage.controller.js | 2 +- .../chatOfflineMessage/chatOfflineMessage.model.js | 2 +- .../chatOfflineMessage/chatOfflineMessage.rpc.js | 2 +- server/api/chatOfflineMessage/index.js | 2 +- .../chatProactiveAction.attributes.js | 2 +- .../chatProactiveAction.controller.js | 2 +- .../chatProactiveAction.model.js | 2 +- .../chatProactiveAction/chatProactiveAction.rpc.js | 2 +- server/api/chatProactiveAction/index.js | 2 +- server/api/chatQueue/chatQueue.attributes.js | 2 +- server/api/chatQueue/chatQueue.controller.js | 2 +- server/api/chatQueue/chatQueue.events.js | 2 +- server/api/chatQueue/chatQueue.model.js | 2 +- server/api/chatQueue/chatQueue.rpc.js | 2 +- server/api/chatQueue/chatQueue.socket.js | 2 +- server/api/chatQueue/index.js | 2 +- .../chatQueueReport/chatQueueReport.attributes.js | 2 +- .../chatQueueReport/chatQueueReport.controller.js | 2 +- .../api/chatQueueReport/chatQueueReport.model.js | 2 +- server/api/chatQueueReport/chatQueueReport.rpc.js | 2 +- server/api/chatQueueReport/index.js | 2 +- .../chatTransferReport.attributes.js | 2 +- .../chatTransferReport.controller.js | 2 +- .../chatTransferReport/chatTransferReport.model.js | 2 +- .../chatTransferReport/chatTransferReport.rpc.js | 2 +- server/api/chatTransferReport/index.js | 2 +- server/api/chatWebsite/chatWebsite.attributes.js | 2 +- server/api/chatWebsite/chatWebsite.controller.js | 2 +- server/api/chatWebsite/chatWebsite.events.js | 2 +- server/api/chatWebsite/chatWebsite.model.js | 2 +- server/api/chatWebsite/chatWebsite.rpc.js | 2 +- server/api/chatWebsite/chatWebsite.socket.js | 2 +- server/api/chatWebsite/index.js | 2 +- .../api/cloudProvider/cloudProvider.attributes.js | 18 + .../api/cloudProvider/cloudProvider.controller.js | 18 + server/api/cloudProvider/cloudProvider.model.js | 18 + server/api/cloudProvider/cloudProvider.rpc.js | 18 + server/api/cloudProvider/index.js | 18 + server/api/cmCompany/cmCompany.attributes.js | 2 +- server/api/cmCompany/cmCompany.controller.js | 2 +- server/api/cmCompany/cmCompany.model.js | 2 +- server/api/cmCompany/cmCompany.rpc.js | 2 +- server/api/cmCompany/index.js | 2 +- server/api/cmContact/cmContact.attributes.js | 2 +- server/api/cmContact/cmContact.controller.js | 2 +- server/api/cmContact/cmContact.events.js | 2 +- server/api/cmContact/cmContact.model.js | 2 +- server/api/cmContact/cmContact.rpc.js | 2 +- server/api/cmContact/cmContact.socket.js | 2 +- server/api/cmContact/index.js | 2 +- .../api/cmCustomField/cmCustomField.attributes.js | 2 +- .../api/cmCustomField/cmCustomField.controller.js | 2 +- server/api/cmCustomField/cmCustomField.model.js | 2 +- server/api/cmCustomField/cmCustomField.rpc.js | 2 +- server/api/cmCustomField/index.js | 2 +- server/api/cmHopper/cmHopper.attributes.js | 2 +- server/api/cmHopper/cmHopper.controller.js | 2 +- server/api/cmHopper/cmHopper.model.js | 2 +- server/api/cmHopper/cmHopper.rpc.js | 2 +- server/api/cmHopper/index.js | 2 +- .../api/cmHopperBlack/cmHopperBlack.attributes.js | 2 +- .../api/cmHopperBlack/cmHopperBlack.controller.js | 2 +- server/api/cmHopperBlack/cmHopperBlack.model.js | 2 +- server/api/cmHopperBlack/cmHopperBlack.rpc.js | 2 +- server/api/cmHopperBlack/index.js | 2 +- .../api/cmHopperFinal/cmHopperFinal.attributes.js | 2 +- .../api/cmHopperFinal/cmHopperFinal.controller.js | 2 +- server/api/cmHopperFinal/cmHopperFinal.model.js | 2 +- server/api/cmHopperFinal/cmHopperFinal.rpc.js | 2 +- server/api/cmHopperFinal/index.js | 2 +- .../cmHopperHistory/cmHopperHistory.attributes.js | 2 +- .../cmHopperHistory/cmHopperHistory.controller.js | 2 +- .../api/cmHopperHistory/cmHopperHistory.model.js | 2 +- server/api/cmHopperHistory/cmHopperHistory.rpc.js | 2 +- server/api/cmHopperHistory/index.js | 2 +- server/api/cmList/cmList.attributes.js | 2 +- server/api/cmList/cmList.controller.js | 2 +- server/api/cmList/cmList.events.js | 2 +- server/api/cmList/cmList.model.js | 2 +- server/api/cmList/cmList.rpc.js | 2 +- server/api/cmList/cmList.socket.js | 2 +- server/api/cmList/index.js | 2 +- server/api/condition/condition.attributes.js | 2 +- server/api/condition/condition.controller.js | 2 +- server/api/condition/condition.model.js | 2 +- server/api/condition/condition.rpc.js | 2 +- server/api/condition/index.js | 2 +- server/api/dashboard/dashboard.attributes.js | 2 +- server/api/dashboard/dashboard.controller.js | 2 +- server/api/dashboard/dashboard.events.js | 2 +- server/api/dashboard/dashboard.model.js | 2 +- server/api/dashboard/dashboard.rpc.js | 2 +- server/api/dashboard/dashboard.socket.js | 2 +- server/api/dashboard/index.js | 2 +- .../api/dashboardItem/dashboardItem.attributes.js | 2 +- .../api/dashboardItem/dashboardItem.controller.js | 2 +- server/api/dashboardItem/dashboardItem.events.js | 2 +- server/api/dashboardItem/dashboardItem.model.js | 2 +- server/api/dashboardItem/dashboardItem.rpc.js | 2 +- server/api/dashboardItem/dashboardItem.socket.js | 2 +- server/api/dashboardItem/index.js | 2 +- server/api/disposition/disposition.attributes.js | 2 +- server/api/disposition/disposition.controller.js | 2 +- server/api/disposition/disposition.model.js | 2 +- server/api/disposition/disposition.rpc.js | 2 +- server/api/disposition/index.js | 2 +- server/api/faxAccount/faxAccount.attributes.js | 2 +- server/api/faxAccount/faxAccount.controller.js | 2 +- server/api/faxAccount/faxAccount.events.js | 2 +- server/api/faxAccount/faxAccount.model.js | 2 +- server/api/faxAccount/faxAccount.rpc.js | 2 +- server/api/faxAccount/faxAccount.socket.js | 2 +- server/api/faxAccount/index.js | 2 +- .../faxApplication/faxApplication.attributes.js | 2 +- .../faxApplication/faxApplication.controller.js | 2 +- server/api/faxApplication/faxApplication.model.js | 2 +- server/api/faxApplication/faxApplication.rpc.js | 2 +- server/api/faxApplication/index.js | 2 +- .../faxInteraction/faxInteraction.attributes.js | 2 +- .../faxInteraction/faxInteraction.controller.js | 2 +- server/api/faxInteraction/faxInteraction.events.js | 2 +- server/api/faxInteraction/faxInteraction.model.js | 2 +- server/api/faxInteraction/faxInteraction.rpc.js | 2 +- server/api/faxInteraction/faxInteraction.socket.js | 2 +- server/api/faxInteraction/index.js | 2 +- server/api/faxMessage/faxMessage.attributes.js | 2 +- server/api/faxMessage/faxMessage.controller.js | 2 +- server/api/faxMessage/faxMessage.events.js | 2 +- server/api/faxMessage/faxMessage.model.js | 2 +- server/api/faxMessage/faxMessage.rpc.js | 2 +- server/api/faxMessage/faxMessage.socket.js | 2 +- server/api/faxMessage/index.js | 2 +- server/api/faxQueue/faxQueue.attributes.js | 2 +- server/api/faxQueue/faxQueue.controller.js | 2 +- server/api/faxQueue/faxQueue.events.js | 2 +- server/api/faxQueue/faxQueue.model.js | 2 +- server/api/faxQueue/faxQueue.rpc.js | 2 +- server/api/faxQueue/faxQueue.socket.js | 2 +- server/api/faxQueue/index.js | 2 +- .../faxQueueReport/faxQueueReport.attributes.js | 2 +- .../faxQueueReport/faxQueueReport.controller.js | 2 +- server/api/faxQueueReport/faxQueueReport.model.js | 2 +- server/api/faxQueueReport/faxQueueReport.rpc.js | 2 +- server/api/faxQueueReport/index.js | 2 +- .../faxTransferReport.attributes.js | 2 +- .../faxTransferReport.controller.js | 2 +- .../faxTransferReport/faxTransferReport.model.js | 2 +- .../api/faxTransferReport/faxTransferReport.rpc.js | 2 +- server/api/faxTransferReport/index.js | 2 +- server/api/intDeskAccount/index.js | 2 +- .../intDeskAccount/intDeskAccount.attributes.js | 2 +- .../intDeskAccount/intDeskAccount.controller.js | 2 +- server/api/intDeskAccount/intDeskAccount.model.js | 2 +- server/api/intDeskAccount/intDeskAccount.rpc.js | 2 +- server/api/intDeskConfiguration/index.js | 2 +- .../intDeskConfiguration.attributes.js | 2 +- .../intDeskConfiguration.controller.js | 2 +- .../intDeskConfiguration.model.js | 2 +- .../intDeskConfiguration.rpc.js | 2 +- server/api/intDeskField/index.js | 2 +- server/api/intDeskField/intDeskField.attributes.js | 2 +- server/api/intDeskField/intDeskField.controller.js | 2 +- server/api/intDeskField/intDeskField.model.js | 2 +- server/api/intDeskField/intDeskField.rpc.js | 2 +- server/api/intDynamics365Account/index.js | 2 +- .../intDynamics365Account.attributes.js | 2 +- .../intDynamics365Account.controller.js | 2 +- .../intDynamics365Account.model.js | 2 +- .../intDynamics365Account.rpc.js | 2 +- server/api/intDynamics365Configuration/index.js | 2 +- .../intDynamics365Configuration.attributes.js | 2 +- .../intDynamics365Configuration.controller.js | 2 +- .../intDynamics365Configuration.model.js | 2 +- .../intDynamics365Configuration.rpc.js | 2 +- server/api/intDynamics365Field/index.js | 2 +- .../intDynamics365Field.attributes.js | 2 +- .../intDynamics365Field.controller.js | 2 +- .../intDynamics365Field.model.js | 2 +- .../intDynamics365Field/intDynamics365Field.rpc.js | 2 +- server/api/intFreshdeskAccount/index.js | 2 +- .../intFreshdeskAccount.attributes.js | 2 +- .../intFreshdeskAccount.controller.js | 2 +- .../intFreshdeskAccount.model.js | 2 +- .../intFreshdeskAccount/intFreshdeskAccount.rpc.js | 2 +- server/api/intFreshdeskConfiguration/index.js | 2 +- .../intFreshdeskConfiguration.attributes.js | 2 +- .../intFreshdeskConfiguration.controller.js | 2 +- .../intFreshdeskConfiguration.model.js | 2 +- .../intFreshdeskConfiguration.rpc.js | 2 +- server/api/intFreshdeskField/index.js | 2 +- .../intFreshdeskField.attributes.js | 2 +- .../intFreshdeskField.controller.js | 2 +- .../intFreshdeskField/intFreshdeskField.model.js | 2 +- .../api/intFreshdeskField/intFreshdeskField.rpc.js | 2 +- server/api/intSalesforceAccount/index.js | 2 +- .../intSalesforceAccount.attributes.js | 2 +- .../intSalesforceAccount.controller.js | 2 +- .../intSalesforceAccount.model.js | 2 +- .../intSalesforceAccount.rpc.js | 2 +- server/api/intSalesforceConfiguration/index.js | 2 +- .../intSalesforceConfiguration.attributes.js | 2 +- .../intSalesforceConfiguration.controller.js | 2 +- .../intSalesforceConfiguration.model.js | 2 +- .../intSalesforceConfiguration.rpc.js | 2 +- server/api/intSalesforceField/index.js | 2 +- .../intSalesforceField.attributes.js | 2 +- .../intSalesforceField.controller.js | 2 +- .../intSalesforceField/intSalesforceField.model.js | 2 +- .../intSalesforceField/intSalesforceField.rpc.js | 2 +- server/api/intServicenowAccount/index.js | 2 +- .../intServicenowAccount.attributes.js | 2 +- .../intServicenowAccount.controller.js | 2 +- .../intServicenowAccount.model.js | 2 +- .../intServicenowAccount.rpc.js | 2 +- server/api/intServicenowConfiguration/index.js | 2 +- .../intServicenowConfiguration.attributes.js | 2 +- .../intServicenowConfiguration.controller.js | 2 +- .../intServicenowConfiguration.model.js | 2 +- .../intServicenowConfiguration.rpc.js | 2 +- server/api/intServicenowField/index.js | 2 +- .../intServicenowField.attributes.js | 2 +- .../intServicenowField.controller.js | 2 +- .../intServicenowField/intServicenowField.model.js | 2 +- .../intServicenowField/intServicenowField.rpc.js | 2 +- server/api/intSugarcrmAccount/index.js | 2 +- .../intSugarcrmAccount.attributes.js | 2 +- .../intSugarcrmAccount.controller.js | 2 +- .../intSugarcrmAccount/intSugarcrmAccount.model.js | 2 +- .../intSugarcrmAccount/intSugarcrmAccount.rpc.js | 2 +- server/api/intSugarcrmConfiguration/index.js | 2 +- .../intSugarcrmConfiguration.attributes.js | 2 +- .../intSugarcrmConfiguration.controller.js | 2 +- .../intSugarcrmConfiguration.model.js | 2 +- .../intSugarcrmConfiguration.rpc.js | 2 +- server/api/intSugarcrmField/index.js | 2 +- .../intSugarcrmField.attributes.js | 2 +- .../intSugarcrmField.controller.js | 2 +- .../api/intSugarcrmField/intSugarcrmField.model.js | 2 +- .../api/intSugarcrmField/intSugarcrmField.rpc.js | 2 +- server/api/intVtigerAccount/index.js | 2 +- .../intVtigerAccount.attributes.js | 2 +- .../intVtigerAccount.controller.js | 2 +- .../api/intVtigerAccount/intVtigerAccount.model.js | 2 +- .../api/intVtigerAccount/intVtigerAccount.rpc.js | 2 +- server/api/intVtigerConfiguration/index.js | 2 +- .../intVtigerConfiguration.attributes.js | 2 +- .../intVtigerConfiguration.controller.js | 2 +- .../intVtigerConfiguration.model.js | 2 +- .../intVtigerConfiguration.rpc.js | 2 +- server/api/intVtigerField/index.js | 2 +- .../intVtigerField/intVtigerField.attributes.js | 2 +- .../intVtigerField/intVtigerField.controller.js | 2 +- server/api/intVtigerField/intVtigerField.model.js | 2 +- server/api/intVtigerField/intVtigerField.rpc.js | 2 +- server/api/intZendeskAccount/index.js | 2 +- .../intZendeskAccount.attributes.js | 2 +- .../intZendeskAccount.controller.js | 2 +- .../intZendeskAccount/intZendeskAccount.model.js | 2 +- .../api/intZendeskAccount/intZendeskAccount.rpc.js | 2 +- server/api/intZendeskConfiguration/index.js | 2 +- .../intZendeskConfiguration.attributes.js | 2 +- .../intZendeskConfiguration.controller.js | 2 +- .../intZendeskConfiguration.model.js | 2 +- .../intZendeskConfiguration.rpc.js | 2 +- server/api/intZendeskField/index.js | 2 +- .../intZendeskField/intZendeskField.attributes.js | 2 +- .../intZendeskField/intZendeskField.controller.js | 2 +- .../api/intZendeskField/intZendeskField.model.js | 2 +- server/api/intZendeskField/intZendeskField.rpc.js | 2 +- server/api/intZohoAccount/index.js | 2 +- .../intZohoAccount/intZohoAccount.attributes.js | 2 +- .../intZohoAccount/intZohoAccount.controller.js | 2 +- server/api/intZohoAccount/intZohoAccount.model.js | 2 +- server/api/intZohoAccount/intZohoAccount.rpc.js | 2 +- server/api/intZohoConfiguration/index.js | 2 +- .../intZohoConfiguration.attributes.js | 2 +- .../intZohoConfiguration.controller.js | 2 +- .../intZohoConfiguration.model.js | 2 +- .../intZohoConfiguration.rpc.js | 2 +- server/api/intZohoField/index.js | 2 +- server/api/intZohoField/intZohoField.attributes.js | 2 +- server/api/intZohoField/intZohoField.controller.js | 2 +- server/api/intZohoField/intZohoField.model.js | 2 +- server/api/intZohoField/intZohoField.rpc.js | 2 +- server/api/integration/index.js | 2 +- server/api/integration/integration.attributes.js | 2 +- server/api/integration/integration.controller.js | 2 +- server/api/integration/integration.model.js | 2 +- server/api/integration/integration.rpc.js | 2 +- server/api/integrationReport/index.js | 2 +- .../integrationReport.attributes.js | 2 +- .../integrationReport.controller.js | 2 +- .../integrationReport/integrationReport.model.js | 2 +- .../api/integrationReport/integrationReport.rpc.js | 2 +- server/api/interval/index.js | 2 +- server/api/interval/interval.attributes.js | 2 +- server/api/interval/interval.controller.js | 2 +- server/api/interval/interval.model.js | 2 +- server/api/interval/interval.rpc.js | 2 +- server/api/jira/index.js | 2 +- server/api/jira/jira.controller.js | 2 +- server/api/jscriptyAnswerReport/index.js | 2 +- .../jscriptyAnswerReport.attributes.js | 2 +- .../jscriptyAnswerReport.controller.js | 2 +- .../jscriptyAnswerReport.model.js | 2 +- .../jscriptyAnswerReport.rpc.js | 2 +- server/api/jscriptyProject/index.js | 2 +- .../jscriptyProject/jscriptyProject.attributes.js | 2 +- .../jscriptyProject/jscriptyProject.controller.js | 2 +- .../api/jscriptyProject/jscriptyProject.model.js | 2 +- server/api/jscriptyProject/jscriptyProject.rpc.js | 2 +- server/api/jscriptyQuestionReport/index.js | 2 +- .../jscriptyQuestionReport.attributes.js | 2 +- .../jscriptyQuestionReport.controller.js | 2 +- .../jscriptyQuestionReport.model.js | 2 +- .../jscriptyQuestionReport.rpc.js | 2 +- server/api/jscriptySessionReport/index.js | 2 +- .../jscriptySessionReport.attributes.js | 2 +- .../jscriptySessionReport.controller.js | 2 +- .../jscriptySessionReport.model.js | 2 +- .../jscriptySessionReport.rpc.js | 2 +- server/api/license/index.js | 2 +- server/api/license/license.attributes.js | 2 +- server/api/license/license.controller.js | 2 +- server/api/license/license.model.js | 2 +- server/api/license/license.rpc.js | 2 +- server/api/mailAccount/index.js | 2 +- server/api/mailAccount/mailAccount.attributes.js | 2 +- server/api/mailAccount/mailAccount.controller.js | 2 +- server/api/mailAccount/mailAccount.events.js | 2 +- server/api/mailAccount/mailAccount.model.js | 2 +- server/api/mailAccount/mailAccount.rpc.js | 2 +- server/api/mailAccount/mailAccount.socket.js | 2 +- server/api/mailApplication/index.js | 2 +- .../mailApplication/mailApplication.attributes.js | 2 +- .../mailApplication/mailApplication.controller.js | 2 +- .../api/mailApplication/mailApplication.model.js | 2 +- server/api/mailApplication/mailApplication.rpc.js | 2 +- server/api/mailInteraction/index.js | 2 +- .../mailInteraction/mailInteraction.attributes.js | 2 +- .../mailInteraction/mailInteraction.controller.js | 2 +- .../api/mailInteraction/mailInteraction.events.js | 2 +- .../api/mailInteraction/mailInteraction.model.js | 2 +- server/api/mailInteraction/mailInteraction.rpc.js | 2 +- .../api/mailInteraction/mailInteraction.socket.js | 2 +- server/api/mailMessage/index.js | 2 +- server/api/mailMessage/mailMessage.attributes.js | 2 +- server/api/mailMessage/mailMessage.controller.js | 2 +- server/api/mailMessage/mailMessage.events.js | 2 +- server/api/mailMessage/mailMessage.model.js | 2 +- server/api/mailMessage/mailMessage.rpc.js | 2 +- server/api/mailMessage/mailMessage.socket.js | 2 +- server/api/mailQueue/index.js | 2 +- server/api/mailQueue/mailQueue.attributes.js | 2 +- server/api/mailQueue/mailQueue.controller.js | 2 +- server/api/mailQueue/mailQueue.events.js | 2 +- server/api/mailQueue/mailQueue.model.js | 2 +- server/api/mailQueue/mailQueue.rpc.js | 2 +- server/api/mailQueue/mailQueue.socket.js | 2 +- server/api/mailQueueReport/index.js | 2 +- .../mailQueueReport/mailQueueReport.attributes.js | 2 +- .../mailQueueReport/mailQueueReport.controller.js | 2 +- .../api/mailQueueReport/mailQueueReport.model.js | 2 +- server/api/mailQueueReport/mailQueueReport.rpc.js | 2 +- server/api/mailServerIn/index.js | 2 +- server/api/mailServerIn/mailServerIn.attributes.js | 2 +- server/api/mailServerIn/mailServerIn.model.js | 2 +- server/api/mailServerIn/mailServerIn.rpc.js | 2 +- server/api/mailServerOut/index.js | 2 +- .../api/mailServerOut/mailServerOut.attributes.js | 2 +- .../api/mailServerOut/mailServerOut.controller.js | 2 +- server/api/mailServerOut/mailServerOut.model.js | 2 +- server/api/mailServerOut/mailServerOut.rpc.js | 2 +- server/api/mailSubstatus/index.js | 2 +- .../api/mailSubstatus/mailSubstatus.attributes.js | 2 +- .../api/mailSubstatus/mailSubstatus.controller.js | 2 +- server/api/mailSubstatus/mailSubstatus.model.js | 2 +- server/api/mailSubstatus/mailSubstatus.rpc.js | 2 +- server/api/mailTransferReport/index.js | 2 +- .../mailTransferReport.attributes.js | 2 +- .../mailTransferReport.controller.js | 2 +- .../mailTransferReport/mailTransferReport.model.js | 2 +- .../mailTransferReport/mailTransferReport.rpc.js | 2 +- server/api/memberReport/index.js | 2 +- server/api/memberReport/memberReport.attributes.js | 2 +- server/api/memberReport/memberReport.controller.js | 2 +- server/api/memberReport/memberReport.model.js | 2 +- server/api/memberReport/memberReport.rpc.js | 2 +- server/api/migration/index.js | 2 +- server/api/migration/migration.attributes.js | 2 +- server/api/migration/migration.controller.js | 2 +- server/api/migration/migration.model.js | 2 +- server/api/migration/migration.rpc.js | 2 +- server/api/network/index.js | 2 +- server/api/network/network.attributes.js | 2 +- server/api/network/network.controller.js | 2 +- server/api/network/network.model.js | 2 +- server/api/network/network.rpc.js | 2 +- server/api/openchannelAccount/index.js | 2 +- .../openchannelAccount.attributes.js | 2 +- .../openchannelAccount.controller.js | 2 +- .../openchannelAccount.events.js | 2 +- .../openchannelAccount/openchannelAccount.model.js | 2 +- .../openchannelAccount/openchannelAccount.rpc.js | 2 +- .../openchannelAccount.socket.js | 2 +- server/api/openchannelApplication/index.js | 2 +- .../openchannelApplication.attributes.js | 2 +- .../openchannelApplication.controller.js | 2 +- .../openchannelApplication.model.js | 2 +- .../openchannelApplication.rpc.js | 2 +- server/api/openchannelInteraction/index.js | 2 +- .../openchannelInteraction.attributes.js | 2 +- .../openchannelInteraction.controller.js | 2 +- .../openchannelInteraction.events.js | 2 +- .../openchannelInteraction.model.js | 2 +- .../openchannelInteraction.rpc.js | 2 +- .../openchannelInteraction.socket.js | 2 +- server/api/openchannelMessage/index.js | 2 +- .../openchannelMessage.attributes.js | 2 +- .../openchannelMessage.controller.js | 2 +- .../openchannelMessage.events.js | 2 +- .../openchannelMessage/openchannelMessage.model.js | 2 +- .../openchannelMessage/openchannelMessage.rpc.js | 2 +- .../openchannelMessage.socket.js | 2 +- server/api/openchannelQueue/index.js | 2 +- .../openchannelQueue.attributes.js | 2 +- .../openchannelQueue.controller.js | 2 +- .../openchannelQueue/openchannelQueue.events.js | 2 +- .../api/openchannelQueue/openchannelQueue.model.js | 2 +- .../api/openchannelQueue/openchannelQueue.rpc.js | 2 +- .../openchannelQueue/openchannelQueue.socket.js | 2 +- server/api/openchannelQueueReport/index.js | 2 +- .../openchannelQueueReport.attributes.js | 2 +- .../openchannelQueueReport.controller.js | 2 +- .../openchannelQueueReport.model.js | 2 +- .../openchannelQueueReport.rpc.js | 2 +- server/api/openchannelTransferReport/index.js | 2 +- .../openchannelTransferReport.attributes.js | 2 +- .../openchannelTransferReport.controller.js | 2 +- .../openchannelTransferReport.model.js | 2 +- .../openchannelTransferReport.rpc.js | 2 +- server/api/pause/index.js | 2 +- server/api/pause/pause.attributes.js | 2 +- server/api/pause/pause.controller.js | 2 +- server/api/pause/pause.model.js | 2 +- server/api/pause/pause.rpc.js | 2 +- server/api/plugin/index.js | 2 +- server/api/plugin/plugin.attributes.js | 2 +- server/api/plugin/plugin.controller.js | 2 +- server/api/plugin/plugin.events.js | 2 +- server/api/plugin/plugin.model.js | 2 +- server/api/plugin/plugin.rpc.js | 2 +- server/api/plugin/plugin.socket.js | 2 +- server/api/pm2/index.js | 2 +- server/api/pm2/pm2.controller.js | 2 +- server/api/reportAgentPreview/index.js | 2 +- .../reportAgentPreview.attributes.js | 2 +- .../reportAgentPreview/reportAgentPreview.model.js | 2 +- .../reportAgentPreview/reportAgentPreview.rpc.js | 2 +- server/api/rpc/index.js | 2 +- server/api/rpc/rpc.controller.js | 2 +- server/api/schedule/index.js | 2 +- server/api/schedule/schedule.attributes.js | 2 +- server/api/schedule/schedule.controller.js | 2 +- server/api/schedule/schedule.model.js | 2 +- server/api/schedule/schedule.rpc.js | 2 +- server/api/screenRecording/index.js | 2 +- .../screenRecording/screenRecording.attributes.js | 2 +- .../screenRecording/screenRecording.controller.js | 2 +- .../api/screenRecording/screenRecording.model.js | 2 +- server/api/screenRecording/screenRecording.rpc.js | 2 +- server/api/setting/index.js | 2 +- server/api/setting/setting.attributes.js | 2 +- server/api/setting/setting.controller.js | 2 +- server/api/setting/setting.model.js | 2 +- server/api/setting/setting.rpc.js | 2 +- server/api/smsAccount/index.js | 2 +- server/api/smsAccount/smsAccount.attributes.js | 2 +- server/api/smsAccount/smsAccount.controller.js | 2 +- server/api/smsAccount/smsAccount.events.js | 2 +- server/api/smsAccount/smsAccount.model.js | 2 +- server/api/smsAccount/smsAccount.rpc.js | 2 +- server/api/smsAccount/smsAccount.socket.js | 2 +- server/api/smsApplication/index.js | 2 +- .../smsApplication/smsApplication.attributes.js | 2 +- .../smsApplication/smsApplication.controller.js | 2 +- server/api/smsApplication/smsApplication.model.js | 2 +- server/api/smsApplication/smsApplication.rpc.js | 2 +- server/api/smsInteraction/index.js | 2 +- .../smsInteraction/smsInteraction.attributes.js | 2 +- .../smsInteraction/smsInteraction.controller.js | 2 +- server/api/smsInteraction/smsInteraction.events.js | 2 +- server/api/smsInteraction/smsInteraction.model.js | 2 +- server/api/smsInteraction/smsInteraction.rpc.js | 2 +- server/api/smsInteraction/smsInteraction.socket.js | 2 +- server/api/smsMessage/index.js | 2 +- server/api/smsMessage/smsMessage.attributes.js | 2 +- server/api/smsMessage/smsMessage.controller.js | 2 +- server/api/smsMessage/smsMessage.events.js | 2 +- server/api/smsMessage/smsMessage.model.js | 2 +- server/api/smsMessage/smsMessage.rpc.js | 2 +- server/api/smsMessage/smsMessage.socket.js | 2 +- server/api/smsQueue/index.js | 2 +- server/api/smsQueue/smsQueue.attributes.js | 2 +- server/api/smsQueue/smsQueue.controller.js | 2 +- server/api/smsQueue/smsQueue.events.js | 2 +- server/api/smsQueue/smsQueue.model.js | 2 +- server/api/smsQueue/smsQueue.rpc.js | 2 +- server/api/smsQueue/smsQueue.socket.js | 2 +- server/api/smsQueueReport/index.js | 2 +- .../smsQueueReport/smsQueueReport.attributes.js | 2 +- .../smsQueueReport/smsQueueReport.controller.js | 2 +- server/api/smsQueueReport/smsQueueReport.model.js | 2 +- server/api/smsQueueReport/smsQueueReport.rpc.js | 2 +- server/api/smsTransferReport/index.js | 2 +- .../smsTransferReport.attributes.js | 2 +- .../smsTransferReport.controller.js | 2 +- .../smsTransferReport/smsTransferReport.model.js | 2 +- .../api/smsTransferReport/smsTransferReport.rpc.js | 2 +- server/api/sound/index.js | 2 +- server/api/sound/sound.attributes.js | 2 +- server/api/sound/sound.controller.js | 2 +- server/api/sound/sound.model.js | 2 +- server/api/sound/sound.rpc.js | 2 +- server/api/squareMessage/index.js | 2 +- .../api/squareMessage/squareMessage.attributes.js | 2 +- .../api/squareMessage/squareMessage.controller.js | 2 +- server/api/squareMessage/squareMessage.model.js | 2 +- server/api/squareMessage/squareMessage.rpc.js | 2 +- server/api/squareOdbc/index.js | 2 +- server/api/squareOdbc/squareOdbc.attributes.js | 2 +- server/api/squareOdbc/squareOdbc.controller.js | 2 +- server/api/squareOdbc/squareOdbc.model.js | 2 +- server/api/squareOdbc/squareOdbc.rpc.js | 2 +- server/api/squareProject/index.js | 2 +- .../api/squareProject/squareProject.attributes.js | 2 +- .../api/squareProject/squareProject.controller.js | 2 +- server/api/squareProject/squareProject.events.js | 2 +- server/api/squareProject/squareProject.model.js | 2 +- server/api/squareProject/squareProject.rpc.js | 2 +- server/api/squareProject/squareProject.socket.js | 2 +- server/api/squareRecording/index.js | 2 +- .../squareRecording/squareRecording.attributes.js | 2 +- .../squareRecording/squareRecording.controller.js | 2 +- .../api/squareRecording/squareRecording.model.js | 2 +- server/api/squareRecording/squareRecording.rpc.js | 2 +- server/api/squareReport/index.js | 2 +- server/api/squareReport/squareReport.attributes.js | 2 +- server/api/squareReport/squareReport.controller.js | 2 +- server/api/squareReport/squareReport.model.js | 2 +- server/api/squareReport/squareReport.rpc.js | 2 +- server/api/squareReportDetail/index.js | 2 +- .../squareReportDetail.attributes.js | 2 +- .../squareReportDetail.controller.js | 2 +- .../squareReportDetail/squareReportDetail.model.js | 2 +- .../squareReportDetail/squareReportDetail.rpc.js | 2 +- server/api/system/index.js | 2 +- server/api/system/system.controller.js | 2 +- server/api/tag/index.js | 2 +- server/api/tag/tag.attributes.js | 2 +- server/api/tag/tag.controller.js | 2 +- server/api/tag/tag.model.js | 2 +- server/api/tag/tag.rpc.js | 2 +- server/api/team/index.js | 2 +- server/api/team/team.attributes.js | 2 +- server/api/team/team.controller.js | 2 +- server/api/team/team.events.js | 2 +- server/api/team/team.model.js | 2 +- server/api/team/team.rpc.js | 2 +- server/api/team/team.socket.js | 2 +- server/api/template/index.js | 2 +- server/api/template/template.attributes.js | 2 +- server/api/template/template.controller.js | 2 +- server/api/template/template.model.js | 2 +- server/api/template/template.rpc.js | 2 +- server/api/trigger/index.js | 2 +- server/api/trigger/trigger.attributes.js | 2 +- server/api/trigger/trigger.controller.js | 2 +- server/api/trigger/trigger.model.js | 2 +- server/api/trigger/trigger.rpc.js | 2 +- server/api/trunk/index.js | 2 +- server/api/trunk/trunk.attributes.js | 2 +- server/api/trunk/trunk.controller.js | 2 +- server/api/trunk/trunk.model.js | 2 +- server/api/trunk/trunk.rpc.js | 2 +- server/api/user/index.js | 2 +- server/api/user/user.attributes.js | 2 +- server/api/user/user.controller.js | 2 +- server/api/user/user.events.js | 2 +- server/api/user/user.model.js | 2 +- server/api/user/user.rpc.js | 2 +- server/api/user/user.socket.js | 2 +- server/api/userChatQueue/index.js | 2 +- .../api/userChatQueue/userChatQueue.attributes.js | 2 +- server/api/userChatQueue/userChatQueue.model.js | 2 +- server/api/userChatQueue/userChatQueue.rpc.js | 2 +- server/api/userFaxQueue/index.js | 2 +- server/api/userFaxQueue/userFaxQueue.attributes.js | 2 +- server/api/userFaxQueue/userFaxQueue.model.js | 2 +- server/api/userFaxQueue/userFaxQueue.rpc.js | 2 +- server/api/userMailQueue/index.js | 2 +- .../api/userMailQueue/userMailQueue.attributes.js | 2 +- server/api/userMailQueue/userMailQueue.model.js | 2 +- server/api/userMailQueue/userMailQueue.rpc.js | 2 +- server/api/userOpenchannelQueue/index.js | 2 +- .../userOpenchannelQueue.attributes.js | 2 +- .../userOpenchannelQueue.model.js | 2 +- .../userOpenchannelQueue.rpc.js | 2 +- server/api/userProfile/index.js | 2 +- server/api/userProfile/userProfile.attributes.js | 2 +- server/api/userProfile/userProfile.controller.js | 2 +- server/api/userProfile/userProfile.events.js | 2 +- server/api/userProfile/userProfile.model.js | 2 +- server/api/userProfile/userProfile.rpc.js | 2 +- server/api/userProfile/userProfile.socket.js | 2 +- server/api/userProfileResource/index.js | 2 +- .../userProfileResource.attributes.js | 2 +- .../userProfileResource.controller.js | 2 +- .../userProfileResource.model.js | 2 +- .../userProfileResource/userProfileResource.rpc.js | 2 +- server/api/userProfileSection/index.js | 2 +- .../userProfileSection.attributes.js | 2 +- .../userProfileSection.controller.js | 2 +- .../userProfileSection/userProfileSection.model.js | 2 +- .../userProfileSection/userProfileSection.rpc.js | 2 +- server/api/userSmsQueue/index.js | 2 +- server/api/userSmsQueue/userSmsQueue.attributes.js | 2 +- server/api/userSmsQueue/userSmsQueue.model.js | 2 +- server/api/userSmsQueue/userSmsQueue.rpc.js | 2 +- server/api/userVoiceQueue/index.js | 2 +- .../userVoiceQueue/userVoiceQueue.attributes.js | 2 +- server/api/userVoiceQueue/userVoiceQueue.model.js | 2 +- server/api/userVoiceQueue/userVoiceQueue.rpc.js | 2 +- server/api/userVoiceQueueRt/index.js | 2 +- .../userVoiceQueueRt.attributes.js | 2 +- .../userVoiceQueueRt/userVoiceQueueRt.events.js | 2 +- .../api/userVoiceQueueRt/userVoiceQueueRt.model.js | 2 +- .../api/userVoiceQueueRt/userVoiceQueueRt.rpc.js | 2 +- .../userVoiceQueueRt/userVoiceQueueRt.socket.js | 2 +- server/api/variable/index.js | 2 +- server/api/variable/variable.attributes.js | 2 +- server/api/variable/variable.controller.js | 2 +- server/api/variable/variable.model.js | 2 +- server/api/variable/variable.rpc.js | 2 +- server/api/version/index.js | 2 +- server/api/version/version.controller.js | 2 +- server/api/voiceAgentReport/index.js | 2 +- .../voiceAgentReport.attributes.js | 2 +- .../voiceAgentReport.controller.js | 2 +- .../api/voiceAgentReport/voiceAgentReport.model.js | 2 +- .../api/voiceAgentReport/voiceAgentReport.rpc.js | 2 +- server/api/voiceCallReport/index.js | 2 +- .../voiceCallReport/voiceCallReport.attributes.js | 2 +- .../voiceCallReport/voiceCallReport.controller.js | 2 +- .../api/voiceCallReport/voiceCallReport.model.js | 2 +- server/api/voiceCallReport/voiceCallReport.rpc.js | 2 +- server/api/voiceChanSpy/index.js | 2 +- server/api/voiceChanSpy/voiceChanSpy.attributes.js | 2 +- server/api/voiceChanSpy/voiceChanSpy.controller.js | 2 +- server/api/voiceChanSpy/voiceChanSpy.model.js | 2 +- server/api/voiceChanSpy/voiceChanSpy.rpc.js | 2 +- server/api/voiceContext/index.js | 2 +- server/api/voiceContext/voiceContext.attributes.js | 2 +- server/api/voiceContext/voiceContext.controller.js | 2 +- server/api/voiceContext/voiceContext.model.js | 2 +- server/api/voiceContext/voiceContext.rpc.js | 2 +- server/api/voiceDialReport/index.js | 2 +- .../voiceDialReport/voiceDialReport.attributes.js | 2 +- .../voiceDialReport/voiceDialReport.controller.js | 2 +- .../api/voiceDialReport/voiceDialReport.model.js | 2 +- server/api/voiceDialReport/voiceDialReport.rpc.js | 2 +- server/api/voiceExtension/index.js | 2 +- .../voiceExtension/voiceExtension.attributes.js | 2 +- .../voiceExtension/voiceExtension.controller.js | 2 +- server/api/voiceExtension/voiceExtension.events.js | 2 +- server/api/voiceExtension/voiceExtension.model.js | 2 +- server/api/voiceExtension/voiceExtension.rpc.js | 2 +- server/api/voiceExtension/voiceExtension.socket.js | 2 +- server/api/voiceMail/index.js | 2 +- server/api/voiceMail/voiceMail.attributes.js | 2 +- server/api/voiceMail/voiceMail.controller.js | 2 +- server/api/voiceMail/voiceMail.model.js | 2 +- server/api/voiceMail/voiceMail.rpc.js | 2 +- server/api/voiceMailMessage/index.js | 2 +- .../voiceMailMessage.attributes.js | 2 +- .../voiceMailMessage.controller.js | 2 +- .../api/voiceMailMessage/voiceMailMessage.model.js | 2 +- .../api/voiceMailMessage/voiceMailMessage.rpc.js | 2 +- server/api/voiceMusicOnHold/index.js | 2 +- .../voiceMusicOnHold.attributes.js | 2 +- .../voiceMusicOnHold.controller.js | 2 +- .../api/voiceMusicOnHold/voiceMusicOnHold.model.js | 2 +- .../api/voiceMusicOnHold/voiceMusicOnHold.rpc.js | 2 +- server/api/voicePrefix/index.js | 2 +- server/api/voicePrefix/voicePrefix.attributes.js | 2 +- server/api/voicePrefix/voicePrefix.controller.js | 2 +- server/api/voicePrefix/voicePrefix.events.js | 2 +- server/api/voicePrefix/voicePrefix.model.js | 2 +- server/api/voicePrefix/voicePrefix.rpc.js | 2 +- server/api/voicePrefix/voicePrefix.socket.js | 2 +- server/api/voiceQueue/index.js | 2 +- server/api/voiceQueue/voiceQueue.attributes.js | 2 +- server/api/voiceQueue/voiceQueue.controller.js | 2 +- server/api/voiceQueue/voiceQueue.events.js | 2 +- server/api/voiceQueue/voiceQueue.model.js | 2 +- server/api/voiceQueue/voiceQueue.rpc.js | 2 +- server/api/voiceQueue/voiceQueue.socket.js | 2 +- server/api/voiceQueueReport/index.js | 2 +- .../voiceQueueReport.attributes.js | 2 +- .../voiceQueueReport.controller.js | 2 +- .../voiceQueueReport/voiceQueueReport.events.js | 2 +- .../api/voiceQueueReport/voiceQueueReport.model.js | 2 +- .../api/voiceQueueReport/voiceQueueReport.rpc.js | 2 +- .../voiceQueueReport/voiceQueueReport.socket.js | 2 +- server/api/voiceQueuesLog/index.js | 2 +- .../voiceQueuesLog/voiceQueuesLog.attributes.js | 2 +- .../voiceQueuesLog/voiceQueuesLog.controller.js | 2 +- server/api/voiceQueuesLog/voiceQueuesLog.model.js | 2 +- server/api/voiceQueuesLog/voiceQueuesLog.rpc.js | 2 +- server/api/voiceRecording/index.js | 2 +- .../voiceRecording/voiceRecording.attributes.js | 2 +- .../voiceRecording/voiceRecording.controller.js | 2 +- server/api/voiceRecording/voiceRecording.model.js | 2 +- server/api/voiceRecording/voiceRecording.rpc.js | 2 +- server/api/voiceTransferReport/index.js | 2 +- .../voiceTransferReport.attributes.js | 2 +- .../voiceTransferReport.controller.js | 2 +- .../voiceTransferReport.model.js | 2 +- .../voiceTransferReport/voiceTransferReport.rpc.js | 2 +- server/app.js | 2 +- server/components/auth/service.js | 2 +- server/components/encryptor/index.js | 2 +- server/components/export/csv.js | 2 +- server/components/export/pdf.js | 2 +- server/components/export/xlsx.js | 2 +- server/components/extensions/rewrite.js | 2 +- server/components/import/cm/csv.js | 2 +- server/components/import/cm/csv2.js | 2 +- server/components/integrations/configuration.js | 2 +- server/components/interaction/service.js | 2 +- server/components/license/service.js | 2 +- server/components/parsers/advancedSearch.js | 2 +- server/components/parsers/qs.js | 2 +- server/config/express.js | 2 +- server/config/license/hardware.js | 2 +- server/config/license/index.js | 2 +- server/config/license/util.js | 2 +- server/config/local.env.js | 2 +- server/config/logger.js | 2 +- server/config/pm2/config.js | 2 +- server/config/pm2/index.js | 2 +- server/config/schedule/chat.js | 2 +- server/config/schedule/index.js | 2 +- server/config/schedule/transcribe.js | 18 + server/config/seedContact.js | 2 +- server/config/seedUsers.js | 2 +- server/config/socketio.js | 2 +- server/config/triggers/index.js | 2 +- server/config/utils.js | 2 +- server/errors/index.js | 2 +- server/mysqldb/index.js | 2 +- server/routes.js | 2 +- server/rpc/index.js | 2 +- server/services/agi/channel.js | 2 +- server/services/agi/error.js | 2 +- server/services/agi/graph/index.js | 2 +- server/services/agi/index.js | 2 +- server/services/agi/mailRpc/index.js | 2 +- server/services/agi/reply.js | 2 +- server/services/agi/rpc/index.js | 2 +- server/services/agi/scripts/aws/index.js | 2 +- server/services/agi/scripts/aws/lex/index.js | 2 +- server/services/agi/scripts/aws/lex/lib/api.js | 2 +- server/services/agi/scripts/aws/polly/index.js | 2 +- server/services/agi/scripts/aws/polly/lib/api.js | 2 +- server/services/agi/scripts/google/asr/index.js | 2 +- server/services/agi/scripts/google/asr/lib/api.js | 2 +- server/services/agi/scripts/google/index.js | 2 +- server/services/agi/scripts/index.js | 2 +- server/services/agi/scripts/sestek/index.js | 2 +- server/services/agi/scripts/sestek/nda/index.js | 2 +- server/services/agi/scripts/tilde/asr/index.js | 2 +- server/services/agi/scripts/tilde/asr/lib/api.js | 2 +- server/services/agi/scripts/tilde/index.js | 2 +- server/services/agi/server.js | 2 +- server/services/agi/vertices.js | 2 +- server/services/ami/acw/index.js | 2 +- server/services/ami/ami.js | 2 +- server/services/ami/client.js | 2 +- server/services/ami/dialer/action.js | 2 +- server/services/ami/dialer/agentComplete.js | 2 +- server/services/ami/dialer/final.js | 2 +- server/services/ami/dialer/hangup.js | 2 +- server/services/ami/dialer/history.js | 2 +- server/services/ami/dialer/index.js | 2 +- server/services/ami/dialer/queueCallerAbandon.js | 2 +- server/services/ami/fax/action.js | 2 +- server/services/ami/fax/index.js | 2 +- server/services/ami/fax/rpcDb.js | 2 +- server/services/ami/fax/util/gs.js | 2 +- server/services/ami/fax/util/util.js | 2 +- server/services/ami/index.js | 2 +- server/services/ami/model/agent.js | 2 +- server/services/ami/model/campaign.js | 2 +- server/services/ami/model/channel.js | 2 +- server/services/ami/model/deskAccount.js | 2 +- server/services/ami/model/dynamics365Account.js | 2 +- server/services/ami/model/faxAccount.js | 2 +- server/services/ami/model/freshdeskAccount.js | 2 +- server/services/ami/model/queueReport.js | 2 +- server/services/ami/model/salesforceAccount.js | 2 +- server/services/ami/model/servicenowAccount.js | 2 +- server/services/ami/model/sugarcrmAccount.js | 2 +- server/services/ami/model/telephone.js | 2 +- server/services/ami/model/template.js | 2 +- server/services/ami/model/trigger.js | 2 +- server/services/ami/model/trunk.js | 2 +- server/services/ami/model/voiceExtension.js | 2 +- server/services/ami/model/voiceQueue.js | 2 +- server/services/ami/model/vtigerAccount.js | 2 +- server/services/ami/model/zendeskAccount.js | 2 +- server/services/ami/model/zohoAccount.js | 2 +- server/services/ami/preview/action.js | 2 +- server/services/ami/preview/index.js | 2 +- server/services/ami/preview/rpcDb.js | 2 +- server/services/ami/preview/util/util.js | 2 +- server/services/ami/properties.js | 2 +- server/services/ami/realtime/index.js | 2 +- server/services/ami/report/index.js | 2 +- server/services/ami/report/userReport.js | 2 +- server/services/ami/report/voiceAgentReport.js | 2 +- server/services/ami/report/voiceCallReport.js | 2 +- server/services/ami/report/voiceDialReport.js | 2 +- server/services/ami/report/voiceQueueReport.js | 2 +- server/services/ami/rpc/agentReportPreview.js | 2 +- server/services/ami/rpc/attachment.js | 2 +- server/services/ami/rpc/campaign.js | 2 +- server/services/ami/rpc/cmContact.js | 2 +- server/services/ami/rpc/cmHopper.js | 2 +- server/services/ami/rpc/cmHopperBlack.js | 2 +- server/services/ami/rpc/cmHopperFinal.js | 2 +- server/services/ami/rpc/cmHopperHistory.js | 2 +- server/services/ami/rpc/faxAccount.js | 2 +- server/services/ami/rpc/faxMessage.js | 2 +- server/services/ami/rpc/integrations/desk.js | 2 +- .../services/ami/rpc/integrations/dynamics365.js | 2 +- server/services/ami/rpc/integrations/freshdesk.js | 2 +- server/services/ami/rpc/integrations/salesforce.js | 2 +- server/services/ami/rpc/integrations/servicenow.js | 2 +- server/services/ami/rpc/integrations/sugarcrm.js | 2 +- server/services/ami/rpc/integrations/vtiger.js | 2 +- server/services/ami/rpc/integrations/zendesk.js | 2 +- server/services/ami/rpc/integrations/zoho.js | 2 +- server/services/ami/rpc/memberReport.js | 2 +- server/services/ami/rpc/template.js | 2 +- server/services/ami/rpc/trigger.js | 2 +- server/services/ami/rpc/trunk.js | 2 +- server/services/ami/rpc/user.js | 2 +- server/services/ami/rpc/voiceAgentReport.js | 2 +- server/services/ami/rpc/voiceCallReport.js | 2 +- server/services/ami/rpc/voiceDialReport.js | 2 +- server/services/ami/rpc/voiceExtension.js | 2 +- server/services/ami/rpc/voiceQueue.js | 2 +- server/services/ami/rpc/voiceQueueReport.js | 2 +- server/services/ami/rpc/voiceQueueRt.js | 2 +- server/services/ami/rpc/voiceRecording.js | 2 +- server/services/ami/rpc/voiceTransferReport.js | 2 +- server/services/ami/server/index.js | 2 +- server/services/ami/trigger/cmContact/index.js | 2 +- server/services/ami/trigger/index.js | 2 +- server/services/ami/trigger/integration/desk.js | 2 +- .../ami/trigger/integration/dynamics365.js | 2 +- .../services/ami/trigger/integration/freshdesk.js | 2 +- server/services/ami/trigger/integration/index.js | 2 +- .../services/ami/trigger/integration/salesforce.js | 2 +- .../services/ami/trigger/integration/servicenow.js | 2 +- .../services/ami/trigger/integration/sugarcrm.js | 2 +- server/services/ami/trigger/integration/util.js | 2 +- server/services/ami/trigger/integration/vtiger.js | 2 +- server/services/ami/trigger/integration/zendesk.js | 2 +- server/services/ami/trigger/integration/zoho.js | 2 +- server/services/ami/trigger/script/index.js | 2 +- server/services/ami/trigger/urlforward/index.js | 2 +- server/services/email/client.js | 2 +- server/services/email/index.js | 2 +- server/services/email/lib/email.js | 2 +- server/services/email/lib/imap.js | 2 +- server/services/email/lib/smtp.js | 2 +- server/services/email/lib/utils.js | 2 +- server/services/email/model/mailAccount.js | 2 +- server/services/email/realtime/index.js | 2 +- server/services/email/rpc/mailAccount.js | 2 +- server/services/email/server/index.js | 2 +- server/services/express/index.js | 2 +- server/services/routing/client.js | 2 +- server/services/routing/index.js | 2 +- server/services/routing/lib/rule-engine.js | 2 +- server/services/routing/mailRpc/index.js | 2 +- server/services/routing/model/agent.js | 2 +- server/services/routing/model/chatQueue.js | 2 +- server/services/routing/model/faxQueue.js | 2 +- server/services/routing/model/interval.js | 2 +- server/services/routing/model/mailQueue.js | 2 +- server/services/routing/model/openchannelQueue.js | 2 +- server/services/routing/model/smsQueue.js | 2 +- server/services/routing/realtime/index.js | 2 +- server/services/routing/rpc/chatInteraction.js | 2 +- server/services/routing/rpc/chatMessage.js | 2 +- server/services/routing/rpc/chatQueue.js | 2 +- server/services/routing/rpc/chatQueueReport.js | 2 +- server/services/routing/rpc/faxInteraction.js | 2 +- server/services/routing/rpc/faxMessage.js | 2 +- server/services/routing/rpc/faxQueue.js | 2 +- server/services/routing/rpc/faxQueueReport.js | 2 +- server/services/routing/rpc/interval.js | 2 +- server/services/routing/rpc/mailInteraction.js | 2 +- server/services/routing/rpc/mailMessage.js | 2 +- server/services/routing/rpc/mailQueue.js | 2 +- server/services/routing/rpc/mailQueueReport.js | 2 +- .../services/routing/rpc/openchannelInteraction.js | 2 +- server/services/routing/rpc/openchannelMessage.js | 2 +- server/services/routing/rpc/openchannelQueue.js | 2 +- .../services/routing/rpc/openchannelQueueReport.js | 2 +- server/services/routing/rpc/smsInteraction.js | 2 +- server/services/routing/rpc/smsMessage.js | 2 +- server/services/routing/rpc/smsQueue.js | 2 +- server/services/routing/rpc/smsQueueReport.js | 2 +- server/services/routing/rpc/user.js | 2 +- .../services/routing/server/applications/agent.js | 2 +- .../routing/server/applications/amazonlex.js | 2 +- .../routing/server/applications/autoreply.js | 2 +- .../services/routing/server/applications/close.js | 2 +- .../routing/server/applications/dialogflow.js | 2 +- .../services/routing/server/applications/gotoif.js | 2 +- .../services/routing/server/applications/gotop.js | 2 +- .../routing/server/applications/message.js | 2 +- .../services/routing/server/applications/noop.js | 2 +- .../services/routing/server/applications/queue.js | 2 +- .../routing/server/applications/strategy/agent.js | 2 +- .../server/applications/strategy/beepall.js | 2 +- .../routing/server/applications/strategy/index.js | 2 +- .../server/applications/strategy/rrmemory.js | 2 +- .../routing/server/applications/strategy/util.js | 2 +- .../services/routing/server/applications/system.js | 2 +- server/services/routing/server/applications/tag.js | 2 +- .../services/routing/server/applications/utils.js | 2 +- server/services/routing/server/index.js | 2 +- server/services/routing/server/interval.js | 2 +- server/services/xdr/agents.controller.js | 2 +- server/services/xdr/calls.controller.js | 2 +- server/services/xdr/core.controller.js | 2 +- server/services/xdr/dials.controller.js | 2 +- server/services/xdr/index.js | 2 +- server/services/xdr/members.controller.js | 2 +- server/services/xdr/queues.controller.js | 2 +- server/services/xdr/recordings.controller.js | 2 +- server/services/xdr/transfers.controller.js | 2 +- server/services/xdr/utils.js | 2 +- snippet/1.0.15/scripts/app.js | 2 +- 1073 files changed, 2680 insertions(+), 2623 deletions(-) create mode 100644 public/assets/images/business/voiceRecordings.jpg delete mode 100644 public/scripts/app.80a701c6.js create mode 100644 public/scripts/app.c0aabc4d.js delete mode 100644 public/scripts/vendor.cfb793d7.js create mode 100644 public/scripts/vendor.dbbe263c.js delete mode 100644 public/styles/app.30778b9e.css create mode 100644 public/styles/app.4e96988b.css create mode 100644 server/api/cloudProvider/cloudProvider.attributes.js create mode 100644 server/api/cloudProvider/cloudProvider.controller.js create mode 100644 server/api/cloudProvider/cloudProvider.model.js create mode 100644 server/api/cloudProvider/cloudProvider.rpc.js create mode 100644 server/api/cloudProvider/index.js create mode 100644 server/config/schedule/transcribe.js create mode 100644 server/files/transcribes/README.md diff --git a/apidoc/api_data.js b/apidoc/api_data.js index 030c95b..92372c8 100644 --- a/apidoc/api_data.js +++ b/apidoc/api_data.js @@ -2395,6 +2395,24 @@ define({ "api": [ "groupTitle": "Chat_Interactions" }, { + "type": "put", + "url": "/api/chat/interactions/{id}/close", + "title": "Close Interaction", + "examples": [ + { + "title": "Example usage:", + "content": "curl https://{domain}/api/chat/interactions/{id}/close -d '[{\"to\": \"+3901119886500\", \"...\": \"...\"}]' \\ \n -H 'Content-Type: application/json' -v -u {name}:{password} -X POST", + "type": "json" + } + ], + "name": "addMessage", + "group": "Chat_Interactions", + "description": "

Motion will return a HTTP status code 200 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", + "version": "0.0.0", + "filename": "server/api/chatInteraction/index.js", + "groupTitle": "Chat_Interactions" + }, + { "type": "post", "url": "/api/chat/interactions/{id}/messages", "title": "Creates new messages", @@ -2458,24 +2476,6 @@ define({ "api": [ "groupTitle": "Chat_Interactions" }, { - "type": "put", - "url": "/api/chat/interactions/{id}/close", - "title": "Close Interaction", - "examples": [ - { - "title": "Example usage:", - "content": "curl https://{domain}/api/chat/interactions/{id}/close -d '[{\"to\": \"+3901119886500\", \"...\": \"...\"}]' \\ \n -H 'Content-Type: application/json' -v -u {name}:{password} -X POST", - "type": "json" - } - ], - "name": "addMessage", - "group": "Chat_Interactions", - "description": "

Motion will return a HTTP status code 200 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", - "version": "0.0.0", - "filename": "server/api/chatInteraction/index.js", - "groupTitle": "Chat_Interactions" - }, - { "type": "post", "url": "/api/chat/interactions/{id}/attachment_upload", "title": "Add attachment", @@ -5213,6 +5213,134 @@ define({ "api": [ }, { "type": "post", + "url": "/api/cloudProviders", + "title": "Creates a new CloudProvider", + "examples": [ + { + "title": "Example usage:", + "content": "curl https://{domain}/api/cloudProviders -d '{\"key1\": \"valu1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X POST", + "type": "json" + } + ], + "name": "CreateCloudProviders", + "group": "CloudProviders", + "parameter": { + "fields": { + "Body": [ + { + "group": "Body", + "type": "String", + "optional": false, + "field": "name", + "description": "" + }, + { + "group": "Body", + "type": "String", + "allowedValues": [ + "\"AmazonAWS\"", + "\"Google\"" + ], + "optional": false, + "field": "service", + "description": "" + }, + { + "group": "Body", + "type": "String", + "optional": true, + "field": "data1", + "description": "" + }, + { + "group": "Body", + "type": "String", + "optional": true, + "field": "data2", + "description": "" + } + ] + } + }, + "description": "

Motion will return a HTTP status code 201 upon success.

Motion renders the resulting JSON representation in the response body.

", + "version": "0.0.0", + "filename": "server/api/cloudProvider/index.js", + "groupTitle": "CloudProviders" + }, + { + "type": "delete", + "url": "/api/cloudProviders/{id}", + "title": "Deletes a CloudProvider", + "examples": [ + { + "title": "Example usage:", + "content": "curl https://{domain}/api/cloudProviders/{id} -v -u {name}:{password} -X DELETE", + "type": "json" + } + ], + "name": "DeleteCloudProviders", + "group": "CloudProviders", + "description": "

Motion will return a HTTP status code 204 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", + "version": "0.0.0", + "filename": "server/api/cloudProvider/index.js", + "groupTitle": "CloudProviders" + }, + { + "type": "get", + "url": "/api/cloudProviders", + "title": "Gets a list of CloudProviders", + "examples": [ + { + "title": "Example usage:", + "content": "curl https://{domain}/api/cloudProviders -v -u {name}:{password}", + "type": "json" + } + ], + "name": "GetCloudProviders", + "group": "CloudProviders", + "description": "

Motion will always return paged results. Motion returns paging data in the Content-Range header in the form start - end / total.

Upon success Motion will return a HTTP status code 200 OK if the entire collection was returned otherwise it will return a HTTP status code 206 Partial Content.

Motion renders the resulting JSON representation in the response body.

Retrieving Specific Fields

To return only specific fields for a result set you can utilize the fields parameter. This parameter accepts a comma-separated list.

A call returning only id and name for a result set would look like this.

GET /api/cloudProviders?fields=id,name

Filtering

You can perform exact-match filtering on any of a model's fields by using the field name as the key and supplying it with a value. These parameters accept a comma-separated list.

A call returning a result set for records with name of john.doe or jane.miller.

GET /api/cloudProviders?name=john.doe,jane.miller

If you use the key filter the result will be filtered by the value you specify.

GET /api/cloudProviders?filter=john

Sorting

To sort a result set based on one or several fields you can utilize the sort parameter. This parameters accepts a comma-separated list.

Results will be sorted in the order of the fields provided. The default sorting order for fields is ascending. Fields can be sorted in descending order by prefixing them with a dash (-).

A call sorting a result by id ascending and then name descending would look like this.

GET /api/cloudProviders?sort=id,-name

Offset and Limit

Query results are always paged. Motion leverages the offset and limit parameters to facilitate this.

When the neither of these parameters are explicitly supplied the handler will assume the a default limit of 100.

offset is a number indicating the start position in the result set you want to return.

limit is a number indicating how many records past the start position you want returned.

A call with a result set starting at 5 and returning no more than 25 records would look like this.

GET /api/cloudProviders?offset=5&limit=25

If there were 50 records in total, the returned Content-Range header would look like this.

Content-Range: 5-30/50

", + "version": "0.0.0", + "filename": "server/api/cloudProvider/index.js", + "groupTitle": "CloudProviders" + }, + { + "type": "get", + "url": "/api/cloudProviders/{id}", + "title": "Gets a single CloudProvider", + "examples": [ + { + "title": "Example usage:", + "content": "curl https://{domain}/api/cloudProviders/{id} -v -u {name}:{password}", + "type": "json" + } + ], + "name": "ShowCloudProviders", + "group": "CloudProviders", + "description": "

Motion will return a HTTP status code 200 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", + "version": "0.0.0", + "filename": "server/api/cloudProvider/index.js", + "groupTitle": "CloudProviders" + }, + { + "type": "put", + "url": "/api/cloudProviders/{id}", + "title": "Update an existing CloudProvider", + "examples": [ + { + "title": "Example usage:", + "content": "curl https://{domain}/api/cloudProviders/{id} -d '{\"key1\": \"value1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X PUT", + "type": "json" + } + ], + "name": "updateCloudProviders", + "group": "CloudProviders", + "description": "

Motion will return a HTTP status code 200 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", + "version": "0.0.0", + "filename": "server/api/cloudProvider/index.js", + "groupTitle": "CloudProviders" + }, + { + "type": "post", "url": "/api/cm/companies", "title": "Creates a new Company", "examples": [ @@ -9410,12 +9538,12 @@ define({ "api": [ }, { "type": "post", - "url": "/api/fax/accounts/{id}/applications", - "title": "Creates new applications", + "url": "/api/fax/accounts/addaccountapplications", + "title": "Creates new account and applications", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/fax/accounts/{id}/applications -d '[{\"app\": \"queue\", \"...\": \"...\"}]' \\ \n -H 'Content-Type: application/json' -v -u {name}:{password} -X POST", + "content": "curl https://{domain}/api/fax/accounts/addaccountapplications -d '[{\"name\": \"name\", \"...\": \"...\"}]' \\ \n -H 'Content-Type: application/json' -v -u {name}:{password} -X POST", "type": "json" } ], @@ -9469,12 +9597,12 @@ define({ "api": [ }, { "type": "post", - "url": "/api/fax/accounts/addaccountapplications", - "title": "Creates new account and applications", + "url": "/api/fax/accounts/{id}/applications", + "title": "Creates new applications", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/fax/accounts/addaccountapplications -d '[{\"name\": \"name\", \"...\": \"...\"}]' \\ \n -H 'Content-Type: application/json' -v -u {name}:{password} -X POST", + "content": "curl https://{domain}/api/fax/accounts/{id}/applications -d '[{\"app\": \"queue\", \"...\": \"...\"}]' \\ \n -H 'Content-Type: application/json' -v -u {name}:{password} -X POST", "type": "json" } ], @@ -21510,49 +21638,49 @@ define({ "api": [ "groupTitle": "Sms_Accounts" }, { - "type": "get", - "url": "/api/sms/accounts/{id}/status", - "title": "Receive message status as get request", + "type": "post", + "url": "/api/sms/messages/{id}/status", + "title": "Receive message status", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/sms/accounts/{id}/status -H 'Content-Type: application/json' -v -X GET", + "content": "curl https://{domain}/api/sms/messages/{id}/status \\ \n -H 'Content-Type: application/json' -v -X POST", "type": "json" } ], "name": "statusMessage", "group": "Sms_Accounts", - "description": "

Motion will return a HTTP status code 200 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", + "description": "

Motion will return a HTTP status code 201 upon success.

Motion renders the resulting JSON representation in the response body.

", "version": "0.0.0", - "filename": "server/api/smsAccount/index.js", + "filename": "server/api/smsMessage/index.js", "groupTitle": "Sms_Accounts" }, { - "type": "post", + "type": "get", "url": "/api/sms/accounts/{id}/status", - "title": "Receive message status", + "title": "Receive message status as get request", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/sms/accounts/{id}/status -H 'Content-Type: application/json' -v -X POST", + "content": "curl https://{domain}/api/sms/accounts/{id}/status -H 'Content-Type: application/json' -v -X GET", "type": "json" } ], "name": "statusMessage", "group": "Sms_Accounts", - "description": "

Motion will return a HTTP status code 201 upon success.

Motion renders the resulting JSON representation in the response body.

", + "description": "

Motion will return a HTTP status code 200 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", "version": "0.0.0", "filename": "server/api/smsAccount/index.js", "groupTitle": "Sms_Accounts" }, { "type": "post", - "url": "/api/sms/messages/{id}/status", + "url": "/api/sms/accounts/{id}/status", "title": "Receive message status", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/sms/messages/{id}/status \\ \n -H 'Content-Type: application/json' -v -X POST", + "content": "curl https://{domain}/api/sms/accounts/{id}/status -H 'Content-Type: application/json' -v -X POST", "type": "json" } ], @@ -21560,7 +21688,7 @@ define({ "api": [ "group": "Sms_Accounts", "description": "

Motion will return a HTTP status code 201 upon success.

Motion renders the resulting JSON representation in the response body.

", "version": "0.0.0", - "filename": "server/api/smsMessage/index.js", + "filename": "server/api/smsAccount/index.js", "groupTitle": "Sms_Accounts" }, { @@ -24815,12 +24943,12 @@ define({ "api": [ }, { "type": "delete", - "url": "/api/voice/queues/{id}/teams", + "url": "/api/chat/queues/{id}/teams", "title": "Remove teams from a queue", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/voice/queues/{id}/teams -v -u {name}:{password} -X DELETE", + "content": "curl https://{domain}/api/chat/queues/{id}/teams -v -u {name}:{password} -X DELETE", "type": "json" } ], @@ -24828,17 +24956,17 @@ define({ "api": [ "group": "Teams", "description": "

Motion will return a HTTP status code 204 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", "version": "0.0.0", - "filename": "server/api/voiceQueue/index.js", + "filename": "server/api/chatQueue/index.js", "groupTitle": "Teams" }, { "type": "delete", - "url": "/api/chat/queues/{id}/teams", + "url": "/api/voice/queues/{id}/teams", "title": "Remove teams from a queue", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/chat/queues/{id}/teams -v -u {name}:{password} -X DELETE", + "content": "curl https://{domain}/api/voice/queues/{id}/teams -v -u {name}:{password} -X DELETE", "type": "json" } ], @@ -24846,17 +24974,17 @@ define({ "api": [ "group": "Teams", "description": "

Motion will return a HTTP status code 204 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", "version": "0.0.0", - "filename": "server/api/chatQueue/index.js", + "filename": "server/api/voiceQueue/index.js", "groupTitle": "Teams" }, { "type": "delete", - "url": "/api/fax/queues/{id}/teams", + "url": "/api/sms/queues/{id}/teams", "title": "Remove teams from a queue", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/fax/queues/{id}/teams -v -u {name}:{password} -X DELETE", + "content": "curl https://{domain}/api/sms/queues/{id}/teams -v -u {name}:{password} -X DELETE", "type": "json" } ], @@ -24864,17 +24992,17 @@ define({ "api": [ "group": "Teams", "description": "

Motion will return a HTTP status code 204 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", "version": "0.0.0", - "filename": "server/api/faxQueue/index.js", + "filename": "server/api/smsQueue/index.js", "groupTitle": "Teams" }, { "type": "delete", - "url": "/api/mail/queues/{id}/teams", + "url": "/api/fax/queues/{id}/teams", "title": "Remove teams from a queue", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/mail/queues/{id}/teams -v -u {name}:{password} -X DELETE", + "content": "curl https://{domain}/api/fax/queues/{id}/teams -v -u {name}:{password} -X DELETE", "type": "json" } ], @@ -24882,17 +25010,17 @@ define({ "api": [ "group": "Teams", "description": "

Motion will return a HTTP status code 204 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", "version": "0.0.0", - "filename": "server/api/mailQueue/index.js", + "filename": "server/api/faxQueue/index.js", "groupTitle": "Teams" }, { "type": "delete", - "url": "/api/sms/queues/{id}/teams", + "url": "/api/mail/queues/{id}/teams", "title": "Remove teams from a queue", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/sms/queues/{id}/teams -v -u {name}:{password} -X DELETE", + "content": "curl https://{domain}/api/mail/queues/{id}/teams -v -u {name}:{password} -X DELETE", "type": "json" } ], @@ -24900,7 +25028,7 @@ define({ "api": [ "group": "Teams", "description": "

Motion will return a HTTP status code 204 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", "version": "0.0.0", - "filename": "server/api/smsQueue/index.js", + "filename": "server/api/mailQueue/index.js", "groupTitle": "Teams" }, { diff --git a/apidoc/api_data.json b/apidoc/api_data.json index 6245df5..1be6406 100644 --- a/apidoc/api_data.json +++ b/apidoc/api_data.json @@ -2395,6 +2395,24 @@ "groupTitle": "Chat_Interactions" }, { + "type": "put", + "url": "/api/chat/interactions/{id}/close", + "title": "Close Interaction", + "examples": [ + { + "title": "Example usage:", + "content": "curl https://{domain}/api/chat/interactions/{id}/close -d '[{\"to\": \"+3901119886500\", \"...\": \"...\"}]' \\ \n -H 'Content-Type: application/json' -v -u {name}:{password} -X POST", + "type": "json" + } + ], + "name": "addMessage", + "group": "Chat_Interactions", + "description": "

Motion will return a HTTP status code 200 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", + "version": "0.0.0", + "filename": "server/api/chatInteraction/index.js", + "groupTitle": "Chat_Interactions" + }, + { "type": "post", "url": "/api/chat/interactions/{id}/messages", "title": "Creates new messages", @@ -2458,24 +2476,6 @@ "groupTitle": "Chat_Interactions" }, { - "type": "put", - "url": "/api/chat/interactions/{id}/close", - "title": "Close Interaction", - "examples": [ - { - "title": "Example usage:", - "content": "curl https://{domain}/api/chat/interactions/{id}/close -d '[{\"to\": \"+3901119886500\", \"...\": \"...\"}]' \\ \n -H 'Content-Type: application/json' -v -u {name}:{password} -X POST", - "type": "json" - } - ], - "name": "addMessage", - "group": "Chat_Interactions", - "description": "

Motion will return a HTTP status code 200 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", - "version": "0.0.0", - "filename": "server/api/chatInteraction/index.js", - "groupTitle": "Chat_Interactions" - }, - { "type": "post", "url": "/api/chat/interactions/{id}/attachment_upload", "title": "Add attachment", @@ -5213,6 +5213,134 @@ }, { "type": "post", + "url": "/api/cloudProviders", + "title": "Creates a new CloudProvider", + "examples": [ + { + "title": "Example usage:", + "content": "curl https://{domain}/api/cloudProviders -d '{\"key1\": \"valu1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X POST", + "type": "json" + } + ], + "name": "CreateCloudProviders", + "group": "CloudProviders", + "parameter": { + "fields": { + "Body": [ + { + "group": "Body", + "type": "String", + "optional": false, + "field": "name", + "description": "" + }, + { + "group": "Body", + "type": "String", + "allowedValues": [ + "\"AmazonAWS\"", + "\"Google\"" + ], + "optional": false, + "field": "service", + "description": "" + }, + { + "group": "Body", + "type": "String", + "optional": true, + "field": "data1", + "description": "" + }, + { + "group": "Body", + "type": "String", + "optional": true, + "field": "data2", + "description": "" + } + ] + } + }, + "description": "

Motion will return a HTTP status code 201 upon success.

Motion renders the resulting JSON representation in the response body.

", + "version": "0.0.0", + "filename": "server/api/cloudProvider/index.js", + "groupTitle": "CloudProviders" + }, + { + "type": "delete", + "url": "/api/cloudProviders/{id}", + "title": "Deletes a CloudProvider", + "examples": [ + { + "title": "Example usage:", + "content": "curl https://{domain}/api/cloudProviders/{id} -v -u {name}:{password} -X DELETE", + "type": "json" + } + ], + "name": "DeleteCloudProviders", + "group": "CloudProviders", + "description": "

Motion will return a HTTP status code 204 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", + "version": "0.0.0", + "filename": "server/api/cloudProvider/index.js", + "groupTitle": "CloudProviders" + }, + { + "type": "get", + "url": "/api/cloudProviders", + "title": "Gets a list of CloudProviders", + "examples": [ + { + "title": "Example usage:", + "content": "curl https://{domain}/api/cloudProviders -v -u {name}:{password}", + "type": "json" + } + ], + "name": "GetCloudProviders", + "group": "CloudProviders", + "description": "

Motion will always return paged results. Motion returns paging data in the Content-Range header in the form start - end / total.

Upon success Motion will return a HTTP status code 200 OK if the entire collection was returned otherwise it will return a HTTP status code 206 Partial Content.

Motion renders the resulting JSON representation in the response body.

Retrieving Specific Fields

To return only specific fields for a result set you can utilize the fields parameter. This parameter accepts a comma-separated list.

A call returning only id and name for a result set would look like this.

GET /api/cloudProviders?fields=id,name

Filtering

You can perform exact-match filtering on any of a model's fields by using the field name as the key and supplying it with a value. These parameters accept a comma-separated list.

A call returning a result set for records with name of john.doe or jane.miller.

GET /api/cloudProviders?name=john.doe,jane.miller

If you use the key filter the result will be filtered by the value you specify.

GET /api/cloudProviders?filter=john

Sorting

To sort a result set based on one or several fields you can utilize the sort parameter. This parameters accepts a comma-separated list.

Results will be sorted in the order of the fields provided. The default sorting order for fields is ascending. Fields can be sorted in descending order by prefixing them with a dash (-).

A call sorting a result by id ascending and then name descending would look like this.

GET /api/cloudProviders?sort=id,-name

Offset and Limit

Query results are always paged. Motion leverages the offset and limit parameters to facilitate this.

When the neither of these parameters are explicitly supplied the handler will assume the a default limit of 100.

offset is a number indicating the start position in the result set you want to return.

limit is a number indicating how many records past the start position you want returned.

A call with a result set starting at 5 and returning no more than 25 records would look like this.

GET /api/cloudProviders?offset=5&limit=25

If there were 50 records in total, the returned Content-Range header would look like this.

Content-Range: 5-30/50

", + "version": "0.0.0", + "filename": "server/api/cloudProvider/index.js", + "groupTitle": "CloudProviders" + }, + { + "type": "get", + "url": "/api/cloudProviders/{id}", + "title": "Gets a single CloudProvider", + "examples": [ + { + "title": "Example usage:", + "content": "curl https://{domain}/api/cloudProviders/{id} -v -u {name}:{password}", + "type": "json" + } + ], + "name": "ShowCloudProviders", + "group": "CloudProviders", + "description": "

Motion will return a HTTP status code 200 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", + "version": "0.0.0", + "filename": "server/api/cloudProvider/index.js", + "groupTitle": "CloudProviders" + }, + { + "type": "put", + "url": "/api/cloudProviders/{id}", + "title": "Update an existing CloudProvider", + "examples": [ + { + "title": "Example usage:", + "content": "curl https://{domain}/api/cloudProviders/{id} -d '{\"key1\": \"value1\", \"key2\": \"value2\", \"...\": \"...\"}' \\\n -H \"Content-Type: application/json\" -v -u {name}:{password} -X PUT", + "type": "json" + } + ], + "name": "updateCloudProviders", + "group": "CloudProviders", + "description": "

Motion will return a HTTP status code 200 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", + "version": "0.0.0", + "filename": "server/api/cloudProvider/index.js", + "groupTitle": "CloudProviders" + }, + { + "type": "post", "url": "/api/cm/companies", "title": "Creates a new Company", "examples": [ @@ -9410,12 +9538,12 @@ }, { "type": "post", - "url": "/api/fax/accounts/{id}/applications", - "title": "Creates new applications", + "url": "/api/fax/accounts/addaccountapplications", + "title": "Creates new account and applications", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/fax/accounts/{id}/applications -d '[{\"app\": \"queue\", \"...\": \"...\"}]' \\ \n -H 'Content-Type: application/json' -v -u {name}:{password} -X POST", + "content": "curl https://{domain}/api/fax/accounts/addaccountapplications -d '[{\"name\": \"name\", \"...\": \"...\"}]' \\ \n -H 'Content-Type: application/json' -v -u {name}:{password} -X POST", "type": "json" } ], @@ -9469,12 +9597,12 @@ }, { "type": "post", - "url": "/api/fax/accounts/addaccountapplications", - "title": "Creates new account and applications", + "url": "/api/fax/accounts/{id}/applications", + "title": "Creates new applications", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/fax/accounts/addaccountapplications -d '[{\"name\": \"name\", \"...\": \"...\"}]' \\ \n -H 'Content-Type: application/json' -v -u {name}:{password} -X POST", + "content": "curl https://{domain}/api/fax/accounts/{id}/applications -d '[{\"app\": \"queue\", \"...\": \"...\"}]' \\ \n -H 'Content-Type: application/json' -v -u {name}:{password} -X POST", "type": "json" } ], @@ -21510,49 +21638,49 @@ "groupTitle": "Sms_Accounts" }, { - "type": "get", - "url": "/api/sms/accounts/{id}/status", - "title": "Receive message status as get request", + "type": "post", + "url": "/api/sms/messages/{id}/status", + "title": "Receive message status", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/sms/accounts/{id}/status -H 'Content-Type: application/json' -v -X GET", + "content": "curl https://{domain}/api/sms/messages/{id}/status \\ \n -H 'Content-Type: application/json' -v -X POST", "type": "json" } ], "name": "statusMessage", "group": "Sms_Accounts", - "description": "

Motion will return a HTTP status code 200 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", + "description": "

Motion will return a HTTP status code 201 upon success.

Motion renders the resulting JSON representation in the response body.

", "version": "0.0.0", - "filename": "server/api/smsAccount/index.js", + "filename": "server/api/smsMessage/index.js", "groupTitle": "Sms_Accounts" }, { - "type": "post", + "type": "get", "url": "/api/sms/accounts/{id}/status", - "title": "Receive message status", + "title": "Receive message status as get request", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/sms/accounts/{id}/status -H 'Content-Type: application/json' -v -X POST", + "content": "curl https://{domain}/api/sms/accounts/{id}/status -H 'Content-Type: application/json' -v -X GET", "type": "json" } ], "name": "statusMessage", "group": "Sms_Accounts", - "description": "

Motion will return a HTTP status code 201 upon success.

Motion renders the resulting JSON representation in the response body.

", + "description": "

Motion will return a HTTP status code 200 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", "version": "0.0.0", "filename": "server/api/smsAccount/index.js", "groupTitle": "Sms_Accounts" }, { "type": "post", - "url": "/api/sms/messages/{id}/status", + "url": "/api/sms/accounts/{id}/status", "title": "Receive message status", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/sms/messages/{id}/status \\ \n -H 'Content-Type: application/json' -v -X POST", + "content": "curl https://{domain}/api/sms/accounts/{id}/status -H 'Content-Type: application/json' -v -X POST", "type": "json" } ], @@ -21560,7 +21688,7 @@ "group": "Sms_Accounts", "description": "

Motion will return a HTTP status code 201 upon success.

Motion renders the resulting JSON representation in the response body.

", "version": "0.0.0", - "filename": "server/api/smsMessage/index.js", + "filename": "server/api/smsAccount/index.js", "groupTitle": "Sms_Accounts" }, { @@ -24815,12 +24943,12 @@ }, { "type": "delete", - "url": "/api/voice/queues/{id}/teams", + "url": "/api/chat/queues/{id}/teams", "title": "Remove teams from a queue", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/voice/queues/{id}/teams -v -u {name}:{password} -X DELETE", + "content": "curl https://{domain}/api/chat/queues/{id}/teams -v -u {name}:{password} -X DELETE", "type": "json" } ], @@ -24828,17 +24956,17 @@ "group": "Teams", "description": "

Motion will return a HTTP status code 204 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", "version": "0.0.0", - "filename": "server/api/voiceQueue/index.js", + "filename": "server/api/chatQueue/index.js", "groupTitle": "Teams" }, { "type": "delete", - "url": "/api/chat/queues/{id}/teams", + "url": "/api/voice/queues/{id}/teams", "title": "Remove teams from a queue", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/chat/queues/{id}/teams -v -u {name}:{password} -X DELETE", + "content": "curl https://{domain}/api/voice/queues/{id}/teams -v -u {name}:{password} -X DELETE", "type": "json" } ], @@ -24846,17 +24974,17 @@ "group": "Teams", "description": "

Motion will return a HTTP status code 204 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", "version": "0.0.0", - "filename": "server/api/chatQueue/index.js", + "filename": "server/api/voiceQueue/index.js", "groupTitle": "Teams" }, { "type": "delete", - "url": "/api/fax/queues/{id}/teams", + "url": "/api/sms/queues/{id}/teams", "title": "Remove teams from a queue", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/fax/queues/{id}/teams -v -u {name}:{password} -X DELETE", + "content": "curl https://{domain}/api/sms/queues/{id}/teams -v -u {name}:{password} -X DELETE", "type": "json" } ], @@ -24864,17 +24992,17 @@ "group": "Teams", "description": "

Motion will return a HTTP status code 204 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", "version": "0.0.0", - "filename": "server/api/faxQueue/index.js", + "filename": "server/api/smsQueue/index.js", "groupTitle": "Teams" }, { "type": "delete", - "url": "/api/mail/queues/{id}/teams", + "url": "/api/fax/queues/{id}/teams", "title": "Remove teams from a queue", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/mail/queues/{id}/teams -v -u {name}:{password} -X DELETE", + "content": "curl https://{domain}/api/fax/queues/{id}/teams -v -u {name}:{password} -X DELETE", "type": "json" } ], @@ -24882,17 +25010,17 @@ "group": "Teams", "description": "

Motion will return a HTTP status code 204 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", "version": "0.0.0", - "filename": "server/api/mailQueue/index.js", + "filename": "server/api/faxQueue/index.js", "groupTitle": "Teams" }, { "type": "delete", - "url": "/api/sms/queues/{id}/teams", + "url": "/api/mail/queues/{id}/teams", "title": "Remove teams from a queue", "examples": [ { "title": "Example usage:", - "content": "curl https://{domain}/api/sms/queues/{id}/teams -v -u {name}:{password} -X DELETE", + "content": "curl https://{domain}/api/mail/queues/{id}/teams -v -u {name}:{password} -X DELETE", "type": "json" } ], @@ -24900,7 +25028,7 @@ "group": "Teams", "description": "

Motion will return a HTTP status code 204 upon success. Motion return a HTTP status code 404 if the corresponding record could not be located.

Motion renders the resulting JSON representation in the response body.

", "version": "0.0.0", - "filename": "server/api/smsQueue/index.js", + "filename": "server/api/mailQueue/index.js", "groupTitle": "Teams" }, { diff --git a/apidoc/api_project.js b/apidoc/api_project.js index ac9439c..7842769 100644 --- a/apidoc/api_project.js +++ b/apidoc/api_project.js @@ -17,7 +17,7 @@ define({ "apidoc": "0.3.0", "generator": { "name": "apidoc", - "time": "2020-04-06T10:20:59.269Z", + "time": "2020-04-07T09:04:45.735Z", "url": "http://apidocjs.com", "version": "0.20.1" } diff --git a/apidoc/api_project.json b/apidoc/api_project.json index ae7bb18..8432cc3 100644 --- a/apidoc/api_project.json +++ b/apidoc/api_project.json @@ -17,7 +17,7 @@ "apidoc": "0.3.0", "generator": { "name": "apidoc", - "time": "2020-04-06T10:20:59.269Z", + "time": "2020-04-07T09:04:45.735Z", "url": "http://apidocjs.com", "version": "0.20.1" } diff --git a/public/app/main/apps/dashboards/i18n/en.json b/public/app/main/apps/dashboards/i18n/en.json index 441f2f7..b7855aa 100644 --- a/public/app/main/apps/dashboards/i18n/en.json +++ b/public/app/main/apps/dashboards/i18n/en.json @@ -511,35 +511,6 @@ "TO": "To", "INVOICEEMITED": "Issued", "INVOICEPAYED": "Payed", - "INVOICETOTAL": "Total", - "ADVANCED_SEARCH": "Advanced Search", - "NEW_CONDITION": "New Condition", - "SELECT_FIELD": "Select field", - "SELECT_OPERATOR": "Select operator", - "VALUE": "Value", - "VALUES": "Values", - "APPLY": "Apply", - "MEET_ALL_CONDITIONS": "Meet all conditions", - "MEET_ANY_CONDITIONS": "Meet at least one condition", - "EQUALS": "Equals", - "IS_NOT_EQUAL": "Does not equal", - "IS_AMONG": "Is among", - "IS_NOT_AMONG": "Is not among", - "IS_GREATER_THAN": "Is greater than", - "IS_GREATER_THAN_OR_EQUAL_TO": "Is greater than or equal to", - "IS_LESS_THAN": "Is less than", - "IS_LESS_THAN_OR_EQUAL_TO": "Is less than or equal to", - "IS_BETWEEN": "Is between", - "CONTAINS": "Contains", - "STARTS_WITH": "Starts with", - "ENDS_WITH": "Ends with", - "STARTING_DATE": "Starting date", - "ENDING_DATE": "Ending date", - "STARTING_VALUE": "Starting value", - "ENDING_VALUE": "Ending value", - "VALUE_RANGE_CHECK": "Value must be greater than", - "AND": "And", - "ENABLED": "Enabled", - "DISABLED": "Disabled" + "INVOICETOTAL": "Total" } -} +} \ No newline at end of file diff --git a/public/app/main/apps/dashboards/i18n/it.json b/public/app/main/apps/dashboards/i18n/it.json index a993a63..bf3d80b 100644 --- a/public/app/main/apps/dashboards/i18n/it.json +++ b/public/app/main/apps/dashboards/i18n/it.json @@ -124,7 +124,6 @@ "RATING": "Valutazione", "FEEDBACK": "Feedback", "SUBJECT": "Oggetto", - "CUSTOMER_IP": "IP Cliente", "REFERER": "Referer", "WEBSITE": "Sito Web", "AGENT": "Agente", @@ -197,8 +196,8 @@ "DROP_RATE": "Il tasso di chiamate in coda non andate a buon fine", "ORIGINATEDLIMITED": "Chiamate generate dalle campagne", "EXACT_MATCH_FILTER": "Cerca una corrispondenza esatta", - "LIKE_FILTER": "Cerca il modello specificato", - "MANDATORY_DISPOSITION_ENABLED": "Disposizione obbligatoria abilitata per questo account" + "LIKE_FILTER": "Cerca il modello specificato", + "MANDATORY_DISPOSITION_ENABLED": "Disposizione obbligatoria abilitata per questo account" }, "NO_AVAILABLE_INFO": "Nessuna informazione disponibile", "WELCOME_TO_MOTION": "Benvenuto in Motion", @@ -321,27 +320,25 @@ "TRANSFER_NUMBER": "Trasferisci", "CALL_SAVED": "Chiamata salvata correttamente", "CALL_DISPOSED": "Chiamata disposta correttamente", - "CUSTOMER_PORT": "Porta di origine del cliente", "AGENTS": "Agents", "INTERACTION_CLOSED": "Interazione chiusa correttamente", "INTERACTION_DISPOSED": "Interazione disposta correttamente", "INTERACTION_CLOSED_DISPOSED": "Interazione chiusa e disposta correttamente", "SELECT_ALL": "Seleziona tutti", - "ASSIGNED_TO_OTHERS": "Assegnate ad altri", - "CHAT_INTERACTIONS": "Interazioni Chat", - "FAX_INTERACTIONS": "Interazioni Fax", - "MAIL_INTERACTIONS": "Interazioni Email", - "OPENCHANNEL_INTERACTIONS": "Interazioni Open Channel", - "SMS_INTERACTIONS": "Interazioni SMS", - "DRAFT": "Bozza", - "DRAFT_SAVE_WARNING_TITLE": "Sovrascrivere bozza esistente?", - "DRAFT_SAVE_WARNING_MESSAGE": "C'è già una bozza salvata per questa interazione. Sei sicuro di volerla sovrascrivere?", - "OVERWRITE": "Sovrascrivi", - "CANCEL": "Annulla", - "UNTITLED": "Senza nome", - "SAVE_AS_DRAFT": "Salva come bozza", + "ASSIGNED_TO_OTHERS": "Assegnate ad altri", + "CHAT_INTERACTIONS": "Interazioni Chat", + "FAX_INTERACTIONS": "Interazioni Fax", + "MAIL_INTERACTIONS": "Interazioni Email", + "OPENCHANNEL_INTERACTIONS": "Interazioni Open Channel", + "SMS_INTERACTIONS": "Interazioni SMS", + "DRAFT": "Bozza", + "DRAFT_SAVE_WARNING_TITLE": "Sovrascrivere bozza esistente?", + "DRAFT_SAVE_WARNING_MESSAGE": "C'è già una bozza salvata per questa interazione. Sei sicuro di volerla sovrascrivere?", + "OVERWRITE": "Sovrascrivi", + "CANCEL": "Annulla", + "UNTITLED": "Senza nome", + "SAVE_AS_DRAFT": "Salva come bozza", "UPDATE_DRAFT": "Aggiorna bozza", - "NO_AVAILABLE_INTERACTION" : "Nessuna interazione disponibile", "DOSSIERS": "Pratiche", "DOSSIER": "Pratica", "DOSSIER_INFO": "Informazioni", @@ -512,34 +509,8 @@ "INVOICEEMITED": "Emesse", "INVOICEPAYED": "Pagate", "INVOICETOTAL": "Totale", - "ADVANCED_SEARCH": "Ricerca Avanzata", - "NEW_CONDITION": "Nuova Condizione", - "SELECT_FIELD": "Seleziona campo", - "SELECT_OPERATOR": "Seleziona operatore", - "VALUE": "Valore", - "VALUES": "Valori", - "APPLY": "Applica", - "MEET_ALL_CONDITIONS": "Soddisfa tutte le condizioni", - "MEET_ANY_CONDITIONS": "Soddisfa almeno una condizione", - "EQUALS": "È uguale a", - "IS_NOT_EQUAL": "È diverso da", - "IS_AMONG": "È compreso tra", - "IS_NOT_AMONG": "Non è compreso tra", - "IS_GREATER_THAN": "È maggiore di", - "IS_GREATER_THAN_OR_EQUAL_TO": "È maggiore o uguale di", - "IS_LESS_THAN": "È minore di", - "IS_LESS_THAN_OR_EQUAL_TO": "È minore o uguale di", - "IS_BETWEEN": "È compreso tra", - "CONTAINS": "Contiene", - "STARTS_WITH": "Inizia con", - "ENDS_WITH": "Finisce con", - "STARTING_DATE": "Data inizio", - "ENDING_DATE": "Data fine", - "STARTING_VALUE": "Valore iniziale", - "ENDING_VALUE": "Valore finale", - "VALUE_RANGE_CHECK": "Il valore deve essere maggiore di", - "AND": "E", - "ENABLED": "Abilitato", - "DISABLED": "Disabilitato" + "NO_AVAILABLE_INTERACTION": "Nessuna interazione disponibile", + "CUSTOMER_IP": "Indirizzo IP di origine", + "CUSTOMER_PORT": "Porta TCP di origine" } -} +} \ No newline at end of file diff --git a/public/app/toolbar/i18n/en.json b/public/app/toolbar/i18n/en.json index 5df0521..864237d 100644 --- a/public/app/toolbar/i18n/en.json +++ b/public/app/toolbar/i18n/en.json @@ -94,6 +94,9 @@ }, "BRAZILIAN": "Brazilian", "ESTONIAN": "Estonian", - "CZECH": "Czech" + "CZECH": "Czech", + "WEBRTC_MICROPHONE_NOT_AVAILABLE": "No microphone available", + "WEBRTC_SPEAKER_NOT_AVAILABLE": "No speaker available", + "WEBRTC_AUDIO_DEVICES_NOT_AVAILABLE": "No audio devices available" } } \ No newline at end of file diff --git a/public/assets/images/business/voiceRecordings.jpg b/public/assets/images/business/voiceRecordings.jpg new file mode 100644 index 0000000000000000000000000000000000000000..065f7584edda0aae460e9bb6c65ae6dfbb7b0b9c GIT binary patch literal 2993 zcmbVOc{J2rAOFpanL)N;C^DHD>zIhK#8?Lj#b88?NK*DJjim@#?9U$e7+uCv3nE6HnJ|O17 z+P;>w-)B%a6a5E*ZYPajOIO2t9%}h;W)1FyW+tUQe7U4|8O@|)9bdkX@|H-aqOs)= z_ISLSm48s&dP%ej5d^O+qra|LaNja*%Ps4y@S6m4@w2d~E8e5B3HY2Sc_5f^SRx1G>`!f|zg z!hhjGe&Xd%9E!eJ@MXVVR3bd^RYh~QTgVmSR@CaZcxc#N&!pGjR6k&sgE>6sw16gY zoeOFp0)QY~R&Xec2mY6uATWdnfFfX`NcBuH49U(RV*rg+v-g0Dh@T3+PcR9|l9kgi zHKXTO|LOq92*?RZhL2Hm-85K?N2YdWd-gVt>;RSSKl%sNHa*#q(cZqio|0+npH}lr zFjvp$&E6bJx|gJWYl-3RB9*CzvU~qKnW<>sF0=eI5i}L9{l}3r+o+y=0Rx8ICc8$J z8PAC88=bdotj)MK{?7zsw4l2g?W;fI)_S<%X^z8GD$S4fJf~#(?m43TR7eD3yPn(^@Hq8kiBK;YzQwU`tkztgD_|?efXS zocLk^@3}~%|IvH5=4b<(Ue#^h4eHgMs>`a{sw`l5Cn+Z@4r!k43~Iy2v0Y)pMD&>+V++R<=oBMwg!#wi8s zpkzJiSEL2~P$bPURBcDJe^m##R;bJ6N>`V7F%9`yY^r8Dr%`fPG%?>-`I%jZc?9BX zbXEOC4abEa^Z1CJ?Sj109Fxeg^YijS1>$_2=7jL(zPYRdU4B1&M5o0_21B+Qzp?FO zg}2X+D9M_&*#Sz*8onfqS5_|)969$Dc2&E2$Jbb`4C#MyA^vzH0g{?UoZ}43X}X!D zTsWxC5{?uiOpSByFgQT`eWQpe`P$^pKC~ zj=hL?{p^=8AAd7d&tvi%N<$Y!GWPV*W#Yfbgq`TneAyPw!3)8)ktAxOBKl;|zG2Rx zocZ?icqV12>6}d+>%vVsEcaUnb+IR?fy+ux4rwIG*Eg2 zWr4tQixiB1?w>IG$E$PSqWomWtobs8`HrqUsHkG{Rf-iMqW}e6zQVV#GqZ*Ffplq8X&^oSH-4 z<_oRj$5M(#A~Q+~$M^6rgb%ofTa38a-@jDjXG=5JZn2b0X5 z6qMnV=y~IHy-qKx>NT>@0mA*ucJ#v8_m+k8_}JNHJncKPa)KP_$69P3yj3>K1oNP^i#$-5>ejZ8abw74%*kc{~D z-Umx8*No5_!hC{Y9gOPI$SM@^g{8d-Yt1pM6)2=La)$SH=rtTujs< z#^#v6yQf^dbBujtnH*YH*L4ZENON32&~DIM_Cfy7;wNt%*W|S%q4p?c_ok3XHrA1a z;uVxQ+2m2pvCccj)Q~)!KCd%#hI}P7Z)ioaO}E!CGHX(LR;#INSt#_k_ox57to!O5 zA<8swrY_eI(;MoNZvE=9b!0$Q9ae|+V9fXhu=?@%#3BFkPg<hDH~oXo!nJA7AxC484D4;w0E|j4U@?K0WwY?upHq3%|H8!=t-PLw8=LB5hU}pV zM!*fe@~hR&`b1b-aN>bv8C&A~w=Scs-lqat>-ztlTDS_fw(xbyD`$3J*nQE`o*1V% zr*;Y1Z0$?`7!Zh?6%DfQ@5|K@FH@b_Sa9gHx}DZ7B+8ceoxD(fK6J)9FfFQ!InbA@ z)u6kgQ1f_VWM8J7yv^ZAS=?cfnr{X)IE7QZUlT=DEic6kq+*$WuNwU#7P)en;-oIIm~N!)n&oPB2xY-;_{z+L#g{*CaaL7)Z}l9mxZXdnXDUz-B6e;@yi+ zh6qK($=lH?kaGl9%46RFRgI!8FHcFko)owH%N;C8@w&fZzwQ~ z%WeB;J{2iD^qPKBP{XSM((na zhN>h^*Jh$XXZ<|9(7nYol@#aI^rl=e?-KzgHGI=T-!RWD*(WR~ym(A7u`$j0`Brdw znSlFd5n=G<_vu@dYY!)*QC7l1%SnnToT-H;!lGDdNGU`m*3%_s&wGKnM%We!O&1h! zZCn_e@~&2yrKAhN6r?}rkFY#8OHWN7CG=$Zd$Qn9>RaZ5uy>2`-na;fb#-9<#PL96C$J?W&_i;lzD62?4} qDN*f)C)Id)lr?|Y?g3Vu#NiIO?u^XYw$o3R`Gg8VFVc*5-u(+N?GU*D literal 0 HcmV?d00001 diff --git a/public/assets/plugins/jabra/jabra.browser.integration-2.0.js b/public/assets/plugins/jabra/jabra.browser.integration-2.0.js index de1c77d..45454c7 100644 --- a/public/assets/plugins/jabra/jabra.browser.integration-2.0.js +++ b/public/assets/plugins/jabra/jabra.browser.integration-2.0.js @@ -25,1432 +25,1176 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - /** * The global jabra object is your entry for the jabra browser SDK. */ - -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } - -function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - -function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } - -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } - -function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } - -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } - -function _instanceof(left, right) { if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) { return !!right[Symbol.hasInstance](left); } else { return left instanceof right; } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -function _classCallCheck(instance, Constructor) { if (!_instanceof(instance, Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } - -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } - -function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); } - -function isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } - -function _construct(Parent, args, Class) { if (isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); } - -function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; } - -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } - -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } - var jabra; - (function (jabra) { - /** - * Version of this javascript api (should match version number in file apart from possible alfa/beta designator). - */ - jabra.apiVersion = "2.0.1"; - /** - * Is the current version a beta ? - */ - - var isBeta = jabra.apiVersion.includes("beta"); - /** - * Id of proper (production) release of browser plugin. - */ - - var prodExtensionId = "okpeabepajdgiepelmhkfhkjlhhmofma"; - /** - * Id of beta release of browser plugin. - */ - - var betaExtensionId = "igcbbdnhomedfadljgcmcfpdcoonihfe"; - ; - ; - ; - /** - * Names of command response events. - */ - - var commandEventsList = ["devices", "activedevice", "getinstallinfo", "Version", "setmmifocus", "setactivedevice2", "setbusylight", "setremotemmilightaction"]; - /** - * All possible device events as internal array. - */ - - var eventNamesList = ["mute", "unmute", "device attached", "device detached", "acceptcall", "endcall", "reject", "flash", "online", "offline", "linebusy", "lineidle", "redial", "key0", "key1", "key2", "key3", "key4", "key5", "key6", "key7", "key8", "key9", "keyStar", "keyPound", "keyClear", "Online", "speedDial", "voiceMail", "LineBusy", "outOfRange", "intoRange", "pseudoAcceptcall", "pseudoEndcall", "button1", "button2", "button3", "volumeUp", "volumeDown", "fireAlarm", "jackConnection", "jackDisConnection", "qdConnection", "qdDisconnection", "headsetConnection", "headsetDisConnection", "devlog", "busylight", "hearThrough", "batteryStatus", "gnpButton", "mmi", "error"]; - /** - * Error status codes returned by SDK. Same as Jabra_ErrorStatus in native SDK. - */ - - var ErrorCodes; - - (function (ErrorCodes) { - ErrorCodes[ErrorCodes["NoError"] = 0] = "NoError"; - ErrorCodes[ErrorCodes["SSLError"] = 1] = "SSLError"; - ErrorCodes[ErrorCodes["CertError"] = 2] = "CertError"; - ErrorCodes[ErrorCodes["NetworkError"] = 3] = "NetworkError"; - ErrorCodes[ErrorCodes["DownloadError"] = 4] = "DownloadError"; - ErrorCodes[ErrorCodes["ParseError"] = 5] = "ParseError"; - ErrorCodes[ErrorCodes["OtherError"] = 6] = "OtherError"; - ErrorCodes[ErrorCodes["DeviceInfoError"] = 7] = "DeviceInfoError"; - ErrorCodes[ErrorCodes["FileNotAccessible"] = 8] = "FileNotAccessible"; - ErrorCodes[ErrorCodes["FileNotCompatible"] = 9] = "FileNotCompatible"; - ErrorCodes[ErrorCodes["Device_NotFound"] = 10] = "Device_NotFound"; - ErrorCodes[ErrorCodes["Parameter_fail"] = 11] = "Parameter_fail"; - ErrorCodes[ErrorCodes["Authorization_failed"] = 12] = "Authorization_failed"; - ErrorCodes[ErrorCodes["FileNotAvailable"] = 13] = "FileNotAvailable"; - ErrorCodes[ErrorCodes["ConfigParseError"] = 14] = "ConfigParseError"; - ErrorCodes[ErrorCodes["SetSettings_Fail"] = 15] = "SetSettings_Fail"; - ErrorCodes[ErrorCodes["Device_Reboot"] = 16] = "Device_Reboot"; - ErrorCodes[ErrorCodes["Device_ReadFail"] = 17] = "Device_ReadFail"; - ErrorCodes[ErrorCodes["Device_NotReady"] = 18] = "Device_NotReady"; - ErrorCodes[ErrorCodes["FilePartiallyCompatible"] = 19] = "FilePartiallyCompatible"; - })(ErrorCodes = jabra.ErrorCodes || (jabra.ErrorCodes = {})); - - ; - /** - * Error return codes. Same as Jabra_ReturnCode in native SDK. - */ - - var ErrorReturnCodes; - - (function (ErrorReturnCodes) { - ErrorReturnCodes[ErrorReturnCodes["Return_Ok"] = 0] = "Return_Ok"; - ErrorReturnCodes[ErrorReturnCodes["Device_Unknown"] = 1] = "Device_Unknown"; - ErrorReturnCodes[ErrorReturnCodes["Device_Invalid"] = 2] = "Device_Invalid"; - ErrorReturnCodes[ErrorReturnCodes["Not_Supported"] = 3] = "Not_Supported"; - ErrorReturnCodes[ErrorReturnCodes["Return_ParameterFail"] = 4] = "Return_ParameterFail"; - ErrorReturnCodes[ErrorReturnCodes["ProtectedSetting_Write"] = 5] = "ProtectedSetting_Write"; - ErrorReturnCodes[ErrorReturnCodes["No_Information"] = 6] = "No_Information"; - ErrorReturnCodes[ErrorReturnCodes["NetworkRequest_Fail"] = 7] = "NetworkRequest_Fail"; - ErrorReturnCodes[ErrorReturnCodes["Device_WriteFail"] = 8] = "Device_WriteFail"; - ErrorReturnCodes[ErrorReturnCodes["Device_ReadFails"] = 9] = "Device_ReadFails"; - ErrorReturnCodes[ErrorReturnCodes["No_FactorySupported"] = 10] = "No_FactorySupported"; - ErrorReturnCodes[ErrorReturnCodes["System_Error"] = 11] = "System_Error"; - ErrorReturnCodes[ErrorReturnCodes["Device_BadState"] = 12] = "Device_BadState"; - ErrorReturnCodes[ErrorReturnCodes["FileWrite_Fail"] = 13] = "FileWrite_Fail"; - ErrorReturnCodes[ErrorReturnCodes["File_AlreadyExists"] = 14] = "File_AlreadyExists"; - ErrorReturnCodes[ErrorReturnCodes["File_Not_Accessible"] = 15] = "File_Not_Accessible"; - ErrorReturnCodes[ErrorReturnCodes["Firmware_UpToDate"] = 16] = "Firmware_UpToDate"; - ErrorReturnCodes[ErrorReturnCodes["Firmware_Available"] = 17] = "Firmware_Available"; - ErrorReturnCodes[ErrorReturnCodes["Return_Async"] = 18] = "Return_Async"; - ErrorReturnCodes[ErrorReturnCodes["Invalid_Authorization"] = 19] = "Invalid_Authorization"; - ErrorReturnCodes[ErrorReturnCodes["FWU_Application_Not_Available"] = 20] = "FWU_Application_Not_Available"; - ErrorReturnCodes[ErrorReturnCodes["Device_AlreadyConnected"] = 21] = "Device_AlreadyConnected"; - ErrorReturnCodes[ErrorReturnCodes["Device_NotConnected"] = 22] = "Device_NotConnected"; - ErrorReturnCodes[ErrorReturnCodes["CannotClear_DeviceConnected"] = 23] = "CannotClear_DeviceConnected"; - ErrorReturnCodes[ErrorReturnCodes["Device_Rebooted"] = 24] = "Device_Rebooted"; - ErrorReturnCodes[ErrorReturnCodes["Upload_AlreadyInProgress"] = 25] = "Upload_AlreadyInProgress"; - ErrorReturnCodes[ErrorReturnCodes["Download_AlreadyInProgress"] = 26] = "Download_AlreadyInProgress"; - })(ErrorReturnCodes = jabra.ErrorReturnCodes || (jabra.ErrorReturnCodes = {})); - - ; - /** - * Custom error returned by commands expecting results when failing. - */ - - var CommandError = - /*#__PURE__*/ - function (_Error) { - _inherits(CommandError, _Error); - - function CommandError(command, errmessage, data) { - var _this; - - _classCallCheck(this, CommandError); - - _this = _possibleConstructorReturn(this, _getPrototypeOf(CommandError).call(this, "Command " + command + " failed with error message " + errmessage + " and details: " + JSON.stringify(data || {}))); - _this.command = command; - _this.errmessage = errmessage; - _this.data = data; - _this.name = 'CommandError'; - return _this; - } - - return CommandError; - }(_wrapNativeSuper(Error)); - - jabra.CommandError = CommandError; - ; - ; - /** - * Internal mapping from all known events to array of registered callbacks. All possible events are setup - * initially. Callbacks values are configured at runtime. - */ - - var eventListeners = new Map(); - eventNamesList.forEach(function (event) { - return eventListeners.set(event, []); - }); - /** - * Device feature codes. - */ - - var DeviceFeature; - - (function (DeviceFeature) { - DeviceFeature[DeviceFeature["BusyLight"] = 1000] = "BusyLight"; - DeviceFeature[DeviceFeature["FactoryReset"] = 1001] = "FactoryReset"; - DeviceFeature[DeviceFeature["PairingList"] = 1002] = "PairingList"; - DeviceFeature[DeviceFeature["RemoteMMI"] = 1003] = "RemoteMMI"; - DeviceFeature[DeviceFeature["MusicEqualizer"] = 1004] = "MusicEqualizer"; - DeviceFeature[DeviceFeature["EarbudInterconnectionStatus"] = 1005] = "EarbudInterconnectionStatus"; - DeviceFeature[DeviceFeature["StepRate"] = 1006] = "StepRate"; - DeviceFeature[DeviceFeature["HeartRate"] = 1007] = "HeartRate"; - DeviceFeature[DeviceFeature["RRInterval"] = 1008] = "RRInterval"; - DeviceFeature[DeviceFeature["RingtoneUpload"] = 1009] = "RingtoneUpload"; - DeviceFeature[DeviceFeature["ImageUpload"] = 1010] = "ImageUpload"; - DeviceFeature[DeviceFeature["NeedsExplicitRebootAfterOta"] = 1011] = "NeedsExplicitRebootAfterOta"; - DeviceFeature[DeviceFeature["NeedsToBePutIncCradleToCompleteFwu"] = 1012] = "NeedsToBePutIncCradleToCompleteFwu"; - DeviceFeature[DeviceFeature["RemoteMMIv2"] = 1013] = "RemoteMMIv2"; - DeviceFeature[DeviceFeature["Logging"] = 1014] = "Logging"; - DeviceFeature[DeviceFeature["PreferredSoftphoneListInDevice"] = 1015] = "PreferredSoftphoneListInDevice"; - DeviceFeature[DeviceFeature["VoiceAssistant"] = 1016] = "VoiceAssistant"; - DeviceFeature[DeviceFeature["PlayRingtone"] = 1017] = "PlayRingtone"; - })(DeviceFeature = jabra.DeviceFeature || (jabra.DeviceFeature = {})); - - ; - /** - * A specification of a button for MMI capturing. - */ - - var RemoteMmiType; - - (function (RemoteMmiType) { - RemoteMmiType[RemoteMmiType["MMI_TYPE_MFB"] = 0] = "MMI_TYPE_MFB"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_VOLUP"] = 1] = "MMI_TYPE_VOLUP"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_VOLDOWN"] = 2] = "MMI_TYPE_VOLDOWN"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_VCB"] = 3] = "MMI_TYPE_VCB"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_APP"] = 4] = "MMI_TYPE_APP"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_TR_FORW"] = 5] = "MMI_TYPE_TR_FORW"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_TR_BACK"] = 6] = "MMI_TYPE_TR_BACK"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_PLAY"] = 7] = "MMI_TYPE_PLAY"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_MUTE"] = 8] = "MMI_TYPE_MUTE"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_HOOK_OFF"] = 9] = "MMI_TYPE_HOOK_OFF"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_HOOK_ON"] = 10] = "MMI_TYPE_HOOK_ON"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_BLUETOOTH"] = 11] = "MMI_TYPE_BLUETOOTH"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_JABRA"] = 12] = "MMI_TYPE_JABRA"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_BATTERY"] = 13] = "MMI_TYPE_BATTERY"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_PROG"] = 14] = "MMI_TYPE_PROG"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_LINK"] = 15] = "MMI_TYPE_LINK"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_ANC"] = 16] = "MMI_TYPE_ANC"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_LISTEN_IN"] = 17] = "MMI_TYPE_LISTEN_IN"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_DOT3"] = 18] = "MMI_TYPE_DOT3"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_DOT4"] = 19] = "MMI_TYPE_DOT4"; - RemoteMmiType[RemoteMmiType["MMI_TYPE_ALL"] = 255] = "MMI_TYPE_ALL"; - })(RemoteMmiType = jabra.RemoteMmiType || (jabra.RemoteMmiType = {})); - - ; - /** - * A MMI effect specification for light on, off or blinking in different tempo. - */ - - var RemoteMmiSequence; - - (function (RemoteMmiSequence) { - RemoteMmiSequence[RemoteMmiSequence["MMI_LED_SEQUENCE_OFF"] = 0] = "MMI_LED_SEQUENCE_OFF"; - RemoteMmiSequence[RemoteMmiSequence["MMI_LED_SEQUENCE_ON"] = 1] = "MMI_LED_SEQUENCE_ON"; - RemoteMmiSequence[RemoteMmiSequence["MMI_LED_SEQUENCE_SLOW"] = 2] = "MMI_LED_SEQUENCE_SLOW"; - RemoteMmiSequence[RemoteMmiSequence["MMI_LED_SEQUENCE_FAST"] = 3] = "MMI_LED_SEQUENCE_FAST"; - })(RemoteMmiSequence = jabra.RemoteMmiSequence || (jabra.RemoteMmiSequence = {})); - - ; - /** - * MMI button actions reported when button has focus. - */ - - var RemoteMmiActionInput; - - (function (RemoteMmiActionInput) { - RemoteMmiActionInput[RemoteMmiActionInput["MMI_ACTION_UP"] = 1] = "MMI_ACTION_UP"; - RemoteMmiActionInput[RemoteMmiActionInput["MMI_ACTION_DOWN"] = 2] = "MMI_ACTION_DOWN"; - RemoteMmiActionInput[RemoteMmiActionInput["MMI_ACTION_TAP"] = 4] = "MMI_ACTION_TAP"; - RemoteMmiActionInput[RemoteMmiActionInput["MMI_ACTION_DOUBLE_TAP"] = 8] = "MMI_ACTION_DOUBLE_TAP"; - RemoteMmiActionInput[RemoteMmiActionInput["MMI_ACTION_PRESS"] = 16] = "MMI_ACTION_PRESS"; - RemoteMmiActionInput[RemoteMmiActionInput["MMI_ACTION_LONG_PRESS"] = 32] = "MMI_ACTION_LONG_PRESS"; - RemoteMmiActionInput[RemoteMmiActionInput["MMI_ACTION_X_LONG_PRESS"] = 64] = "MMI_ACTION_X_LONG_PRESS"; - })(RemoteMmiActionInput = jabra.RemoteMmiActionInput || (jabra.RemoteMmiActionInput = {})); - - ; - /** - * The log level currently used internally in this api facade. Initially this is set to show errors and - * warnings until a logEvent (>=0.5) changes this when initializing the extension or when the user - * changes the log level. Available in the API for testing only - do not use this in normal applications. - */ - - jabra.logLevel = 2; - /** - * An internal logger helper. - */ - - var logger = new ( - /*#__PURE__*/ - function () { - function _class() { - _classCallCheck(this, _class); + /** + * Version of this javascript api (should match version number in file apart from possible alfa/beta designator). + */ + jabra.apiVersion = "2.0.1"; + /** + * Is the current version a beta ? + */ + const isBeta = jabra.apiVersion.includes("beta"); + /** + * Id of proper (production) release of browser plugin. + */ + const prodExtensionId = "okpeabepajdgiepelmhkfhkjlhhmofma"; + /** + * Id of beta release of browser plugin. + */ + const betaExtensionId = "igcbbdnhomedfadljgcmcfpdcoonihfe"; + ; + ; + ; + /** + * Names of command response events. + */ + const commandEventsList = [ + "devices", + "activedevice", + "getinstallinfo", + "Version", + "setmmifocus", + "setactivedevice2", + "setbusylight", + "setremotemmilightaction" + ]; + /** + * All possible device events as internal array. + */ + let eventNamesList = ["mute", "unmute", "device attached", "device detached", "acceptcall", + "endcall", "reject", "flash", "online", "offline", "linebusy", "lineidle", + "redial", "key0", "key1", "key2", "key3", "key4", "key5", + "key6", "key7", "key8", "key9", "keyStar", "keyPound", + "keyClear", "Online", "speedDial", "voiceMail", "LineBusy", + "outOfRange", "intoRange", "pseudoAcceptcall", "pseudoEndcall", + "button1", "button2", "button3", "volumeUp", "volumeDown", "fireAlarm", + "jackConnection", "jackDisConnection", "qdConnection", "qdDisconnection", + "headsetConnection", "headsetDisConnection", "devlog", "busylight", + "hearThrough", "batteryStatus", "gnpButton", "mmi", "error"]; + /** + * Error status codes returned by SDK. Same as Jabra_ErrorStatus in native SDK. + */ + let ErrorCodes; + (function (ErrorCodes) { + ErrorCodes[ErrorCodes["NoError"] = 0] = "NoError"; + ErrorCodes[ErrorCodes["SSLError"] = 1] = "SSLError"; + ErrorCodes[ErrorCodes["CertError"] = 2] = "CertError"; + ErrorCodes[ErrorCodes["NetworkError"] = 3] = "NetworkError"; + ErrorCodes[ErrorCodes["DownloadError"] = 4] = "DownloadError"; + ErrorCodes[ErrorCodes["ParseError"] = 5] = "ParseError"; + ErrorCodes[ErrorCodes["OtherError"] = 6] = "OtherError"; + ErrorCodes[ErrorCodes["DeviceInfoError"] = 7] = "DeviceInfoError"; + ErrorCodes[ErrorCodes["FileNotAccessible"] = 8] = "FileNotAccessible"; + ErrorCodes[ErrorCodes["FileNotCompatible"] = 9] = "FileNotCompatible"; + ErrorCodes[ErrorCodes["Device_NotFound"] = 10] = "Device_NotFound"; + ErrorCodes[ErrorCodes["Parameter_fail"] = 11] = "Parameter_fail"; + ErrorCodes[ErrorCodes["Authorization_failed"] = 12] = "Authorization_failed"; + ErrorCodes[ErrorCodes["FileNotAvailable"] = 13] = "FileNotAvailable"; + ErrorCodes[ErrorCodes["ConfigParseError"] = 14] = "ConfigParseError"; + ErrorCodes[ErrorCodes["SetSettings_Fail"] = 15] = "SetSettings_Fail"; + ErrorCodes[ErrorCodes["Device_Reboot"] = 16] = "Device_Reboot"; + ErrorCodes[ErrorCodes["Device_ReadFail"] = 17] = "Device_ReadFail"; + ErrorCodes[ErrorCodes["Device_NotReady"] = 18] = "Device_NotReady"; + ErrorCodes[ErrorCodes["FilePartiallyCompatible"] = 19] = "FilePartiallyCompatible"; + })(ErrorCodes = jabra.ErrorCodes || (jabra.ErrorCodes = {})); + ; + /** + * Error return codes. Same as Jabra_ReturnCode in native SDK. + */ + let ErrorReturnCodes; + (function (ErrorReturnCodes) { + ErrorReturnCodes[ErrorReturnCodes["Return_Ok"] = 0] = "Return_Ok"; + ErrorReturnCodes[ErrorReturnCodes["Device_Unknown"] = 1] = "Device_Unknown"; + ErrorReturnCodes[ErrorReturnCodes["Device_Invalid"] = 2] = "Device_Invalid"; + ErrorReturnCodes[ErrorReturnCodes["Not_Supported"] = 3] = "Not_Supported"; + ErrorReturnCodes[ErrorReturnCodes["Return_ParameterFail"] = 4] = "Return_ParameterFail"; + ErrorReturnCodes[ErrorReturnCodes["ProtectedSetting_Write"] = 5] = "ProtectedSetting_Write"; + ErrorReturnCodes[ErrorReturnCodes["No_Information"] = 6] = "No_Information"; + ErrorReturnCodes[ErrorReturnCodes["NetworkRequest_Fail"] = 7] = "NetworkRequest_Fail"; + ErrorReturnCodes[ErrorReturnCodes["Device_WriteFail"] = 8] = "Device_WriteFail"; + ErrorReturnCodes[ErrorReturnCodes["Device_ReadFails"] = 9] = "Device_ReadFails"; + ErrorReturnCodes[ErrorReturnCodes["No_FactorySupported"] = 10] = "No_FactorySupported"; + ErrorReturnCodes[ErrorReturnCodes["System_Error"] = 11] = "System_Error"; + ErrorReturnCodes[ErrorReturnCodes["Device_BadState"] = 12] = "Device_BadState"; + ErrorReturnCodes[ErrorReturnCodes["FileWrite_Fail"] = 13] = "FileWrite_Fail"; + ErrorReturnCodes[ErrorReturnCodes["File_AlreadyExists"] = 14] = "File_AlreadyExists"; + ErrorReturnCodes[ErrorReturnCodes["File_Not_Accessible"] = 15] = "File_Not_Accessible"; + ErrorReturnCodes[ErrorReturnCodes["Firmware_UpToDate"] = 16] = "Firmware_UpToDate"; + ErrorReturnCodes[ErrorReturnCodes["Firmware_Available"] = 17] = "Firmware_Available"; + ErrorReturnCodes[ErrorReturnCodes["Return_Async"] = 18] = "Return_Async"; + ErrorReturnCodes[ErrorReturnCodes["Invalid_Authorization"] = 19] = "Invalid_Authorization"; + ErrorReturnCodes[ErrorReturnCodes["FWU_Application_Not_Available"] = 20] = "FWU_Application_Not_Available"; + ErrorReturnCodes[ErrorReturnCodes["Device_AlreadyConnected"] = 21] = "Device_AlreadyConnected"; + ErrorReturnCodes[ErrorReturnCodes["Device_NotConnected"] = 22] = "Device_NotConnected"; + ErrorReturnCodes[ErrorReturnCodes["CannotClear_DeviceConnected"] = 23] = "CannotClear_DeviceConnected"; + ErrorReturnCodes[ErrorReturnCodes["Device_Rebooted"] = 24] = "Device_Rebooted"; + ErrorReturnCodes[ErrorReturnCodes["Upload_AlreadyInProgress"] = 25] = "Upload_AlreadyInProgress"; + ErrorReturnCodes[ErrorReturnCodes["Download_AlreadyInProgress"] = 26] = "Download_AlreadyInProgress"; + })(ErrorReturnCodes = jabra.ErrorReturnCodes || (jabra.ErrorReturnCodes = {})); + ; + /** + * Custom error returned by commands expecting results when failing. + */ + class CommandError extends Error { + constructor(command, errmessage, data) { + super("Command " + command + " failed with error message " + errmessage + " and details: " + JSON.stringify(data || {})); + this.command = command; + this.errmessage = errmessage; + this.data = data; + this.name = 'CommandError'; + } } - - _createClass(_class, [{ - key: "trace", - value: function trace(msg) { - if (jabra.logLevel >= 4) { - console.log(msg); + jabra.CommandError = CommandError; + ; + ; + /** + * Internal mapping from all known events to array of registered callbacks. All possible events are setup + * initially. Callbacks values are configured at runtime. + */ + const eventListeners = new Map(); + eventNamesList.forEach((event) => eventListeners.set(event, [])); + /** + * Device feature codes. + */ + let DeviceFeature; + (function (DeviceFeature) { + DeviceFeature[DeviceFeature["BusyLight"] = 1000] = "BusyLight"; + DeviceFeature[DeviceFeature["FactoryReset"] = 1001] = "FactoryReset"; + DeviceFeature[DeviceFeature["PairingList"] = 1002] = "PairingList"; + DeviceFeature[DeviceFeature["RemoteMMI"] = 1003] = "RemoteMMI"; + DeviceFeature[DeviceFeature["MusicEqualizer"] = 1004] = "MusicEqualizer"; + DeviceFeature[DeviceFeature["EarbudInterconnectionStatus"] = 1005] = "EarbudInterconnectionStatus"; + DeviceFeature[DeviceFeature["StepRate"] = 1006] = "StepRate"; + DeviceFeature[DeviceFeature["HeartRate"] = 1007] = "HeartRate"; + DeviceFeature[DeviceFeature["RRInterval"] = 1008] = "RRInterval"; + DeviceFeature[DeviceFeature["RingtoneUpload"] = 1009] = "RingtoneUpload"; + DeviceFeature[DeviceFeature["ImageUpload"] = 1010] = "ImageUpload"; + DeviceFeature[DeviceFeature["NeedsExplicitRebootAfterOta"] = 1011] = "NeedsExplicitRebootAfterOta"; + DeviceFeature[DeviceFeature["NeedsToBePutIncCradleToCompleteFwu"] = 1012] = "NeedsToBePutIncCradleToCompleteFwu"; + DeviceFeature[DeviceFeature["RemoteMMIv2"] = 1013] = "RemoteMMIv2"; + DeviceFeature[DeviceFeature["Logging"] = 1014] = "Logging"; + DeviceFeature[DeviceFeature["PreferredSoftphoneListInDevice"] = 1015] = "PreferredSoftphoneListInDevice"; + DeviceFeature[DeviceFeature["VoiceAssistant"] = 1016] = "VoiceAssistant"; + DeviceFeature[DeviceFeature["PlayRingtone"] = 1017] = "PlayRingtone"; + })(DeviceFeature = jabra.DeviceFeature || (jabra.DeviceFeature = {})); + ; + /** + * A specification of a button for MMI capturing. + */ + let RemoteMmiType; + (function (RemoteMmiType) { + RemoteMmiType[RemoteMmiType["MMI_TYPE_MFB"] = 0] = "MMI_TYPE_MFB"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_VOLUP"] = 1] = "MMI_TYPE_VOLUP"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_VOLDOWN"] = 2] = "MMI_TYPE_VOLDOWN"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_VCB"] = 3] = "MMI_TYPE_VCB"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_APP"] = 4] = "MMI_TYPE_APP"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_TR_FORW"] = 5] = "MMI_TYPE_TR_FORW"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_TR_BACK"] = 6] = "MMI_TYPE_TR_BACK"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_PLAY"] = 7] = "MMI_TYPE_PLAY"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_MUTE"] = 8] = "MMI_TYPE_MUTE"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_HOOK_OFF"] = 9] = "MMI_TYPE_HOOK_OFF"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_HOOK_ON"] = 10] = "MMI_TYPE_HOOK_ON"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_BLUETOOTH"] = 11] = "MMI_TYPE_BLUETOOTH"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_JABRA"] = 12] = "MMI_TYPE_JABRA"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_BATTERY"] = 13] = "MMI_TYPE_BATTERY"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_PROG"] = 14] = "MMI_TYPE_PROG"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_LINK"] = 15] = "MMI_TYPE_LINK"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_ANC"] = 16] = "MMI_TYPE_ANC"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_LISTEN_IN"] = 17] = "MMI_TYPE_LISTEN_IN"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_DOT3"] = 18] = "MMI_TYPE_DOT3"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_DOT4"] = 19] = "MMI_TYPE_DOT4"; + RemoteMmiType[RemoteMmiType["MMI_TYPE_ALL"] = 255] = "MMI_TYPE_ALL"; + })(RemoteMmiType = jabra.RemoteMmiType || (jabra.RemoteMmiType = {})); + ; + /** + * A MMI effect specification for light on, off or blinking in different tempo. + */ + let RemoteMmiSequence; + (function (RemoteMmiSequence) { + RemoteMmiSequence[RemoteMmiSequence["MMI_LED_SEQUENCE_OFF"] = 0] = "MMI_LED_SEQUENCE_OFF"; + RemoteMmiSequence[RemoteMmiSequence["MMI_LED_SEQUENCE_ON"] = 1] = "MMI_LED_SEQUENCE_ON"; + RemoteMmiSequence[RemoteMmiSequence["MMI_LED_SEQUENCE_SLOW"] = 2] = "MMI_LED_SEQUENCE_SLOW"; + RemoteMmiSequence[RemoteMmiSequence["MMI_LED_SEQUENCE_FAST"] = 3] = "MMI_LED_SEQUENCE_FAST"; + })(RemoteMmiSequence = jabra.RemoteMmiSequence || (jabra.RemoteMmiSequence = {})); + ; + /** + * MMI button actions reported when button has focus. + */ + let RemoteMmiActionInput; + (function (RemoteMmiActionInput) { + RemoteMmiActionInput[RemoteMmiActionInput["MMI_ACTION_UP"] = 1] = "MMI_ACTION_UP"; + RemoteMmiActionInput[RemoteMmiActionInput["MMI_ACTION_DOWN"] = 2] = "MMI_ACTION_DOWN"; + RemoteMmiActionInput[RemoteMmiActionInput["MMI_ACTION_TAP"] = 4] = "MMI_ACTION_TAP"; + RemoteMmiActionInput[RemoteMmiActionInput["MMI_ACTION_DOUBLE_TAP"] = 8] = "MMI_ACTION_DOUBLE_TAP"; + RemoteMmiActionInput[RemoteMmiActionInput["MMI_ACTION_PRESS"] = 16] = "MMI_ACTION_PRESS"; + RemoteMmiActionInput[RemoteMmiActionInput["MMI_ACTION_LONG_PRESS"] = 32] = "MMI_ACTION_LONG_PRESS"; + RemoteMmiActionInput[RemoteMmiActionInput["MMI_ACTION_X_LONG_PRESS"] = 64] = "MMI_ACTION_X_LONG_PRESS"; + })(RemoteMmiActionInput = jabra.RemoteMmiActionInput || (jabra.RemoteMmiActionInput = {})); + ; + /** + * The log level currently used internally in this api facade. Initially this is set to show errors and + * warnings until a logEvent (>=0.5) changes this when initializing the extension or when the user + * changes the log level. Available in the API for testing only - do not use this in normal applications. + */ + jabra.logLevel = 2; + /** + * An internal logger helper. + */ + const logger = new class { + trace(msg) { + if (jabra.logLevel >= 4) { + console.log(msg); + } } - } - }, { - key: "info", - value: function info(msg) { - if (jabra.logLevel >= 3) { - console.log(msg); + ; + info(msg) { + if (jabra.logLevel >= 3) { + console.log(msg); + } } - } - }, { - key: "warn", - value: function warn(msg) { - if (jabra.logLevel >= 2) { - console.warn(msg); + ; + warn(msg) { + if (jabra.logLevel >= 2) { + console.warn(msg); + } } - } - }, { - key: "error", - value: function error(msg) { - if (jabra.logLevel >= 1) { - console.error(msg); + ; + error(msg) { + if (jabra.logLevel >= 1) { + console.error(msg); + } } - } - }]); - - return _class; - }())(); - /** - * A reasonably unique ID for our browser extension client that makes it possible to - * differentiate between different instances of this api in different browser tabs. - */ - - var apiClientId = Math.random().toString(36).substr(2, 9); - /** - * A mapping from unique request ids for commands and the promise information needed - * to resolve/reject them by an incomming event. - */ - - var sendRequestResultMap = new Map(); - /** - * A counter used to generate unique request ID's used to match commands and returning events. - */ - - var requestNumber = 1; - /** - * Contains initialization information used by the init/shutdown methods. - */ - - var initState = {}; - /** - * The JavaScript library must be initialized using this function. It returns a promise that - * resolves when initialization is complete. - */ - - function init() { - return new Promise(function (resolve, reject) { - // Only Chrome is currently supported - var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor); - - if (!isChrome) { - return reject(new Error("Jabra Browser Integration: Only supported by Google Chrome.")); - } - - if (initState.initialized || initState.initializing) { - return reject(new Error("Jabra Browser Integration already initialized")); - } - - initState.initializing = true; - sendRequestResultMap.clear(); - var duringInit = true; - - initState.eventCallback = function (event) { - if (event.source === window && event.data.direction && event.data.direction === "jabra-headset-extension-from-content-script") { - var eventApiClientId = event.data.apiClientId || ""; - var requestId = event.data.requestId || ""; // Only accept responses from our own requests or from device. - - if (apiClientId === eventApiClientId || eventApiClientId === "") { - logger.trace("Receiving event from content script: " + JSON.stringify(event.data)); // For backwards compatibility a blank message might be send as "na". - - if (event.data.message === "na") { - delete event.data.message; - } // For backward compatability reinterprent messages starting with error as errors: - - - if (event.data.message && event.data.message.startsWith("Error:")) { - event.data.error = event.data.message; - delete event.data.message; + ; + }; + /** + * A reasonably unique ID for our browser extension client that makes it possible to + * differentiate between different instances of this api in different browser tabs. + */ + const apiClientId = Math.random().toString(36).substr(2, 9); + /** + * A mapping from unique request ids for commands and the promise information needed + * to resolve/reject them by an incomming event. + */ + const sendRequestResultMap = new Map(); + /** + * A counter used to generate unique request ID's used to match commands and returning events. + */ + let requestNumber = 1; + /** + * Contains initialization information used by the init/shutdown methods. + */ + let initState = {}; + /** + * The JavaScript library must be initialized using this function. It returns a promise that + * resolves when initialization is complete. + */ + function init() { + return new Promise((resolve, reject) => { + // Only Chrome is currently supported + let isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor); + if (!isChrome) { + return reject(new Error("Jabra Browser Integration: Only supported by Google Chrome.")); } - - if (event.data.message) { - logger.trace("Got message: " + JSON.stringify(event.data)); - var normalizedMsg = event.data.message.substring(7); // Strip "Event" prefix; - - if (normalizedMsg.startsWith("logLevel")) { - jabra.logLevel = parseInt(event.data.message.substring(16)); - logger.trace("Logger set to level " + jabra.logLevel); // Loglevels are internal events and not an indication of proper - // initialization so skip rest of handling for log levels. - - return; - } - - var commandIndex = commandEventsList.findIndex(function (e) { - return normalizedMsg.startsWith(e); - }); - - if (commandIndex >= 0) { - // For install info and version command, we need to add api version number. - if (normalizedMsg === "getinstallinfo" || normalizedMsg.startsWith("Version ")) { - // Old extension/host won't have data so make sure it exists to avoid breakage. - if (!event.data.data) { - event.data.data = {}; - } - - event.data.data.version_jsapi = jabra.apiVersion; - } // For install info also check if the full installation is consistent. - - - if (normalizedMsg === "getinstallinfo") { - event.data.data.installationOk = isInstallationOk(event.data.data); - } // Lookup and check that we have identified a (real) command target to pair result with. - - - var resultTarget = identifyAndCleanupResultTarget(requestId); - - if (resultTarget) { - var result; - - if (event.data.data) { - result = event.data.data; - } else { - var dataPosition = commandEventsList[commandIndex].length + 1; - var dataStr = normalizedMsg.substring(dataPosition); - result = {}; - - if (dataStr) { - result.legacy_result = dataStr; + if (initState.initialized || initState.initializing) { + return reject(new Error("Jabra Browser Integration already initialized")); + } + initState.initializing = true; + sendRequestResultMap.clear(); + let duringInit = true; + initState.eventCallback = (event) => { + if (event.source === window && + event.data.direction && + event.data.direction === "jabra-headset-extension-from-content-script") { + let eventApiClientId = event.data.apiClientId || ""; + let requestId = event.data.requestId || ""; + // Only accept responses from our own requests or from device. + if (apiClientId === eventApiClientId || eventApiClientId === "") { + logger.trace("Receiving event from content script: " + JSON.stringify(event.data)); + // For backwards compatibility a blank message might be send as "na". + if (event.data.message === "na") { + delete event.data.message; + } + // For backward compatability reinterprent messages starting with error as errors: + if (event.data.message && event.data.message.startsWith("Error:")) { + event.data.error = event.data.message; + delete event.data.message; + } + if (event.data.message) { + logger.trace("Got message: " + JSON.stringify(event.data)); + const normalizedMsg = event.data.message.substring(7); // Strip "Event" prefix; + if (normalizedMsg.startsWith("logLevel")) { + jabra.logLevel = parseInt(event.data.message.substring(16)); + logger.trace("Logger set to level " + jabra.logLevel); + // Loglevels are internal events and not an indication of proper + // initialization so skip rest of handling for log levels. + return; + } + const commandIndex = commandEventsList.findIndex((e) => normalizedMsg.startsWith(e)); + if (commandIndex >= 0) { + // For install info and version command, we need to add api version number. + if (normalizedMsg === "getinstallinfo" || (normalizedMsg.startsWith("Version "))) { + // Old extension/host won't have data so make sure it exists to avoid breakage. + if (!event.data.data) { + event.data.data = {}; + } + event.data.data.version_jsapi = jabra.apiVersion; + } + // For install info also check if the full installation is consistent. + if (normalizedMsg === "getinstallinfo") { + event.data.data.installationOk = isInstallationOk(event.data.data); + } + // Lookup and check that we have identified a (real) command target to pair result with. + let resultTarget = identifyAndCleanupResultTarget(requestId); + if (resultTarget) { + let result; + if (event.data.data) { + result = event.data.data; + } + else { + let dataPosition = commandEventsList[commandIndex].length + 1; + let dataStr = normalizedMsg.substring(dataPosition); + result = {}; + if (dataStr) { + result.legacy_result = dataStr; + } + ; + } + resultTarget.resolve(result); + } + else { + let err = "Result target information missing for message " + event.data.message + ". This is likely due to some software components that have not been updated or a software bug. Please upgrade extension and/or chromehost"; + logger.error(err); + notify("error", { + error: err, + message: event.data.message + }); + } + } + else if (eventListeners.has(normalizedMsg)) { + let clientEvent = JSON.parse(JSON.stringify(event.data)); + delete clientEvent.direction; + delete clientEvent.apiClientId; + delete clientEvent.requestId; + clientEvent.message = normalizedMsg; + notify(normalizedMsg, clientEvent); + } + else { + logger.warn("Unknown message: " + event.data.message); + notify("error", { + error: "Unknown message: ", + message: event.data.message + }); + // Don't let unknown messages complete initialization so stop here. + return; + } + if (duringInit) { + duringInit = false; + return resolve(); + } + } + else if (event.data.error) { + logger.error("Got error: " + event.data.error); + const normalizedError = event.data.error.substring(7); // Strip "Error" prefix; + // Reject target promise if there is one - otherwise send a general error. + let resultTarget = identifyAndCleanupResultTarget(requestId); + if (resultTarget) { + resultTarget.reject(new CommandError(resultTarget.cmd, normalizedError, event.data.data)); + } + else { + let clientError = JSON.parse(JSON.stringify(event.data)); + delete clientError.direction; + delete clientError.apiClientId; + delete clientError.requestId; + clientError.error = normalizedError; + notify("error", clientError); + } + if (duringInit) { + duringInit = false; + return reject(new Error(event.data.error)); + } + } } - - ; - } - - resultTarget.resolve(result); - } else { - var err = "Result target information missing for message " + event.data.message + ". This is likely due to some software components that have not been updated or a software bug. Please upgrade extension and/or chromehost"; - logger.error(err); - notify("error", { - error: err, - message: event.data.message - }); } - } else if (eventListeners.has(normalizedMsg)) { - var clientEvent = JSON.parse(JSON.stringify(event.data)); - delete clientEvent.direction; - delete clientEvent.apiClientId; - delete clientEvent.requestId; - clientEvent.message = normalizedMsg; - notify(normalizedMsg, clientEvent); - } else { - logger.warn("Unknown message: " + event.data.message); - notify("error", { - error: "Unknown message: ", - message: event.data.message - }); // Don't let unknown messages complete initialization so stop here. - - return; - } - - if (duringInit) { - duringInit = false; - return resolve(); - } - } else if (event.data.error) { - logger.error("Got error: " + event.data.error); - var normalizedError = event.data.error.substring(7); // Strip "Error" prefix; - // Reject target promise if there is one - otherwise send a general error. - - var _resultTarget = identifyAndCleanupResultTarget(requestId); - - if (_resultTarget) { - _resultTarget.reject(new CommandError(_resultTarget.cmd, normalizedError, event.data.data)); - } else { - var clientError = JSON.parse(JSON.stringify(event.data)); - delete clientError.direction; - delete clientError.apiClientId; - delete clientError.requestId; - clientError.error = normalizedError; - notify("error", clientError); - } - - if (duringInit) { - duringInit = false; - return reject(new Error(event.data.error)); - } + }; + window.addEventListener("message", initState.eventCallback); + // Initial getversion and loglevel. + setTimeout(() => { + sendCmdWithResult("getversion", null, false).then((result) => { + let resultStr = (typeof result === 'string' || result instanceof String) ? result : JSON.stringify(result, null, 2); + logger.trace("getversion returned successfully with : " + resultStr); + sendCmd("logLevel", null, false); + }).catch((error) => { + logger.error(error); + }); + }, 1000); + // Check if the web-extension is installed + setTimeout(function () { + if (duringInit === true) { + duringInit = false; + const extensionId = isBeta ? betaExtensionId : prodExtensionId; + reject(new Error("Jabra Browser Integration: You need to use this Extension and then reload this page")); + } + }, 5000); + /** + * Helper that checks if the installation is consistent. + */ + function isInstallationOk(installInfo) { + let browserSdkVersions = [installInfo.version_browserextension, installInfo.version_chromehost, installInfo.version_jsapi]; + // Check that we have install information for all components. + if (browserSdkVersions.some(v => !v) || !installInfo.version_nativesdk) { + return false; + } + // Check that different beta versions are not mixed. + if (!browserSdkVersions.map(v => { + let betaIndex = v.lastIndexOf('beta'); + if (betaIndex >= 0 && v.length > betaIndex + 4) { + return v.substr(betaIndex + 4); + } + else { + return undefined; + } + }).filter(v => v).every((v, i, arr) => v === arr[0])) { + return false; + } + return true; } - } - } - }; - - window.addEventListener("message", initState.eventCallback); // Initial getversion and loglevel. - - setTimeout(function () { - sendCmdWithResult("getversion", null, false).then(function (result) { - var resultStr = typeof result === 'string' || _instanceof(result, String) ? result : JSON.stringify(result, null, 2); - logger.trace("getversion returned successfully with : " + resultStr); - sendCmd("logLevel", null, false); - }).catch(function (error) { - logger.error(error); + /** + * Post event/error to subscribers. + */ + function notify(eventName, eventMsg) { + let callbacks = eventListeners.get(eventName); + if (callbacks) { + callbacks.forEach((callback) => { + callback(eventMsg); + }); + } + else { + // This should not occur unless internal event mappings in this file + // are not configured correctly. + logger.error("Unexpected unknown eventName: " + eventName); + } + } + /** Lookup any previous stored result target information for the request. + * Does cleanup if target found (so it can't be called twice for a request). + * Nb. requestId's are only provided by >= 0.5 extension and chromehost. + */ + function identifyAndCleanupResultTarget(requestId) { + // Lookup any previous stored result target information for the request. + // Nb. requestId's are only provided by >= 0.5 extension and chromehost. + let resultTarget; + if (requestId) { + resultTarget = sendRequestResultMap.get(requestId); + // Remember to cleanup to avoid memory leak! + sendRequestResultMap.delete(requestId); + } + else if (sendRequestResultMap.size === 1) { + // We don't have a requestId but since only one is being executed we + // can assume this is the one. + let value = sendRequestResultMap.entries().next().value; + resultTarget = value[1]; + // Remember to cleanup to avoid memory leak and for future + // requests like this to be resolved. + sendRequestResultMap.delete(value[0]); + } + else { + // No idea what target matches what request - give up. + resultTarget = undefined; + } + // Warn in case of likely memory leak: + const mapSize = sendRequestResultMap.size; + if (mapSize > 10 && mapSize % 10 === 0) { // Limit warnings to every 10 size increases to avoid flooding: + logger.warn("Memory leak found - Request result map is getting too large (size #" + mapSize + ")"); + } + return resultTarget; + } + initState.initialized = true; + initState.initializing = false; }); - }, 1000); // Check if the web-extension is installed - - setTimeout(function () { - if (duringInit === true) { - duringInit = false; - var extensionId = isBeta ? betaExtensionId : prodExtensionId; - reject(new Error("Jabra Browser Integration: You need to use this Extension and then reload this page")); + } + jabra.init = init; + ; + /** + * De-initialize the api after use. Not normally used as api will normally + * stay in use thoughout an application - mostly of interest for testing. + */ + function shutdown() { + if (initState.initialized) { + window.removeEventListener("message", initState.eventCallback); + initState.eventCallback = undefined; + sendRequestResultMap.clear(); + requestNumber = 1; + initState.initialized = false; + // Unsubscribe all. + eventListeners.forEach((value, key) => { + value = []; + }); + return Promise.resolve(); } - }, 5000); - /** - * Helper that checks if the installation is consistent. - */ - - function isInstallationOk(installInfo) { - var browserSdkVersions = [installInfo.version_browserextension, installInfo.version_chromehost, installInfo.version_jsapi]; // Check that we have install information for all components. - - if (browserSdkVersions.some(function (v) { - return !v; - }) || !installInfo.version_nativesdk) { - return false; - } // Check that different beta versions are not mixed. - - - if (!browserSdkVersions.map(function (v) { - var betaIndex = v.lastIndexOf('beta'); - - if (betaIndex >= 0 && v.length > betaIndex + 4) { - return v.substr(betaIndex + 4); - } else { - return undefined; - } - }).filter(function (v) { - return v; - }).every(function (v, i, arr) { - return v === arr[0]; - })) { - return false; + return Promise.reject(new Error("Browser integration not initialized")); + } + jabra.shutdown = shutdown; + ; + /** + * Internal helper that returns an array of valid event keys that correspond to the event specificator + * and are known to exist in our event listener map. + */ + function getEvents(nameSpec) { + if (Array.isArray(nameSpec)) { + // @ts-ignore: Disable wrong "argument not assignable" error in ts 3.4 + return [...new Set([].concat.apply([], nameSpec.map(a => getEvents(a))))]; } - - return true; - } - /** - * Post event/error to subscribers. - */ - - - function notify(eventName, eventMsg) { - var callbacks = eventListeners.get(eventName); - - if (callbacks) { - callbacks.forEach(function (callback) { - callback(eventMsg); - }); - } else { - // This should not occur unless internal event mappings in this file - // are not configured correctly. - logger.error("Unexpected unknown eventName: " + eventName); + else if (nameSpec instanceof RegExp) { + return Array.from(eventListeners.keys()).filter(key => nameSpec.test(key)); } - } - /** Lookup any previous stored result target information for the request. - * Does cleanup if target found (so it can't be called twice for a request). - * Nb. requestId's are only provided by >= 0.5 extension and chromehost. - */ - - - function identifyAndCleanupResultTarget(requestId) { - // Lookup any previous stored result target information for the request. - // Nb. requestId's are only provided by >= 0.5 extension and chromehost. - var resultTarget; - - if (requestId) { - resultTarget = sendRequestResultMap.get(requestId); // Remember to cleanup to avoid memory leak! - - sendRequestResultMap.delete(requestId); - } else if (sendRequestResultMap.size === 1) { - // We don't have a requestId but since only one is being executed we - // can assume this is the one. - var value = sendRequestResultMap.entries().next().value; - resultTarget = value[1]; // Remember to cleanup to avoid memory leak and for future - // requests like this to be resolved. - - sendRequestResultMap.delete(value[0]); - } else { - // No idea what target matches what request - give up. - resultTarget = undefined; - } // Warn in case of likely memory leak: - - - var mapSize = sendRequestResultMap.size; - - if (mapSize > 10 && mapSize % 10 === 0) { - // Limit warnings to every 10 size increases to avoid flooding: - logger.warn("Memory leak found - Request result map is getting too large (size #" + mapSize + ")"); + else { // String + if (eventListeners.has(nameSpec)) { + return [nameSpec]; + } + else { + logger.warn("Unknown event " + nameSpec + " ignored when adding/removing eventlistener"); + } } - - return resultTarget; - } - - initState.initialized = true; - initState.initializing = false; - }); - } - - jabra.init = init; - ; - /** - * De-initialize the api after use. Not normally used as api will normally - * stay in use thoughout an application - mostly of interest for testing. - */ - - function shutdown() { - if (initState.initialized) { - window.removeEventListener("message", initState.eventCallback); - initState.eventCallback = undefined; - sendRequestResultMap.clear(); - requestNumber = 1; - initState.initialized = false; // Unsubscribe all. - - eventListeners.forEach(function (value, key) { - value = []; - }); - return Promise.resolve(); + return []; } - - return Promise.reject(new Error("Browser integration not initialized")); - } - - jabra.shutdown = shutdown; - ; - /** - * Internal helper that returns an array of valid event keys that correspond to the event specificator - * and are known to exist in our event listener map. - */ - - function getEvents(nameSpec) { - if (Array.isArray(nameSpec)) { - // @ts-ignore: Disable wrong "argument not assignable" error in ts 3.4 - return _toConsumableArray(new Set([].concat.apply([], nameSpec.map(function (a) { - return getEvents(a); - })))); - } else if (_instanceof(nameSpec, RegExp)) { - return Array.from(eventListeners.keys()).filter(function (key) { - return nameSpec.test(key); - }); - } else { - // String - if (eventListeners.has(nameSpec)) { - return [nameSpec]; - } else { - logger.warn("Unknown event " + nameSpec + " ignored when adding/removing eventlistener"); - } + /** + * Hook up listener call back to specified event(s) as specified by initial name specification argument nameSpec. + * When the nameSpec argument is a string, this correspond to a single named event. When the argument is a regular + * expression all lister subscribes to all matching events. If the argument is an array it recursively subscribes + * to all events specified in the array. + */ + function addEventListener(nameSpec, callback) { + getEvents(nameSpec).map(name => { + let callbacks = eventListeners.get(name); + if (!callbacks.find((c) => c === callback)) { + callbacks.push(callback); + } + }); } - - return []; - } - /** - * Hook up listener call back to specified event(s) as specified by initial name specification argument nameSpec. - * When the nameSpec argument is a string, this correspond to a single named event. When the argument is a regular - * expression all lister subscribes to all matching events. If the argument is an array it recursively subscribes - * to all events specified in the array. - */ - - - function addEventListener(nameSpec, callback) { - getEvents(nameSpec).map(function (name) { - var callbacks = eventListeners.get(name); - - if (!callbacks.find(function (c) { - return c === callback; - })) { - callbacks.push(callback); - } - }); - } - - jabra.addEventListener = addEventListener; - ; - /** - * Remove existing listener to specified event(s). The callback must correspond to the exact callback provided - * to a previous addEventListener. - */ - - function removeEventListener(nameSpec, callback) { - getEvents(nameSpec).map(function (name) { - var callbacks = eventListeners.get(name); - var findIndex = callbacks.findIndex(function (c) { - return c === callback; - }); - - if (findIndex >= 0) { - callbacks.splice(findIndex, 1); - } - }); - } - - jabra.removeEventListener = removeEventListener; - ; - /** - * Activate ringer (if supported) on the Jabra Device - */ - - function ring() { - sendCmd("ring"); - } - - jabra.ring = ring; - ; - /** - * Change state to in-a-call. - */ - - function offHook() { - sendCmd("offhook"); - } - - jabra.offHook = offHook; - ; - /** - * Change state to idle (not-in-a-call). - */ - - function onHook() { - sendCmd("onhook"); - } - - jabra.onHook = onHook; - ; - /** - * Mutes the microphone (if supported). - */ - - function mute() { - sendCmd("mute"); - } - - jabra.mute = mute; - ; - /** - * Unmutes the microphone (if supported). - */ - - function unmute() { - sendCmd("unmute"); - } - - jabra.unmute = unmute; - ; - /** - * Change state to held (if supported). - */ - - function hold() { - sendCmd("hold"); - } - - jabra.hold = hold; - ; - /** - * Change state from held to OffHook (if supported). - */ - - function resume() { - sendCmd("resume"); - } - - jabra.resume = resume; - ; - /** - * Capture/release buttons for customization (if supported). This turns off default behavior and enables mmi events to - * be received instead. It also allows for mmi actions to be applied like changing lights with setRemoteMmiLightAction. - * - * @param type The button that should be captured/released. - * @param capture True if button should be captured, false if it should be released. - * - * @returns A promise that is resolved once operation completes. - */ - - function setMmiFocus(type, capture) { - var typeVal = numberOrString(type); - var captureVal = booleanOrString(capture); - return sendCmdWithResult("setmmifocus", { - type: typeVal, - capture: captureVal - }); - } - - jabra.setMmiFocus = setMmiFocus; - /** - * Change light/color on a previously captured button. - * Nb. This requires the button to be previously captured though setMMiFocus. - * - * @param type The button that should be captured/released. - * @param color An RGB array of 3x integers or a RGB number (with 0x or # prefix for hex). - * @param effect What effect to apply to the button. - * - * @returns A promise that is resolved once operation completes. - */ - - function setRemoteMmiLightAction(type, color, effect) { - var typeVal = numberOrString(type); - var colorVal = colorOrString(color); - var effectVal = numberOrString(effect); - return sendCmdWithResult("setremotemmilightaction", { - type: typeVal, - color: colorVal, - effect: effectVal - }); - } - - jabra.setRemoteMmiLightAction = setRemoteMmiLightAction; - /** - * Internal helper to get detailed information about the current active Jabra Device - * from SDK, including current status but excluding media device information. - */ - - function _doGetActiveSDKDevice() { - return sendCmdWithResult("getactivedevice"); - } - - ; - /** - * Internal helper to get detailed information about the all attached Jabra Devices - * from SDK, including current status but excluding media device information. - */ - - function _doGetSDKDevices() { - return sendCmdWithResult("getdevices"); - } - - ; - /** - * Get detailed information about the current active Jabra Device, including current status - * and optionally also including related browser media device information. - * - * Note that browser media device information requires mediaDevices.getUserMedia or - * getUserDeviceMediaExt to have been called so permissions are granted. Browser media information - * is useful for setting a device constraint on mediaDevices.getUserMedia for input or for calling - * setSinkId (when supported by the browser) to set output. - */ - - function getActiveDevice() { - var includeBrowserMediaDeviceInfo = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var includeBrowserMediaDeviceInfoVal = booleanOrString(includeBrowserMediaDeviceInfo); - - if (includeBrowserMediaDeviceInfoVal) { - return _doGetActiveSDKDevice_And_BrowserDevice(); - } else { - return _doGetActiveSDKDevice(); + jabra.addEventListener = addEventListener; + ; + /** + * Remove existing listener to specified event(s). The callback must correspond to the exact callback provided + * to a previous addEventListener. + */ + function removeEventListener(nameSpec, callback) { + getEvents(nameSpec).map(name => { + let callbacks = eventListeners.get(name); + let findIndex = callbacks.findIndex((c) => c === callback); + if (findIndex >= 0) { + callbacks.splice(findIndex, 1); + } + }); } - } - - jabra.getActiveDevice = getActiveDevice; - ; - /** - * List detailed information about all attached Jabra Devices, including current status. - * and optionally also including related browser media device information. - * - * Note that browser media device information requires mediaDevices.getUserMedia or - * getUserDeviceMediaExt to have been called so permissions are granted. Browser media information - * is useful for setting a device constraint on mediaDevices.getUserMedia for input or for calling - * setSinkId (when supported by the browser) to set output. - */ - - function getDevices() { - var includeBrowserMediaDeviceInfo = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var includeBrowserMediaDeviceInfoVal = booleanOrString(includeBrowserMediaDeviceInfo); - - if (includeBrowserMediaDeviceInfoVal) { - return _doGetSDKDevices_And_BrowserDevice(); - } else { - return _doGetSDKDevices(); + jabra.removeEventListener = removeEventListener; + ; + /** + * Activate ringer (if supported) on the Jabra Device + */ + function ring() { + sendCmd("ring"); } - } - - jabra.getDevices = getDevices; - ; - /** - * Internal utility that select a new active device in a backwards compatible way that works with earlier chrome host. - * Used internally by test tool - do not use otherwise. - * - * Note: The active device is a global setting that affects all browser - * instances using the browser SDK. Unless changed specifically, the setting - * persist until browser is restarted or device is unplugged. - * - * @deprecated Use setActiveDeviceId instead. - */ - - function _setActiveDeviceId(id) { - var idVal = numberOrString(id); // Use both new and old way of passing parameters for compatibility with <= v0.5. - - sendCmd("setactivedevice " + id.toString(), { - id: idVal - }); - } - - jabra._setActiveDeviceId = _setActiveDeviceId; - ; - /** - * Select a new active device returning once selection is completed. - * - * Note: The active device is a global setting that affects all browser - * instances using the browser SDK. Unless changed specifically, the setting - * persist until browser is restarted or device is unplugged. - * - * @param id The id number of the new active device. - * @returns A promise that is resolved once selection completes. - * - */ - - function setActiveDeviceId(id) { - var idVal = numberOrString(id); - return sendCmdWithResult("setactivedevice2", { - id: idVal - }); - } - - jabra.setActiveDeviceId = setActiveDeviceId; - ; - /** - * Set busylight on active device (if supported) - * - * @param busy True if busy light should be set, false if it should be cleared. - */ - - function setBusyLight(busy) { - var busyVal = booleanOrString(busy); - return sendCmdWithResult("setbusylight", { - busy: busyVal - }); - } - - jabra.setBusyLight = setBusyLight; - ; - /** - * Get version number information for all components. - */ - - function getInstallInfo() { - return sendCmdWithResult("getinstallinfo"); - } - - jabra.getInstallInfo = getInstallInfo; - ; - /** - * Internal helper that forwards a command to the browser extension - * without expecting a response. - */ - - function sendCmd(cmd) { - var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - var requireInitializedCheck = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; - - if (!requireInitializedCheck || requireInitializedCheck && initState.initialized) { - var requestId = (requestNumber++).toString(); - var msg = { - direction: "jabra-headset-extension-from-page-script", - message: cmd, - args: args || {}, - requestId: requestId, - apiClientId: apiClientId, - version_jsapi: jabra.apiVersion - }; - logger.trace("Sending command to content script: " + JSON.stringify(msg)); - window.postMessage(msg, "*"); - } else { - throw new Error("Browser integration not initialized"); + jabra.ring = ring; + ; + /** + * Change state to in-a-call. + */ + function offHook() { + sendCmd("offhook"); } - } - - ; - /** - * Internal helper that forwards a command to the browser extension - * expecting a response (a promise). - */ - - function sendCmdWithResult(cmd) { - var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - var requireInitializedCheck = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; - - if (!requireInitializedCheck || requireInitializedCheck && initState.initialized) { - var requestId = (requestNumber++).toString(); - return new Promise(function (resolve, reject) { - sendRequestResultMap.set(requestId, { - cmd: cmd, - resolve: resolve, - reject: reject + jabra.offHook = offHook; + ; + /** + * Change state to idle (not-in-a-call). + */ + function onHook() { + sendCmd("onhook"); + } + jabra.onHook = onHook; + ; + /** + * Mutes the microphone (if supported). + */ + function mute() { + sendCmd("mute"); + } + jabra.mute = mute; + ; + /** + * Unmutes the microphone (if supported). + */ + function unmute() { + sendCmd("unmute"); + } + jabra.unmute = unmute; + ; + /** + * Change state to held (if supported). + */ + function hold() { + sendCmd("hold"); + } + jabra.hold = hold; + ; + /** + * Change state from held to OffHook (if supported). + */ + function resume() { + sendCmd("resume"); + } + jabra.resume = resume; + ; + /** + * Capture/release buttons for customization (if supported). This turns off default behavior and enables mmi events to + * be received instead. It also allows for mmi actions to be applied like changing lights with setRemoteMmiLightAction. + * + * @param type The button that should be captured/released. + * @param capture True if button should be captured, false if it should be released. + * + * @returns A promise that is resolved once operation completes. + */ + function setMmiFocus(type, capture) { + let typeVal = numberOrString(type); + let captureVal = booleanOrString(capture); + return sendCmdWithResult("setmmifocus", { + type: typeVal, + capture: captureVal }); - var msg = { - direction: "jabra-headset-extension-from-page-script", - message: cmd, - args: args || {}, - requestId: requestId, - apiClientId: apiClientId, - version_jsapi: jabra.apiVersion - }; - logger.trace("Sending command to content script expecting result: " + JSON.stringify(msg)); - window.postMessage(msg, "*"); - }); - } else { - return Promise.reject(new Error("Browser integration not initialized")); } - } - - ; - /** - * Configure an audio html element on a webpage to use jabra audio device as speaker output. Returns a promise with boolean success status. - * The deviceInfo argument must come from getDeviceInfo or getUserDeviceMediaExt calls. - */ - - function trySetDeviceOutput(audioElement, deviceInfo) { - if (!audioElement || !deviceInfo) { - return Promise.reject(new Error('Call to trySetDeviceOutput has argument(s) missing')); + jabra.setMmiFocus = setMmiFocus; + /** + * Change light/color on a previously captured button. + * Nb. This requires the button to be previously captured though setMMiFocus. + * + * @param type The button that should be captured/released. + * @param color An RGB array of 3x integers or a RGB number (with 0x or # prefix for hex). + * @param effect What effect to apply to the button. + * + * @returns A promise that is resolved once operation completes. + */ + function setRemoteMmiLightAction(type, color, effect) { + let typeVal = numberOrString(type); + let colorVal = colorOrString(color); + let effectVal = numberOrString(effect); + return sendCmdWithResult("setremotemmilightaction", { + type: typeVal, + color: colorVal, + effect: effectVal + }); } - - if (!(typeof audioElement.setSinkId === "function")) { - return Promise.reject(new Error('Your browser does not support required Audio Output Devices API')); + jabra.setRemoteMmiLightAction = setRemoteMmiLightAction; + /** + * Internal helper to get detailed information about the current active Jabra Device + * from SDK, including current status but excluding media device information. + */ + function _doGetActiveSDKDevice() { + return sendCmdWithResult("getactivedevice"); } - - return audioElement.setSinkId(deviceInfo.browserAudioOutputId).then(function () { - var success = audioElement.sinkId === deviceInfo.browserAudioOutputId; - return success; - }); - } - - jabra.trySetDeviceOutput = trySetDeviceOutput; - ; - /** - * Checks if a Jabra Input device is in fact selected in a media stream. - * The deviceInfo argument must come from getDeviceInfo or getUserDeviceMediaExt calls. - */ - - function isDeviceSelectedForInput(mediaStream, deviceInfo) { - if (!mediaStream || !deviceInfo) { - throw Error('Call to isDeviceSelectedForInput has argument(s) missing'); + ; + /** + * Internal helper to get detailed information about the all attached Jabra Devices + * from SDK, including current status but excluding media device information. + */ + function _doGetSDKDevices() { + return sendCmdWithResult("getdevices"); } - - var tracks = mediaStream.getAudioTracks(); - - for (var i = 0, len = tracks.length; i < len; i++) { - var track = tracks[i]; - var trackCap = track.getCapabilities(); - - if (trackCap.deviceId !== deviceInfo.browserAudioInputId) { - return false; - } + ; + /** + * Get detailed information about the current active Jabra Device, including current status + * and optionally also including related browser media device information. + * + * Note that browser media device information requires mediaDevices.getUserMedia or + * getUserDeviceMediaExt to have been called so permissions are granted. Browser media information + * is useful for setting a device constraint on mediaDevices.getUserMedia for input or for calling + * setSinkId (when supported by the browser) to set output. + */ + function getActiveDevice(includeBrowserMediaDeviceInfo = false) { + let includeBrowserMediaDeviceInfoVal = booleanOrString(includeBrowserMediaDeviceInfo); + if (includeBrowserMediaDeviceInfoVal) { + return _doGetActiveSDKDevice_And_BrowserDevice(); + } + else { + return _doGetActiveSDKDevice(); + } } - - return true; - } - - jabra.isDeviceSelectedForInput = isDeviceSelectedForInput; - ; - /** - * Replacement for mediaDevices.getUserMedia that makes a best effort to select the active Jabra audio device - * to be used for the microphone. Unlike getUserMedia this method returns a promise that - * resolve to an object containing both a stream and the device info for the selected device. - * - * Optional, additional non-audio constrains (like f.x. video) can be specified as well. - * - * Note: Subsequently, if this method appears to succeed use the isDeviceSelectedForInput function to check - * if the browser did in fact choose a Jabra device for the microphone. - */ - - function getUserDeviceMediaExt(constraints) { - // Good error if using old browser: - if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) { - return Promise.reject(new Error('Your browser does not support required media api')); - } // Init completed ? - - - if (!initState.initialized) { - return Promise.reject(new Error("Browser integration not initialized")); - } // Warn of degraded UX experience unless we are running https. - - - if (location.protocol !== 'https:') { - logger.warn("This function needs to run under https for best UX experience (persisted permissions)"); - } // Check input validity: - - - if (constraints !== undefined && constraints !== null && _typeof(constraints) !== 'object') { - return Promise.reject(new Error("Optional constraints parameter must be an object")); + jabra.getActiveDevice = getActiveDevice; + ; + /** + * List detailed information about all attached Jabra Devices, including current status. + * and optionally also including related browser media device information. + * + * Note that browser media device information requires mediaDevices.getUserMedia or + * getUserDeviceMediaExt to have been called so permissions are granted. Browser media information + * is useful for setting a device constraint on mediaDevices.getUserMedia for input or for calling + * setSinkId (when supported by the browser) to set output. + */ + function getDevices(includeBrowserMediaDeviceInfo = false) { + let includeBrowserMediaDeviceInfoVal = booleanOrString(includeBrowserMediaDeviceInfo); + if (includeBrowserMediaDeviceInfoVal) { + return _doGetSDKDevices_And_BrowserDevice(); + } + else { + return _doGetSDKDevices(); + } + } + jabra.getDevices = getDevices; + ; + /** + * Internal utility that select a new active device in a backwards compatible way that works with earlier chrome host. + * Used internally by test tool - do not use otherwise. + * + * Note: The active device is a global setting that affects all browser + * instances using the browser SDK. Unless changed specifically, the setting + * persist until browser is restarted or device is unplugged. + * + * @deprecated Use setActiveDeviceId instead. + */ + function _setActiveDeviceId(id) { + let idVal = numberOrString(id); + // Use both new and old way of passing parameters for compatibility with <= v0.5. + sendCmd("setactivedevice " + id.toString(), { id: idVal }); + } + jabra._setActiveDeviceId = _setActiveDeviceId; + ; + /** + * Select a new active device returning once selection is completed. + * + * Note: The active device is a global setting that affects all browser + * instances using the browser SDK. Unless changed specifically, the setting + * persist until browser is restarted or device is unplugged. + * + * @param id The id number of the new active device. + * @returns A promise that is resolved once selection completes. + * + */ + function setActiveDeviceId(id) { + let idVal = numberOrString(id); + return sendCmdWithResult("setactivedevice2", { id: idVal }); + } + jabra.setActiveDeviceId = setActiveDeviceId; + ; + /** + * Set busylight on active device (if supported) + * + * @param busy True if busy light should be set, false if it should be cleared. + */ + function setBusyLight(busy) { + let busyVal = booleanOrString(busy); + return sendCmdWithResult("setbusylight", { busy: busyVal }); + } + jabra.setBusyLight = setBusyLight; + ; + /** + * Get version number information for all components. + */ + function getInstallInfo() { + return sendCmdWithResult("getinstallinfo"); + } + jabra.getInstallInfo = getInstallInfo; + ; + /** + * Internal helper that forwards a command to the browser extension + * without expecting a response. + */ + function sendCmd(cmd, args = null, requireInitializedCheck = true) { + if (!requireInitializedCheck || (requireInitializedCheck && initState.initialized)) { + let requestId = (requestNumber++).toString(); + let msg = { + direction: "jabra-headset-extension-from-page-script", + message: cmd, + args: args || {}, + requestId: requestId, + apiClientId: apiClientId, + version_jsapi: jabra.apiVersion + }; + logger.trace("Sending command to content script: " + JSON.stringify(msg)); + window.postMessage(msg, "*"); + } + else { + throw new Error("Browser integration not initialized"); + } } + ; /** - * Utility method that combines constraints with ours taking precedence (deep). + * Internal helper that forwards a command to the browser extension + * expecting a response (a promise). + */ + function sendCmdWithResult(cmd, args = null, requireInitializedCheck = true) { + if (!requireInitializedCheck || (requireInitializedCheck && initState.initialized)) { + let requestId = (requestNumber++).toString(); + return new Promise((resolve, reject) => { + sendRequestResultMap.set(requestId, { cmd, resolve, reject }); + let msg = { + direction: "jabra-headset-extension-from-page-script", + message: cmd, + args: args || {}, + requestId: requestId, + apiClientId: apiClientId, + version_jsapi: jabra.apiVersion + }; + logger.trace("Sending command to content script expecting result: " + JSON.stringify(msg)); + window.postMessage(msg, "*"); + }); + } + else { + return Promise.reject(new Error("Browser integration not initialized")); + } + } + ; + /** + * Configure an audio html element on a webpage to use jabra audio device as speaker output. Returns a promise with boolean success status. + * The deviceInfo argument must come from getDeviceInfo or getUserDeviceMediaExt calls. + */ + function trySetDeviceOutput(audioElement, deviceInfo) { + if (!audioElement || !deviceInfo) { + return Promise.reject(new Error('Call to trySetDeviceOutput has argument(s) missing')); + } + if (!(typeof (audioElement.setSinkId) === "function")) { + return Promise.reject(new Error('Your browser does not support required Audio Output Devices API')); + } + return audioElement.setSinkId(deviceInfo.browserAudioOutputId).then(() => { + var success = audioElement.sinkId === deviceInfo.browserAudioOutputId; + return success; + }); + } + jabra.trySetDeviceOutput = trySetDeviceOutput; + ; + /** + * Checks if a Jabra Input device is in fact selected in a media stream. + * The deviceInfo argument must come from getDeviceInfo or getUserDeviceMediaExt calls. */ - - - function mergeConstraints(ours, theirs) { - if (theirs !== null && theirs !== undefined && _typeof(ours) === 'object') { - var result = {}; - - for (var attrname in theirs) { - result[attrname] = theirs[attrname]; + function isDeviceSelectedForInput(mediaStream, deviceInfo) { + if (!mediaStream || !deviceInfo) { + throw Error('Call to isDeviceSelectedForInput has argument(s) missing'); } - - for (var attrname in ours) { - result[attrname] = mergeConstraints(ours[attrname], theirs[attrname]); - } // Ours takes precedence. - - - return result; - } else { - return ours; - } - } // If we have the input device id already we can do a direct call to getUserMedia, otherwise we have to do - // an initial general call to getUserMedia just get access to looking up the input device and then a second - // call to getUserMedia to make sure the Jabra input device is selected. - - - return navigator.mediaDevices.getUserMedia(mergeConstraints({ - audio: true - }, constraints)).then(function (dummyStream) { - return _doGetActiveSDKDevice_And_BrowserDevice().then(function (deviceInfo) { - // Shutdown initial dummy stream (not sure it is really required but let's be nice). - dummyStream.getTracks().forEach(function (track) { - track.stop(); + var tracks = mediaStream.getAudioTracks(); + for (var i = 0, len = tracks.length; i < len; i++) { + var track = tracks[i]; + var trackCap = track.getCapabilities(); + if (trackCap.deviceId !== deviceInfo.browserAudioInputId) { + return false; + } + } + return true; + } + jabra.isDeviceSelectedForInput = isDeviceSelectedForInput; + ; + /** + * Replacement for mediaDevices.getUserMedia that makes a best effort to select the active Jabra audio device + * to be used for the microphone. Unlike getUserMedia this method returns a promise that + * resolve to an object containing both a stream and the device info for the selected device. + * + * Optional, additional non-audio constrains (like f.x. video) can be specified as well. + * + * Note: Subsequently, if this method appears to succeed use the isDeviceSelectedForInput function to check + * if the browser did in fact choose a Jabra device for the microphone. + */ + function getUserDeviceMediaExt(constraints) { + // Good error if using old browser: + if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) { + return Promise.reject(new Error('Your browser does not support required media api')); + } + // Init completed ? + if (!initState.initialized) { + return Promise.reject(new Error("Browser integration not initialized")); + } + // Warn of degraded UX experience unless we are running https. + if (location.protocol !== 'https:') { + logger.warn("This function needs to run under https for best UX experience (persisted permissions)"); + } + // Check input validity: + if (constraints !== undefined && constraints !== null && typeof constraints !== 'object') { + return Promise.reject(new Error("Optional constraints parameter must be an object")); + } + /** + * Utility method that combines constraints with ours taking precedence (deep). + */ + function mergeConstraints(ours, theirs) { + if (theirs !== null && theirs !== undefined && typeof ours === 'object') { + let result = {}; + for (var attrname in theirs) { + result[attrname] = theirs[attrname]; + } + for (var attrname in ours) { + result[attrname] = mergeConstraints(ours[attrname], theirs[attrname]); + } // Ours takes precedence. + return result; + } + else { + return ours; + } + } + // If we have the input device id already we can do a direct call to getUserMedia, otherwise we have to do + // an initial general call to getUserMedia just get access to looking up the input device and then a second + // call to getUserMedia to make sure the Jabra input device is selected. + return navigator.mediaDevices.getUserMedia(mergeConstraints({ audio: true }, constraints)).then((dummyStream) => { + return _doGetActiveSDKDevice_And_BrowserDevice().then((deviceInfo) => { + // Shutdown initial dummy stream (not sure it is really required but let's be nice). + dummyStream.getTracks().forEach((track) => { + track.stop(); + }); + if (deviceInfo && deviceInfo.browserAudioInputId) { + return navigator.mediaDevices.getUserMedia(mergeConstraints({ audio: { deviceId: deviceInfo.browserAudioInputId } }, constraints)) + .then((stream) => { + return { + stream: stream, + deviceInfo: deviceInfo + }; + }); + } + else { + return Promise.reject(new Error('Could not find a Jabra device with a microphone')); + } + }); }); - - if (deviceInfo && deviceInfo.browserAudioInputId) { - return navigator.mediaDevices.getUserMedia(mergeConstraints({ - audio: { - deviceId: deviceInfo.browserAudioInputId + } + jabra.getUserDeviceMediaExt = getUserDeviceMediaExt; + ; + /** + * Internal helper for add media information properties to existing SDK device information. + */ + function fillInMatchingMediaInfo(deviceInfo, mediaDevices) { + function findBestMatchIndex(sdkDeviceName, mediaDeviceNameCandidates) { + // Edit distance helper adapted from + // https://stackoverflow.com/questions/10473745/compare-strings-javascript-return-of-likely + function editDistance(s1, s2) { + s1 = s1.toLowerCase(); + s2 = s2.toLowerCase(); + var costs = new Array(); + for (var i = 0; i <= s1.length; i++) { + var lastValue = i; + for (var j = 0; j <= s2.length; j++) { + if (i == 0) + costs[j] = j; + else { + if (j > 0) { + var newValue = costs[j - 1]; + if (s1.charAt(i - 1) != s2.charAt(j - 1)) + newValue = Math.min(Math.min(newValue, lastValue), costs[j]) + 1; + costs[j - 1] = lastValue; + lastValue = newValue; + } + } + } + if (i > 0) + costs[s2.length] = lastValue; + } + return costs[s2.length]; + } + // Levenshtein distance helper adapted from + // https://stackoverflow.com/questions/10473745/compare-strings-javascript-return-of-likely + function levenshteinDistance(s1, s2) { + let longer = s1; + let shorter = s2; + if (s1.length < s2.length) { + longer = s2; + shorter = s1; + } + let longerLength = longer.length; + if (longerLength === 0) { + return 1.0; + } + return (longerLength - editDistance(longer, shorter)) / longerLength; + } + if (mediaDeviceNameCandidates.length == 1) { + return 0; + } + else if (mediaDeviceNameCandidates.length > 0) { + let similarities = mediaDeviceNameCandidates.map(candidate => { + if (candidate.includes("(" + sdkDeviceName + ")")) { + return 1.0; + } + else { + // Remove Standard/Default prefix from label in Chrome when comparing + let prefixEnd = candidate.indexOf(' - '); + let cleanedCandidate = (prefixEnd >= 0) ? candidate.substring(prefixEnd + 3) : candidate; + return levenshteinDistance(sdkDeviceName, cleanedCandidate); + } + }); + let bestMatchIndex = similarities.reduce((prevIndexMax, value, i, a) => value > a[prevIndexMax] ? i : prevIndexMax, 0); + return bestMatchIndex; + } + else { + return -1; } - }, constraints)).then(function (stream) { - return { - stream: stream, - deviceInfo: deviceInfo - }; - }); - } else { - return Promise.reject(new Error('Could not find a Jabra device with a microphone')); } - }); - }); - } - - jabra.getUserDeviceMediaExt = getUserDeviceMediaExt; - ; - /** - * Internal helper for add media information properties to existing SDK device information. - */ - - function fillInMatchingMediaInfo(deviceInfo, mediaDevices) { - function findBestMatchIndex(sdkDeviceName, mediaDeviceNameCandidates) { - // Edit distance helper adapted from - // https://stackoverflow.com/questions/10473745/compare-strings-javascript-return-of-likely - function editDistance(s1, s2) { - s1 = s1.toLowerCase(); - s2 = s2.toLowerCase(); - var costs = new Array(); - - for (var i = 0; i <= s1.length; i++) { - var lastValue = i; - - for (var j = 0; j <= s2.length; j++) { - if (i == 0) costs[j] = j;else { - if (j > 0) { - var newValue = costs[j - 1]; - if (s1.charAt(i - 1) != s2.charAt(j - 1)) newValue = Math.min(Math.min(newValue, lastValue), costs[j]) + 1; - costs[j - 1] = lastValue; - lastValue = newValue; - } + // Find matching pair input or output device. + function findMatchingMediaDevice(groupId, kind, src) { + return src.find(md => md.groupId == groupId && md.kind == kind); + } + if (deviceInfo && deviceInfo.deviceName) { + let groupId = undefined; + let audioInputId = undefined; + let audioOutputId = undefined; + let label = undefined; + // Filter out non Jabra input/output devices: + let jabraMediaDevices = mediaDevices.filter(device => device.label + && device.label.toLowerCase().includes('jabra') + && (device.kind === 'audioinput' || device.kind === 'audiooutput')); + let someJabraDeviceIndex = findBestMatchIndex(deviceInfo.deviceName, jabraMediaDevices.map(md => md.label)); + if (someJabraDeviceIndex >= 0) { + let foundDevice = jabraMediaDevices[someJabraDeviceIndex]; + groupId = foundDevice.groupId; + label = foundDevice.label; + if (foundDevice.kind === 'audioinput') { + audioInputId = foundDevice.deviceId; + // Lookup matching output device: + let outputDevice = findMatchingMediaDevice(groupId, 'audiooutput', jabraMediaDevices); + if (outputDevice) { + audioOutputId = outputDevice.deviceId; + } + } + else if (foundDevice.kind === 'audiooutput') { + audioOutputId = foundDevice.deviceId; + // Lookup matching output input device: + let inputDevice = findMatchingMediaDevice(groupId, 'audioinput', jabraMediaDevices); + if (inputDevice) { + audioInputId = inputDevice.deviceId; + } + } + } + if (groupId) { + deviceInfo.browserGroupId = groupId; + } + if (label) { + deviceInfo.browserLabel = label; + } + if (audioInputId) { + deviceInfo.browserAudioInputId = audioInputId; + } + if (audioOutputId) { + deviceInfo.browserAudioOutputId = audioOutputId; } - } - - if (i > 0) costs[s2.length] = lastValue; } - - return costs[s2.length]; - } // Levenshtein distance helper adapted from - // https://stackoverflow.com/questions/10473745/compare-strings-javascript-return-of-likely - - - function levenshteinDistance(s1, s2) { - var longer = s1; - var shorter = s2; - - if (s1.length < s2.length) { - longer = s2; - shorter = s1; + else { + // Do nothing if device information is missing. } - - var longerLength = longer.length; - - if (longerLength === 0) { - return 1.0; + } + /** + * Internal helper that returns complete device information, including both SDK and browser media device + * information for all devices. + * + * Chrome note: + * 1) Only works if hosted under https. + * + * Firefox note: + * 1) Output devices not supported yet. See "https://bugzilla.mozilla.org/show_bug.cgi?id=934425" + * 2) The user must have provided permission to use the specific device to use it as a constraint. + * 3) GroupId not supported. + * + * General non-chrome browser note: + * 1) Returning output devices requires support for new Audio Output Devices API. + */ + function _doGetSDKDevices_And_BrowserDevice() { + // Good error if using old browser: + if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) { + return Promise.reject(new Error('Your browser does not support required media api')); } - - return (longerLength - editDistance(longer, shorter)) / longerLength; - } - - if (mediaDeviceNameCandidates.length == 1) { - return 0; - } else if (mediaDeviceNameCandidates.length > 0) { - var similarities = mediaDeviceNameCandidates.map(function (candidate) { - if (candidate.includes("(" + sdkDeviceName + ")")) { - return 1.0; - } else { - // Remove Standard/Default prefix from label in Chrome when comparing - var prefixEnd = candidate.indexOf(' - '); - var cleanedCandidate = prefixEnd >= 0 ? candidate.substring(prefixEnd + 3) : candidate; - return levenshteinDistance(sdkDeviceName, cleanedCandidate); - } + // Init completed ? + if (!initState.initialized) { + return Promise.reject(new Error("Browser integration not initialized")); + } + // Browser security rules (for at least chrome) requires site to run under https for labels to be read. + if (location.protocol !== 'https:') { + return Promise.reject(new Error('Your browser needs https for lookup to work')); + } + return Promise.all([_doGetSDKDevices(), navigator.mediaDevices.enumerateDevices()]).then(([deviceInfos, mediaDevices]) => { + deviceInfos.forEach((deviceInfo) => { + fillInMatchingMediaInfo(deviceInfo, mediaDevices); + }); + return deviceInfos; }); - var bestMatchIndex = similarities.reduce(function (prevIndexMax, value, i, a) { - return value > a[prevIndexMax] ? i : prevIndexMax; - }, 0); - return bestMatchIndex; - } else { - return -1; - } - } // Find matching pair input or output device. - - - function findMatchingMediaDevice(groupId, kind, src) { - return src.find(function (md) { - return md.groupId == groupId && md.kind == kind; - }); } - - if (deviceInfo && deviceInfo.deviceName) { - var groupId = undefined; - var audioInputId = undefined; - var audioOutputId = undefined; - var label = undefined; // Filter out non Jabra input/output devices: - - var jabraMediaDevices = mediaDevices.filter(function (device) { - return device.label && device.label.toLowerCase().includes('jabra') && (device.kind === 'audioinput' || device.kind === 'audiooutput'); - }); - var someJabraDeviceIndex = findBestMatchIndex(deviceInfo.deviceName, jabraMediaDevices.map(function (md) { - return md.label; - })); - - if (someJabraDeviceIndex >= 0) { - var foundDevice = jabraMediaDevices[someJabraDeviceIndex]; - groupId = foundDevice.groupId; - label = foundDevice.label; - - if (foundDevice.kind === 'audioinput') { - audioInputId = foundDevice.deviceId; // Lookup matching output device: - - var outputDevice = findMatchingMediaDevice(groupId, 'audiooutput', jabraMediaDevices); - - if (outputDevice) { - audioOutputId = outputDevice.deviceId; - } - } else if (foundDevice.kind === 'audiooutput') { - audioOutputId = foundDevice.deviceId; // Lookup matching output input device: - - var inputDevice = findMatchingMediaDevice(groupId, 'audioinput', jabraMediaDevices); - - if (inputDevice) { - audioInputId = inputDevice.deviceId; - } + /** + * Internal helper that returns complete device information, including both SDK and browser media device + * information for active device. + * + * Chrome note: + * 1) Only works if hosted under https. + * + * Firefox note: + * 1) Output devices not supported yet. See "https://bugzilla.mozilla.org/show_bug.cgi?id=934425" + * 2) The user must have provided permission to use the specific device to use it as a constraint. + * 3) GroupId not supported. + * + * General non-chrome browser note: + * 1) Returning output devices requires support for new Audio Output Devices API. + */ + function _doGetActiveSDKDevice_And_BrowserDevice() { + // Good error if using old browser: + if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) { + return Promise.reject(new Error('Your browser does not support required media api')); } - } - - if (groupId) { - deviceInfo.browserGroupId = groupId; - } - - if (label) { - deviceInfo.browserLabel = label; - } - - if (audioInputId) { - deviceInfo.browserAudioInputId = audioInputId; - } - - if (audioOutputId) { - deviceInfo.browserAudioOutputId = audioOutputId; - } - } else {// Do nothing if device information is missing. - } - } - /** - * Internal helper that returns complete device information, including both SDK and browser media device - * information for all devices. - * - * Chrome note: - * 1) Only works if hosted under https. - * - * Firefox note: - * 1) Output devices not supported yet. See "https://bugzilla.mozilla.org/show_bug.cgi?id=934425" - * 2) The user must have provided permission to use the specific device to use it as a constraint. - * 3) GroupId not supported. - * - * General non-chrome browser note: - * 1) Returning output devices requires support for new Audio Output Devices API. - */ - - - function _doGetSDKDevices_And_BrowserDevice() { - // Good error if using old browser: - if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) { - return Promise.reject(new Error('Your browser does not support required media api')); - } // Init completed ? - - - if (!initState.initialized) { - return Promise.reject(new Error("Browser integration not initialized")); - } // Browser security rules (for at least chrome) requires site to run under https for labels to be read. - - - if (location.protocol !== 'https:') { - return Promise.reject(new Error('Your browser needs https for lookup to work')); + // Init completed ? + if (!initState.initialized) { + return Promise.reject(new Error("Browser integration not initialized")); + } + // Browser security rules (for at least chrome) requires site to run under https for labels to be read. + if (location.protocol !== 'https:') { + return Promise.reject(new Error('Your browser needs https for lookup to work')); + } + // enumerateDevices requires user to have provided permission using getUserMedia for labels to be filled out. + return Promise.all([_doGetActiveSDKDevice(), navigator.mediaDevices.enumerateDevices()]).then(([deviceInfo, mediaDevices]) => { + fillInMatchingMediaInfo(deviceInfo, mediaDevices); + return deviceInfo; + }); } - - return Promise.all([_doGetSDKDevices(), navigator.mediaDevices.enumerateDevices()]).then(function (_ref) { - var _ref2 = _slicedToArray(_ref, 2), - deviceInfos = _ref2[0], - mediaDevices = _ref2[1]; - - deviceInfos.forEach(function (deviceInfo) { - fillInMatchingMediaInfo(deviceInfo, mediaDevices); - }); - return deviceInfos; - }); - } - /** - * Internal helper that returns complete device information, including both SDK and browser media device - * information for active device. - * - * Chrome note: - * 1) Only works if hosted under https. - * - * Firefox note: - * 1) Output devices not supported yet. See "https://bugzilla.mozilla.org/show_bug.cgi?id=934425" - * 2) The user must have provided permission to use the specific device to use it as a constraint. - * 3) GroupId not supported. - * - * General non-chrome browser note: - * 1) Returning output devices requires support for new Audio Output Devices API. - */ - - - function _doGetActiveSDKDevice_And_BrowserDevice() { - // Good error if using old browser: - if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) { - return Promise.reject(new Error('Your browser does not support required media api')); - } // Init completed ? - - - if (!initState.initialized) { - return Promise.reject(new Error("Browser integration not initialized")); - } // Browser security rules (for at least chrome) requires site to run under https for labels to be read. - - - if (location.protocol !== 'https:') { - return Promise.reject(new Error('Your browser needs https for lookup to work')); - } // enumerateDevices requires user to have provided permission using getUserMedia for labels to be filled out. - - - return Promise.all([_doGetActiveSDKDevice(), navigator.mediaDevices.enumerateDevices()]).then(function (_ref3) { - var _ref4 = _slicedToArray(_ref3, 2), - deviceInfo = _ref4[0], - mediaDevices = _ref4[1]; - - fillInMatchingMediaInfo(deviceInfo, mediaDevices); - return deviceInfo; - }); - } - - ; - /** - * Helper that pass boolean values through and parses strings to booleans. - */ - - function booleanOrString(arg) { - if (arg !== "" && (typeof arg === 'string' || _instanceof(arg, String))) { - return arg === 'true' || arg === '1'; - } else if (typeof arg === "boolean") { - return arg; - } else { - throw new Error("Illegal/missing argument - boolean or string expected"); + ; + /** + * Helper that pass boolean values through and parses strings to booleans. + */ + function booleanOrString(arg) { + if (arg !== "" && ((typeof arg === 'string') || (arg instanceof String))) { + return (arg === 'true' || arg === '1'); + } + else if (typeof (arg) === "boolean") { + return arg; + } + else { + throw new Error("Illegal/missing argument - boolean or string expected"); + } } - } - /** - * Helper that pass numbers through and parses strings to numbers. - */ - - - function numberOrString(arg) { - if (arg !== "" && (typeof arg === 'string' || _instanceof(arg, String))) { - return parseInt(arg); - } else if (typeof arg == 'number') { - return arg; - } else { - throw new Error("Illegal/missing argument - number or string expected"); + /** + * Helper that pass numbers through and parses strings to numbers. + */ + function numberOrString(arg) { + if (arg !== "" && ((typeof arg === 'string') || (arg instanceof String))) { + return parseInt(arg); + } + else if (typeof arg == 'number') { + return arg; + } + else { + throw new Error("Illegal/missing argument - number or string expected"); + } } - } - - ; - /** - * Helper that pass color array through and converts values to color array. - */ - - function colorOrString(arg) { - if (arg !== "" && (typeof arg === 'string' || _instanceof(arg, String))) { - var combinedValue = parseInt(arg, 16); - return [combinedValue >> 16 & 255, combinedValue >> 8 & 255, combinedValue & 255]; - } else if (typeof arg == 'number') { - var _combinedValue = arg; - return [_combinedValue >> 16 & 255, _combinedValue >> 8 & 255, _combinedValue & 255]; - } else if (Array.isArray(arg)) { - if (arg.length != 3) { - throw new Error("Illegal argument - wrong dimension of number array (3 expected)"); - } - - return arg; - } else { - throw new Error("Illegal/missing argument - number array or hex string expected"); + ; + /** + * Helper that pass color array through and converts values to color array. + */ + function colorOrString(arg) { + if (arg !== "" && ((typeof arg === 'string') || (arg instanceof String))) { + let combinedValue = parseInt(arg, 16); + return [(combinedValue >> 16) & 255, (combinedValue >> 8) & 255, combinedValue & 255]; + } + else if (typeof arg == 'number') { + let combinedValue = arg; + return [(combinedValue >> 16) & 255, (combinedValue >> 8) & 255, combinedValue & 255]; + } + else if (Array.isArray(arg)) { + if (arg.length != 3) { + throw new Error("Illegal argument - wrong dimension of number array (3 expected)"); + } + return arg; + } + else { + throw new Error("Illegal/missing argument - number array or hex string expected"); + } } - } - - ; + ; })(jabra || (jabra = {})); - -; \ No newline at end of file +; +//# sourceMappingURL=jabra.browser.integration-2.0.js.map \ No newline at end of file diff --git a/public/index.html b/public/index.html index d48080c..3140d4e 100644 --- a/public/index.html +++ b/public/index.html @@ -14,7 +14,7 @@ - + @@ -58,14 +58,18 @@ - + - + + + + + diff --git a/public/scripts/app.80a701c6.js b/public/scripts/app.80a701c6.js deleted file mode 100644 index 1f0b35d..0000000 --- a/public/scripts/app.80a701c6.js +++ /dev/null @@ -1 +0,0 @@ -!function(){"use strict";angular.module("app.auth",[])}(),function(){"use strict";angular.module("app.core",["ngAnimate","ngAria","ngCookies","ngMessages","ngResource","ngSanitize","ngMaterial","pascalprecht.translate","ui.router","ui.router.state.events","gridster","ds.clock","angucomplete-alt"])}(),function(){"use strict";function e(e,n){e.state("app.errors_error-404",{url:"/errors/error-404",views:{"main@":{templateUrl:"app/core/layouts/content-only.html",controller:"MainController as vm"},"content@app.errors_error-404":{templateUrl:"app/errors/404/error-404.html",controller:"Error404Controller as vm"}},params:{status:404,statusText:"",data:{},config:{}},bodyClass:"error-404"}),n.addPart("app/errors/404")}e.$inject=["$stateProvider","$translatePartialLoaderProvider"],angular.module("app.errors.error-404",[]).config(e)}(),function(){"use strict";function e(e,n){e.state("app.errors_error-500",{url:"/errors/error-500",views:{"main@":{templateUrl:"app/core/layouts/content-only.html",controller:"MainController as vm"},"content@app.errors_error-500":{templateUrl:"app/errors/500/error-500.html",controller:"Error500Controller as vm"}},params:{status:500,statusText:"",data:{},config:{}},bodyClass:"error-500"}),n.addPart("app/errors/500")}e.$inject=["$stateProvider","$translatePartialLoaderProvider"],angular.module("app.errors.error-500",[]).config(e)}(),function(){"use strict";angular.module("app.errors",["app.errors.error-404","app.errors.error-500"])}(),function(){"use strict";function e(e){e.addPart("app/footer")}e.$inject=["$translatePartialLoaderProvider"],angular.module("app.footer",[]).config(e)}(),function(){"use strict";function e(e,n){e.state("app.forgot",{url:"/forgot",views:{"main@":{templateUrl:"app/core/layouts/content-only.html",controller:"MainController as vm"},"content@app.forgot":{templateUrl:"app/forgot/forgot.html",controller:"ForgotPasswordController as vm"}},bodyClass:"forgot"}),n.addPart("app/forgot")}e.$inject=["$stateProvider","$translatePartialLoaderProvider"],angular.module("app.forgot",[]).config(e)}(),function(){"use strict";function e(e){e.addPart("app/header")}e.$inject=["$translatePartialLoaderProvider"],angular.module("app.header",[]).config(e)}(),function(){"use strict";angular.module("motion",["angular-toasty","app.core","app.auth","app.navigation","app.toolbar","app.quick-panel","app.header","app.footer","app.dashboards","app.staff","app.contactmanager","app.voice","app.chat","app.mail","app.sms","app.openchannel","app.fax","app.tools","app.callysquare","app.analytics","app.integrations","app.settings","app.motiondialer","app.help","app.jscripty","app.marketplace","app.plugins","app.video","app.login","app.forgot","app.reset","app.errors"])}(),function(){"use strict";function e(e,n){e.state("app.login",{url:"/login?token&userId",views:{"main@":{templateUrl:"app/core/layouts/content-only.html",controller:"MainController as vm"},"content@app.login":{templateUrl:"app/login/login.html",controller:"LoginController as vm"}},bodyClass:"login"}),n.addPart("app/login")}e.$inject=["$stateProvider","$translatePartialLoaderProvider"],angular.module("app.login",[]).config(e)}(),function(){"use strict";function e(e,n,t,a){e.state("app.analytics",{abstract:!0,url:"/analytics"}).state("app.analytics.metrics",{url:"/metrics",views:{"content@app":{templateUrl:"app/main/apps/analytics/views/metrics/metrics.html",controller:"MetricsController as vm"}},resolve:{metrics:["apiResolver","Auth",function(e,n){return n.hasRole("admin")?e.resolve("analyticMetric@get",{fields:"createdAt,updatedAt,id,name,table,metric,description",sort:"-updatedAt",limit:10,offset:0}):e.resolve("userProfile@getResources",{id:n.getCurrentUser().userProfileId,section:"Metrics",fields:"createdAt,updatedAt,id,name,table,metric,description",sort:"-updatedAt",limit:10,offset:0})}],userProfile:["apiResolver","Auth",function(e,n){return n.hasRole("admin")?null:e.resolve("userProfile@get",{fields:"id,name,crudPermissions",id:n.getCurrentUser().userProfileId})}],userProfileSection:["apiResolver","Auth",function(e,n){return n.hasRole("admin")?null:e.resolve("userProfileSection@get",{fields:"id,name,enabled,includeAll,autoAssociation,crudPermissions",userProfileId:n.getCurrentUser().userProfileId,sectionId:1201})}]},authenticate:!0,permissionId:1201,bodyClass:"analytics"}).state("app.analytics.extractedReports",{url:"/extractedReports",views:{"content@app":{templateUrl:"app/main/apps/analytics/views/extractedReports/extractedReports.html",controller:"ExtractedReportsController as vm"}},resolve:{extractedReports:["apiResolver","Auth",function(e,n){return n.hasRole("admin")?e.resolve("analyticExtractedReport@get",{fields:"createdAt,updatedAt,id,name,basename,savename,type,startDate,endDate,status,output,reportId,reportType",sort:"-updatedAt",limit:10,offset:0}):e.resolve("userProfile@getResources",{id:n.getCurrentUser().userProfileId,section:"ExtractedReports",fields:"createdAt,updatedAt,id,name,basename,savename,type,startDate,endDate,status,output,reportId,reportType",sort:"-updatedAt",limit:10,offset:0})}],userProfile:["apiResolver","Auth",function(e,n){return n.hasRole("admin")?null:e.resolve("userProfile@get",{fields:"id,name,crudPermissions",id:n.getCurrentUser().userProfileId})}],userProfileSection:["apiResolver","Auth",function(e,n){return n.hasRole("admin")?null:e.resolve("userProfileSection@get",{fields:"id,name,enabled,includeAll,autoAssociation,crudPermissions",userProfileId:n.getCurrentUser().userProfileId,sectionId:1202})}]},authenticate:!0,permissionId:1202,bodyClass:"analytics"}),n.addPart("app/main/apps/analytics")}e.$inject=["$stateProvider","$translatePartialLoaderProvider","msApiProvider","msNavigationServiceProvider"],angular.module("app.analytics",["ngCsv","ngPassword","md.data.table","flow","mdColorPicker","ckeditor","ng-sortable","ngAria","ngAnimate","mdPickers","mwFormBuilder","mwFormViewer","mwFormUtils","ngclipboard","angular-cron-jobs","ngEmbed","angularMaterialFormBuilder","material.components.expansionPanels","chart.js","angular.filter","app.analytics.reports"]).config(e)}(),function(){"use strict";function e(e){e.state("app.analytics.reports",{url:"/reports",views:{"content@app":{templateUrl:"app/main/apps/analytics/views/reports/reports.html",controller:"ReportsController as vm"}},resolve:{treeReports:["apiResolver",function(e){return e.resolve("analyticTreeReport@get",{fields:"id,tree",limit:10,offset:0})}],userProfile:["apiResolver","Auth",function(e,n){return e.resolve("userProfile@get",{fields:"id,name,crudPermissions",id:n.getCurrentUser().userProfileId})}],userProfileSection:["apiResolver","Auth",function(e,n){return e.resolve("userProfileSection@get",{fields:"id,name,enabled,includeAll,autoAssociation,crudPermissions",userProfileId:n.getCurrentUser().userProfileId,sectionId:1203})}]},authenticate:!0,permissionId:1203,bodyClass:"analytics"}).state("app.analytics.reports.edit",{url:"/:id?tab",views:{"content@app":{templateUrl:"app/main/apps/analytics/views/reports/edit/view.html",controller:"ReportController as vm"}},resolve:{report:["apiResolver","$stateParams","$q","describeTable",function(e,n,a,i){var s;return e.resolve("analyticCustomReport@get",{fields:"createdAt,updatedAt,id,name,description,table,conditions,joins",id:n.id}).then(function(e){var n=[];if((s=e).joins)try{s.joins=JSON.parse(s.joins);for(var t=0;t');a.append(n),o(function(){!function(e,n){var t=n.find("code"),a=e.split("\n"),i=(a=a.filter(function(e){return e.trim().length}))[0].match(/^\s*/)[0],s=new RegExp("^"+i);a=a.map(function(e){return e.replace(s,"").replace(/\s+$/,"")});var o=hljs.highlight(r.language||r.lang,a.join("\n"),!0);o.value=o.value.replace(/=""<\/span>/gi,"").replace("","").replace("",""),t.append(o.value).addClass("highlight")}(e,n)},34,!1)}})}}}}e.$inject=["$timeout","$q","$interpolate"],angular.module("app.core").directive("hljs",e)}(),function(){"use strict";angular.module("app.core").directive("msAdvancedFilter",function(){return{restrict:"E",scope:{options:"="},controller:["$scope",function(l){l.conditions=[],l.getValues=function(e){l.options.getFieldValues(e);var n=null;switch(e.type){case"text":l.conditions=[{name:"Contains",value:"LIKE"},{name:"Equals",value:"="}];break;case"autocomplete":n=[];break;case"date":n={dateStart:null};break;case"number":l.conditions=[{name:"Equals",value:"="},{name:"Greater than",value:">"},{name:"Lower than",value:"<"}]}var t=-1<["select","autocomplete"].indexOf(e.type)?"is":l.options.selectedCondition,a=_.find(l.options.activeConditions,{name:e.name,condition:t});l.options.selectedValue=a?a.values:n},l.searchText=function(e,n){l.options.searchItem(e,n)},l.addNewCondition=function(e,n,t){var a,i,s=[];switch(e.type){case"select":case"autocomplete":i=_.map(t,"name").join(" or "),a={name:"Is",value:"IS"},s=t;break;case"date":var o=moment(t.dateStart).format("YYYY-MM-DD"),r=moment(t.dateEnd).add(23,"hours").add(59,"minutes").add(59,"seconds").format("YYYY-MM-DD");i="from "+o+" to "+r;break;default:a=n,i=t,s.push({name:t})}l.options.addCondition(e,a,t,i)},l.removeCondition=function(){_.isEmpty(l.options.activeConditions)&&l.options.getResults()},l.clearConditions=function(){l.options.activeConditions=[],l.options.getResults()},l.applyFilter=function(){l.options.getResults()}}],templateUrl:"app/core/directives/ms-advanced-filter/ms-advanced-filter.html"}})}(),function(){"use strict";function e(a,i,s,o){var r=this;function n(){var i=r.selectedField.options&&!_.isEmpty(r.selectedField.options.extraOperators),s=r.selectedField.options&&!_.isEmpty(r.selectedField.options.excludedOperators);r.availableOperators=_.filter(r.operators,function(n){var e=!n.applyTo||_.includes(n.applyTo,r.selectedField.type),t=i&&_.some(r.selectedField.options.extraOperators,function(e){return e===n.type}),a=_.includes(n.excludeFrom,r.selectedField.type)||s&&_.includes(r.selectedField.options.excludedOperators,n.type);if((e||t)&&!a)return n})}function e(){!r.value||_.isArray(r.value)&&_.isEmpty(r.value)?r.isValidCondition=!1:r.selectedOperator&&"$between"===r.selectedOperator.type?r.isValidCondition=!(!r.endRangeValue||!r.isValidRange):r.isValidCondition=!0}function t(){"number"===r.selectedField.type?_.isNumber(r.endRangeValue)?r.isValidRange=Number(r.endRangeValue)>Number(r.value):r.isValidRange=!0:"date"===r.selectedField.type&&(r.maxDateRange=moment(r.endRangeValue).subtract(1,"day"),r.isValidRange=!0),e()}function l(){return{name:r.selectedField.name,operator:a.instant("DASHBOARDS."+r.selectedOperator.translate),value:r.value,endValue:r.endRangeValue,displayValue:d(r.value),displayEndValue:d(r.endRangeValue),query:{column:r.selectedField.column,operator:r.selectedOperator.type,value:function(){var e,n=r.value,t=r.endRangeValue;switch(r.selectedField.type){case"date":var a=moment(n).utcOffset(0,!0).format("YYYY-MM-DD");if("$between"===r.selectedOperator.type){var i=moment(t).utcOffset(0,!0).format("YYYY-MM-DD");e=[a,i]}else e=a;break;case"number":e="$between"===r.selectedOperator.type?[n,t]:n;break;case"multiselect":var s=r.selectedField.options.field||"id";e=_.map(n,s);break;case"select":e=n.id;break;case"autocomplete":e=r.selectedOperator.isExtra?n:n.id;break;default:e=n}return e}()},disabled:!1}}function d(e){var n;if(e){switch(r.selectedField.type){case"date":n=moment(e).format("YYYY-MM-DD");break;case"multiselect":var t=_.map(e,function(e){return e.name});n="$eq"===r.selectedOperator.type?t.join(" or "):t.join(" and ");break;case"select":n=e.name;break;case"autocomplete":n=r.selectedOperator.isExtra?e:e.displayValue;break;default:n=e}return n}}function c(){r.value=null,r.endRangeValue=null,r.minDateRange=null,r.maxDateRange=null,r.isValidCondition=!1}r.operators=r.availableOperators=[{type:"$eq",symbol:"=",translate:"EQUALS",excludeFrom:["multiselect"]},{type:"$ne",symbol:"≠",translate:"IS_NOT_EQUAL",excludeFrom:["multiselect"]},{type:"$in",symbol:"∈",translate:"IS_AMONG",applyTo:["multiselect"]},{type:"$notIn",symbol:"∉",translate:"IS_NOT_AMONG",applyTo:["multiselect"]},{type:"$substring",symbol:"⊃",translate:"CONTAINS",applyTo:["text"]},{type:"$startsWith",symbol:"a..",translate:"STARTS_WITH",applyTo:["text"]},{type:"$endsWith",symbol:"..a",translate:"ENDS_WITH",applyTo:["text"]},{type:"$lt",symbol:"<",translate:"IS_LESS_THAN",applyTo:["date","number"]},{type:"$gt",symbol:">",translate:"IS_GREATER_THAN",applyTo:["date","number"]},{type:"$lte",symbol:"≤",translate:"IS_LESS_THAN_OR_EQUAL_TO",applyTo:["date","number"]},{type:"$gte",symbol:"≥",translate:"IS_GREATER_THAN_OR_EQUAL_TO",applyTo:["date","number"]},{type:"$between",symbol:"≬",translate:"IS_BETWEEN",applyTo:["date","number"]}],r.addCondition=function(){var e=l();r.options.conditions.push(e),c()},r.editCondition=function(e){r.pendingCondition=e,r.pendingCondition.style="md-amber-200-bg",r.selectedField=_.find(r.options.fields,["name",r.pendingCondition.name]),n(),r.selectedOperator=_.find(r.availableOperators,["type",r.pendingCondition.query.operator]),r.value=r.pendingCondition.value,r.endRangeValue=r.pendingCondition.endValue,r.isValidRange=!0,r.isValidCondition=!0},r.updateCondition=function(){var e=l(),n=_.findIndex(r.options.conditions,"style");r.options.conditions.splice(n,1,e),c(),r.pendingCondition.style=null,r.pendingCondition=void 0},r.cancelUpdateCondition=function(){r.pendingCondition.style=null,r.pendingCondition=void 0},r.setConditionStatus=function(e){e.style=e.disabled?void 0:"chip-disabled",e.disabled=!e.disabled},r.removeCondition=function(){_.isEmpty(r.options.conditions)&&r.clearFilter()},r.getValues=function(){var n=angular.copy(r.selectedField.options.route);if("autocomplete"===r.selectedField.type)for(var e=0;e',compile:function(e){return e.addClass("ms-card"),function(e,n){e.cardTemplateLoaded=function(){e.$emit("msCard::cardTemplateLoaded",n)}}}}})}(),function(){"use strict";angular.module("app.core").directive("msChipColor",function(){return{restrict:"A",link:function(e,i,n){n.$observe("msChipColor",function(e){var n=i.parent().parent();if(_.isEmpty(e))if(n.hasClass("md-background-bg md-hue-3")){var t=n[0].className.split(" "),a=t.indexOf("md-hue-3");t.length=a+1,n[0].className=t.join(" ")}else n.addClass("md-background-bg md-hue-3");else n.addClass(e)})}}})}(),function(){"use strict";angular.module("app.core").directive("msClickToCall",function(){return{restrict:"E",scope:{type:"=",disabled:"=",target:"=",prefix:"=",license:"="},controller:["$scope","$rootScope","$http","$translate","$document","$mdDialog","Auth","toasty","api",function(t,n,a,i,s,o,e,r,l){function d(e){switch(t.currentUser.showWebBar){case 0:return m("http://127.0.0.1:"+(t.currentUser.phoneBarRemoteControlPort||"9888")+"/api/originate/"+c(e));case 2:return n.$broadcast("webrtc::call",{target:c(e)})}}function c(e){return _.isNil(e)?"":e.replace(/[^\w.+#*\-]+/g,"")}function m(e){return a.get(e).success(function(){r.success({title:"Successful call",msg:"Call properly handled!"})}).error(function(e){r.error({title:"PhoneBar API Error",msg:i.instant("CONTACTMANAGER.ERRORS.PHONEBAR_API")})})}t.currentUser=e.getCurrentUser(),t.showMenu=function(){return t.target&&t.target.indexOf("@")<0&&t.target!=t.currentUser.internal&&t.target!=t.currentUser.name&&(0==t.currentUser.showWebBar&&t.currentUser.phoneBarRemoteControl||2==t.currentUser.showWebBar&&t.license.webrtc)&&!t.disabled},t.call=function(e){return 2!==t.currentUser.showWebBar?(n=e,l.user.getVoicePrefixes({id:t.currentUser.id}).$promise.then(function(e){if(e.count)return o.show({controller:"PrefixDialogController",controllerAs:"vm",templateUrl:"assets/ms-phonebar/prefix/dialog.html",parent:angular.element(s.body),clickOutsideToClose:!0,locals:{prefixes:e,required:t.currentUser.phoneBarPrefixRequired}})}).then(function(e){t.currentUser.phoneBarPrefixRequired?e&&-1!==e&&d(e+n):e&&-1!==e?d(e+n):e||d(n)})):d(e);var n},t.transfer=function(e){switch(t.currentUser.showWebBar){case 0:return m("http://127.0.0.1:"+(t.currentUser.phoneBarRemoteControlPort||"9888")+"/api/transfer?number="+c(e));case 2:n.$broadcast("webrtc::transfer",{target:c(e)})}}}],templateUrl:"app/core/directives/ms-click-to-call/ms-click-to-call.html"}})}(),function(){"use strict";function e(i){return{require:"ngModel",priority:1,link:function(e,n,t,a){a.$formatters.push(i.formatter),a.$parsers.push(i.parser)}}}e.$inject=["msDatepickerFixConfig"],angular.module("app.core").provider("msDatepickerFixConfig",function(){var n={formatter:function(e){return e?""===e?e:new Date(e):""},parser:function(e){return e?moment(e).add(moment(e).utcOffset(),"m").toDate():""}};this.config=function(e){n=angular.extend({},n,e)},this.$get=function(){return n}}).directive("msDatepickerFix",e)}(),function(){"use strict";function e(s){return{restrict:"E",scope:{id:"=",model:"=",element:"=",title:"=",path:"="},replace:!0,link:function(n,e){var t=!1,a={};a.id=n.id,_.isNil(n.path)||(a.path=n.path);var i=document.createElement(n.element);i.setAttribute("preload","none"),i.setAttribute("controls","true"),"audio"===n.element&&i.setAttribute("style","width: 265px;"),"video"===n.element&&i.setAttribute("style","max-width: 500px;"),i.setAttribute("title",n.title),i.setAttribute("src"," "),i.onplay=function(e){t||(t=!0,e.preventDefault(),s[n.model].download(a).$promise.then(function(e){var n=[e.buffer],t=new Blob(n,{type:e.type});i.setAttribute("type",e.type),i.setAttribute("src",URL.createObjectURL(t)),i.play()}).catch(function(e){console.error(e)}))},e.append(i)}}}e.$inject=["api"],angular.module("app.core").directive("msDialogRecording",e)}(),function(){"use strict";angular.module("app.core").directive("msDualMultiselect",function(){return{restrict:"E",scope:{options:"="},controller:["$scope",function(o){o.canTransfer=function(e,n,t){if(!n.readOnly)return void 0!==e.isValid&&e.isValid?t?o.transfer(n.selectedItems,n.items,n.selectedItems.indexOf(e),t):o.transfer(n.items,n.selectedItems,n.items.indexOf(e),t):void 0},o.transfer=function(e,n,t,a){var i=[];if(0<=t)i.push(e[t]),n.push(e[t]),e.splice(t,1);else{for(var s=0;s',link:function(t,e){var n=e.emojioneArea({pickerPosition:t.pickerPosition,search:t.search,recentEmojis:t.recentEmojis,placeholder:a.instant(t.placeholder||"Type a message"),attributes:{spellcheck:!0},events:{keypress:function(e,n){t.ngModel=this.getText(),t.onReply({event:n,body:this.getText()})},emojibtn_click:function(){t.ngModel=this.getText()}}});t.ngModel&&n[0].emojioneArea.setText(t.ngModel),t.internalControl=t.ctrlMethods||{},t.internalControl.setText=function(e){n[0].emojioneArea.setText(e)},t.internalControl.getText=function(){return n[0].emojioneArea.getText()},t.$watch("ngModel",function(e){e||n[0].emojioneArea.setText("")})}}}e.$inject=["$translate"],angular.module("app.core").directive("msEmojiArea",e)}(),function(){"use strict";angular.module("app.core").directive("msFontFamily",function(){return{restrict:"E",scope:{ngModel:"="},controller:["$scope",function(e){e.fonts=[{option:"Arial",value:"Arial,Helvetica,sans-serif"},{option:"Century Gothic",value:"Century Gothic,Futura,Didact Gothic,san-serif"},{option:"Calibri",value:"Calibri, Verdana, Geneva, sans-serif"},{option:"Comic Sans MS",value:"Comic Sans MS,cursive"},{option:"Courier New",value:"Courier New,Courier,monospace"},{option:"Georgia",value:"Georgia,serif"},{option:"Lucida Sans Unicode",value:"Lucida Sans Unicode,Lucida Grande,sans-serif"},{option:"Tahoma",value:"Tahoma,Geneva,sans-serif"},{option:"Times New Roman",value:"Times New Roman,Times,serif"},{option:"Trebuchet MS",value:"Trebuchet MS,Helvetica,sans-serif"},{option:"Verdana",value:"Verdana,Geneva,sans-serif"}]}],templateUrl:"app/core/directives/ms-font-family/ms-font-family.html"}})}(),function(){"use strict";angular.module("app.core").controller("MsFormWizardController",function(){var n=this;function e(){return n.forms.length}function t(){return 0===n.selectedIndex}function a(){return n.selectedIndex===e()-1}n.forms=[],n.selectedIndex=0,n.registerForm=function(e){n.forms.push(e)},n.previousStep=function(){if(t())return;n.selectedIndex--},n.nextStep=function(){if(a())return;n.selectedIndex++},n.firstStep=function(){n.selectedIndex=0},n.lastStep=function(){n.selectedIndex=e()-1},n.totalSteps=e,n.isFirstStep=t,n.isLastStep=a,n.currentStepInvalid=function(){return angular.isDefined(n.forms[n.selectedIndex])&&n.forms[n.selectedIndex].$invalid},n.previousStepInvalid=function(){return 0d.options.responsive.md?d.options.responsive.md:d.columnCount:l("sm")?d.columnCount=d.columnCount>d.options.responsive.sm?d.options.responsive.sm:d.columnCount:d.columnCount=d.options.responsive.xs;d.columnWidth=d.containerPos.width/d.columnCount}(),r.$broadcast("msMasonry:relayoutStarted"),d.items=d.container.find("ms-masonry-item");for(var e=Array.apply(null,new Array(d.columnCount)).map(function(){return 0}),n=0;n'),r=angular.element('
'),l=n.parent();function d(){s.addClass("ms-nav-folded"),g.$broadcast("msNav::forceCollapse"),n.scrollTop(0),l.append(o),o.on("mouseenter touchstart",function(e){c(e),i=!0})}function c(e){angular.isDefined(e)&&e.preventDefault(),s.addClass("ms-nav-folded-open"),g.$broadcast("msNav::expandMatchingToggles"),l.find(o).remove(),l.parent().append(r),r.on("mouseenter touchstart",function(e){m(e),i=!1})}function m(e){angular.isDefined(e)&&e.preventDefault(),g.$broadcast("msNav::forceCollapse"),n.scrollTop(0),s.removeClass("ms-nav-folded-open"),l.parent().find(r).remove(),l.append(o),o.on("mouseenter touchstart",function(e){c(e),i=!0})}function u(){s.removeClass("ms-nav-folded ms-nav-folded-open"),g.$broadcast("msNav::expandMatchingToggles"),n.off("mouseenter mouseleave")}v.setFoldable(e,n,a),a?d():u(),e.toggleFold=function(){(a=!a)?d():u()},e.openFolded=c,e.closeFolded=m,e.isNavFoldedOpen=function(){return i},e.$on("$destroy",function(){o.off("mouseenter touchstart"),r.off("mouseenter touchstart"),n.off("mouseenter mouseleave")})}}}function n(t,a,i){return{restrict:"E",scope:{},controller:"MsNavController",compile:function(e){return e.addClass("ms-nav"),function(e){t.$broadcast("msNav::expandMatchingToggles");var n=t.$on("$stateChangeSuccess",function(){t.$broadcast("msNav::expandMatchingToggles"),a.when("navigation").then(function(e){e.close(),i.isNavFoldedOpen()&&i.closeFolded()})});e.$on("$destroy",function(){n()})}}}}function t(m,u,p,g){return{restrict:"A",require:"^msNav",scope:!0,compile:function(e,n){return e.addClass("ms-nav-toggle"),angular.isUndefined(n.collapsed)&&(n.collapsed=!0),e.attr("collapsed",n.collapsed),function(a,i,e,t){var s={expanded:"expanded",expandAnimation:"expand-animation",collapseAnimation:"collapse-animation"},n=i.find("a"),o=[],r=/\(.*\)/g;function l(){return"true"===i.attr("collapsed")}function d(){var e=u.defer();if(!l())return e.reject({error:!0}),e.promise;i.attr("collapsed",!1);var n=angular.element(i.find("ms-nav-toggle-items")[0]);n.css({position:"absolute",visibility:"hidden",display:"block",height:"auto"});var t=n[0].offsetHeight;return n.css({position:"",visibility:"",display:"",height:""}),a.$evalAsync(function(){p.animate(n,{display:"block",height:"0px"},{height:t+"px"},s.expandAnimation).then(function(){n.addClass(s.expanded),n.css({height:""}),e.resolve({success:!0})})}),e.promise}function c(){var e=u.defer();if(l())return e.reject({error:!0}),e.promise;i.attr("collapsed",!0);var n=angular.element(i.find("ms-nav-toggle-items")[0]),t=n[0].offsetHeight;return a.$evalAsync(function(){p.animate(n,{height:t+"px"},{height:"0px"},s.collapseAnimation).then(function(){n.removeClass(s.expanded),n.css({display:"",height:""}),e.resolve({success:!0})})}),e.promise}angular.forEach(n,function(e){var n=angular.element(e).attr("ui-sref");angular.isUndefined(n)||(n=n.replace(r,""),o.push(n))}),t.setToggleItem(i,a),i.children(".ms-nav-button").on("click",function(){if(t.isDisabled())return;t.disable(),l()?(t.clearLockedItems(),a.$emit("msNav::pushToLockedList"),m.$broadcast("msNav::collapse"),d().then(function(){t.enable()})):a.$broadcast("msNav::forceCollapse")}),a.$on("$destroy",function(){i.children(".ms-nav-button").off("click")}),a.$on("msNav::collapse",function(){var e=t.getLockedItems(),n=!1;angular.forEach(e,function(e){angular.equals(e.scope,a)&&(n=!0)}),n||c().then(function(){t.enable()})}),a.$on("msNav::forceCollapse",function(){c().then(function(){t.enable()})}),a.$on("msNav::expandMatchingToggles",function(){var n=g.current.name,t=!1;angular.forEach(o,function(e){n===e&&(t=!0)}),t?d():c()}),a.$on("msNav::pushToLockedList",function(){t.setLockedItem(i,a)})}}}}e.$inject=["$document","$rootScope","msNavFoldService"],n.$inject=["$rootScope","$mdComponentRegistry","msNavFoldService"],t.$inject=["$rootScope","$q","$animate","$state"],angular.module("app.core").factory("msNavFoldService",function(){var t={};return{setFoldable:function(e,n){t={scope:e,element:n}},isNavFoldedOpen:function(){return t.scope.isNavFoldedOpen()},toggleFold:function(){t.scope.toggleFold()},openFolded:function(){t.scope.openFolded()},closeFolded:function(){t.scope.closeFolded()}}}).directive("msNavIsFolded",e).controller("MsNavController",function(){var e=this,n=!1,t=[],a=[];e.isDisabled=function(){return n},e.enable=function(){n=!1},e.disable=function(){n=!0},e.setToggleItem=function(e,n){t.push({element:e,scope:n})},e.getLockedItems=function(){return a},e.setLockedItem=function(e,n){a.push({element:e,scope:n})},e.clearLockedItems=function(){a=[]}}).directive("msNav",n).directive("msNavTitle",function(){return{restrict:"A",compile:function(e){return e.addClass("ms-nav-title"),function(){}}}}).directive("msNavButton",function(){return{restrict:"AE",compile:function(e){return e.addClass("ms-nav-button"),function(){}}}}).directive("msNavToggle",t)}(),function(){"use strict";function e(e,n){e.root?this.navigation=n.getNavigation(e.root):this.navigation=n.getNavigation(),this.toggleHorizontalMobileMenu=function(){angular.element("body").toggleClass("ms-navigation-horizontal-mobile-menu-active")},n.sort()}function n(c,m,u,p){return{restrict:"E",scope:{folded:"=",root:"@"},controller:"MsNavigationController as vm",templateUrl:"app/core/directives/ms-navigation/templates/vertical.html",transclude:!0,compile:function(e){return e.addClass("ms-navigation"),function(e,n){var t=angular.element("body"),a=angular.element('
'),i=angular.element('
'),s=u("navigation");function o(e){if(p.setFolded(e),e)c.$broadcast("msNavigation::collapse"),t.addClass("ms-navigation-folded"),r();else{var n=p.getActiveItem();n&&n.scope.$emit("msNavigation::stateMatched"),t.removeClass("ms-navigation-folded ms-navigation-folded-open"),i.remove()}}function r(){n.parent().append(a),m(function(){a.on("mouseenter touchstart",l)})}function l(e){e&&e.preventDefault(),p.setFoldedOpen(!0);var n=p.getActiveItem();n&&n.scope.$emit("msNavigation::stateMatched"),t.addClass("ms-navigation-folded-open"),a.remove(),t.find("#main").append(i),i.on("mouseenter touchstart",d)}function d(e){e&&e.preventDefault(),p.setFoldedOpen(!1),c.$broadcast("msNavigation::collapse"),t.removeClass("ms-navigation-folded-open"),i.remove(),r()}p.setNavigationScope(e),function(){null===p.getFolded()&&p.setFolded(e.folded);p.getFolded()&&(m(function(){c.$broadcast("msNavigation::collapse")}),t.addClass("ms-navigation-folded"),r())}(),e.$watch(function(){return s.isLockedOpen()},function(e,n){if(!angular.isUndefined(e)&&!angular.equals(e,n)&&p.getFolded())if(e)c.$broadcast("msNavigation::collapse");else{var t=p.getActiveItem();t&&t.scope.$emit("msNavigation::stateMatched")}}),e.$watch("folded",function(e,n){angular.isUndefined(e)||angular.equals(e,n)||o(e)}),e.toggleFolded=function(){o(!p.getFolded())},e.$on("$stateChangeStart",function(){s.close()}),e.$on("$destroy",function(){i.off("mouseenter touchstart"),a.off("mouseenter touchstart")})}}}}function t(t,e,a,i,n,s){var o=this;o.element=e,o.node=t.node,o.hasChildren=void 0,o.collapsed=void 0,o.collapsable=void 0,o.group=void 0,o.animateHeightClass="animate-height",o.toggleCollapsed=function(){o.collapsed?o.expand():o.collapse()},o.collapse=function(){var e=o.element.children("ul"),n=e[0].offsetHeight;t.$evalAsync(function(){o.collapsed=!0,o.element.addClass("collapsing"),i.animate(e,{display:"block",height:n+"px"},{height:"0px"},o.animateHeightClass).then(function(){e.css({display:"",height:""}),o.element.removeClass("collapsing")}),t.$broadcast("msNavigation::collapse")})},o.expand=function(){var e=o.element.children("ul");e.css({position:"absolute",visibility:"hidden",display:"block",height:"auto"});var n=e[0].offsetHeight;e.css({position:"",visibility:"",display:"",height:""}),t.$evalAsync(function(){o.collapsed=!1,o.element.addClass("expanding"),i.animate(e,{display:"block",height:"0px"},{height:n+"px"},o.animateHeightClass).then(function(){e.css({height:""}),o.element.removeClass("expanding")}),a.$broadcast("msNavigation::collapse",o.node._path)})},o.getClass=function(){return o.node.class},o.isHidden=function(){if(angular.isDefined(o.node.hidden)&&angular.isFunction(o.node.hidden))return o.node.hidden();return!1},function(){o.hasChildren=0 target, inbound, fullname",e,n,t),u.calls.unshift({target:e,fullname:t||e,inbound:n,time:moment().format("HH:mm")}),50 data",e),this.remotePlayer.srcObject=e.stream,this.remotePlayer.play()}function S(e){console.debug("onNewRTCSession -> data",e);var n=e.session,t=!0;switch(e.originator){case"local":n.outgoing=!0,n.name=e.request.ruri.user,n.user=e.request.ruri.user,b(n.user,!1);break;case"remote":var a=m.getCurrentUser();a.voicePause&&a.phoneBarDnd?t=!1:(n.incoming=!0,n.name=e.request.from.display_name,n.user=e.request.from.uri.user,function(n){console.debug("getNotification -> session",n);var e=n.name?n.name+" <"+n.user+">":n.user;c.create("Incoming call from: ",e,null,function(){n.answer(u.sessionConf)},function(){n.terminate()}).then(function(e){n.notification=e}).catch(function(e){console.error(e)})}(e.session),b(e.session.user,!0),u.conf.autoAnswer&&s(function(){n.isInProgress()&&(n.autoAnswer=!0,u.conf.microphoneId?u.sessionConf.mediaConstraints.audio={deviceId:u.conf.microphoneId}:u.sessionConf.mediaConstraints.audio=!0,n.answer(u.sessionConf))},u.conf.autoAnswerDelay?1e3*u.conf.autoAnswerDelay:0))}t?(u.isJabraEnabled&&jabra.ring(),n.call_id=e.request.call_id,n.connection&&(n.connection.onaddstream=y.bind(this)),n.on("progress",function(e,n){console.debug("onProgress -> session, data",e,n);var t=!1;switch(n.originator){case"local":this.conf.ringingMute||(this.soundPlayer.setAttribute("src","assets/ms-phonebar/sounds/incoming-call.ogg"),t=!0);break;case"remote":this.putOtherCallsOnHold(e),this.soundPlayer.setAttribute("src","assets/ms-phonebar/sounds/outgoing-call.ogg"),t=!0}t&&(this.soundPlayer.loop="loop",this.soundPlayer.play().catch(function(e){console.log(e.message)}))}.bind(this,n)),n.on("confirmed",function(t,e){console.debug("onConfirmed -> session, data",t,e);var n=document.getElementById("div_session_"+t.id.substr(0,32));return n&&$(n).scope().$broadcast("timer-start"),t.confirmed=!0,"remote"===e.originator&&t.connection&&(t.connection.onaddstream=y.bind(this),_.head(t.connection.getRemoteStreams())&&(this.remotePlayer.srcObject=_.head(t.connection.getRemoteStreams()),this.remotePlayer.play())),this.soundPlayer.pause(),this.soundPlayer.loop=null,this.putOtherCallsOnHold(t),f("speaker"),f("microphone"),t.autoAnswer&&(this.soundPlayer.setAttribute("src","assets/ms-phonebar/sounds/beep.ogg"),this.soundPlayer.play().catch(function(e){console.log(e.message)})),2==u.sessions.length?u.canGoInConference=!0:u.canGoInConference=!1,u.isJabraEnabled&&(jabra.offHook(),u.jabraSession=t),d.rpc.getVoiceChannels().$promise.then(function(e){var n=_.find(e.rows,function(e){return e.sipcalllinkedid===t.call_id?e:e.sipcalluniqueid===t.call_id?e:null});n&&(t.monitor=n.monitor,t.uniqueid=n.uniqueid,t.monitors=n.monitors)}).catch(function(e){console.error(e)})}.bind(this,n)),n.on("hold",function(e,n){console.debug("onHold -> session, data",e,n),"local"===n.originator&&(e.localHold=!0)}.bind(this,n)),n.on("unhold",function(e,n){console.debug("onUnhold -> session, data",e,n),"local"===n.originator&&(e.localHold=!1)}.bind(this,n)),n.on("ended",function(e,n){console.debug("onEnded -> session, data",e,n),u.isInConference?_.includes(u.currentConferenceSessions,e.id)&&(x(),u.buttonClicked=!0,u.isJabraEnabled&&!u.jabraClicked?h(e.id,!1).then(function(e){u.jabraSession=e,jabra.offHook()}):jabra.offHook(),u.jabraClicked=!1):u.isJabraEnabled&&(u.jabraSession=null,jabra.onHook()),_.remove(this.sessions,{id:e.id}),2!==u.sessions.length&&(u.canGoInConference=!1)}.bind(this,n)),n.on("failed",function(e,n){console.debug("onFailed -> session, data",e,n),this.soundPlayer.pause(),this.soundPlayer.loop=null,e.notification&&e.notification.close(),u.isInConference&&_.includes(u.currentConferenceSessions,e.id)&&x(),_.remove(this.sessions,{id:e.id}),2!==u.sessions.length&&(u.canGoInConference=!1),u.isJabraEnabled&&jabra.onHook()}.bind(this,n)),this.sessions.push(n),i.$$phase||i.$root.$$phase||i.$apply()):n.terminate()}function T(){u.target="",document.getElementById("ms-target").blur(),document.getElementById("ms-target").value="",i.$broadcast("angucomplete-alt:clearInput","ms-target-wrap")}function I(e,n,t,a){return console.debug("onReferCallback -> session, textContent, position, delay",e,n,t,a),function(){o.show(o.simple().textContent(n).position(t).hideDelay(a)),e.terminate()}}function C(n){return d.user.getVoicePrefixes({id:u.conf.id}).$promise.then(function(e){if(e.count)return a.show({controller:"PrefixDialogController",controllerAs:"vm",templateUrl:"assets/ms-phonebar/prefix/dialog.html",parent:angular.element(t.body),clickOutsideToClose:!0,locals:{prefixes:e,required:u.conf.phoneBarPrefixRequired}})}).then(function(e){if(u.conf.phoneBarPrefixRequired){if(e&&-1!==e)return e+n}else{if(e&&-1!==e)return e+n;if(!e)return n}})}function O(){new AudioContext;if(u.isInConference){var e=u.sessions[0].connection.getReceivers()[0],n=u.sessions[1].connection.getReceivers()[0],t=new MediaStream;t.addTrack(e.track),t.addTrack(n.track);var a=document.getElementById("remote-audio");a.srcObject=t;var i=a.play();void 0!==i&&i.then(function(){}).catch(function(e){console.log(e)})}}function x(){u.canGoInConference=!1,u.isInConference=!1,u.currentconferenceSessions=[]}e(function(){},999),u.direction="right",u.selectedMode="md-scale",u.target="",u.showDialpad=!1,u.soundPlayer=document.createElement("audio"),u.remotePlayer=document.getElementById(u.conf.remotePlayerId),u.soundPlayer.volume=1,u.sessionConf={mediaConstraints:{audio:!0,video:!1}},u.sessions=[],u.calls=[],u.canGoInConference=!1,u.isInConference=!1,u.currentConferenceSessions=[],u.ua=new JsSIP.UA({sockets:[new JsSIP.WebSocketInterface("wss://"+u.conf.host+":8089/ws")],uri:new JsSIP.URI("sip",u.conf.name,u.conf.host,5060,null,null).toString(),authorization_user:u.conf.name,ha1:u.conf.ha1,realm:u.conf.realm,user_agent:u.conf.ua,session_timers_refresh_method:"invite",register_expires:u.conf.phoneBarExpires||60,register:!0}),u.conf=_.merge(g.webrtc,u.conf),u.isJabraEnabled=!1,u.jabraSession=null,u.jabraClicked=!1,u.buttonClicked=!1,t.bind("keyup",function(e){switch(e.keyCode){case 27:s(function(){u.showDialpad=!1})}}),u.$onInit=function(){f("ringing"),f("speaker"),jabra.init().then(function(){return jabra.getInstallInfo()}).then(function(e){e.installationOk?v():u.isJabraEnabled=!1}),this.ua.on("registered",function(){this.registered=!0}.bind(this)),this.ua.on("unregistered",function(){this.registered=!1}.bind(this)),this.ua.on("newRTCSession",S.bind(this)),DetectRTC.load(function(){this.conf.hasMicrophone=DetectRTC.hasMicrophone,this.conf.hasSpeakers="Chrome"!==DetectRTC.browser.name&&"Edge"!==DetectRTC.browser.name&&"Opera"!==DetectRTC.browser.name||DetectRTC.hasSpeakers,this.conf.isWebRTCSupported=DetectRTC.isWebRTCSupported,this.conf.osName=DetectRTC.osName,this.conf.osVersion=DetectRTC.osVersion,this.conf.browserName=DetectRTC.browser.name,this.conf.browserVersion=DetectRTC.browser.version,A()?this.ua.start():this.conf.license||l.warning({title:r.instant("TOOLBAR.WARNING"),msg:r.instant("TOOLBAR.WEBRTC_LICENSE_NOT_ENABELD"),clickToClose:!0,showClose:!0,shake:!1,timeout:!1,position:"bottom-right"})}.bind(this))}.bind(this),u.type=function(e,n){var t=e;switch(u.target||(u.target=""),n&&(u.target+=e,i.$broadcast("angucomplete-alt:changeInput","ms-target-wrap",u.target)),e){case"*":t="asterisk";break;case"#":t="pound"}u.conf.enableDtmfTone&&(u.soundPlayer.setAttribute("src","assets/ms-phonebar/sounds/dialpad/"+t+".ogg"),u.soundPlayer.play().catch(function(e){console.log(e.message)}));for(var a=0;a session",e),e.hold({useUpdate:!1}),u.isJabraEnabled&&(jabra.hold(),jabra.onHook())},u.refer=function(n){console.debug("refer -> session",n);var e=a.prompt().title("Transfer").textContent("Type the target").placeholder("Target").ariaLabel("Target").ok("Transfer").cancel("Cancel");a.show(e).then(function(e){return C(e)}).then(function(e){n.refer(e,{eventHandlers:{requestSucceeded:I(n,"requestSucceeded","top right",3e3),requestFailed:I(n,"requestFailed","top right",3e3)}})})},u.record=function(e){console.debug("record -> session",e),a.show({controller:"RecordDialogController",controllerAs:"vm",templateUrl:"assets/ms-phonebar/record/dialog.html",parent:angular.element(t.body),clickOutsideToClose:!0,locals:{session:e,sessions:u.sessions}})},u.unhold=function(e){console.debug("unhold -> session",e),e.unhold({useUpdate:!1}),u.putOtherCallsOnHold(e),u.isJabraEnabled&&(jabra.resume(),jabra.offHook())},u.answer=function(e){console.debug("answer -> session",e),u.conf.microphoneId?u.sessionConf.mediaConstraints.audio={deviceId:u.conf.microphoneId}:u.sessionConf.mediaConstraints.audio=!0,e.answer(u.sessionConf),u.isJabraEnabled&&(jabra.offHook(),u.jabraSession=e)},u.terminate=function(e){console.debug("terminate -> session",e),e.terminate(),u.isJabraEnabled&&0===u.sessions.length&&jabra.onHook()},u.selectSession=function(e){console.debug("selectSession -> session",e),e.unhold({useUpdate:!1}),u.putOtherCallsOnHold(e)},u.typeWrapper=function(e){switch(e.key.toLowerCase()){case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case"*":case"#":u.type(e.key);break;case"enter":u.call()}},u.toggleDialpad=function(){u.showDialpad=!u.showDialpad},u.referAttended=function(e){console.debug("referAttended -> session",e),a.show({controller:"ReferAttendedDialogController",controllerAs:"vm",templateUrl:"assets/ms-phonebar/referAttended/dialog.html",parent:angular.element(t.body),clickOutsideToClose:!0,locals:{session:e,sessions:_.reject(u.sessions,{id:e.id})}})},u.closeDialpad=function(){u.showDialpad=!1},u.initDevice=f,u.putOtherCallsOnHold=function(e){if(console.debug("putOtherCallsOnHold -> session",e),1 evt, data",e,n),n.target&&(u.target=n.target,u.call())}),i.$on("webrtc::transfer",function(e,n){if(console.debug("onRemoteTransfer -> evt, data",e,n),n.target)for(var t=0;t');n.after(t),t.append(n)}}})}(),function(){"use strict";function e(s,o,n,t){return{restrict:"AE",compile:function(e){if(!(t.getConfig("disableCustomScrollbars")||t.getConfig("disableCustomScrollbarsOnMobile")&&n.isMobile()))return e.addClass("ms-scroll"),function(e,n,t){var a={};function i(){PerfectScrollbar.update(n[0])}t.msScroll&&(a=e.$eval(t.msScroll)),a=angular.extend({},o.getConfig(),a),s(function(){PerfectScrollbar.initialize(n[0],a)},0),n.on("mouseenter",i),e.$watch(function(){return n.prop("scrollHeight")},function(e,n){angular.isUndefined(e)||angular.equals(e,n)||i()}),e.$watch(function(){return n.prop("scrollWidth")},function(e,n){angular.isUndefined(e)||angular.equals(e,n)||i()}),e.$on("$destroy",function(){n.off("mouseenter"),PerfectScrollbar.destroy(n[0])})}}}}e.$inject=["$timeout","msScrollConfig","msUtils","motionConfig"],angular.module("app.core").provider("msScrollConfig",function(){var n={wheelSpeed:1,wheelPropagation:!1,swipePropagation:!0,minScrollbarLength:null,maxScrollbarLength:null,useBothWheelAxes:!1,useKeyboard:!0,suppressScrollX:!1,suppressScrollY:!1,scrollXMarginOffset:0,scrollYMarginOffset:0,stopPropagationOnClick:!0};this.config=function(e){n=angular.extend({},n,e)},this.$get=function(){var e={getConfig:function(){return n}};return e}}).directive("msScroll",e)}(),function(){"use strict";function e(s,i,e){var o=this;o.collapsed=!0,o.query=void 0,o.queryOptions={debounce:o.debounce||0};var n=!(!o.collapseOnBlur||"true"!=o.collapseOnBlur);o.resultsLoading=!1,o.results=null,o.selectedResultIndex=0,o.ignoreMouseEvents=!1,o.onInit=function(){s.$watch("MsSearchBar.query",function(e,n){if(!angular.isUndefined(e)&&!angular.equals(e,n)){if(o.collapsed){if(!e)return;s.expand()}var t=s.$parent.$eval(o.onSearch,{query:e}),a=angular.isArray(t),i=t&&!!t.then;a&&o.populateResults(t),i&&(o.resultsLoading=!0,t.then(function(e){o.populateResults(e)},function(){o.populateResults([])}).finally(function(){o.resultsLoading=!1}))}})},o.populateResults=function(e){if(o.collapsed)return;var n=angular.isArray(e),t=null===e;if(!n&&!t)return;o.selectedResultIndex=0,o.results=e},o.expand=function(){o.collapsed=!1,s.expand(),o.onExpand&&angular.isFunction(o.onExpand)&&o.onExpand()},o.collapse=function(){o.query="",o.populateResults(null),o.collapsed=!0,s.collapse(),o.onCollapse&&angular.isFunction(o.onCollapse)&&o.onCollapse()},o.blurCollapse=function(){if(!n)return;o.collapse()},o.absorbEvent=function(e){e.preventDefault()},o.handleKeydown=function(e){var n=e.keyCode;-1<[27,38,40].indexOf(n)&&e.preventDefault();switch(n){case 13:if(!o.results)return;o.handleResultClick(o.results[o.selectedResultIndex]);break;case 27:o.collapse();break;case 38:0<=o.selectedResultIndex-1&&(o.selectedResultIndex--,o.ensureSelectedResultIsVisible());break;case 40:if(!o.results)return;o.selectedResultIndex+1t&&e.scrollTop(t),a>e.height()+e.scrollTop()&&e.scrollTop(a-e.height())}}}function n(i){return{restrict:"E",scope:{},require:"msSearchBar",controller:"MsSearchBarController as MsSearchBar",bindToController:{query:"=?",debounce:"=?",direction:"@",onSearch:"@",onResultClick:"&?",onExpand:"&?",onCollapse:"&?",collapseOnBlur:"@"},templateUrl:"app/core/directives/ms-search-bar/ms-search-bar.html",compile:function(e){return e.addClass("ms-search-bar"),function(e,n){var t,a=i.find("body");e.collapse=function(){n.removeClass("expanded"),a.removeClass("ms-search-bar-expanded")},e.expand=function(){n.addClass("expanded"),"down"===e.MsSearchBar.direction&&n.addClass("down");a.addClass("ms-search-bar-expanded"),t.focus()},t=n.find("#ms-search-bar-input")}}}}e.$inject=["$scope","$element","$timeout"],n.$inject=["$document"],angular.module("app.core").controller("MsSearchBarController",e).directive("msSearchBar",n)}(),function(){"use strict";function e(e,t,i,o,r,l){var d=this;d.query="",d.queryOptions={debounce:300},d.resultsLoading=!1,d.selectedResultIndex=0,d.ignoreMouseEvents=!1,d.mobileBarActive=!1,d.results=null,d.shortcuts=[],d.sortableOptions={ghostClass:"ghost",forceFallback:!0,fallbackClass:"dragging",onSort:function(){d.saveShortcuts()}},d.populateResults=function(){for(var e=[],n=l.getFlatNavigation(),t=r.defer(),a=0;a=d.shortcuts.length&&(d.selectedResultIndex=d.shortcuts.length-1)));d.saveShortcuts()},d.handleResultClick=function(e){e.hasShortcut?d.removeShortcut(e):d.addShortcut(e)},d.absorbEvent=function(e){e.preventDefault()},d.handleKeydown=function(e){var n=e.keyCode;-1<[38,40].indexOf(n)&&e.preventDefault();switch(n){case 13:d.handleResultClick(d.results[d.selectedResultIndex]);break;case 38:0<=d.selectedResultIndex-1&&(d.selectedResultIndex--,d.ensureSelectedResultIsVisible());break;case 40:d.selectedResultIndex+1t&&e.scrollTop(t),a>e.height()+e.scrollTop()&&e.scrollTop(a-e.height())}},d.toggleMobileBar=function(){d.mobileBarActive=!d.mobileBarActive},d.loadShortcuts().then(function(e){d.shortcuts=e,0i.steps.length)}i.mainForm=void 0,i.orientation="horizontal",i.steps=[],i.currentStep=void 0,i.currentStepNumber=1,i.setOrientation=function(e){i.orientation=e||"horizontal"},i.registerMainForm=function(e){i.mainForm=e},i.registerStep=function(e,n,t){var a={element:e,scope:n,form:t,stepNumber:n.step||i.steps.length+1,stepTitle:n.stepTitle,stepTitleTranslate:n.stepTitleTranslate};return i.steps.push(a),i.steps.sort(function(e,n){return e.stepNumber-n.stepNumber}),a},i.setupSteps=function(){i.setCurrentStep(i.currentStepNumber)},i.resetForm=function(){e(function(){for(var e=0;ee.scrollWidth&&0==e.scrollLeft&&0==n.scrollLeft?"right":n.scrollWidth>e.scrollWidth&&n.scrollLeft>e.scrollLeft&&e.scrollWidth+n.scrollLeft>=n.scrollWidth?"left":n.scrollWidth>e.scrollWidth&&n.scrollLeft>e.scrollLeft&&e.scrollWidth+n.scrollLeftt.position().top+i&&(m(function(){o=!0}),r.off("scroll",c))}}}}}e.$inject=["$timeout","$q"],angular.module("app.core").controller("MsTimelineController",function(){var n=this;n.scrollEl=void 0,n.setScrollEl=function(e){n.scrollEl=e},n.getScrollEl=function(){return n.scrollEl}}).directive("msTimeline",function(){return{scope:{msTimeline:"=?",loadMore:"&?msTimelineLoadMore"},controller:"MsTimelineController",compile:function(e){return e.addClass("ms-timeline"),function(e,n,t,a){var i=angular.element('
');n.append(i);var s={scrollEl:"#content"};s=angular.extend(s,e.msTimeline,{});var o=angular.element(s.scrollEl);a.setScrollEl(o);var r=144;function l(){o.scrollTop()+o.height()+r>i.position().top&&(i.addClass("show"),c(),e.loadMore().then(function(){i.removeClass("show"),d()},function(){i.remove()}))}function d(){o.on("scroll",l)}function c(){o.off("scroll",l)}d(),e.$on("$destroy",function(){c()})}}}}).directive("msTimelineItem",e)}(),function(){"use strict";function e(a,e,n,t,i,s,o,r,l){function d(){a.timeoutId&&clearTimeout(a.timeoutId)}function c(){void 0!==o.startTime&&(a.millis=moment().diff(moment(a.startTime))),a.maxTimeUnit&&"day"!==a.maxTimeUnit?"second"===a.maxTimeUnit?(a.seconds=Math.floor(a.millis/1e3),a.minutes=0,a.hours=0,a.days=0,a.months=0,a.years=0):"minute"===a.maxTimeUnit?(a.seconds=Math.floor(a.millis/1e3%60),a.minutes=Math.floor(a.millis/6e4),a.hours=0,a.days=0,a.months=0,a.years=0):"hour"===a.maxTimeUnit?(a.seconds=Math.floor(a.millis/1e3%60),a.minutes=Math.floor(a.millis/6e4%60),a.hours=Math.floor(a.millis/36e5),a.days=0,a.months=0,a.years=0):"month"===a.maxTimeUnit?(a.seconds=Math.floor(a.millis/1e3%60),a.minutes=Math.floor(a.millis/6e4%60),a.hours=Math.floor(a.millis/36e5%24),a.days=Math.floor(a.millis/36e5/24%30),a.months=Math.floor(a.millis/36e5/24/30),a.years=0):"year"===a.maxTimeUnit&&(a.seconds=Math.floor(a.millis/1e3%60),a.minutes=Math.floor(a.millis/6e4%60),a.hours=Math.floor(a.millis/36e5%24),a.days=Math.floor(a.millis/36e5/24%30),a.months=Math.floor(a.millis/36e5/24/30%12),a.years=Math.floor(a.millis/36e5/24/365)):(a.seconds=Math.floor(a.millis/1e3%60),a.minutes=Math.floor(a.millis/6e4%60),a.hours=Math.floor(a.millis/36e5%24),a.days=Math.floor(a.millis/36e5/24),a.months=0,a.years=0),a.secondsS=1===a.seconds||0===a.seconds?"":"s",a.minutesS=1===a.minutes||0===a.minutes?"":"s",a.hoursS=1===a.hours||0===a.hours?"":"s",a.daysS=1===a.days||0===a.days?"":"s",a.monthsS=1===a.months||0===a.months?"":"s",a.yearsS=1===a.years||0===a.years?"":"s",a.sseconds=a.seconds<10?"0"+a.seconds:a.seconds,a.mminutes=a.minutes<10?"0"+a.minutes:a.minutes,a.hhours=a.hours<10?"0"+a.hours:a.hours,a.ddays=a.days<10?"0"+a.days:a.days,a.mmonths=a.months<10?"0"+a.months:a.months,a.yyears=a.years<10?"0"+a.years:a.years}"function"!=typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),a.autoStart=o.autoStart||o.autostart,0===r.html().trim().length?r.append(l("{{millis}}")(a)):r.append(l(r.contents())(a)),a.interval=a.intervalAttr||1e3,a.startTime=null,a.endTime=null,a.timeoutId=null,a.countdown=a.countdownAttr&&0<=parseInt(a.countdownAttr,10)?parseInt(a.countdownAttr,10):void 0,a.isRunning=!1,a.$watch("startTimeAttr",function(e,n){e!==n&&a.isRunning&&a.start()}),a.$on("timer-start",function(){a.start()}),a.$on("timer-resume",function(){a.resume()}),a.$on("timer-stop",function(){a.stop()}),a.$on("timer-clear",function(){a.clear()}),a.$on("timer-set-countdown",function(e,n){a.countdown=n}),a.start=r[0].start=function(){var e=moment(),n=a.startTimeAttr?moment(a.startTimeAttr):null;a.startTime=!n||er.properties.length){var n=r.multiBarChart.series.length-r.properties.length;r.multiBarChart.series.splice(0,n),r.multiBarChart.data.splice(0,n)}for(var t=0;tr.filter.length){var a=r.multiBarChart.labels.length-r.filter.length;r.multiBarChart.labels.splice(0,a),r.multiBarChart.data[t].splice(0,a)}for(var i=0,s=0;io.properties.length){var n=o.pieChart.labels.length-o.properties.length;o.pieChart.labels.splice(0,n),o.pieChart.data.splice(0,n)}for(var t=0,a=0;t]+>/gm,"")}}).filter("nospace",function(){return function(e){return e?e.replace(/ /g,""):""}}).filter("humanizeDoc",function(){return function(e){if(e)return"directive"===e.type?e.name.replace(/([A-Z])/g,function(e){return"-"+e.toLowerCase()}):e.label||e.name}})}(),function(){"use strict";angular.module("app.core").filter("filterByIds",function(){return function(e,n){if(0===e.length||!n)return e;if(0===n.length)return[];for(var t=[],a=0;a')).html(i),s.append(o)})},rgba:l};function l(e,n){var t=n||!1;return 4===e.length&&255===e[0]&&255===e[1]&&255===e[2]&&e.splice(3,4),t&&(e=function(e,n){var t={white:{1:"1",2:"0.7",3:"0.3",4:"0.12"},black:{1:"0.87",2:"0.54",3:"0.26",4:"0.12"}};255===e[0]&&255===e[1]&&255===e[2]?e[3]=t.white[n]:0===e[0]&&0===e[1]&&0===e[2]&&(e[3]=t.black[n]);return e}(e,t)),3===e.length?"rgb("+e.join(",")+")":4===e.length?"rgba("+e.join(",")+")":void a.error("Invalid number of arguments supplied in the color array: "+e.length+"\nThe array must have 3 or 4 colors.")}function d(e){return e.charAt(0).toUpperCase()+e.slice(1)}}e.$inject=["$cookies","$log","motionTheming"],angular.module("app.core").factory("motionGenerator",e)}(),function(){"use strict";angular.module("app.core").constant("motionPalettes",[{name:"motion-blue",options:{50:"#ebf1fa",100:"#c2d4ef",200:"#9ab8e5",300:"#78a0dc",400:"#5688d3",500:"#3470ca",600:"#2e62b1",700:"#275498",800:"#21467e",900:"#1a3865",A100:"#c2d4ef",A200:"#9ab8e5",A400:"#5688d3",A700:"#275498",contrastDefaultColor:"light",contrastDarkColors:"50 100 200 A100",contrastStrongLightColors:"300 400"}},{name:"motion-paleblue",options:{50:"#ececee",100:"#c5c6cb",200:"#9ea1a9",300:"#7d818c",400:"#5c616f",500:"#3c4252",600:"#353a48",700:"#2d323e",800:"#262933",900:"#1e2129",A100:"#c5c6cb",A200:"#9ea1a9",A400:"#5c616f",A700:"#2d323e",contrastDefaultColor:"light",contrastDarkColors:"50 100 200 A100",contrastStrongLightColors:"300 400"}}])}(),function(){"use strict";angular.module("app.core").constant("motionThemes",{default:{primary:{name:"motion-paleblue",hues:{default:"700","hue-1":"500","hue-2":"600","hue-3":"400"}},accent:{name:"light-blue",hues:{default:"600","hue-1":"400","hue-2":"700","hue-3":"A100"}},warn:{name:"red"},background:{name:"grey",hues:{default:"A100","hue-1":"A100","hue-2":"100","hue-3":"300"}}},pinkTheme:{primary:{name:"blue-grey",hues:{default:"800","hue-1":"600","hue-2":"400","hue-3":"A100"}},accent:{name:"pink",hues:{default:"400","hue-1":"300","hue-2":"600","hue-3":"A100"}},warn:{name:"blue"},background:{name:"grey",hues:{default:"A100","hue-1":"A100","hue-2":"100","hue-3":"300"}}},tealTheme:{primary:{name:"motion-blue",hues:{default:"900","hue-1":"600","hue-2":"500","hue-3":"A100"}},accent:{name:"teal",hues:{default:"500","hue-1":"400","hue-2":"600","hue-3":"A100"}},warn:{name:"deep-orange"},background:{name:"grey",hues:{default:"A100","hue-1":"A100","hue-2":"100","hue-3":"300"}}}})}(),function(){"use strict";function e(t,e,n){var a;angular.injector(["ngCookies"]).invoke(["$cookies",function(e){a=e}]);var i=a.getObject("motion.customTheme");i&&(n.custom=i),t.alwaysWatchTheme(!0),angular.forEach(e,function(e){t.definePalette(e.name,e.options)}),angular.forEach(n,function(e,n){t.theme(n).primaryPalette(e.primary.name,e.primary.hues).accentPalette(e.accent.name,e.accent.hues).warnPalette(e.warn.name,e.warn.hues).backgroundPalette(e.background.name,e.background.hues)})}e.$inject=["$mdThemingProvider","motionPalettes","motionThemes"],angular.module("app.core").config(e)}(),function(){"use strict";function e(n,t,e){var a={getRegisteredPalettes:function(){return e.PALETTES},getRegisteredThemes:function(){return e.THEMES},setActiveTheme:function(e){if(angular.isUndefined(a.themes.list[e]))return angular.isUndefined(a.themes.list.default)?void t.error('You must have at least one theme named "default"'):(t.warn('The theme "'+e+'" does not exist! Falling back to the "default" theme.'),a.themes.active.name="default",a.themes.active.theme=a.themes.list.default,void n.put("motion.selectedTheme",a.themes.active.name));a.themes.active.name=e,a.themes.active.theme=a.themes.list[e],n.put("motion.selectedTheme",e)},setThemesList:function(e){a.themes.list=e},themes:{list:{},active:{name:"",theme:{}}}};return a}e.$inject=["$cookies","$log","$mdTheming"],angular.module("app.core").service("motionTheming",e)}(),function(){"use strict";function e(n,s,o,r){this.search=function(n){for(var e=[],t=r.getFlatNavigation(),a=o.defer(),i=0;i"+(e.name||"extractedReport")+" will be deleted.").ariaLabel("delete extractedReport").targetEvent(n).ok("OK").cancel("CANCEL");i.show(t).then(function(){S(e)},function(){console.log("CANCEL")})},b.success=y,b.getExtractedReports=function(){b.query.offset=(b.query.page-1)*b.query.limit,g.hasRole("admin")?b.promise=m.analyticExtractedReport.get(b.query,y).$promise:(b.query.id=b.userProfile.id,b.query.section="ExtractedReports",b.promise=m.userProfile.getResources(b.query,y).$promise)},b.createOrEditExtractedReport=function(e,n){i.show({controller:"CreateOrEditExtractedReportDialogController",controllerAs:"vm",templateUrl:"app/main/apps/analytics/views/extractedReports/create/dialog.html",parent:angular.element(s.body),targetEvent:e,clickOutsideToClose:!0,locals:{extractedReport:n,extractedReports:b.extractedReports.rows,license:b.license,setting:b.setting,crudPermissions:b.crudPermissions}})},b.deleteExtractedReport=S,b.exportSelectedExtractedReports=function(){var e=angular.copy(b.selectedExtractedReports);return b.selectedExtractedReports=[],e},b.deleteSelectedExtractedReports=function(e){var n=i.confirm().title("Are you sure want to delete the selected extractedReports?").htmlContent(""+b.selectedExtractedReports.length+" selected will be deleted.").ariaLabel("delete ExtractedReports").targetEvent(e).ok("OK").cancel("CANCEL");i.show(n).then(function(){b.selectedExtractedReports.forEach(function(e){S(e)}),b.selectedExtractedReports=[]})},b.deselectExtractedReports=function(){b.selectedExtractedReports=[]},b.selectAllExtractedReports=function(){b.selectedExtractedReports=b.extractedReports.rows};var A=!0,E=1;function y(e){b.extractedReports=e||{count:0,rows:[]}}function S(e){m.analyticExtractedReport.delete({id:e.id}).$promise.then(function(){_.remove(b.extractedReports.rows,{id:e.id}),b.extractedReports.count-=1,b.extractedReports.rows.length||b.getExtractedReports(),p.success({title:_.startCase("ExtractedReport")+" deleted!",msg:e.name?e.name+" has been deleted!":""})}).catch(function(e){if(e.data&&e.data.errors&&e.data.errors.length){b.errors=e.data.errors||[{message:e.toString(),type:"SYSTEM:DELETEanalyticExtractedReport"}];for(var n=0;n"+(e.name||"metric")+" will be deleted.").ariaLabel("delete metric").targetEvent(n).ok("OK").cancel("CANCEL");i.show(t).then(function(){S(e)},function(){console.log("CANCEL")})},b.success=y,b.getMetrics=function(){b.query.offset=(b.query.page-1)*b.query.limit,g.hasRole("admin")?b.promise=m.analyticMetric.get(b.query,y).$promise:(b.query.id=b.userProfile.id,b.query.section="Metrics",b.promise=m.userProfile.getResources(b.query,y).$promise)},b.createOrEditMetric=function(e,n){i.show({controller:"CreateOrEditMetricDialogController",controllerAs:"vm",templateUrl:"app/main/apps/analytics/views/metrics/create/dialog.html",parent:angular.element(s.body),targetEvent:e,clickOutsideToClose:!0,locals:{metric:n,metrics:b.metrics.rows,license:b.license,setting:b.setting,crudPermissions:b.crudPermissions}})},b.deleteMetric=S,b.exportSelectedMetrics=function(){var e=angular.copy(b.selectedMetrics);return b.selectedMetrics=[],e},b.deleteSelectedMetrics=function(e){var n=i.confirm().title("Are you sure want to delete the selected metrics?").htmlContent(""+b.selectedMetrics.length+" selected will be deleted.").ariaLabel("delete Metrics").targetEvent(e).ok("OK").cancel("CANCEL");i.show(n).then(function(){b.selectedMetrics.forEach(function(e){S(e)}),b.selectedMetrics=[]})},b.deselectMetrics=function(){b.selectedMetrics=[]},b.selectAllMetrics=function(){b.selectedMetrics=b.metrics.rows};var A=!0,E=1;function y(e){b.metrics=e||{count:0,rows:[]}}function S(e){m.analyticMetric.delete({id:e.id}).$promise.then(function(){_.remove(b.metrics.rows,{id:e.id}),b.metrics.count-=1,b.metrics.rows.length||b.getMetrics(),p.success({title:_.startCase("Metric")+" deleted!",msg:e.name?e.name+" has been deleted!":""})}).catch(function(e){if(e.data&&e.data.errors&&e.data.errors.length){b.errors=e.data.errors||[{message:e.toString(),type:"SYSTEM:DELETEanalyticMetric"}];for(var n=0;n"+e.field+" will be deleted.").ariaLabel("delete field").targetEvent(n).ok("OK").cancel("CANCEL");a.show(t).then(function(){p(e)},function(){console.log("CANCEL")})},c.success=u,c.getReportFields=function(){c.promise=o.analyticFieldReport.get(c.query,u).$promise},c.createOrEditReportField=function(e,n){a.show({controller:"CreateOrEditReportFieldDialogController",controllerAs:"vm",templateUrl:"app/main/apps/analytics/views/reports/edit/field/dialog.html",parent:angular.element(i.body),targetEvent:e,clickOutsideToClose:!0,locals:{report:c.report,reportField:n,reportFields:c.reportFields.rows,metrics:c.metrics,columns:c.columns,setting:null,crudPermissions:c.crudPermissions}})},c.deleteReportField=p,c.deleteSelectedReportFields=function(e){var n=a.confirm().title("Are you sure want to delete the selected fields?").htmlContent(""+c.selectedReportFields.length+" selected will be deleted.").ariaLabel("delete fields").targetEvent(e).ok("OK").cancel("CANCEL");a.show(n).then(function(){c.selectedReportFields.forEach(function(e){p(e)}),c.selectedReportFields=[]})},c.getMetricName=function(e){var n=_.find(c.metrics,{id:e});return n?n.name:d.instant("ANALYTICS.NO_METRIC_FOUND")},c.getMetricValue=function(e){var n=_.find(c.metrics,{id:e});return n?n.metric:d.instant("ANALYTICS.NO_METRIC_FOUND")};var m=!0;function u(e){c.reportFields=e||{count:0,rows:[]}}function p(e){o.analyticFieldReport.delete({id:e.id}).$promise.then(function(){c.selectedReportFields=[],_.remove(c.reportFields.rows,{id:e.id}),c.reportFields.count-=1,c.reportFields.rows.length||c.getReportFields(),s.success({title:"Field deleted!",msg:e.field?e.field+" has been deleted!":""})}).catch(function(e){s.error({title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:DELETEFIELD",msg:e.data?JSON.stringify(e.data):e.toString()})})}n.$watch("vm_rf.query.filter",function(e,n){m?t(function(){m=!1}):c.getReportFields()})}e.$inject=["$cookies","$scope","$timeout","$mdDialog","$document","toasty","api","describeTable","sqlUtil","$translate"],angular.module("app.analytics").controller("ReportFieldsController",e)}(),function(){"use strict";angular.module("app.analytics").factory("sqlUtil",function(){return{getFunctions:[{value:"SUM",option:function(e){return"SUM ("+e+")"}},{value:"COUNT",option:function(e){return"COUNT ("+e+")"}},{value:"COUNT DISTINCT",option:function(e){return"COUNT (DISTINCT "+e+")"}},{value:"MAX",option:function(e){return"MAX ("+e+")"}},{value:"MIN",option:function(e){return"MIN ("+e+")"}},{value:"AVG",option:function(e){return"AVG ("+e+")"}},{value:"GROUP_CONCAT",option:function(e){return"GROUP_CONCAT ("+e+")"}},{value:"GROUP_CONCAT ASC",option:function(e){return"GROUP_CONCAT ("+e+" ORDER BY "+e+" ASC)"}},{value:"GROUP_CONCAT DESC",option:function(e){return"GROUP_CONCAT ("+e+" ORDER BY "+e+" DESC)"}}],getFormats:[{value:"SEC_TO_TIME",option:function(e){return"SEC_TO_TIME ("+e+")"}},{value:"DATE",option:function(e){return"DATE ("+e+")"}},{value:"HOUR",option:function(e){return"HOUR ("+e+")"}},{value:"ROUND",option:function(e){return"ROUND ("+e+")"}},{value:"UNIX_TIMESTAMP",option:function(e){return"UNIX_TIMESTAMP ("+e+")"}}],getGroupBy:[{value:!1,option:function(){return"No"}},{value:!0,option:function(e){return"GROUP BY "+e}}],getOrderBy:[{value:"ASC",option:function(e){return"ORDER BY "+e+" ASC"}},{value:"DESC",option:function(e){return"ORDER BY "+e+" DESC"}}],getConditions:["=","!=","<","<=",">",">=","LIKE","NOT LIKE","IS NULL","IS NOT NULL","IS EMPTY","IS NOT EMPTY"]}})}(),function(){"use strict";function e(e,n,t,a,i,s){var o=this;function r(e){return _.isArray(e)}o.report=a||{},o.userProfileSection=s&&1==s.count?s.rows[0]:null,o.crudPermissions=i.parseCrudPermissions(o.userProfileSection?o.userProfileSection.crudPermissions:null),o.selectedTab=e.params.tab||0,o.gotoReports=function(){e.go("app.analytics.reports")},o.saveReport=function(){o.report.conditions=angular.toJson(o.report.condition),t.analyticCustomReport.update({id:o.report.id},_.omit(o.report,"joins")).$promise.then(function(){n.success({title:"Report updated!",msg:o.report.name?o.report.name+" has been updated!":""})}).catch(function(e){n.error({title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:GETreport",msg:e.data?JSON.stringify(e.data):e.toString()})})},o.previewReport=function(){o.columns=[],o.rows=[],o.error=!1,t.analyticFieldReport.get({fields:"field,alias",nolimit:!0,CustomReportId:o.report.id}).$promise.then(function(e){return o.columns=e?e.rows:[],t.analyticCustomReport.preview({id:o.report.id}).$promise}).then(function(e){o.rows=e}).catch(function(e){console.log(e),o.error={title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:analyticFieldReport",msg:e.data?e.data.message:e.toString(),sql:e.data&&e.data.parent?e.data.parent.sql:"NO QUERY"},n.error(o.error)})},o.queryReport=function(){return o.queryResult="Loading...",t.analyticCustomReport.query({id:o.report.id}).$promise.then(function(e){o.queryResult=e.sql}).catch(function(e){o.queryResult="",console.log(e),o.error={title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:analyticFieldReport",msg:e.data?e.data.message:e.toString(),sql:e.data&&e.data.parent?e.data.parent.sql:"NO QUERY"},n.error(o.error)})},o.mapArray=function(e,n){if(r(e))return _.map(e,n).join(",");return""},o.isArray=r,o.valueReplacer=function(e,n){moment(n,"YYYY-MM-DDTHH:mm:ssZ",!0).isValid()&&(n=moment(n,"").format("YYYY-MM-DD HH:mm:ss"));return n}}e.$inject=["$state","toasty","api","report","Auth","userProfileSection"],angular.module("app.analytics").controller("ReportController",e)}(),function(){"use strict";function e(e,n,t,a,i,s){var o=this;o.errors=[],o.report=angular.copy(a),o.valueReplacer=function(e,n){moment(n,"YYYY-MM-DDTHH:mm:ssZ",!0).isValid()&&(n=moment(n,"").format("YYYY-MM-DD HH:mm:ss"));return n},o.closeDialog=function(){n.hide()},function(){o.columns=[],o.rows=[],o.error=!1;var e={fields:"field,alias",nolimit:!0};e["analyticCustomReport"===s?"CustomReportId":"DefaultReportId"]=o.report.id,o.promise=i.analyticFieldReport.get(e).$promise.then(function(e){return o.columns=e?e.rows:[],i[s].preview({id:o.report.id}).$promise}).then(function(e){o.rows=e}).catch(function(e){console.log(e),o.error={title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:analyticFieldReport",msg:e.data?e.data.message:e.toString(),sql:e.data&&e.data.parent?e.data.parent.sql:"NO QUERY"},t.error(o.error)})}()}e.$inject=["$location","$mdDialog","toasty","report","api","apiName"],angular.module("app.analytics").controller("PreviewReportDialogController",e)}(),function(){"use strict";function e(e,t,a,i,s,o,n,r,l,d,c,m,u){var p=this;p.currentUser=u.getCurrentUser(),p.reports={count:0,rows:[]},p.userProfile=r,p.userProfileSection=l&&1==l.count?l.rows[0]:null,p.crudPermissions=u.parseCrudPermissions(p.userProfileSection?p.userProfileSection.crudPermissions:null),p.selectedReports=[],p.query={fields:"createdAt,updatedAt,id,name,description,table,parent,conditions,joins",limit:10,page:1,sort:"-updatedAt"},p.apiName=null,p.currentPath="",p.customTree=!0,p.editstate=function(e,n){s.go("app.analytics.reports.edit",{id:e.id,crudPermissions:p.crudPermissions})},p.copydialog=function(e,n){i.show({controller:"CopyReportDialogController",controllerAs:"vm",templateUrl:"app/main/apps/analytics/views/reports/copy/dialog.html",parent:angular.element(a.body),targetEvent:n,clickOutsideToClose:!0,locals:{report:e,apiName:p.apiName,treeCustomData:p.treeCustomInstance.jstree(!0).get_json("#")}}).finally(function(){})},p.previewdialog=function(e,n){i.show({controller:"PreviewReportDialogController",controllerAs:"vm",templateUrl:"app/main/apps/analytics/views/reports/preview/dialog.html",parent:angular.element(a.body),targetEvent:n,clickOutsideToClose:!0,locals:{report:e,apiName:p.apiName}})},p.rundialog=function(e,n){i.show({controller:"RunReportDialogController",controllerAs:"vm",templateUrl:"app/main/apps/analytics/views/reports/run/dialog.html",parent:angular.element(a.body),targetEvent:n,clickOutsideToClose:!0,locals:{report:e,apiName:p.apiName,currentPath:p.currentPath}})},p.downloadfile=function(a,e){var i;d.analyticMetric.get({fields:"id,name,metric,table",nolimit:!0}).$promise.then(function(e){i=_.keyBy(e.rows,"id");var n={fields:"field,alias,function,format,groupBy,orderBy,custom,MetricId",nolimit:!0};return n["analyticCustomReport"===p.apiName?"CustomReportId":"DefaultReportId"]=a.id,d.analyticFieldReport.get(n).$promise}).then(function(e){for(var n=0;n"+e.name+" will be deleted.").ariaLabel("delete report").targetEvent(n).ok("OK").cancel("CANCEL");i.show(t).then(function(){b(e)},function(){console.log("CANCEL")})},p.success=h,p.getReports=f,p.createOrEditReport=function(e,n){i.show({controller:"CreateOrEditReportDialogController",controllerAs:"vm",templateUrl:"app/main/apps/analytics/views/reports/create/dialog.html",parent:angular.element(a.body),targetEvent:e,clickOutsideToClose:!0,locals:{report:n,reports:p.reports.rows,apiName:p.apiName,currentNode:p.currentNode,setting:null,crudPermissions:p.crudPermissions}})},p.importReport=function(e,n,t){if("application/json"===e.file.type){var a=new FileReader;a.onload=function(e){console.log(e.target.result);try{var t=atob(e.target.result.split(",")[1]);t=angular.fromJson(t),d.analyticCustomReport.save({name:t.name,description:t.description,table:t.table,conditions:t.conditions,joins:t.joins,parent:p.currentNode.id}).$promise.then(function(n){p.reports.rows.unshift(n),m.success({title:"Report saved!",msg:n.name?n.name+" has been saved!":""});var e=_.map(t.fields,function(e){return _.extend({},e,{CustomReportId:n.id})});return d.analyticFieldReport.bulkCreate(e).$promise}).then(function(e){m.success({title:"Fields saved!",msg:"Fields has been saved!"})}).catch(function(e){m.error({title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:GETanalyticReport",msg:e.data?JSON.stringify(e.data):e.toString()})})}catch(e){console.error(e),m.error({title:"Decode File Error",msg:e.toString()})}},a.readAsDataURL(e.file)}else m.error({title:"Format Error",msg:"Please use only json files"})},p.deleteReport=b,p.exportSelectedReports=function(){var e=angular.copy(p.selectedReports);return p.selectedReports=[],e},p.deleteSelectedReports=function(e){var n=i.confirm().title("Are you sure want to delete the selected reports?").htmlContent(""+p.selectedReports.length+" selected will be deleted.").ariaLabel("delete Reports").targetEvent(e).ok("OK").cancel("CANCEL");i.show(n).then(function(){p.selectedReports.forEach(function(e){b(e)}),p.selectedReports=[]})},p.deselectReports=function(){p.selectedReports=[]},p.selectAllReports=function(){p.selectedReports=p.reports.rows},p.treeDefaultData=c.rows[0]?angular.fromJson(c.rows[0].tree):[],p.treeCustomData=c.rows[1]?angular.fromJson(c.rows[1].tree):[],p.treeDefaultConfig=S(!1),p.treeCustomConfig=S(!0),p.treeDefaultEvents=T(!1),p.treeCustomEvents=T(!0);var g=!0,v=1;function h(e){p.reports=e||{count:0,rows:[]}}function f(){if(p.query.offset=(p.query.page-1)*p.query.limit,p.apiName)if("admin"===p.currentUser.role||p.userProfileSection.autoAssociation)p.promise=d[p.apiName].get(p.query,h).$promise;else{var a=[];p.promise=d[p.apiName].get(p.query).$promise.then(function(e){return 0<(a=e&&e.rows?e.rows:[]).length?d.userProfileResource.get({sectionId:p.userProfileSection.id,type:"analyticDefaultReport"===p.apiName?"DefaultReports":"CustomReports"}).$promise.then(function(e){var n=e&&e.rows?e.rows:[];if(0"+(t.text?t.text:"Node")+" and its subnode will be deleted.").ariaLabel("delete node").ok("OK").cancel("CANCEL");i.show(e).then(function(){var e,n=p.treeCustomInstance.jstree(!0).get_parent(t);n=p.treeCustomInstance.jstree(!0).get_node(n),p.treeCustomInstance.jstree(!0).delete_node(t),e=[t.id].concat(t.children_d||[]),d.analyticCustomReport.get({parent:e.join(","),fields:"id,name"}).$promise.then(function(e){e&&e.rows&&e.rows.forEach(function(e){b(e)})}).catch(function(e){m.error({title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:DELETEreportsByParents",msg:e.data?JSON.stringify(e.data):e.toString()})}),p.treeCustomInstance.jstree(!0).select_node(n)})}}}),e}}}}function T(e){return e?{create_node:y,rename_node:y,move_node:y,delete_node:y,select_node:A}:{select_node:E}}e.$watch("vm.query.filter",function(e,n){g?t(function(){g=!1}):(n||(v=p.query.page),e!==n&&(p.query.page=1),e||(p.query.page=v),p.getReports())}),e.$watch("vm.search",function(e,n){p.treeDefaultInstance&&p.treeDefaultInstance.jstree(!0).search(e),p.treeCustomInstance&&p.treeCustomInstance.jstree(!0).search(e)})}e.$inject=["$scope","$timeout","$document","$mdDialog","$state","$window","$translate","userProfile","userProfileSection","api","treeReports","toasty","Auth"],angular.module("app.analytics").controller("ReportsController",e)}(),function(){"use strict";function e(e,t,a,n,i,s,o,r){var l=this;function d(){l.export={id:l.report.id,name:l.report.name,startDate:new Date(moment().startOf("day")),endDate:new Date(moment().endOf("day")),output:"xlsx",fullPath:r?r+"/"+l.report.name:l.report.name}}function c(){t.hide()}l.errors=[],l.report=angular.copy(n),l.export={},l.runReport=function(n){l.errors=[],l.exportDate=_.assign({},l.export,{startDate:moment(l.export.startDate).format("YYYY-MM-DD HH:mm:ss"),endDate:moment(l.export.endDate).format("YYYY-MM-DD HH:mm:ss")}),i[s].run(l.exportDate).$promise.then(function(e){"web"===l.export.output?t.show({controller:"WebReportDialogController",controllerAs:"vm",templateUrl:"app/main/apps/analytics/views/reports/run/web/dialog.html",parent:angular.element(o.body),targetEvent:n,skipHide:!0,locals:{apiName:s,exportDate:l.exportDate,results:e},resolve:{columns:["apiResolver",function(e){var n={fields:"field,alias",nolimit:!0};return n["analyticCustomReport"===s?"CustomReportId":"DefaultReportId"]=l.report.id,e.resolve("analyticFieldReport@get",n)}]}}):(a.success({title:"Report properly run!",msg:l.report.name?l.report.name+" has been run!":""}),c())}).catch(function(e){a.error({title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:DESCRIBE",msg:e.data?JSON.stringify(e.data.message):e.toString()})})},l.closeDialog=c,(l.refreshDate=d)()}e.$inject=["$location","$mdDialog","toasty","report","api","apiName","$document","currentPath"],angular.module("app.analytics").controller("RunReportDialogController",e)}(),function(){"use strict";function e(e,n,t,a,i,s,o){var r=this;function l(e){r.results=e||{count:0,rows:[]}}r.errors=[],r.columns=a?a.rows:[],r.results=i||{rows:[],count:0},r.query={limit:10,page:1},r.closeDialog=function(){e.hide()},r.getResults=function(){o.offset=(r.query.page-1)*r.query.limit,o.limit=r.query.limit,r.promise=t[s].run(o,l).$promise},r.valueReplacer=function(e,n){moment(n,"YYYY-MM-DDTHH:mm:ssZ",!0).isValid()&&(n=moment(n,"").format("YYYY-MM-DD HH:mm:ss"));return n}}e.$inject=["$mdDialog","toasty","api","columns","results","apiName","exportDate"],angular.module("app.analytics").controller("WebReportDialogController",e)}(),function(){"use strict";function e(e,n,t,a,i,s,o,r,l,d,c,m,u,p){var g=this;function v(e){a.hide(e)}g.currentUser=c.getCurrentUser(),g.errors=[],g.setting=u,g.license=m,g.crudPermissions=p,g.hasModulePermissions={},g.passwordPattern=g.setting&&g.setting.securePassword?/(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[?!@#\$%\^&\*~\-_=+[{\]\}])(?=.{8,})/:"",g.title="CALLYSQUARE.EDIT_ODBC",g.odbc=angular.copy(l),g.odbcs=r,g.newOdbc=!1,g.odbc||(g.odbc={},g.title="CALLYSQUARE.NEW_ODBC",g.newOdbc=!0),g.addNewOdbc=function(){g.errors=[],d.squareOdbc.save(g.odbc).$promise.then(function(e){g.odbcs.unshift(e.toJSON()),o.success({title:"Odbc properly created",msg:g.odbc.name?g.odbc.name+" has been created!":""}),v(e)}).catch(function(e){if(e.data&&e.data.errors&&e.data.errors.length){g.errors=e.data.errors||[{message:e.toString(),type:"api.squareOdbc.save"}];for(var n=0;n"+(e.name||"odbc")+" will be deleted.").ariaLabel("delete odbc").targetEvent(n).ok("OK").cancel("CANCEL");i.show(t).then(function(){S(e)},function(){console.log("CANCEL")})},b.success=y,b.getODBC=function(){b.query.offset=(b.query.page-1)*b.query.limit,g.hasRole("admin")?b.promise=m.squareOdbc.get(b.query,y).$promise:(b.query.id=b.userProfile.id,b.query.section="ODBC",b.promise=m.userProfile.getResources(b.query,y).$promise)},b.createOrEditOdbc=function(e,n){i.show({controller:"CreateOrEditOdbcDialogController",controllerAs:"vm",templateUrl:"app/main/apps/callysquare/views/odbcs/create/dialog.html",parent:angular.element(s.body),targetEvent:e,clickOutsideToClose:!0,locals:{odbc:n,odbcs:b.odbcs.rows,license:b.license,setting:b.setting,crudPermissions:b.crudPermissions}})},b.deleteOdbc=S,b.exportSelectedODBC=function(){var e=angular.copy(b.selectedODBC);return b.selectedODBC=[],e},b.deleteSelectedODBC=function(e){var n=i.confirm().title("Are you sure want to delete the selected odbcs?").htmlContent(""+b.selectedODBC.length+" selected will be deleted.").ariaLabel("delete Odbcs").targetEvent(e).ok("OK").cancel("CANCEL");i.show(n).then(function(){b.selectedODBC.forEach(function(e){S(e)}),b.selectedODBC=[]})},b.deselectODBC=function(){b.selectedODBC=[]},b.selectAllODBC=function(){b.selectedODBC=b.odbcs.rows};var A=!0,E=1;function y(e){b.odbcs=e||{count:0,rows:[]}}function S(e){m.squareOdbc.delete({id:e.id}).$promise.then(function(){_.remove(b.odbcs.rows,{id:e.id}),b.odbcs.count-=1,b.odbcs.rows.length||b.getODBC(),p.success({title:_.startCase("Odbc")+" deleted!",msg:e.name?e.name+" has been deleted!":""})}).catch(function(e){if(e.data&&e.data.errors&&e.data.errors.length){b.errors=e.data.errors||[{message:e.toString(),type:"SYSTEM:DELETEsquareOdbc"}];for(var n=0;n"+e.name+" will be deleted.").ariaLabel("delete project").targetEvent(n).ok("OK").cancel("CANCEL");l.show(t).then(function(){f(e)},function(){console.log("CANCEL")})},p.success=h,p.getProjects=function(){p.query.offset=(p.query.page-1)*p.query.limit,u.hasRole("admin")?p.promise=o.squareProject.get(p.query,h).$promise:(p.query.id=p.userProfile.id,p.query.section="SquareProjects",p.promise=o.userProfile.getResources(p.query,h).$promise)},p.createOrEditProject=function(e,n){l.show({controller:"CreateOrEditSquareProjectDialogController",controllerAs:"vm",templateUrl:"app/main/apps/callysquare/views/projects/create/dialog.html",parent:angular.element(d.body),targetEvent:e,clickOutsideToClose:!0,locals:{project:n,projects:p.projects.rows,openFromEditor:null,setting:null,crudPermissions:p.crudPermissions}})},p.deleteProject=f,p.exportSelectedProjects=function(){var e=angular.copy(p.selectedProjects);return p.selectedProjects=[],e},p.deleteSelectedProjects=function(e){var n=l.confirm().title("Are you sure want to delete the selected projects?").htmlContent(""+p.selectedProjects.length+" selected will be deleted.").ariaLabel("delete Projects").targetEvent(e).ok("OK").cancel("CANCEL");l.show(n).then(function(){p.selectedProjects.forEach(function(e){f(e)}),p.selectedProjects=[]})},p.deselectProjects=function(){p.selectedProjects=[]},p.selectAllProjects=function(){p.selectedProjects=p.projects.rows};var g=!0,v=1;function h(e){p.projects=e||{count:0,rows:[]}}function f(e){o.squareProject.delete({id:e.id}).$promise.then(function(){_.remove(p.projects.rows,{id:e.id}),p.projects.count-=1,p.projects.rows.length||p.getProjects(),m.success({title:"Project deleted!",msg:e.name?e.name+" has been deleted!":""})}).catch(function(e){if(e.data&&e.data.errors&&e.data.errors.length){p.errors=e.data.errors||[{message:e.toString(),type:"api.project.delete"}];for(var n=0;n"+(e.name||"squareRecording")+" will be deleted.").ariaLabel("delete squareRecording").targetEvent(n).ok("OK").cancel("CANCEL");i.show(t).then(function(){S(e)},function(){console.log("CANCEL")})},b.success=y,b.getSquareRecordings=function(){b.query.offset=(b.query.page-1)*b.query.limit,g.hasRole("admin")?b.promise=m.squareRecording.get(b.query,y).$promise:(b.query.id=b.userProfile.id,b.query.section="SquareRecordings",b.promise=m.userProfile.getResources(b.query,y).$promise)},b.createOrEditSquareRecording=function(e,n){i.show({controller:"CreateOrEditSquareRecordingDialogController",controllerAs:"vm",templateUrl:"app/main/apps/callysquare/views/squareRecordings/create/dialog.html",parent:angular.element(s.body),targetEvent:e,clickOutsideToClose:!0,locals:{squareRecording:n,squareRecordings:b.squareRecordings.rows,license:b.license,setting:b.setting,crudPermissions:b.crudPermissions}})},b.deleteSquareRecording=S,b.exportSelectedSquareRecordings=function(){var e=angular.copy(b.selectedSquareRecordings);return b.selectedSquareRecordings=[],e},b.deleteSelectedSquareRecordings=function(e){var n=i.confirm().title("Are you sure want to delete the selected squareRecordings?").htmlContent(""+b.selectedSquareRecordings.length+" selected will be deleted.").ariaLabel("delete SquareRecordings").targetEvent(e).ok("OK").cancel("CANCEL");i.show(n).then(function(){b.selectedSquareRecordings.forEach(function(e){S(e)}),b.selectedSquareRecordings=[]})},b.deselectSquareRecordings=function(){b.selectedSquareRecordings=[]},b.selectAllSquareRecordings=function(){b.selectedSquareRecordings=b.squareRecordings.rows};var A=!0,E=1;function y(e){b.squareRecordings=e||{count:0,rows:[]}}function S(e){m.squareRecording.delete({id:e.id}).$promise.then(function(){_.remove(b.squareRecordings.rows,{id:e.id}),b.squareRecordings.count-=1,b.squareRecordings.rows.length||b.getSquareRecordings(),p.success({title:_.startCase("SquareRecording")+" deleted!",msg:e.name?e.name+" has been deleted!":""})}).catch(function(e){if(e.data&&e.data.errors&&e.data.errors.length){b.errors=e.data.errors||[{message:e.toString(),type:"SYSTEM:DELETEsquareRecording"}];for(var n=0;n"+(e.name||"chatQueue")+" will be deleted.").ariaLabel("delete chatQueue").targetEvent(n).ok("OK").cancel("CANCEL");i.show(t).then(function(){S(e)},function(){console.log("CANCEL")})},b.gotorealtimegoto=function(e,n){{if(!g.hasRole("admin"))return m.userProfileSection.get({userProfileId:g.getCurrentUser().userProfileId,sectionId:510}).$promise.then(function(e){var n=e&&e.rows?e.rows[0]:null;n&&n.enabled?t.go("app.chat.realtime.queues",{}):p.info({title:r.instant("STAFF.PERMISSIONS_UNAUTHORIZED_REDIRECT_TITLE"),msg:r.instant("STAFF.PERMISSIONS_UNAUTHORIZED_REDIRECT_MESSAGE")})}).catch(function(e){p.error({title:e.status?"API:"+e.status+" - "+e.statusText:"USERPROFILE:GET_SECTION",msg:e.status?JSON.stringify(e.data):e.toString()})});t.go("app.chat.realtime.queues",{})}},b.success=y,b.getChatQueues=function(){b.query.offset=(b.query.page-1)*b.query.limit,g.hasRole("admin")?b.promise=m.chatQueue.get(b.query,y).$promise:(b.query.id=b.userProfile.id,b.query.section="ChatQueues",b.promise=m.userProfile.getResources(b.query,y).$promise)},b.createOrEditChatQueue=function(e,n){i.show({controller:"CreateOrEditChatQueueDialogController",controllerAs:"vm",templateUrl:"app/main/apps/chat/views/chatQueues/create/dialog.html",parent:angular.element(s.body),targetEvent:e,clickOutsideToClose:!0,locals:{chatQueue:n,chatQueues:b.chatQueues.rows,license:b.license,setting:b.setting,crudPermissions:b.crudPermissions}})},b.deleteChatQueue=S,b.exportSelectedChatQueues=function(){var e=angular.copy(b.selectedChatQueues);return b.selectedChatQueues=[],e},b.deleteSelectedChatQueues=function(e){var n=i.confirm().title("Are you sure want to delete the selected chatQueues?").htmlContent(""+b.selectedChatQueues.length+" selected will be deleted.").ariaLabel("delete ChatQueues").targetEvent(e).ok("OK").cancel("CANCEL");i.show(n).then(function(){b.selectedChatQueues.forEach(function(e){S(e)}),b.selectedChatQueues=[]})},b.deselectChatQueues=function(){b.selectedChatQueues=[]},b.selectAllChatQueues=function(){b.selectedChatQueues=b.chatQueues.rows};var A=!0,E=1;function y(e){b.chatQueues=e||{count:0,rows:[]}}function S(e){m.chatQueue.delete({id:e.id}).$promise.then(function(){_.remove(b.chatQueues.rows,{id:e.id}),b.chatQueues.count-=1,b.chatQueues.rows.length||b.getChatQueues(),p.success({title:_.startCase("ChatQueue")+" deleted!",msg:e.name?e.name+" has been deleted!":""})}).catch(function(e){if(e.data&&e.data.errors&&e.data.errors.length){b.errors=e.data.errors||[{message:e.toString(),type:"SYSTEM:DELETEchatQueue"}];for(var n=0;n":"",n}),c.startingSelectedItems=angular.copy(c.selectedItems),c.dualMultiselectOptions.selectedItems=c.selectedItems,c.dualMultiselectOptions.items=_.differenceBy(c.allowedItems,c.dualMultiselectOptions.selectedItems,"id"),t()}).catch(function(e){n(e)})})}c.currentUser=l.getCurrentUser(),c.chatQueue=n,c.crudPermissions=d,c.realtime=o,c.items=[],c.allowedItems=[],c.selectedItems=[],c.startingAllowedItems=[],c.startingSelectedItems=[],c.pendingChanges=!1,c.onInit=function(){return l.hasRole("admin")?m().catch(function(e){i.error({title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:GET_AGENTS",msg:e.status?JSON.stringify(e.data):e.toString()})}):a(function(t,n){s.userProfileSection.get({userProfileId:c.currentUser.userProfileId,name:"Agents"}).$promise.then(function(e){var n=e&&e.rows?e.rows[0]:null;t(n)}).catch(function(e){n(e)})}).then(function(e){return c.section=e,m()}).catch(function(e){i.error({title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:GET_AGENTS",msg:e.status?JSON.stringify(e.data):e.toString()})})},c.saveAgents=function(){var e=_.differenceBy(c.startingSelectedItems,c.selectedItems,"id"),n=_.differenceBy(c.selectedItems,c.startingSelectedItems,"id");return(t=e,a(function(e,n){_.isEmpty(t)?e():s.chatQueue.removeAgents({id:c.chatQueue.id,ids:_.map(t,"id")}).$promise.then(function(){e()}).catch(function(e){n(e)})})).then(function(){return t=n,a(function(e,n){_.isEmpty(t)?e():s.chatQueue.addAgents({id:c.chatQueue.id,ids:_.map(t,"id")}).$promise.then(function(){e()}).catch(function(e){n(e)})});var t}).then(function(){c.pendingChanges=!1,c.startingAllowedItems=angular.copy(c.allowedItems),c.startingSelectedItems=angular.copy(c.selectedItems),i.success({title:"SUCCESS",msg:"Agents association has been updated!"})}).catch(function(e){i.error({title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:LISTS_ASSOCIATION",msg:e.status?JSON.stringify(e.data):e.toString()})});var t},c.closeDialog=function(){e.hide()},c.dualMultiselectOptions={readOnly:!c.crudPermissions.canEdit,items:[],selectedItems:[],showSelectAndDeselectAll:!0,orderBy:"name",line1:"fullname",line2:["name","internal"],line3:"",labelAll:r.instant("CHAT.ALL_AGENTS"),labelSelected:r.instant("CHAT.SELECTED_AGENTS"),transferCallback:function(e,n){var t=_.xorBy(c.startingSelectedItems,c.selectedItems,"id");c.pendingChanges=!_.isEmpty(t)}}}e.$inject=["$mdDialog","$q","toasty","api","chatQueue","chatQueues","realtime","$translate","Auth","crudPermissions"],angular.module("app.chat").controller("ChatQueueagentaddController",e)}(),function(){"use strict";function e(e,a,i,s,n,t,o,r){var l=this;function d(){return a(function(t,n){return a(function(n,t){return s.team.get({fields:"id,name",nolimit:!0}).$promise.then(function(e){n(e)}).catch(function(e){t(e)})}).then(function(e){return l.items=e.rows?e.rows:[],o.hasRole("admin")?e:l.section?l.section.autoAssociation?e:a(function(n,t){return s.userProfileResource.get({sectionId:l.section.id,nolimit:!0}).$promise.then(function(e){n(e)}).catch(function(e){t(e)})}):null}).then(function(e){var n=e&&e.rows?e.rows:[];return l.allowedItems=_.map(n,function(e){return _.find(l.items,{id:o.hasRole("admin")||l.section.autoAssociation?e.id:e.resourceId})}),l.items.forEach(function(e){var n=_.find(l.allowedItems,{id:e.id});o.hasRole("admin")?e.isValid=!0:e.isValid=void 0!==n}),a(function(n,t){return s.chatQueue.getTeams({id:l.chatQueue.id,fields:"id,name",nolimit:!0}).$promise.then(function(e){n(e)}).catch(function(e){t(e)})})}).then(function(e){var n=e&&e.rows?e.rows:[];l.selectedItems=_.map(n,function(e){return _.find(l.items,{id:e.id})}),l.startingSelectedItems=angular.copy(l.selectedItems),l.dualMultiselectOptions.selectedItems=l.selectedItems,l.dualMultiselectOptions.items=_.differenceBy(l.allowedItems,l.dualMultiselectOptions.selectedItems,"id"),t()}).catch(function(e){n(e)})})}l.currentUser=o.getCurrentUser(),l.chatQueue=n,l.crudPermissions=r,l.items=[],l.allowedItems=[],l.selectedItems=[],l.startingAllowedItems=[],l.startingSelectedItems=[],l.pendingChanges=!1,l.dualMultiselectOptions={readOnly:!l.crudPermissions.canEdit,allowedItems:[],selectedItems:[],showSelectAndDeselectAll:!0,orderBy:"name",line1:"name",line2:"",line3:"",labelAll:t.instant("CHAT.ALL_TEAMS"),labelSelected:t.instant("CHAT.SELECTED_TEAMS"),transferCallback:function(e,n){var t=_.xorBy(l.startingSelectedItems,l.selectedItems,"id");l.pendingChanges=!_.isEmpty(t)}},l.onInit=function(){return o.hasRole("admin")?d().catch(function(e){i.error({title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:GET_TEAMS",msg:e.status?JSON.stringify(e.data):e.toString()})}):a(function(t,n){s.userProfileSection.get({userProfileId:l.currentUser.userProfileId,name:"Teams"}).$promise.then(function(e){var n=e&&e.rows?e.rows[0]:null;t(n)}).catch(function(e){n(e)})}).then(function(e){return l.section=e,d()}).catch(function(e){i.error({title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:GET_TEAMS",msg:e.status?JSON.stringify(e.data):e.toString()})})},l.saveTeams=function(){var e=_.differenceBy(l.startingSelectedItems,l.selectedItems,"id"),n=_.differenceBy(l.selectedItems,l.startingSelectedItems,"id");return(t=e,a(function(e,n){_.isEmpty(t)?e():s.chatQueue.removeTeams({id:l.chatQueue.id,ids:_.map(t,"id")}).$promise.then(function(){e()}).catch(function(e){n(e)})})).then(function(){return t=n,a(function(e,n){_.isEmpty(t)?e():s.chatQueue.addTeams({id:l.chatQueue.id,ids:_.map(t,"id")}).$promise.then(function(){e()}).catch(function(e){n(e)})});var t}).then(function(){l.pendingChanges=!1,l.startingAllowedItems=angular.copy(l.allowedItems),l.startingSelectedItems=angular.copy(l.selectedItems),i.success({title:"SUCCESS",msg:"Teams association has been updated!"})}).catch(function(e){i.error({title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:LISTS_ASSOCIATION",msg:e.status?JSON.stringify(e.data):e.toString()})});var t},l.closeDialog=function(){e.hide()}}e.$inject=["$mdDialog","$q","toasty","api","chatQueue","$translate","Auth","crudPermissions"],angular.module("app.chat").controller("ChatQueueteamaddController",e)}(),function(){"use strict";function e(e,n,t,a,i,s,o,r,l,d,c,m){var u=this;u.currentUser=d.getCurrentUser(),u.license=s,u.setting=o,u.passwordPattern=u.setting.securePassword?/(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[?!@#\$%\^&\*~\-_=+[{\]\}])(?=.{8,})/:"",u.location=n.protocol()+"://"+n.host(),u.chatQueue=c||e.params.chatQueue||{},u.userProfileSection=m&&1==m.count?m.rows[0]:null,u.crudPermissions=d.parseCrudPermissions(u.userProfileSection?u.userProfileSection.crudPermissions:null),u.hasModulePermissions={},u.selectedTab=e.params.tab||0,u.teamadddialog=function(e,n){t.show({controller:"ChatQueueteamaddController",controllerAs:"vm",templateUrl:"app/main/apps/chat/views/chatQueues/edit/teamadd/teamadd.html",parent:angular.element(a.body),targetEvent:n,clickOutsideToClose:!0,locals:{chatQueue:e,chatQueues:u.chatQueues?u.chatQueues.rows:[],crudPermissions:u.crudPermissions}})},u.agentadddialog=function(e,n){t.show({controller:"ChatQueueagentaddController",controllerAs:"vm",templateUrl:"app/main/apps/chat/views/chatQueues/edit/agentadd/agentadd.html",parent:angular.element(a.body),targetEvent:n,clickOutsideToClose:!0,locals:{chatQueue:e,chatQueues:u.chatQueues?u.chatQueues.rows:[],crudPermissions:u.crudPermissions,realtime:!1}})},u.alert=l.info,u.gotoChatQueues=function(){e.go("app.chat.chatQueues")},u.saveChatQueue=function(){r.chatQueue.update({id:u.chatQueue.id},u.chatQueue).$promise.then(function(){l.success({title:"ChatQueue updated!",msg:u.chatQueue.name?u.chatQueue.name+" has been updated!":""})}).catch(function(e){l.error({title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:GETchatQueue",msg:e.data?JSON.stringify(e.data):e.toString()})})}}e.$inject=["$state","$location","$mdDialog","$document","$translate","license","setting","api","toasty","Auth","chatQueue","userProfileSection"],angular.module("app.chat").controller("ChatQueueController",e)}(),function(){"use strict";function e(e,n,t,a,i,s,o,r,l,d,c,m,u,p,g,v,h,f){var b=this;b.license=v,b.setting=h,b.currentUser=g.getCurrentUser(),b.chatWebsites=l||{count:0,rows:[]},b.userProfile=d,b.userProfileSection=c&&1==c.count?c.rows[0]:null,b.crudPermissions=g.parseCrudPermissions(b.userProfileSection?b.userProfileSection.crudPermissions:null),b.table="chatWebsites",b.listOrder="",b.listOrderAsc=null,b.selectedChatWebsites=[],b.query={fields:"createdAt,updatedAt,id,token,agentIdentifier,customerAlias,messageFontSize,name,key,address,remote,ListId,fidelity,timeout,agentAlias,closingQuestion,formSubmitSuccessMessage,formSubmitFailureMessage,color,color_focus,color_button,textColor,backgroundColor,fontSize,header_shape,showAgentAvatar,showCustomerAvatar,alignment,verticalAlignment,messagesAlignment,defaultTitle,animation,defaultWhiteLabel,whiteLabel,defaultLogo,conditionAgreement,autoclose,enableUnmanagedNote,unmanagedMessage,skipUnmanaged,sendUnmanaged,enableCustomerWriting,waitingTitle,waitingMessage,closingMessage,noteTitle,placeholderMessage,skipMessageButton,enableRating,ratingType,ratingStarsNumber,enableFeedback,feedbackTitle,forwardTranscript,forwardTranscriptMessage,closingMessageButton,download_transcript,enableCustomerAttachment,enableSendButton,enableCustomerCheckmarks,systemAlias,enquiry_enable,enquiry_forwarding,enquiry_forwarding_address,name_title,username_placeholder,email_title,email_placeholder,header_online,hideWhenOffline,header_offline,start_chat_button,offline_chat_button,offlineMessageSubject,offlineMessageBody,offline_message,message_title,enquiry_message_placeholder,enquiry_button,rating_message,rating_send,rating_skip,onlineForm,offlineForm,mapKey,mapKeyOffline,forwardOffline,forwardOfflineAddress,IntervalId,timezone,waitForTheAssignedAgent,mandatoryDisposition,mandatoryDispositionPauseId,description,notificationSound,notificationShake,notificationTemplate,queueTransfer,queueTransferTimeout,agentTransfer,agentTransferTimeout",sort:"-updatedAt",limit:10,page:1},b.arrayagentIdentifier=_.keyBy([{option:"WebsiteAlias",value:"'website_alias'"},{option:"AgentAlias",value:"'agent_alias'"},{option:"AgentFullname",value:"'agent_fullname'"}],function(e){return _.replace(e.value,new RegExp("'","g"),"")}),b.arrayheader_shape=_.keyBy([{option:"Rounded",value:"'rounded'"},{option:"Squared",value:"'squared'"}],function(e){return _.replace(e.value,new RegExp("'","g"),"")}),b.arrayalignment=_.keyBy([{option:"bottom_right",value:"'bottom_right'"},{option:"right",value:"'right'"},{option:"left",value:"'left'"}],function(e){return _.replace(e.value,new RegExp("'","g"),"")}),b.arraymessagesAlignment=_.keyBy([{option:"alternate",value:"'alternate'"},{option:"centered",value:"'centered'"}],function(e){return _.replace(e.value,new RegExp("'","g"),"")}),b.arrayratingType=_.keyBy([{option:"Star",value:"'star'"},{option:"Thumb",value:"'thumb'"}],function(e){return _.replace(e.value,new RegExp("'","g"),"")}),b.editstate=function(e,n){t.go("app.chat.chatWebsites.edit",{id:e.id,chatWebsite:e,crudPermissions:b.crudPermissions})},b.interactionsgoto=function(e,n){t.go("app.chat.chatWebsites.edit",{id:e.id,tab:9})},b.offlinemessagesgoto=function(e,n){t.go("app.chat.chatWebsites.edit",{id:e.id,tab:10})},b.agentadddialog=function(e,n){i.show({controller:"ChatWebsiteagentaddController",controllerAs:"vm",templateUrl:"app/main/apps/chat/views/chatWebsites/edit/agentadd/agentadd.html",parent:angular.element(s.body),targetEvent:n,clickOutsideToClose:!0,locals:{chatWebsite:e,chatWebsites:b.chatWebsites?b.chatWebsites.rows:[],crudPermissions:b.crudPermissions,realtime:!1}})},b.deleteconfirm=function(e,n){var t=i.confirm().title("Are you sure want to delete the "+_.startCase("chatWebsite")+"?").htmlContent(""+(e.name||"chatWebsite")+" will be deleted.").ariaLabel("delete chatWebsite").targetEvent(n).ok("OK").cancel("CANCEL");i.show(t).then(function(){S(e)},function(){console.log("CANCEL")})},b.success=y,b.getChatWebsites=function(){b.query.offset=(b.query.page-1)*b.query.limit,g.hasRole("admin")?b.promise=m.chatWebsite.get(b.query,y).$promise:(b.query.id=b.userProfile.id,b.query.section="ChatWebsites",b.promise=m.userProfile.getResources(b.query,y).$promise)},b.createOrEditChatWebsite=function(e,n){i.show({controller:"CreateOrEditChatWebsiteDialogController",controllerAs:"vm",templateUrl:"app/main/apps/chat/views/chatWebsites/create/dialog.html",parent:angular.element(s.body),targetEvent:e,clickOutsideToClose:!0,locals:{chatWebsite:n,chatWebsites:b.chatWebsites.rows,license:b.license,setting:b.setting,crudPermissions:b.crudPermissions}})},b.deleteChatWebsite=S,b.exportSelectedChatWebsites=function(){var e=angular.copy(b.selectedChatWebsites);return b.selectedChatWebsites=[],e},b.deleteSelectedChatWebsites=function(e){var n=i.confirm().title("Are you sure want to delete the selected chatWebsites?").htmlContent(""+b.selectedChatWebsites.length+" selected will be deleted.").ariaLabel("delete ChatWebsites").targetEvent(e).ok("OK").cancel("CANCEL");i.show(n).then(function(){b.selectedChatWebsites.forEach(function(e){S(e)}),b.selectedChatWebsites=[]})},b.deselectChatWebsites=function(){b.selectedChatWebsites=[]},b.selectAllChatWebsites=function(){b.selectedChatWebsites=b.chatWebsites.rows},g.hasRole("admin")?m.cmList.get({fields:"id,name",sort:"name"}).$promise.then(function(e){b.lists=e.rows||[]}).catch(function(e){p.error({title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:GET_LISTS",msg:e.data?JSON.stringify(e.data):e.toString()})}):m.cmList.get({fields:"id,name",sort:"name"}).$promise.then(function(e){b.lists=e.rows||[]}).then(function(){return m.userProfileSection.get({userProfileId:b.currentUser.userProfileId,sectionId:301}).$promise}).then(function(e){var n=e&&e.rows?e.rows[0]:null;if(n){if(!n.autoAssociation)return m.userProfileResource.get({sectionId:n.id}).$promise.then(function(e){var n=_.map(e.rows,function(e){return _.find(b.lists,{id:e.resourceId})}),t=null;if(b.chatWebsite&&(t=_.find(b.lists,{id:Number(b.chatWebsite.ListId)})),t&&!_.some(n,["id",t.id])){var a=_.find(b.lists,{id:t.id});a.canSelect=!1,n.push(a)}b.lists=n})}else{var t=[],a=null;b.chatWebsite&&(a=_.find(b.lists,{id:Number(b.chatWebsite.ListId)}));for(var i=0;i"+e.app+" will be deleted.").ariaLabel("delete application").targetEvent(t).ok("OK").cancel("CANCEL");i.show(a).then(function(){r.chatWebsiteApps.rows.splice(n,1),l()},function(){console.log("CANCEL")})},r.getChatWebsiteApps=function(){r.promise=o.chatWebsite.getApplications(r.query,t).$promise},r.editChatWebsiteApp=n,r.editInterval=function(e,n){if(r.chatWebsiteApps.rows.length){var t=r.chatWebsiteApps.rows[n]?r.chatWebsiteApps.rows[n]:r.chatWebsiteApps.rows[0];i.show({controller:"EditChatWebsiteAppintervalDialogController",controllerAs:"vm",templateUrl:"app/main/apps/chat/views/chatWebsites/edit/apps/interval/dialog.html",parent:angular.element(a.body),targetEvent:e,clickOutsideToClose:!0,locals:{interval:{interval:t.interval,IntervalId:t.IntervalId,application:!0},intervals:[],crudPermissions:r.crudPermissions}}).then(function(e){e&&(t.interval=e.interval||"*,*,*,*",t.IntervalId=e.IntervalId||null,l())})}},r.deleteChatWebsiteApp=function(e){_.remove(r.chatWebsiteApps.rows,{id:e.id}),l(),s.success({title:"App deleted!",msg:e.app?e.app+" has been deleted!":""})},r.deleteSelectedChatWebsiteApps=function(e){var n=i.confirm().title("Are you sure want to delete the selected applications?").htmlContent(""+r.selectedChatWebsiteApps.length+" selected will be deleted.").ariaLabel("delete applications").targetEvent(e).ok("OK").cancel("CANCEL");i.show(n).then(function(){r.selectedChatWebsiteApps.forEach(function(e){_.remove(r.chatWebsiteApps.rows,{id:e.id})}),r.selectedChatWebsiteApps=[],l()})},r.rewriteRouting=l,r.getIntervals=function(){return o.interval.get({fields:"id,interval,IntervalId"}).$promise.then(function(e){r.intervals=e}).catch(function(e){console.error(e)})}}e.$inject=["api","$mdDialog","$document","toasty","Auth"],angular.module("app.chat").controller("ChatWebsiteActionsController",e)}(),function(){"use strict";function e(e,a,i,s,n,t,o,r,l,d){var c=this;function m(){return a(function(t,n){return a(function(n,t){return s.user.get({fields:"id,name,internal,fullname",nolimit:!0,role:"agent"}).$promise.then(function(e){n(e)}).catch(function(e){t(e)})}).then(function(e){return c.items=e.rows?e.rows:[],l.hasRole("admin")?e:c.section?c.section.autoAssociation?e:a(function(n,t){return s.userProfileResource.get({sectionId:c.section.id,nolimit:!0}).$promise.then(function(e){n(e)}).catch(function(e){t(e)})}):null}).then(function(e){var n=e&&e.rows?e.rows:[];return c.allowedItems=_.map(n,function(e){return _.find(c.items,{id:l.hasRole("admin")||c.section.autoAssociation?e.id:e.resourceId})}),c.startingAllowedItems=angular.copy(c.allowedItems),c.items.forEach(function(e){var n=_.find(c.allowedItems,{id:e.id});l.hasRole("admin")?e.isValid=!0:e.isValid=void 0!==n}),a(function(n,t){return s.chatWebsite.getAgents({id:c.chatWebsite.id,fields:"id,name,internal,fullname",nolimit:!0,role:"agent"}).$promise.then(function(e){n(e)}).catch(function(e){t(e)})})}).then(function(e){var n=e&&e.rows?e.rows:[];c.selectedItems=_.map(n,function(e){var n=_.find(c.items,{id:e.id});return n.penalty=e.UserChatWebsite?"penalty "+e.UserChatWebsite.penalty:"",n.internal=e.hasOwnProperty("internal")?"<"+e.internal+">":"",n}),c.startingSelectedItems=angular.copy(c.selectedItems),c.dualMultiselectOptions.selectedItems=c.selectedItems,c.dualMultiselectOptions.items=_.differenceBy(c.allowedItems,c.dualMultiselectOptions.selectedItems,"id"),t()}).catch(function(e){n(e)})})}c.currentUser=l.getCurrentUser(),c.chatWebsite=n,c.crudPermissions=d,c.realtime=o,c.items=[],c.allowedItems=[],c.selectedItems=[],c.startingAllowedItems=[],c.startingSelectedItems=[],c.pendingChanges=!1,c.onInit=function(){return l.hasRole("admin")?m().catch(function(e){i.error({title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:GET_AGENTS",msg:e.status?JSON.stringify(e.data):e.toString()})}):a(function(t,n){s.userProfileSection.get({userProfileId:c.currentUser.userProfileId,name:"Agents"}).$promise.then(function(e){var n=e&&e.rows?e.rows[0]:null;t(n)}).catch(function(e){n(e)})}).then(function(e){return c.section=e,m()}).catch(function(e){i.error({title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:GET_AGENTS",msg:e.status?JSON.stringify(e.data):e.toString()})})},c.saveAgents=function(){var e=_.differenceBy(c.startingSelectedItems,c.selectedItems,"id"),n=_.differenceBy(c.selectedItems,c.startingSelectedItems,"id");return(t=e,a(function(e,n){_.isEmpty(t)?e():s.chatWebsite.removeAgents({id:c.chatWebsite.id,ids:_.map(t,"id")}).$promise.then(function(){e()}).catch(function(e){n(e)})})).then(function(){return t=n,a(function(e,n){_.isEmpty(t)?e():s.chatWebsite.addAgents({id:c.chatWebsite.id,ids:_.map(t,"id")}).$promise.then(function(){e()}).catch(function(e){n(e)})});var t}).then(function(){c.pendingChanges=!1,c.startingAllowedItems=angular.copy(c.allowedItems),c.startingSelectedItems=angular.copy(c.selectedItems),i.success({title:"SUCCESS",msg:"Agents association has been updated!"})}).catch(function(e){i.error({title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:LISTS_ASSOCIATION",msg:e.status?JSON.stringify(e.data):e.toString()})});var t},c.closeDialog=function(){e.hide()},c.dualMultiselectOptions={readOnly:!c.crudPermissions.canEdit,items:[],selectedItems:[],showSelectAndDeselectAll:!0,orderBy:"name",line1:"fullname",line2:["name","internal"],line3:"",labelAll:r.instant("CHAT.ALL_AGENTS"),labelSelected:r.instant("CHAT.SELECTED_AGENTS"),transferCallback:function(e,n){var t=_.xorBy(c.startingSelectedItems,c.selectedItems,"id");c.pendingChanges=!_.isEmpty(t)}}}e.$inject=["$mdDialog","$q","toasty","api","chatWebsite","chatWebsites","realtime","$translate","Auth","crudPermissions"],angular.module("app.chat").controller("ChatWebsiteagentaddController",e)}(),function(){"use strict";function e(e,a){var i=this;i.chatWebsite={},i.crudPermissions,i.ngFlowOptions={singleFile:!0,maxChunkRetries:1,chunkSize:8388608,simultaneousUploads:1,testChunks:!1,progressCallbacksInterval:1e3,allowDuplicateUploads:!0},i.ngFlow={flow:{}},i.dropping=!1,i.fileAdded=function(e){var n=["png","jpg"];if(!_.includes(n,e.getExtension()))return a.error({title:"Invalid extension: "+e.getExtension(),msg:"Supported extension: "+n.join()}),!1;if(8388608"+(e.name||"chatCannedAnswer")+" will be deleted.").ariaLabel("delete chatCannedAnswer").targetEvent(n).ok("OK").cancel("CANCEL");s.show(t).then(function(){g(e)},function(){console.log("CANCEL")})},c.success=p,c.getChatWebsiteChatCannedAnswers=function(){c.query.offset=(c.query.page-1)*c.query.limit,c.promise=l.chatWebsite.getAnswers(c.query,p).$promise},c.createOrEditChatWebsiteChatCannedAnswer=function(e,n){s.show({controller:"CreateOrEditChatCannedAnswerDialogController",controllerAs:"vm",templateUrl:"app/main/apps/chat/views/chatWebsites/edit/chatCannedAnswers/dialog.html",parent:angular.element(o.body),targetEvent:e,clickOutsideToClose:!0,locals:{chatWebsite:c.chatWebsite,chatCannedAnswer:n,chatCannedAnswers:c.chatWebsiteChatCannedAnswers.rows,license:null,setting:null,crudPermissions:c.crudPermissions}})},c.exportSelectedChatWebsiteChatCannedAnswers=function(){var e=angular.copy(c.selectedChatWebsiteChatCannedAnswers);return c.selectedChatWebsiteChatCannedAnswers=[],e},c.deleteChatWebsiteChatCannedAnswer=g,c.deleteSelectedChatWebsiteChatCannedAnswers=function(e){var n=s.confirm().title("Are you sure want to delete the selected chatCannedAnswers?").htmlContent(""+c.selectedChatWebsiteChatCannedAnswers.length+" selected will be deleted.").ariaLabel("delete chatCannedAnswers").targetEvent(e).ok("OK").cancel("CANCEL");s.show(n).then(function(){c.selectedChatWebsiteChatCannedAnswers.forEach(function(e){g(e)}),c.selectedChatWebsiteChatCannedAnswers=[]})};var m=!0,u=1;function p(e){c.chatWebsiteChatCannedAnswers=e||{count:0,rows:[]}}function g(e){l.cannedAnswer.delete({id:e.id}).$promise.then(function(){_.remove(c.chatWebsiteChatCannedAnswers.rows,{id:e.id}),c.chatWebsiteChatCannedAnswers.count-=1,c.chatWebsiteChatCannedAnswers.rows.length||c.getChatWebsiteChatCannedAnswers(),r.success({title:"ChatCannedAnswer deleted!",msg:e.name?e.name+" has been deleted!":""})}).catch(function(e){if(e.data&&e.data.errors&&e.data.errors.length){vm.errors=e.data.errors||[{message:e.toString(),type:"SYSTEM:GETchatWebsite"}];for(var n=0;n"+(e.name||"chatDisposition")+" will be deleted.").ariaLabel("delete chatDisposition").targetEvent(n).ok("OK").cancel("CANCEL");s.show(t).then(function(){g(e)},function(){console.log("CANCEL")})},c.success=p,c.getChatWebsiteChatDispositions=function(){c.query.offset=(c.query.page-1)*c.query.limit,c.promise=l.chatWebsite.getDispositions(c.query,p).$promise},c.createOrEditChatWebsiteChatDisposition=function(e,n){s.show({controller:"CreateOrEditChatDispositionDialogController",controllerAs:"vm",templateUrl:"app/main/apps/chat/views/chatWebsites/edit/chatDispositions/dialog.html",parent:angular.element(o.body),targetEvent:e,clickOutsideToClose:!0,locals:{chatWebsite:c.chatWebsite,chatDisposition:n,chatDispositions:c.chatWebsiteChatDispositions.rows,license:null,setting:null,crudPermissions:c.crudPermissions}})},c.exportSelectedChatWebsiteChatDispositions=function(){var e=angular.copy(c.selectedChatWebsiteChatDispositions);return c.selectedChatWebsiteChatDispositions=[],e},c.deleteChatWebsiteChatDisposition=g,c.deleteSelectedChatWebsiteChatDispositions=function(e){var n=s.confirm().title("Are you sure want to delete the selected chatDispositions?").htmlContent(""+c.selectedChatWebsiteChatDispositions.length+" selected will be deleted.").ariaLabel("delete chatDispositions").targetEvent(e).ok("OK").cancel("CANCEL");s.show(n).then(function(){c.selectedChatWebsiteChatDispositions.forEach(function(e){g(e)}),c.selectedChatWebsiteChatDispositions=[]})};var m=!0,u=1;function p(e){c.chatWebsiteChatDispositions=e||{count:0,rows:[]}}function g(e){l.disposition.delete({id:e.id}).$promise.then(function(){_.remove(c.chatWebsiteChatDispositions.rows,{id:e.id}),c.chatWebsiteChatDispositions.count-=1,c.chatWebsiteChatDispositions.rows.length||c.getChatWebsiteChatDispositions(),r.success({title:"ChatDisposition deleted!",msg:e.name?e.name+" has been deleted!":""})}).catch(function(e){if(e.data&&e.data.errors&&e.data.errors.length){vm.errors=e.data.errors||[{message:e.toString(),type:"SYSTEM:GETchatWebsite"}];for(var n=0;n"+(e.name||"interaction")+" will be deleted.").ariaLabel("delete interaction").targetEvent(n).ok("OK").cancel("CANCEL");s.show(t).then(function(){g(e)},function(){console.log("CANCEL")})},c.chatInteractionDownload=function(s,e,n){return l.chatInteraction.download({id:s.id,exists:!0,attachments:n}).$promise.then(function(e){var n=[e.buffer],t="interaction"+s.id,a=new Blob(n,{type:e.type});t="chat-interaction"+s.id+".zip";var i=window.document.createElement("a");i.setAttribute("href",URL.createObjectURL(a)),i.setAttribute("download",t),document.body.appendChild(i),i.click()}).catch(function(e){if(e.data&&e.data.errors&&e.data.errors.length)for(var n=0;n"+c.selectedChatWebsiteInteractions.length+" selected will be deleted.").ariaLabel("delete interactions").targetEvent(e).ok("OK").cancel("CANCEL");s.show(n).then(function(){c.selectedChatWebsiteInteractions.forEach(function(e){g(e)}),c.selectedChatWebsiteInteractions=[]})};var m=!0,u=1;function p(e){c.chatWebsiteInteractions=e||{count:0,rows:[]}}function g(e){l.chatInteraction.delete({id:e.id}).$promise.then(function(){_.remove(c.chatWebsiteInteractions.rows,{id:e.id}),c.chatWebsiteInteractions.count-=1,c.chatWebsiteInteractions.rows.length||c.getChatWebsiteInteractions(),r.success({title:"Interaction deleted!",msg:e.name?e.name+" has been deleted!":""})}).catch(function(e){if(e.data&&e.data.errors&&e.data.errors.length){vm.errors=e.data.errors||[{message:e.toString(),type:"SYSTEM:GETchatWebsite"}];for(var n=0;n"+(e.name||"offlineMessage")+" will be deleted.").ariaLabel("delete offlineMessage").targetEvent(n).ok("OK").cancel("CANCEL");s.show(t).then(function(){g(e)},function(){console.log("CANCEL")})},c.success=p,c.getChatWebsiteOfflineMessages=function(){c.query.offset=(c.query.page-1)*c.query.limit,c.promise=l.chatWebsite.getOfflineMessages(c.query,p).$promise},c.createOrEditChatWebsiteOfflineMessage=function(e,n){s.show({controller:"CreateOrEditOfflineMessageDialogController",controllerAs:"vm",templateUrl:"app/main/apps/chat/views/chatWebsites/edit/offlineMessages/dialog.html",parent:angular.element(o.body),targetEvent:e,clickOutsideToClose:!0,locals:{chatWebsite:c.chatWebsite,offlineMessage:n,offlineMessages:c.chatWebsiteOfflineMessages.rows,license:null,setting:null,crudPermissions:c.crudPermissions}})},c.showOfflineMessageChatWebsiteOfflineMessage=function(e,t){s.show({controller:"ShowOfflineMessageOfflineMessageDialogController",controllerAs:"vm",templateUrl:"app/main/apps/chat/views/chatWebsites/edit/offlineMessages/dialog.html",parent:angular.element(o.body),targetEvent:e,clickOutsideToClose:!0,resolve:{message:["apiResolver","$stateParams",function(e,n){return e.resolve("chatOfflineMessage@get",{fields:"id,body",id:t.id})}]}})},c.exportSelectedChatWebsiteOfflineMessages=function(){var e=angular.copy(c.selectedChatWebsiteOfflineMessages);return c.selectedChatWebsiteOfflineMessages=[],e},c.deleteChatWebsiteOfflineMessage=g,c.deleteSelectedChatWebsiteOfflineMessages=function(e){var n=s.confirm().title("Are you sure want to delete the selected offlineMessages?").htmlContent(""+c.selectedChatWebsiteOfflineMessages.length+" selected will be deleted.").ariaLabel("delete offlineMessages").targetEvent(e).ok("OK").cancel("CANCEL");s.show(n).then(function(){c.selectedChatWebsiteOfflineMessages.forEach(function(e){g(e)}),c.selectedChatWebsiteOfflineMessages=[]})},l.cmContact.get({fields:"id,firstName,lastName",nolimit:"true"}).$promise.then(function(e){c.contacts=e.rows||[]}).catch(function(e){r.error({title:e.status?"API:"+e.status+" - "+e.statusText:"SYSTEM:GET_CONTACTS",msg:e.data?JSON.stringify(e.data):e.toString()})});var m=!0,u=1;function p(e){c.chatWebsiteOfflineMessages=e||{count:0,rows:[]}}function g(e){l.chatOfflineMessage.delete({id:e.id}).$promise.then(function(){_.remove(c.chatWebsiteOfflineMessages.rows,{id:e.id}),c.chatWebsiteOfflineMessages.count-=1,c.chatWebsiteOfflineMessages.rows.length||c.getChatWebsiteOfflineMessages(),r.success({title:"OfflineMessage deleted!",msg:e.name?e.name+" has been deleted!":""})}).catch(function(e){if(e.data&&e.data.errors&&e.data.errors.length){vm.errors=e.data.errors||[{message:e.toString(),type:"SYSTEM:GETchatWebsite"}];for(var n=0;n"+(e.name||"chatProactiveAction")+" will be deleted.").ariaLabel("delete chatProactiveAction").targetEvent(n).ok("OK").cancel("CANCEL");s.show(t).then(function(){g(e)},function(){console.log("CANCEL")})},c.success=p,c.getChatWebsiteProactiveActions=function(){c.query.offset=(c.query.page-1)*c.query.limit,c.promise=l.chatWebsite.getProactiveActions(c.query,p).$promise},c.createOrEditChatWebsiteChatProactiveAction=function(e,n){s.show({controller:"CreateOrEditChatProactiveActionDialogController",controllerAs:"vm",templateUrl:"app/main/apps/chat/views/chatWebsites/edit/proactive/dialog.html",parent:angular.element(o.body),targetEvent:e,clickOutsideToClose:!0,locals:{chatWebsite:c.chatWebsite,chatProactiveAction:n,proactive:c.chatWebsiteProactiveActions.rows,license:null,setting:null,crudPermissions:c.crudPermissions}})},c.exportSelectedChatWebsiteProactiveActions=function(){var e=angular.copy(c.selectedChatWebsiteProactiveActions);return c.selectedChatWebsiteProactiveActions=[],e},c.deleteChatWebsiteChatProactiveAction=g,c.deleteSelectedChatWebsiteProactiveActions=function(e){var n=s.confirm().title("Are you sure want to delete the selected proactive?").htmlContent(""+c.selectedChatWebsiteProactiveActions.length+" selected will be deleted.").ariaLabel("delete proactive").targetEvent(e).ok("OK").cancel("CANCEL");s.show(n).then(function(){c.selectedChatWebsiteProactiveActions.forEach(function(e){g(e)}),c.selectedChatWebsiteProactiveActions=[]})};var m=!0,u=1;function p(e){c.chatWebsiteProactiveActions=e||{count:0,rows:[]}}function g(e){l.chatProactiveAction.delete({id:e.id}).$promise.then(function(){_.remove(c.chatWebsiteProactiveActions.rows,{id:e.id}),c.chatWebsiteProactiveActions.count-=1,c.chatWebsiteProactiveActions.rows.length||c.getChatWebsiteProactiveActions(),r.success({title:"ChatProactiveAction deleted!",msg:e.name?e.name+" has been deleted!":""})}).catch(function(e){if(e.data&&e.data.errors&&e.data.errors.length){vm.errors=e.data.errors||[{message:e.toString(),type:"SYSTEM:GETchatWebsite"}];for(var n=0;n<\/script>',n.end="\n\x3c!-- START Motion Chat Script --\x3e"},n.info={},e.$watch("vm_ac.chatWebsite.remote",function(e){n.script='\n