Creating a custom gadget using the Finesse JavaScript Library API

Similar documents
Finesse APIs: Getting started with the REST APIs and XMPP events

Programming with the Finesse API

NXOS in the Real World Using NX-API REST

2018 Cisco and/or its affiliates. All rights reserved. Cisco Public

Cisco Contact Center Express 10.0: Feature Design, Deployment, and Troubleshooting

Customising your Contact Centre with Finesse and CUIC Michael Green, Technical Solutions Manager CCBU

Your API Toolbelt Tools and techniques for testing, monitoring, and troubleshooting REST API requests

CloudCenter for Developers

DEVNET Introduction to Git. Ashley Roach Principal Engineer Evangelist

Cisco Spark Widgets Technical drill down

Cisco Spark Messaging APIs - Integration Platforms as a Service Real World Use-Cases

DevNet Workshop-Hands-on with CloudCenter and Jenkins

An Introduction to Developing for Cisco Kinetic

Spark SDK Video - Overview and Coding Demo

Magical Chatbots with Cisco Spark and IBM Watson

Cisco UCS Agentless Configuration Management Ansible or Microsoft DSC

Hands On Exploration of NETCONF and YANG

Cisco Finesse. The Next Generation Agent Experience. Ted Phipps Sr. Manager, CCBU Product Management

Get Hands On With DNA Center APIs for Managing Intent

Managing Cisco UCS with the Python SDK

Hands-On with IoT Standards & Protocols

NetDevOps Style Configuration Management for the Network

Automation with Meraki Provisioning API

BGP in the Enterprise for Fun and (fake) Profit: A Hands-On Lab

Privacy Requirements Scoping

DevOps CICD for VNF a NetOps Approach

Getting Started with OpenStack

Empower your testing with Cisco Test Automation Solution Featuring pyats & Genie

Git, Atom, virtualenv, oh my! Learn about dev tools to live by!

Introduction to OpenConfig

Cloud Mobility: Meraki Wireless & EMM

PnP Deep Dive Hands-on with APIC-EM and Prime Infrastructure

Tetration Hands-on Lab from Deployment to Operations Support

Cisco Enterprise Agreement

Deploying Cloud-Agnostic Applications with Cisco CloudCenter

Who wants to be a millionaire? A class in creating your own cryptocurrency

WORKSHOP: from Zero to a Network Application with #golang

Cisco Container Platform

Cisco Spark. Questions? Use Cisco Spark to communicate with the speaker after the session. How

An Introduction to Monitoring Encrypted Network Traffic with "Joy"

European DevNet Pros Panel

Automation and Programmability using Cisco Open NXOS and DevOps Tools

Ipswitch: The New way of Network Monitoring and how to provide managed services to its customers

Consuming Model-Driven Telemetry

Insights into your WLC with Wireless Streaming Telemetry

Hybrid Cloud Automation using Cisco CloudCenter API

Cisco WAN Automation Engine (WAE) Network Programmability with Segment Routing

For Live Data reports, you will only have the Html permalink. Html permalink for Live Data reports always require authentication.

Manage Workflows. Workflows and Workflow Actions

TRex Realistic Traffic Generator

Cisco VIRL. The Swiss-Army Knife of Network Simulators. Simon Knight, Software Engineer Brian Daugherty, Technical Leader.

Coding Getting Started with Python

Cisco UCS Director and ACI Advanced Deployment Lab

Simplifying Collaboration Deployments with Prime Collaboration

NSO in Brownfield: Fully Automated One-Click Reconciliation

Introducing Cisco Network Assurance Engine

Cisco SD-Access Hands-on Lab

Release Notes for Cisco Finesse Release 9.0(1)

Managing The Digital Network Workforce Transformation

Task Routing. Task Routing

BRKCOC-2399 Inside Cisco IT: Integrating Spark with existing large deployments

ICE / TURN / STUN Tutorial

Real time Location Services Overview and Use cases

Internet of Things Field Network Director

NetBrain Technologies: Achieving Agile Network Operations: How Automation Can Improve Visibility Across Hybrid Infrastructures

Serviceability of SD-WAN

Cisco Spark API Workshop

Cisco Finesse Desktop Interface

Cisco Finesse Release 10.5(1) ES2

