CINXE.COM
API Reference | RingCentral Developers
<!DOCTYPE html> <!--[if IE 8]> <html class="lt-ie9"> <![endif]--> <!--[if IE 9]> <html class="ie9"> <![endif]--> <!--[if gt IE 9]><!--> <html> <!--<![endif]--> <head lang="en"> <script> try { document.cookie = 'OptanonAlertBoxClosed=;expires=Thu, 01 Jan 1970 00:00:00 GMT;domain=developers.ringcentral.com;path=/'; document.cookie = 'OptanonConsent=;expires=Thu, 01 Jan 1970 00:00:00 GMT;domain=developers.ringcentral.com;path=/'; } catch(e) { console.log(e); } </script> <!-- OneTrust Cookies Consent Notice start for ringcentral.com --> <script src="https://cdn.cookielaw.org/scripttemplates/otSDKStub.js" type="text/javascript" charset="UTF-8" data-domain-script="6ac561ff-e2a0-4962-abc5-fc5fab405159"></script> <script type="text/javascript"> function OptanonWrapper() { } </script> <!-- OneTrust Cookies Consent Notice end for ringcentral.com --> <base href="/api-reference"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="X-UA-COMPATIBLE" content="IE=edge"> <meta name="keywords" content=""> <meta name="description" content=""> <title>API Reference | RingCentral Developers</title> <link href="/assets/images/favicon.ico?v=20241114-0953" type="image/vnd.microsoft.icon" rel="shortcut icon"> <script type="text/javascript"> (function() { var didInit = false; function initMunchkin() { if(didInit === false) { didInit = true; Munchkin.init('075-DTB-715', { asyncOnly: true, disableClickDelay: true }); } } var s = document.createElement('script'); s.type = 'text/javascript'; s.async = true; s.src = '//munchkin.marketo.net/munchkin.js'; s.onreadystatechange = function() { if (this.readyState == 'complete' || this.readyState == 'loaded') { initMunchkin(); } }; s.onload = initMunchkin; document.getElementsByTagName('head')[0].appendChild(s); })(); </script> <link rel="stylesheet" type="text/css" href="/assets/css/main.css?v=20241114-0953"> <link rel="stylesheet" type="text/css" href="/assets/vendor/overlay-scrollbars/css/OverlayScrollbars.min.css?v=20241114-0953"> <script data-ot-ignore type="text/javascript" src="/assets/js/libs.js?v=20241114-0953"></script> <script data-ot-ignore type="text/javascript" src="/assets/js/main.js?v=20241114-0953"></script> <script data-ot-ignore="" src="/assets/js/onetrust.js?v=20241114-0953"></script> </head> <body> <noscript> <style> .index-use-cases { display: none; } </style> <div class="noscript"> <img src="/assets/images/alert-icon.png?v=20241114-0953" class="v-middle"> <span class="v-middle">RingCentral for Developers requires JavaScript to be enabled.</span> </div> </noscript> <script type="text/ng-template" id="dpw-popup.html"> <div class="popup-container"> <div class="popup-header" ng-if="showHeader!='false'"> <div class="popup-close-btn" ng-click="ctrl.close();" ng-show="showCloseBtn!='false'">×</div> <div ng-bind="title" class="popup-title"></div> </div> <div ng-transclude="" class="popup-main-section"> </div> </div> <div class="popup-background"></div> </script> <script type="text/ng-template" id="dpw-flipper.html"> <div class="flipper-container"> <div class="flipper" ng-class="{flipping: isFlipped === 'true'}"> <div ng-transclude=""> <!-- <div class="front"> </div> --> <!-- <div class="back"> </div> --> <!-- Height of .front and .back must be the same. --> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-sort-arrows.html"> <div class="dpw-sort-arrows" ng-class="{'dpw-sort-asc': dpwThSort===true, 'dpw-sort-desc': dpwThSort===false, 'dpw-sort-arrows-compact': ctrl.compact===true}"> <div class="dpw-sort-arrow dpw-sort-arrow-up" ng-click="ctrl.sort('asc')"></div> <div class="dpw-sort-arrow dpw-sort-arrow-down" ng-click="ctrl.sort('desc')"></div> </div> </script> <script type="text/ng-template" id="dpw-error-switch.html"> <div ng-class="{'error-switch-sorry-emoji': !errorMessage }" class="error-switch-message paragraph" ng-show="errorSwitchStatus === 'on'" ng-bind="errorMessage || defaultErrorMessage"></div> <div ng-hide="errorSwitchStatus === 'on'" ng-transclude=""></div> </script> <script type="text/ng-template" id="dpw-page-path.html"></script> <script type="text/ng-template" id="dpw-banner.html"> <div ng-if="bannerCtrl.bannerConfig" class="banner"> <div ng-class="bannerCtrl.bannerConfig.extraClass"> <div class="banner-bg"> <div class="banner-content"> <div class="banner-content-desc-container"> <h1 class="banner-content-hero-header" tabindex="0" ng-bind-html="bannerCtrl.pageTexts.heroHeader || bannerCtrl.heroHeaderDefaults"></h1> <div class="banner-content-hero-description" ng-if="bannerCtrl.bannerConfig.showHeroDescription" tabindex="0" ng-bind-html="bannerCtrl.pageTexts.heroDescription || bannerCtrl.heroDescriptionDefaults"></div> <div class="banner-content-extra-content"> <div class="dpw-banner-general-extra-content"> <dpw-free-sign-up-box ng-if="bannerCtrl.bannerConfig.withFreeSignUp" primary-text="bannerCtrl.pageTexts.heroCtaPrimaryText" secondary-text="bannerCtrl.pageTexts.heroCtaSecondaryText"> </dpw-free-sign-up-box> </div> </div> </div> <div class="banner-content-image"> <img ng-src="/assets/images/banners/{{ bannerCtrl.bannerConfig.image }}?v=20241114-0953" alt="{{bannerCtrl.pageTexts.heroHeader}}"> </div> </div> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-announcement-hint.html"> <a href="/support/announcements.html#/announcements" title="Announcements" class="announcement-hint blueText inline-block v-middle"> <i class="announcement-hint-icon icon-announcement inline-block v-middle"></i> <span ng-if="hint.unreadItemsCount > 0" class="announcement-hint-unread-badge" ng-bind="hint.unreadItemsCount"></span> </a> </script> <script type="text/ng-template" id="dpw-hMenus.html"> <div class="horizontal-menu" ng-class="{'x-hidden': menuItems.length == 0}"> <ul class="center-section"> <li ng-repeat="item in menuItems" class="horizontal-menu-item" ng-if="hMenusCtrl.isShowMenu(item)" ng-class="{'h-menu-selected': item.isSelected}" ng-mouseenter="hMenusCtrl.setExpanded(true, item)" ng-mouseleave="hMenusCtrl.setExpanded(false, item)"> <div ng-if="hMenusCtrl.isSep(item)" ng-bind="item" class="horizontal-menu-item-sep"></div> <a ng-if="!hMenusCtrl.isSep(item)" ng-click="hMenusCtrl.clickHandler(item, null, $event)" ng-bind="item.text" class="horizontal-menu-item-content horizontal-menu-item-link" ng-class="{'h-menu-has-sub-menu': item.items}" ng-attr-taid="{{item.href||item.path}}" ng-href="{{hMenusCtrl.getHref(item)}}"></a> <ul class="horizontal-sub-menu" ng-class="{'x-hidden': !item.isExpanded}" ng-if="item.items.length > 0"> <li ng-repeat="subItem in item.items" class="horizontal-sub-menu-item"> <a ng-click="hMenusCtrl.clickHandler(subItem, item, $event)" ng-bind="subItem.text" class="horizontal-sub-menu-item-content horizontal-menu-item-link" ng-class="{'h-menu-selected': subItem.isSelected}" ng-attr-taid="{{subItem.href||subItem.path}}" ng-href="{{hMenusCtrl.getHref(subItem)}}"></a> </li> </ul> </li> </ul> </div> </script> <script type="text/ng-template" id="dpw-pagination.html"> <div class="dpw-pagination" ng-show="paging.totalPages>1"> <span class="dpw-pagination-nav-item dpw-pagination-nav-item-first" ng-click="ctrl.first();" ng-class="{'dpw-pagination-nav-item-disabled':ctrl.isFirst()}"><< </span> <span class="dpw-pagination-nav-item dpw-pagination-nav-item-prev" ng-click="ctrl.prev();" ng-class="{'dpw-pagination-nav-item-disabled':ctrl.isFirst()}"> < </span> <span class="dpw-pagination-current-page"> <span>Page </span> <span ng-bind="paging.page" class="dpw-pagination-current-page-num"></span> <span> of </span> <span ng-bind="paging.totalPages" class="dpw-pagination-total-page-num"></span> </span> <span class="dpw-pagination-nav-item dpw-pagination-nav-item-next" ng-click="ctrl.next();" ng-class="{'dpw-pagination-nav-item-disabled':ctrl.isLast()}"> > </span> <span class="dpw-pagination-nav-item dpw-pagination-nav-last" ng-click="ctrl.last();" ng-class="{'dpw-pagination-nav-item-disabled':ctrl.isLast()}"> >></span> </div> </script> <script type="text/ng-template" id="dpw-checkbox.html"> <input type="checkbox" name="{{name}}" ng-model="model" ng-attr-id="{{forId}}" ng-disabled="isDisabled" ng-required="required"> <label ng-attr-for="{{forId}}" ng-bind-html="text || ' '" ng-click="ctrl.onClick($event)"></label> </script> <script type="text/ng-template" id="dpw-radio.html"> <input type="radio" ng-model="model" ng-attr-id="{{forId}}" ng-disabled="isDisabled" ng-change="change()" name="{{name}}" ng-value="value" ng-required="required" ng-class="{'dpwta-radio-checked': model === value, 'dpwta-radio-disabled': isDisabled }"> <label ng-attr-for="{{forId}}" ng-bind-html="text || ' '"></label> </script> <script type="text/ng-template" id="dpw-alert-box.html"> <div class="dpw-alert-box"> <div class="dpw-alert-box-icon"></div> <div ng-click="ctrl.close()" class="dpw-alert-box-close-btn">×</div> <div ng-transclude="" class="dpw-alert-box-content"></div> </div> </script> <script type="text/ng-template" id="dpw-drop-down-list.html"> <div class="dpw-drop-down-list" ng-class="{'dpw-drop-down-list-disabled': isDisabled==='true'}"> <span ng-bind="{{labelPattern}}" class="dpw-drop-down-list-text dpw-add-title noWrap"></span> <span ng-bind="labelRight" class="dpw-drop-down-list-text-right"></span> <select ng-options="{{optionPattern}}" class="dpw-drop-down-list-select" ng-model="model" ng-attr-name="{{name}}" ng-disabled="isDisabled==='true'"></select> </div> </script> <script type="text/ng-template" id="dpw-pagination-simple.html"> <div class="pagination-simple"> <a class="pagination-simple-older" ng-if="pagination.hasOld" ng-click="pagination.old()">« Older posts </a> <a class="pagination-simple-newer" ng-if="pagination.hasNew" ng-click="pagination.new()">Newer posts » </a> </div> </script> <script type="text/ng-template" id="dpw-chosen.html"> <div class="dpw-chosen" ng-class="{'dpw-chosen-disabled': isDisabled==='true'}"> <select class="x-hidden" ng-disabled="isDisabled==='true'" tabindex="0" name="{{chosenName}}" ng-required="required" ng-model="model" multiple ng-options="item.id as item.name for item in optionsSource"></select> </div> </script> <script type="text/ng-template" id="dpw-appKey-secret.html"> <div class="appkey-secret"> <span ng-bind="key.secret" ng-show="key.isMasked===false" class="appkey-secret-text ellipsis"></span> <a ng-click="ctrl.click()" ng-if="key.isMasked!==false">Click to see</a> </div> </script> <script type="text/ng-template" id="dpw-first-login-agreement.html"> <div class="first-time-login-agreement"> <div class="logo"></div> <div class="title"> Welcome to the Developer Console </div> <div class="description"> Here, developers can register, manage and monitor applications and integrations. Before you get started, we require everyone to accept our Developer terms of service. </div> <div class="agreement"> <div dpw-checkbox="" model="ctrl.agreementMark" for-id="first-login-agreement" text="I read the RingCentral API License" change="ctrl.onMarkChange()" class="agreement-checkbox"></div> <a href="https://www.ringcentral.com/legal/apilitos.html" target="_blank" class="agreement-link">agreement</a> </div> <div class="terms-and-conditions" ng-if="ctrl.brandTNCEnabled()"> <div dpw-checkbox="" model="ctrl.termsAndConditionsMark" for-id="first-login-tnc" text="I read {{ ctrl.termsAndConditionsText }}" change="ctrl.onMarkChange()" class="agreement-checkbox"></div> </div> <div class="button-area"> <div class="button got-it-button" ng-class="{'button-disabled': !ctrl.agreed}" ng-click="ctrl.agree()"><span>Got it</span> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-back-to-top.html"> <div class="back-to-top" ng-show="$ctrl.visible"> <a href="#" ng-click="$ctrl.top($event)" class="back-to-top-link">Back to top</a> </div> </script> <script id="dpw-slider.html" type="text/ng-template"> <div class="slider-wrapper"> <a class="right arrow slider-icon" ng-show="currentPageIndex < totalPages - 1" ng-click="switchToNextPage()"></a> <a class="left arrow slider-icon" ng-hide="currentPageIndex === 0" ng-click="switchToPreviousPage()"></a> <div class="slider"> <div class="slider-scroller" ng-transclude=""> </div> </div> </div> </script> <script id="dpw-carousel.html" type="text/ng-template"> <div class="dpw-carousel"> <div class="dpw-carousel-scroller" ng-style="styles.scroller"> <div ng-repeat="src in resources track by $index" class="dpw-carousel-slide table-layout left" ng-style="styles.slide"> <div class="table-layout-cell" ng-switch="srcType(src)"> <div ng-switch-when="video" dpw-youtube="" youtube-width="676" youtube-height="380" ng-style="styles.resource" youtube-url="{{src}}"> </div> <img ng-switch-when="file" ngf-src="src.file" ng-style="styles.resource" src="/assets/images/loader_gray.gif?v=20241114-0953" alt=""> <img ng-switch-default="" ng-src="{{src}}?v=20241114-0953" ng-style="styles.resource" src="/assets/images/loader_gray.gif?v=20241114-0953" alt=""> </div> </div> </div> <div class="dpw-carousel-indicator-wrapper" ng-hide="hideIndicators"> <div class="dpw-carousel-indicator" ng-style="styles.indicator"> <div class="dpw-carousel-indicator-dotty"></div> <div class="dpw-carousel-indicator-dot" ng-repeat="img in resources track by $index" ng-click="goToPage($index)"> </div> </div> </div> </div> </script> <script id="dpw-collapsible-box.html" type="text/ng-template"> <div class="dpw-collapsible-box" ng-class="{'dpw-collapsible-box-collapsed': ctrl.isCollapsed}"> <!--<div ng-click="ctrl.isCollapsed = !ctrl.isCollapsed"--> <!--class="dpw-collapsible-box-button">--> <!--<div class="dpw-collapsible-box-button-icon"></div>--> <!--</div>--> <div class="dpw-collapsible-box-title"> <span ng-click="ctrl.isCollapsed = !ctrl.isCollapsed" class="pointer"> <span class="dpw-collapsible-box-title-text v-middle" ng-bind="ctrl.title"></span> <span class="dpw-collapsible-box-see-more v-middle" ng-class="{'dpw-collapsible-box-see-more-collapsed': ctrl.isCollapsed}"></span> </span> </div> <div class="dpw-collapsible-box-content" ng-transclude=""></div> </div> </script> <script id="dpw-collapsible-section.html" type="text/ng-template"> <div class="collapsible-section hidden-overflow"> <div class="section-title collapsible-section-container"> <span ng-bind="ctrl.titleText"></span> <div class="collapsible-section-link" ng-click="ctrl.clickHandler()"> <a class="collapsible-section-link-text"> <span ng-bind="'Show '" ng-if="ctrl.isCollapsed"></span> <span ng-bind="'Hide '" ng-if="!ctrl.isCollapsed"></span> <span ng-bind="ctrl.linkText"></span> </a> <div class="collapsible-section-link-arrow" ng-class="{'collapsible-section-is-collapsed': ctrl.isCollapsed}"></div> </div> </div> <div class="separator" ng-if="ctrl.isCollapsed"></div> </div> </script> <script type="text/ng-template" id="dpw-popup-utils.html"> <div class="dpw-popup-common console-ui"> <div class="simple-popup"> <div class="simple-popup-title" ng-bind="settings.title" data-test-automation-id="popup-title"></div> <div class="simple-popup-text" ng-bind-html="settings.content" data-test-automation-id="popup-content"></div> <div class="simple-popup-button-area"> <div class="button simple-popup-button-area-btn" data-test-automation-id="popup-button-{{btn.label}}" ng-repeat="btn in settings.buttons track by $index" ng-class="btn.style" ng-click="btn.onClick($event)"> <span ng-bind="btn.label"></span> </div> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-copy-popup.html"> <div class="dpw-copy-popup-container"> <div class="dpw-copy-popup-desc" ng-bind="ctrl.desc"></div> <div class="dpw-copy-popup-text-container"> <input id="dpw-copy-popup-text" readonly ng-model="ctrl.text" class="fieldInputText"> </div> </div> </script> <script type="text/ng-template" id="dpw-tooltip-info.html"> <div class="dpw-tooltip-info" role="tooltip" tabindex="0" ng-mouseenter="ctrl.displayContent()" ng-mouseleave="ctrl.hideContent()" ng-class="[ctrl.large && 'dpw-tooltip-info-large', ctrl.extraClass]" aria-label="{{ctrl.content}}"> <div class="dpw-tooltip-info-control" ng-class="ctrl.isShowContent && 'dpw-tooltip-info-control-on'"> <span class="dpw-tooltip-info-icon icon-i-info"></span> </div> <div class="dpw-tooltip-info-content-container" ng-show="ctrl.isShowContent" data-test-automation-id="dpw-tooltip-info-content"> <div class="dpw-tooltip-info-content" tabindex="0" ng-transclude=""></div> </div> </div> </script> <script type="text/ng-template" id="dpw-tooltip-entry.html"> <div class="tooltip-entry inline-block" ng-class="{ 'tooltip-entry-hover': ctrl.isTriggeredByHover, 'dpw-tooltip-auto-width': ctrl.autoWidth, 'dpw-tooltip-entry-large': ctrl.large }"> <div class="tooltip-entry-control" data-test-automation-id="tooltip-entry-control" ng-class="ctrl.showMessage && 'tooltip-entry-control-on'" ng-mouseleave="ctrl.mouseleave()" ng-mouseenter="ctrl.hoverEntry()" ng-click="ctrl.clickEntry()" ng-transclude=""></div> <div class="tooltip-entry-box-container" data-test-automation-id="tooltip-entry-box-container"> <div class="tooltip-box" ng-show="ctrl.showMessage" ng-mouseenter="ctrl.mouseenter()" ng-mouseleave="ctrl.mouseleave()"> <div class="tooltip-box-close-btn" ng-click="ctrl.showMessage=false">×</div> <div class="tooltip-box-content" ng-bind="ctrl.message" ng-class="{'noWrap': ctrl.noWrap}"></div> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-tooltip-box.html"> <div class="dpw-tooltip-box" ng-show="ctrl.isShowTooltip"> <div class="dpw-tooltip-box-indicator"></div> <div class="dpw-tooltip-box-container"> <div class="tooltip-box"> <div class="tooltip-box-close-btn" ng-click="ctrl.isShowTooltip=false">×</div> <div class="tooltip-box-content" ng-bind="ctrl.text"></div> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-switcher.html"> <div class="dpw-switcher" ng-class="[ctrl.style, ctrl.extraClass]"> <div class="dpw-switcher-item" ng-repeat="item in ctrl.items" ng-class="{'dpw-switcher-active': item.active, 'dpw-switcher-disabled': item.disabled}"> <a href="#" ng-href="{{item.href || '#' }}" ng-click="item.onClick($event)">{{ item.label }}</a> </div> </div> </script> <script type="text/ng-template" id="dpw-alert.html"> <div class="dpw-alert dpw-alert-{{$ctrl.level}}" ng-if="$ctrl.couldDisplay" ng-class="$ctrl.extraClass"> <div class="dpw-alert-body"> <button type="button" class="dpw-alert-close" ng-if="$ctrl.dismissible" ng-click="$ctrl.dismiss()"> <span>×</span> </button> <div ng-transclude=""></div> </div> </div> </script> <script type="text/ng-template" id="dpw-list-group.html"> <dl class="dpw-list-group" ng-class="['dpw-list-group-highlight-' + $ctrl.highlight, $ctrl.extraClass]"> <dt class="dpw-list-group-header" ng-if="$ctrl.header" data-test-automation-id="dpw-list-group-header"> {{ $ctrl.header }} </dt> <dd class="dpw-list-group-item" ng-repeat="item in $ctrl.items track by $index" data-test-automation-id="dpw-list-group-item" ng-class="[ item.active ? 'dpw-list-group-item-active' : '', item.iconTail ? 'dpw-list-group-item-has-tail-icon' : '', item.extraClass ? item.extraClass : '' ]"> <a class="dpw-list-group-item-link" ng-href="{{item.href}}" ng-if="item.href"> <i class="dpw-list-group-item-icon v-middle {{item.icon}}" ng-if="item.icon"></i> <span class="dpw-list-group-item-label v-middle">{{ item.label }}</span> <span ng-if="item.iconTail" class="dpw-list-group-item-icon-tail"> <span ng-switch="!!item.iconTail.tooltip"> <span ng-switch-when="true"> <span dpw-tooltip-entry="" message="item.iconTail.tooltip" trigger="hover"> <i class="inline-block icon-icon_triangle_exclamation"></i> </span> </span> <i ng-switch-when="false" class="inline-block icon-icon_triangle_exclamation"></i> </span> </span> </a> <span class="dpw-list-group-item-plain" ng-if="!item.href"> <i class="dpw-list-group-item-icon v-middle {{item.icon}}" ng-if="item.icon"></i> <span class="dpw-list-group-item-label v-middle">{{ item.label }}</span> </span> </dd> </dl> </script> <script id="dpw-keep-me-informed.html" type="text/ng-template"> <div class="subscribe-form"> <form dpw-jq-validate="" rule="subscribe"> <div class="inputTextContainer inline-block"> <input id="email" name="email" type="text" class="fieldInputText subscribe-form-email" maxlength="80" dpw-place-holder="" placeholder="Email" ng-model="email"> </div> <div class="button fieldSubmit subscribe-form-submit-button" ng-click="ctrl.submit()">Submit</div> </form> </div> </script> <script id="dpw-keep-me-informed-index.html" type="text/ng-template"> <div class="index-keep-me-informed"> <div class="index-keep-in-touch-title">Keep in touch</div> <div class="layout-2-cols"> <div class="index-keep-in-touch-section"> If you’re not ready to work with our RingCentral Connect Platform just yet but you’d like to receive regular updates from us, send us your email address. We’ll keep you informed. </div> <div class="subscribe-form"> <form dpw-jq-validate="" rule="subscribe"> <div class="inputTextContainer inline-block"> <input id="email" name="email" type="text" maxlength="80" class="fieldInputText index-subscribe-form-email" dpw-place-holder="" placeholder="Email" ng-model="email"> </div> <div class="button-orange inline-block fieldSubmit subscribe-form-submit-button" ng-click="ctrl.submit()">Keep me informed </div> </form> </div> </div> </div> </script> <script id="dpw-try-and-service-buttons.html" type="text/ng-template"> <div class="try-and-service-buttons" ng-if="$ctrl.isVisible" dpw-floating-element="" position="bottom" priority="10"> <a class="try-and-service-buttons-tryForFree button-orange" href="/sign-up" ng-bind="$root.siteWideTexts.footerSignUpCta"></a> <a class="try-and-service-buttons-plan button" href="https://www.ringcentral.com/office/plansandpricing.html" target="_blank" ng-bind="$root.siteWideTexts.footerPricingCta"></a> </div> </script> <script type="text/ng-template" id="login-form.html"> <div class="login-sections-wrapper hidden-overflow"> <div class="login-rc-form-section"> <form dpw-jq-validate="" submit-on-enter="" rule="login" class="loginForm"> <div class="login-section-title login-rc-form-title"> Already have a RingCentral or Partner Account? <dpw-tooltip-info>Partner accounts include AT&T Office@Hand</dpw-tooltip-info> </div> <div class="login-rc-form-row"> <div dpw-drop-down-list="" model="loginCtrl.country" name="brand" options-source="loginCtrl.countryList" label-pattern="model.name" item-type="object" option-pattern="item.name for item in optionsSource"></div> </div> <div class="login-rc-form-row login-rc-form-phone"> <div class="inputTextContainer"> <input class="login-rc-form-input" placeholder="Phone Number" dpw-place-holder="" ng-model="loginCtrl.userInfo.user" type="text" name="user" maxlength="100"> </div> <div class="inputTextContainer login-rc-form-extension"> <input class="login-rc-form-input login-rc-form-extension-input" dpw-place-holder="" placeholder="Extension (optional)" ng-model="loginCtrl.userInfo.extension" type="text" name="extension"> </div> </div> <div class="login-rc-form-row"> <div class="inputTextContainer"> <input class="login-rc-form-input" dpw-place-holder="" placeholder="Password" ng-model="loginCtrl.userInfo.password" type="password" name="password"> </div> </div> <div class="login-rc-form-row login-rc-form-password-actions"> <span class="login-rc-form-remember-me" dpw-checkbox="" text="Remember me" for-id="rememberMe" model="loginCtrl.userInfo.rememberMe"></span> <a class="login-rc-form-forget-password" ng-href="{{loginCtrl.forgetPasswordUrl}}">Forgot password?</a> </div> <div class="login-rc-form-submit-button button-orange fieldSubmit" ng-click="loginCtrl.submit()">Sign In </div> <div class="login-rc-form-sso-link" dpw-sso-login="" sso-entry-point="signup" sso-url-api-path="sso.getSsoUrl">Single Sign-On </div> <div class="login-rc-form-sso-link" dpw-three-leg-login="" ng-if="false" sso-entry-point="signup"> Three Legged Login </div> </form> </div> <div class="login-guest-section"> <div class="login-section-title">Need an Account?</div> <p class="login-guest-paragraph"> The RingCentral for Developers program is currently included for {{loginCtrl.RCProductName}} Ultimate and {{loginCtrl.RCProductName}} Premium customers. Free developer accounts are available for ISV and VAR developers. </p> <div> <a href="/sign-up" class="button button-middle login-guest-free-sign-up-button"> <span>Free Sign Up</span> </a> </div> <a target="_blank" ng-href="{{loginCtrl.plansAndPricingUrl}}" class="login-guest-link">Become a Customer</a> <a target="_blank" href="https://www.ringcentral.com/partner/isvreseller.html" class="login-guest-link">Join the Partner Program</a> </div> </div> </script> <script type="text/ng-template" id="dpw-sticker.html"> <div class="dpw-sticker" ng-class="classes"> <div class="dpw-sticker-content center-section" ng-transclude=""></div> </div> </script> <script type="text/ng-template" id="dpw-youtube.html"> <iframe width="{{ youtubeCtrl.width || 560 }}" height="{{ youtubeCtrl.height || 315 }}" ng-src="{{youtubeCtrl.url | trustAsResourceUrl}}" frameborder="0" allowfullscreen></iframe> </script> <script type="text/ng-template" id="dpw-sso-login.html"> <span ng-click="ssoCtrl.login($event)" ng-transclude=""></span> </script> <script type="text/ng-template" id="dpw-three-leg-login.html"> <span ng-click="threeLegCtrl.login()" ng-transclude=""></span> </script> <script type="text/ng-template" id="application-reports-context.html"> <div class="application-reports-context right"> <div ng-repeat="status in ctrl.appStatusList" class="application-reports-context-item" data-test-automation-id="application-reports-env" ng-class="{'current': !status.disabled && ctrl.isCurrentContext(status.id), 'disabled': status.disabled}"> <button ng-bind="status.id" ng-click="ctrl.switchContext(status)"></button> </div> </div> </script> <script type="text/ng-template" id="application-reports-main.html"> <div class="application-query-summary"> <div class="application-query-summary-duration"> Duration: <br ng-if="ctrl.isSummaryMultiline()"> <span class="application-query-summary-from"> <span class="application-query-summary-from-date bold"></span> <span class="application-query-summary-from-time"></span> </span> - <span class="application-query-summary-to"> <span class="application-query-summary-to-date bold"></span> <span class="application-query-summary-to-time"></span> </span> <span class="application-query-summary-timezone-indication">(UTC)</span> <dpw-tooltip-info extra-class="application-query-summary-duration-tooltip" content-width="300" data-test-automation-id="analytics-report-duration-tooltip" ng-if="ctrl.showSummaryDurationTooltip()"> Daily aggregation does not include the current hour. </dpw-tooltip-info> </div> <div class="application-query-summary-data"></div> </div> <div class="application-reports-result"> <div class="legend-wrap"></div> <div class="application-reports-chart"></div> </div> <div class="application-reports-message"></div> </script> <script type="text/ng-template" id="reports-custom-legend.html"> <div class="reports-custom-legend"> <div class="reports-custom-legend-item" title="{{item.message}}" ng-repeat="item in legendItems" ng-click="ctrl.onClickHandler(item)"> <div ng-include="'reports-custom-legend-item-content.html'"></div> </div> </div> </script> <script type="text/ng-template" id="reports-custom-legend-item-content.html"> <i class="reports-custom-legend-item-circle" ng-style="{'border-color': item.color, 'background': item.checked ? item.color : 'none'}"></i> <span ng-bind="item.label"></span> </script> <script type="text/ng-template" id="reports-stack-legend.html"> <div class="reports-stack-legend" ng-style="{'margin-left': ctrl.additionalMarginValue}"> <div class="reports-stack-legend-item" ng-repeat="item in ctrl.legendTypes" data-checked="{{item.checked}}" ng-click="ctrl.onClickHandler(item.id)"> <i ng-class="item.iconClass"></i> </div> </div> </script> <script type="text/ng-template" id="application-reports.html"> <div class="application-reports"> <div class="application-reports-context-list" ng-include="'application-reports-context.html'"></div> <div class="query-types application-reports-tab dpw-switcher-tabCard"> <div ng-repeat="type in ctrl.queryTypes" data-test-automation-id="app-reports-query-type-tab" class="dpw-switcher-item" ng-class="{'dpw-switcher-active': type.selected}"> <a ng-click="ctrl.query($event, 'type', type.id)"> {{type.label}} </a> </div> </div> <div class="application-reports-retrieve right"> <span class="application-reports-retrieve-last-updated"> Last updated: <span class="application-reports-retrieve-date"></span> </span> <dpw-tooltip-info content-width="210" class="application-reports-retrieve-tooltip" data-test-automation-id="app-reports-update-date-retrieve-tooltip"> The data is updated every {{ctrl.getDataUpdateTooltip()}}. </dpw-tooltip-info> <button class="application-reports-retrieve-btn" ng-click="ctrl.retrieve()"> <i class="icon-btn_refresh application-reports-retrieve-icon"></i> </button> </div> <div class="query-durations application-reports-tab dpw-switcher-tabLine"> <div ng-repeat="duration in ctrl.queryDurations" data-test-automation-id="app-reports-duration-tab" class="dpw-switcher-item" ng-class="{'dpw-switcher-active': duration.selected}"> <a ng-click="ctrl.query($event, 'duration', duration.id)" ng-class="{'disabled': ctrl.isDurationDisabled(duration.id)}"> {{duration.label}} </a> </div> </div> <div ng-include="'application-reports-main.html'"></div> </div> </script> <script type="text/ng-template" id="dpw-app-dashboard-reports.html"> <div class="panel"> <div class="panel-heading"> <div class="dpw-app-dashboard-reports-context-list" ng-include="'application-reports-context.html'"></div> <div class="panel-title">Analytics - API Calls</div> </div> <div class="panel-body dpw-app-dashboard-reports"> <div ng-include="'application-reports-main.html'"></div> </div> </div> <dpw-loading visible="ctrl.showReportLoading"></dpw-loading> </script> <script type="text/ng-template" id="dpw-swagger-ui-api-selector.html"> <div class="api-explorer-version-selector"> <div class="api-docs-version dpw-drop-down-list"> <span class="dpw-drop-down-list-text" ng-bind="apiSelectorCtrl.currentLevel.label"></span> <select class="dpw-drop-down-list-select" ng-model="apiSelectorCtrl.currentLevel" ng-change="apiSelectorCtrl.switchApi()" ng-options="level.label for level in apiSelectorCtrl.accessLevels"></select> </div> </div> </script> <script type="text/ng-template" id="dpw-swagger-ui-api-authorizer.html"> <div class="api-explorer-authorizer"> <div ng-if="apiAuthorizeCtrl.isLogin" class="dpw-display-fields"> <div class="dpw-display-field"> <div class="dpw-display-field-label">Environment*</div> <div class="dpw-display-field-data"> <span dpw-radio="" for-id="{{apiAuthorizeCtrl.sandboxId}}" model="apiAuthorizeCtrl.environment" name="{{apiAuthorizeCtrl.envName}}" change="apiAuthorizeCtrl.changeEnv('sandbox')" value="'sandbox'" text="Sandbox"> </span> <span dpw-radio="" for-id="{{apiAuthorizeCtrl.prodId}}" ng-if="apiAuthorizeCtrl.prodVisible" model="apiAuthorizeCtrl.environment" name="{{apiAuthorizeCtrl.envName}}" change="apiAuthorizeCtrl.changeEnv('production')" value="'production'" text="Production"> </span> </div> </div> <div class="dpw-display-field"> <div class="dpw-display-field-label">Application*</div> <div class="dpw-display-field-data api-explorer-authorizer-chosen v-middle" dpw-chosen="" is-single="" model="apiAuthorizeCtrl.selectedApp" options-source="apiAuthorizeCtrl.applications" chosen-options="{width: '220px',placeholder_text_single:'Select an app'}"></div> <button ng-if="!apiAuthorizeCtrl.isPopup" ng-click="apiAuthorizeCtrl.authorize($event)" class="api-explorer-authorizer-button v-middle" ng-class="{'button-disabled':!apiAuthorizeCtrl.selectedApp}">Authorize </button> </div> </div> <div class="popup-container-panel-body-footer clearfix" ng-if="apiAuthorizeCtrl.isPopup"> <div class="right"> <button ng-click="apiAuthorizeCtrl.authorize($event)" ng-class="{'button-disabled':!apiAuthorizeCtrl.selectedApp}" class="api-explorer-authorizer-button v-middle">Authorize </button> </div> </div> <div class="api-explorer-authorizer-msg" ng-if="!apiAuthorizeCtrl.isLogin"> <a href="/login" class="button button-orange api-explorer-authorizer-login" target="_self">Login</a> before trying any API </div> </div> </script> <script type="text/ng-template" id="dpw-swagger-ui-api-authorizer-popup.html"> <div class="api-explorer-authorizer-popup"> <div class="popup-container-panel"> <div class="popup-container-panel-header"> <div class="right font-size-0"> <span class="v-middle"></span> <span class="popup-container-panel-close-btn " ng-click="ctrl.close()">×</span> </div> <div>Select ENV & App</div> </div> <div class="api-explorer-authorizer-popup-banner ng-hide" ng-show="ctrl.isProd"> You're using API explorer under production environment! </div> <div class="popup-container-panel-body" dpw-swagger-ui-api-authorizer="" sandbox-id="ctrl.sandboxId" prod-id="ctrl.prodboxId" env-name="ctrl.envName" is-popup="true"> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-swagger-ui-api-authorize-success-popup.html"> <div class="api-explorer-authorizer-popup"> <div class="popup-container-panel"> <div class="popup-container-panel-header"> <div class="right font-size-0"> <span class="v-middle"></span> <span class="popup-container-panel-close-btn " ng-click="ctrl.close()">×</span> </div> <div>Congratulations!</div> </div> <div class="popup-container-panel-body"> <div class="api-explorer-authorizer"> <div class="api-authorizer-popup-msg"> You have been authorized successfully! You can now make API calls. </div> <div class="popup-container-panel-body-footer clearfix"> <div class="right"> <button ng-click="ctrl.close()" class="api-explorer-authorizer-button v-middle">OK </button> </div> </div> </div> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-multiple-redirect-uris.html"> <div class="dpw-multiple-redirect-uris-input-field" ng-repeat="item in ctrl.redirectUris track by $index"> <div class="dpw-multiple-redirect-uris-input-box"> <div class="inputTextContainer"> <input type="text" name="redirectUri-{{$index}}" class="fieldInputText" spellcheck="false" autocomplete="off" ng-model="ctrl.redirectUris[$index].uri" ng-readonly="ctrl.isReadonly(item) || ctrl.isDisabled === 'true'" placeholder="For example, https://mycompany.com/" dpw-place-holder="" ng-class="{'warning': ctrl.showWarning(item)}"> <i class="icon-icon-exclamation" ng-if="ctrl.showWarning(item)"></i> </div> <div class="dpw-multiple-redirect-uris-remove-redirect-uri-btn user-select-none" ng-click="ctrl.removeRedirectUri($index)" ng-if="ctrl.isDisabled !== 'true' && ctrl.redirectUris.length > 1">× </div> </div> <div class="dpw-multiple-redirect-uris-error-message" ng-hide="ctrl.isReadonly(item) || ctrl.isDisabled === 'true'"> <div ng-if="ctrl.isDuplicated(item)" ng-bind="ctrl.errorMessageConfig.SHOULD_NOT_BE_DUPLICATED"></div> <div ng-if="ctrl.isInvalid(item) && !ctrl.isDuplicated(item)" ng-bind="ctrl.errorMessageConfig.SHOULD_NOT_CONTAIN_WILDCARD"></div> <div ng-if="ctrl.isInsecure(item) && !ctrl.isInvalid(item) && !ctrl.isDuplicated(item)"> {{ctrl.errorMessageConfig.HTTP_PROTOCOL_NOT_ALLOWED}} {{ctrl.canUseLocalhostUris() ? ctrl.errorMessageConfig.HTTP_PROTOCOL_ALLOWED_EXCEPTION : ''}} </div> <div ng-if="ctrl.hasUnusableLocalhostUri(item) && !ctrl.isInsecure(item) && !ctrl.isInvalid(item) && !ctrl.isDuplicated(item)" ng-bind="ctrl.errorMessageConfig.LOCALHOST_NOT_ALLOWED_FOR_BOT_APP_AND_MNA"> </div> <div ng-if="!ctrl.isOrgAllowUrl(item, ctrl.application) && !ctrl.hasUnusableLocalhostUri(item) && !ctrl.isInsecure(item) && !ctrl.isInvalid(item) && !ctrl.isDuplicated(item)">The URL is invalid </div> </div> </div> <div class="dpw-multiple-redirect-uris-required-error-message" ng-if="!ctrl.isRestApiAppRedirectUrisValid(ctrl.redirectUris,ctrl.application)" ng-bind="ctrl.errorMessageConfig.REQUIRED"> </div> <div class="dpw-multiple-redirect-uris-add-more-btn user-select-none" data-test-automation-id="add-redirect-uri-button" ng-click="ctrl.addRedirectUri()" ng-hide="ctrl.shouldHideAddMore()" ng-class="{'disabled': ctrl.isUnavailableToAdd()}"><i class="icon-icon_circle_plus"></i>Add more </div> </script> <script type="text/ng-template" id="dpw-app-status-history-list.html"> <div class="dpw-app-status-history-list"> <div class="dpw-app-status-history-item" ng-repeat="appState in appStates track by $index"> <div> <div class="dpw-app-status-history-item-description"> <span ng-bind="appState.creationTime | date : 'yyyy/M/d, hh:mm a'"></span>  <span ng-bind="ctrl.getUserName(appState)" class="bold"></span>  <span ng-if="appState.isCreateApp">created app</span> <span ng-if="!appState.isCreateApp"> changed status to  <span ng-bind="appState.statusDisplayName" class="bold" ng-class="ctrl.getColorClassByAppStatus(appState.status)"></span> </span> </div> </div> <div ng-if="!appState.isCreateApp && appState.comment"> <div class="dpw-app-status-history-item-comment" ng-bind="appState.comment"></div> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-dev-app-status-history.html"> <div class="dpw-app-status-history"> <div ng-include="'dpw-app-status-history-list.html'"></div> <div class="right" dpw-pagination="" paging="paging"></div> </div> </script> <script type="text/ng-template" id="dpw-admin-app-status-history.html"> <div class="dpw-app-status-history dpw-app-status-history-popup-container"> <div class="dpw-app-status-history-title popup-title">Graduation history of {{applicationName}}</div> <div ng-include="'dpw-app-status-history-list.html'"></div> <div class="separator" ng-if="paging.totalPages > 1"></div> <div class="right" dpw-pagination="" paging="paging"></div> </div> </script> <script type="text/ng-template" id="dpw-app-gallery-tile.html"> <a class="relative app-gallery-tile" dpw-add-space-all="" add-space-except-ie8="" ng-href="{{ctrl.getLink()}}" ng-click="ctrl.click($event)" ng-mouseenter="ctrl.onMouseEnter()" ng-mouseleave="ctrl.onMouseLeave()"> <div class="table-layout app-gallery-tile-surface app-gallery-tile-front-surface"> <div class="table-layout-row"> <div class="app-gallery-title preWrap break-word" dpw-multiple-line-ellipsis="" ng-bind="ctrl.app.appGalleryName"></div> <div class="app-gallery-tile-front-publisher noWrap" dpw-add-title=""> By <span ng-bind="ctrl.app.publisher"></span> </div> </div> <div class="table-layout-row app-gallery-logo"> <div class="table-layout-cell"> <img ng-src="{{ctrl.appLogo.url}}?v=20241114-0953" class="app-gallery-logo-img" ng-if="ctrl.isValidLogoUrl()"> <img ngf-src="ctrl.appLogo.file" class="app-gallery-logo-img" ng-if="ctrl.appLogo.file"> <div class="app-gallery-logo-img app-gallery-logo-img-placeholder app-gallery-image-placeholder" ng-if="ctrl.isLogoEmpty()"></div> </div> </div> </div> <div ng-show="ctrl.isActive" class="table-layout app-gallery-tile-surface app-gallery-tile-back-surface ng-hide"> <div class="table-layout-row"> <div class="table-layout-cell"> <div class="app-gallery-title preWrap break-word" dpw-multiple-line-ellipsis="" ng-bind="ctrl.app.appGalleryName"></div> <div class="app-gallery-tile-back-publisher noWrap" dpw-add-title=""> By <span ng-bind="ctrl.app.publisher"></span> </div> </div> </div> <div class="table-layout-row"> <div class="table-layout-cell app-gallery-back-des"> <div dpw-add-title="" class="app-gallery-back-des-text" ng-bind="ctrl.app.shortDes"></div> </div> </div> </div> </a> </script> <script type="text/ng-template" id="dpw-app-profile-status-desc-not-published.html"> <p>Provide the app profile on this page and submit to publish, so that people can find your app in RingCentral App Gallery. Before you submit for review, please make sure your app profile follows the descriptions provided in the tooltips below. For approved examples, please view our <dpw-app-gallery-link display-name="App Gallery" brand-id="profileCtrl.brandId" ng-if="profileCtrl.brandId"> </dpw-app-gallery-link> . </p> </script> <script type="text/ng-template" id="dpw-app-profile-status-desc-in-review.html"> <p>Your request to publish your app in <dpw-app-gallery-link brand-id="profileCtrl.brandId"></dpw-app-gallery-link> is under review. The review process might take 3 - 5 days. If you want to make any change to the app profile, please cancel the request first. </p> </script> <script type="text/ng-template" id="dpw-app-profile-status-desc-declined.html"> <p>Your request to publish your app in <dpw-app-gallery-link brand-id="profileCtrl.brandId"> </dpw-app-gallery-link> is declined. Please update the app profile according to the comments from Admin before you resubmit the request. </p> </script> <script type="text/ng-template" id="dpw-app-profile-status-desc-approved-published.html"> <div class="app-profile-info-overview-publish-status"> <dpw-protected-feature is-accessible="profileCtrl.canManipulateApp"> <div class="v-middle inline-block app-profile-info-overview-publish-status-switcher" dpw-on-off-switcher="" switcher-model="profileCtrl.isOnAppGallery" on-switch-on="profileCtrl.publish2Gallery" on-switch-off="profileCtrl.cancelPublish" is-disabled="!profileCtrl.canManipulateApp"></div> </dpw-protected-feature> <span class="v-middle app-profile-info-overview-publish-status-text">Published</span> </div> <p>Your request to publish your app is approved. You can make your app visible/invisible in <dpw-app-gallery-link brand-id="profileCtrl.brandId"></dpw-app-gallery-link> by switching the button ON/OFF. </p> <p>If you want to make any changes to the app profile, please <a href="mailto:devsupport@ringcentral.com">contact support</a>.</p> <p>If you decide to no longer publish your app in <dpw-app-gallery-link brand-id="profileCtrl.brandId"></dpw-app-gallery-link> , you can unpublish the app. </p> </script> <script type="text/ng-template" id="dpw-app-profile-history.html"> <div class="dpw-app-profile-history"> <div class="app-profile-history-item" ng-repeat="item in ctrl.history2Display"> <div class="app-profile-history-overview"> <span class="v-middle" ng-bind="item.eventTime | date : 'yyyy/M/d hh:mm a'"></span>  <span class="v-middle app-profile-history-highlight" ng-bind="ctrl.getUserName(item)"></span>  <span class="v-middle">changed status to</span>  <span class="v-middle app-profile-history-highlight" ng-bind="item.status | appProfileStatusDisplayName : false" ng-class="ctrl.getColorClassByProfileStatus(item.status)"></span> <span class="v-middle" ng-if="ctrl.isRecordForRevision(item)"> (Revision)</span> <span class="v-middle app-profile-history-toggle-comment-btn" ng-hide="ctrl.isForcedExpanded" ng-class="{'icon-btn_sort_up': item.expanded, 'icon-btn_sort_down': !item.expanded}" ng-click="ctrl.toggleComment(item)"></span> </div> <div class="app-profile-history-comment" ng-show="item.comment && item.expanded"> <span ng-bind="item.comment" class="preWrap"></span> </div> </div> <div class="app-profile-history-no-record-hint" ng-if="ctrl.noHistoryRecord"> No history </div> </div> <div class="dpw-app-profile-history-pagination" dpw-pagination="" paging="ctrl.paging" ng-if="!ctrl.isLastFromAdmin"></div> </script> <script type="text/ng-template" id="dpw-app-profile-history-see-all.html"> <div class="dpw-app-profile-history-see-all popup-container-panel"> <div class="popup-container-panel-header"> <div class="right font-size-0"> <span class="popup-container-panel-close-btn" ng-click="ctrl.close()">×</span> </div> <div>All Histories</div> </div> <div class="popup-container-panel-body hidden-overflow"> <div ng-if="ctrl.appProfileId && ctrl.organizationId" class="app-profile-history-see-all-history-list" dpw-app-profile-history="" app-profile-id="ctrl.appProfileId" is-revision="ctrl.isRevision" is-forced-expanded="true" organization-id="ctrl.organizationId"></div> <div class="app-profile-history-no-record-hint" ng-if="!ctrl.appProfileId"> No history </div> <div class="right button button-orange app-profile-history-see-all-close-btn" ng-click="ctrl.close()"> <span>OK</span></div> </div> </div> </script> <script type="text/ng-template" id="dpw-app-profile-action-message-submit-to-publish.html"> <p>By submitting to publish this app, you certify that you have the right to distribute all information and images.</p> <span class="icon-i-info-h left app-profile-action-popup-icon default-margin-right"></span> <p class="hidden-overflow">Please note that <strong>you will not be able to modify the app profile</strong> after you submit to publish. Please make sure you have provided all the information properly. If you want to modify app profile, you must cancel the request first.</p> <p>The review process might take 3 - 5 days.</p> </script> <script type="text/ng-template" id="dpw-app-profile-action-message-cancel-request.html"> <p>This app is being reviewed. Are you sure you want to cancel the publish request?</p> </script> <script type="text/ng-template" id="dpw-app-profile-action-message-submit-for-review.html"> <p>By submitting to publish this app, you certify that you have the right to distribute all information and images.</p> <span class="icon-i-info-h left app-profile-action-popup-icon default-margin-right"></span> <p class="hidden-overflow">Please note that <strong>you will not be able to modify the app profile</strong> after you submit for review. Please make sure you have provided all the information properly. If you want to modify app profile, you must cancel the request first.</p> <p>The review process might take 3 - 5 days.</p> </script> <script type="text/ng-template" id="dpw-app-profile-action-message-take-down.html"> <p class="simple-popup-sub-title">Are you sure you want to unpublish the app?</p> <p>By unpublishing this app, the app will be changed to "Draft" and will be removed from <dpw-app-gallery-link brand-id="ctrl.brandId"></dpw-app-gallery-link>. To publish the app again, you will need to go through the review process again. </p> </script> <script type="text/ng-template" id="dpw-app-profile-action-popup.html"> <div class="simple-popup dpw-app-profile-action-popup"> <div class="simple-popup-title" ng-bind="ctrl.title"></div> <div class="simple-popup-sub-title align-left app-profile-action-popup-sub-title" ng-if="ctrl.isDirtyFormDetected"> This will save the changes you just made and <span ng-bind="ctrl.actionDisplayName"></span>. Do you want to continue? </div> <div class="simple-popup-text align-left no-margin-bottom app-profile-action-popup-content" ng-include="ctrl.templateId"></div> <div class="simple-popup-button-area"> <div ng-repeat="btn in ctrl.buttons" class="simple-popup-button-area-btn button app-profile-action-popup-button" ng-class="[btn.extraClass, btn.isDisabled() && 'button-disabled']" ng-click="!btn.isDisabled() && btn.onClick()"><span ng-bind="btn.text"></span></div> </div> </div> </script> <script type="text/ng-template" id="dpw-app-profile-submission-checklist-popup.html"> <dpw-app-profile-submission-checklist selectable="true" on-update="ctrl.onSubmissionChecklistUpdate(isAllChecked)"></dpw-app-profile-submission-checklist> </script> <script type="text/ng-template" id="app-gallery-app-setting-info.html"> <ng-form class="panel" name="appInfoForm"> <div class="panel-heading"> <div class="right app-profile-form-status"> <span class="app-profile-form-complete" ng-show="appInfoForm.$valid">Completed</span> <span class="app-profile-form-incomplete" ng-show="appInfoForm.$invalid">Not Completed</span> </div> <span class="panel-title">App Info</span> </div> <table class="panel-body dpw-display-fields-2-cols"> <tr> <td class="dpw-display-field-2-cols"> <div class="dpw-display-field-cell-label">Application Name <dpw-tooltip-info> The display name for your application as you wish it to be displayed on the App Gallery page. </dpw-tooltip-info> </div> <div class="dpw-display-field-cell-data"> <div ng-show="!ctrl.isDisabled()"> <input type="text" class="fieldInputText" name="appGalleryName" ng-model="ctrl.appProfile.appGalleryName" required maxlength="80"> <div class="app-profile-form-error-message" ng-if="ctrl.isFieldInvalid('appInfoForm', 'appGalleryName', 'required')">This field is mandatory </div> <div class="app-profile-form-error-message" ng-if="ctrl.isFieldInvalid('appInfoForm', 'appGalleryName', 'alreadyTaken')">The application name is already taken </div> <div class="app-profile-form-error-message" ng-if="ctrl.isFieldInvalid('appInfoForm', 'appGalleryName', 'containsComma')"> The application name should not contain comma </div> </div> <div class="preWrap break-word" ng-show="ctrl.isDisabled()" ng-bind="ctrl.appProfile.appGalleryName"></div> </div> </td> <td class="dpw-display-field-2-cols"> <div class="dpw-display-field-cell-label"> Get App URL <dpw-tooltip-info>The URL for your application or integration.</dpw-tooltip-info> </div> <div class="dpw-display-field-cell-data"> <div ng-show="!ctrl.isDisabled()"> <div class="app-profile-form-app-source-options" ng-if="ctrl.isAppSourceOptionsVisible"> <div class="app-profile-form-option" ng-repeat="option in ctrl.appSourceOptions"> <dpw-radio name="appSource" for-id="{{option.value}}" text="{{option.text}}" model="ctrl.appSource" value="option.value" is-disabled="ctrl.isDisabled()" change="option.change()"></dpw-radio> </div> </div> <div ng-hide="ctrl.isAppSourceOptionsVisible && ctrl.appUrlDisabled"> <input type="text" class="fieldInputText" name="appUrl" ng-model="ctrl.appProfile.appUrl" required ng-pattern="ctrl.urlPattern"> <div class="app-profile-form-error-message" ng-if="ctrl.isFieldInvalid('appInfoForm', 'appUrl', 'required')">This field is mandatory </div> <div class="app-profile-form-error-message" ng-if="ctrl.isFieldInvalid('appInfoForm', 'appUrl', 'pattern')">The URL is invalid </div> </div> </div> <div ng-show="ctrl.isDisabled()" ng-switch="ctrl.isAppSourceOptionsVisible && ctrl.appSource === ctrl.appSourceOptions[1].value"> <span ng-switch-when="true" ng-bind="ctrl.appSourceOptions[1].text"></span> <span ng-switch-when="false" class="preWrap break-word" ng-bind-html="ctrl.appProfile.appUrl | linky:'_blank'"></span> </div> </div> </td> </tr> <tr> <td class="dpw-display-field-2-cols"> <div class="dpw-display-field-cell-label">Publisher <dpw-tooltip-info> The name of your organization that you wish to be displayed on the App Gallery page. </dpw-tooltip-info> </div> <div class="dpw-display-field-cell-data"> <div ng-show="!ctrl.isDisabled()"> <input type="text" class="fieldInputText" name="publisher" ng-model="ctrl.appProfile.publisher" required maxlength="80"> <div class="app-profile-form-error-message" ng-if="ctrl.isFieldInvalid('appInfoForm', 'publisher', 'required')">This field is mandatory </div> </div> <div class="preWrap break-word" ng-show="ctrl.isDisabled()" ng-bind="ctrl.appProfile.publisher"></div> </div> </td> <td class="dpw-display-field-2-cols"> <div class="dpw-display-field-cell-label">Publisher Website <dpw-tooltip-info>The URL for your organization website.</dpw-tooltip-info> </div> <div class="dpw-display-field-cell-data"> <div ng-show="!ctrl.isDisabled()"> <input type="text" class="fieldInputText" name="publisherLink" ng-model="ctrl.appProfile.publisherLink" required ng-pattern="ctrl.urlPattern"> <div class="app-profile-form-error-message" ng-if="ctrl.isFieldInvalid('appInfoForm', 'publisherLink', 'required')">This field is mandatory </div> <div class="app-profile-form-error-message" ng-if="ctrl.isFieldInvalid('appInfoForm', 'publisherLink', 'pattern')">The URL is invalid </div> </div> <div class="preWrap break-word" ng-show="ctrl.isDisabled()" ng-bind-html="ctrl.appProfile.publisherLink | linky:'_blank'"></div> </div> </td> </tr> <tr> <td class="dpw-display-field-2-cols"> <div class="dpw-display-field-cell-label">Supported by <dpw-tooltip-info> The name of your organization for support that you wish to be displayed on the App Gallery page. </dpw-tooltip-info> </div> <div class="dpw-display-field-cell-data"> <div ng-show="!ctrl.isDisabled()"> <input type="text" class="fieldInputText" name="supporter" ng-model="ctrl.appProfile.supporter" required maxlength="80"> <div class="app-profile-form-error-message" ng-if="ctrl.isFieldInvalid('appInfoForm', 'supporter', 'required')">This field is mandatory </div> </div> <div class="preWrap break-word" ng-show="ctrl.isDisabled()" ng-bind="ctrl.appProfile.supporter"></div> </div> </td> <td class="dpw-display-field-2-cols"> <div class="dpw-display-field-cell-label">Supported by Website <dpw-tooltip-info>The URL for your support website or webpage.</dpw-tooltip-info> </div> <div class="dpw-display-field-cell-data"> <div ng-show="!ctrl.isDisabled()"> <input type="text" class="fieldInputText" name="supporterLink" ng-model="ctrl.appProfile.supporterLink" required ng-pattern="ctrl.urlPattern"> <div class="app-profile-form-error-message" ng-if="ctrl.isFieldInvalid('appInfoForm', 'supporterLink', 'required')">This field is mandatory </div> <div class="app-profile-form-error-message" ng-if="ctrl.isFieldInvalid('appInfoForm', 'supporterLink', 'pattern')">The URL is invalid </div> </div> <div class="preWrap break-word" ng-show="ctrl.isDisabled()" ng-bind-html="ctrl.appProfile.supporterLink | linky:'_blank'"></div> </div> </td> </tr> <tr> <td class="dpw-display-field-1-col" colspan="2"> <div class="dpw-display-field-cell-label">Short Description <dpw-tooltip-info> This description is used in the App Gallery listing tile. Max length 140, plain text </dpw-tooltip-info> </div> <div class="dpw-display-field-cell-data"> <div ng-show="!ctrl.isDisabled()"> <textarea cols="4" rows="4" name="shortDes" ng-model="ctrl.appProfile.shortDes" required maxlength="140"></textarea> <div class="app-profile-form-error-message" ng-if="ctrl.isFieldInvalid('appInfoForm', 'shortDes', 'required')">This field is mandatory </div> </div> <div class="preWrap break-word" ng-show="ctrl.isDisabled()" ng-bind="ctrl.appProfile.shortDes"></div> </div> </td> </tr> <tr> <td class="dpw-display-field-1-col" colspan="2"> <div class="dpw-display-field-cell-label">Long Description <dpw-tooltip-info> This is the description used for the main application profile page on the App Gallery. The max length is 5,000 characters and formatting is supported via the editor below. Highlight the words you wish to edit and click to engage the editor toolbar. </dpw-tooltip-info> </div> <div class="dpw-display-field-cell-data"> <div ng-show="!ctrl.isDisabled()"> <div class="app-profile-form-text-format-selection" ng-if="false"> <div dpw-radio="" name="detailedDesFormat" model="ctrl.textFormatSettings.detailedDes" value="ctrl.textFormatUtils.formatConfig.plainText.id" text="{{ctrl.textFormatUtils.formatConfig.plainText.name}}" for-id="app-profile-form-detailed-des-format-plain-text" class="inline-block"></div> <div dpw-radio="" name="detailedDesFormat" model="ctrl.textFormatSettings.detailedDes" value="ctrl.textFormatUtils.formatConfig.markdown.id" text="{{ctrl.textFormatUtils.formatConfig.markdown.name}}" for-id="app-profile-form-detailed-des-format-markdown" class="inline-block default-margin-left"></div> </div> <textarea cols="4" rows="4" name="detailedDes" ng-if="false" ng-model="ctrl.appProfile.detailedDes" required maxlength="5000"></textarea> <div dpw-editor="" class="emptyText dpw-editor-content" name="detailedDes" ng-model="ctrl.appProfile.detailedDes" required maxlength="5000"></div> <div class="app-profile-form-error-message" ng-if="ctrl.isFieldInvalid('appInfoForm', 'detailedDes', 'required')">This field is mandatory </div> </div> <div class="dpw-editor-content" ng-show="ctrl.isDisabled()" ng-bind-html="ctrl.appProfile.detailedDes | linkyOrMd"></div> </div> </td> </tr> <tr> <td class="dpw-display-field-1-col" colspan="2"> <div class="dpw-display-field-cell-label">System Requirement <dpw-tooltip-info> System Requirements description. Highlight the words you wish to edit and click to engage the editor toolbar. Use bullets for individual requirements. </dpw-tooltip-info> </div> <div class="dpw-display-field-cell-data"> <div ng-show="!ctrl.isDisabled()"> <div class="app-profile-form-text-format-selection" ng-if="false"> <div dpw-radio="" name="requirementsFormat" model="ctrl.textFormatSettings.requirements" value="ctrl.textFormatUtils.formatConfig.plainText.id" text="{{ctrl.textFormatUtils.formatConfig.plainText.name}}" for-id="app-profile-form-requirements-format-plain-text" class="inline-block"></div> <div dpw-radio="" name="requirementsFormat" model="ctrl.textFormatSettings.requirements" value="ctrl.textFormatUtils.formatConfig.markdown.id" text="{{ctrl.textFormatUtils.formatConfig.markdown.name}}" for-id="app-profile-form-requirements-format-markdown" class="inline-block default-margin-left"></div> </div> <textarea cols="4" rows="4" name="requirements" ng-if="false" ng-model="ctrl.appProfile.requirements" required maxlength="5000"></textarea> <div dpw-editor="" class="emptyText dpw-editor-content" name="requirements" ng-model="ctrl.appProfile.requirements" required maxlength="5000"></div> <div class="app-profile-form-error-message" ng-if="ctrl.isFieldInvalid('appInfoForm', 'requirements', 'required')">This field is mandatory </div> </div> <div class="dpw-editor-content" ng-show="ctrl.isDisabled()" ng-bind-html="ctrl.appProfile.requirements | linkyOrMd"></div> </div> </td> </tr> <tr> <td class="dpw-display-field-1-col" colspan="2"> <div class="dpw-display-field-cell-label">App Type <dpw-tooltip-info> Type of your app or integration. Select all appropriate choices. </dpw-tooltip-info> </div> <div class="dpw-display-field-cell-data"> <div class="app-profile-form-option" ng-repeat="appType in ctrl.appProfile.appType"> <dpw-checkbox name="appType" for-id="{{appType.id}}" text="{{appType.label}}" model="appType.checked" value="{{apptype.value}}" required="!ctrl.doesAppTypeSelected()" is-disabled="ctrl.isDisabled()"> </dpw-checkbox> </div> <div class="app-profile-form-error-message" ng-if="ctrl.isFieldInvalid('appInfoForm', 'appType', 'required')"> This field is mandatory </div> </div> </td> </tr> <tr> <td class="dpw-display-field-1-col" colspan="2"> <div class="dpw-display-field-cell-label">App Category <dpw-tooltip-info> Select category of app. This allows for easier app discovery. Can select a max of 3 Category </dpw-tooltip-info> </div> <div class="dpw-display-field-cell-data"> <div class="app-profile-form-option"> <div dpw-chosen="" chosen-name="appCategory" model="ctrl.appProfile.appCategory" options-source="ctrl.APP_CATEGORIES" chosen-options="{width: '500px', max_selected_options: 3}" required="!ctrl.doesAppCategorySelected()" is-disabled="{{ctrl.isDisabled()}}"></div> </div> <div class="app-profile-form-error-message" ng-if="ctrl.isFieldInvalid('appInfoForm', 'appCategory', 'required')"> This field is mandatory </div> </div> </td> </tr> <tr ng-if="ctrl.isPublishDateOptionsVisible"> <td class="dpw-display-field-1-col" colspan="2"> <div class="dpw-display-field-cell-label">Publish Date <dpw-tooltip-info> The publish date is the date when you publish the app in App Gallery. You can choose to publish it once approved or specify a future date. </dpw-tooltip-info> </div> <div class="dpw-display-field-cell-data app-profile-form-publish-date"> <div class="app-profile-form-option" ng-repeat="option in ctrl.publishDateOptions"> <dpw-radio name="publishDate" for-id="{{option.value}}" text="{{option.text}}" model="ctrl.publishDate" value="option.value" is-disabled="ctrl.isDisabled()" change="option.change()"> </dpw-radio> </div> <div class="app-profile-form-option" ng-if="ctrl.isPublishDatePickerActive"> <input type="text" dpw-date-picker="" placeholder="Select Date.." name="publishDateCustomValue" class="fieldInputText" required="ctrl.isPublishDatePickerActive" picker-options="{ dateFormat: 'Y-m-d', minDate: 'today' }" ng-model="ctrl.publishDateCustomValue"> </div> <div class="app-profile-form-option app-profile-form-error-message" ng-if="appInfoForm.$submitted && ctrl.isPublishDatePickerActive && appInfoForm.publishDateCustomValue.$error.required"> This field is mandatory </div> </div> </td> </tr> </table> </ng-form> </script> <script type="text/ng-template" id="app-gallery-app-setting-video.html"> <ng-form class="panel" name="appVideoForm"> <div class="panel-heading"> <span class="panel-title">App Video <dpw-tooltip-info>One YouTube URL</dpw-tooltip-info></span> </div> <table class="panel-body dpw-display-fields-2-cols"> <tr> <td class="dpw-display-field-1-col"> <div class="dpw-display-field-cell-label">YouTube URL (optional)</div> <div class="dpw-display-field-cell-data"> <div ng-show="!ctrl.isDisabled()"> <input type="text" class="fieldInputText" name="videoUrl" ng-model="ctrl.appProfile.videoUrl" ng-pattern="ctrl.videoUrlPattern"> <div class="app-profile-form-error-message" ng-if="ctrl.isFieldInvalid('appVideoForm', 'videoUrl', 'pattern')">The Video URL is invalid</div> </div> <div class="preWrap break-word" ng-show="ctrl.isDisabled()" ng-bind-html="ctrl.appProfile.videoUrl | linky:'_blank'"></div> </div> </td> </tr> </table> </ng-form> </script> <script type="text/ng-template" id="app-gallery-app-setting-logo.html"> <ng-form name="appLogoForm"> <div class="panel app-gallery-app-setting-logo"> <div class="panel-heading"> <div class="right app-profile-form-status"> <span class="app-profile-form-complete" ng-show="appLogoForm.$valid">Completed</span> <span class="app-profile-form-incomplete" ng-show="appLogoForm.$invalid">Not Completed</span> </div> <span class="panel-title">App Logo<dpw-tooltip-info content-width="410"> A PNG, JPG or GIF format image - 2MB </dpw-tooltip-info></span> </div> <div class="panel-body clearfix"> <div class="app-profile-preview-tile right"> <p>Preview on website:</p> <dpw-app-gallery-tile app="ctrl.appProfile" app-logo="ctrl.logoUtil.getLogo()" on-click="ctrl.onTileClick()"> </dpw-app-gallery-tile> </div> <div class="app-profile-upload-logos"> <div class="button button-with-border-blue app-gallery-app-setting-logo-btn app-gallery-app-setting-btn v-middle" type="file" ngf-select="ctrl.logoUtil.choose($file)" ng-disabled="ctrl.isDisabled()" accept="{{ctrl.validImageMimeTypes}}" ng-class="{'button-disabled': ctrl.isDisabled()}"> <span ng-switch="appLogoForm.$invalid"> <span ng-switch-when="true">Upload</span> <span ng-switch-when="false">Change</span> </span> </div> <div class="app-gallery-app-setting-upload-recommendation v-middle" ng-class="{'red app-profile-form-error-message': !ctrl.isDraftMode && appLogoForm.$invalid}"> Please upload one 200 x 120 pixels logo </div> <div class="app-gallery-app-setting-logo-items"> <div ng-repeat="preview in ctrl.logoUtil.getLogoPreviewsConfig()" class="app-gallery-app-setting-logo-item inline-block"> <div class="app-gallery-app-setting-logo-item-size"> <span ng-bind="preview.width"></span> x <span ng-bind="preview.height"></span> <span>pixels</span> </div> <div class="app-gallery-app-setting-logo-item-img-container" ng-class="{'app-gallery-image-placeholder':ctrl.logoUtil.isLogoEmpty()}" ng-style="{width:preview.width, height: preview.height}"> <img class="app-gallery-app-setting-logo-item-img" ng-src="{{ctrl.logoUtil.getLogo().url}}?v=20241114-0953" ng-style="{'max-width': preview.width, 'max-height': preview.height}" ng-if="ctrl.logoUtil.isValidLogoUrl()"> <img class="app-gallery-app-setting-logo-item-img" ng-style="{'max-width': preview.width, 'max-height': preview.height}" ngf-src="ctrl.logoUtil.getLogo().file" ng-if="ctrl.logoUtil.getLogo().file"> </div> </div> </div> </div> </div> </div> </ng-form> </script> <script type="text/ng-template" id="app-gallery-app-setting-screen-shots.html"> <ng-form name="appScreenshotForm"> <div class="panel app-gallery-app-setting-screen-shots"> <div class="panel-heading"> <div class="right app-profile-form-status"> <span class="app-profile-form-complete" ng-show="appScreenshotForm.$valid">Completed</span> <span class="app-profile-form-incomplete" ng-show="appScreenshotForm.$invalid">Not Completed</span> </div> <span class="panel-title">App Screenshots<dpw-tooltip-info content-width="410"> Up to 10 images in PNG, JPG or GIF format with a max. size of 2MB each </dpw-tooltip-info></span> </div> <div class="panel-body"> <div class="button button-with-border-blue app-gallery-app-setting-btn v-middle" type="file" ngf-select="ctrl.screenshotsUtil.choose($files)" multiple accept="{{ctrl.validImageMimeTypes}}" ng-disabled="ctrl.isDisabled() || ctrl.screenshotsUtil.isExceed()" ng-class="{'button-disabled': ctrl.isDisabled() || ctrl.screenshotsUtil.isExceed()}"> <span>Upload Screenshots</span></div> <div class="app-gallery-app-setting-upload-recommendation v-middle"> Best at 760 x 380 pixels <span class="red default-margin-left app-profile-form-error-message" ng-if="!ctrl.isDraftMode && appScreenshotForm.$invalid"> Please upload at least one screenshot </span> </div> <div class="app-gallery-app-setting-screen-shot-items"> <ul dnd-list="ctrl.screenshotsUtil.screenshotsIndexes" ng-class="{'app-gallery-app-setting-screen-shot-items-2-rows': ctrl.screenshotsUtil.getScreenshots().length > 4}" dnd-disable-if="ctrl.isDisabled()" dnd-drop="ctrl.screenshotsUtil.onScreenShotDrop(item)" dnd-horizontal-list="true"> <li ng-repeat="screenshotIndex in ctrl.screenshotsUtil.screenshotsIndexes" dnd-draggable="{index: screenshotIndex}" dnd-moved="ctrl.screenshotsUtil.onScreenshotMoved(screenshotIndex)" dnd-disable-if="ctrl.isDisabled()" class="app-gallery-app-setting-screen-shots-item"> <div class="app-gallery-app-setting-screen-shot-img-container"> <img ng-src="{{ctrl.screenshotsUtil.getScreenshot(screenshotIndex).url}}?v=20241114-0953" ng-if="!ctrl.screenshotsUtil.getScreenshot(screenshotIndex).file" class="app-gallery-app-setting-screen-shot-img pointer" ng-click="ctrl.screenshotsUtil.preview($index)"> <img class="app-gallery-app-setting-screen-shot-img pointer" ngf-src="ctrl.screenshotsUtil.getScreenshot(screenshotIndex).file" ng-if="ctrl.screenshotsUtil.getScreenshot(screenshotIndex).file" ng-click="ctrl.screenshotsUtil.preview($index)"> <div class="app-gallery-app-setting-screen-shot-actions-panel" ng-if="!ctrl.isDisabled()"> <div type="file" accept="{{ctrl.validImageMimeTypes}}" ngf-select="ctrl.screenshotsUtil.change(ctrl.screenshotsUtil.getScreenshot(screenshotIndex), $file)"> Change </div> <div ng-click="ctrl.screenshotsUtil.remove(ctrl.screenshotsUtil.getScreenshot(screenshotIndex))"> Remove </div> </div> </div> </li> </ul> </div> </div> </div> </ng-form> </script> <script type="text/ng-template" id="dpw-save-status.html"> <div class="dpw-save-status" ng-if="ctrl.isSaved">Saved!</div> </script> <script type="text/ng-template" id="dpw-on-off-switcher.html"> <div class="dpw-on-off-switcher" ng-click="ctrl.onClickHandler()" ng-switch="ctrl.switcherModel" ng-class="{'disabled': ctrl.isDisabled}"> <div ng-switch-when="true" class="dpw-on-off-switcher-switched-on icon-switch_on"></div> <div ng-switch-when="false" class="dpw-on-off-switcher-switched-off icon-switch_off"></div> </div> </script> <script type="text/ng-template" id="dpw-dirty-form-confirm.html"> <div class="dpw-dirty-form-confirm simple-popup"> <div class="simple-popup-text"> <div>You haven't saved your changes.</div> <div>Are you sure you want to leave this page?</div> </div> <div class="simple-popup-button-area"> <div class="button button-with-border simple-popup-button-area-btn" ng-click="ctrl.yes()">Leave this page </div> <div class="button button-orange simple-popup-button-area-btn" ng-click="ctrl.no()">Stay on this page</div> </div> </div> </script> <script type="text/ng-template" id="dpw-app-gallery-link.html"> <a ng-href="{{$ctrl.appGalleryLink}}" ng-bind="$ctrl.appGalleryDisplayName" target="{{$ctrl.target}}"></a></script> <script type="text/ng-template" id="dpw-parameters-grid.html"> <table class="dpw-simple-grid dpw-simple-grid-prominent-header dpw-simple-grid-no-table-top-border" ng-show="$ctrl.list.length>0"> <tr> <th ng-repeat="column in $ctrl.columns" ng-bind="column.value"></th> <th class="parameter-table-action"></th> </tr> <tr ng-repeat="item in $ctrl.list"> <td ng-repeat="column in $ctrl.columns" dpw-parameter-label="{{item[column.key]}}" class="ellipsis parameter-table-cell-data" title="{{item[column.key]}}"></td> <td class="inline-center"> <a href="javascript:;" ng-click="$ctrl.handleEdit(item['id'])" class="icon-icon-edit" title="edit value"></a> <a href="javascript:;" class="icon-icon_delete_fill" ng-click="$ctrl.handleDelete(item['id'])" ng-class="{disabled: item.deleteDisabled}" title="delete value"></a> </td> </tr> </table> <div ng-show="$ctrl.list.length===0" class="sub-title">No Records</div> </script> <script type="text/ng-template" id="dpw-error-display-field.html"> <div class="dpw-error-display-field" ng-if="$ctrl.shouldDisplay()"> <span ng-bind-html="$ctrl.getMessage()"></span> </div> </script> <script type="text/ng-template" id="dpw-wizard.html"> <div class="dpw-wizard popup-container-panel"> <div class="dpw-wizard-header popup-container-panel-header"> <div class="popup-container-panel-close-btn right" ng-hide="ctrl.hideCloseBtn" ng-click="ctrl.close()">×</div> <div ng-bind="ctrl.title"></div> </div> <div class="dpw-wizard-body popup-container-panel-body"> <div ng-repeat="stepConfig in ctrl.stepsConfig" ng-if="ctrl.stepManager.isStep(stepConfig.stepName)"> <div ng-include="stepConfig.templateUrl" class="dpw-wizard-body-content"></div> <div class="dpw-wizard-body-footer popup-container-panel-body-footer hidden-overflow"> <div class="button button-orange right" ng-if="!ctrl.stepManager.isLastStep(stepConfig.stepName)" ng-click="ctrl.stepManager.stepForward()"> <span>Next</span></div> <div class="button button-orange right" ng-class="{'button-disabled': ctrl.isSubmitDisabled}" ng-if="ctrl.stepManager.isLastStep(stepConfig.stepName)" ng-click="!ctrl.isSubmitDisabled && ctrl.submit()"> <span ng-bind="ctrl.submitBtnLabel || 'Submit'"></span></div> <div class="button button-with-border right" ng-if="!ctrl.stepManager.isFirstStep(stepConfig.stepName)" ng-click="ctrl.stepManager.stepBackward()"> <span>Back</span></div> </div> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-free-sign-up-box.html"> <div class="dpw-free-sign-up-box"> <div class="button button-orange v-middle dpw-free-sign-up-box-submit-btn" ng-click="$ctrl.submit()"> <div class="dpw-free-sign-up-box-btn-large-text" ng-bind="$ctrl.primaryText"></div> <div class="dpw-free-sign-up-box-btn-small-text" ng-bind="$ctrl.secondaryText"></div> </div> </div> </script> <script type="text/ng-template" id="dpw-setup-sandbox-password.html"> <div class="dpw-setup-sandbox-password"> <form ng-attr-name="{{ctrl.formConfig.formName}}" ng-class="ctrl.formConfig.className" novalidate=""> <div class="dpw-display-fields"> <div class="dpw-display-field"> <div class="dpw-display-field-label"> Sandbox Phone Number </div> <div class="dpw-display-field-data dpw-setup-sandbox-password-account" ng-bind="ctrl.fieldsConfig.sandboxPhoneNumber"> </div> </div> <div class="dpw-display-field"> <div class="dpw-display-field-label"> New Sandbox Password <dpw-tooltip-info> <span ng-bind="ctrl.lang.MyAccount.ACCOUNT_NEW_PASSWORD_REQUIREMENTS"></span> </dpw-tooltip-info> </div> <div class="dpw-display-field-data"> <input type="password" class="fieldInputText" ng-attr-name="{{ctrl.fieldsConfig.newSandboxPassword.name}}" ng-model="ctrl.fieldsConfig.newSandboxPassword.value" ng-change="ctrl.fieldsConfig.newSandboxPassword.onChange()" ng-focus="ctrl.fieldsConfig.newSandboxPassword.onFocus()" required maxlength="64"> <dpw-error-display-field error-codes="ctrl.fieldsConfig.newSandboxPassword.errors" message-config="ctrl.fieldsConfig.newSandboxPassword.messages"> </dpw-error-display-field></div> </div> <div class="dpw-display-field"> <div class="dpw-display-field-label">Confirm New Password</div> <div class="dpw-display-field-data"> <input type="password" class="fieldInputText" ng-attr-name="{{ctrl.fieldsConfig.confirmNewPassword.name}}" ng-model="ctrl.fieldsConfig.confirmNewPassword.value" ng-change="ctrl.fieldsConfig.confirmNewPassword.onChange()" ng-focus="ctrl.fieldsConfig.confirmNewPassword.onFocus()" required maxlength="64"> <dpw-error-display-field error-codes="ctrl.fieldsConfig.confirmNewPassword.errors" message-config="ctrl.fieldsConfig.confirmNewPassword.messages"> </dpw-error-display-field></div> </div> </div> </form> </div> </script> <script type="text/ng-template" id="sandbox-account-operations.html"> <div class="sandbox-account-operations"> <div class="sandbox-account-operations-container sandbox-account-operations-for-not-activated" ng-show="$ctrl.currentAccountStatus === $ctrl.accountStatusEnum.NOT_ACTIVATED"> <div class="sandbox-account-operations-item"> <span class="sandbox-account-operations-red-text">Inactive</span> <span class="v-separate v-middle" ng-show="$ctrl.canActivateSandbox"></span> <a ng-click="$ctrl.activate()" ng-show="$ctrl.canActivateSandbox">Activate</a> </div> </div> <div class="sandbox-account-operations-container sandbox-account-operations-for-activated" ng-show="$ctrl.currentAccountStatus === $ctrl.accountStatusEnum.ACTIVATED"> <div class="sandbox-account-operations-item"> <span class="sandbox-account-operations-green-text">Active</span> <span class="v-separate v-middle" ng-show="$ctrl.canResetSandboxPassword"></span> <a ng-click="$ctrl.resetPassword()" ng-show="$ctrl.canResetSandboxPassword">Reset password</a> </div> </div> <div class="sandbox-account-operations-container sandbox-account-operations-for-disabled" ng-show="$ctrl.currentAccountStatus === $ctrl.accountStatusEnum.DISABLED"> <div class="sandbox-account-operations-item"> <span class="sandbox-account-operations-red-text">Disabled</span> <span class="v-separate v-middle" ng-show="$ctrl.canReactivateSandbox"></span> <a ng-click="$ctrl.reactivate()" ng-show="$ctrl.canReactivateSandbox">Reactivate</a> </div> </div> </div> </script> <script type="text/ng-template" id="app-creation-congratulations.html"> <div class="app-creation-congratulations"> <div class="app-creation-congratulations-common"> Your app has been successfully created! </div> <div class="app-creation-congratulations-scenario app-creation-congratulations-sandbox-creation-triggered" ng-show="ctrl.isSandboxCreationTriggered"> <p ng-if="!ctrl.hasSandboxBeenCreated && !ctrl.isSandboxCreationFailed"> A sandbox account is also creating for you to start development. <br> Please wait ... <i class="app-creation-congratulations-sandbox-creation-triggered-loader"></i> </p> <p ng-if="!ctrl.hasSandboxBeenCreated && ctrl.isSandboxCreationFailed" class="dark-red-text"> An unexpected error occurred, please go to Sandbox Accounts page and retry. </p> <p ng-if="ctrl.hasSandboxBeenCreated"> A sandbox account has been created for you to start development. <span ng-show="ctrl.hasPermissionToActivateSandbox"> <br>Click Next button to set up password for your sandbox account. </span> </p> </div> </div> </script> <script type="text/ng-template" id="dpw-country-selector.html"> <div class="inline-block v-middle dpw-country-selector" dpw-chosen="" is-single="" model="$ctrl.selectedCountry" options-source="$ctrl.countries" chosen-options="{width: $ctrl.width ||'150px'}"></div> </script> <script type="text/ng-template" id="dpw-event-banner.html"> <div class="dpw-event-banner" ng-if="ctrl.visible" ng-bind-html="ctrl.htmlContent"></div> </script> <script type="text/ng-template" id="dpw-app-profile-list-table.html"> <div class="dpw-app-profile-list-table"> <div class="no-applications" ng-if="$ctrl.isEmptyList()"> <div class="section-description" ng-bind="$ctrl.noAppProfiles"></div> </div> <table class="dpw-app-profile-list-table-content data-list" ng-if="!$ctrl.isEmptyList()"> <tbody> <tr> <th> App Name in Profile</th> <th>Compatibility</th> <th width="200">Profile Status</th> <th>Linked App</th> <th class="col-action">Actions</th> </tr> <tr dpw-app-profile-list-row="" ng-repeat="appProfile in $ctrl.appProfileList" app-profile="appProfile" on-delete="$ctrl.render(options)"></tr> </tbody> </table> <div class="clearfix"> <div class="right" dpw-pagination="" paging="paging"></div> </div> </div> </script> <script type="text/ng-template" id="dpw-app-profile-list-row.html"> <td class="dpw-app-profile-list-cell"> <a dpw-add-title="" ng-href="{{$ctrl.getAppProfileUrl()}}" ng-click="$ctrl.onEditProfile()" ng-bind="$ctrl.appProfile.name || '<Empty>'"></a> <span ng-if="$ctrl.isRevision()">(Revision)</span> </td> <td class="dpw-app-profile-list-cell" data-test-automation-id="brand-name"> <span ng-bind="$ctrl.appProfile.brandId | brandDisplayNameForAppGallery"></span> </td> <td class="dpw-app-profile-list-cell"> <span ng-bind="$ctrl.appProfile.status | appProfileStatusDisplayName" ng-class="$ctrl.getColorClassByProfileStatus($ctrl.appProfile.status)"></span> </td> <td class="dpw-app-profile-list-cell" ng-switch="$ctrl.hasLinkedApp()"> <a dpw-add-title="" ng-switch-when="true" ng-href="{{$ctrl.getLinkedAppUrl()}}" ng-bind="'View application'"></a> <span ng-switch-when="false">No linked app</span> </td> <td class="dpw-app-profile-list-cell col-action"> <a class="icon-icon_delete_fill" ng-if="$ctrl.canDelete()" ng-click="$ctrl.delete()" title="Delete profile"></a> </td> </script> <script type="text/ng-template" id="dpw-toast.html"> <div class="dpw-toast-box" ng-bind-html="ctrl.content"></div> </script> <script type="text/ng-template" id="dpw-bread-crumb.html"> <ul class="dpw-bread-crumb"> <li ng-repeat="item in $ctrl.items" class="inline-block dpw-bread-crumb-item"> <a ng-bind="item.text" ng-href="{{item.href}}" ng-if="item.href"></a> <span ng-bind="item.text" ng-if="!item.href"></span> </li> </ul> </script> <script type="text/ng-template" id="dpw-popup-youtube-video.html"> <div class="dpw-popup-youtube-video" ng-style="{'width': ctrl.width}"> <div class="dpw-popup-youtube-video-close-btn" ng-click="ctrl.close()"> <span>Close</span> <span>×</span> </div> <div class="dpw-popup-youtube-video-container"> <dpw-youtube class="dpw-popup-youtube-video-content" youtube-url="{{ctrl.videoUrl}}" youtube-autoplay="true" youtube-width="100%" youtube-height="100%"></dpw-youtube> </div> </div> </script> <script type="text/ng-template" id="dpw-open-copy-popup.html"> <div class="copy-btn-container"> <dpw-tooltip-entry trigger="click" message="'copied!'"> <div ng-class="{'dpw-open-copy-popup': !ctrl.isTransclude}" class="dpw-open-copy-btn" data-clipboard-text="{{ctrl.copyValue}}" ng-if="text" ng-click="ctrl.openCopy()" ng-transclude=""> </div> </dpw-tooltip-entry> </div> </script> <script type="text/ng-template" id="dpw-leads-report.html"> <div class="dpw-leads-report"> <ng-include ng-if="!ctrl.isAdminSite" src="'dpw-developer-leads-report.html'"></ng-include> <ng-include ng-if="ctrl.isAdminSite" src="'dpw-admin-leads-report.html'"></ng-include> </div> </script> <script type="text/ng-template" id="dpw-developer-leads-report.html"> <div class="panel dpw-developer-leads-report" submit-on-enter=""> <div class="panel-heading"> <div class="panel-title">Leads Report</div> </div> <div class="panel-body"> <div class="dpw-display-fields"> <div class="dpw-display-field"> <div class="dpw-display-field-label">Date</div> <div class="dpw-display-field-data"> <ng-include src="'dpw-leads-report-date-picker.html'"></ng-include> </div> </div> <div class="dpw-display-field"> <div class="dpw-display-field-label">App Profile Name</div> <div class="dpw-display-field-data"> <input ng-model="ctrl.store.inputCriteria.appProfileName" type="text" class="fieldInputText field-input-app-profile-name" maxlength="80"> </div> </div> <div class="dpw-display-field"> <div class="dpw-display-field-label"> </div> <div class="dpw-display-field-data"> <ng-include src="'dpw-leads-report-search-button.html'"></ng-include> </div> </div> </div> <ng-include src="'dpw-leads-report-results.html'"></ng-include> </div> </div> </script> <script type="text/ng-template" id="dpw-admin-leads-report.html"> <div class="section"> <div class="lead-search-data-list data-list criteria-form" submit-on-enter=""> <div class="layout-row"> <div class="layout-row-label layout-row-label-with-input">Date</div> <div class="layout-row-data"> <ng-include src="'dpw-leads-report-date-picker.html'"></ng-include> </div> </div> <div class="layout-row"> <div class="layout-row-label layout-row-label-with-input">Application Name</div> <div class="layout-row-data"> <input ng-model="ctrl.store.inputCriteria.appProfileName" type="text" class="fieldInputText field-input-app-profile-name" maxlength="80"> </div> </div> <div class="layout-row"> <div class="layout-row-label"> </div> <div class="layout-row-data"> <ng-include src="'dpw-leads-report-search-button.html'"></ng-include> </div> </div> </div> </div> <ng-include src="'dpw-leads-report-results.html'"></ng-include> </script> <script type="text/ng-template" id="dpw-leads-report-date-picker.html"> <div class="dpw-date-picker-box"> <input type="text" ng-model="ctrl.store.inputCriteria.beginTime" dpw-date-picker="" picker-options="{ dateFormat: 'Y-m-d', maxDate: ctrl.store.inputCriteria.endTime }" instance="ctrl.datepickers['beginTime']" default-date="ctrl.store.inputCriteria.beginTime" placeholder="Start Date" class="fieldInputText field-input-date"> <span class="date-clear-icon" ng-if="ctrl.store.inputCriteria.beginTime" ng-click="ctrl.clearDate('beginTime')">×</span> </div> <span class="date-separator">—</span> <div class="dpw-date-picker-box"> <input type="text" ng-model="ctrl.store.inputCriteria.endTime" dpw-date-picker="" picker-options="{ dateFormat: 'Y-m-d', minDate: ctrl.store.inputCriteria.beginTime }" instance="ctrl.datepickers['endTime']" default-date="ctrl.store.inputCriteria.endTime" placeholder="End Date" class="fieldInputText field-input-date"> <span class="date-clear-icon" ng-if="ctrl.store.inputCriteria.endTime" ng-click="ctrl.clearDate('endTime')">×</span> </div> </script> <script type="text/ng-template" id="dpw-leads-report-search-button.html"> <div class="button button-orange field-button-search" ng-click="ctrl.search()"> <span class="fieldSubmit">Search</span> </div> </script> <script type="text/ng-template" id="dpw-leads-report-results.html"> <div class="section-title" ng-show="ctrl.store.hasSearched"> Search results: <span ng-bind="ctrl.store.paging.totalElements"></span> <div class="leads-export-data-link" ng-click="ctrl.export()" ng-if="ctrl.store.searchResult.length > 0"> <div class="v-middle inline-block leads-report-export-icon"></div> <a class="v-middle">Export</a> </div> </div> <div dpw-pagination="" paging="ctrl.store.paging" ng-if="ctrl.isAdminSite"></div> <table ng-class="{'data-list':ctrl.isAdminSite,'dpw-simple-grid':!ctrl.isAdminSite}" ng-show="ctrl.store.searchResult.length > 0"> <tbody> <tr ng-include="ctrl.isAdminSite?'dpw-admin-leads-report-table-header.html':'dpw-developer-leads-report-table-header.html'"> </tr> <tr ng-repeat="item in ctrl.store.searchResult"> <td ng-bind="item.createTime | consoleDateTime"></td> <td ng-bind="item.appProfileName" title="{{item.appProfileName}}"></td> <td ng-bind="item.rcExtensionId" ng-if="ctrl.isAdminSite"></td> <td ng-bind="item.userName" title="{{item.userName}}"></td> <td ng-bind="item.businessPhone" title="{{item.businessPhone}}"></td> <td ng-bind="item.workEmail" title="{{item.workEmail}}"></td> <td ng-bind="item.companyName" title="{{item.companyName}}"></td> <td ng-bind="item.employeesNumber" ng-if="ctrl.isAdminSite"></td> </tr> </tbody> </table> <div dpw-pagination="" paging="ctrl.store.paging"></div> </script> <script type="text/ng-template" id="dpw-developer-leads-report-table-header.html"> <th class="leads-report-column-date" dpw-th-sort="ctrl.store.usedCriteria.sortObj.createTime" dpw-sort-handler="ctrl.sort('createTime', isAsc)">Date </th> <th class="leads-report-column-app-profile-name" dpw-th-sort="ctrl.store.usedCriteria.sortObj.appProfileName" dpw-sort-handler="ctrl.sort('appProfileName', isAsc)"> App Profile Name </th> <th class="leads-report-column-name" dpw-th-sort="ctrl.store.usedCriteria.sortObj.firstName" dpw-sort-handler="ctrl.sort('firstName', isAsc)">Name </th> <th class="leads-report-column-phone-number">Phone Number</th> <th>Work Email</th> <th class="leads-report-column-company">Company Name</th> </script> <script type="text/ng-template" id="dpw-admin-leads-report-table-header.html"> <th dpw-th-sort="ctrl.store.usedCriteria.sortObj.createTime" dpw-sort-handler="ctrl.sort('createTime', isAsc)">Date </th> <th dpw-th-sort="ctrl.store.usedCriteria.sortObj.appProfileName" dpw-sort-handler="ctrl.sort('appProfileName', isAsc)" class="leads-report-app-name"> Application Name </th> <th>Extension ID</th> <th dpw-th-sort="ctrl.store.usedCriteria.sortObj.firstName" dpw-sort-handler="ctrl.sort('firstName', isAsc)">Name </th> <th>Business Phone Number</th> <th>Work Email</th> <th>Company Name</th> <th>Number of Employees</th> </script> <script type="text/ng-template" id="dpw-export-popup.html"> <div class="dpw-export-popup"> <form dpw-jq-validate="" rule="exportForm"> <div class="data-list"> <div class="layout-row"> <div class="layout-row-label layout-row-label-with-input">Export file name:</div> <div class="layout-row-data"> <input ng-model="exportConfig.name" type="text" maxlength="128" name="filename" class="fieldInputText"> <span>.csv</span> </div> </div> <div class="layout-row"> <div class="layout-row-label"> </div> <div class="layout-row-data"> <div class="button button-orange" ng-click="ctrl.submit()"><span>Export</span></div> </div> </div> </div> </form> </div> </script> <script type="text/ng-template" id="dpw-loading.html"> <div class="preloader dpw-loading" ng-class="{'active':$ctrl.visible}"> <div class="preloader-background"></div> <div class="preloader-loading"> <div class="preloader-loading-loader"></div> <div class="preloader-loading-message">Please wait...</div> </div> </div> </script> <script type="text/ng-template" id="dpw-app-icon.html"> <div class="app-icon-container" ng-class="{'error-icon': ctrl.application.invalidIcon}"> <div class="app-icon-preview"> <img class="app-icon" ngf-src="ctrl.file" ng-if="ctrl.file"> <img class="app-icon-placeholder" ng-src="{{ctrl.placeholder}}?v=20241114-0953" ng-if="!ctrl.file"> </div> <div class="app-icon-description-actions"> <div class="app-icon-description"> <p>Image must be a square</p> <p>{{ctrl.getIconFormatDesc()}}</p> <p>Size: less than 2MB</p> </div> <div class="app-icon-actions"> <button type="button" class="button button-orange" ngf-select="ctrl.choose($file)" ngf-accept="ctrl.getValidImageMimeTypes()"> Choose </button> <button type="button" class="button button-with-border-orange" ng-if="!ctrl.required && ctrl.file" ng-click="ctrl.remove()"> Remove </button> </div> </div> </div> <div class="bold dark-red-text" ng-if="ctrl.errorMessage" ng-bind="ctrl.errorMessage"> </div> </script> <script type="text/ng-template" id="dpw-header.html"> <div class="dpw-header"> <dpw-dev-package-promotion></dpw-dev-package-promotion> <dpw-free-trial-notification></dpw-free-trial-notification> <dpw-header-links></dpw-header-links> <div class="dpw-header-container center-section"> <div class="logo"> <a href="/" class="logo-link" rel="nofollow" aria-label="RingCentral Developers"> </a> </div> <dpw-primary-nav class="dpw-primary-nav" ng-show="headerCtrl.displayPrimaryNav"></dpw-primary-nav> <div class="header-account"> <div class="rcdpw-require-logout rcdpw-login-entry"> <a href="/sign-up" rel="nofollow" class="button header-sign-in-up-btn"><span>Try free</span></a> </div> <div class="rcdpw-require-login inline-block"> <a href="/my-account.html" rel="nofollow" class="button header-sign-in-up-btn"><span>Console</span></a> </div> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-header-links.html"> <div class="center-section dpw-header-links"> <ul> <li ng-repeat="item in $ctrl.items" role="listitem"> <a ng-href="{{ item.href }}" ng-attr-target="{{ item.target }}" rel="nofollow" class="dpw-header-links-anchor"> {{ item.label }} </a> </li> <li ng-if="$ctrl.shouldShowLogin()"> <button type="button" ng-click="$ctrl.login()" class="dpw-header-links-anchor dpw-header-login-button" data-test-automation-id="loginButton"> LOGIN </button> </li> <li class="rcdpw-require-login" role="listitem"> <div class="inline-block v-middle header-account-wrap" ng-class="$ctrl.isShowInfoNavs && 'header-account-info-hover'"> <div ng-mouseenter="$ctrl.showInfoNavs()" ng-mouseleave="$ctrl.hideInfoNavs()" class="header-account-info v-middle dpw-header-links-anchor"> <div class="header-account-user-name v-middle inline-block ellipsis noWrap" ng-bind="$ctrl.userInfoString">  </div> <i class="icon-btn_sort_down header-account-info-indicator v-middle"></i> </div> <div class="header-account-info-container header-top-menus-arrow" ng-if="$ctrl.isShowInfoNavs" ng-click="$ctrl.clickInfoNav()" ng-mouseleave="$ctrl.hideInfoNavs()" ng-mouseenter="$ctrl.showInfoNavs()"> <a class="header-account-info-item" ng-href="{{$ctrl.getHref(nav)}}" ng-attr-target="{{nav.target || '_self'}}" ng-repeat-start="nav in $ctrl.navs"><span class="header-account-info-item-icon" ng-class="nav.icon"></span><span ng-bind="nav.text"></span></a> <span ng-repeat-end="" class="drop-down-menu-divider"></span> <a class="header-account-info-item header-account-info-item-logout pointer" ng-click="$ctrl.logout()"><span class="icon-icon_logout header-account-info-item-icon"></span>Log out</a> </div> </div> </li> </ul> </div> </script> <script type="text/ng-template" id="dpw-category-nav.html"> <div class="dpw-category-nav"> <div class="dpw-category" ng-repeat="category in $ctrl.categories" ng-class="[category.active && 'active', category.id]"> <a ng-href="{{ category.href }}" rel="nofollow"> {{ category.label | uppercase }} </a> </div> </div> </script> <script type="text/ng-template" id="dpw-primary-nav.html"> <div ng-cloak="" class="dpw-primary-container"> <ul class="dpw-primary-items"> <li ng-repeat="item in $ctrl.items" ng-if="$ctrl.shouldItemDisplay(item)" ng-class="$ctrl.getItemClassNames(item)" ng-mouseenter="$ctrl.showItemPanel(item)" ng-mouseleave="$ctrl.hideItemPanel(item, $event)"> <a ng-href="{{ item.href }}" ng-attr-target="{{ item.target }}" rel="nofollow" class="dpw-menu-item-link" ng-click="$ctrl.onMenuItemClick(item, $event)"> {{ item.text }} <i ng-if="item.secondary" class="panel-visibility-indicator icon-btn_sort_down" ng-class="{'expanded': item.isPanelVisible}"></i> </a> <dpw-secondary-nav ng-if="item.secondary" data="item.secondary" is-panel-visible="item.isPanelVisible" ng-class="item.isPanelVisible && 'secondary-nav-active'"> </dpw-secondary-nav> </li> </ul> </div> </script> <script type="text/ng-template" id="dpw-secondary-nav.html"> <div class="secondary-nav"> <div class="secondary-nav-sidebar" ng-if="$ctrl.data.withProductFilter"> <dpw-product-filter is-panel-visible="$ctrl.isPanelVisible"></dpw-product-filter> </div> <div class="secondary-nav-menu-container"> <dpw-secondary-nav-section ng-repeat="item in $ctrl.data.sections" class="secondary-nav-section" data="item"></dpw-secondary-nav-section> </div> </div> </script> <script type="text/ng-template" id="dpw-secondary-nav-cta.html"> <div class="cta-content"> <div class="cta-title">{{ $ctrl.cta.title }}</div> <p class="cta-description">{{ $ctrl.cta.description }}</p> <div class="cta-button" ng-if="$ctrl.cta.button"> <a rel="nofollow" ng-href="{{ $ctrl.cta.button.link }}" ng-attr-target="{{$ctrl.cta.button.target}}" class="btn btn-primary"> {{ $ctrl.cta.button.label }} </a> </div> </div> </script> <script type="text/ng-template" id="dpw-secondary-nav-group.html"> <div class="secondary-nav-group"> <div class="secondary-nav-group-heading" title="{{$ctrl.data.heading}}">{{ $ctrl.data.heading }}</div> <div class="secondary-nav-group-content"> <div class="secondary-nav-group-item" ng-repeat="item in $ctrl.items" ng-class="{'secondary-nav-cta-item': $ctrl.isCtaItem($index)}"> <a ng-href="{{item.href}}" ng-attr-target="{{$ctrl.isExternalUrl(item.href) ? '_blank' : ''}}" ng-click="$ctrl.onClick($event, item)" ng-hide="item.hidden" title="{{item.label}}" rel="nofollow">{{item.label}}</a> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-secondary-nav-section.html"> <div class="secondary-nav-section"> <div class="secondary-nav-section-heading" ng-if="$ctrl.data.heading">{{$ctrl.data.heading}}</div> <div class="secondary-nav-section-content"> <dpw-secondary-nav-group ng-repeat="item in $ctrl.groups" class="secondary-nav-section-group" enable-last-item-as-cta="$ctrl.data.isForResourcesDisplay" data="item"></dpw-secondary-nav-group> </div> </div> </script> <script type="text/ng-template" id="dpw-product-filter.html"> <div class="product-filter"> <dpw-product-filter-group type="primary" heading="APIs" class="product-filter-item" expanded="true"> <div ng-repeat="item in $ctrl.productFamilyItems" class="product-filter-option"> <button ng-class="{'active': $ctrl.isProductFamilyActive(item)}" ng-click="$ctrl.onSelectProductFamily(item)" title="{{item}}">{{ item }}</button> </div> </dpw-product-filter-group> <dpw-product-filter-group type="secondary" heading="REGION" class="product-filter-item" expanded="false"> <div ng-repeat="item in $ctrl.regionItems" class="product-filter-checkbox-wrapper" tabindex="0"> <dpw-checkbox class="product-filter-checkbox" text="{{ $ctrl.getRegionFullName(item.label) }}" title="{{ $ctrl.getRegionFullName(item.label) }}" model="item.checked" for-id="{{'region-option-' + item.label}}" change="$ctrl.onSelectedRegionsChanged()"></dpw-checkbox> </div> </dpw-product-filter-group> <dpw-product-filter-group type="secondary" heading="CARRIER" class="product-filter-item" expanded="false"> <div dpw-drop-down-list="" class="partner-filter-drop-down-list" model="$ctrl.selectedPartner" options-source="$ctrl.partnerItems"></div> </dpw-product-filter-group> </div> </script> <script type="text/ng-template" id="dpw-product-filter-group.html"> <div class="product-filter-group" ng-class="{'product-filter-group-primary': $ctrl.isPrimary(), 'product-filter-group-secondary': $ctrl.isSecondary()}"> <div class="product-filter-group-header"> <div class="product-filter-group-title" tabindex="0">{{ $ctrl.heading }}</div> <button class="product-filter-group-toggle-button" aria-label="toggle button" ng-if="$ctrl.isSecondary()" ng-click="$ctrl.expanded = !$ctrl.expanded"> <i ng-class="{'icon-btn_sort_down': !$ctrl.expanded, 'icon-btn_sort_up': $ctrl.expanded}"></i> </button> </div> <div class="product-filter-group-body" ng-if="$ctrl.expanded"> <div ng-transclude=""></div> </div> </div> </script> <script type="text/ng-template" id="dpw-developer-event.html"> <div class="developer-event" ng-attr-id="{{ $ctrl.eventId }}" ng-class="{ 'developer-event-padding': $ctrl.event.isPadding }"> <div class="developer-event-start-date" ng-class="{'developer-event-start-date-highlight': $ctrl.event.highlight }" ng-if="$ctrl.displayStartDate"> <div class="developer-event-start-date-wrap"> <div class="developer-event-start-date-day" ng-bind="$ctrl.event.startDate | date: 'd'" tabindex="0"></div> <div class="developer-event-start-date-month" ng-bind="$ctrl.event.startDate | date: 'MMM'" tabindex="0"></div> </div> </div> <div class="developer-event-main" ng-if="!$ctrl.event.isPadding"> <div class="developer-event-image"> <img ng-src="{{ $ctrl.event.eventImage }}" alt=""> </div> <div class="developer-event-details"> <div class="developer-events-date-and-location"> <div class="developer-event-date"> <span class="developer-event-date-start" ng-bind="$ctrl.event.startDate | date: 'MM/dd/yyyy'" tabindex="0"></span> <span ng-if="!$ctrl.event.isOneDayEvent">-</span> <span ng-if="!$ctrl.event.isOneDayEvent" class="developer-event-date-end" ng-bind="$ctrl.event.endDate | date: 'MM/dd/yyyy'" tabindex="0"></span> </div> | <div class="developer-event-location" ng-bind="$ctrl.event.eventLocation" tabindex="0"></div> </div> <div class="developer-event-name-and-description"> <h3 class="developer-event-name" ng-bind="$ctrl.event.eventName" tabindex="0"></h3> <p class="developer-event-description" ng-bind="$ctrl.event.eventDescription" tabindex="0"></p> </div> <div class="developer-event-action" ng-switch="$ctrl.event.isPostEvent"> <a ng-switch-when="undefined" ng-if="$ctrl.event.preEventCtaUrl && $ctrl.event.preEventCtaUrl" class="button button-orange" ng-href="{{ $ctrl.event.preEventCtaUrl }}" target="_blank" tracked-by-mixpanel="" mixpanel-event="$ctrl.mixpanelService.eventNames.ACTION" mixpanel-properties="{'Page Name': $ctrl.pageName, 'Action': 'Register Event'}"> <span ng-bind="$ctrl.event.preEventCtaText"></span> </a> <a ng-switch-when="true" ng-if="$ctrl.event.postEventCtaUrl && $ctrl.event.postEventCtaUrl" class="button button-blue" ng-href="{{ $ctrl.event.postEventCtaUrl }}" target="_blank" tracked-by-mixpanel="" mixpanel-event="$ctrl.mixpanelService.eventNames.ACTION" mixpanel-properties="{'Page Name': $ctrl.pageName, 'Action': 'Register Event'}"> <span ng-bind="$ctrl.event.postEventCtaText"></span> </a> </div> </div> </div> </div> </script> <script type="text/ng-template" id="manage-role-and-app-access.html"> <div class="manage-role-and-app-access" ng-class="ctrl.featureConfig.extraClass"> <div class="popup-container-panel"> <div class="popup-container-panel-header" ng-show="ctrl.featureConfig.showHeader"> <div class="right font-size-0"> <div class="popup-container-panel-close-btn" ng-click="ctrl.close()">×</div> </div> <div class="manage-role-and-app-access-title">Role & App Access</div> </div> <div class="popup-container-panel-body"> <div class="manage-role-and-app-access-section"> <div class="manage-role-and-app-access-section-heading">Role</div> <div class="manage-role-and-app-access-section-body"> <div ng-repeat="userRole in ctrl.userRoles" class="manage-role-and-app-access-role-item"> <dpw-radio name="userRole" for-id="userRole-{{userRole.id}}" text="{{userRole.label}}" model="ctrl.model.userRole" value="userRole.id"></dpw-radio> <dpw-tooltip-info><span ng-bind="userRole.desc"></span></dpw-tooltip-info> </div> <div class="manage-role-and-app-access-error" ng-show="!ctrl.model.userRole && ctrl.shouldDisplayErrorIfAny()" ng-bind="ctrl.errorMessages.ROLE_NOT_SPECIFIED"></div> </div> </div> <div class="manage-role-and-app-access-section" ng-show="ctrl.shouldDisplayAppAccessSettings()"> <div class="manage-role-and-app-access-section-heading">App Access</div> <div class="manage-role-and-app-access-section-body"> <span ng-show="ctrl.store.applications.length === 0"> No applications. </span> <table class="manage-role-and-app-access-permissions-table" ng-show="ctrl.store.applications.length > 0"> <tbody> <tr> <th>App</th> <th>Permission</th> </tr> <tr ng-repeat="app in ctrl.store.applications"> <td class="col-app-name noWrap" dpw-add-title=""> <a ng-href="{{ctrl.getAppUrl(app)}}" target="_blank" ng-bind="app.name"></a> </td> <td class="col-app-access noWrap"> <dpw-radio ng-repeat="item in ctrl.appAccessConfig" class="manage-role-and-app-access-permissions-item" name="appAccess-{{app.id}}" for-id="appAccess-{{app.id}}-{{item.id}}" text="{{item.label}}" model="ctrl.model.appAccessSettings[app.id]" value="item.id"></dpw-radio> </td> </tr> </tbody> </table> </div> </div> <div class="manage-role-and-app-access-btn-area align-right" ng-show="ctrl.showSubmitBtn()"> <div class="button button-orange bold" ng-click="ctrl.submit()">Save</div> </div> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-protected-feature.html"> <div ng-if="ctrl.isAccessible" ng-transclude="" class="inline-block"></div> <dpw-tooltip-entry ng-if="!ctrl.isAccessible" trigger="hover" message="ctrl.getMsgContent()"> <div ng-transclude="" class="inline-block"></div> </dpw-tooltip-entry> </script> <script id="dpw-case-study-slider.html" type="text/ng-template"> <div class="case-study-slider"> <dpw-generate-html ng-if="ctrl.title" tag="ctrl.titleTag" class-name="packed-box-title case-study-title" content="ctrl.title"> </dpw-generate-html> <dpw-generate-html ng-if="ctrl.subtitle" tag="ctrl.subtitleTag" class-name="packed-box-title case-study-sub-title" content="ctrl.subtitle"> </dpw-generate-html> <div dpw-slider="" class="packed-box case-study-tiles"> <div dpw-flipper="" is-flipped="{{study.isFlipped}}" class="box case-study-tile" ng-repeat="study in ctrl.studies"> <div class="front tile"> <h3 class="short-name" ng-bind="study.txt_shortName"></h3> <a class="icon info-icon" ng-click="study.isFlipped = !(study.isFlipped)" ng-if="study.bg_logoImageSelected"></a> <div class="content"> <div class="case-study-logo-wrap"> <div class="case-study-logo"> <a target="_blank" ng-href="{{study.href_readMore}}"> <img ng-src="/assets/images/case-studies/{{study.bg_logoImageDefault}}?v=20241114-0953" alt="{{study.logoAlt}}"> </a> </div> </div> <div class="quote-box"> <p class="quote" ng-bind="study.txt_quote"></p> </div> <p class="signature" ng-bind="study.txt_signature"></p> </div> <a class="case-study-read-more" target="_blank" ng-href="{{study.href_readMore}}" ng-class="{'visibility-hidden':!study.href_readMore}">Read more</a> </div> <div class="back tile"> <a class="icon info-icon" ng-click="study.isFlipped = !(study.isFlipped)"></a> <div class="content"> <h3 class="short-name" ng-bind="study.txt_shortName"></h3> <div class="case-study-logo-wrap"> <div class="case-study-logo"> <a target="_blank" ng-href="{{study.href_readMore}}"> <img ng-src="/assets/images/case-studies/{{study.bg_logoImageSelected}}?v=20241114-0953" alt="{{study.logoAlt}}"> </a> </div> </div> <div class="metas"> <div class="layout-2-cols"> <div class="meta-key">Industry</div> <div class="meta-value" ng-bind="study.filter_industry | dpwUpperCaseStudyContent"></div> </div> <div class="layout-2-cols"> <div class="meta-key">Company Size</div> <div class="meta-value" ng-bind="study.filter_company | dpwUpperCaseStudyContent"></div> </div> <div class="layout-2-cols"> <div class="meta-key">Business Need</div> <div class="meta-value" ng-bind="study.filter_business | dpwUpperCaseStudyContent"></div> </div> </div> </div> <a class="case-study-read-more" target="_blank" ng-href="{{study.href_readMore}}">Read more</a> </div> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-sandbox-alert.component.html"> <div class="myAccount-sandbox-alert-wrapper"> <dpw-deactivated-alert class="alert-item" ng-if="ctrl.deactivatedSandbox.length" ng-repeat="sandbox in ctrl.deactivatedSandbox" deactivated-sandbox="sandbox" on-status-change="ctrl.sandboxStateUpdate()"></dpw-deactivated-alert> <dpw-pending-alert class="alert-item" ng-if="ctrl.pendingSandbox.length" ng-repeat="sandbox in ctrl.pendingSandbox" pending-sandbox="sandbox"></dpw-pending-alert> </div> </script> <script type="text/ng-template" id="dpw-deactivated-alert.component.html"> <div class="myAccount-sandbox-alert deactivate-alert"> <div class="deactivate-alert-content"> Your sandbox account associated with {{ deactivatedCtrl.deactivatedSandbox.phoneNumber }} has been deactivated due to inactivity. To preserve your sandbox account, reactivate it and conduct at least one API call. </div> <button class="reactivate-button" ng-click="deactivatedCtrl.reactivate()">Reactivate </button> </div> </script> <script type="text/ng-template" id="dpw-pending-alert.component.html"> <div class="myAccount-sandbox-alert pending-alert"> <div class="pending-alert-content"> Your sandbox account associated with {{ pendingCtrl.pendingSandbox.phoneNumber }} will be deactivated on {{ pendingCtrl.pendingSandbox.deactivateDate | date: 'mediumDate': 'UTC'}} UTC due to inactivity. To preserve this sandbox account, please conduct at least one sandbox API call. <a class="learn-more" ng-href="https://developers.ringcentral.com/guide/basics/sandbox/#deactivation-of-idle-sandbox-accounts" target="_blank">Learn more</a> </div> </div> </script> <script type="text/ng-template" id="dpw-dev-package-promotion.component.html"> <div class="common-banner-container" ng-if="ctrl.visible"> <div class="content"> <span class="close-btn" ng-click="ctrl.dismiss()"></span> <div class="sub-content"> <div class="desc"> Creating a second developer account is helpful if you wish to keep your development data separate from your business data in your primary account. </div> <a class="learn-more-button" href="/pricing" target="_blank">Learn more</a> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-free-trial-notification.component.html"> <div class="free-trial-notification-banner common-banner-container" ng-if="ctrl.visible"> <div class="content"> <span class="close-btn" ng-click="ctrl.close()"></span> <div class="sub-content"> <div class="desc"> Your free trial will expire <strong>in {{ctrl.days}} day(s)</strong>. Convert to a paid account now if you wish to begin the SMS-enablement process for your account. </div> <button class="cancel-button" type="button" ng-click="ctrl.cancelTrial()">Cancel trial</button> <button class="learn-more-button" type="button" ng-click="ctrl.upgrade()">Upgrade</button> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-cancel-trial.component.html"> <div class="free-trial-popup"> <div class="header"> <div class="title"> Confirm cancellation </div> <span class="close" ng-click="ctrl.cancel()">×</span> </div> <p class="desc"> You have {{days}} day(s) left in your trial. Upon cancellation your account will be closed and you will be logged out. </p> <div class="actions"> <button class="cancel-button" type="button" ng-click="ctrl.cancel()">Cancel</button> <button class="button button-blue confirm-button" ng-click="ctrl.confirm()">Confirm</button> </div> </div> </script> <script type="text/ng-template" id="dpw-upgrade-trial.component.html"> <div class="free-trial-popup upgrade-trial-popup"> <div class="header"> <div class="title"> Upgrade guidance </div> <span class="close" ng-click="ctrl.cancel()">×</span> </div> <p class="desc"> Click the Continue button to log in to the billing portal. <br> Once logged in, you can find the Upgrade option under the 'Account overview' page. </p> <div class="actions"> <a class="button button-blue confirm-button" href="{{ctrl.billingPortalUrl}}" target="_blank">Continue</a> </div> </div> </script> <script type="text/ng-template" id="dpw-add-in-installation.component.html"> <div class="dpw-add-in-installation" ng-class="{'action-disabled-in-prod': !ctrl.actionEnabledInProd}"> <div ng-if="!ctrl.botEnvs.prod.isBotExisted"> <dpw-protected-feature is-accessible="ctrl.canManipulateApp" class="app-bot-action-entry"> <dpw-install-bot-button action-enabled-in-prod="ctrl.actionEnabledInProd" app-key="ctrl.appKey" application="ctrl.application" can-manipulate-app="ctrl.canManipulateApp" bot-info="ctrl.botInfo" on-authorize="ctrl.onInstall({appKeyId: appKeyId, botName: botName, popupCtrl: popupCtrl})" on-update-bot-info="ctrl.onUpdateBotInfo({ botInfo: botInfo })" on-refresh-status="ctrl.onRefreshStatus()"></dpw-install-bot-button> </dpw-protected-feature> <div class="app-bot-action-disabled-tip" data-test-automation-id="prod-install-disabled-tip" ng-if="ctrl.canManipulateApp && !ctrl.actionEnabledInProd" ng-bind-html="ctrl.disabledMsgInProd"></div> </div> <div ng-if="ctrl.botEnvs.prod.isBotExisted"> <dpw-protected-feature is-accessible="ctrl.canManipulateApp" class="app-bot-action-entry"> <dpw-uninstall-bot-button action-enabled-in-prod="ctrl.actionEnabledInProd" app-key="ctrl.appKey" application="ctrl.application" can-manipulate-app="ctrl.canManipulateApp" bot-info="ctrl.botInfo" on-submit="ctrl.onUninstall({ appKeyId: appKeyId })" on-refresh-status="ctrl.onRefreshStatus()"></dpw-uninstall-bot-button> </dpw-protected-feature> <div class="app-bot-action-disabled-tip" data-test-automation-id="prod-remove-disabled-tip" ng-if="ctrl.canManipulateApp && !ctrl.actionEnabledInProd" ng-bind-html="ctrl.disabledMsgInProd"></div> </div> </div> </script> <script type="text/ng-template" id="bot-name-tooltip.html"> <dpw-tooltip-info> The bot name must follow below rules: <p class="bot-installation-tooltip-item"> 1. Only letters, numbers, periods, hyphens, underscores and spaces are allowed.</p> <p class="bot-installation-tooltip-item">2. The length must be between 3 and 32 characters.</p> </dpw-tooltip-info> </script> <script type="text/ng-template" id="dpw-install-bot-button.component.html"> <button class="button button-with-border-blue dpw-install-bot-button" data-test-automation-id="install-bot-button" ng-class="{'button-disabled':!ctrl.actionEnabledInProd || !ctrl.canManipulateApp}" ng-click="ctrl.canManipulateApp && ctrl.openInstallDialog()"><span>Install</span></button> </script> <script type="text/ng-template" id="dpw-uninstall-bot-button.component.html"> <button class="button button-with-border-red dpw-uninstall-bot-button" data-test-automation-id="uninstall-bot-button" ng-class="{'button-disabled':!ctrl.actionEnabledInProd || !ctrl.canManipulateApp}" ng-click="ctrl.canManipulateApp && ctrl.openUninstallDialog()"><span>Uninstall</span></button> </script> <script type="text/ng-template" id="dpw-bot-access-token.component.html"> <div class="dpw-bot-access-token"> <div ng-if="ctrl.canManipulateApp"> <div ng-if="ctrl.showClick2SeeAccessToken()" class="app-bot-access-token-actions"> <a class="app-bot-access-token-actions-click-to-see v-middle" ng-click="ctrl.showAccessToken()">Click to see</a> <div dpw-open-copy-popup="" text="ctrl.botInfo['prod'].token" class="inline-block v-middle"> </div> <a ng-click="ctrl.regenerateAccessToken()" class="inline-block v-middle app-bot-action-regenerate-token"> Regenerate </a> </div> <div ng-if="!ctrl.showClick2SeeAccessToken()"> Install add-in to generate </div> </div> <div ng-if="!ctrl.canManipulateApp" ng-bind="ctrl.hiddenFieldMsg"></div> </div> </script> <script type="text/ng-template" id="dpw-bot-actions.component.html"> <div class="dpw-display-fields"> <div class="dpw-display-field" id="bot-action-row-add-in-installation"> <div class="dpw-display-field-label">Add-in Installation</div> <div class="dpw-display-field-data"> <dpw-add-in-installation action-enabled-in-prod="ctrl.actionEnabledInProd" app-key="ctrl.appKey" application="ctrl.application" can-manipulate-app="ctrl.canManipulateApp" bot-info="ctrl.botInfo" bot-envs="ctrl.botEnvs" disabled-msg-in-prod="ctrl.disabledMsgInProd" on-install="ctrl.onInstall(appKeyId, botName, popupCtrl)" on-uninstall="ctrl.onUninstall(appKeyId)" on-update-bot-info="ctrl.onUpdateBotInfo(botInfo)" on-refresh-status="ctrl.refreshStatus()"></dpw-add-in-installation> </div> </div> <div class="dpw-display-field" id="bot-action-row-access-token" ng-if="ctrl.showAccessTokenRow()"> <div class="dpw-display-field-label">Access Token</div> <div class="dpw-display-field-data"> <dpw-bot-access-token can-manipulate-app="ctrl.canManipulateApp" bot-info="ctrl.botInfo" bot-envs="ctrl.botEnvs" application="ctrl.application" app-key="ctrl.appKey" on-refresh-status="ctrl.refreshStatus()"></dpw-bot-access-token> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-credentials-json.component.html"> <button type="button" class="credentials-json-download-button" ng-disabled="!ctrl.canManipulateApp" ng-click="ctrl.onDownload()"> Download </button> <span class="credentials-json-no-permission-warning" ng-if="!ctrl.canManipulateApp">{{ ctrl.noPermissionMsg }}</span> </script> <script type="text/ng-template" id="dpw-install-to-team.component.html"> <div ng-if="ctrl.canManipulateApp"> <div ng-class="{'dpw-install-notification-app-button-with-error': !!ctrl.installUnavailableReason}"> <button type="button" ng-if="ctrl.installButtonVisible()" class="dpw-install-notification-app-button" data-test-automation-id="install-notification-app-button" ng-disabled="ctrl.installButtonDisabled()" ng-click="ctrl.onInstall()">Install</button> <p ng-if="ctrl.installUnavailableReason" class="dpw-install-notification-app-button-error-message" data-test-automation-id="install-notification-app-button-error-message" ng-switch="ctrl.installUnavailableReason"> <span ng-switch-when="HIPAA_ACCOUNT">RingCentral Add-in support for HIPAA Customer is coming soon!</span> <span ng-switch-when="INACTIVE_APP">We are unable to install it. RingCentral Add-in can only be installed if the Application status is active.</span> <span ng-switch-when="PUBLIC_APP">Please visit <a href="https://www.ringcentral.com/apps/" target="_blank">App Gallery</a> to install.</span> </p> </div> </div> <div ng-if="!ctrl.canManipulateApp" class="dpw-install-to-team-no-permission-warning"> Insufficient privileges! Contact your administrator for access. </div> </script> <script type="text/ng-template" id="dpw-automatic-setup.component.html"> <div dpw-set-up-app-view="" class="dpw-automatic-setup" application="ctrl.application" conversation-name="ctrl.conversationName" finish-button-disabled="ctrl.finishButtonDisabled" finish-button-loading="ctrl.finishButtonLoading" on-cancel="ctrl.onCancel()" on-finish="ctrl.sendFinishSignal()"> <dpw-set-up-app-view-content> <iframe ng-if="ctrl.iframeUrl" title="integrationIframe" class="dpw-automatic-setup-integration-iframe" width="100%" height="100%" sandbox="allow-scripts allow-popups allow-forms allow-same-origin" ng-src="{{ctrl.iframeUrl}}"></iframe> </dpw-set-up-app-view-content> <dpw-set-up-app-view-toggle> <a href="javascript:void(0)" class="dpw-set-up-app-toggle-mode-button" data-test-automation-id="set-up-app-toggle-mode-button" ng-click="ctrl.onToggleMode()"> Having trouble? Set up manually </a> </dpw-set-up-app-view-toggle> </div> </script> <script type="text/ng-template" id="dpw-manual-setup.component.html"> <div dpw-set-up-app-view="" class="dpw-manual-setup" application="ctrl.application" conversation-name="ctrl.conversationName" on-cancel="ctrl.onCancel()" on-finish="ctrl.onFinish()"> <dpw-set-up-app-view-content> <div class="dpw-manual-setup-instruction" ng-if="ctrl.embedHTML"> <div class="ql-container ql-snow"> <div class="ql-editor" ng-bind-html="ctrl.embedHTML"></div> </div> </div> </dpw-set-up-app-view-content> <dpw-set-up-app-view-toggle> <a href="javascript:void(0)" class="dpw-set-up-app-toggle-mode-button" data-test-automation-id="set-up-app-toggle-mode-button" ng-click="ctrl.onToggleMode()" ng-if="ctrl.isAutomaticSetupSupported"> Want to set this up automatically? Let's try it </a> </dpw-set-up-app-view-toggle> </div> </script> <script type="text/ng-template" id="dpw-set-up-app-view.directive.html"> <div class="dpw-set-up-app-view"> <div class="dpw-set-up-app-header"> <div class="dpw-set-up-app-title" data-test-automation-id="set-up-app-title"> Set up {{ application.displayName }} </div> <div class="dpw-set-up-app-selected-conversation"> <label for="dpw-set-up-app-selected-conversation-input" class="dpw-set-up-app-selected-conversation-label" data-test-automation-id="set-up-app-selected-conversation-label"> App will be added to: </label> <input type="text" id="dpw-set-up-app-selected-conversation-input" class="dpw-set-up-app-selected-conversation-input" data-test-automation-id="set-up-app-selected-conversation-input" value="{{ conversationName }}" readonly> </div> </div> <div class="dpw-set-up-app-content"> <div class="dpw-set-up-app-info"> <div class="dpw-set-up-app-icon" ng-if="application.iconUrl"> <img ng-src="{{ application.iconUrl }}?v=20241114-0953" alt="App icon" data-test-automation-id="set-up-app-icon"> </div> <div class="dpw-set-up-app-description" data-test-automation-id="set-up-app-description"> {{ application.description }} </div> </div> <div ng-transclude="content" class="dpw-set-up-app-view-content"></div> </div> <div class="dpw-set-up-app-actions"> <div ng-transclude="toggle" class="dpw-set-up-app-view-toggle"></div> <div class="dpw-set-up-app-button-group"> <button type="button" class="button button-with-border dpw-set-up-app-button dpw-set-up-app-button-cancel" data-test-automation-id="set-up-app-cancel-button" ng-click="onCancel()"> Cancel </button> <button type="button" class="button dpw-set-up-app-button dpw-set-up-app-button-finish" ng-class="{'button-disabled': finishButtonDisabled || finishButtonLoading, 'button-loading': finishButtonLoading}" data-test-automation-id="set-up-app-finish-button" ng-disabled="finishButtonDisabled || finishButtonLoading" ng-click="onFinish()"> {{ finishButtonLoading ? '' : 'Finish' }} </button> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-select-conversation.directive.html"> <div class="dpw-select-conversation"> <div class="dpw-select-conversation-header"> <div class="dpw-select-conversation-title"> Select a conversation to add <span title="{{ctrl.getAppName()}}">{{ctrl.getAppName()}}</span> </div> <button type="button" class="dpw-select-conversation-close-button" data-test-automation-id="select-conversation-close-button" ng-click="ctrl.onClose()"> × </button> </div> <div class="dpw-select-conversation-search-box"> <i class="icon-ico_search dpw-select-conversation-search-icon"></i> <input type="text" class="dpw-select-conversation-search-input fieldInputText" data-test-automation-id="select-conversation-search-input" ng-model="ctrl.searchText" placeholder="Type person or team name" autocomplete="off" ng-change="ctrl.onSearchTextChange()"> <button type="button" class="dpw-select-conversation-search-clear-button" data-test-automation-id="select-conversation-search-clear-button" ng-click="ctrl.clearSearchText()" ng-if="ctrl.searchText"> </button> </div> <div class="dpw-select-conversation-result"> <div class="dpw-select-conversation-result-title"> {{ctrl.getResultSectionTitle()}} </div> <div class="dpw-select-conversation-result-list" ng-if="ctrl.results.length > 0"> <div class="dpw-select-conversation-result-item" ng-repeat="conversation in ctrl.results" ng-click="ctrl.onSelect(conversation)"> <div class="dpw-select-conversation-result-item-icon" ng-class="{'dpw-select-conversation-result-item-person-icon': ctrl.isMeChat(conversation), 'dpw-select-conversation-result-item-team-icon': !ctrl.isMeChat(conversation)}"></div> <div class="dpw-select-conversation-result-item-name" title="{{conversation.name}}"> {{conversation.name}} </div> </div> </div> <div class="dpw-select-conversation-result-not-found" ng-if="ctrl.results.length === 0"> <div class="dpw-select-conversation-result-not-found-image"></div> <div class="dpw-select-conversation-result-not-found-tip"> No search results found </div> </div> </div> </div> </script> <script type="text/ng-template" id="dpw-set-up-app.directive.html"> <div class="dpw-set-up-app" ng-if="ctrl.webhookUrl"> <dpw-manual-setup ng-show="!ctrl.isAutomaticSetup" application="ctrl.app" conversation-name="ctrl.conversationName" is-automatic-setup-supported="ctrl.isAutomaticSetupSupported" instruction-url="ctrl.instructionUrl" webhook-url="ctrl.webhookUrl" on-toggle-mode="ctrl.onToggleMode()" on-cancel="ctrl.onCancel()" on-finish="ctrl.onFinish()"></dpw-manual-setup> <dpw-automatic-setup ng-if="ctrl.isAutomaticSetupSupported" ng-show="ctrl.isAutomaticSetup" application="ctrl.app" conversation-name="ctrl.conversationName" base-iframe-url="ctrl.iframeUrl" webhook-url="ctrl.webhookUrl" on-toggle-mode="ctrl.onToggleMode()" on-cancel="ctrl.onCancel()" on-finish="ctrl.onFinish()"></dpw-automatic-setup> </div> </script> <script type="text/ng-template" id="dpw-new-footer.html"> <div class="footer-wrapper footer"> <div class="content-wrapper"> <div class="footer-top-section"> <div class="new-footer-logo"> <a href="https://www.ringcentral.com" target="_blank" aria-label="RingCentral" rel="nofollow"> </a> </div> </div> <div class="footer-middle-section"> <div ng-repeat="item in footerCtrl.footerNavigationGroup" class="navigations"> <div class="title">{{item.title}}</div> <div class="item-list"> <div ng-repeat="navigation in item.content" class="item"> <a ng-href="{{navigation.href}}" ng-attr-target="{{footerCtrl.getTargetAttr(navigation)}}" ng-click="footerCtrl.onClick($event, navigation)" ng-hide="navigation.hidden" rel="nofollow">{{navigation.label}}</a> </div> </div> </div> </div> <div class="footer-bottom-section"> <div class="top-container"> <div class="icon-content"> <a ng-repeat="item in footerCtrl.iconLink" ng-href="{{item.href}}" target="_blank" rel="nofollow" ng-class="'icon-item-' + item.name" class="icon-item"> <img ng-src="{{item.icon}}?v=20241114-0953" alt="{{item.name}}"> </a> </div> <div> <a ng-href="{{footerCtrl.accessibilityIconLink.href}}" target="_blank" rel="nofollow"> <img ng-src="{{footerCtrl.accessibilityIconLink.icon}}?v=20241114-0953" alt="{{footerCtrl.accessibilityIconLink.name}}"> </a> </div> </div> <div class="bottom-container"> <div class="text-content"> <a ng-repeat="item in footerCtrl.textLink" ng-href="{{item.href}}" ng-attr-target="{{footerCtrl.getTargetAttr(item)}}" ng-click="footerCtrl.onTextLinkClick($event, item)" rel="nofollow" class="text-item"> {{item.label}} </a> </div> <span class="copyright"> © <span class="footer-copyright-to" ng-bind="::main.nowObj|date:'yyyy'"></span> RingCentral, Inc. All rights reserved. </span> </div> </div> </div> </div> </script> <div class="wholePageWrapper wholePageWrapper-api-reference" role="main" dpw-main="" ng-class="{'is-login': isLogin, 'is-logout': !isLogin, 'login-resolved': true}"> <div class="header"> <dpw-event-banner on-height-change="main.apiRefCommunicator.eventBanner.emitHeight(height)"></dpw-event-banner> <div dpw-header=""></div> </div> <div class="main main-api-reference"> <section class="dpw-api-explorer" id="hub-content"></section> <div class="dpw-api-reference-es6-not-supported"> <div class="pageTitle">This version of %browserName% is no longer supported</div> <div class="text">Please upgrade to a newer version <br> or switch to a different browser.</div> </div> </div> <div class="modal" id="modal"> <div> <div class="modal-wrap"> <div class="modal-main"> <div class="modal-header"> <button id="modalDismiss" class="modal-dismiss">×</button> <div class="modal-title" id="modalTitle">Sorry!</div> <div class="modal-sub-title"></div> </div> <div class="modal-content" id="modalContent"> Sorry, your request cannot be submitted at this moment. Please try again later. If the problem still exists, please <a href="https://success.ringcentral.com/RCContactSupp" target="_blank">Contact Support</a>. </div> <div class="modal-ok-btn-row"> <div class="modal-ok-btn"> <span class="modal-ok-btn-text"></span> </div> </div> <div class="modal-footer"></div> </div> </div> <div class="modal-background" id="modalOverlay"></div> </div> </div> <div class="preloader" id="preloader"> <div class="preloader-background"></div> <div class="preloader-loading"> <div class="preloader-loading-loader"></div> <div class="preloader-loading-message">Please wait...</div> </div> </div> <div class="ie8-depressed-prompt" style="display: none"> <img src="/assets/images/alert-icon.png?v=20241114-0953" class="v-middle"> <span class="v-middle">This version of browser is no longer supported. Please upgrade to the latest version.</span> </div> </div> <script> (function () { // @see https://www.bram.us/2016/10/31/checking-if-a-browser-supports-es6/ var supportsES6 = (function () { try { new Function('(a = 0) => a'); new URLSearchParams(); return true; } catch (err) { return false; } })(); /** * Browser detection * @see https://stackoverflow.com/a/9851769/5706588 */ // Internet Explorer 6-11 var isIE = /*@cc_on!@*/false || !!document.documentMode; // Edge 20+ var isEdge = !isIE && !!window.StyleMedia; var browserName = isIE ? 'Internet Explorer' : (isEdge ? 'Microsoft Edge' : 'browser'); if (supportsES6) { var scriptElement = document.createElement('script'); scriptElement.setAttribute('data-ot-ignore', ''); scriptElement.src = 'assets/api-reference/api-reference.bundle.js?v=20241114-0953'; document.body.appendChild(scriptElement); } else { var warningElement = document.querySelector('.dpw-api-reference-es6-not-supported'); warningElement.innerHTML = warningElement.innerHTML.replace(new RegExp('%browserName%', 'g'), browserName); warningElement.style.display = 'flex'; } })(); </script> <script> $(document).ready(function () { if (/^#!/.test(location.hash)) { location.hash = ''; } RCDPW.Angular.setAppName('dpwApiExplorer'); RCDPW.Angular.buildModule('main') .config(['$locationProvider', function ($locationProvider) { $locationProvider.html5Mode({enabled: true, rewriteLinks: false}).hashPrefix('!'); }]); }); </script> <script> $(document).ready(function () { RCDPW.version = '20241114-0953'; RCDPW.bootstrap({ pageName: 'API Reference' }); RCDPW.Angular.bootstrap(); //refactor }); </script> </body> </html>