From d28501e245cc5092067a646892769ce1a3f5a342 Mon Sep 17 00:00:00 2001 From: Andrea Bianco Date: Wed, 30 Oct 2019 12:28:35 +0100 Subject: [PATCH] Built motion from commit (unavailable).|2.3.9 --- apidoc/api_project.js | 2 +- apidoc/api_project.json | 2 +- package.json | 2 +- public/index.html | 2 +- public/scripts/vendor.8e8c1faf.js | 1 + public/scripts/vendor.d7c1518f.js | 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 +- 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/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/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/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/files/chat/iframe.js | 114 +- server/migrations/2.3.9.js | 165 + 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/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.11/assets/images/avatars/agent0.png | Bin 5172 -> 0 bytes snippet/1.0.11/assets/images/avatars/customer0.png | Bin 3439 -> 0 bytes snippet/1.0.11/assets/images/avatars/robot0.png | Bin 3252 -> 0 bytes .../1.0.11/assets/images/logos/whisker_32x32.png | Bin 2456 -> 0 bytes .../1.0.11/fonts/materialdesignicons-webfont.eot | Bin 417036 -> 0 bytes .../1.0.11/fonts/materialdesignicons-webfont.svg | 8694 ----- .../1.0.11/fonts/materialdesignicons-webfont.ttf | Bin 416816 -> 0 bytes .../1.0.11/fonts/materialdesignicons-webfont.woff | Bin 204320 -> 0 bytes .../1.0.11/fonts/materialdesignicons-webfont.woff2 | Bin 151728 -> 0 bytes snippet/1.0.11/index.html | 80 - snippet/1.0.11/scripts/app.js | 658 - snippet/1.0.11/scripts/vendor.js |37298 ------------------- snippet/1.0.11/styles/app.css | 391 - snippet/1.0.11/styles/vendor.css |38057 -------------------- snippet/1.0.12/assets/images/avatars/agent0.png | Bin 0 -> 5172 bytes snippet/1.0.12/assets/images/avatars/customer0.png | Bin 0 -> 3439 bytes snippet/1.0.12/assets/images/avatars/robot0.png | Bin 0 -> 3252 bytes .../1.0.12/assets/images/logos/whisker_32x32.png | Bin 0 -> 2456 bytes .../1.0.12/fonts/materialdesignicons-webfont.eot | Bin 0 -> 417036 bytes .../1.0.12/fonts/materialdesignicons-webfont.svg | 8694 +++++ .../1.0.12/fonts/materialdesignicons-webfont.ttf | Bin 0 -> 416816 bytes .../1.0.12/fonts/materialdesignicons-webfont.woff | Bin 0 -> 204320 bytes .../1.0.12/fonts/materialdesignicons-webfont.woff2 | Bin 0 -> 151728 bytes snippet/1.0.12/index.html | 71 + snippet/1.0.12/scripts/app.js | 662 + snippet/1.0.12/scripts/vendor.js |37298 +++++++++++++++++++ snippet/1.0.12/styles/app.css | 391 + snippet/1.0.12/styles/vendor.css |38057 ++++++++++++++++++++ 1079 files changed, 86493 insertions(+), 86233 deletions(-) create mode 100644 public/scripts/vendor.8e8c1faf.js delete mode 100644 public/scripts/vendor.d7c1518f.js create mode 100644 server/migrations/2.3.9.js delete mode 100644 snippet/1.0.11/assets/images/avatars/agent0.png delete mode 100644 snippet/1.0.11/assets/images/avatars/customer0.png delete mode 100644 snippet/1.0.11/assets/images/avatars/robot0.png delete mode 100644 snippet/1.0.11/assets/images/logos/whisker_32x32.png delete mode 100644 snippet/1.0.11/fonts/materialdesignicons-webfont.eot delete mode 100644 snippet/1.0.11/fonts/materialdesignicons-webfont.svg delete mode 100644 snippet/1.0.11/fonts/materialdesignicons-webfont.ttf delete mode 100644 snippet/1.0.11/fonts/materialdesignicons-webfont.woff delete mode 100644 snippet/1.0.11/fonts/materialdesignicons-webfont.woff2 delete mode 100644 snippet/1.0.11/index.html delete mode 100644 snippet/1.0.11/scripts/app.js delete mode 100644 snippet/1.0.11/scripts/vendor.js delete mode 100644 snippet/1.0.11/styles/app.css delete mode 100644 snippet/1.0.11/styles/vendor.css create mode 100644 snippet/1.0.12/assets/images/avatars/agent0.png create mode 100644 snippet/1.0.12/assets/images/avatars/customer0.png create mode 100644 snippet/1.0.12/assets/images/avatars/robot0.png create mode 100644 snippet/1.0.12/assets/images/logos/whisker_32x32.png create mode 100644 snippet/1.0.12/fonts/materialdesignicons-webfont.eot create mode 100644 snippet/1.0.12/fonts/materialdesignicons-webfont.svg create mode 100644 snippet/1.0.12/fonts/materialdesignicons-webfont.ttf create mode 100644 snippet/1.0.12/fonts/materialdesignicons-webfont.woff create mode 100644 snippet/1.0.12/fonts/materialdesignicons-webfont.woff2 create mode 100644 snippet/1.0.12/index.html create mode 100644 snippet/1.0.12/scripts/app.js create mode 100644 snippet/1.0.12/scripts/vendor.js create mode 100644 snippet/1.0.12/styles/app.css create mode 100644 snippet/1.0.12/styles/vendor.css diff --git a/apidoc/api_project.js b/apidoc/api_project.js index e2fed69..cd0aa75 100644 --- a/apidoc/api_project.js +++ b/apidoc/api_project.js @@ -1 +1 @@ -define({ "name": "xCALLY Motion API", "version": "2.3.8", "description": "Thank you for choosing xCALLY MOTION, one of the first Omni Channel solution integrated with AsteriskTM and the most innovative real time solutions available on the market.", "title": "xCALLY MOTION API", "header": { "title": "Introduction", "content": "

The API

\n

This is the documentation for the xCALLY MOTION API.

\n

We make changes to the APIs from time to time. For more information, see Changelog.

\n

The xCALLY MOTION API consists of several different APIs. Use the left sidebar menu to select one.

\n

The API is a JSON API. XML is not supported. To learn more, see [Working with JSON].

\n

Endpoints are documented with the HTTP method for the request and a partial resource identifier.\nExample:

\n
GET /api/users\n
\n

Prepend your xCALLY URL to the resource identifier to get the full endpoint URL:

\n
https://motion.xcally.com/api/users\n
\n

Curly braces, {}, indicate values you have to supply. Example:

\n
GET  /api/users/{id}\n
\n

The examples in the docs are cURL statements. You can run the statements on a command line to try out different API requests. To learn more, see [Installing and using cURL]. In Windows, you'll need to modify some of the examples in the docs to make them work. See [Using cURL in Windows].

\n

The examples use basic authentication requiring a xCALLY username and password.

\n

Security and Authentication

\n

This is an SSL-only API, regardless of how your account is configured. You can authorize against the API using either basic authentication with your username and password or with an OAuth access token or API Key.

\n

Client-side CORS requests are supported if the request is authenticated with an OAuth access token. The requests are not supported if the request uses basic authentication or API Key.

\n

Basic authentication

\n

Use the following authentication format with your username and password:\n{username}:{password}

\n

Example:

\n
curl -u admin:password https://motion.xcally.com/api/users\n
\n

OAuth access token

\n

The xCALLY API supports OAuth authorization flows.

\n

OAuth access tokens also permit client-side API requests.

\n

In your requests, specify the access token in an Authorization header as follows:\nAuthorization: Bearer {token}

\n

Example:

\n
curl -H "Authorization: Bearer gErypPlm4dOVgGRvA1ZzMH5MQ3nLo8bo" https://motion.xcally.com/api/users\n
\n

API Key

\n

In your request, specify the API Key in apikey query parameter

\n

Example:

\n
curl -u admin:password https://motion.xcally.com/api/users?apikey=eyJhbGciOiJIUzUxMiIsInR5cC...\n
\n

Request Format

\n

The xCALLY API is a JSON API. You must supply a Content-Type: application/json header in PUT and POST requests. You must set an Accept: application/json header on all requests. You may get a text/plain response in case of an error like a bad request. You should treat this as an error you need to fix.

\n

Response Format

\n

The xCALLY API responds to successful requests with HTTP status codes in the 200 or 300 range. When you create or update a resource, the API renders the resulting JSON representation in the response body.

\n

Responses may have the status codes described in the following sections.

\n

200 range

\n

The request was successful. The status is 200 for successful GET and PUT requests, 201 for most POST requests, and 204 for DELETE requests.

\n

400 range

\n

The request was not successful. The content type of the response may be text/plain for API-level error messages, such as when trying to call the API without SSL. The content type is application/json for business-level error messages because the response includes a JSON object with information about the error.

\n

If you see a response from a known endpoint that looks like plain text, you probably made a syntax error in your request. This type of response commonly occurs when making a request to a nonexistent xCALLY Support instance.

\n

500 range

\n

When building an API client, we recommend treating any 500 status codes as a warning or temporary state. However, if the status persists and we don't have a publicly announced maintenance or service disruption, contact us at support@xcally.com.

\n

If submitting a ticket to Support, provide the complete HTTP response. This helps the Support team track down the request in the logs more quickly.

\n

Data Types

\n

The API returns and accepts JSON values, which can be strings in double quotes, numbers, objects, arrays, true or false, or null. Most programming languages have tools to parse this data.

\n

ID integers

\n

Most xCALLY Support resources such as queues and users are identified by the integer specified by the id attribute of API responses.

\n

The default numeric type in JavaScript, Ruby, Python, and PHP is sufficient to represent xCALLY Support ID integers.

\n

Time stamps

\n

Time stamps use UTC time and are formatted as ISO 8601 strings. Example: 2017-04-16T09:14:57Z

\n" }, "template": { "withGenerator": false, "withCompare": false, "forceLanguage": "en" }, "sampleUrl": false, "defaultVersion": "0.0.0", "apidoc": "0.3.0", "generator": { "name": "apidoc", "time": "2019-10-25T14:53:32.752Z", "url": "http://apidocjs.com", "version": "0.17.7" } }); +define({ "name": "xCALLY Motion API", "version": "2.3.9", "description": "Thank you for choosing xCALLY MOTION, one of the first Omni Channel solution integrated with AsteriskTM and the most innovative real time solutions available on the market.", "title": "xCALLY MOTION API", "header": { "title": "Introduction", "content": "

The API

\n

This is the documentation for the xCALLY MOTION API.

\n

We make changes to the APIs from time to time. For more information, see Changelog.

\n

The xCALLY MOTION API consists of several different APIs. Use the left sidebar menu to select one.

\n

The API is a JSON API. XML is not supported. To learn more, see [Working with JSON].

\n

Endpoints are documented with the HTTP method for the request and a partial resource identifier.\nExample:

\n
GET /api/users\n
\n

Prepend your xCALLY URL to the resource identifier to get the full endpoint URL:

\n
https://motion.xcally.com/api/users\n
\n

Curly braces, {}, indicate values you have to supply. Example:

\n
GET  /api/users/{id}\n
\n

The examples in the docs are cURL statements. You can run the statements on a command line to try out different API requests. To learn more, see [Installing and using cURL]. In Windows, you'll need to modify some of the examples in the docs to make them work. See [Using cURL in Windows].

\n

The examples use basic authentication requiring a xCALLY username and password.

\n

Security and Authentication

\n

This is an SSL-only API, regardless of how your account is configured. You can authorize against the API using either basic authentication with your username and password or with an OAuth access token or API Key.

\n

Client-side CORS requests are supported if the request is authenticated with an OAuth access token. The requests are not supported if the request uses basic authentication or API Key.

\n

Basic authentication

\n

Use the following authentication format with your username and password:\n{username}:{password}

\n

Example:

\n
curl -u admin:password https://motion.xcally.com/api/users\n
\n

OAuth access token

\n

The xCALLY API supports OAuth authorization flows.

\n

OAuth access tokens also permit client-side API requests.

\n

In your requests, specify the access token in an Authorization header as follows:\nAuthorization: Bearer {token}

\n

Example:

\n
curl -H "Authorization: Bearer gErypPlm4dOVgGRvA1ZzMH5MQ3nLo8bo" https://motion.xcally.com/api/users\n
\n

API Key

\n

In your request, specify the API Key in apikey query parameter

\n

Example:

\n
curl -u admin:password https://motion.xcally.com/api/users?apikey=eyJhbGciOiJIUzUxMiIsInR5cC...\n
\n

Request Format

\n

The xCALLY API is a JSON API. You must supply a Content-Type: application/json header in PUT and POST requests. You must set an Accept: application/json header on all requests. You may get a text/plain response in case of an error like a bad request. You should treat this as an error you need to fix.

\n

Response Format

\n

The xCALLY API responds to successful requests with HTTP status codes in the 200 or 300 range. When you create or update a resource, the API renders the resulting JSON representation in the response body.

\n

Responses may have the status codes described in the following sections.

\n

200 range

\n

The request was successful. The status is 200 for successful GET and PUT requests, 201 for most POST requests, and 204 for DELETE requests.

\n

400 range

\n

The request was not successful. The content type of the response may be text/plain for API-level error messages, such as when trying to call the API without SSL. The content type is application/json for business-level error messages because the response includes a JSON object with information about the error.

\n

If you see a response from a known endpoint that looks like plain text, you probably made a syntax error in your request. This type of response commonly occurs when making a request to a nonexistent xCALLY Support instance.

\n

500 range

\n

When building an API client, we recommend treating any 500 status codes as a warning or temporary state. However, if the status persists and we don't have a publicly announced maintenance or service disruption, contact us at support@xcally.com.

\n

If submitting a ticket to Support, provide the complete HTTP response. This helps the Support team track down the request in the logs more quickly.

\n

Data Types

\n

The API returns and accepts JSON values, which can be strings in double quotes, numbers, objects, arrays, true or false, or null. Most programming languages have tools to parse this data.

\n

ID integers

\n

Most xCALLY Support resources such as queues and users are identified by the integer specified by the id attribute of API responses.

\n

The default numeric type in JavaScript, Ruby, Python, and PHP is sufficient to represent xCALLY Support ID integers.

\n

Time stamps

\n

Time stamps use UTC time and are formatted as ISO 8601 strings. Example: 2017-04-16T09:14:57Z

\n" }, "template": { "withGenerator": false, "withCompare": false, "forceLanguage": "en" }, "sampleUrl": false, "defaultVersion": "0.0.0", "apidoc": "0.3.0", "generator": { "name": "apidoc", "time": "2019-10-30T11:21:27.209Z", "url": "http://apidocjs.com", "version": "0.17.7" } }); diff --git a/apidoc/api_project.json b/apidoc/api_project.json index ac786aa..a0607d0 100644 --- a/apidoc/api_project.json +++ b/apidoc/api_project.json @@ -1 +1 @@ -{ "name": "xCALLY Motion API", "version": "2.3.8", "description": "Thank you for choosing xCALLY MOTION, one of the first Omni Channel solution integrated with AsteriskTM and the most innovative real time solutions available on the market.", "title": "xCALLY MOTION API", "header": { "title": "Introduction", "content": "

The API

\n

This is the documentation for the xCALLY MOTION API.

\n

We make changes to the APIs from time to time. For more information, see Changelog.

\n

The xCALLY MOTION API consists of several different APIs. Use the left sidebar menu to select one.

\n

The API is a JSON API. XML is not supported. To learn more, see [Working with JSON].

\n

Endpoints are documented with the HTTP method for the request and a partial resource identifier.\nExample:

\n
GET /api/users\n
\n

Prepend your xCALLY URL to the resource identifier to get the full endpoint URL:

\n
https://motion.xcally.com/api/users\n
\n

Curly braces, {}, indicate values you have to supply. Example:

\n
GET  /api/users/{id}\n
\n

The examples in the docs are cURL statements. You can run the statements on a command line to try out different API requests. To learn more, see [Installing and using cURL]. In Windows, you'll need to modify some of the examples in the docs to make them work. See [Using cURL in Windows].

\n

The examples use basic authentication requiring a xCALLY username and password.

\n

Security and Authentication

\n

This is an SSL-only API, regardless of how your account is configured. You can authorize against the API using either basic authentication with your username and password or with an OAuth access token or API Key.

\n

Client-side CORS requests are supported if the request is authenticated with an OAuth access token. The requests are not supported if the request uses basic authentication or API Key.

\n

Basic authentication

\n

Use the following authentication format with your username and password:\n{username}:{password}

\n

Example:

\n
curl -u admin:password https://motion.xcally.com/api/users\n
\n

OAuth access token

\n

The xCALLY API supports OAuth authorization flows.

\n

OAuth access tokens also permit client-side API requests.

\n

In your requests, specify the access token in an Authorization header as follows:\nAuthorization: Bearer {token}

\n

Example:

\n
curl -H "Authorization: Bearer gErypPlm4dOVgGRvA1ZzMH5MQ3nLo8bo" https://motion.xcally.com/api/users\n
\n

API Key

\n

In your request, specify the API Key in apikey query parameter

\n

Example:

\n
curl -u admin:password https://motion.xcally.com/api/users?apikey=eyJhbGciOiJIUzUxMiIsInR5cC...\n
\n

Request Format

\n

The xCALLY API is a JSON API. You must supply a Content-Type: application/json header in PUT and POST requests. You must set an Accept: application/json header on all requests. You may get a text/plain response in case of an error like a bad request. You should treat this as an error you need to fix.

\n

Response Format

\n

The xCALLY API responds to successful requests with HTTP status codes in the 200 or 300 range. When you create or update a resource, the API renders the resulting JSON representation in the response body.

\n

Responses may have the status codes described in the following sections.

\n

200 range

\n

The request was successful. The status is 200 for successful GET and PUT requests, 201 for most POST requests, and 204 for DELETE requests.

\n

400 range

\n

The request was not successful. The content type of the response may be text/plain for API-level error messages, such as when trying to call the API without SSL. The content type is application/json for business-level error messages because the response includes a JSON object with information about the error.

\n

If you see a response from a known endpoint that looks like plain text, you probably made a syntax error in your request. This type of response commonly occurs when making a request to a nonexistent xCALLY Support instance.

\n

500 range

\n

When building an API client, we recommend treating any 500 status codes as a warning or temporary state. However, if the status persists and we don't have a publicly announced maintenance or service disruption, contact us at support@xcally.com.

\n

If submitting a ticket to Support, provide the complete HTTP response. This helps the Support team track down the request in the logs more quickly.

\n

Data Types

\n

The API returns and accepts JSON values, which can be strings in double quotes, numbers, objects, arrays, true or false, or null. Most programming languages have tools to parse this data.

\n

ID integers

\n

Most xCALLY Support resources such as queues and users are identified by the integer specified by the id attribute of API responses.

\n

The default numeric type in JavaScript, Ruby, Python, and PHP is sufficient to represent xCALLY Support ID integers.

\n

Time stamps

\n

Time stamps use UTC time and are formatted as ISO 8601 strings. Example: 2017-04-16T09:14:57Z

\n" }, "template": { "withGenerator": false, "withCompare": false, "forceLanguage": "en" }, "sampleUrl": false, "defaultVersion": "0.0.0", "apidoc": "0.3.0", "generator": { "name": "apidoc", "time": "2019-10-25T14:53:32.752Z", "url": "http://apidocjs.com", "version": "0.17.7" } } +{ "name": "xCALLY Motion API", "version": "2.3.9", "description": "Thank you for choosing xCALLY MOTION, one of the first Omni Channel solution integrated with AsteriskTM and the most innovative real time solutions available on the market.", "title": "xCALLY MOTION API", "header": { "title": "Introduction", "content": "

The API

\n

This is the documentation for the xCALLY MOTION API.

\n

We make changes to the APIs from time to time. For more information, see Changelog.

\n

The xCALLY MOTION API consists of several different APIs. Use the left sidebar menu to select one.

\n

The API is a JSON API. XML is not supported. To learn more, see [Working with JSON].

\n

Endpoints are documented with the HTTP method for the request and a partial resource identifier.\nExample:

\n
GET /api/users\n
\n

Prepend your xCALLY URL to the resource identifier to get the full endpoint URL:

\n
https://motion.xcally.com/api/users\n
\n

Curly braces, {}, indicate values you have to supply. Example:

\n
GET  /api/users/{id}\n
\n

The examples in the docs are cURL statements. You can run the statements on a command line to try out different API requests. To learn more, see [Installing and using cURL]. In Windows, you'll need to modify some of the examples in the docs to make them work. See [Using cURL in Windows].

\n

The examples use basic authentication requiring a xCALLY username and password.

\n

Security and Authentication

\n

This is an SSL-only API, regardless of how your account is configured. You can authorize against the API using either basic authentication with your username and password or with an OAuth access token or API Key.

\n

Client-side CORS requests are supported if the request is authenticated with an OAuth access token. The requests are not supported if the request uses basic authentication or API Key.

\n

Basic authentication

\n

Use the following authentication format with your username and password:\n{username}:{password}

\n

Example:

\n
curl -u admin:password https://motion.xcally.com/api/users\n
\n

OAuth access token

\n

The xCALLY API supports OAuth authorization flows.

\n

OAuth access tokens also permit client-side API requests.

\n

In your requests, specify the access token in an Authorization header as follows:\nAuthorization: Bearer {token}

\n

Example:

\n
curl -H "Authorization: Bearer gErypPlm4dOVgGRvA1ZzMH5MQ3nLo8bo" https://motion.xcally.com/api/users\n
\n

API Key

\n

In your request, specify the API Key in apikey query parameter

\n

Example:

\n
curl -u admin:password https://motion.xcally.com/api/users?apikey=eyJhbGciOiJIUzUxMiIsInR5cC...\n
\n

Request Format

\n

The xCALLY API is a JSON API. You must supply a Content-Type: application/json header in PUT and POST requests. You must set an Accept: application/json header on all requests. You may get a text/plain response in case of an error like a bad request. You should treat this as an error you need to fix.

\n

Response Format

\n

The xCALLY API responds to successful requests with HTTP status codes in the 200 or 300 range. When you create or update a resource, the API renders the resulting JSON representation in the response body.

\n

Responses may have the status codes described in the following sections.

\n

200 range

\n

The request was successful. The status is 200 for successful GET and PUT requests, 201 for most POST requests, and 204 for DELETE requests.

\n

400 range

\n

The request was not successful. The content type of the response may be text/plain for API-level error messages, such as when trying to call the API without SSL. The content type is application/json for business-level error messages because the response includes a JSON object with information about the error.

\n

If you see a response from a known endpoint that looks like plain text, you probably made a syntax error in your request. This type of response commonly occurs when making a request to a nonexistent xCALLY Support instance.

\n

500 range

\n

When building an API client, we recommend treating any 500 status codes as a warning or temporary state. However, if the status persists and we don't have a publicly announced maintenance or service disruption, contact us at support@xcally.com.

\n

If submitting a ticket to Support, provide the complete HTTP response. This helps the Support team track down the request in the logs more quickly.

\n

Data Types

\n

The API returns and accepts JSON values, which can be strings in double quotes, numbers, objects, arrays, true or false, or null. Most programming languages have tools to parse this data.

\n

ID integers

\n

Most xCALLY Support resources such as queues and users are identified by the integer specified by the id attribute of API responses.

\n

The default numeric type in JavaScript, Ruby, Python, and PHP is sufficient to represent xCALLY Support ID integers.

\n

Time stamps

\n

Time stamps use UTC time and are formatted as ISO 8601 strings. Example: 2017-04-16T09:14:57Z

\n" }, "template": { "withGenerator": false, "withCompare": false, "forceLanguage": "en" }, "sampleUrl": false, "defaultVersion": "0.0.0", "apidoc": "0.3.0", "generator": { "name": "apidoc", "time": "2019-10-30T11:21:27.209Z", "url": "http://apidocjs.com", "version": "0.17.7" } } diff --git a/package.json b/package.json index a61a66a..857ec21 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "motion", - "version": "2.3.8", + "version": "2.3.9", "description": "xCALLY Motion is the new Realtime asynchronous solution for your multichannel contact center over Asterisk.", "main": "server/app.js", "engines": { diff --git a/public/index.html b/public/index.html index 985d340..4abec80 100644 --- a/public/index.html +++ b/public/index.html @@ -56,7 +56,7 @@ - + diff --git a/public/scripts/vendor.8e8c1faf.js b/public/scripts/vendor.8e8c1faf.js new file mode 100644 index 0000000..7a4c93b --- /dev/null +++ b/public/scripts/vendor.8e8c1faf.js @@ -0,0 +1 @@ +if(function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(A,e){var t=[],S=A.document,u=t.slice,m=t.concat,s=t.push,i=t.indexOf,n={},r=n.toString,p=n.hasOwnProperty,g={},a="2.2.4",x=function(e,t){return new x.fn.init(e,t)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,l=/^-ms-/,c=/-([\da-z])/gi,f=function(e,t){return t.toUpperCase()};function d(e){var t=!!e&&"length"in e&&e.length,n=x.type(e);return"function"!==n&&!x.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+R+")"+R+"*"),W=new RegExp("="+R+"*([^\\]'\"]*?)"+R+"*\\]","g"),q=new RegExp(G),z=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+F),PSEUDO:new RegExp("^"+G),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+R+"*(even|odd|(([+-]|)(\\d*)n|)"+R+"*(?:([+-]|)"+R+"*(\\d+)|))"+R+"*\\)|)","i"),bool:new RegExp("^(?:"+N+")$","i"),needsContext:new RegExp("^"+R+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+R+"*((?:-\\d)?\\d*)"+R+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,K=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,X=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Z=/[+~]/,J=/'|\\/g,ee=new RegExp("\\\\([\\da-f]{1,6}"+R+"?|("+R+")|.)","ig"),te=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},ne=function(){C()};try{M.apply(t=$.call(v.childNodes),v.childNodes),t[v.childNodes.length].nodeType}catch(e){M={apply:t.length?function(e,t){P.apply(e,$.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function re(e,t,n,r){var i,a,o,s,l,c,u,f,d=t&&t.ownerDocument,h=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==h&&9!==h&&11!==h)return n;if(!r&&((t?t.ownerDocument||t:v)!==A&&C(t),t=t||A,S)){if(11!==h&&(c=X.exec(e)))if(i=c[1]){if(9===h){if(!(o=t.getElementById(i)))return n;if(o.id===i)return n.push(o),n}else if(d&&(o=d.getElementById(i))&&b(t,o)&&o.id===i)return n.push(o),n}else{if(c[2])return M.apply(n,t.getElementsByTagName(e)),n;if((i=c[3])&&p.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(i)),n}if(p.qsa&&!k[e+" "]&&(!_||!_.test(e))){if(1!==h)d=t,f=e;else if("object"!==t.nodeName.toLowerCase()){for((s=t.getAttribute("id"))?s=s.replace(J,"\\$&"):t.setAttribute("id",s=x),a=(u=m(e)).length,l=z.test(s)?"#"+s:"[id='"+s+"']";a--;)u[a]=l+" "+pe(u[a]);f=u.join(","),d=Z.test(e)&&de(t.parentNode)||t}if(f)try{return M.apply(n,d.querySelectorAll(f)),n}catch(e){}finally{s===x&&t.removeAttribute("id")}}}return g(e.replace(B,"$1"),t,n,r)}function ie(){var r=[];return function e(t,n){return r.push(t+" ")>y.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function ae(e){return e[x]=!0,e}function oe(e){var t=A.createElement("div");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function se(e,t){for(var n=e.split("|"),r=n.length;r--;)y.attrHandle[n[r]]=t}function le(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||1<<31)-(~e.sourceIndex||1<<31);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function ce(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function ue(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function fe(o){return ae(function(a){return a=+a,ae(function(e,t){for(var n,r=o([],e.length,a),i=r.length;i--;)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function de(e){return e&&void 0!==e.getElementsByTagName&&e}for(e in p=re.support={},i=re.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},C=re.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:v;return r!==A&&9===r.nodeType&&r.documentElement&&(o=(A=r).documentElement,S=!i(A),(n=A.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",ne,!1):n.attachEvent&&n.attachEvent("onunload",ne)),p.attributes=oe(function(e){return e.className="i",!e.getAttribute("className")}),p.getElementsByTagName=oe(function(e){return e.appendChild(A.createComment("")),!e.getElementsByTagName("*").length}),p.getElementsByClassName=Q.test(A.getElementsByClassName),p.getById=oe(function(e){return o.appendChild(e).id=x,!A.getElementsByName||!A.getElementsByName(x).length}),p.getById?(y.find.ID=function(e,t){if(void 0!==t.getElementById&&S){var n=t.getElementById(e);return n?[n]:[]}},y.filter.ID=function(e){var t=e.replace(ee,te);return function(e){return e.getAttribute("id")===t}}):(delete y.find.ID,y.filter.ID=function(e){var n=e.replace(ee,te);return function(e){var t=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}}),y.find.TAG=p.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):p.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,a=t.getElementsByTagName(e);if("*"!==e)return a;for(;n=a[i++];)1===n.nodeType&&r.push(n);return r},y.find.CLASS=p.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&S)return t.getElementsByClassName(e)},s=[],_=[],(p.qsa=Q.test(A.querySelectorAll))&&(oe(function(e){o.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&_.push("[*^$]="+R+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||_.push("\\["+R+"*(?:value|"+N+")"),e.querySelectorAll("[id~="+x+"-]").length||_.push("~="),e.querySelectorAll(":checked").length||_.push(":checked"),e.querySelectorAll("a#"+x+"+*").length||_.push(".#.+[+~]")}),oe(function(e){var t=A.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&_.push("name"+R+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||_.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),_.push(",.*:")})),(p.matchesSelector=Q.test(u=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&oe(function(e){p.disconnectedMatch=u.call(e,"div"),u.call(e,"[s!='']:x"),s.push("!=",G)}),_=_.length&&new RegExp(_.join("|")),s=s.length&&new RegExp(s.join("|")),t=Q.test(o.compareDocumentPosition),b=t||Q.test(o.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},E=t?function(e,t){if(e===t)return c=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!p.sortDetached&&t.compareDocumentPosition(e)===n?e===A||e.ownerDocument===v&&b(v,e)?-1:t===A||t.ownerDocument===v&&b(v,t)?1:l?O(l,e)-O(l,t):0:4&n?-1:1)}:function(e,t){if(e===t)return c=!0,0;var n,r=0,i=e.parentNode,a=t.parentNode,o=[e],s=[t];if(!i||!a)return e===A?-1:t===A?1:i?-1:a?1:l?O(l,e)-O(l,t):0;if(i===a)return le(e,t);for(n=e;n=n.parentNode;)o.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;o[r]===s[r];)r++;return r?le(o[r],s[r]):o[r]===v?-1:s[r]===v?1:0}),A},re.matches=function(e,t){return re(e,null,null,t)},re.matchesSelector=function(e,t){if((e.ownerDocument||e)!==A&&C(e),t=t.replace(W,"='$1']"),p.matchesSelector&&S&&!k[t+" "]&&(!s||!s.test(t))&&(!_||!_.test(t)))try{var n=u.call(e,t);if(n||p.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(ee,te),e[3]=(e[3]||e[4]||e[5]||"").replace(ee,te),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||re.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&re.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&q.test(n)&&(t=m(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(ee,te).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=d[e+" "];return t||(t=new RegExp("(^|"+R+")"+e+"("+R+"|$)"))&&d(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=re.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function C(e,n,r){if(x.isFunction(n))return x.grep(e,function(e,t){return!!n.call(e,t,e)!==r});if(n.nodeType)return x.grep(e,function(e){return e===n!==r});if("string"==typeof n){if(w.test(n))return x.filter(n,e,r);n=x.filter(n,e)}return x.grep(e,function(e){return-1)[^>]*|#([\w-]*))$/;(x.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||T,"string"!=typeof e)return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?void 0!==n.ready?n.ready(e):e(x):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this));if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:k.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:S,!0)),y.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=S.getElementById(r[2]))&&i.parentNode&&(this.length=1,this[0]=i),this.context=S,this.selector=e,this}).prototype=x.fn,T=x(S);var E=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function I(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}x.fn.extend({has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){for(var e=0;e",""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function X(e,t){var n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[];return void 0===t||t&&x.nodeName(e,t)?x.merge([e],n):n}function Z(e,t){for(var n=0,r=e.length;nx",g.noCloneChecked=!!J.cloneNode(!0).lastChild.defaultValue;var re=/^key/,ie=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ae=/^([^.]*)(?:\.(.+)|)/;function oe(){return!0}function se(){return!1}function le(){try{return S.activeElement}catch(e){}}function ce(e,t,n,r,i,a){var o,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ce(e,s,n,r,t[s],a);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=se;else if(!i)return e;return 1===a&&(o=i,(i=function(e){return x().off(e),o.apply(this,arguments)}).guid=o.guid||(o.guid=x.guid++)),e.each(function(){x.event.add(this,t,i,r,n)})}x.event={global:{},add:function(t,e,n,r,i){var a,o,s,l,c,u,f,d,h,p,m,g=L.get(t);if(g)for(n.handler&&(n=(a=n).handler,i=a.selector),n.guid||(n.guid=x.guid++),(l=g.events)||(l=g.events={}),(o=g.handle)||(o=g.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),c=(e=(e||"").match(M)||[""]).length;c--;)h=m=(s=ae.exec(e[c])||[])[1],p=(s[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(i?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},u=x.extend({type:h,origType:m,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&x.expr.match.needsContext.test(i),namespace:p.join(".")},a),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,p,o)||t.addEventListener&&t.addEventListener(h,o)),f.add&&(f.add.call(t,u),u.handler.guid||(u.handler.guid=n.guid)),i?d.splice(d.delegateCount++,0,u):d.push(u),x.event.global[h]=!0)},remove:function(e,t,n,r,i){var a,o,s,l,c,u,f,d,h,p,m,g=L.hasData(e)&&L.get(e);if(g&&(l=g.events)){for(c=(t=(t||"").match(M)||[""]).length;c--;)if(h=m=(s=ae.exec(t[c])||[])[1],p=(s[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(r?f.delegateType:f.bindType)||h]||[],s=s[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),o=a=d.length;a--;)u=d[a],!i&&m!==u.origType||n&&n.guid!==u.guid||s&&!s.test(u.namespace)||r&&r!==u.selector&&("**"!==r||!u.selector)||(d.splice(a,1),u.selector&&d.delegateCount--,f.remove&&f.remove.call(e,u));o&&!d.length&&(f.teardown&&!1!==f.teardown.call(e,p,g.handle)||x.removeEvent(e,h,g.handle),delete l[h])}else for(h in l)x.event.remove(e,h+t[c],n,r,!0);x.isEmptyObject(l)&&L.remove(e,"handle events")}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,a,o,s=u.call(arguments),l=(L.get(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if((s[0]=e).delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,e)){for(o=x.event.handlers.call(this,e,l),t=0;(i=o[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(a=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(a.namespace)||(e.handleObj=a,e.data=a.data,void 0!==(r=((x.event.special[a.origType]||{}).handle||a.handler).apply(i.elem,s))&&!1===(e.result=r)&&(e.preventDefault(),e.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,a,o=[],s=t.delegateCount,l=e.target;if(s&&l.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&(!0!==l.disabled||"click"!==e.type)){for(r=[],n=0;n]*)\/>/gi,fe=/\s*$/g;function me(e,t){return x.nodeName(e,"table")&&x.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ge(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function _e(e){var t=he.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function be(e,t){var n,r,i,a,o,s,l,c;if(1===t.nodeType){if(L.hasData(e)&&(a=L.access(e),o=L.set(t,a),c=a.events))for(i in delete o.handle,o.events={},c)for(n=0,r=c[i].length;n")},clone:function(e,t,n){var r,i,a,o,s,l,c,u=e.cloneNode(!0),f=x.contains(e.ownerDocument,e);if(!(g.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(o=X(u),r=0,i=(a=X(e)).length;r")).appendTo(t.documentElement))[0].contentDocument).write(),t.close(),n=Ae(e,t),we.detach()),Ce[e]=n),n}var xe=/^margin/,Te=new RegExp("^("+U+")(?!px)[a-z%]+$","i"),ke=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=A),t.getComputedStyle(e)},Ee=function(e,t,n,r){var i,a,o={};for(a in t)o[a]=e.style[a],e.style[a]=t[a];for(a in i=n.apply(e,r||[]),t)e.style[a]=o[a];return i},De=S.documentElement;function Ie(e,t,n){var r,i,a,o,s=e.style;return""!==(o=(n=n||ke(e))?n.getPropertyValue(t)||n[t]:void 0)&&void 0!==o||x.contains(e.ownerDocument,e)||(o=x.style(e,t)),n&&!g.pixelMarginRight()&&Te.test(o)&&xe.test(t)&&(r=s.width,i=s.minWidth,a=s.maxWidth,s.minWidth=s.maxWidth=s.width=o,o=n.width,s.width=r,s.minWidth=i,s.maxWidth=a),void 0!==o?o+"":o}function Pe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){var t,n,r,i,a=S.createElement("div"),o=S.createElement("div");function e(){o.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",o.innerHTML="",De.appendChild(a);var e=A.getComputedStyle(o);t="1%"!==e.top,i="2px"===e.marginLeft,n="4px"===e.width,o.style.marginRight="50%",r="4px"===e.marginRight,De.removeChild(a)}o.style&&(o.style.backgroundClip="content-box",o.cloneNode(!0).style.backgroundClip="",g.clearCloneStyle="content-box"===o.style.backgroundClip,a.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",a.appendChild(o),x.extend(g,{pixelPosition:function(){return e(),t},boxSizingReliable:function(){return null==n&&e(),n},pixelMarginRight:function(){return null==n&&e(),r},reliableMarginLeft:function(){return null==n&&e(),i},reliableMarginRight:function(){var e,t=o.appendChild(S.createElement("div"));return t.style.cssText=o.style.cssText="-webkit-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",t.style.marginRight=t.style.width="0",o.style.width="1px",De.appendChild(a),e=!parseFloat(A.getComputedStyle(t).marginRight),De.removeChild(a),o.removeChild(t),e}}))}();var Me=/^(none|table(?!-c[ea]).+)/,$e={position:"absolute",visibility:"hidden",display:"block"},Oe={letterSpacing:"0",fontWeight:"400"},Ne=["Webkit","O","Moz","ms"],Re=S.createElement("div").style;function Le(e){if(e in Re)return e;for(var t=e[0].toUpperCase()+e.slice(1),n=Ne.length;n--;)if((e=Ne[n]+t)in Re)return e}function Fe(e,t,n){var r=H.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ge(e,t,n,r,i){for(var a=n===(r?"border":"content")?4:"width"===t?1:0,o=0;a<4;a+=2)"margin"===n&&(o+=x.css(e,n+W[a],!0,i)),r?("content"===n&&(o-=x.css(e,"padding"+W[a],!0,i)),"margin"!==n&&(o-=x.css(e,"border"+W[a]+"Width",!0,i))):(o+=x.css(e,"padding"+W[a],!0,i),"padding"!==n&&(o+=x.css(e,"border"+W[a]+"Width",!0,i)));return o}function je(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,a=ke(e),o="border-box"===x.css(e,"boxSizing",!1,a);if(i<=0||null==i){if(((i=Ie(e,t,a))<0||null==i)&&(i=e.style[t]),Te.test(i))return i;r=o&&(g.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+Ge(e,t,n||(o?"border":"content"),r,a)+"px"}function Be(e,t){for(var n,r,i,a=[],o=0,s=e.length;o").prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),S.head.appendChild(r[0])},abort:function(){i&&i()}}});var Mt=[],$t=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mt.pop()||x.expando+"_"+ut++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,a,o=!1!==e.jsonp&&($t.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&$t.test(e.data)&&"data");if(o||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=x.isFunction(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,o?e[o]=e[o].replace($t,"$1"+r):!1!==e.jsonp&&(e.url+=(ft.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return a||x.error(r+" was not called"),a[0]},e.dataTypes[0]="json",i=A[r],A[r]=function(){a=arguments},n.always(function(){void 0===i?x(A).removeProp(r):A[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Mt.push(r)),a&&x.isFunction(i)&&i(a[0]),a=i=void 0}),"script"}),x.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||S;var r=y.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=ne([e],t,i),i&&i.length&&x(i).remove(),x.merge([],r.childNodes))};var Ot=x.fn.load;function Nt(e){return x.isWindow(e)?e:9===e.nodeType&&e.defaultView}x.fn.load=function(e,t,n){if("string"!=typeof e&&Ot)return Ot.apply(this,arguments);var r,i,a,o=this,s=e.indexOf(" ");return-1").append(x.parseHTML(e)).find(r):e)}).always(n&&function(e,t){o.each(function(){n.apply(this,a||[e.responseText,t,e])})}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.expr.filters.animated=function(t){return x.grep(x.timers,function(e){return t===e.elem}).length},x.offset={setOffset:function(e,t,n){var r,i,a,o,s,l,c=x.css(e,"position"),u=x(e),f={};"static"===c&&(e.style.position="relative"),s=u.offset(),a=x.css(e,"top"),l=x.css(e,"left"),i=("absolute"===c||"fixed"===c)&&-1<(a+l).indexOf("auto")?(o=(r=u.position()).top,r.left):(o=parseFloat(a)||0,parseFloat(l)||0),x.isFunction(t)&&(t=t.call(e,n,x.extend({},s))),null!=t.top&&(f.top=t.top-s.top+o),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):u.css(f)}},x.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){x.offset.setOffset(this,t,e)});var e,n,r=this[0],i={top:0,left:0},a=r&&r.ownerDocument;return a?(e=a.documentElement,x.contains(e,r)?(i=r.getBoundingClientRect(),n=Nt(a),{top:i.top+n.pageYOffset-e.clientTop,left:i.left+n.pageXOffset-e.clientLeft}):i):void 0},position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return"fixed"===x.css(n,"position")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(r=e.offset()),r.top+=x.css(e[0],"borderTopWidth",!0),r.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-r.top-x.css(n,"marginTop",!0),left:t.left-r.left-x.css(n,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===x.css(e,"position");)e=e.offsetParent;return e||De})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var a="pageYOffset"===i;x.fn[t]=function(e){return O(this,function(e,t,n){var r=Nt(e);if(void 0===n)return r?r[i]:e[t];r?r.scrollTo(a?r.pageXOffset:n,a?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),x.each(["top","left"],function(e,n){x.cssHooks[n]=Pe(g.pixelPosition,function(e,t){if(t)return t=Ie(e,n),Te.test(t)?x(e).position()[n]+"px":t})}),x.each({Height:"height",Width:"width"},function(a,o){x.each({padding:"inner"+a,content:o,"":"outer"+a},function(r,e){x.fn[e]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return O(this,function(e,t,n){var r;return x.isWindow(e)?e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?x.css(e,t,i):x.style(e,t,n,i)},o,n?e:void 0,n,null)}})}),x.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},size:function(){return this.length}}),x.fn.andSelf=x.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x});var Rt=A.jQuery,Lt=A.$;return x.noConflict=function(e){return A.$===x&&(A.$=Lt),e&&A.jQuery===x&&(A.jQuery=Rt),x},e||(A.jQuery=A.$=x),x}),function(j){"use strict";function w(a,o){return o=o||Error,function(){var e,t,n=arguments,r=n[0],i="["+(a?a+":":"")+r+"] ";for(i+=n[1].replace(/\{\d+\}/g,function(e){var t=+e.slice(1,-1)+2;return t").append(e).html();try{return e[0].nodeType===Re?S(t):t.match(/^(<[^>]+>)/)[1].replace(/^<([\w-]+)/,function(e,t){return"<"+S(t)})}catch(e){return S(t)}}function Y(e){try{return decodeURIComponent(e)}catch(e){}}function K(e){var i={};return fe((e||"").split("&"),function(e){var t,n,r;e&&(n=e=e.replace(/\+/g,"%20"),-1!==(t=e.indexOf("="))&&(n=e.substring(0,t),r=e.substring(t+1)),_e(n=Y(n))&&(r=!_e(r)||Y(r),B.call(i,n)?ye(i[n])?i[n].push(r):i[n]=[i[n],r]:i[n]=r))}),i}function Q(e){var n=[];return fe(e,function(e,t){ye(e)?fe(e,function(e){n.push(Z(t,!0)+(!0===e?"":"="+Z(e,!0)))}):n.push(Z(t,!0)+(!0===e?"":"="+Z(e,!0)))}),n.length?n.join("&"):""}function X(e){return Z(e,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function Z(e,t){return encodeURIComponent(e).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,t?"%20":"+")}var J=["ng-","data-ng-","ng:","x-ng-"];var ee=function(e){if(!e.currentScript)return!0;var t=e.currentScript.getAttribute("src"),n=e.createElement("a");if(n.href=t,e.location.origin===n.origin)return!0;switch(n.protocol){case"http:":case"https:":case"ftp:":case"blob:":case"file:":case"data:":return!0;default:return!1}}(j.document);function te(r,e){var i,a,t={};if(fe(J,function(e){var t=e+"app";!i&&r.hasAttribute&&r.hasAttribute(t)&&(a=(i=r).getAttribute(t))}),fe(J,function(e){var t,n=e+"app";!i&&(t=r.querySelector("["+n.replace(":","\\:")+"]"))&&(a=(i=t).getAttribute(n))}),i){if(!ee)return void j.console.error("Angular: disabling automatic bootstrap. - - - - - - - - - - -
- -
- - CHAT -
- -
- - - - - - - - -
-
- logo -
- - - {{settings.defaultTitle ? settings.defaultTitle : (status === 'online' ? settings.header_online : settings.header_offline)}} - - - - - - - -
- -
- - - -
- -
- -
-
- -
- -
- - CHAT -
-
- - - - - - - - - - \ No newline at end of file diff --git a/snippet/1.0.11/scripts/app.js b/snippet/1.0.11/scripts/app.js deleted file mode 100644 index ca4dae9..0000000 --- a/snippet/1.0.11/scripts/app.js +++ /dev/null @@ -1,658 +0,0 @@ -! function() { - "use strict"; - angular.module("motion", ["ngAnimate", "ngAria", "ngMessages", "ngMaterial", "ngResource", "ngSanitize", "ngCsv", "ngEmbed", "ui.router", "LocalStorageModule", "ngRateIt", "flow"]).constant("STORAGE_PREFIX", "motion_chat").constant("STORAGE_VISITOR", "visitor").constant("STORAGE_LAYOUT", "layout").directive("ngEnter", function() { - return function(t, e, n) { - e.bind("keydown keypress", function(e) { - 13 === e.which && (t.$apply(function() { - t.$eval(n.ngEnter) - }), e.preventDefault()) - }) - } - }).directive("ngPrint", function() { - function i(e, t) { - for (var n, i = document.createElement("div"), o = t.visitor, s = t.settings, a = 0; a < t.messages.length; a++) { - var r = t.messages[a], - l = "Sender: ", - c = "Message: " + r.body, - d = "Sent At: " + moment(r.createdAt).format("YYYY-MM-DD HH:mm:ss"); - if (0 !== a) { - switch (t.settings.agentIdentifier) { - case "website_alias": - l += "out" === r.direction ? r.UserId ? s.agentAlias + r.UserId : "System" : s.customerAlias || o.from || "Visitor" + r.ContactId; - break; - case "agent_alias": - l += "out" === r.direction ? r.UserId ? r.User.alias || r.User.fullname : "System" : s.customerAlias || o.from || "Visitor" + r.ContactId; - break; - case "agent_fullname": - l += "out" === r.direction ? r.UserId ? r.User.fullname : "System" : s.customerAlias || o.from || "Visitor" + r.ContactId; - break; - default: - l += "out" === r.direction ? r.UserId ? (s.agentAlias || "Agent") + r.UserId : "System" : s.customerAlias || o.from || "Visitor" + r.ContactId - } - i.appendChild(document.createTextNode(l)), i.appendChild(document.createElement("br")), i.appendChild(document.createTextNode(c)), i.appendChild(document.createElement("br")), i.appendChild(document.createTextNode(d)), i.appendChild(document.createElement("br")), i.appendChild(document.createElement("br")) - } else n = r.createdAt - } - var m = window.open(); - m.document.write("" + document.title + ""), m.document.write(""), m.document.write("

Website: " + s.referer + "

"), m.document.write("

Start Time: " + moment(n).format("YYYY-MM-DD HH:mm:ss") + "

"), m.document.write("

Print Time: " + moment().format("YYYY-MM-DD HH:mm:ss") + "

"), m.document.write(i.innerHTML), m.document.write(""), m.document.close(), m.focus(), m.print(), m.close() - } - return { - link: function(t, e, n) { - e.on("click", function() { - var e = document.getElementById("chatContent1"); - e && i(e, t) - }) - }, - restrict: "A" - } - }) -}(), -function() { - "use strict"; - - function e(e, s, t, n, i, o, a, r, l, c) { - var d, m, g, u, p = this; - - function f() { - s.settings.online ? o.go("app.online", null, { - location: "replace" - }) : o.go("app.offline", null, { - location: "replace" - }) - } - - function v() { - s.visitor && s.visitor.interaction && s.visitor.interaction.id && r.chatInteraction.get({ - id: s.visitor.interaction.id - }).$promise.then(function(e) { - delete p.errors.getInteraction, e.closed && (s.visitor.interaction.closed = !0, s.updateStorage(l, s.visitor), "unmanaged" === e.disposition ? o.go("app.unmanaged", null, { - location: "replace" - }) : o.go("app.closing", null, { - location: "replace" - })) - }).catch(function(e) { - switch (e.status) { - case 403: - o.go("app.closing", null, { - location: "replace" - }); - break; - case 404: - s.updateStorage(l, null, !0), s.updateStorage(c, null, !0), f(); - break; - case 405: - o.go("app.unmanaged", null, { - location: "replace" - }); - break; - default: - console.error(e) - } - }) - } - - function h(t) { - return function(e) { - p.errors[t] = e.data, w() - } - } - - function x(e) { - var t = d[0].emojioneArea.getText(); - e && 13 === e.keyCode && e.shiftKey || e && 13 !== e.keyCode || "" !== t && b(_.merge({ - body: t - }, s.visitor)) - } - - function b(e) { - r.chatWebsite.notify(e).$promise.then(function(e) { - delete p.errors.chatMessageError, _.isNil(s.visitor.interaction) && (s.visitor.interaction = { - id: e.interaction.id - }, s.updateStorage(l, s.visitor)), d[0].emojioneArea.setText(""), w() - }).catch(h("chatMessageError")) - } - - function y() { - s.visitor && s.visitor.interaction && s.visitor.interaction.id && r.chatInteraction.getMessages({ - intid: s.visitor.interaction.id, - includeAgent: !0, - id: u || void 0 - }).$promise.then(function(e) { - if (delete p.errors.interaction, e.count) { - for (var t = 0, n = !1; t < e.rows.length; t++) { - var i = _.find(s.messages, { - id: e.rows[t].id - }); - i ? e.rows[t].read && (i.read = !0) : (n = !0, s.messages.push(e.rows[t])), "out" !== e.rows[t].direction || e.rows[t].read || (o = e.rows[t].id, r.chatMessage.update({ - id: o, - read: !0 - }).$promise.catch(function(e) { - console.error(e) - })) - } - n && w(), e.rows[t - 1].read && (u = e.rows[t - 1].id) - } - var o - }).catch(function(e) { - switch (e.status) { - case 403: - o.go("app.closing", null, { - location: "replace" - }); - break; - case 405: - o.go("app.unmanaged", null, { - location: "replace" - }); - break; - default: - console.error(e) - } - }) - } - - function w() { - t(function() { - var e = i[0].getElementsByClassName("chat-messages")[0]; - e && (e.scrollTop = e.scrollHeight) - }) - } - p.errors = {}, s.messages = [], p.emojiOptions = { - watchEmbedData: !1, - fontSmiley: !1, - emoji: !0, - link: !0, - linkTarget: "_blank" - }, p.$onInit = function() { - s.status = "chat", s.loading = !1, s.settings.showMenu = !0, p.replyMessage = "", s.visitor.interaction && s.visitor.interaction.closed ? (s.updateStorage(l, null, !0), s.updateStorage(c, null, !0), f()) : (v(), m = n(y, 2e3), g = n(v, 3e3)); - d = $("#emojionearea").emojioneArea({ - placeholder: s.settings.placeholderMessage || "Type a message", - events: { - keyup: function(e, t) { - x(t) - } - } - }) - }, p.reply = x, p.fileAdded = function(e) { - var t = new FormData; - t.append("file", e.file), a.post(s.settings.remote + "/api/chat/interactions/" + s.visitor.interaction.id + "/attachment_upload?token=" + s.settings.token, t, { - transformRequest: angular.identity, - headers: { - "Content-Type": void 0 - } - }).then(function(e) { - (e = e.data).id ? (delete p.errors.sendAttachment, b(_.merge({ - body: '' + e.name + "", - AttachmentId: e.id - }, s.visitor))) : h("sendAttachment") - }, h("sendAttachment")) - }, e.$on("$destroy", function() { - n.cancel(m), n.cancel(g), g = m = null - }), s.$on("$download", function(e, t) { - t && t(_.values(s.messages)) - }) - } - e.$inject = ["$scope", "$rootScope", "$timeout", "$interval", "$document", "$state", "$http", "api", "STORAGE_VISITOR", "STORAGE_LAYOUT"], angular.module("motion").controller("ChatController", e) -}(), -function() { - "use strict"; - - function e(i, e, o, t, n, s) { - var a = this; - - function r() { - i.settings.online ? e.go("app.online", null, { - location: "replace" - }) : e.go("app.offline", null, { - location: "replace" - }) - } - - function l() { - a.form = {}, a.upColor = null, a.downColor = null, a.userForm.$setPristine(), a.userForm.$setUntouched(), delete i.visitor.interaction, i.enableDownload = !1 - } - - function c(n) { - return function(e) { - a.errors[n] = e.data; - var t = o.simple().textContent(i.settings.formSubmitFailureMessage || "Form submission error").toastClass("md-failure-toast").position("top"); - o.show(t) - } - } - - function d() { - i.loading = !1 - } - a.$onInit = function() { - i.status = "closing", i.updateStorage(n, null, !0), i.updateStorage(s, null, !0), i.loading = !1 - }, a.submit = function() { - i.loading = !0, i.visitor.interaction && i.visitor.interaction.id ? t.chatInteraction.close(_.merge({ - id: i.visitor.interaction.id, - ratingType: i.settings.ratingType, - customer: i.settings.customerAlias || i.visitor.from - }, a.form)).$promise.then(function() { - delete a.errors.submit; - var e = o.simple().textContent(i.settings.formSubmitSuccessMessage || "Form properly submitted").toastClass("md-success-toast").parent(angular.element(document.querySelector("#chat-toolbar"))); - o.show(e) - }).then(l).then(r).catch(c("submit")).finally(d) : (d(), c("submit")) - }, a.skip = function() { - l(), r() - }, a.form = {}, a.errors = {} - } - e.$inject = ["$rootScope", "$state", "$mdToast", "api", "STORAGE_VISITOR", "STORAGE_LAYOUT"], angular.module("motion").controller("ClosingController", e) -}(), -function() { - "use strict"; - - function e(a, n, r, i, o, l, s, c, d) { - var e = this; - - function m(e, t, n) { - var i = l.get(e) || {}; - n ? delete i[a.location] : i[a.location] = t, l.set(e, i) - } - - function g(e) { - var t; - a.layout.up = e, m(c, a.layout), t = e ? "show" : "hide", n.parent.postMessage({ - cmd: t - }, "*") - } - a.location = a.settings.location, e.$onInit = function() { - a.status = "init"; - var e = !1, - t = l.get(d) || {}, - n = l.get(c) || {}; - a.visitor = t[a.location] ? t[a.location] : {}, a.layout = n[a.location] ? n[a.location] : {}, a.visitor.interaction && a.layout.up ? e = !0 : a.layout.up = !1; - g(e), r.go((i = a.settings.online, o = !!(a.visitor && a.visitor.interaction && a.visitor.interaction.id), s = Number(a.settings.maxInteractions) && Number(a.settings.openedInteractions) >= Number(a.settings.maxInteractions), o || !s && i ? "app.online" : "app.offline"), null, { - location: "replace" - }); - var i, o, s - }, e.close = function() { - var e = a.visitor.interaction; - if (e && e.id) { - var t = i.confirm().parent(angular.element(document.querySelector("#chat-app"))).clickOutsideToClose(!0).title(a.settings.closingQuestion || "Do you want to close the interaction?").ok("Ok").cancel("Cancel"); - i.show(t).then(function() { - return s.chatInteraction.customUpdate({ - id: e.id, - closed: !0, - closeReason: "contact", - closedAt: moment().format("YYYY-MM-DD HH:mm:ss") - }).$promise - }).then(function() { - r.go("app.closing", null, { - location: "replace" - }) - }).catch(function(e) { - console.error("keep open", e) - }) - } - }, e.toggle = g, e.download = function(e) { - var t = o.defer(), - n = a.visitor.interaction; - n && n.id && s.chatInteraction.getMessages({ - intid: n.id, - includeAll: !0 - }).$promise.then(function(e) { - t.resolve(_.map(e.rows.slice(1), function(e) { - var t; - if ("in" === e.direction && (t = a.settings.customerAlias || a.visitor.from || "Visitor" + e.ContactId), "out" === e.direction) switch (a.settings.agentIdentifier) { - case "website_alias": - t = e.UserId ? a.settings.agentAlias + e.UserId : "System"; - break; - case "agent_alias": - t = e.UserId ? e.User.alias || e.User.fullname : "System"; - break; - case "agent_fullname": - t = e.UserId ? e.User.fullname : "System"; - break; - default: - t = e.UserId ? a.settings.agentAlias + e.UserId : "System" - } - return { - sender: t, - message: e.body, - createdAt: moment(e.createdAt).format("MM/DD/YYYY HH:mm:ss") - } - })) - }).catch(function(e) { - console.error(e) - }); - return t.promise - }, e.getHeaderShape = function() { - return "rounded" === a.settings.header_shape ? "15px" : "0px" - }, a.updateStorage = m, window.addEventListener("message", function(e) { - g("show" === e.data.evt) - }, !1) - } - e.$inject = ["$rootScope", "$window", "$state", "$mdDialog", "$q", "localStorageService", "api", "STORAGE_LAYOUT", "STORAGE_VISITOR"], angular.module("motion").controller("IndexController", e) -}(), -function() { - "use strict"; - - function e(e, t) { - var n = { - baseUrl: e.settings.remote + "/api/" - }, - i = { - id: "@id", - token: e.settings.token - }; - return n.chatWebsite = t(n.baseUrl + "chat/websites/:id", i, { - notify: { - method: "POST", - url: n.baseUrl + "chat/websites/:id/notify" - }, - offline: { - method: "POST", - url: n.baseUrl + "chat/websites/:id/offline" - }, - getFields: { - method: "GET", - url: n.baseUrl + "chat/websites/:id/fields" - } - }), n.chatInteraction = t(n.baseUrl + "chat/interactions/:id", i, { - update: { - method: "PUT", - url: n.baseUrl + "chat/interactions/:id" - }, - customUpdate: { - method: "PUT", - url: n.baseUrl + "chat/interactions/:id/custom_update" - }, - close: { - method: "PUT", - url: n.baseUrl + "chat/interactions/:id/close" - }, - getMessages: { - method: "GET", - url: n.baseUrl + "chat/interactions/:intid/my_messages" - }, - uploadAttachment: { - method: "POST", - url: n.baseUrl + "chat/interactions/:id/attachment_upload", - headers: { - "Content-Type": void 0 - }, - transformRequest: angular.identity - }, - downloadAttachment: { - method: "GET", - url: n.baseUrl + "chat/interactions/:id/attachment_download" - } - }), n.chatMessage = t(n.baseUrl + "chat/messages/:id", i, { - update: { - method: "PUT", - url: n.baseUrl + "chat/messages/:id" - } - }), n - } - e.$inject = ["$rootScope", "$resource"], angular.module("motion").factory("api", e) -}(), -function() { - "use strict"; - - function e(n, e) { - var t = e.search(); - n.settings = { - cursor: "pointer", - hide: !0 - }, _.forIn(t, function(e, t) { - "" === e || _.isNil(e) || ("true" === e && (e = !0), "false" === e && (e = !1), n.settings[t] = e) - }) - } - - function t(e, t, n, i, o, s) { - n.html5Mode(!0), i.defaults.headers.get || (i.defaults.headers.get = {}), i.defaults.headers.get["If-Modified-Since"] = "Mon, 26 Jul 1997 05:00:00 GMT", i.defaults.headers.get["Cache-Control"] = "no-cache", i.defaults.headers.get.Pragma = "no-cache", o.setPrefix(s), e.state("app", { - url: "/app", - abstract: !0 - }).state("app.waiting", { - url: "/waiting", - templateUrl: "app/waiting/index.html", - controller: "WaitingController as vm" - }).state("app.online", { - url: "/online", - templateUrl: "app/online/index.html", - controller: "OnlineController as vm" - }).state("app.offline", { - url: "/offline", - templateUrl: "app/offline/index.html", - controller: "OfflineController as vm" - }).state("app.chat", { - url: "/chat", - templateUrl: "app/chat/index.html", - controller: "ChatController as vm" - }).state("app.unmanaged", { - url: "/unmanaged", - templateUrl: "app/unmanaged/index.html", - controller: "UnmanagedController as vm" - }).state("app.closing", { - url: "/closing", - templateUrl: "app/closing/index.html", - controller: "ClosingController as vm" - }) - } - e.$inject = ["$rootScope", "$location"], t.$inject = ["$stateProvider", "$urlRouterProvider", "$locationProvider", "$httpProvider", "localStorageServiceProvider", "STORAGE_PREFIX"], angular.module("motion").config(t).run(e) -}(), -function() { - "use strict"; - - function e(i, o, s) { - var a = this, - r = null; - - function l() { - i.loading = !1 - } - a.$onInit = function() { - i.status = "offline", a.visitor = { - id: i.settings.id, - mapKeyOffline: "firstName", - from: "Anonymous" + _.random(1, 1e6) - }, i.settings.showMenu = !1, i.loading = !1, o.chatWebsite.getFields({ - id: i.settings.id, - online: !1 - }).$promise.then(function(e) { - e.count && (r = e.fromKey, a.fields = e.rows) - }).catch(function(e) { - console.error(e) - }) - }, a.submit = function() { - i.loading = !0; - for (var e = 0; e < a.fields.length; e++) { - var t = a.fields[e]; - t.props && a.form.hasOwnProperty(t.props.title) && (_.isNil(t.cmField) || (a.visitor[t.cmField] = _.isArray(a.form[t.props.title]) ? a.form[t.props.title].join() : a.form[t.props.title]), e === r && (_.isNil(i.settings.mapKeyOffline) || (a.visitor.mapKeyOffline = i.settings.mapKeyOffline, a.visitor.from = _.isArray(a.form[t.props.title]) ? a.form[t.props.title].join() : a.form[t.props.title]))) - } - o.chatWebsite.offline(_.merge({ - body: a.form - }, a.visitor)).$promise.then(function() { - delete a.errors.submit, i.$emit("hide"), a.form = {}, a.userForm.$setPristine(), a.userForm.$setUntouched(); - var e = s.simple().textContent(i.settings.formSubmitSuccessMessage || "Form properly submitted").toastClass("md-success-toast").parent(angular.element(document.querySelector("#chat-toolbar"))); - s.show(e) - }).catch((n = "submit", function(e) { - var t = s.simple().textContent(i.settings.formSubmitFailureMessage || "Form submission error").toastClass("md-failure-toast").parent(angular.element(document.querySelector("#chat-toolbar"))); - s.show(t), a.errors[n] = e.data - })).finally(l); - var n - }, a.toggle = function(e, t) { - a.form[e] || (a.form[e] = []); - var n = a.form[e].indexOf(t); - 1 < n ? a.form[e].splice(n, 1) : a.form[e].push(t) - }, a.exists = function(e, t) { - a.form[e] || (a.form[e] = []); - return -1 < a.form[e].indexOf(t) - }, a.form = {}, a.errors = {}, a.userForm = {} - } - e.$inject = ["$rootScope", "api", "$mdToast"], angular.module("motion").controller("OfflineController", e) -}(), -function() { - "use strict"; - - function e(o, s, a, r) { - var l = this, - c = null; - l.$onInit = function() { - o.status = "online", o.visitor && o.visitor.interaction ? o.visitor.interaction.id ? s.go("app.chat", null, { - location: "replace" - }) : s.go("app.waiting", null, { - location: "replace" - }) : (o.visitor = { - id: o.settings.id, - mapKey: "firstName", - from: "Anonymous" + _.random(1, 1e6) - }, o.settings.showMenu = !1, o.updateStorage(r, o.visitor), a.chatWebsite.getFields({ - id: o.settings.id, - online: !0 - }).$promise.then(function(e) { - e.count && (c = e.fromKey, l.fields = e.rows) - }).catch(function(e) { - console.error(e) - })) - }, l.submit = function() { - for (var e = "", t = 0; t < l.fields.length; t++) { - var n = l.fields[t]; - n.props && l.form.hasOwnProperty(n.props.title) && (_.isNil(n.variable) || (o.visitor[n.variable] = _.isArray(l.form[n.props.title]) ? l.form[n.props.title].join() : l.form[n.props.title]), _.isNil(n.cmField) || (o.visitor[n.cmField] = _.isArray(l.form[n.props.title]) ? l.form[n.props.title].join() : l.form[n.props.title]), t === c && (_.isNil(o.settings.mapKey) || (o.visitor.mapKey = o.settings.mapKey, o.visitor.from = _.isArray(l.form[n.props.title]) ? l.form[n.props.title].join() : l.form[n.props.title])), e += n.props.title + ": " + l.form[n.props.title] + "\n") - } - i = _.merge({ - body: e, - referer: o.settings.referer, - customerIp: o.settings.customerIp - }, o.visitor), l.disableItem = !0, a.chatWebsite.notify(i).$promise.then(function(e) { - delete l.errors.chatMessageError, o.visitor.message = { - id: e.message.id - }, o.visitor.interaction = { - id: e.interaction.id - }, o.updateStorage(r, o.visitor), l.disableItem = !1, o.settings.enableCustomerWriting ? s.go("app.chat", null, { - location: "replace" - }) : s.go("app.waiting", null, { - location: "replace" - }) - }).catch(function(e) { - l.disableItem = !1, console.error(e) - }); - var i - }, l.toggle = function(e, t) { - l.form[e] || (l.form[e] = []); - var n = l.form[e].indexOf(t); - 1 < n ? l.form[e].splice(n, 1) : l.form[e].push(t) - }, l.exists = function(e, t) { - l.form[e] || (l.form[e] = []); - return -1 < l.form[e].indexOf(t) - }, l.form = {}, l.errors = {}, l.userForm = {}, l.disableItem = !1 - } - e.$inject = ["$rootScope", "$state", "api", "STORAGE_VISITOR"], angular.module("motion").controller("OnlineController", e) -}(), -function() { - "use strict"; - - function e(i, e, o, t, n, s) { - var a = this; - - function r() { - i.settings.online ? e.go("app.online", null, { - location: "replace" - }) : e.go("app.offline", null, { - location: "replace" - }) - } - - function l() { - a.form = {}, a.upColor = null, a.downColor = null, a.userForm.$setPristine(), a.userForm.$setUntouched(), i.visitor = {}, i.enableDownload = !1, i.$emit("hide") - } - - function c(n) { - return function(e) { - a.errors[n] = e.data; - var t = o.simple().textContent(i.settings.formSubmitFailureMessage || "Form submission error").toastClass("md-failure-toast").parent(angular.element(document.querySelector("#chat-toolbar"))); - o.show(t) - } - } - - function d() { - i.loading = !1 - } - a.form = {}, a.errors = {}, a.$onInit = function() { - i.status = "unmanaged", i.updateStorage(n, null, !0), i.updateStorage(s, null, !0), i.loading = !1 - }, a.submit = function() { - i.loading = !0, i.visitor.interaction && i.visitor.interaction.id ? t.chatInteraction.customUpdate({ - id: i.visitor.interaction.id, - note: a.form.note - }).$promise.then(function() { - delete a.errors.submit; - var e = o.simple().textContent(i.settings.formSubmitSuccessMessage || "Form properly submitted").toastClass("md-success-toast").parent(angular.element(document.querySelector("#chat-toolbar"))); - o.show(e) - }).then(l).then(r).catch(c("submit")).finally(d) : (d(), c("submit")) - }, a.skip = function() { - l(), r() - } - } - e.$inject = ["$rootScope", "$state", "$mdToast", "api", "STORAGE_VISITOR", "STORAGE_LAYOUT"], angular.module("motion").controller("UnmanagedController", e) -}(), -function() { - "use strict"; - - function e(i, e, t, o, n, s, a, r) { - var l, c = !1; - - function d() { - var t = {}, - n = !1; - s.chatInteraction.get({ - id: i.visitor.interaction.id - }).$promise.then(function(e) { - return t = e, s.chatInteraction.getMessages({ - intid: i.visitor.interaction.id - }).$promise - }).then(function(e) { - n = 1 < e.rows.length, t.closed ? (i.visitor.interaction.closed = !0, i.updateStorage(a, i.visitor), "unmanaged" === t.disposition && o.go("app.unmanaged", null, { - location: "replace" - })) : t.UserId ? (i.visitor.interaction.UserId = t.UserId, i.updateStorage(a, i.visitor), o.go("app.chat", null, { - location: "replace" - })) : n && o.go("app.chat", null, { - location: "replace" - }) - }).catch(function(e) { - switch (e.status) { - case 403: - o.go("app.closing", null, { - location: "replace" - }); - break; - case 405: - o.go("app.unmanaged", null, { - location: "replace" - }); - break; - default: - console.error(e) - } - }) - } - - function m() { - if (i.visitor && i.visitor.interaction && i.visitor.interaction.id && !c) { - c = !0; - var e = new XMLHttpRequest; - e.open("PUT", i.settings.remote + "/api/chat/interactions/" + i.visitor.interaction.id + "/abandon?token=" + i.settings.token, !1), e.setRequestHeader("Content-type", "application/json; charset=utf-8"), e.send(JSON.stringify({ - channel: "chat", - interaction: { - id: i.visitor.interaction.id - }, - message: { - id: i.visitor.message.id - }, - disposition: "abandoned", - closed: !0, - closeReason: "contact", - closedAt: moment().format("YYYY-MM-DD HH:mm:ss") - })), 4 === e.readyState && 200 === e.status && (i.updateStorage(a, null, !0), i.updateStorage(r, null, !0)) - } - } - this.$onInit = function() { - i.status = "waiting", i.visitor && i.visitor.interaction && i.visitor.interaction.id && (l = t(d, 3e3)) - }, e.$on("$destroy", function() { - n.removeEventListener("beforeunload", m), n.removeEventListener("unload", m), t.cancel(l) - }), n.addEventListener("beforeunload", m), n.addEventListener("unload", m) - } - e.$inject = ["$rootScope", "$scope", "$interval", "$state", "$window", "api", "STORAGE_VISITOR", "STORAGE_LAYOUT"], angular.module("motion").controller("WaitingController", e) -}(), angular.module("motion").run(["$templateCache", function(e) { - "use strict"; - e.put("app/chat/index.html", "\x3c!-- CHAT CONTENT --\x3e\n\n
\n \"system\"\n \"agent\"\n \"customer\"\n\n
\n
\n
\n \n {{message.direction === 'out' ? (message.UserId ? (settings.agentAlias + message.UserId) : settings.systemAlias) : (settings.customerAlias || visitor.from || 'Visitor' + message.ContactId)}} - {{message.createdAt | date : 'h:mm'}}\n \n \n {{message.direction === 'out' ? (message.UserId ? (message.User.alias || message.User.fullname) : settings.systemAlias) : (settings.customerAlias || visitor.from || 'Visitor' + message.ContactId)}} - {{message.createdAt | date : 'h:mm'}}\n \n \n {{message.direction === 'out' ? (message.UserId ? message.User.fullname : settings.systemAlias) : (settings.customerAlias || visitor.from || 'Visitor' + message.ContactId)}} - {{message.createdAt | date : 'h:mm'}}\n \n \n {{message.direction === 'out' ? (message.UserId ? ((settings.agentAlias || 'Agent') + message.UserId) : settings.systemAlias) : (settings.customerAlias || visitor.from || 'Visitor' + message.ContactId)}} - {{message.createdAt | date : 'h:mm'}}\n \n
\n
\n \n \n
\n
\n
\n" + '
\n
\n
\n
\n
\n\n \x3c!-- CHAT ERROR --\x3e\n
\n \n {{error.message || \'Service temporarily unavailable.\'}}\n {{error.message || \'Service temporarily unavailable.\'}}\n
\n \x3c!-- CHAT ERROR --\x3e\n
\n\x3c!-- / CHAT CONTENT --\x3e\n\n\x3c!-- CHAT FOOTER --\x3e\n\n\x3c!-- / CHAT FOOTER --\x3e'), e.put("app/closing/index.html", '\x3c!-- CHAT CONTENT --\x3e\n\n \x3c!-- CHAT ERROR --\x3e\n
\n \n {{error.message || \'Service temporarily unavailable.\'}}\n {{error.message || \'Service temporarily unavailable.\'}}\n
\n \x3c!-- CHAT ERROR --\x3e\n\n \n {{ settings.closingMessage }}\n \n\n
\n \n \x3c!-- START thumb rating --\x3e\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n \x3c!-- END thumb rating --\x3e\n\n \x3c!-- START star rating --\x3e\n
\n \n
\n \x3c!-- END star rating --\x3e\n
\n\n \n \x3c!-- START textarea --\x3e\n Feedback\n \n \x3c!-- END textarea --\x3e\n \n\n \n {{settings.forwardTranscriptMessage}}\n Email\n \x3c!-- START email --\x3e\n \n
\n
\n Email must be a valid e-mail address\n
\n
\n \x3c!-- END email --\x3e\n
\n\n
\n \n {{settings.closingMessageButton}}\n \n \n {{settings.skipMessageButton}}\n \n
\n
\n\n \n' + " {{ (settings.custom && !settings.defaultWhiteLabel) ? settings.whiteLabel : 'Powered By XCALLY' }}\n \n\n
\n\x3c!-- / CHAT CONTENT --\x3e\n"), e.put("app/offline/index.html", '\x3c!-- CHAT CONTENT --\x3e\n\n\n
\n\n
\n
\n {{field.props.title + (field.config.required ? \'*\' : \'\')}}\n\n \n
\n
\n\n \x3c!-- CHAT ERROR --\x3e\n
\n \n {{error.message || \'Service temporarily unavailable.\'}}\n {{error.message || \'Service temporarily unavailable.\'}}\n
\n \x3c!-- CHAT ERROR --\x3e\n\n \n \x3c!-- START label --\x3e\n
\n \n {{field.value}}\n \n
\n \x3c!-- END label --\x3e\n\n \x3c!-- START textinput --\x3e\n
\n \n
\n \x3c!-- END textinput --\x3e\n\n \x3c!-- START textarea --\x3e\n
\n \n
\n \x3c!-- END textarea --\x3e\n\n \x3c!-- START select --\x3e\n
\n \n {{option.value}}\n \n
\n \x3c!-- END select --\x3e\n\n \x3c!-- START radio --\x3e\n
\n \n {{option.value}}\n \n
\n \x3c!-- END radio --\x3e\n\n \x3c!-- START checkbox --\x3e\n
\n
\n \n {{option.value}}\n \n
\n
\n \x3c!-- END checkbox --\x3e\n\n \x3c!-- START agreement --\x3e\n
\n \n {{field.options[0].value}}\n \n
\n \x3c!-- END agreement --\x3e\n\n
\n
\n Required Field\n
\n
\n Wrong type field\n
\n
\n
\n
\n\n \n {{settings.offline_chat_button}}\n \n
\n\n \n' + " {{ (settings.custom && !settings.defaultWhiteLabel) ? settings.whiteLabel : 'Powered By XCALLY' }}\n \n
\n\x3c!-- / CHAT CONTENT --\x3e\n"), e.put("app/online/index.html", '\x3c!-- CHAT CONTENT --\x3e\n\n
\n
\n {{field.props.title + (field.config.required ? \'*\' : \'\')}}\n\n \n
\n
\n\n \x3c!-- CHAT ERROR --\x3e\n
\n \n {{error.message || \'Service temporarily unavailable.\'}}\n {{error.message || \'Service temporarily unavailable.\'}}\n
\n \x3c!-- CHAT ERROR --\x3e\n\n \n \x3c!-- START label --\x3e\n
\n \n {{field.value}}\n \n
\n \x3c!-- END label --\x3e\n\n \x3c!-- START textinput --\x3e\n
\n \n
\n \x3c!-- END textinput --\x3e\n\n \x3c!-- START textarea --\x3e\n
\n \n
\n \x3c!-- END textarea --\x3e\n\n \x3c!-- START select --\x3e\n
\n \n {{option.value}}\n \n
\n \x3c!-- END select --\x3e\n\n \x3c!-- START radio --\x3e\n
\n \n {{option.value}}\n \n
\n \x3c!-- END radio --\x3e\n\n \x3c!-- START checkbox --\x3e\n
\n \n {{option.value}}\n \n
\n \x3c!-- END checkbox --\x3e\n\n \x3c!-- START agreement --\x3e\n
\n \n {{field.options[0].value}}\n \n
\n \x3c!-- END agreement --\x3e\n\n
\n
\n Required Field\n
\n
\n Wrong type field\n
\n
\n
\n
\n\n \n {{settings.start_chat_button}}\n \n
\n\n \n' + " {{ (settings.custom && !settings.defaultWhiteLabel) ? settings.whiteLabel : 'Powered By XCALLY' }}\n \n
\n\x3c!-- / CHAT CONTENT --\x3e\n"), e.put("app/unmanaged/index.html", '\x3c!-- CHAT CONTENT --\x3e\n\n \x3c!-- CHAT ERROR --\x3e\n
\n \n {{error.message || \'Service temporarily unavailable.\'}}\n {{error.message || \'Service temporarily unavailable.\'}}\n
\n \x3c!-- CHAT ERROR --\x3e\n\n \n {{ settings.unmanagedMessage }}\n \n\n
\n {{ settings.noteTitle || \'Note\' }}\n\n \n \x3c!-- START textarea --\x3e\n \n \x3c!-- END textarea --\x3e\n \n\n
\n \n {{settings.sendUnmanaged}}\n \n \n {{settings.skipUnmanaged}}\n \n
\n
\n\n \n' + " {{ (settings.custom && !settings.defaultWhiteLabel) ? settings.whiteLabel : 'Powered By XCALLY' }}\n \n
\n\x3c!-- / CHAT CONTENT --\x3e\n"), e.put("app/waiting/index.html", '\x3c!-- WAITING CONTENT --\x3e\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n {{settings.waitingTitle}}\n
\n
\n {{settings.waitingMessage}}\n
\n
\n\x3c!-- / WAITING CONTENT --\x3e\n') -}]); \ No newline at end of file diff --git a/snippet/1.0.11/scripts/vendor.js b/snippet/1.0.11/scripts/vendor.js deleted file mode 100644 index 6fe7582..0000000 --- a/snippet/1.0.11/scripts/vendor.js +++ /dev/null @@ -1,37298 +0,0 @@ -! function(de) { - "use strict"; - var u = { - objectMaxDepth: 5, - urlErrorParamsEnabled: !0 - }; - - function e(e) { - if (!Ee(e)) return u; - O(e.objectMaxDepth) && (u.objectMaxDepth = c(e.objectMaxDepth) ? e.objectMaxDepth : NaN), O(e.urlErrorParamsEnabled) && Ae(e.urlErrorParamsEnabled) && (u.urlErrorParamsEnabled = e.urlErrorParamsEnabled) - } - - function c(e) { - return E(e) && 0 < e - } - - function M(a, s) { - s = s || Error; - var l = "https://errors.angularjs.org/1.7.8/", - e = l.replace(".", "\\.") + "[\\s\\S]*", - c = new RegExp(e, "g"); - return function() { - var e, t, n = arguments[0], - r = arguments[1], - i = "[" + (a ? a + ":" : "") + n + "] ", - o = Re(arguments, 2).map(function(e) { - return Ye(e, u.objectMaxDepth) - }); - if (i += r.replace(/\{\d+\}/g, function(e) { - var t = +e.slice(1, -1); - return t < o.length ? o[t].replace(c, "") : e - }), i += "\n" + l + (a ? a + "/" : "") + n, u.urlErrorParamsEnabled) - for (t = 0, e = "?"; t < o.length; t++, e = "&") i += e + "p" + t + "=" + encodeURIComponent(o[t]); - return new s(i) - } - } - var fe, he, t, v, o = /^\/(.+)\/([a-z]*)$/, - d = "validity", - pe = Object.prototype.hasOwnProperty, - me = function(e) { - return Ce(e) ? e.toLowerCase() : e - }, - f = function(e) { - return Ce(e) ? e.toUpperCase() : e - }, - a = [].slice, - r = [].splice, - n = [].push, - ge = Object.prototype.toString, - h = Object.getPrototypeOf, - p = M("ng"), - y = de.angular || (de.angular = {}), - i = 0; - - function R(e) { - if (null == e || x(e)) return !1; - if (ke(e) || Ce(e) || he && e instanceof he) return !0; - var t = "length" in Object(e) && e.length; - return E(t) && (0 <= t && t - 1 in e || "function" == typeof e.item) - } - - function ve(e, t, n) { - var r, i; - if (e) - if (Te(e)) - for (r in e) "prototype" !== r && "length" !== r && "name" !== r && e.hasOwnProperty(r) && t.call(n, e[r], r, e); - else if (ke(e) || R(e)) { - var o = "object" != typeof e; - for (r = 0, i = e.length; r < i; r++)(o || r in e) && t.call(n, e[r], r, e) - } else if (e.forEach && e.forEach !== ve) e.forEach(t, n, e); - else if (w(e)) - for (r in e) t.call(n, e[r], r, e); - else if ("function" == typeof e.hasOwnProperty) - for (r in e) e.hasOwnProperty(r) && t.call(n, e[r], r, e); - else - for (r in e) pe.call(e, r) && t.call(n, e[r], r, e); - return e - } - - function s(e, t, n) { - for (var r = Object.keys(e).sort(), i = 0; i < r.length; i++) t.call(n, e[r[i]], r[i]); - return r - } - - function A(n) { - return function(e, t) { - n(t, e) - } - } - - function l() { - return ++i - } - - function m(e, t) { - t ? e.$$hashKey = t : delete e.$$hashKey - } - - function g(e, t, n) { - for (var r = e.$$hashKey, i = 0, o = t.length; i < o; ++i) { - var a = t[i]; - if (Ee(a) || Te(a)) - for (var s = Object.keys(a), l = 0, c = s.length; l < c; l++) { - var u = s[l], - d = a[u]; - n && Ee(d) ? C(d) ? e[u] = new Date(d.valueOf()) : k(d) ? e[u] = new RegExp(d) : d.nodeName ? e[u] = d.cloneNode(!0) : P(d) ? e[u] = d.clone() : (Ee(e[u]) || (e[u] = ke(d) ? [] : {}), g(e[u], [d], !0)) : e[u] = d - } - } - return m(e, r), e - } - - function be(e) { - return g(e, a.call(arguments, 1), !1) - } - - function b(e) { - return g(e, a.call(arguments, 1), !0) - } - - function _(e) { - return parseInt(e, 10) - } - fe = de.document.documentMode; - var S = Number.isNaN || function(e) { - return e != e - }; - - function ye(e, t) { - return be(Object.create(e), t) - } - - function _e() {} - - function $e(e) { - return e - } - - function D(e) { - return function() { - return e - } - } - - function $(e) { - return Te(e.toString) && e.toString !== ge - } - - function we(e) { - return void 0 === e - } - - function O(e) { - return void 0 !== e - } - - function Ee(e) { - return null !== e && "object" == typeof e - } - - function w(e) { - return null !== e && "object" == typeof e && !h(e) - } - - function Ce(e) { - return "string" == typeof e - } - - function E(e) { - return "number" == typeof e - } - - function C(e) { - return "[object Date]" === ge.call(e) - } - - function ke(e) { - return Array.isArray(e) || e instanceof Array - } - - function xe(e) { - switch (ge.call(e)) { - case "[object Error]": - case "[object Exception]": - case "[object DOMException]": - return !0; - default: - return e instanceof Error - } - } - - function Te(e) { - return "function" == typeof e - } - - function k(e) { - return "[object RegExp]" === ge.call(e) - } - - function x(e) { - return e && e.window === e - } - - function Me(e) { - return e && e.$evalAsync && e.$watch - } - - function Ae(e) { - return "boolean" == typeof e - } - - function T(e) { - return e && Te(e.then) - } - _e.$inject = [], $e.$inject = []; - var N = /^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array]$/; - var Se = function(e) { - return Ce(e) ? e.trim() : e - }, - I = function(e) { - return e.replace(/([-()[\]{}+?*.$^|,:#").append(e).html(); - try { - return e[0].nodeType === Ue ? me(t) : t.match(/^(<[^>]+>)/)[1].replace(/^<([\w-]+)/, function(e, t) { - return "<" + me(t) - }) - } catch (e) { - return me(t) - } - } - - function K(e) { - try { - return decodeURIComponent(e) - } catch (e) {} - } - - function Z(e) { - var i = {}; - return ve((e || "").split("&"), function(e) { - var t, n, r; - e && (n = e = e.replace(/\+/g, "%20"), -1 !== (t = e.indexOf("=")) && (n = e.substring(0, t), r = e.substring(t + 1)), O(n = K(n)) && (r = !O(r) || K(r), pe.call(i, n) ? ke(i[n]) ? i[n].push(r) : i[n] = [i[n], r] : i[n] = r)) - }), i - } - - function X(e) { - return Q(e, !0).replace(/%26/gi, "&").replace(/%3D/gi, "=").replace(/%2B/gi, "+") - } - - function Q(e, t) { - return encodeURIComponent(e).replace(/%40/gi, "@").replace(/%3A/gi, ":").replace(/%24/g, "$").replace(/%2C/gi, ",").replace(/%3B/gi, ";").replace(/%20/g, t ? "%20" : "+") - } - var J = ["ng-", "data-ng-", "ng:", "x-ng-"]; - var ee = function(n) { - var e = n.currentScript; - if (!e) return !0; - if (!(e instanceof de.HTMLScriptElement || e instanceof de.SVGScriptElement)) return !1; - var t = e.attributes; - return [t.getNamedItem("src"), t.getNamedItem("href"), t.getNamedItem("xlink:href")].every(function(e) { - if (!e) return !0; - if (!e.value) return !1; - var t = n.createElement("a"); - if (t.href = e.value, n.location.origin === t.origin) return !0; - switch (t.protocol) { - case "http:": - case "https:": - case "ftp:": - case "blob:": - case "file:": - case "data:": - return !0; - default: - return !1 - } - }) - }(de.document); - - function te(r, e) { - var i, o, t = {}; - if (ve(J, function(e) { - var t = e + "app"; - !i && r.hasAttribute && r.hasAttribute(t) && (o = (i = r).getAttribute(t)) - }), ve(J, function(e) { - var t, n = e + "app"; - !i && (t = r.querySelector("[" + n.replace(":", "\\:") + "]")) && (o = (i = t).getAttribute(n)) - }), i) { - if (!ee) return void de.console.error("AngularJS: disabling automatic bootstrap. + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ logo +
+ + + {{settings.defaultTitle ? settings.defaultTitle : (status === 'online' ? settings.header_online : settings.header_offline)}} + + + + + + + +
+ +
+ + + +
+ +
+ +
+
+ +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/snippet/1.0.12/scripts/app.js b/snippet/1.0.12/scripts/app.js new file mode 100644 index 0000000..768895d --- /dev/null +++ b/snippet/1.0.12/scripts/app.js @@ -0,0 +1,662 @@ +! function() { + "use strict"; + angular.module("motion", ["ngAnimate", "ngAria", "ngMessages", "ngMaterial", "ngResource", "ngSanitize", "ngCsv", "ngEmbed", "ui.router", "LocalStorageModule", "ngRateIt", "flow"]).constant("STORAGE_PREFIX", "motion_chat").constant("STORAGE_VISITOR", "visitor").constant("STORAGE_LAYOUT", "layout").directive("ngEnter", function() { + return function(t, e, n) { + e.bind("keydown keypress", function(e) { + 13 === e.which && (t.$apply(function() { + t.$eval(n.ngEnter) + }), e.preventDefault()) + }) + } + }).directive("ngPrint", function() { + function i(e, t) { + for (var n, i = document.createElement("div"), o = t.visitor, s = t.settings, a = 0; a < t.messages.length; a++) { + var r = t.messages[a], + l = "Sender: ", + c = "Message: " + r.body, + d = "Sent At: " + moment(r.createdAt).format("YYYY-MM-DD HH:mm:ss"); + if (0 !== a) { + switch (t.settings.agentIdentifier) { + case "website_alias": + l += "out" === r.direction ? r.UserId ? s.agentAlias + r.UserId : "System" : s.customerAlias || o.from || "Visitor" + r.ContactId; + break; + case "agent_alias": + l += "out" === r.direction ? r.UserId ? r.User.alias || r.User.fullname : "System" : s.customerAlias || o.from || "Visitor" + r.ContactId; + break; + case "agent_fullname": + l += "out" === r.direction ? r.UserId ? r.User.fullname : "System" : s.customerAlias || o.from || "Visitor" + r.ContactId; + break; + default: + l += "out" === r.direction ? r.UserId ? (s.agentAlias || "Agent") + r.UserId : "System" : s.customerAlias || o.from || "Visitor" + r.ContactId + } + i.appendChild(document.createTextNode(l)), i.appendChild(document.createElement("br")), i.appendChild(document.createTextNode(c)), i.appendChild(document.createElement("br")), i.appendChild(document.createTextNode(d)), i.appendChild(document.createElement("br")), i.appendChild(document.createElement("br")) + } else n = r.createdAt + } + var m = window.open(); + m.document.write("" + document.title + ""), m.document.write(""), m.document.write("

Website: " + s.referer + "

"), m.document.write("

Start Time: " + moment(n).format("YYYY-MM-DD HH:mm:ss") + "

"), m.document.write("

Print Time: " + moment().format("YYYY-MM-DD HH:mm:ss") + "

"), m.document.write(i.innerHTML), m.document.write(""), m.document.close(), m.focus(), m.print(), m.close() + } + return { + link: function(t, e, n) { + e.on("click", function() { + var e = document.getElementById("chatContent1"); + e && i(e, t) + }) + }, + restrict: "A" + } + }) +}(), +function() { + "use strict"; + + function e(e, s, t, n, i, o, a, r, l, c) { + var d, m, g, u, p = this; + + function f() { + s.settings.online ? o.go("app.online", null, { + location: "replace" + }) : o.go("app.offline", null, { + location: "replace" + }) + } + + function v() { + s.visitor && s.visitor.interaction && s.visitor.interaction.id && r.chatInteraction.get({ + id: s.visitor.interaction.id + }).$promise.then(function(e) { + delete p.errors.getInteraction, e.closed && (s.visitor.interaction.closed = !0, s.updateStorage(l, s.visitor), "unmanaged" === e.disposition ? o.go("app.unmanaged", null, { + location: "replace" + }) : o.go("app.closing", null, { + location: "replace" + })) + }).catch(function(e) { + switch (e.status) { + case 403: + o.go("app.closing", null, { + location: "replace" + }); + break; + case 404: + s.updateStorage(l, null, !0), s.updateStorage(c, null, !0), f(); + break; + case 405: + o.go("app.unmanaged", null, { + location: "replace" + }); + break; + default: + console.error(e) + } + }) + } + + function h(t) { + return function(e) { + p.errors[t] = e.data, w() + } + } + + function x(e) { + var t = d[0].emojioneArea.getText(); + e && 13 === e.keyCode && e.shiftKey || e && 13 !== e.keyCode || "" !== t && b(_.merge({ + body: t + }, s.visitor)) + } + + function b(e) { + r.chatWebsite.notify(e).$promise.then(function(e) { + delete p.errors.chatMessageError, _.isNil(s.visitor.interaction) && (s.visitor.interaction = { + id: e.interaction.id + }, s.updateStorage(l, s.visitor)), d[0].emojioneArea.setText(""), w() + }).catch(h("chatMessageError")) + } + + function y() { + s.visitor && s.visitor.interaction && s.visitor.interaction.id && r.chatInteraction.getMessages({ + intid: s.visitor.interaction.id, + includeAgent: !0, + id: u || void 0 + }).$promise.then(function(e) { + if (delete p.errors.interaction, e.count) { + for (var t = 0, n = !1; t < e.rows.length; t++) { + var i = _.find(s.messages, { + id: e.rows[t].id + }); + i ? e.rows[t].read && (i.read = !0) : (n = !0, s.messages.push(e.rows[t])), "out" !== e.rows[t].direction || e.rows[t].read || (o = e.rows[t].id, r.chatMessage.update({ + id: o, + read: !0 + }).$promise.catch(function(e) { + console.error(e) + })) + } + n && w(), e.rows[t - 1].read && (u = e.rows[t - 1].id) + } + var o + }).catch(function(e) { + switch (e.status) { + case 403: + o.go("app.closing", null, { + location: "replace" + }); + break; + case 405: + o.go("app.unmanaged", null, { + location: "replace" + }); + break; + default: + console.error(e) + } + }) + } + + function w() { + t(function() { + var e = i[0].getElementsByClassName("chat-messages")[0]; + e && (e.scrollTop = e.scrollHeight) + }) + } + p.errors = {}, s.messages = [], p.emojiOptions = { + watchEmbedData: !1, + fontSmiley: !1, + emoji: !0, + link: !0, + linkTarget: "_blank" + }, p.$onInit = function() { + s.status = "chat", s.loading = !1, s.settings.showMenu = !0, p.replyMessage = "", s.visitor.interaction && s.visitor.interaction.closed ? (s.updateStorage(l, null, !0), s.updateStorage(c, null, !0), f()) : (v(), m = n(y, 2e3), g = n(v, 3e3)); + d = $("#emojionearea").emojioneArea({ + placeholder: s.settings.placeholderMessage || "Type a message", + events: { + keyup: function(e, t) { + x(t) + } + } + }) + }, p.reply = x, p.fileAdded = function(e) { + var t = new FormData; + t.append("file", e.file), a.post(s.settings.remote + "/api/chat/interactions/" + s.visitor.interaction.id + "/attachment_upload?token=" + s.settings.token, t, { + transformRequest: angular.identity, + headers: { + "Content-Type": void 0 + } + }).then(function(e) { + (e = e.data).id ? (delete p.errors.sendAttachment, b(_.merge({ + body: '' + e.name + "", + AttachmentId: e.id + }, s.visitor))) : h("sendAttachment") + }, h("sendAttachment")) + }, e.$on("$destroy", function() { + n.cancel(m), n.cancel(g), g = m = null + }), s.$on("$download", function(e, t) { + t && t(_.values(s.messages)) + }) + } + e.$inject = ["$scope", "$rootScope", "$timeout", "$interval", "$document", "$state", "$http", "api", "STORAGE_VISITOR", "STORAGE_LAYOUT"], angular.module("motion").controller("ChatController", e) +}(), +function() { + "use strict"; + + function e(i, e, o, t, n, s) { + var a = this; + + function r() { + i.settings.online ? e.go("app.online", null, { + location: "replace" + }) : e.go("app.offline", null, { + location: "replace" + }) + } + + function l() { + a.form = {}, a.upColor = null, a.downColor = null, a.userForm.$setPristine(), a.userForm.$setUntouched(), delete i.visitor.interaction, i.enableDownload = !1 + } + + function c(n) { + return function(e) { + a.errors[n] = e.data; + var t = o.simple().textContent(i.settings.formSubmitFailureMessage || "Form submission error").toastClass("md-failure-toast").position("top"); + o.show(t) + } + } + + function d() { + i.loading = !1 + } + a.$onInit = function() { + i.status = "closing", i.updateStorage(n, null, !0), i.updateStorage(s, null, !0), i.loading = !1 + }, a.submit = function() { + i.loading = !0, i.visitor.interaction && i.visitor.interaction.id ? t.chatInteraction.close(_.merge({ + id: i.visitor.interaction.id, + ratingType: i.settings.ratingType, + customer: i.settings.customerAlias || i.visitor.from + }, a.form)).$promise.then(function() { + delete a.errors.submit; + var e = o.simple().textContent(i.settings.formSubmitSuccessMessage || "Form properly submitted").toastClass("md-success-toast").parent(angular.element(document.querySelector("#chat-toolbar"))); + o.show(e) + }).then(l).then(r).catch(c("submit")).finally(d) : (d(), c("submit")) + }, a.skip = function() { + l(), r() + }, a.form = {}, a.errors = {} + } + e.$inject = ["$rootScope", "$state", "$mdToast", "api", "STORAGE_VISITOR", "STORAGE_LAYOUT"], angular.module("motion").controller("ClosingController", e) +}(), +function() { + "use strict"; + + function e(a, r, l, n, i, c, o, d, m) { + var e = this; + + function s(e, t, n) { + var i = c.get(e) || {}; + n ? delete i[a.location] : i[a.location] = t, c.set(e, i) + } + + function g(e) { + var t; + a.layout.up = e, s(d, a.layout), t = e ? "show" : "hide", r.parent.postMessage({ + cmd: t + }, "*") + } + a.location = a.settings.location, e.$onInit = function() { + a.status = "init"; + var e = !1, + t = c.get(m) || {}, + n = c.get(d) || {}; + a.visitor = t[a.location] ? t[a.location] : {}, a.layout = n[a.location] ? n[a.location] : {}, a.visitor.interaction && a.layout.up ? e = !0 : a.layout.up = !1; + g(e), l.go((i = a.settings.online, o = !!(a.visitor && a.visitor.interaction && a.visitor.interaction.id), s = Number(a.settings.maxInteractions) && Number(a.settings.openedInteractions) >= Number(a.settings.maxInteractions), o || !s && i ? "app.online" : "app.offline"), null, { + location: "replace" + }), r.parent.postMessage({ + cmd: "init", + div_color: a.settings.color, + text_color: a.settings.textColor + }, "*"); + var i, o, s + }, e.close = function() { + var e = a.visitor.interaction; + if (e && e.id) { + var t = n.confirm().parent(angular.element(document.querySelector("#chat-app"))).clickOutsideToClose(!0).title(a.settings.closingQuestion || "Do you want to close the interaction?").ok("Ok").cancel("Cancel"); + n.show(t).then(function() { + return o.chatInteraction.customUpdate({ + id: e.id, + closed: !0, + closeReason: "contact", + closedAt: moment().format("YYYY-MM-DD HH:mm:ss") + }).$promise + }).then(function() { + l.go("app.closing", null, { + location: "replace" + }) + }).catch(function(e) { + console.error("keep open", e) + }) + } + }, e.toggle = g, e.download = function(e) { + var t = i.defer(), + n = a.visitor.interaction; + n && n.id && o.chatInteraction.getMessages({ + intid: n.id, + includeAll: !0 + }).$promise.then(function(e) { + t.resolve(_.map(e.rows.slice(1), function(e) { + var t; + if ("in" === e.direction && (t = a.settings.customerAlias || a.visitor.from || "Visitor" + e.ContactId), "out" === e.direction) switch (a.settings.agentIdentifier) { + case "website_alias": + t = e.UserId ? a.settings.agentAlias + e.UserId : "System"; + break; + case "agent_alias": + t = e.UserId ? e.User.alias || e.User.fullname : "System"; + break; + case "agent_fullname": + t = e.UserId ? e.User.fullname : "System"; + break; + default: + t = e.UserId ? a.settings.agentAlias + e.UserId : "System" + } + return { + sender: t, + message: e.body, + createdAt: moment(e.createdAt).format("MM/DD/YYYY HH:mm:ss") + } + })) + }).catch(function(e) { + console.error(e) + }); + return t.promise + }, e.getHeaderShape = function() { + return "rounded" === a.settings.header_shape ? "15px" : "0px" + }, a.updateStorage = s, window.addEventListener("message", function(e) { + g("show" === e.data.evt) + }, !1) + } + e.$inject = ["$rootScope", "$window", "$state", "$mdDialog", "$q", "localStorageService", "api", "STORAGE_LAYOUT", "STORAGE_VISITOR"], angular.module("motion").controller("IndexController", e) +}(), +function() { + "use strict"; + + function e(e, t) { + var n = { + baseUrl: e.settings.remote + "/api/" + }, + i = { + id: "@id", + token: e.settings.token + }; + return n.chatWebsite = t(n.baseUrl + "chat/websites/:id", i, { + notify: { + method: "POST", + url: n.baseUrl + "chat/websites/:id/notify" + }, + offline: { + method: "POST", + url: n.baseUrl + "chat/websites/:id/offline" + }, + getFields: { + method: "GET", + url: n.baseUrl + "chat/websites/:id/fields" + } + }), n.chatInteraction = t(n.baseUrl + "chat/interactions/:id", i, { + update: { + method: "PUT", + url: n.baseUrl + "chat/interactions/:id" + }, + customUpdate: { + method: "PUT", + url: n.baseUrl + "chat/interactions/:id/custom_update" + }, + close: { + method: "PUT", + url: n.baseUrl + "chat/interactions/:id/close" + }, + getMessages: { + method: "GET", + url: n.baseUrl + "chat/interactions/:intid/my_messages" + }, + uploadAttachment: { + method: "POST", + url: n.baseUrl + "chat/interactions/:id/attachment_upload", + headers: { + "Content-Type": void 0 + }, + transformRequest: angular.identity + }, + downloadAttachment: { + method: "GET", + url: n.baseUrl + "chat/interactions/:id/attachment_download" + } + }), n.chatMessage = t(n.baseUrl + "chat/messages/:id", i, { + update: { + method: "PUT", + url: n.baseUrl + "chat/messages/:id" + } + }), n + } + e.$inject = ["$rootScope", "$resource"], angular.module("motion").factory("api", e) +}(), +function() { + "use strict"; + + function e(n, e) { + var t = e.search(); + n.settings = { + cursor: "pointer", + hide: !0 + }, _.forIn(t, function(e, t) { + "" === e || _.isNil(e) || ("true" === e && (e = !0), "false" === e && (e = !1), n.settings[t] = e) + }) + } + + function t(e, t, n, i, o, s) { + n.html5Mode(!0), i.defaults.headers.get || (i.defaults.headers.get = {}), i.defaults.headers.get["If-Modified-Since"] = "Mon, 26 Jul 1997 05:00:00 GMT", i.defaults.headers.get["Cache-Control"] = "no-cache", i.defaults.headers.get.Pragma = "no-cache", o.setPrefix(s), e.state("app", { + url: "/app", + abstract: !0 + }).state("app.waiting", { + url: "/waiting", + templateUrl: "app/waiting/index.html", + controller: "WaitingController as vm" + }).state("app.online", { + url: "/online", + templateUrl: "app/online/index.html", + controller: "OnlineController as vm" + }).state("app.offline", { + url: "/offline", + templateUrl: "app/offline/index.html", + controller: "OfflineController as vm" + }).state("app.chat", { + url: "/chat", + templateUrl: "app/chat/index.html", + controller: "ChatController as vm" + }).state("app.unmanaged", { + url: "/unmanaged", + templateUrl: "app/unmanaged/index.html", + controller: "UnmanagedController as vm" + }).state("app.closing", { + url: "/closing", + templateUrl: "app/closing/index.html", + controller: "ClosingController as vm" + }) + } + e.$inject = ["$rootScope", "$location"], t.$inject = ["$stateProvider", "$urlRouterProvider", "$locationProvider", "$httpProvider", "localStorageServiceProvider", "STORAGE_PREFIX"], angular.module("motion").config(t).run(e) +}(), +function() { + "use strict"; + + function e(i, o, s) { + var a = this, + r = null; + + function l() { + i.loading = !1 + } + a.$onInit = function() { + i.status = "offline", a.visitor = { + id: i.settings.id, + mapKeyOffline: "firstName", + from: "Anonymous" + _.random(1, 1e6) + }, i.settings.showMenu = !1, i.loading = !1, o.chatWebsite.getFields({ + id: i.settings.id, + online: !1 + }).$promise.then(function(e) { + e.count && (r = e.fromKey, a.fields = e.rows) + }).catch(function(e) { + console.error(e) + }) + }, a.submit = function() { + i.loading = !0; + for (var e = 0; e < a.fields.length; e++) { + var t = a.fields[e]; + t.props && a.form.hasOwnProperty(t.props.title) && (_.isNil(t.cmField) || (a.visitor[t.cmField] = _.isArray(a.form[t.props.title]) ? a.form[t.props.title].join() : a.form[t.props.title]), e === r && (_.isNil(i.settings.mapKeyOffline) || (a.visitor.mapKeyOffline = i.settings.mapKeyOffline, a.visitor.from = _.isArray(a.form[t.props.title]) ? a.form[t.props.title].join() : a.form[t.props.title]))) + } + o.chatWebsite.offline(_.merge({ + body: a.form + }, a.visitor)).$promise.then(function() { + delete a.errors.submit, i.$emit("hide"), a.form = {}, a.userForm.$setPristine(), a.userForm.$setUntouched(); + var e = s.simple().textContent(i.settings.formSubmitSuccessMessage || "Form properly submitted").toastClass("md-success-toast").parent(angular.element(document.querySelector("#chat-toolbar"))); + s.show(e) + }).catch((n = "submit", function(e) { + var t = s.simple().textContent(i.settings.formSubmitFailureMessage || "Form submission error").toastClass("md-failure-toast").parent(angular.element(document.querySelector("#chat-toolbar"))); + s.show(t), a.errors[n] = e.data + })).finally(l); + var n + }, a.toggle = function(e, t) { + a.form[e] || (a.form[e] = []); + var n = a.form[e].indexOf(t); - 1 < n ? a.form[e].splice(n, 1) : a.form[e].push(t) + }, a.exists = function(e, t) { + a.form[e] || (a.form[e] = []); + return -1 < a.form[e].indexOf(t) + }, a.form = {}, a.errors = {}, a.userForm = {} + } + e.$inject = ["$rootScope", "api", "$mdToast"], angular.module("motion").controller("OfflineController", e) +}(), +function() { + "use strict"; + + function e(o, s, a, r) { + var l = this, + c = null; + l.$onInit = function() { + o.status = "online", o.visitor && o.visitor.interaction ? o.visitor.interaction.id ? s.go("app.chat", null, { + location: "replace" + }) : s.go("app.waiting", null, { + location: "replace" + }) : (o.visitor = { + id: o.settings.id, + mapKey: "firstName", + from: "Anonymous" + _.random(1, 1e6) + }, o.settings.showMenu = !1, o.updateStorage(r, o.visitor), a.chatWebsite.getFields({ + id: o.settings.id, + online: !0 + }).$promise.then(function(e) { + e.count && (c = e.fromKey, l.fields = e.rows) + }).catch(function(e) { + console.error(e) + })) + }, l.submit = function() { + for (var e = "", t = 0; t < l.fields.length; t++) { + var n = l.fields[t]; + n.props && l.form.hasOwnProperty(n.props.title) && (_.isNil(n.variable) || (o.visitor[n.variable] = _.isArray(l.form[n.props.title]) ? l.form[n.props.title].join() : l.form[n.props.title]), _.isNil(n.cmField) || (o.visitor[n.cmField] = _.isArray(l.form[n.props.title]) ? l.form[n.props.title].join() : l.form[n.props.title]), t === c && (_.isNil(o.settings.mapKey) || (o.visitor.mapKey = o.settings.mapKey, o.visitor.from = _.isArray(l.form[n.props.title]) ? l.form[n.props.title].join() : l.form[n.props.title])), e += n.props.title + ": " + l.form[n.props.title] + "\n") + } + i = _.merge({ + body: e, + referer: o.settings.referer, + customerIp: o.settings.customerIp + }, o.visitor), l.disableItem = !0, a.chatWebsite.notify(i).$promise.then(function(e) { + delete l.errors.chatMessageError, o.visitor.message = { + id: e.message.id + }, o.visitor.interaction = { + id: e.interaction.id + }, o.updateStorage(r, o.visitor), l.disableItem = !1, o.settings.enableCustomerWriting ? s.go("app.chat", null, { + location: "replace" + }) : s.go("app.waiting", null, { + location: "replace" + }) + }).catch(function(e) { + l.disableItem = !1, console.error(e) + }); + var i + }, l.toggle = function(e, t) { + l.form[e] || (l.form[e] = []); + var n = l.form[e].indexOf(t); - 1 < n ? l.form[e].splice(n, 1) : l.form[e].push(t) + }, l.exists = function(e, t) { + l.form[e] || (l.form[e] = []); + return -1 < l.form[e].indexOf(t) + }, l.form = {}, l.errors = {}, l.userForm = {}, l.disableItem = !1 + } + e.$inject = ["$rootScope", "$state", "api", "STORAGE_VISITOR"], angular.module("motion").controller("OnlineController", e) +}(), +function() { + "use strict"; + + function e(i, e, o, t, n, s) { + var a = this; + + function r() { + i.settings.online ? e.go("app.online", null, { + location: "replace" + }) : e.go("app.offline", null, { + location: "replace" + }) + } + + function l() { + a.form = {}, a.upColor = null, a.downColor = null, a.userForm.$setPristine(), a.userForm.$setUntouched(), i.visitor = {}, i.enableDownload = !1, i.$emit("hide") + } + + function c(n) { + return function(e) { + a.errors[n] = e.data; + var t = o.simple().textContent(i.settings.formSubmitFailureMessage || "Form submission error").toastClass("md-failure-toast").parent(angular.element(document.querySelector("#chat-toolbar"))); + o.show(t) + } + } + + function d() { + i.loading = !1 + } + a.form = {}, a.errors = {}, a.$onInit = function() { + i.status = "unmanaged", i.updateStorage(n, null, !0), i.updateStorage(s, null, !0), i.loading = !1 + }, a.submit = function() { + i.loading = !0, i.visitor.interaction && i.visitor.interaction.id ? t.chatInteraction.customUpdate({ + id: i.visitor.interaction.id, + note: a.form.note + }).$promise.then(function() { + delete a.errors.submit; + var e = o.simple().textContent(i.settings.formSubmitSuccessMessage || "Form properly submitted").toastClass("md-success-toast").parent(angular.element(document.querySelector("#chat-toolbar"))); + o.show(e) + }).then(l).then(r).catch(c("submit")).finally(d) : (d(), c("submit")) + }, a.skip = function() { + l(), r() + } + } + e.$inject = ["$rootScope", "$state", "$mdToast", "api", "STORAGE_VISITOR", "STORAGE_LAYOUT"], angular.module("motion").controller("UnmanagedController", e) +}(), +function() { + "use strict"; + + function e(i, e, t, o, n, s, a, r) { + var l, c = !1; + + function d() { + var t = {}, + n = !1; + s.chatInteraction.get({ + id: i.visitor.interaction.id + }).$promise.then(function(e) { + return t = e, s.chatInteraction.getMessages({ + intid: i.visitor.interaction.id + }).$promise + }).then(function(e) { + n = 1 < e.rows.length, t.closed ? (i.visitor.interaction.closed = !0, i.updateStorage(a, i.visitor), "unmanaged" === t.disposition && o.go("app.unmanaged", null, { + location: "replace" + })) : t.UserId ? (i.visitor.interaction.UserId = t.UserId, i.updateStorage(a, i.visitor), o.go("app.chat", null, { + location: "replace" + })) : n && o.go("app.chat", null, { + location: "replace" + }) + }).catch(function(e) { + switch (e.status) { + case 403: + o.go("app.closing", null, { + location: "replace" + }); + break; + case 405: + o.go("app.unmanaged", null, { + location: "replace" + }); + break; + default: + console.error(e) + } + }) + } + + function m() { + if (i.visitor && i.visitor.interaction && i.visitor.interaction.id && !c) { + c = !0; + var e = new XMLHttpRequest; + e.open("PUT", i.settings.remote + "/api/chat/interactions/" + i.visitor.interaction.id + "/abandon?token=" + i.settings.token, !1), e.setRequestHeader("Content-type", "application/json; charset=utf-8"), e.send(JSON.stringify({ + channel: "chat", + interaction: { + id: i.visitor.interaction.id + }, + message: { + id: i.visitor.message.id + }, + disposition: "abandoned", + closed: !0, + closeReason: "contact", + closedAt: moment().format("YYYY-MM-DD HH:mm:ss") + })), 4 === e.readyState && 200 === e.status && (i.updateStorage(a, null, !0), i.updateStorage(r, null, !0)) + } + } + this.$onInit = function() { + i.status = "waiting", i.visitor && i.visitor.interaction && i.visitor.interaction.id && (l = t(d, 3e3)) + }, e.$on("$destroy", function() { + n.removeEventListener("beforeunload", m), n.removeEventListener("unload", m), t.cancel(l) + }), n.addEventListener("beforeunload", m), n.addEventListener("unload", m) + } + e.$inject = ["$rootScope", "$scope", "$interval", "$state", "$window", "api", "STORAGE_VISITOR", "STORAGE_LAYOUT"], angular.module("motion").controller("WaitingController", e) +}(), angular.module("motion").run(["$templateCache", function(e) { + "use strict"; + e.put("app/chat/index.html", "\x3c!-- CHAT CONTENT --\x3e\n\n
\n \"system\"\n \"agent\"\n \"customer\"\n\n
\n
\n
\n \n {{message.direction === 'out' ? (message.UserId ? (settings.agentAlias + message.UserId) : settings.systemAlias) : (settings.customerAlias || visitor.from || 'Visitor' + message.ContactId)}} - {{message.createdAt | date : 'h:mm'}}\n \n \n {{message.direction === 'out' ? (message.UserId ? (message.User.alias || message.User.fullname) : settings.systemAlias) : (settings.customerAlias || visitor.from || 'Visitor' + message.ContactId)}} - {{message.createdAt | date : 'h:mm'}}\n \n \n {{message.direction === 'out' ? (message.UserId ? message.User.fullname : settings.systemAlias) : (settings.customerAlias || visitor.from || 'Visitor' + message.ContactId)}} - {{message.createdAt | date : 'h:mm'}}\n \n \n {{message.direction === 'out' ? (message.UserId ? ((settings.agentAlias || 'Agent') + message.UserId) : settings.systemAlias) : (settings.customerAlias || visitor.from || 'Visitor' + message.ContactId)}} - {{message.createdAt | date : 'h:mm'}}\n \n
\n
\n \n \n
\n
\n
\n" + '
\n
\n
\n
\n
\n\n \x3c!-- CHAT ERROR --\x3e\n
\n \n {{error.message || \'Service temporarily unavailable.\'}}\n {{error.message || \'Service temporarily unavailable.\'}}\n
\n \x3c!-- CHAT ERROR --\x3e\n
\n\x3c!-- / CHAT CONTENT --\x3e\n\n\x3c!-- CHAT FOOTER --\x3e\n\n\x3c!-- / CHAT FOOTER --\x3e'), e.put("app/closing/index.html", '\x3c!-- CHAT CONTENT --\x3e\n\n \x3c!-- CHAT ERROR --\x3e\n
\n \n {{error.message || \'Service temporarily unavailable.\'}}\n {{error.message || \'Service temporarily unavailable.\'}}\n
\n \x3c!-- CHAT ERROR --\x3e\n\n \n {{ settings.closingMessage }}\n \n\n
\n \n \x3c!-- START thumb rating --\x3e\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n \x3c!-- END thumb rating --\x3e\n\n \x3c!-- START star rating --\x3e\n
\n \n
\n \x3c!-- END star rating --\x3e\n
\n\n \n \x3c!-- START textarea --\x3e\n Feedback\n \n \x3c!-- END textarea --\x3e\n \n\n \n {{settings.forwardTranscriptMessage}}\n Email\n \x3c!-- START email --\x3e\n \n
\n
\n Email must be a valid e-mail address\n
\n
\n \x3c!-- END email --\x3e\n
\n\n
\n \n {{settings.closingMessageButton}}\n \n \n {{settings.skipMessageButton}}\n \n
\n
\n\n \n' + " {{ (settings.custom && !settings.defaultWhiteLabel) ? settings.whiteLabel : 'Powered By XCALLY' }}\n \n\n
\n\x3c!-- / CHAT CONTENT --\x3e\n"), e.put("app/offline/index.html", '\x3c!-- CHAT CONTENT --\x3e\n\n\n
\n\n
\n
\n {{field.props.title + (field.config.required ? \'*\' : \'\')}}\n\n \n
\n
\n\n \x3c!-- CHAT ERROR --\x3e\n
\n \n {{error.message || \'Service temporarily unavailable.\'}}\n {{error.message || \'Service temporarily unavailable.\'}}\n
\n \x3c!-- CHAT ERROR --\x3e\n\n \n \x3c!-- START label --\x3e\n
\n \n {{field.value}}\n \n
\n \x3c!-- END label --\x3e\n\n \x3c!-- START textinput --\x3e\n
\n \n
\n \x3c!-- END textinput --\x3e\n\n \x3c!-- START textarea --\x3e\n
\n \n
\n \x3c!-- END textarea --\x3e\n\n \x3c!-- START select --\x3e\n
\n \n {{option.value}}\n \n
\n \x3c!-- END select --\x3e\n\n \x3c!-- START radio --\x3e\n
\n \n {{option.value}}\n \n
\n \x3c!-- END radio --\x3e\n\n \x3c!-- START checkbox --\x3e\n
\n
\n \n {{option.value}}\n \n
\n
\n \x3c!-- END checkbox --\x3e\n\n \x3c!-- START agreement --\x3e\n
\n \n {{field.options[0].value}}\n \n
\n \x3c!-- END agreement --\x3e\n\n
\n
\n Required Field\n
\n
\n Wrong type field\n
\n
\n
\n
\n\n \n {{settings.offline_chat_button}}\n \n
\n\n \n' + " {{ (settings.custom && !settings.defaultWhiteLabel) ? settings.whiteLabel : 'Powered By XCALLY' }}\n \n
\n\x3c!-- / CHAT CONTENT --\x3e\n"), e.put("app/online/index.html", '\x3c!-- CHAT CONTENT --\x3e\n\n
\n
\n {{field.props.title + (field.config.required ? \'*\' : \'\')}}\n\n \n
\n
\n\n \x3c!-- CHAT ERROR --\x3e\n
\n \n {{error.message || \'Service temporarily unavailable.\'}}\n {{error.message || \'Service temporarily unavailable.\'}}\n
\n \x3c!-- CHAT ERROR --\x3e\n\n \n \x3c!-- START label --\x3e\n
\n \n {{field.value}}\n \n
\n \x3c!-- END label --\x3e\n\n \x3c!-- START textinput --\x3e\n
\n \n
\n \x3c!-- END textinput --\x3e\n\n \x3c!-- START textarea --\x3e\n
\n \n
\n \x3c!-- END textarea --\x3e\n\n \x3c!-- START select --\x3e\n
\n \n {{option.value}}\n \n
\n \x3c!-- END select --\x3e\n\n \x3c!-- START radio --\x3e\n
\n \n {{option.value}}\n \n
\n \x3c!-- END radio --\x3e\n\n \x3c!-- START checkbox --\x3e\n
\n \n {{option.value}}\n \n
\n \x3c!-- END checkbox --\x3e\n\n \x3c!-- START agreement --\x3e\n
\n \n {{field.options[0].value}}\n \n
\n \x3c!-- END agreement --\x3e\n\n
\n
\n Required Field\n
\n
\n Wrong type field\n
\n
\n
\n
\n\n \n {{settings.start_chat_button}}\n \n
\n\n \n' + " {{ (settings.custom && !settings.defaultWhiteLabel) ? settings.whiteLabel : 'Powered By XCALLY' }}\n \n
\n\x3c!-- / CHAT CONTENT --\x3e\n"), e.put("app/unmanaged/index.html", '\x3c!-- CHAT CONTENT --\x3e\n\n \x3c!-- CHAT ERROR --\x3e\n
\n \n {{error.message || \'Service temporarily unavailable.\'}}\n {{error.message || \'Service temporarily unavailable.\'}}\n
\n \x3c!-- CHAT ERROR --\x3e\n\n \n {{ settings.unmanagedMessage }}\n \n\n
\n {{ settings.noteTitle || \'Note\' }}\n\n \n \x3c!-- START textarea --\x3e\n \n \x3c!-- END textarea --\x3e\n \n\n
\n \n {{settings.sendUnmanaged}}\n \n \n {{settings.skipUnmanaged}}\n \n
\n
\n\n \n' + " {{ (settings.custom && !settings.defaultWhiteLabel) ? settings.whiteLabel : 'Powered By XCALLY' }}\n \n
\n\x3c!-- / CHAT CONTENT --\x3e\n"), e.put("app/waiting/index.html", '\x3c!-- WAITING CONTENT --\x3e\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n {{settings.waitingTitle}}\n
\n
\n {{settings.waitingMessage}}\n
\n
\n\x3c!-- / WAITING CONTENT --\x3e\n') +}]); \ No newline at end of file diff --git a/snippet/1.0.12/scripts/vendor.js b/snippet/1.0.12/scripts/vendor.js new file mode 100644 index 0000000..6fe7582 --- /dev/null +++ b/snippet/1.0.12/scripts/vendor.js @@ -0,0 +1,37298 @@ +! function(de) { + "use strict"; + var u = { + objectMaxDepth: 5, + urlErrorParamsEnabled: !0 + }; + + function e(e) { + if (!Ee(e)) return u; + O(e.objectMaxDepth) && (u.objectMaxDepth = c(e.objectMaxDepth) ? e.objectMaxDepth : NaN), O(e.urlErrorParamsEnabled) && Ae(e.urlErrorParamsEnabled) && (u.urlErrorParamsEnabled = e.urlErrorParamsEnabled) + } + + function c(e) { + return E(e) && 0 < e + } + + function M(a, s) { + s = s || Error; + var l = "https://errors.angularjs.org/1.7.8/", + e = l.replace(".", "\\.") + "[\\s\\S]*", + c = new RegExp(e, "g"); + return function() { + var e, t, n = arguments[0], + r = arguments[1], + i = "[" + (a ? a + ":" : "") + n + "] ", + o = Re(arguments, 2).map(function(e) { + return Ye(e, u.objectMaxDepth) + }); + if (i += r.replace(/\{\d+\}/g, function(e) { + var t = +e.slice(1, -1); + return t < o.length ? o[t].replace(c, "") : e + }), i += "\n" + l + (a ? a + "/" : "") + n, u.urlErrorParamsEnabled) + for (t = 0, e = "?"; t < o.length; t++, e = "&") i += e + "p" + t + "=" + encodeURIComponent(o[t]); + return new s(i) + } + } + var fe, he, t, v, o = /^\/(.+)\/([a-z]*)$/, + d = "validity", + pe = Object.prototype.hasOwnProperty, + me = function(e) { + return Ce(e) ? e.toLowerCase() : e + }, + f = function(e) { + return Ce(e) ? e.toUpperCase() : e + }, + a = [].slice, + r = [].splice, + n = [].push, + ge = Object.prototype.toString, + h = Object.getPrototypeOf, + p = M("ng"), + y = de.angular || (de.angular = {}), + i = 0; + + function R(e) { + if (null == e || x(e)) return !1; + if (ke(e) || Ce(e) || he && e instanceof he) return !0; + var t = "length" in Object(e) && e.length; + return E(t) && (0 <= t && t - 1 in e || "function" == typeof e.item) + } + + function ve(e, t, n) { + var r, i; + if (e) + if (Te(e)) + for (r in e) "prototype" !== r && "length" !== r && "name" !== r && e.hasOwnProperty(r) && t.call(n, e[r], r, e); + else if (ke(e) || R(e)) { + var o = "object" != typeof e; + for (r = 0, i = e.length; r < i; r++)(o || r in e) && t.call(n, e[r], r, e) + } else if (e.forEach && e.forEach !== ve) e.forEach(t, n, e); + else if (w(e)) + for (r in e) t.call(n, e[r], r, e); + else if ("function" == typeof e.hasOwnProperty) + for (r in e) e.hasOwnProperty(r) && t.call(n, e[r], r, e); + else + for (r in e) pe.call(e, r) && t.call(n, e[r], r, e); + return e + } + + function s(e, t, n) { + for (var r = Object.keys(e).sort(), i = 0; i < r.length; i++) t.call(n, e[r[i]], r[i]); + return r + } + + function A(n) { + return function(e, t) { + n(t, e) + } + } + + function l() { + return ++i + } + + function m(e, t) { + t ? e.$$hashKey = t : delete e.$$hashKey + } + + function g(e, t, n) { + for (var r = e.$$hashKey, i = 0, o = t.length; i < o; ++i) { + var a = t[i]; + if (Ee(a) || Te(a)) + for (var s = Object.keys(a), l = 0, c = s.length; l < c; l++) { + var u = s[l], + d = a[u]; + n && Ee(d) ? C(d) ? e[u] = new Date(d.valueOf()) : k(d) ? e[u] = new RegExp(d) : d.nodeName ? e[u] = d.cloneNode(!0) : P(d) ? e[u] = d.clone() : (Ee(e[u]) || (e[u] = ke(d) ? [] : {}), g(e[u], [d], !0)) : e[u] = d + } + } + return m(e, r), e + } + + function be(e) { + return g(e, a.call(arguments, 1), !1) + } + + function b(e) { + return g(e, a.call(arguments, 1), !0) + } + + function _(e) { + return parseInt(e, 10) + } + fe = de.document.documentMode; + var S = Number.isNaN || function(e) { + return e != e + }; + + function ye(e, t) { + return be(Object.create(e), t) + } + + function _e() {} + + function $e(e) { + return e + } + + function D(e) { + return function() { + return e + } + } + + function $(e) { + return Te(e.toString) && e.toString !== ge + } + + function we(e) { + return void 0 === e + } + + function O(e) { + return void 0 !== e + } + + function Ee(e) { + return null !== e && "object" == typeof e + } + + function w(e) { + return null !== e && "object" == typeof e && !h(e) + } + + function Ce(e) { + return "string" == typeof e + } + + function E(e) { + return "number" == typeof e + } + + function C(e) { + return "[object Date]" === ge.call(e) + } + + function ke(e) { + return Array.isArray(e) || e instanceof Array + } + + function xe(e) { + switch (ge.call(e)) { + case "[object Error]": + case "[object Exception]": + case "[object DOMException]": + return !0; + default: + return e instanceof Error + } + } + + function Te(e) { + return "function" == typeof e + } + + function k(e) { + return "[object RegExp]" === ge.call(e) + } + + function x(e) { + return e && e.window === e + } + + function Me(e) { + return e && e.$evalAsync && e.$watch + } + + function Ae(e) { + return "boolean" == typeof e + } + + function T(e) { + return e && Te(e.then) + } + _e.$inject = [], $e.$inject = []; + var N = /^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array]$/; + var Se = function(e) { + return Ce(e) ? e.trim() : e + }, + I = function(e) { + return e.replace(/([-()[\]{}+?*.$^|,:#").append(e).html(); + try { + return e[0].nodeType === Ue ? me(t) : t.match(/^(<[^>]+>)/)[1].replace(/^<([\w-]+)/, function(e, t) { + return "<" + me(t) + }) + } catch (e) { + return me(t) + } + } + + function K(e) { + try { + return decodeURIComponent(e) + } catch (e) {} + } + + function Z(e) { + var i = {}; + return ve((e || "").split("&"), function(e) { + var t, n, r; + e && (n = e = e.replace(/\+/g, "%20"), -1 !== (t = e.indexOf("=")) && (n = e.substring(0, t), r = e.substring(t + 1)), O(n = K(n)) && (r = !O(r) || K(r), pe.call(i, n) ? ke(i[n]) ? i[n].push(r) : i[n] = [i[n], r] : i[n] = r)) + }), i + } + + function X(e) { + return Q(e, !0).replace(/%26/gi, "&").replace(/%3D/gi, "=").replace(/%2B/gi, "+") + } + + function Q(e, t) { + return encodeURIComponent(e).replace(/%40/gi, "@").replace(/%3A/gi, ":").replace(/%24/g, "$").replace(/%2C/gi, ",").replace(/%3B/gi, ";").replace(/%20/g, t ? "%20" : "+") + } + var J = ["ng-", "data-ng-", "ng:", "x-ng-"]; + var ee = function(n) { + var e = n.currentScript; + if (!e) return !0; + if (!(e instanceof de.HTMLScriptElement || e instanceof de.SVGScriptElement)) return !1; + var t = e.attributes; + return [t.getNamedItem("src"), t.getNamedItem("href"), t.getNamedItem("xlink:href")].every(function(e) { + if (!e) return !0; + if (!e.value) return !1; + var t = n.createElement("a"); + if (t.href = e.value, n.location.origin === t.origin) return !0; + switch (t.protocol) { + case "http:": + case "https:": + case "ftp:": + case "blob:": + case "file:": + case "data:": + return !0; + default: + return !1 + } + }) + }(de.document); + + function te(r, e) { + var i, o, t = {}; + if (ve(J, function(e) { + var t = e + "app"; + !i && r.hasAttribute && r.hasAttribute(t) && (o = (i = r).getAttribute(t)) + }), ve(J, function(e) { + var t, n = e + "app"; + !i && (t = r.querySelector("[" + n.replace(":", "\\:") + "]")) && (o = (i = t).getAttribute(n)) + }), i) { + if (!ee) return void de.console.error("AngularJS: disabling automatic bootstrap.