Manage Reasons. Not Ready Reason Codes

You can configure different reason codes with the same reason code label across various teams.

PSOACI Tetration Overview. Mike Herbert

The Transformation of Media & Broadcast Video Production to a Professional Media Network

VXLAN EVPN Fabric and automation using Ansible

Enterprise Recording and Live Streaming Architecture with VBrick

Cisco Finesse Release 10.5(1) ES3

Migrating Applications with CloudCenter

Customer s journey into the private cloud with Cisco Enterprise Cloud Suite

PSOACI Why ACI: An overview and a customer (BBVA) perspective. Technology Officer DC EMEAR Cisco

October 15. Tips for. Google Drive. Tips to expand your sharing and collaboration capabilities. Training

Coding Intro to APIs and REST

Catalyst 9K High Availability Lab

Cisco Finesse Desktop Interface

Routing Underlay and NFV Automation with DNA Center

Features. Cisco Finesse

INTRODUCTION TO JAVASCRIPT

Kuber-what?! Learn about Kubernetes

Tour the latest Cisco Spark API features

Using Workload Automation to Optimize Hybrid Cloud Estates

Cisco SD-Access Building the Routed Underlay

Troubleshooting. Chat is down due to temporary outages

Stateless Multicast with Bit Indexed Explicit Replication

UCCE Solution Service Creation

Creating Content with iad JS

Chat-Related and -Related Tasks

igoogle: Sandbox for Libraries

Creating Extensions for Safari

Cloud-Ready WAN For IAAS & SaaS With Cisco s Next- Gen SD-WAN

08/10/2018. Istanbul Now Platform User Interface

Port Utilization in Finesse

Transcription:

Creating a custom gadget using the Finesse JavaScript Library API Denise Kwan, Software Engineer @ DevNet

Cisco Spark How Questions? Use Cisco Spark to communicate with the speaker after the session 1. Find this session in the Cisco Live Mobile App 2. Click Join the Discussion 3. Install Spark or go directly to the space 4. Enter messages/questions in the space cs.co/ciscolivebot#

Agenda Introduction to Finesse Introduction to Gadgets Hands-on Workshop

Cisco Finesse Revolutionizing the Contact Center Agent Experience Browser-based agent desktop for easy management & upgrades Empower agents via a personalized all-in-one application Integrate Finesse into existing applications (thick or thin) Integrate existing applications into the Finesse agent desktop Easy-to-use REST and JavaScript APIs for performing agent and supervisor actions programmatically 5

New in Finesse 11.6 Integrated System generated Not Ready Reason Codes Secondary CallId for transfers and conferences Alternate host for loading gadgets State and call history gadgets Direct Transfer Ability to make a call from READY state Ability to monitor Outbound calls on ACD line Reserve the FREE UCCX 11.6 sandboxes to try out these new features! 6

What is a gadget? Finesse gadgets are OpenSocial Gadget, which is an XML document that defines metadata for an OpenSocial Gadget container (Finesse desktop). Mini webpages within a gadget. It is highly cacheable so it does not need a high performance server. The gadget includes: XML to define metadata HTML for markup JavaScript for interactivity CSS for presentation Gadgets on the same container can communicate and pass data with one another as well as backend servers allowing for a seamless user experience. 7

What can you build with a gadget? Embed an existing webpage in an iframe. Integrate external REST APIs from applications such as the CRM. Custom functionality using the Finesse JavaScript API that is not available from the out of the box desktop. 8

What Skills do I need to build a Finesse Gadget? Finesse Gadgets are OpenSocial Gadgets, so you will need the following skills: HTML Basic JavaScript You can find these type of courses online for free at: Udacity Coursera Khan Academy Many more! 9

Finesse Developer Guide Documentation On DevNet s Finesse site: On your browser, go to the DevNet home page: http://developer.cisco.com Click on the Technologies tab Click on Collaboration on the left hand side and select Finesse under Contact Center Click on Docs on the upper right Select JavaScript Library under Guides 10

Understanding the Gadget Files SampleGadget.xml is the gadget specification that consists of three major parts: <?xml version="1.0" encoding="utf-8"?> <Module> <ModulePrefs title="mygadget"> <Require feature="pubsub-2" /> </ModulePrefs> <UserPrefs> </UserPrefs> <Content type="html"> <! [CDATA[ Your HTML & JavaScript HTML goes Here! ]]> </Content> </Module> ModulePrefs define the characteristics of the gadget, such as title, author, preferred sizing, etc. The PubSub feature allows communication between gadgets. In order to receive Finesse events, PubSub is required UserPrefs describes the user-specific settings for the gadget such as input fields Content consists of the gadget s customization and business logic, such as the programming logic and HTML elements that determine the appearance of the gadget SampleGadget.js is the gadget s JavaScript file for interactivity. SampleGadget.css is the gadget s styling for presentation. 11

Sample Gadgets Download an existing sample gadget from the DevNet Finesse page: https://developer.cisco.com/docs/finesse/#sample-gadgets Follow the instructions from the LearningSampleGadget https://github.com/ciscodevnet/finesse-samplecode/tree/master/learningsamplegadget 12

Hands-on Workshop

Finesse JavaScript Library Finesse JavaScript library is built on top of the Finesse REST APIs Finesse out of the box desktop utilizes the Finesse JavaScript library Starting 10.6(1), the Finesse JavaScript library is hosted on the Finesse server under /desktop/assets/js/finesse.js 14

Finesse APIs and notifications The Finesse JavaScript library has a utility, named ClientServices, that allows clients to make Finesse API requests and receive Finesse events. ClientServices establishes the shared the BOSH connection and simplifies the consumption of Finesse events. This utility can be used by adding a single line of code in your gadget file. 15

How do I use the ClientServices? In SampleGadget.js, update the init function to initialize the ClientServices: init : function () { var cfg = finesse.gadget.config; // Used to get the user's id clientlogs = finesse.cslogger.clientlogger; // Used for client logging states = finesse.restservices.user.states; // Used to set user state // Initiate the ClientLogs. The gadget id will be logged as a part of the message clientlogs.init(gadgets.hub, "SampleGadget"); // Initiate the ClientServices and load the user object. ClientServices are // initialized with a reference to the current configuration. finesse.clientservices.clientservices.init(cfg, false); // Create an instance of the User object // This will call a GET User API to populate the object }... 16

Getting the user s data User data such as agent name, extension, agent state can be accessed through the various methods in the User class The user object represents a single user. Function calls on this object will only operate against that particular user. Creating an instance of the User class with the logged in user s id calls the User GET API and returns a User object populated with the user s data. 17

How do I create a User object? In SampleGadget.js, update the init function to create an instance of the User: init : function () {... } // Initiate the ClientServices and load the user object. ClientServices are // initialized with a reference to the current configuration. finesse.clientservices.clientservices.init(cfg, false); // Create an instance of the User object // This will call a GET User API to populate the object user = new finesse.restservices.user({ id: cfg.id, onload : handleuserload, onchange : handleuserchange }); // Initiate the ContainerServices and add a handler for when the tab is visible... 18

How do I get the user s data? In SampleGadget.js, update the render function to call the getter methods from the user object: render = function() { // Examples of getting data from the User object. // This will not call the User GET, it displays the // latest data from the User object. var currentstate = user.getstate(); var agentname = user.getfirstname() + ' ' + user.getlastname(); $("#agentname").text(agentname); $("#userstate").text(currentstate);... }, 19

Changing agent state Changing user state is critical to contact center operations and can be done with a simple and single method call on the User object. The setstate method uses the ClientServices to call the Change Agent State (PUT) API. In order to maintain consistency and clean code, the Finesse JavaScript library provides a user states enum (finesse.restservices.user.states) that represents all the user states. 20

How do I change the user s state? In SampleGadget.js, update the setuserstate function to call the user change state with the appropriate parameter : /** * Sets the user state to the provided state */ setuserstate : function (state) { clientlogs.log("samplegadget.setuserstate(): The user's wants to change their state to: " + state); // Example of using the User - Change Agent State (PUT) method if (state === 'READY') { user.setstate(states.ready); } else if (state === 'NOT_READY') { user.setstate(states.not_ready); } }, 21

User s dialogs/calls In Finesse, calls are represented as a dialog with media type of Voice. A dialog object represents a conversation between two or more participants. A participant represents an internal or external user's CallConnection, or that user's leg of the call. Getting a list of the user s dialogs can be done by calling the user s getdialogs method. This method internally calls the GET list of dialogs REST API. When the ClientServices utilities receives a dialog event, it calls the callback handler that was added to the getdialogs method with the updated dialog data. 22

How do I get a list of the user s calls/dialogs? In SampleGadget.js, update the handleuserload function to get the list of dialogs for the user: /** * Handler for the onload of a User object. This occurs when the User object is initially read * from the Finesse server. Any once only initialization should be done within this function. */ handleuserload = function(userevent) { // Example of using the User Get List of Dialogs (GET) method // Get an instance of the dialogs collection and register handlers for when the user gets a // new dialog (add) and when a dialog is dropped (delete) dialogs = user.getdialogs( { oncollectionadd : handlenewdialog, oncollectiondelete : handleenddialog }); // Render the gadget render(); }, 23

Making a call The User object has a makecall method to make a call to an extension. This method internally calls the Create a New Dialog REST API. This is useful to incorporate a click to call feature to the gadget. 24

How do I make a call? In SampleGadget.js, update the makecall function to call the makecall method. This function calls the user PUT method: /** * Make a call to the provided number */ makecall : function (number) { clientlogs.log("makecall(): Making a call to " + number); // Example of using the Dialog - Create a New Dialog (Make Call) (POST) method user.makecall(number, { success: makecallsuccess, error: makecallerror }); // Hide the make call button after making the call $("#makecallbutton").hide(); }, 25

Using Call Data (Call Variables) Call data can hold important customer information such as customer name, phone number, account number, etc. This information can be used in many ways: Personalized customer service Account lookup against the CRM Scheduling a callback All of the call data can be accessed from the Dialog object via getters. 26

How do I get the dialog data (Call Variables)? In SampleGadget.js, update the displaycall method to change the text and onclick argument of the search buttons. displaycall = function(dialog) { var callvars = dialog.getmediaproperties(); // Example of getting data from the Dialog object (GET) $("#dnis").text(dialog.getmediaproperties().dnis); $("#calltype").text(dialog.getmediaproperties().calltype); $("#fromaddress").text(dialog.getfromaddress()); $("#toaddress").text(dialog.gettoaddress()); $("#callstate").text(dialog.getstate()); // Hide the make call button when the user is on a call $("#makecallbutton").hide(); // Example of using data from the dialog to do a web search $("#bing").attr("src","https://www.bing.com/search?q=" + callvars["callvariable3"]); }, 27

Tips and Tricks The only way to test the gadget is to upload it to the hosting webserver. Gadget caching is enabled on the Finesse Desktop. So, use?nocache while developing a gadget. Use an existing sample gadget as a base for your gadget. Look at the Finesse Developer guide for more details about the User, Dialog, Team objects. 28

How to Learn More About Finesse At Cisco Live! DevNet Workshop - Finesse APIs: Getting Started with the REST APIs and XMPP Wednesday, 1/30 @ 11:00 am Workshop 3 Thursday, 2/1 @ 1:00 pm Workshop 3 Finesse Learning Labs Finesse DevNet site: http://developer.cisco.com/site/finesse Finesse Community (fourm) Finesse Sample Gadgets REST API & JavaScript library Developer Guides Learning Labs Finesse Sandbox (PCCE & UCCX) 29

Cisco Spark How Questions? Use Cisco Spark to communicate with the speaker after the session 1. Find this session in the Cisco Live Mobile App 2. Click Join the Discussion 3. Install Spark or go directly to the space 4. Enter messages/questions in the space cs.co/ciscolivebot#

Please complete your Online Session Evaluations after each session Complete 4 Session Evaluations & the Overall Conference Evaluation (available from Thursday) to receive your Cisco Live T-shirt All surveys can be completed via the Cisco Live Mobile App or the Communication Stations Complete Your Online Session Evaluation Don t forget: Cisco Live sessions will be available for viewing on-demand after the event at www.ciscolive.com/global/on-demand-library/.

Continue Your Education Demos in the Cisco campus Walk-in Self-Paced Labs Tech Circle Meet the Engineer 1:1 meetings Related sessions 32

Thank you