1!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{};e.SENTRY_RELEASE={id:"qs3-webapp@61baa86f"};var t=(new e.Error).stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="3cbb0753-6f27-4050-a422-45d8132627d1",e._sentryDebugIdIdentifier="sentry-dbid-3cbb0753-6f27-4050-a422-45d8132627d1")}catch(e){}}(),(globalThis.webpackChunkqs3_webapp=globalThis.webpackChunkqs3_webapp||[]).push([[5395],{2756(e){e.exports='<div class="modal-header"> <h3 class="modal-title" ng-i18next="MINDBODY Integration Details"></h3> </div> <div class="modal-body account-settings-module"> <h3> <i ng-if="integration.metadata.status==\'activated\'" class="fa fa-check-circle-o green" aria-hidden="true"></i> <i ng-if="integration.metadata.status!=\'activated\'" class="fa fa-circle-o" aria-hidden="true"></i> <span ng-i18next="Step 1: Activate the Connection"></span> </h3> <div ng-if="integration.metadata.status!=\'activated\'"> Please cilck the <a target="_blank" href="{{integration.metadata.activation_link}}">link ({{integration.metadata.activation_link}})</a> to activate the connection. <br/><br/> Click the "Sync Connection" button to validate the connection has been activated. </div> <h3> <i ng-if="fieldFound(integration.metadata.waiver_name_field_id) && fieldFound(integration.metadata.waiver_link_field_id) && fieldFound(integration.metadata.waiver_date_field_id)" class="fa fa-check-circle-o green" aria-hidden="true"></i> <i ng-if="!fieldFound(integration.metadata.waiver_name_field_id) || !fieldFound(integration.metadata.waiver_link_field_id) || !fieldFound(integration.metadata.waiver_date_field_id)" class="fa fa-circle-o" aria-hidden="true"></i> <span ng-i18next="Step 2: Setup Client Profile Custom Fields"></span> </h3> <div ng-if="!fieldFound(integration.metadata.waiver_name_field_id) || !fieldFound(integration.metadata.waiver_link_field_id) || !fieldFound(integration.metadata.waiver_date_field_id)"> In order to save the waiver info to your clients in MINDBODY, please follow <a target="_blank" href="https://help.waiverforever.com/hc/en-us/articles/360041273214">our guide to create the following 3 custom fields</a> in MINDBODY. <br/><br/> Click the "Sync Connection" button to validate the custom fields setup. <br/><br/> </div> <div> <i ng-if="fieldFound(integration.metadata.waiver_name_field_id)" class="fa fa-check-circle-o green" aria-hidden="true"></i> <i ng-if="!fieldFound(integration.metadata.waiver_name_field_id)" class="fa fa-circle-o" aria-hidden="true"></i> <span ng-i18next="Waiver Name Field"></span> </div> <div> <i ng-if="fieldFound(integration.metadata.waiver_link_field_id)" class="fa fa-check-circle-o green" aria-hidden="true"></i> <i ng-if="!fieldFound(integration.metadata.waiver_link_field_id)" class="fa fa-circle-o" aria-hidden="true"></i> <span ng-i18next="Waiver Link Field"></span> </div> <div> <i ng-if="fieldFound(integration.metadata.waiver_date_field_id)" class="fa fa-check-circle-o green" aria-hidden="true"></i> <i ng-if="!fieldFound(integration.metadata.waiver_date_field_id)" class="fa fa-circle-o" aria-hidden="true"></i> <span ng-i18next="Waiver Signed Time Field"></span> </div> <h3 ng-i18next="Step 3 (Optional): Enable Auto Client Creation"> </h3> <div ng-i18next="If you would like WaiverForever to create new clients in MINDBODY using the info from their waivers, you can turn this feature on for each template individually. Visit the integration section in your template settings."> </div> <br/><br/> <div class="text-center"> <span class="wf-button" ng-click="syncConnection()" ng-class="{disabled: isTesting}"> <i ng-if="isTesting" class="fa fa-spinner fa-pulse" aria-hidden="true"></i> <span ng-i18next="Sync Connection"></span> </span> </div> <br/> </div> <div class="modal-footer"> <span class="wf-button-secondary" ng-click="cancel()" ng-i18next="Dismiss"> </span> </div> '},3074(e){e.exports='<div class="export-modal-container"> <h3 class="modal-title" ng-i18next="Export by Date"></h3> <label class="date-picker-container"> <span class="picker-label" ng-i18next="Please select date range:"></span> <input date-range-picker clearable="true" class="wf-input wf-daterange-input wf-block" type="text" ng-model="vm.date" ng-i18next="[placeholder]Select a date range" options="vm.dateRangePickerOptions"/> </label> <div class="date-options-container"> <button ng-repeat="month in vm.monthPresets" class="wf-button-secondary-small" ng-click="vm.usePreset(month.date)"> {{month.label}} </button> </div> <div class="buttons-container"> <button class="wf-button-secondary" ng-i18next="Cancel" ng-click="vm.cancel()"></button> <button class="wf-button" ng-i18next="Export as PDF" ng-click="vm.export(\'pdf\')"></button> <button class="wf-button" ng-i18next="Export as CSV" ng-click="vm.export(\'csv\')"></button> </div> </div> '},4215(){angular.module("waiverforeverApp.accountSettings").controller("AccountSettingsSecurityController",["$scope","$uibModal","$timeout","Upload","WFApiClient","premiumMod
1alHelper",function(e,t,i,n,a,o){e.isTogglingPdfSign=!1,e.isUploadingPDF=!1,e.PDFValidationResult="",e.togglePdfSign=function(){if(!e.accountSettings.pdfSignAvailable)return o.open({featureKey:"Apply digital signature to PDFs",featureName:i18next.t("Apply digital signature to PDFs"),description:i18next.t("Not just a signature. But digitally signed with a certificate to prevent data forgery."),videoId:"813107263",source:"pdf-sign"});e.isTogglingPdfSign=!0,a.post("accountSettings/togglePdfSign",{}).then(function(t){if(e.isTogglingPdfSign=!1,t.data.result){var i=t.data.success;e.accountSettings.pdfSignEnabled=i.pdfSignEnabled}})},e.upload=function(t){t&&(e.isUploadingPDF=!0,e.PDFValidationResult="",n.upload({url:`${a.getBaseUrl()}utilities/validatePdf`,data:{pdf:t}}).then(function(t){e.isUploadingPDF=!1;let i=t.data.success.result;"NotSigned"===t.data.success.result&&(i=i18next.t("This PDF does not contain a digital signature.")),"Invalid"===t.data.success.result&&(i=i18next.t("This PDF does not contain a valid signature.")),"Valid"===t.data.success.result&&(i=i18next.t("This PDF is valid.")),e.PDFValidationResult=i18next.t("Validation result: {{message}}",{message:i})},function(t){e.isUploadingPDF=!1,e.PDFValidationResult=i18next.t("Validation error: {{errorMsg}}",{errorMsg:t.data.error})},function(e){var t=parseInt(100*e.loaded/e.total);console.log("progress: "+t+"% "+e.config.data.pdf.name)}))},e.resetUpload=()=>{e.PDFValidationResult=""}}])},10154(e){e.exports='<div class="modal-header"> <h3 class="modal-title" ng-i18next="Booker Integration Setup"></h3> </div> <div class="modal-body account-settings-module"> <p ng-i18next="[html]With our Booker integration, your customer\'s waiver info will be automatically uploaded to your Booker account.<br/>\n You can also enable <b>Auto Customer Creation</b> feature to automatically create new customers in Booker using the info from their waivers."> </p> <br/> <p ng-i18next="[html]In order to connect to your Booker account, we will need the Location ID of your business.<br/>\n You can find your Location ID in your booker web console\'s Location Info page."> </p> <div class="row wf-form"> <div class="col-xs-4 wf-form-title-inline" ng-i18next="Location ID"></div> <div class="col-md-8"> <input autofocus ng-model="context.locationId" class="wf-input wf-block" type="text" ng-change="locationIdChanged()" ng-i18next="[placeholder]Your Booker Location ID"/> </div> </div> <div ng-if="errorMessage" class="alert alert-warning">{{context.errorMessage}}</div> <hr/> <p class="integration-charge-info"> * Booker integration is charged separately at <b>$20 per month per location</b>.<br/> It\'s NOT free because booker (owned by MINDBODY) has extra charge for their site access via APIs. You can read more from <a target="_blank" href="https://developers.mindbodyonline.com/">their developer website</a>. </p> </div> <div class="modal-footer"> <span class="wf-button" ng-click="ok(context.locationId)" ng-class="{disabled: !context.locationId}" ng-i18next="Connect to my location"> </span> </div> '},11167(){angular.module("waiverforeverApp.accountSettings").controller("AccountSettingsCreateAppModalCtrl",["$scope","$uibModalInstance",function(e,t){e.app={name:"",description:""},e.ok=function(){if(e.errorMessage="",""!==e.app.name){var i={name:e.app.name,description:e.app.description};t.close(i)}else e.errorMessage=i18next.t("App name is required.")},e.cancel=function(){t.dismiss("cancel")}}])},13462(e){e.exports='<div class="export-modal-container"> <img class="close-button" src="/app/static/images/close.svg" ng-click="vm.close()"/> <img src="/app/static/images/waiverData/export-file.svg"/> <h3 class="modal-title" ng-i18next="Creating a zip file..."></h3> <p class="modal-info">{{vm.downloadText}}</p> <button class="wf-button ok-button" ng-i18next="OK" ng-click="vm.ok()"></button> </div> '},15470(e){e.exports='<div class="modal-header"> <h3 class="modal-title" ng-i18next="Booker Integration Details"></h3> </div> <div class="modal-body account-settings-module"> <h3> <i ng-if="integration.metadata.status==\'activated\'" class="fa fa-check-circle-o green" aria-hidden="true"></i> <i ng-if="integration.metadata.status!=\'activated\'" class="fa fa-circle-o" aria-hidden="true"></i> <span ng-i18next="Step 1: Activate the Connection"></span> </h3> <div ng-if="integration.metadata.status!=\'activated\'"> Please click this <a href="{{integration.metadata.oauth_link}}">Oauth link</a> to activate the connection. </div> <h3> <i ng-if="fieldFound(integration.metadata.waiver_name_field_id) && fieldFound(integration.metadata.waiver_link_field_id) && fieldFound(integration.metadata.waiver_date_field_id)" class="fa fa-check-circle-o green" aria-hidden="true"></i> <i ng-if="!fieldFound(integration.metadata.waiver_name_field_id) || !fieldFound(integration.metadata.waiver_link_field_id) || !fieldFound(integration.metadata.waiver_date_field_id)" class="fa fa-circle-o" aria-hidden="true"></i> <span ng-i18next="Step 2: Setup Customer Fields"></span> </h3> <div ng-if="!fieldFound(integration.metadata.waiver_name_field_id) || !fieldFound(integration.metadata.waiver_link_field_id) || !fieldFound(integration.metadata.waiver_date_field_id)"> In order to save the waiver info to your customers in booker, please follow <a target="_blank" href="https://help.waiverforever.com/hc/en-us/articles/360043390553">our guide to create the following 3 customer fields</a> in booker. <br/><br/> <span ng-if="integration.metadata.status==\'activated\'" ng-i18next=\'Click the "Sync Connection" button to validate the custom fields setup.\'></span> <br/><br/> </div> <div> <i ng-if="fieldFound(integration.metadata.waiver_name_field_id)" class="fa fa-check-circle-o green" aria-hidden="true"></i> <i ng-if="!fieldFound(integration.metadata.waiver_name_field_id)" class="fa fa-circle-o" aria-hidden="true"></i> <span ng-i18next="Waiver Name Field"></span> </div> <div> <i ng-if="fieldFound(integration.metadata.waiver_link_field_id)" class="fa fa-check-circle-o green" aria-hidden="true"></i> <i ng-if="!fieldFound(integration.metadata.waiver_link_field_id)" class="fa fa-circle-o" aria-hidden="true"></i> <span ng-i18next="Waiver Link Field"></span> </div> <div> <i ng-if="fieldFound(integration.metadata.waiver_date_field_id)" class="fa fa-check-circle-o green" aria-hidden="true"></i> <i ng-if="!fieldFound(integration.metadata.waiver_date_field_id)" class="fa fa-circle-o" aria-hidden="true"></i> <span ng-i18next="Waiver Signed Time Field"></span> </div> <h3 ng-i18next="Step 3 (Optional): Enable Auto Customer Creation"></h3> <div ng-i18next="If you would like WaiverForever to create new customers in Booker using the info from their waivers, you can turn this feature on for each template individually. Visit the integration section in your template settings."> </div> <br/><br/> <div class="text-center" ng-if="integration.metadata.status==\'activated\'"> <span class="wf-button" ng-click="syncConnection()" ng-class="{disabled: isTesting}"> <i ng-if="isTesting" class="fa fa-spinner fa-pulse" aria-hidden="true"></i> <span ng-i18next="Sync Connection"></span> </span> </div> <br/> </div> <div class="modal-footer"> <span class="wf-button-secondary" ng-click="cancel()" ng-i18next="Dismiss"> </span> </div> '},20086(e,t,i){"use strict";function n(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const t=e.marketplace||"global",i=e.language||"en";if("china"===t)return"zh_cn";if("global"===t){return{en:"en_us",es:"es"}[i]||"en_us"}return"en_us"}i.d(t,{A:()=>n})},22679(e){e.exports='<div class="modal-header"> <h3 class="modal-title" ng-i18next="Create API Application"></h3> </div> <div class="modal-body account-settings-module"> <div class="row wf-form"> <div class="col-xs-4 wf-form-title-inline" ng-i18next="App Name"></div> <div class="col-md-8"> <input autofocus ng-model="app.name" class="wf-input wf-block" type="text" ng-i18next="[placeholder]App Name"/> </div> </div> <div class="row wf-form"> <div class="col-xs-4 wf-form-title-inline" ng-i18next="App Description"> </div> <div class="col-md-8"> <input ng-model="app.description" class="wf-input wf-block" type="text" ng-i18next="[placeholder]App Description"/> </div> </div> <div ng-if="errorMessage" class="alert alert-warning">{{errorMessage}}</div> </div> <div class="modal-footer"> <span class="wf-button-secondary" ng-click="cancel()" ng-i18next="Cancel"></span> <span class="wf-button" ng-click="ok()" ng-i18next="Create"></span> </div> '},26121(e,t,i){angular.module("waiverforeverApp.accountSettings").controller("AccountSettingsTeamUsersController",["$scope","$uibModal","$timeout","Confirmation","$state","WFApiClient","premiumMod
1alHelper",function(e,t,n,a,o,s,l){e.isLoadingSubAdmins=!1,e.subAdmins=[],e.subAdminLimitation=0,e.templates=[],e.perPage=20,e.page=1,e.total=0,e.maxPage=0,e.getPaginationText=function(){const{total:t,perPage:i,page:n}=e;return t<=i?`1-${t} of ${t}`:`${1+i*(n-1)}-${Math.min(i*n,t)} of ${t}`},e.getSubAdmins=function(){e.isLoadingSubAdmins=!0,s.get(`accountSettings/getSubAdmins?perPage=${e.perPage}&page=${e.page}`).then(function(t){if(t.data.result){var i=t.data.success;e.subAdmins=i.subAdmins,e.subAdminLimitation=i.subAdminLimitation,e.total=i.count,e.maxPage=Math.ceil(e.total/e.perPage)}}).finally(function(){e.isLoadingSubAdmins=!1})},e.getTemplates=function(){e.isLoadingTemplates=!0,s.get("waiverTemplate/getTemplates").then(function(t){if(t.data.result){var i=t.data.success;e.templates=i}}).finally(function(){e.isLoadingTemplates=!1})},e.openPremiumModal=function(){l.open({featureKey:"Team Users",featureName:i18next.t("Team Users"),videoId:"811401473",description:e=>{switch(e.name){case"business":return i18next.t("Team user limit reached. Upgrade to enable more team users");case"enterprise":return i18next.t("Please contact our support to get more team users");default:return i18next.t("Additional team members created by account owner with limited access control permissions.")}},includedInCurrentPlan:!0,source:"sub-account"})},e.createSubAdmin=function(t,i,n,o){e.isLoadingSubAdmins=!0,s.post("accountSettings/createSubAdmin",{username:t,human_name:i,password:n,permission_map:o}).then(function(t){t.data.result&&e.getSubAdmins()},function(t){if(400==t.status){var i=t.data.failed;"Team user limit reached."==i||"User limit reached."===i?e.openPremiumModal():a.confirm({title:i18next.t("Create Team User Failed"),message:i,hideCancel:!0})}}).finally(function(){e.isLoadingSubAdmins=!1})},e.updateSubAdmin=function(t,i,n,a){e.isLoadingSubAdmins=!0,s.post("accountSettings/updateSubAdmin",{username:t,human_name:i,password:n,permission_map:a}).then(function(t){t.data.result&&e.getSubAdmins()}).finally(function(){e.isLoadingSubAdmins=!1})},e.deleteSubAdmin=function(t){e.isLoadingSubAdmins=!0,s.post("accountSettings/deleteSubAdmin",{username:t}).then(function(t){t.data.result&&e.getSubAdmins()}).finally(function(){e.isLoadingSubAdmins=!1})},e.createNewSubAdmin=function(){if(0===e.subAdminLimitation||e.subAdmins.length>=e.subAdminLimitation)return e.openPremiumModal();t.open({animation:!0,template:i(79637),controller:"AccountSettingsCreateAdminModalCtrl",size:"md",resolve:{admin:function(){return null},templates:function(){return angular.copy(e.templates)}}}).result.then(function(t){e.createSubAdmin(t.username,t.humanName,t.password,t.permissionMap)},function(){})},e.updateSubAdminInfo=function(n){t.open({animation:!0,template:i(79637),controller:"AccountSettingsCreateAdminModalCtrl",size:"md",resolve:{admin:function(){return angular.copy(n)},templates:function(){return angular.copy(e.templates)}}}).result.then(function(t){e.updateSubAdmin(t.username,t.humanName,t.password,t.permissionMap)},function(){})},e.deleteSubAdminConfirmation=function(t){a.confirm({title:i18next.t("Are you sure to delete this team user?"),message:i18next.t("Please confirm to delete team user: {{username}}<br>Please note: This email address will be removed from the verified email list. It will no longer receive notification emails or replies from your customers.",{username:t.username})}).then(function(){e.deleteSubAdmin(t.username)})},e.resendInvitation=function(e){s.post("accountSettings/createSubAdmin",{username:e.username,human_name:e.humanName,permission_map:e.permissionMap}).then(()=>{a.confirm({title:i18next.t("Team user invitation resent"),hideCancel:!0})})},e.changePage=function(t){e.page+=t,e.getSubAdmins()},e.authenticator.hasPermission(["admin_management"])&&(e.getSubAdmins(),e.getTemplates())}])},27052(e){e.exports='<div class="modal-header"> <h3 class="modal-title" ng-i18next="Edit Display Name"></h3> </div> <div class="modal-body"> <div class="row wf-form"> <div class="col-xs-12"> <input autofocus ng-model="newName" class="wf-input wf-block" type="text" ng-i18next="[placeholder]Display Name"/> </div> </div> </div> <div class="modal-footer"> <span ng-disabled="isUpdating" class="wf-button" ng-click="updateName()"> <span ng-if="isUpdating" ng-i18next="Updating..."></span> <span ng-if="!isUpdating" ng-i18next="Update"></span> </span> </div> '},30357(e){e.exports='<img class="close-button" src="/app/static/images/close.svg" alt="close button" ng-click="vm.dismiss()"/> <div class="acuity-modal-container"> <h2 class="title" ng-i18next="Acuity Integration Details"></h2> <h3 class="step-title"> <span ng-i18next="Step1"></span>: <span class="step-name" ng-i18next="Activate the Connection"></span> </h3> <ul class="step-list"> <li class="step-entry"> <div style="display:flex"> <span ng-i18next="Please click the link"></span> (<a class="acuity-connect-link" href="{{vm.acuityUrl}}" title="{{vm.acuityUrl}}" target="_blank">{{vm.acuityUrl}}</a>) <span ng-i18next="to activate the connection."></span> </div> </li> <li class="step-entry" ng-i18next="Click the Check Connection button to validate the connection has been activated."></li> </ul> <div ng-switch="vm.checkConnectionState"> <button class="wf-button-small" ng-switch-when="initial" ng-i18next="Check Connection" ng-click="vm.checkConnection()"></button> <button class="wf-button-small" ng-switch-when="failed" ng-i18next="Check Failed" ng-click="vm.checkConnection()"></button> <button class="wf-button-small" ng-switch-when="checking" ng-i18next="Checking ..."></button> <button class="wf-button-small" ng-switch-when="success" ng-i18next="Success"></button> </div> <h3 class="step-title"> <span ng-i18next="Step2"></span>: <span class="step-name" ng-i18next="Add UserID and API Credentials"></span> </h3> <ul class="step-list"> <li class="step-entry"> <span ng-i18next="Please find your API credentials in Acuity under Integrations"></span> </li> <li class="api-credentials"> <div> <label> <span ng-i18next="User ID:"></span> <input class="wf-input" type="text" ng-model="vm.userId" placeholder="{{\'Your Acuity User ID\' | i18next}}"/> </label> </div> <div> <label> <span ng-i18next="API Credentials:"></span> <input class="wf-input" type="text" ng-model="vm.apiKey" placeholder="{{\'Your Acuity API Credentials\' | i18next}}"/> </label> </div> </li> <div> <button class="wf-button-small" ng-click="vm.saveApiKey()" ng-i18next="Save"></button> </div> </ul> <h3 class="step-title"> <span ng-i18next="Step3"></span>: <span class="step-name" ng-i18next="Add a new option called WaiverForeverLink"></span> </h3> <ul class="step-list"> <li class="step-entry"> <div> <span ng-i18next="[html]In Acuity, Go to Intake Form Questions, create a new form called <b>WaiverForeverLink</b>."></span> <span ng-i18next=\'[html]Add a Textbox Field into the form, name the textbox as "<b>WaiverForeverLink</b>", set the size as Large.\'></span> <span ng-i18next="[html]Select Internal Use Only, select corresponding appointment types. Click save Form."></span> </div> </li> <li class="step-entry" ng-i18next="Click the Check Option button to validate the option has been correctly added."></li> </ul> <div ng-switch="vm.checkOptionState"> <button class="wf-button-small" ng-switch-when="initial" ng-i18next="Check Option" ng-click="vm.checkOptions()"></button> <button class="wf-button-small" ng-switch-when="failed" ng-i18next="Check Failed" ng-click="vm.checkOptions()"></button> <button class="wf-button-small" ng-switch-when="checking" ng-i18next="Checking ..."></button> <button class="wf-button-small" ng-switch-when="success" ng-i18next="Success"></button> </div> <div class="error-message" ng-if="vm.error">{{vm.error}}</div> <h3 class="step-title"> <span ng-i18next="Step4"></span>: <span class="step-name" ng-i18next="Select the template to connect with Acuity"></span> </h3> <ul class="step-list"> <li class="step-entry" ng-i18next="Select the template you want to connect with Acuity, go to its template setting - integration, scroll down to Acuity and link the service you want."></li> </ul> <a class="help-center-link" href="https://help.waiverforever.com/hc/en-us/articles/40642259841811-Integration-Acuity-and-WaiverForever" ng-i18next="Click here to read the complete Acuity and WaiverForever Integration guide"></a> <button class="wf-button-secondary-small dismiss-button" ng-i18next="Dismiss" ng-click="vm.dismiss()"></button> </div> '},42340(e){e.exports='<div class="modal-header"> <h3 class="modal-title" ng-i18next="MINDBODY Integration Setup"></h3> </div> <div class="modal-body account-settings-module"> <p ng-i18next="[html]With our MINDBODY integration, your customer\'s waiver file and waiver info will be automatically uploaded to your MINDOBODY account.<br/>\n You can also enable <b>Auto Client Creation</b> feature to automatically create new clients in MINDOBODY using the info from their waivers."> </p> <br/> <p> In order to connect to your MINDBODY account, we will need the site ID of your business.<br/> You can find your site ID at the bottom right corner of your MINDBODY site. <br/> Please refer to this <a target="_blank" href="https://support.mindbodyonline.com/s/article/206398178-How-do-I-find-my-Client-ID?language=en_US">MINDBODY help article</a> for up-to-date info. </p> <div class="row wf-form"> <div class="col-xs-4 wf-form-title-inline" ng-i18next="Site ID"></div> <div class="col-md-8"> <input autofocus ng-model="context.siteId" class="wf-input wf-block" type="text" ng-i18next="[placeholder]Your MINDBODY Site ID"/> </div> </div> <div ng-if="context.errorMessage" class="alert alert-warning">{{context.errorMessage}}</div> <hr/> <p class="integration-charge-info"> * MINDBODY integration is charged separately at <b>$20 per month per location</b>.<br/> It\'s NOT free because MINDBODY has extra charge for their site access via APIs. You can read more from <a target="_blank" href="https://developers.mindbodyonline.com/">their developer website</a>. </p> </div> <div class="modal-footer"> <span class="wf-button" ng-click="ok(context.siteId)" ng-class="{disabled: !context.siteId}" ng-i18next="Connect to my site"></span> </div> '},42964(e){e.exports='<div class="modal-header"> <h3 class="modal-title" ng-i18next="Update Profile"></h3> </div> <form name="updateProfileForm" class="modal-body"> <div class="row wf-form"> <div class="col-xs-4 wf-form-title-inline">
1 <span ng-i18next="Business Name"></span> <span class="required-asterisk">*</span> </div> <div class="col-xs-8"> <input ng-model="profile.company_name" class="wf-input wf-block" type="text" ng-i18next="[placeholder]Business Name"/> </div> </div> <div class="row wf-form"> <div class="col-xs-4 wf-form-title-inline"> <span ng-i18next="Business Size"></span> <span class="required-asterisk">*</span> </div> <div class="col-xs-8"> <select ng-model="profile.company_size" class="wf-input wf-block" required> <option value="Just me" ng-i18next="Just me"></option> <option value="2-5"> 2-5 </option> <option value="6-10"> 6-10 </option> <option value="11-20"> 11-20 </option> <option value="21-50"> 21-50 </option> <option value="51-100"> 51-100 </option> <option value="101-500"> 101-500 </option> <option value=">500"> >500 </option> </select> </div> </div> <div class="row wf-form"> <div class="col-xs-4 wf-form-title-inline"> <span ng-i18next="Business Industry"></span> <span class="required-asterisk">*</span> </div> <div class="col-xs-8"> <select ng-model="profile.company_industry" class="wf-input wf-block" required> <option value="Fitness and Health" ng-i18next="Fitness and Health"></option> <option value="Beauty and Personal Care" ng-i18next="Beauty and Personal Care"></option> <option value="Sports and Recreation" ng-i18next="Sports and Recreation"></option> <option value="Tattoo and Body Piercing" ng-i18next="Tattoo and Body Piercing"></option> <option value="Entertainment and Events" ng-i18next="Entertainment and Events"></option> <option value="Education and Training" ng-i18next="Education and Training"></option> <option value="Travel and Hospitality" ng-i18next="Travel and Hospitality"></option> <option value="Automotive Services" ng-i18next="Automotive Services"></option> <option value="Non-profit and Community Services" ng-i18next="Non-profit and Community Services"></option> <option value="Retail and Consumer Goods" ng-i18next="Retail and Consumer Goods"></option> <option value="Pets" ng-i18next="Pets"></option> <option value="Construction and Real Estate" ng-i18next="Construction and Real Estate"></option> <option value="Technology and IT" ng-i18next="Technology and IT"></option> <option value="Arts and Crafts" ng-i18next="Arts and Crafts"></option> <option value="Other" ng-i18next="Other"></option> </select> </div> </div> <div class="row wf-form"> <div class="col-xs-4 wf-form-title-inline"> <span ng-i18next="Phone Number"></span> <span class="required-asterisk">*</span> </div> <div class="col-xs-8"> <input ng-model="profile.phone_number" class="wf-input wf-block" type="text" ng-i18next="[placeholder]Phone Number" required/> </div> </div> <div class="row wf-form"> <div class="col-xs-4 wf-form-title-inline"> <span ng-i18next="Business Email"></span> <span class="required-asterisk">*</span> </div> <div class="col-xs-8"> <input ng-model="profile.email" class="wf-input wf-block" type="email" ng-i18next="[placeholder]Email" required/> </div> </div> <div class="row wf-form"> <div class="col-xs-4 wf-form-title-inline" ng-i18next="Contact Name"></div> <div class="col-xs-8"> <input autofocus ng-model="profile.human_name" class="wf-input wf-block" type="text" ng-i18next="[placeholder]Contact"/> </div> </div> <div class="row wf-form"> <div class="col-xs-4 wf-form-title-inline" ng-i18next="Business Address"></div> <div class="col-xs-8"> <input ng-model="profile.company_address.address1" class="wf-input wf-block" type="text" ng-i18next="[placeholder]Address Line 1"/> <input ng-model="profile.company_address.address2" class="wf-input wf-block" type="text" ng-i18next="[placeholder]Address Line 2"/> <input style="width:30%;display:inline-block" ng-model="profile.company_address.city" class="wf-input" type="text" ng-i18next="[placeholder]City"/> <input style="width:35%;display:inline-block" ng-model="profile.company_address.state" class="wf-input" type="text" ng-i18next="[placeholder]State/Province"/> <input style="width:30%;display:inline-block" ng-model="profile.company_address.country" class="wf-input" type="text" ng-i18next="[placeholder]Country"/> <input style="width:50%" ng-model="profile.company_address.zipcode" class="wf-input" type="text" ng-i18next="[placeholder]ZIP code/Postal code"/> </div> </div> <div ng-if="errorMessage" class="alert alert-warning">{{errorMessage}}</div> <a href="https://help.waiverforever.com/hc/en-us/articles/33926801939603-How-Your-Business-Information-Will-Be-Presented-to-Your-Customers" target="_blank" class="row wf-form help-center-link" ng-i18next="Check how your business information will be presented to your customers"></a> </form> <div class="modal-footer"> <span class="wf-button-secondary" ng-click="cancel()" ng-i18next="Cancel"></span> <span class="wf-button" ng-click="ok()" ng-i18next="Update" ng-disabled="!updateProfileForm.$valid"></span> </div> '},63501(e,t,i){var n=i(62409);angular.module("waiverforeverApp.accountSettings").controller("AccountSettingsIntegrationsController",["$scope","$state","$uibModal","$timeout","Confirmation","$location","WFApiClient","premiumMod
1alHelper","toastr","$transition$",function(e,t,a,o,s,l,c,r,d,u){e.isTogglingMailchimp=!1,e.isTogglingConstantContact=!1,e.isTogglingDropbox=!1,e.integrationLimitationDataLoaded=!1,e.isTogglingGoogleDrive=!1,e.isTogglingEmailPush=!1,e.isTogglingSquare=!1,e.isUpdatingApps=!1,e.apps=[],e.isLoadingIntegrations=!1,e.shouldOpenBookerDetail=!1,e.TABS={APPS:"apps",ZAPIER:"zapier"},e.currentTab=e.TABS.APPS,e.integrations={mindbody:{title:"MINDBODY",link:"https://help.waiverforever.com/hc/en-us/articles/9990267545235-Integration-Mindbody-and-WaiverForever",logo:"mindbody.png",paymentRequired:!0,details:()=>{var t=a.open({animation:!0,template:i(2756),resolve:{integration:function(){return e.integrations.mindbody}},controller:["$scope","$uibModalInstance","integration",(e,t,i)=>{e.integration=i,e.isTesting=!1,e.fieldFound=e=>!!(e&&parseInt(e)>0),e.syncConnection=()=>{e.isTesting=!0;c.post("accountSettings/updateIntegration",{platform:"mindbody",action:"syncConfigurations"}).then(function(t){t.data.result&&(e.integration.enabled="enabled"===t.data.success.status,e.integration.metadata=t.data.success.metadata)}).finally(()=>{e.isTesting=!1})},e.cancel=function(){t.dismiss("cancel")},e.syncConnection()}],size:"md"});t.result.then(function(){},function(){})},info:{enabled:i18next.t("To enable Auto Client Creation, please go to template settings."),disabled:i18next.t("Enable MINDBODY integration to automatically upload waivers and create clients.")},enabled:!1,isToggling:!1,extraPayload:e=>{if("enable"===e){var t=a.open({animation:!0,template:i(42340),controller:["$scope","$uibModalInstance",(e,t)=>{e.context={siteId:"",errorMessage:""},e.cancel=function(){t.dismiss("cancel")},e.ok=i=>{const n=null==i?"":String(i).trim();/^-?\d+$/.test(n)?t.close(n):e.context.errorMessage=i18next.t("Invalid site ID.")}}],size:"md"});return t.result.then(function(e){return Promise.resolve({action:"enableWithSiteId",payload:{site_id:e}})},function(){return Promise.reject()})}return"disable"===e?s.confirm({title:i18next.t("Disable MINDBODY Integration"),message:i18next.t("You are about to turn off your MINDBODY integration. Please confirm.<br/><br/>For better security, you should also revoke our access to your MINDBODY account from MINDBODY."),confirm:i18next.t("Confirm"),cancel:i18next.t("Cancel")}).then(function(){return Promise.resolve()}):Promise.resolve()},callback:t=>{"enabled"===t&&e.showIntegrationDetails(e.integrations.mindbody)}},booker:{title:"Booker",link:"https://help.waiverforever.com/hc/en-us/articles/9990269107859-Integration-Booker-and-WaiverForever",logo:"booker.png",paymentRequired:!0,details:()=>{var t=a.open({animation:!0,template:i(15470),resolve:{integration:function(){return e.integrations.booker}},controller:["$scope","$uibModalInstance","integration",(e,t,i)=>{e.integration=i,e.isTesting=!1,e.fieldFound=e=>!!(e&&parseInt(e)>0),e.syncConnection=()=>{e.isTesting=!0;c.post("accountSettings/updateIntegration",{platform:"booker",action:"syncConfigurations"}).then(function(t){t.data.result&&(e.integration.enabled="enabled"===t.data.success.status,e.integration.metadata=t.data.success.metadata)}).finally(()=>{e.isTesting=!1})},e.cancel=function(){t.dismiss("cancel")},"activated"==e.integration.metadata.status&&e.syncConnection()}],size:"md"});t.result.then(function(){},function(){})},info:{enabled:i18next.t("To enable Auto Customer Creation, please go to template settings."),disabled:i18next.t("Enable Booker integration to automatically upload waivers and create customers.")},enabled:!1,isToggling:!1,extraPayload:e=>{if("enable"===e){var t=a.open({animation:!0,template:i(10154),controller:["$scope","$uibModalInstance",(e,t)=>{e.context={locationId:"",errorMessage:""},e.cancel=function(){t.dismiss("cancel")},e.ok=i=>{isNaN(parseInt(i))?e.context.errorMessage="Invalid location ID.":t.close(`${parseInt(i)}`)},e.locationIdChanged=()=>{isNaN(parseInt(e.context.locationId))?e.context.locationId="":e.context.locationId=parseInt(e.context.locationId)}}],size:"md"});return t.result.then(function(e){return Promise.resolve({action:"enableWithLocationId",payload:{location_id:e}})},function(){return Promise.reject()})}return"disable"===e?s.confirm({title:i18next.t("Disable Booker Integration"),message:i18next.t("You are about to turn off your Booker integration. Please confirm.<br/><br/>For better security, you should also revoke our access to your Booker account from Booker."),confirm:i18next.t("Confirm"),cancel:i18next.t("Cancel")}).then(function(){return Promise.resolve()}):Promise.resolve()},callback:t=>
1{"enabled"===t&&e.showIntegrationDetails(e.integrations.booker)}},bookeo:{title:"Bookeo",link:"https://help.waiverforever.com/hc/en-us/articles/26628029055379-Bookeo-Help-Center-Ariticle",logo:"bookeo.svg",paymentRequired:!0,details:!0,info:{enabled:i18next.t("When a customer makes a booking through Bookeo, WaiverForever will automatically send a request sign email."),disabled:i18next.t("When a customer makes a booking through Bookeo, WaiverForever will automatically send a request sign email.")},enabled:!1,isToggling:!1,extraPayload:e=>Promise.resolve(),callback:e=>{}},hubspot:{title:"HubSpot",link:"https://help.waiverforever.com/hc/en-us/articles/26628029055379-Bookeo-Help-Center-Ariticle",logo:"hubspot.svg",paymentRequired:!0,details:!0,info:{enabled:i18next.t("Enable Hubspot integration to automatically create contacts and upload waivers."),disabled:i18next.t("Enable Hubspot integration to automatically create contacts and upload waivers.")},enabled:!1,isToggling:!1,extraPayload:e=>Promise.resolve(),callback:e=>{}},acuity:{title:"Acuity",link:"https://help.waiverforever.com/hc/en-us/articles/40642259841811-Integration-Acuity-and-WaiverForever",logo:"acuity.png",paymentRequired:!0,details:!0,info:{enabled:i18next.t("Enable Acuity integration to automatically create contacts and upload waivers."),disabled:i18next.t("Enable Acuity integration to automatically create contacts and upload waivers.")},enabled:!1,isToggling:!1,extraPayload:e=>Promise.resolve(),callback:e=>{}}},e.goTab=function(t){e.currentTab=t},e.copyZapierKey=function(){navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(e.zapierKey()).then(()=>d.success(i18next.t("Copied to clipboard!"))):d.error(i18next.t("Clipboard API is not available"))},e.getCurrentIntegrations=function(){var t=0;return e.accountSettings.mailchimp.enabled&&t++,e.accountSettings.constantContact.enabled&&t++,e.accountSettings.dropbox.enabled&&t++,e.accountSettings.emailPush.enabled&&t++,e.accountSettings.square.enabled&&t++,e.apps.find(e=>"zapier"===e.type)&&t++,t+=Object.values(e.integrations).filter(e=>e.enabled).length},e.integrationCountText=function(){return e.accountSettings&&e.accountSettings.integrationLimitation?-1===e.accountSettings.integrationLimitation||e.accountSettings.integrationLimitation>=999?i18next.t("Unlimited"):e.accountSettings.integrationLimitation:""},e.validateIntegrationLimitation=function(){if(e.integrationLimitationDataLoaded){if(-1===e.accountSettings.integrationLimitation)return!0;if(e.getCurrentIntegrations()+1>e.accountSettings.integrationLimitation)return r.open({featureKey:"WaiverForever Apps",featureName:i18next.t("WaiverForever Apps"),description:i18next.t("Integration limit reached. You have enabled {{currentIntegrations}} of {{integrationLimitation}} integration(s). Upgrade to enable more integrations",{currentIntegrations:e.getCurrentIntegrations(),integrationLimitation:e.accountSettings.integrationLimitation}),includedInCurrentPlan:!0,source:"integration"}),!1}return!0},e.linkMailchimp=function(){e.validateIntegrationLimitation()&&(e.isTogglingMailchimp=!0,window.location.href=e.accountSettings.mailchimp.authorize_uri)},e.linkConstantContact=function(){e.validateIntegrationLimitation()&&(e.isTogglingConstantContact=!0,window.location.href=e.accountSettings.constantContact.authorize_uri)},e.linkDropbox=function(){e.validateIntegrationLimitation()&&(e.isTogglingDropbox=!0,window.location.href=e.accountSettings.dropbox.authorize_uri)},e.linkGoogleDrive=function(){e.validateIntegrationLimitation()&&(e.isTogglingGoogleDrive=!0,window.location.href=e.accountSettings.google_drive.authorize_uri)},e.linkConstantContactStep2=function(t,i){e.isTogglingConstantContact=!0,c.post("accountSettings/linkConstantContact",{access_token:t,expires_in:i}).then(function(t){t.data.result&&(e.accountSettings.constantContact.enabled=!0,l.url(l.path()))}).finally(function(){e.isTogglingConstantContact=!1})},e.toggleMailchimp=function(){e.isTogglingMailchimp||(e.accountSettings.mailchimp.enabled?e.unlinkMailchimp():e.linkMailchimp())},e.unlinkMailchimp=function(){e.isTogglingMailchimp=!0,c.post("accountSettings/unlinkMailchimp").then(function(t){t.data.result&&(e.accountSettings.mailchimp.enabled=!1)}).finally(function(){e.isTogglingMailchimp=!1})},e.toggleDropbox=function(){e.isTogglingDropbox||(e.accountSettings.dropbox.enabled?e.unlinkDropbox():e.linkDropbox())},e.unlinkDropbox=function(){e.isTogglingDropbox=!0,c.post("accountSettings/unlinkDropbox").then(function(t){t.data.result&&(e.accountSettings.dropbox.enabled=!1)}).finally(function(){e.isTogglingDropbox=!1})},e.toggleGoogleDrive=function(){e.isTogglingGoogleDrive||(e.accountSettings.google_drive.enabled?e.unlinkGoogleDrive():e.linkGoogleDrive())},e.unlinkGoogleDrive=function(){e.isTogglingGoogleDrive=!0,c.post("accountSettings/unlinkGoogleDrive").then(function(t){t.data.result&&(e.accountSettings.google_drive.enabled=!1)}).finally(function(){e.isTogglingGoogleDrive=!1})},e.toggleConstantContact=function(){e.isTogglingConstantContact||(e.accountSettings.constantContact.enabled?e.unlinkConstantContact():e.linkConstantContact())},e.unlinkConstantContact=function(){e.isTogglingConstantContact=!0,c.post("accountSettings/unlinkConstantContact").then(function(t){t.data.result&&(e.accountSettings.constantContact.enabled=!1)}).finally(function(){e.isTogglingConstantContact=!1})},e.toggleEmailPush=function(){e.isTogglingEmailPush||(e.accountSettings.emailPush.enabled||e.validateIntegrationLimitation())&&(e.isTogglingEmailPush=!0,c.post("accountSettings/toggleEmailPush").then(function(t){t.data.result&&(e.accountSettings.emailPush.enabled=t.data.success.emailPushEnabled)}).finally(function(){e.isTogglingEmailPush=!1}))},e.checkAccessToken=function(){var t,i,a=l.search();
1if("type"in a){if("constantContact"===a.type){let a=l.hash();if(a){var o=(t=a.split("&"),i={},n.each(t,function(e){var t=e.split("=");t.length>1?i[t[0]]=t[1]:i[t[0]]=!0}),i);e.linkConstantContactStep2(o.access_token,o.expires_in)}}"booker"===a.type&&(e.shouldOpenBookerDetail=!0,e.integrations.booker.enabled&&e.showIntegrationDetails(e.integrations.booker)),"square"===a.type&&"success"===a.result&&s.confirm({title:i18next.t("Square Integration Enabled"),message:i18next.t("You can now go to the template builder to add any payment field to start processing payments. Processing fees are charged by Square, WaiverForever has no extra processing fees.")+'<br/><br/><a href="https://help.waiverforever.com/hc/en-us/articles/9990267545235-Integration-Square-and-WaiverForever" target="_blank">'+i18next.t("Click here to read the complete Square and WaiverForever Integration guide")+"</a>",hideConfirm:!0,cancel:i18next.t("Dismiss")})}},e.accountSettings&&(e.checkAccessToken(),e.integrationLimitationDataLoaded=!0),e.$watch("accountSettings",function(t,i){t&&!i&&(e.checkAccessToken(),e.integrationLimitationDataLoaded=!0)}),e.fetchIntegrations=function(){e.isLoadingIntegrations=!0,c.get("accountSettings/getIntegrations").then(function(t){var i=t.data;if(i.result){let t=i.success;void 0!==t&&Object.keys(t).forEach(i=>{i in e.integrations&&(e.integrations[i].enabled="enabled"===t[i].status,e.integrations[i].metadata=t[i].metadata)})}}).finally(()=>{e.isLoadingIntegrations=!1,e.shouldOpenBookerDetail&&e.integrations.booker.enabled&&e.showIntegrationDetails(e.integrations.booker)})},e.toggleAcuity=function(){if(!e.integrations.acuity.isToggling&&(e.integrations.acuity.enabled||e.validateIntegrationLimitation()))return e.integrations.acuity.enabled?s.confirm({title:i18next.t("Disable Acuity Integration"),message:i18next.t("You are about to turn off your Acuity integration. Please confirm.<br/><br/>For better security, you should also revoke our access to your Acuity account from Acuity."),confirm:i18next.t("Confirm"),cancel:i18next.t("Cancel")}).then(()=>{e.updateIntegration({platform:"acuity",action:"disable"})}):void a.open({animation:!0,component:"acuityModal",windowTopClass:"acuity-modal centered-modal",resolve:{markAsEnabled:()=>e.markAcuityAsEnabled,onUpdate:()=>e.fetchIntegrations,acuity:()=>e.integrations.acuity}})},e.toggleHubspot=function(){if(!e.integrations.hubspot.isToggling&&(e.integrations.hubspot.enabled||e.validateIntegrationLimitation()))return e.integrations.hubspot.enabled?s.confirm({title:i18next.t("Disable Hubspot Integration"),message:i18next.t("You are about to turn off your Hubspot integration. Please confirm.<br/><br/>For better security, you should also revoke our access to your Hubspot account from Hubspot."),confirm:i18next.t("Confirm"),cancel:i18next.t("Cancel")}).then(()=>{e.updateIntegration({platform:"hubspot",action:"disable"})}):void(e.integrations.hubspot?.metadata?.api_key_has_value?e.updateIntegration({platform:"hubspot",action:"enableWithAPIKey"}):a.open({animation:!0,component:"hubspotModal",windowTopClass:"hubspot-modal centered-modal",resolve:{markAsEnabled:()=>e.markHubspotAsEnabled}}))},e.toggleBookeo=function(){if(!e.integrations.bookeo.isToggling&&(e.integrations.bookeo.enabled||e.validateIntegrationLimitation()))return e.integrations.bookeo.enabled?s.confirm({title:i18next.t("Disable Bookeo Integration"),message:i18next.t("You are about to turn off your Bookeo integration. Please confirm.<br/><br/>For better security, you should also revoke our access to your Bookeo account from Bookeo."),confirm:i18next.t("Confirm"),cancel:i18next.t("Cancel")}).then(()=>{e.updateIntegration({platform:"bookeo",action:"disable"})}):void(e.integrations.bookeo?.metadata?.api_key_has_value?e.updateIntegration({platform:"bookeo",action:"enableWithAPIKey"}):a.open({animation:!0,component:"bookeoModal",windowTopClass:"bookeo-modal centered-modal",resolve:{markBookeoAsEnabled:()=>e.markBookeoAsEnabled}}))},e.toggleIntegration=t=>{if(e.integrations[t].isToggling)return;if(!e.integrations[t].enabled&&!e.validateIntegrationLimitation())return;let i=e.integrations[t].enabled?"disable":"enable";e.integrations[t].extraPayload(i).then(n=>{e.updateIntegration({platform:t,action:i,extraPayload:n})})},e.updateIntegration=function(t){let{platform:i,action:n,extraPayload:a={}}=t;e.integrations[i].isToggling=!0;let o={platform:i,action:n,payload:{}};a&&(o={...o,...a}),c.post("accountSettings/updateIntegration",o).then(function(t){t.data.result&&(e.integrations[i].enabled="enabled"===t.data.success.status,e.integrations[i].metadata=t.data.success.metadata,e.integrations[i].callback(t.data.success.status),t.data.success.result||s.confirm({title:"Update Integration Failed",message:t.data.success.message,hideCancel:!0}))}).finally(function(){e.integrations[i].isToggling=!1})},window.clearBookeo=()=>{e.integrations.bookeo.isToggling=!0,c.post("accountSettings/updateIntegration",{platform:"bookeo",action:"disable",payload:{delete_api_key:!0}}).then(function(t){t.data.result&&(e.integrations.bookeo.enabled="enabled"===t.data.success.status,e.integrations.bookeo.metadata=t.data.success.metadata,e.integrations.bookeo.callback(t.data.success.status),t.data.success.result||s.confirm({title:"Update Integration Failed",message:t.data.success.message,hideCancel:!0}))}).finally(function(){e.integrations.bookeo.isToggling=!1})},e.fetchApps=function(){return c.get("applications").then(function(t){var i=t.data;i.result&&(e.apps=i.success.applications)})},e.zapierKey=function(){const t=e.apps.find(e=>"zapier"===e.type);return t?t.api_key:null},e.toggleZapierKey=function(){if(e.zapierKey())e.apps.forEach(t=>{"zapier"===t.type&&e.revokeZapierKey(t.id)});else{if(!e.validateIntegrationLimitation())return;e.createZapierApp()}},e.showZapierDetails=function(){a.open({animation:!0,component:"zapierModal",windowTopClass:"zapier-modal centered-modal",resolve:{key:()=>e.zapierKey()}})},e.createZapierApp=function(){e.isUpdatingApps=!0,c.post("applications",{type:"zapier",name:"zapier",description:"zapier"}).then(function(t){t.data.result&&e.fetchApps().then(()=>{e.showZapierDetails()})}).finally(function(){e.isUpdatingApps=!1})},e.revokeZapierKey=function(t){s.confirm({title:i18next.t("Disable Zapier"),message:i18next.t("Once disabled, all your integrations(zaps) through Zapier will be disabled"),windowTopClass:"text-centered-modal",confirm:"Disable"}).then(()=>e.revoke(t))},e.revoke=function(t){e.isUpdatingApps=!0,c.post("applications/"+t,{}).then(function(t){t.data.result&&e.fetchApps()}).catch(function(){d.error("Failed to revoke Application.")}).finally(function(){e.isUpdatingApps=!1})},e.copyZapierKey=function(){navigator.clipboard.writeText(e.zapierKey()).then(()=>d.success(i18next.t("Copied to clipboard!")))}
1,e.showIntegrationDetails=e=>{let t=e.details();"string"==typeof t&&s.confirm({title:i18next.t("Integration Info"),message:t,hideCancel:!0})},e.showBookeoModal=function(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];a.open({animation:!0,component:"bookeoModal",windowTopClass:"bookeo-modal centered-modal",resolve:{markBookeoAsEnabled:()=>e.markBookeoAsEnabled,fromCallback:()=>t}})},e.showHubspotModal=function(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];a.open({animation:!0,component:"hubspotModal",windowTopClass:"hubspot-modal centered-modal",resolve:{markAsEnabled:()=>e.markHubspotAsEnabled,fromCallback:()=>t}})},e.showAcuityModal=function(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];a.open({animation:!0,component:"acuityModal",windowTopClass:"acuity-modal centered-modal",resolve:{markAsEnabled:()=>e.markAcuityAsEnabled,fromCallback:()=>t,onUpdate:()=>e.fetchIntegrations,acuity:()=>e.integrations.acuity}})},e.markBookeoAsEnabled=()=>{e.integrations.bookeo.enabled=!0},e.markHubspotAsEnabled=()=>{e.integrations.hubspot.enabled=!0},e.markAcuityAsEnabled=()=>{e.integrations.acuity.enabled=!0},e.initBookeoDetail=()=>{const t=u.params();"enabled"===t.bookeo&&e.showBookeoModal(!0),"enabled"===t.hubspot&&e.showHubspotModal(!0),"enabled"===t.acuity&&e.showAcuityModal(!0)},e.toggleSquare=function(){e.isTogglingSquare||(e.accountSettings.square.enabled?e.unlinkSquare():e.linkSquare())},e.linkSquare=function(){e.validateIntegrationLimitation()&&(e.isTogglingSquare=!0,window.location.href=e.accountSettings.square.authorize_uri)},e.unlinkSquare=function(){s.confirm({title:i18next.t("Confirm to disconnect Square?"),message:i18next.t("If confirm, please remember to manually remove any payment fields you've added to your templates. For your security, forms with active payment fields will be temporarily blocked from submissions until those fields are removed."),confirm:i18next.t("Confirm"),cancel:i18next.t("Cancel")}).then(function(){e.isTogglingSquare=!0,c.post("accountSettings/updateIntegration",{platform:"square",action:"disable"}).then(function(t){t.data.result&&(e.accountSettings.square.enabled=!1)}).finally(function(){e.isTogglingSquare=!1})})},e.fetchIntegrations(),e.fetchApps(),e.initBookeoDetail()}])},65349(e){e.exports='<img class="close-button" src="/app/static/images/close.svg" alt="close button" ng-click="vm.dismiss()"/> <div class="bookeo-modal-container"> <h2 class="title" ng-i18next="Bookeo Integration Details"></h2> <h3 class="step-title"> <span ng-i18next="Step1"></span>: <span class="step-name" ng-i18next="Activate the Connection"></span> </h3> <ul class="step-list"> <li class="step-entry"> <span ng-i18next="Please click the link"></span> (<a class="bookeo-connect-link" href="{{vm.bookeoUrl}}" title="{{vm.bookeoUrl}}" target="_blank">{{vm.bookeoUrl}}</a>) <span ng-i18next="to activate the connection."></span> </li> <li class="step-entry" ng-i18next="Click the Check Connection button to validate the connection has been activated."></li> </ul> <div ng-switch="vm.checkConnectionState"> <button class="wf-button-small" ng-switch-when="initial" ng-i18next="Check Connection" ng-click="vm.checkConnection()"></button> <button class="wf-button-small" ng-switch-when="failed" ng-i18next="Check Failed" ng-click="vm.checkConnection()"></button> <button class="wf-button-small" ng-switch-when="checking" ng-i18next="Checking ..."></button> <button class="wf-button-small" ng-switch-when="success" ng-i18next="Success"></button> </div> <h3 class="step-title"> <span ng-i18next="Step2"></span>: <span class="step-name" ng-i18next="Add a new option called WaiverForeverLink"></span> </h3> <ul class="step-list"> <li class="step-entry"> <div> <span ng-i18next="In Bookeo, Go to Settings - Service offered and additional options. Click additional options - add new option. Set the type as free text."></span> <b ng-i18next=\'Set the title name exactaly as "WaiverForeverLink".\'></b> <span ng-i18next=\'Enable the option for new bookings. Uncheck "customers can see the option", click save.\'></span> </div> </li> <li class="step-entry" ng-i18next="Click the Check Option button to validate the option has been correctly added."></li> </ul> <div ng-switch="vm.checkOptionState"> <button class="wf-button-small" ng-switch-when="initial" ng-i18next="Check Option" ng-click="vm.checkOptions()"></button> <button class="wf-button-small" ng-switch-when="failed" ng-i18next="Check Failed" ng-click="vm.checkOptions()"></button> <button class="wf-button-small" ng-switch-when="checking" ng-i18next="Checking ..."></button> <button class="wf-button-small" ng-switch-when="success" ng-i18next="Success"></button> </div> <h3 class="step-title"> <span ng-i18next="Step3"></span>: <span class="step-name" ng-i18next="Select the template to connect with Bookeo"></span> </h3> <ul class="step-list"> <li class="step-entry" ng-i18next="Select the template you want to connect with Bookeo, go to its template setting - integration, scroll down to Bookeo and link the service you want."></li> </ul> <a class="help-center-link" href="https://help.waiverforever.com/hc/en-us/articles/26628029055379-Integration-Bookeo-and-WaiverForever" ng-i18next="Click here to read the complete Bookeo and WaiverForever Integration guide"></a> <button class="wf-button-secondary-small dismiss-button" ng-i18next="Dismiss" ng-click="vm.dismiss()"></button> </div> '},66963(e,t,i){"use strict";i.r(t),i.d(t,{default:()=>E});var n=i(88358),a=(i(47036),i(28089));angular.module("waiverforeverApp.accountSettings").controller("AccountSettingsGeneralController",["$scope","$uibModal","$timeout","Confirmation","$rootScope","WFApiClient","$state","premiumMod
1alHelper","onboardingTaskManager","toastr",function(e,t,n,o,s,l,c,r,d,u){e.isLoadingProfile=!1,e.profile=null,e.profileNotCompleted=!1,e.tempAdmin={email:""},e.isUpdatingAdminEmail=!1,e.isMainAdmin=s.currentUser.isMainAdmin,e.isLoadingSubAdmins=!1,e.initing=!1,e.teamUsers=[],e.isTogglingWhiteLabel=!1,e.isTogglingSso=!1,e.isTogglingSsoPasswordLogin=!1,e.ssoConfig=null,e.isVerified=e.currentUser.verified,e.createSsoConfig={idp_name:"",idp_domain:"",client_id:"",default_admin_role:"Administrator"},e.redirectUri=a._,e.organizationPopoverText=i18next.t("Unique identifier of your organization"),e.callbackUrlPopoverText=i18next.t("You may need to configure the OIDC Issuer with the following callback."),e.handleSubmit=function(){e.ssoConfig?e.updateIdp():e.createIdp()},e.toggleWhiteLabel=function(){if(!e.accountSettings.whiteLabelAvailable)return r.open({featureKey:"White Label",featureName:i18next.t("White Label"),videoId:"811402724",description:i18next.t("Remove 'Powered by WaiverForever' labels from public pages and emails."),source:"white-label"});e.isTogglingWhiteLabel=!0,l.post("accountSettings/toggleWhiteLabel",{}).then(function(t){if(e.isTogglingWhiteLabel=!1,t.data.result){var i=t.data.success;e.accountSettings.whiteLabelEnabled=i.whiteLabelEnabled}})},e.toggleSso=function(){if(!e.accountSettings.ssoAvailable)return r.open({featureKey:"Single Sign-On",featureName:i18next.t("Single Sign-On"),videoId:"946824379",description:i18next.t("Enable Single Sign-On for your organization"),source:"sso"});l.post("accountSettings/toggleSSO",{}).then(function(t){if(e.isTogglingSso=!1,t.data.result){var i=t.data.success;e.accountSettings.ssoEnabled=i.ssoEnabled}})},e.toggleSsoPasswordLogin=function(){e.isTogglingSsoPasswordLogin=!0,l.post("accountSettings/toggleSsoPasswordLogin",{}).then(function(t){if(t.data.result){var i=t.data.success;e.accountSettings.ssoPasswordLoginDisabled=i.ssoPasswordLoginDisabled}}).finally(function(){e.isTogglingSsoPasswordLogin=!1})},e.getIdp=function(){return e.loadingIdp=!0,l.get("sso/oidc/getIdp").then(function(t){t.data.result&&(e.ssoConfig=t.data.success)}).catch(e=>{404!==e.status&&u.error(i18next.t("Failed to get IdP info"))}).finally(function(){e.loadingIdp=!1})},e.updateIdp=function(){return e.loadingIdp=!0,l.post("sso/oidc/updateIdp",e.ssoConfig).then(e=>{e.data.result&&u.success(i18next.t("Updated successfully"))}).catch(e=>{e.data&&e.data.failed?u.error(e.data.failed):u.error(i18next.t("Failed to update IdP"))}).finally(()=>{e.loadingIdp=!1})},e.createIdp=function(){return e.loadingIdp=!0,l.post("sso/oidc/createIdp",{idp_name:e.createSsoConfig.idp_name,idp_domain:e.createSsoConfig.idp_domain,client_id:e.createSsoConfig.client_id,default_admin_role:e.createSsoConfig.default_admin_role}).then(t=>{t.data.result&&(e.ssoConfig=t.data.success,e.createSsoConfig=null,u.success(i18next.t("Created successfully")))}).catch(e=>{e.data&&e.data.failed?u.error(e.data.failed):u.error("Failed to create IdP")}).finally(()=>{e.loadingIdp=!1})},e.deleteIdp=function(){return l.post("sso/oidc/deleteIdp",{}).then(t=>{t.data.result&&(e.ssoConfig=null,u.success(i18next.t("Deleted successfully")))}).catch(()=>{u.error("Failed to delete IdP")})},e.getProfile=function(){return e.isLoadingProfile=!0,l.get("accountSettings/getAccountProfile").then(function(t){t.data.result&&(e.profile=t.data.success,e.profileNotCompleted=""===e.profile.company_size||""===e.profile.company_industry,e.tempAdmin.email=e.profile.email)}).finally(function(){e.isLoadingProfile=!1})},e.updateProfile=function(t){e.isLoadingProfile=!0,l.post("accountSettings/updateAccountProfile",t).then(function(t){t.data.result&&(d.completeTask("complete_your_business_profile"),e.profile=t.data.success,e.profileNotCompleted=""===e.profile.company_size||""===e.profile.company_industry,u.success(i18next.t("Profile updated successfully")))},function(e){if(400==e.status){let t=e.data.failed;o.confirm({title:i18next.t("Update Profile Failed"),message:t,hideCancel:!0})}u.error(i18next.t("Failed to update profile"))}).finally(function(){e.isLoadingProfile=!1})},e.openUpdateProfileModal=function(){e.isVerified?t.open({animation:!0,template:i(42964),controller:"AccountSettingsUpdateProfileModalCtrl",size:"md",resolve:{profile:function(){return e.profile}}}).result.then(function(t){e.updateProfile(t.profile)},function(){}):t.open({animation:!0,backdrop:"static",component:"verifyEmailModal",windowTopClass:"verify-email-modal centered-modal",resolve:{email:()=>e.currentUser.username,freeTrialVerifyEmailEndTime:()=>e.currentUser.freeTrialVerifyEmailEndTime,accountRestricted:()=>!1}})},e.switchAdmin=function(){e.tempAdmin.email&&e.tempAdmin.email!==e.profile.email&&o.confirm({title:i18next.t("Changing Account Owner"),message:i18next.t("You are about to change your account owner.<br/><br/> Current Owner: <b>{{profileEmail}}</b><br/>New Owner: <b>{{tempAdminEmail}}</b><br/><br/>Once this change is made, you will be logged out immediately.<br/>Please use the new owner's email address to log in.",{profileEmail:e.profile.email,tempAdminEmail
1:e.tempAdmin.email})}).then(()=>{var t={username:e.tempAdmin.email};e.isUpdatingAdminEmail=!0,l.post("accountSettings/changeMainAdmin",t).then(function(){window.location="/auth/signout"},function(e){let t=e.data.failed;o.confirm({title:i18next.t("Update Account Owner Email Failed"),message:t,hideCancel:!0})}).finally(function(){e.isUpdatingAdminEmail=!1})})},e.getSubAdmins=function(){return e.isLoadingSubAdmins=!0,l.get("accountSettings/getSubAdmins?filter_email=true").then(function(t){t.data.result&&(e.teamUsers=t.data.success.subAdmins.reduce((e,t)=>(t.is_pending||e.push({email:t.username}),e),[]))}).finally(function(){e.isLoadingSubAdmins=!1})},e.copyRedirectUri=function(){navigator.clipboard.writeText(a._).then(()=>u.success(i18next.t("Copied to clipboard!")))},e.init=function(){e.initing=!0;const t=[e.getProfile()];s.currentUser.isMainAdmin&&t.push(e.getSubAdmins()),Promise.all(t).finally(function(){n(()=>{e.initing=!1})}),e.$watch("accountSettings",function(t,i){t&&!i&&e.accountSettings.ssoAvailable&&e.getIdp()})},e.init()}]),angular.module("waiverforeverApp.accountSettings").controller("AccountSettingsUpdateProfileModalCtrl",["$scope","$uibModalInstance","profile",function(e,t,i){e.profile=angular.copy(i),e.profile.email=e.profile.company_email||e.profile.email,e.ok=function(){angular.forEach(e.updateProfileForm.$error,function(e){angular.forEach(e,function(e){e.$setTouched()})}),e.updateProfileForm.$valid?(e.errorMessage="",t.close({profile:e.profile})):e.errorMessage=i18next.t("Please fill in all required fields correctly.")},e.cancel=function(){t.dismiss("cancel")}}]);i(26121);var o=i(80313),s=i(33350);angular.module("waiverforeverApp.accountSettings").controller("AccountSettingsCreateAdminModalCtrl",["$scope","$uibModalInstance","admin","templates","WFApiClient",function(e,t,i,n,a){i?(e.updateUser=!0,e.admin=i,e.usernameFirstChar=i.username.charAt(0).toUpperCase()):e.admin={username:"",humanName:"",permissionMap:{account_settings:!1,billing:!1,template_management:!1,crm:!1,template_editing:!0,view_waiver:!0,waiver_editing:!0,analytics:!1,date_exporting:!1,template_access_list_type:"blacklist",template_access_list:[]}},e.templates=n,e.emailRegex=s.eT,e.isUsernameEmail=e.emailRegex.test(e.admin.username),e.sendingRequest=!1,e.requestSent=!1,e.templates.forEac
1h(function(t){-1!==e.admin.permissionMap.template_access_list.indexOf(t.id)?t.isSelected=!0:t.isSelected=!1}),e.generateTemplateAccessList=function(){return e.templates.reduce(function(e,t){return t.isSelected&&e.push(t.id),e},[])},e.totalSelectedTemplates=function(){return e.templates.reduce(function(e,t){return e+(t.isSelected?1:0)},0)},e.waiverEditingChanged=function(){e.admin.permissionMap.waiver_editing=!e.admin.permissionMap.waiver_editing,e.admin.permissionMap.waiver_editing&&(e.admin.permissionMap.view_waiver=!0)},e.requestResetUserPwd=function(){e.sendingRequest=!0,a.post("accountSettings/resetSubAdminPassword",{username:e.admin.username}).then(()=>{e.requestSent=!0}).finally(()=>{e.sendingRequest=!1})},e.getResetBtnText=function(){return e.sendingRequest?i18next.t("Requesting..."):e.requestSent?i18next.t("Request sent"):i18next.t("Request reset password")},e.ok=function(){if(e.admin.permissionMap.template_access_list=e.generateTemplateAccessList(),"blacklist"===e.admin.permissionMap.template_access_list_type&&e.admin.permissionMap.template_access_list.length==e.templates.length)return void(e.errorMessage=i18next.t("Please don't block all templates"));if("whitelist"===e.admin.permissionMap.template_access_list_type&&0==e.admin.permissionMap.template_access_list.length)return void(e.errorMessage=i18next.t("Please allow at least one template"));if(!(e.updateUser||e.admin.username&&e.emailRegex.test(e.admin.username)))return;e.errorMessage="";const i={username:e.admin.username,humanName:e.admin.humanName,permissionMap:e.admin.permissionMap};e.admin.password&&(i.password=(0,o.md5)(e.admin.password)),t.close(i)},e.cancel=function(){t.dismiss("cancel")}}]);i(63501),i(99249),i(73031);angular.module("waiverforeverApp.accountSettings").controller("AccountSettingsNotificationsController",["$scope","Confirmation","WFApiClient","premiumModalHelper","toastr","$rootScope",function(e,t,i,a,o,l){function c(t){e.emailList=t?t.split(",").map(function(e){return e.trim()}).filter(function(e){return e}):[]}function r(t){e.smsPhoneList=t?t.split(",").map(function(e){return e.trim()}).filter(function(e){return e}):[]}e.isCnMarket=l.isCnMarket,e.isTogglingPendingWaiverNotification=!1,e.isUpdatingPendingWaiverNotification=!1,e.isRecipientListTouched=!1,e.emailList=[],e.emailInput={value:"",valid:!1},e.isTogglingPendingWaiverSMSNotification=!1,e.isUpdatingPendingWaiverSMSNotification=!1,e.isSMSRecipientListTouched=!1,e.smsPhoneList=[],e.newSmsPhone="",e.newSmsPhoneValid=!1,e.smsAllowedCountries=["US","CA"],e.accountSettings&&e.accountSettings.pendingWaiverNotification&&c(e.accountSettings.pendingWaiverNotification.recipient_list),e.accountSettings&&e.accountSettings.pendingWaiverSMSNotification&&r(e.accountSettings.pendingWaiverSMSNotification.phoneList),e.$watch("accountSettings.pendingWaiverNotification.recipient_list",function(e,t){e!==t&&c(e)}),e.$watch("accountSettings.pendingWaiverSMSNotification.phoneList",function(e,t){e!==t&&r(e)}),e.togglePendingWaiverNotification=function(){if(!e.accountSettings.pendingWaiverNotificationAvailable)return a.open({featureKey:"Self Notification",featureName:i18next.t("Self Notification"),videoId:"813056446",description:i18next.t("Pending waiver notification will send you an email notification every time a pending waiver is submitted."),source:"pending-waiver-notification"});e.isTogglingPendingWaiverNotification=!0,i.post("accountSettings/togglePendingWaiverNotification").then(function(t){t.data.result&&(e.accountSettings.pendingWaiverNotificationEnabled=t.data.success.pendingWaiverNotificationEnabled,(0,n.sendClickEvent)(e.accountSettings.pendingWaiverNotificationEnabled?"accountSetting_autoEmailSetEnabled":"accountSetting_autoEmailSetDisabled","1"))}).finally(function(){e.isTogglingPendingWaiverNotification=!1})},e.updatePendingWaiverNotification=function(){var n={recipient_list:e.accountSettings.pendingWaiverNotification.recipient_list};e.isUpdatingPendingWaiverNotification=!0,i.post("accountSettings/updatePendingWaiverNotification",n).then(function(t){e.isRecipientListTouched=!1,t.data.result&&(e.accountSettings.pendingWaiverNotification=t.data.success,o.success(i18next.t("Updated successfully")))}).catch(function(e){t.confirm({title:i18next.t("Update failed"),message:e.data.failed||i18next.t("Failed to update recipient list. Please try again."),hideCancel:!0})}).finally(function(){e.isUpdatingPendingWaiverNotification=!1})},e.togglePendingWaiverSMSNotification=function(){if(!e.accountSettings.pendingWaiverNotificationAvailable)return a.open({featureName:i18next.t("Pending Waiver SMS Notification"),videoId:"",description:i18next.t("Pending waiver SMS notification will send you an SMS notification every time a pending waiver is submitted."),source:"pending-waiver-sms-notification"});e.isTogglingPendingWaiverSMSNotification=!0,i.post("accountSettings/togglePendingWaiverSMSNotification").then(function(t){t.data.result&&(e.accountSettings.pendingWaiverSMSNotificationEnabled=t.data.success.pendingWaiverSMSNotificationEnabled,(0,n.sendClickEvent)(e.accountSettings.pendingWaiverSMSNotificationEnabled?"accountSetting_pendingWaiverSMSSetEnabled":"accountSetting_pendingWaiverSMSSetDisabled","1"))}).finally(function(){e.isTogglingPendingWaiverSMSNotification=!1})},e.updatePendingWaiverSMSNotification=function(){var n={phone_list:e.accountSettings.pendingWaiverSMSNotification.phoneList};e.isUpdatingPendingWaiverSMSNotification=!0,i.post("accountSettings/updatePendingWaiverSMSNotification",n).then(function(t){e.isSMSRecipientListTouched=!1,t.data.result&&(void 0!==t.data.success.phoneList&&(e.accountSettings.pendingWaiverSMSNotification.phoneList=t.data.success.phoneList),o.success(i18next.t("Updated successfully")))}).catch(function(e){t.confirm({title:i18next.t("Update failed"),message:e.data.failed||i18next.t("Failed to update phone list. Please try again."),hideCancel:!0})}).finally(function(){e.isUpdatingPendingWaiverSMSNotification=!1})},e.onNewSmsPhoneChange=function(t){e.newSmsPhone=t.phone,e.newSmsPhoneValid=t.isValid},e.addSmsPhone=function(){e.newSmsPhoneValid&&e.newSmsPhone&&(-1===e.smsPhoneList.indexOf(e.newSmsPhone)&&(e.smsPhoneList.push(e.newSmsPhone),e.syncPhoneListToModel(),e.isSMSRecipientListTouched=!0),e.newSmsPhone="",e.newSmsPhoneValid=!1)},e.removeSmsPhone=function(t){e.smsPhoneList.splice(t,1),e.syncPhoneListToModel(),e.isSMSRecipientListTouched=!0},e.syncPhoneListToModel=function(){e.accountSettings.pendingWaiverSMSNotification.phoneList=e.smsPhoneList.join(",")},e.onNewEmailChange=function(){e.emailInput.valid=e.emailInput.value&&(0,s.xf)(e.emailInput.value.trim())}
1,e.addEmail=function(){if(e.emailInput.valid&&e.emailInput.value){var t=e.emailInput.value.trim();-1===e.emailList.indexOf(t)&&(e.emailList.push(t),e.syncEmailListToModel(),e.isRecipientListTouched=!0),e.emailInput.value="",e.emailInput.valid=!1}},e.removeEmail=function(t){e.emailList.splice(t,1),e.syncEmailListToModel(),e.isRecipientListTouched=!0},e.syncEmailListToModel=function(){e.accountSettings.pendingWaiverNotification.recipient_list=e.emailList.join(",")}}]);var l=i(20086),c=i(62409);angular.module("waiverforeverApp.accountSettings").controller("AccountSettingsSplashPageController",["$scope","$uibModal","$timeout","$http","Confirmation","Upload","EDITOR_OPTIONS","WFApiClient","premiumModalHelper","toastr",function(e,t,i,n,a,s,r,d,u,p){e.isSavingSplashPage=!1,e.isLoadingSplashPage=!1,e.isDeletingSplashPage=!1,e.selectedSplashPage=null,e.upload={file:null},e.tempSplashPage={id:"",title:"",image_url:"",image_url_list:[],body:"",templates:[],templateIds:{}},e.templates=[],e.isGlobal="global"===e.currentUser.marketplace,e.numUploadingImages=0;const g=c.cloneDeep(r.normal);g.language=(0,l.A)(e.currentUser),g.requestHeaders={Authorization:`${d.getAuthHeader()}`},e.froalaOptions=g,e.removeImage=function(t){e.tempSplashPage.image_url_list[t]&&e.tempSplashPage.image_url_list.splice(t,1)},e.uploadFiles=function(t){e.numUploadingImages=e.numUploadingImages+t.length,t.forEach(t=>{s.upload({url:o.BACKEND_HOST+"/api/v3/upload_image",data:{image:t,scenario:"account_splash_page"},headers:{Authorization:d.getAuthHeader()}}).then(function(t){"success"===t.data.status&&e.tempSplashPage.image_url_list.length<9?e.tempSplashPage.image_url_list.push(t.data.link):p.error(i18next.t("You can upload up to 9 images at most."))},function(e){console.log("Error status: "+e.status)},function(e){var t=parseInt(100*e.loaded/e.total);console.debug("progress: "+t+"% "+e.config.data.image.name)}).finally(()=>{e.numUploadingImages=e.numUploadingImages-1})})},e.toggleSelection=function(t){var i=e.tempSplashPage.templates.findIndex(function(e){return e.id==t.id});i>-1?(e.tempSplashPage.templates.splice(i,1),e.tempSplashPage.templateIds[t.id]=!1):(e.tempSplashPage.templates.push(t),e.tempSplashPage.templateIds[t.id]=!0)},e.saveSplashPage=function(){0!==e.tempSplashPage.templates.length?(e.isSavingSplashPage=!0,d.post("accountSettings/saveSplashPage",{id:e.tempSplashPage.id,title:e.tempSplashPage.title,image_url:e.tempSplashPage.image_url,image_url_list:e.tempSplashPage.image_url_list,splash_page_text:e.tempSplashPage.body,checked_waiver_ids:c.map(e.tempSplashPage.templates,function(e){return{waiver_id:e.id}})}).then(function(t){t.data.result?(e.getAccountSettings(),e.selectedSplashPage=null):a.confirm({title:i18next.t("Save welcome page failed"),message:i18next.t("Please try again."),hideCancel:!0})}).finally(function(){e.isSavingSplashPage=!1})):a.confirm({title:i18next.t("No template selected"),message:i18next.t("Please select at least one template to display on the welcome page."),hideCancel:!0})},e.deleteSplashPage=function(t){a.confirm({title:i18next.t("Are you sure to delete this welcome page?"),message:i18next.t("Please confirm to delete welcome page: {{title}}",{title:t.title})}).then(function(){e.isDeletingSplashPage=!0,d.post("accountSettings/deleteSplashPage",{id:t.id}).then(function(t){t.data.result&&e.getAccountSettings()}).finally(function(){e.selectedSplashPage=null,e.isDeletingSplashPage=!1})})},e.createNewSplashPage=function(){if(!e.accountSettings.splashPageAvailable)return u.open({featureKey:"Welcome Page",featureName:i18next.t("Welcome Page"),videoId:"811401651",description:i18next.t("Create a welcome page with your own branding to list your available templates to your customers."),source:"splash-page"});e.selectedSplashPage={id:"",title:"",s3_uri:""},e.loadSplashPage(e.selectedSplashPage)},e.loadSplashPage=function(t){if(e.tempSplashPage={id:t.id,title:t.title,image_url:"",image_url_list:[],body:"",templates:[],templateIds:{}},t.s3_uri){const i=new URL(t.s3_uri);e.isLoadingSplashPage=!0,n.get(i.pathname,{headers:{"Cache-Control":"no-cache"}}).then(function(t){e.tempSplashPage.image_url=t.data.image_url,e.tempSplashPage.image_url_list=t.data.image_url_list||[],e.tempSplashPage.body=t.data.html_text,c.map(t.data.waivers,function(t){e.templates.forEac
1h(function(i){i.id===t.waiver_id&&(e.tempSplashPage.templates.push(i),e.tempSplashPage.templateIds[i.id]=!0)})})}).finally(function(){e.isLoadingSplashPage=!1})}},e.getTemplates=function(){e.isLoadingTemplates=!0,d.get("waiverTemplate/getTemplates").then(function(t){if(t.data.result){var i=t.data.success;e.templates=i}}).finally(function(){e.isLoadingTemplates=!1})},e.templateSelected=function(t){return e.tempSplashPage.templateIds[t.id]},e.getSplashPageUrl=function(t){if(!t.splashPageUrl){const i=`${{china:"https://app.waiverforever.cn",global:"https://app.waiverforever.com"}[e.currentUser.marketplace||"global"]}/splash/${t.id}`;t.splashPageUrl=i,e.isGlobal&&n.get(`https://www.waiver.fr/r?target_url=${i}`).then(function(e){t.splashPageUrl=e.data})}return t.splashPageUrl},e.cancelEditing=function(){e.selectedSplashPage=null},e.editSplashPage=function(t){e.selectedSplashPage=t,e.loadSplashPage(e.selectedSplashPage)},e.accountSettings&&e.getTemplates(),e.$watch("accountSettings",function(t,i){t&&!i&&e.getTemplates()})}]);var r=i(62409),d=i(98609);angular.module("waiverforeverApp.accountSettings").controller("AccountSettingsMiscController",["$scope","$uibModal","$timeout","Confirmation","WFApiClient","$state","toastr","authenticator","premiumModalHelper","$transition$",function(e,t,n,a,l,c,u,p,g,m){const f=m.params();e.isLoadingTemplates=!0,e.isSearching=!1,e.templatesObj={},e.waivers=[],e.searched=!1,e.exportEmail="",e.canExportData=p.hasPermission(["data_exporting"]),e.getTemplates=function(){l.get("waiverTemplate/getTemplates").then(function(t){if(t.data.result){var i=t.data.success;e.templates=i,r.each(i,function(t){e.templatesObj[t.id]=t})}}).finally(function(){e.isLoadingTemplates=!1,f["#"]||setTimeout(function(){angular.element('.misc .wf-input[name="searchTerm"]').focus()},20)})},e.accountSettings&&e.getTemplates(),e.$watch("accountSettings",function(t,i){t&&!i&&e.getTemplates()}),e.openWaiver=function(e,t){switch(t){case"accepted":window.open("/get_signed_doc/"+e);break;case"pending":window.open("/get_pending_waiver/"+e);break;case"group":window.open("/get_requested_waiver/"+e)}},e.exportPdf=function(e){window.open(o.BACKEND_HOST+"/api/v3/waiver/downloadPDF/"+e)},e.doDelete=function(t,i){e.isSearching||a.confirm({title:i18next.t("Confirm Delete"),message:i18next.t("<p>Please confirm to delete this waiver: {{id}}. This will delete all data we have about this waiver permanently.</p><p>NOTE: This action <b>CANNOT</b> be UNDONE.</p>",{id:t}),confirm:i18next.t("I understand the consequences, delete"),hideCancel:!0}).then(function(){e.isSearching=!0,l.post("delete/waiver",{waiver_ids:t}).then(function(n){n.data.result&&n.data.success&&n.data.success.succeeded&&n.data.success.succeeded[0]===t&&(a.confirm({title:i18next.t("Delete Success"),message:i18next.t("The waiver {{id}} has been deleted.",{id:t}),hideCancel:!0}),e.waivers.splice(i,1))}).finally(function(){e.isSearching=!1})})},e.doSearch=function(t,i){l.post("search/waiver",{template_ids:t,search_term:e.searchTerm,search_type:"accepted|pending|group"}).then(function(t){if(t.data.result){var i=t.data.success,n=function(t,i){return function(n){n.status=i,n.templateTitle=t,n.displayDate=d(1e3*n.datetime).format("lll"),e.waivers.push(n)}};r.each(i,function(t){var i=e.templatesObj[t.template_id].title;r.each(t.accepted,n(i,"Accepted")),r.each(t.pending,n(i,"Pending")),r.each(t.group,n(i,"Pending"))})}}).finally(function(){i()})},e.search=function(){if(!e.isSearching&&e.validateSearchTerm()){e.isSearching=!0,e.waivers=[];var t=r.map(e.templates,function(e){return e.id}),i=function(){t.length?e.doSearch(t.pop(),i):(e.isSearching=!1,e.searched=!0)};i(),i(),i(),i(),i()}},e.validateSearchTerm=function(){return e.searchTerm&&e.searchTerm.length>2?(e.searchForm.searchTerm.$setValidity("format",!0),!0):(e.searchForm.searchTerm.$setValidity("format",!1),!1)},e.getVerifiedEmails=function(){return e.verifiedEmails=[],e.loadingEmails=!0,l.get("accountSettings/getVerifiedEmails").then(function(t){e.loadingEmails=!1,t.data.result&&(e.verifiedEmails=t.data.success.verifiedEmails)},function(){e.loadingEmails=!1})},e.editEmail=function(n){t.open({animation:!0,template:i(27052),controller:"EditEmailNameModalCtrl",resolve:{email:function(){return n}}}).result.then(function(){e.getVerifiedEmails()},function(){})},e.deleteEmail=function(t){a.confirm({title:i18next.t("Delete Email"),message:i18next.t("Please confirm to delete this email: {{email}}",{email:t.address})}).then(function(){l.post("accountSettings/removeEmail",{email:t.address}).then(function(){e.getVerifiedEmails()},function(t){a.confirm({title:i18next.t("Delete Email Failed"),message:t.data.failed,hideCancel:!0}).then(function(){e.getVerifiedEmails()})})})}
1,e.showPremiumModal=()=>{g.open({featureKey:"Export",featureName:i18next.t("Export"),videoId:"811400675",description:i18next.t("Export the raw waiver data into Excel or any BI tools to perform additional data analysis")})},e.exportByDate=()=>{if(!e.accountSettings?.exportAsSpreadsheetAvailable)return e.showPremiumModal();t.open({animation:!0,component:"exportWaiverByDateModal",windowClass:"export-waiver-by-date-modal centered-modal",resolve:{email:()=>e.exportEmail}})},e.scrollToAnchor=function(){const e=f["#"];if(e){const t=document.getElementById(e);t&&t.scrollIntoView({behavior:"smooth"})}},e.init=()=>{e.getVerifiedEmails().then(()=>{e.exportEmail=(0,s.xf)(e.currentUser.username)?e.currentUser.username:e.verifiedEmails[0]?.address,n(()=>{e.scrollToAnchor()},0)})},e.init()}]);i(98332);var u=i(3074),p=i.n(u),g=i(98609);class m{static $inject=["WFApiClient","$uibModal","toastr","$state"];constructor(e,t,i,n){this.WFApiClient=e,this.$uibModal=t,this.toastr=i,this.$state=n}$onInit(){this.date={startDate:null,endDate:null},this.dateRangePickerOptions={opens:"left",maxDate:g().endOf("day"),minDate:null,showDropdowns:!0,alwaysShowCalendars:!0,ranges:{[i18next.t("Today")]:[g().startOf("day"),g().endOf("day")],[i18next.t("Yesterday")]:[g().subtract(1,"days").startOf("day"),g().subtract(1,"days").endOf("day")],[i18next.t("Last 7 Days")]:[g().subtract(6,"days").startOf("day"),g().endOf("day")],[i18next.t("Last 30 Days")]:[g().subtract(29,"days").startOf("day"),g().endOf("day")],[i18next.t("This month")]:[g().startOf("month").startOf("day"),g().endOf("day")]}},this.monthPresets=[1,2,3,4,5,6].map(e=>{const t={startDate:g().subtract(e,"month").startOf("month"),endDate:g().subtract(e,"month").endOf("month")};return{date:t,label:`${t.startDate.year()}-${t.startDate.month()+1}`}})}usePreset(e){this.date=e}cancel(){this.modalInstance.dismiss()}export(e){const t={};"pdf"===e&&(t.job_type="pdf"),this.date.startDate&&(t.start_timestamp=this.date.startDate.unix()),this.date.endDate&&(t.end_timestamp=this.date.endDate.unix()),this.WFApiClient.post("archive/exportWaivers",t).then(e=>{const t=e.data.success.job_id;window.open(this.$state.href("standalonePages.downloadExport",{job:t}),"_blank"),this.modalInstance.close()}).catch(e=>{"EXPORT_WAIVERS_RATE_LIMIT"===e.data.code?this.toastr.error(i18next.t("Your exports are too frequent. Please try again later.")):"EXPORT_WAIVERS_TOO_MANY"===e.data.code?this.toastr.error(i18next.t("Your export failed due to high volume at the moment. Please try again later.")):"EXPORT_WAIVERS_NO_WAIVERS"===e.data.code?this.toastr.error(i18next.t("There are no waivers to export in the selected time range.")):this.toastr.error(i18next.t("Export failed. Please try again later."))})}}m.$inject=["WFApiClient","$uibModal","toastr","$state"],angular.module("waiverforeverApp.accountSettings").component("exportWaiverByDateModal",{bindings:{modalInstance:"<",resolve:"<"},controller:m,template:p(),controllerAs:"vm"});var f=i(13462),h=i.n(f);class v{static $inject=["WFApiClient"];constructor(e){this.WFApiClient=e,this.downloadText=i18next.t("We are creating a zip file for you to download. Feel free to leave this page. We'll send an email to {{email}} when the file is ready to download.",{email:this.resolve.email})}ok(){const e={};this.resolve.startDate&&(e.start_timestamp=this.resolve.startDate.unix()),this.resolve.endDate&&(e.end_timestamp=this.resolve.endDate.unix()),this._request(e),this.modalInstance.dismiss()}close(){this.modalInstance.dismiss()}_request(e){return this.WFApiClient.post("archive/exportWaivers",e)}}v.$inject=["WFApiClient"],angular.module("waiverforeverApp.accountSettings").component("exportModal",{bindings:{modalInstance:"<",resolve:"<"},controller:v,template:h(),controllerAs:"vm"});i(11167);var b=i(93141),y=i.n(b);class w{static get inject(){return["toastr"]}constructor(e){this.toastr=e}copy(){navigator.clipboard.writeText(this.resolve.key).then(()=>this.toastr.success(i18next.t("Copied to clipboard!")))}}w.$inject=["toastr"],angular.module("waiverforeverApp.pairedDevice").component("zapierModal",{bindings:{modalInstance:"<",resolve:"<"},controller:w,template:y(),controllerAs:"vm"});var S=i(65349),k=i.n(S),x=i(56526),A=i(46958);class C{static $inject=["WFApiClient","$scope"];constructor(e,t){this.WFApiClient=e,this.checkConnectionState="initial",this.checkOptionState="initial",this.bookeoUrl=this.getBookeoUrl(),this.handler=e=>{"bookeoStateEnabled"===e.key&&(this.checkConnectionState="success",this.resolve.markBookeoAsEnabled(),t.$apply())}}$onInit(){window.addEventListener("storage",this.handler),this.resolve.fromCallback&&this.checkConnection()}$onDestroy(){window.removeEventListener("storage",this.handler)}dismiss(){this.modalInstance.dismiss()}checkConnection(){this.checkConnectionState="checking",this.WFApiClient.get("accountSettings/getIntegrations",{}).then(e=>{e.data.result&&"enabled"===e.data.success?.bookeo?.status?(this.checkConnectionState="success",this.resolve.markBookeoAsEnabled()):this.checkConnectionState="failed"}).catch(()=>{this.checkConnectionState="failed"})}checkOptions(){this.checkOptionState="checking",this.WFApiClient.post("accountSettings/updateIntegration",{platform:"bookeo",action:"checkOptions",payload:{}}).then(e=>{e.data.result&&"enabled"===e.data.success?.status&&e.data.success?.message?.name&&e.data.success?.message?.enabled?this.checkOptionState="success":this.checkOptionState="failed"}).catch(()=>{this.checkOptionState="failed"})}getBookeoUrl(){const e=(0,x.y)();return A.Ar.setItem("bookeoState",e),`https://signin.bookeo.com/?authappid=N9N7KKCLPNR9&permissions=bookings_rwd_all,availability_r,customers_r_all&state=${e}`}}C.$inject=["WFApiClient","$scope"],angular.module("waiverforeverApp.accountSettings").component("bookeoModal",{bindings:{modalInstance:"<",resolve:"<"},controller:C,template:k(),controllerAs:"vm"});var _=i(89571),T=i.n(_);class I{static $inject=["WFApiClient","$scope","toastr"];constructor(e,t,i){this.WFApiClient=e,this.checkConnectionState="initial",this.checkOptionState="initial",this.hubspotUrl=this.getHubspotUrl(),this.handler=e=>
1{"hubspotStateEnabled"===e.key&&(this.checkConnectionState="success",this.resolve.markAsEnabled(),t.$apply())},this.toastr=i}$onInit(){window.addEventListener("storage",this.handler),this.resolve.fromCallback&&this.checkConnection()}$onDestroy(){window.removeEventListener("storage",this.handler)}dismiss(){this.modalInstance.dismiss()}checkConnection(){this.checkConnectionState="checking",this.WFApiClient.get("accountSettings/getIntegrations",{}).then(e=>{e.data.result&&"enabled"===e.data.success?.hubspot?.status?(this.checkConnectionState="success",this.resolve.markAsEnabled()):this.checkConnectionState="failed"}).catch(()=>{this.checkConnectionState="failed"})}checkOptions(){this.checkOptionState="checking",this.WFApiClient.post("accountSettings/updateIntegration",{platform:"hubspot",action:"checkOptions",payload:{}}).then(e=>{e.data.result&&e.data.success?.result?this.checkOptionState="success":(this.checkOptionState="failed",e.data.success?.metadata?.status_message&&this.toastr.error(e.data.success.metadata.status_message))}).catch(()=>{this.checkOptionState="failed"})}getHubspotUrl(){return`https://app-na2.hubspot.com/oauth/authorize?client_id=a0124f9e-a4b3-4a62-9176-c1414fd8e8de&scopes=${encodeURIComponent("crm.lists.write crm.objects.contacts.read crm.objects.contacts.write oauth")}&redirect_uri=${`${window.location.origin}/page/hubspot-callback`}`}}I.$inject=["WFApiClient","$scope","toastr"],angular.module("waiverforeverApp.accountSettings").component("hubspotModal",{bindings:{modalInstance:"<",resolve:"<"},controller:I,template:T(),controllerAs:"vm"});var P=i(30357),M=i.n(P);class D{static $inject=["WFApiClient","$scope","toastr"];constructor(e,t,i){this.WFApiClient=e,this.checkConnectionState="initial",this.checkOptionState="initial",this.acuityUrl=this.getAcuityUrl(),this.error="",this.handler=e=>{"acuityStateEnabled"===e.key&&(this.checkConnectionState="success",this.resolve.markAsEnabled(),t.$apply())},this.toastr=i,this.userId=null,this.apiKey=null}$onInit(){window.addEventListener("storage",this.handler),this.resolve.fromCallback&&this.checkConnection(),this.userId=this.resolve.acuity?.metadata?.api_user_id,this.apiKey=this.resolve.acuity?.metadata?.api_key}$onDestroy(){window.removeEventListener("storage",this.handler)}dismiss(){this.modalInstance.dismiss()}checkConnection(){this.checkConnectionState="checking",this.WFApiClient.get("accountSettings/getIntegrations",{}).then(e=>{e.data.result&&"enabled"===e.data.success?.acuity?.status?(this.checkConnectionState="success",this.resolve.markAsEnabled()):this.checkConnectionState="failed"}).catch(()=>{this.checkConnectionState="failed"})}checkOptions(){this.checkOptionState="checking",this.WFApiClient.post("accountSettings/updateIntegration",{platform:"acuity",action:"checkOptions",payload:{}}).then(e=>{e.data.result&&e.data.success?.result?(this.checkOptionState="success",this.error=""):(this.checkOptionState="failed",e.data.success?.metadata?.status_message&&(this.error=e.data.success.message,this.toastr.error(e.data.success.message)))}).catch(()=>{this.checkOptionState="failed"})}getAcuityUrl(){return`https://acuityscheduling.com/oauth2/authorize?response_type=code&scope=api-v1&client_id=quNhVx7M9HtalXi4&redirect_uri=${`${window.location.origin}/page/acuity-callback`}`}saveApiKey(){this.WFApiClient.post("accountSettings/updateIntegration",{platform:"acuity",action:"saveApiKey",payload:{api_key:this.apiKey,api_user_id:this.userId}}).then(e=>{e.data.result?(this.toastr.success(i18next.t("Acuity API Key saved successfully")),this.resolve.onUpdate()):this.toastr.error(i18next.t("Failed to save Acuity API Key"))}).catch(()=>{this.toastr.error(i18next.t("Failed to save Acuity API Key"))})}}D.$inject=["WFApiClient","$scope","toastr"],angular.module("waiverforeverApp.accountSettings").component("acuityModal",{bindings:{modalInstance:"<",resolve:"<"},controller:D,template:M(),controllerAs:"vm"});i(4215);const E=angular.module("waiverforeverApp.accountSettings").controller("AccountSettingsController",["$scope","$element","$uibModal","$state","Confirmation","WFApiClient","$rootScope","mobileTabScrollHelper",function(e,t,i,a,o,s,l,c){e.title=i18next.t("Account Settings"),e.getDisplayRoutes=()=>{let t=[];const i=[{heading:i18next.t("General"),route:"app.accountSettings.general"},{heading:i18next.t("Team Users"),route:"app.accountSettings.teamUsers"},{heading:i18next.t("Notifications"),route:"app.accountSettings.notifications"},{heading:i18next.t("Integrations"),route:"app.accountSettings.integrations"},{heading:i18next.t("Webhooks & API"),route:"app.accountSettings.api"},{heading:i18next.t("Welcome Page"),route:"app.accountSettings.splashPage"},{heading:i18next.t("Auto Message"),route:"app.accountSettings.automessage"},{heading:i18next.t("Security"),route:"app.accountSettings.security"},{heading:i18next.t("Misc"),route:"app.accountSettings.misc"}];return e.authenticator.hasPermission(["admin_management"])||t.push("app.accountSettings.teamUsers"),e.authenticator.hasPermission(["account_settings"])||(t=t.concat(["app.accountSettings.notifications","app.accountSettings.splashPage","app.accountSettings.automessage","app.accountSettings.security","app.accountSettings.misc"])),l.isCnMarket&&t.push("app.accountSettings.integrations"),i.filter(e=>!t.includes(e.route))},e.tabData=e.getDisplayRoutes(),e.tabScroll={canScrollLeft:!1,canScrollRight:!1},c.attach(e,t,a,".account-settings-tabs"),e.isLoadingSettings=!1,e.settingTooltip=i18next.t("Enable automatic email so every time you customer signs a waiver, Automatic Email sends an email to the address filled by the customer. The signed document can be included in the automatic email as a PDF file attachment so both parties gets a copy.<br /><br /> You can also include review links from Facebook, Yelp or TripAdvisor in the automatic email. Meanwhile, enable delayed sending to increase the chance of your customers actually opening the email."),e.getAccountSettings=function(){e.isLoadingSettings=!0,s.get("accountSettings/getSettings").then(function(t){if(t.data.result){var i=t.data.success;e.accountSettings=i}}).finally(function(){e.isLoadingSettings=!1})},e.getAccountSettings(),"app.accountSettings"===a.current.name&&a.go("app.accountSettings.general"),e.referralBannerClicked=function(){(0,n.sendClickEvent)("click_account_setting_referral_banner","1")}}])},73031(e,t,i){"use strict";i.r(t),i.d(t,{default:()=>r});var n=i(88358),a=i(22667),o=i.n(a),s=i(20086),l=i(62409);angular.module("waiverforeverApp.accountSettings").controller("AccountSettingsAutoemailController",["$scope","$uibModal","$timeout","Confirmation","EDITOR_OPTIONS","WFApiClient","premiumMod
1alHelper","$compile","toastr",function(e,t,i,a,c,r,d,u,p){e.isSavingAutoemail=!1,e.isTogglingAccountLevel=!1,e.showTemplateAutoemailTip=!1,e.isAutoemailTouched=!1,e.cancel=()=>{};const g=l.cloneDeep(c.normal);FroalaEditor.DefineIcon("aiGeneration",{SRC:"/app/static/images/templateBuilder/ai-bot.svg",ALT:"AI Generation",template:"image"}),FroalaEditor.RegisterCommand("aiGeneration",{icon:"aiGeneration",title:i18next.t("Write with AI"),focus:!0,undo:!0,refreshAfterCallback:!0,callback:function(){const i=this,n=i.html.get(),a=()=>{const t=i.$el.get(0),n=u('<settings-html-field-loading cancel="cancel()"></settings-html-field-loading>')(e).get(0),a=t.parentElement;return a.appendChild(n),()=>{a.contains(n)&&a.removeChild(n)}},o=()=>{const t=r.post("waiverTemplate/generateTextByPrompt",{current_text:n}),o=new Promise(t=>{e.cancel=()=>{t()}}),s=a();return Promise.race([o,t]).then(e=>{e&&e.data.result&&(i.selection.setAtEnd(i.$el.get(0)),i.selection.restore(),i.html.insert("<br>"),i.html.insert(e.data.success.text))}).catch(e=>{p.error(i18next.t("Failed to generate."))}).finally(()=>{s(),e.$apply()})},s=t=>{const n=r.post("waiverTemplate/generateTextByPrompt",{current_text:t}),o=new Promise(t=>{e.cancel=()=>{t()}}),s=a();return Promise.race([o,n]).then(e=>{e&&e.data.result&&(i.html.set(""),i.html.insert(e.data.success.text))}).catch(e=>{p.error(i18next.t("Failed to generate."))}).finally(()=>{s(),e.$apply()})};i.html.get()?t.open({animation:!0,component:"generateTextModal",windowTopClass:"ai-generate-text-modal centered-modal",resolve:{expand:()=>o,replace:()=>s}}):t.open({animation:!0,component:"generateNewTextModal",windowTopClass:"ai-generate-new-text-modal centered-modal",resolve:{replace:()=>s}})}}),g.toolbarButtons.push("aiGeneration"),g.requestHeaders={Authorization:`${r.getAuthHeader()}`},g.events={"image.error":function(t,i){let n=e.froalaOptions.froalaEditor;var a=n.popups.get("image.insert").find(".fr-image-progress-bar-layer");a.addClass("fr-error");var o=a.find("h3");o.text(JSON.parse(i).reason),n.events.disableBlur(),o.focus()}},g.language=(0,s.A)(e.currentUser),e.froalaOptions=g,e.tempAutoemail={title:"",replyToEmail:"",body:"",sendType:"delay",delayTime:"0",timeZone:"",attachWaiver:!0,showDownloadLink:!0,attachQRCode:!1,forwardTo:"",sendTypeId:"0",delayTimeId:"9",enabled:!1},e.sendDelayChanged=function(t){e.touchAutoemail(),t.sendTypeId<6?(t.sendType="delay",t.delayTime=t.sendTypeId,t.timeZone="0"):(t.sendType="next",t.delayTime=parseInt(t.delayTimeId)+parseInt(24*(t.sendTypeId-6))+"",t.timeZone&&"0"!==t.timeZone||(t.timeZone=o().determine().name()))},e.loadTimezones=function(){var t=o().olson.timezones;e.timezones=[],l.each(t,function(t){e.timezones.push({value:t,text:t})}),e.tempAutoemail.timeZone&&"0"!==e.tempAutoemail.timeZone||(e.tempAutoemail.timeZone=o().determine().name())},e.updateAutoemail=function(){e.isSavingAutoemail=!0,r.post("accountSettings/saveAutoemail",{autoemail:e.tempAutoemail}).then(function(){e.isAutoemailTouched=!1,e.getAccountSettings()}).catch(function(e){a.confirm({title:i18next.t("Save auto email failed"),message:e.data.failed,hideCancel:!0})}).finally(function(){e.isSavingAutoemail=!1,e.isTogglingAccountLevel=!1})},e.togglingAccountLevelNotification=function(){if(!e.allowEmailEditing)return d.open({featureKey:"Account-level Auto Email",featureName:i18next.t("Account-level Auto Email"),videoId:"804720858",description:i18next.t("Send a copy of signed doc to your customers automatically at your desired time."),source:"account-level-auto-email"});e.isAutoemailTouched=!1,e.tempAutoemail.enabled=!e.tempAutoemail.enabled,e.isTogglingAccountLevel=!0,(0,n.sendClickEvent)(e.tempAutoemail.enabled?"accountSetting_notificationSetEnabled":"accountSetting_notificationSetDisabled","1"),e.updateAutoemail()},e.touchAutoemail=()=>{e.isAutoemailTouched=!0},e.loadTempAutoemail=function(){var t;if(e.tempAutoemail={title:"",replyToEmail:"",body:"",sendType:"delay",delayTime:"0",timeZone:"",attachWaiver:!0,attachQRCode:!1,showDownloadLink:!0,forwardTo:"",sendTypeId:"0",delayTimeId:"9",enabled:!1},e.accountSettings.autoemail.autoemail){var i=e.accountSettings.autoemail.autoemail;e.tempAutoemail.title=i.title,e.tempAutoemail.replyToEmail=i.reply_to,e.tempAutoemail.body=i.plaintext,e.tempAutoemail.attachWaiver="yes"===i.attach_waiver,e.tempAutoemail.sendType=i.send_type,e.tempAutoemail.delayTime=i.delay_time,e.tempAutoemail.forwardTo=i.forward_to,e.tempAutoemail.sendTypeId="delay"===(t=e.tempAutoemail).sendType?t.delayTime+"":Math.floor(t.delayTime/24)+6+"",e.tempAutoemail.delayTimeId=function(e){return"delay"===e.sendType?"9":e.delayTime%24+""}(e.tempAutoemail),e.tempAutoemail.timeZone=i.time_zone,e.tempAutoemail.enabled="yes"===i.enabled,e.tempAutoemail.attachQRCode="yes"===i.attach_qrcode,e.tempAutoemail.showDownloadLink="yes"===i.show_download_link}e.accountSettings.autoemail.enabled||(e.tempAutoemail.showDownloadLink=!0),e.loadTimezones()},e.accountSettings&&(e.loadTempAutoemail(),e.showTemplateAutoemailTip="L3"===e.accountSettings.autoemail.autoemail_level,e.allowEmailEditing="L1"!==e.accountSettings.autoemail.autoemail_level),e.$
1watch("accountSettings",function(t,i){t&&!i&&(e.loadTempAutoemail(),e.showTemplateAutoemailTip="L3"===e.accountSettings.autoemail.autoemail_level,e.allowEmailEditing="L1"!==e.accountSettings.autoemail.autoemail_level)}),e.$watch("tempAutoemail.replyToEmail",function(t,i){t!==i&&e.touchAutoemail()})}]);var c=i(62409);angular.module("waiverforeverApp.accountSettings.automessage").controller("AccountSettingsAutosmsController",["$scope","WFApiClient","Confirmation","$timeout","premiumModalHelper","EDITOR_OPTIONS","$rootScope",function(e,t,i,n,a,l,r){e.title=i18next.t("Auto SMS Message"),e.isLoadingSettings=!0,e.isTogglingAccountLevelSms=!1,e.isSavingAutosms=!1,e.isAutosmsTouched=!1,e.smsCharLimit=160,e.timezones=[],e.froalaOptions={key:l.normal.key,attribution:!1,heightMin:150,toolbarSticky:!1,charCounterCount:!0,charCounterMax:160,wordCounterCount:!1,toolbarButtons:[],quickInsertButtons:[],placeholderText:"",language:(0,s.A)(r.currentUser),enter:FroalaEditor.ENTER_BR,events:{contentChanged:function(){e.touchAutosms()}}}
1,e.tempAutosms={enabled:!1,content:"Thank you for signing our waiver! We appreciate your participation and look forward to serving you.",showWaiverLink:!0,sendType:"delay",sendTypeId:"0",delayTime:"0",delayTimeId:"9",timeZone:""},e.touchAutosms=function(){e.isAutosmsTouched=!0},e.loadTimezones=function(){var t=o().olson.timezones;e.timezones=[],c.each(t,function(t){e.timezones.push({value:t,text:t})}),e.tempAutosms.timeZone&&"0"!==e.tempAutosms.timeZone||(e.tempAutosms.timeZone=o().determine().name())},e.sendDelayChanged=function(){e.touchAutosms(),e.tempAutosms.sendTypeId<6?(e.tempAutosms.sendType="delay",e.tempAutosms.delayTime=e.tempAutosms.sendTypeId,e.tempAutosms.timeZone="0"):(e.tempAutosms.sendType="next",e.tempAutosms.delayTime=parseInt(e.tempAutosms.delayTimeId)+parseInt(24*(e.tempAutosms.sendTypeId-6))+"",e.tempAutosms.timeZone&&"0"!==e.tempAutosms.timeZone||(e.tempAutosms.timeZone=o().determine().name()))},e.togglingAccountLevelSms=function(){e.tempAutosms.enabled=!e.tempAutosms.enabled,e.isTogglingAccountLevelSms=!0,e.updateAutosms()},e.updateAutosms=function(){e.isSavingAutosms=!0;let n=e.tempAutosms.content||"";n=n.replace(/<br\s*\/?>/gi,"\n").replace(/<[^>]+>/g,"");const a={enabled:e.tempAutosms.enabled,content:n,showWaiverLink:e.tempAutosms.showWaiverLink,sendType:e.tempAutosms.sendType,delayTime:e.tempAutosms.delayTime,timeZone:e.tempAutosms.timeZone};t.post("accountSettings/saveAutoSMS",a).then(function(){e.isAutosmsTouched=!1,e.getAccountSettings()}).catch(function(e){i.confirm({title:i18next.t("Save auto SMS failed"),message:e.data.failed,hideCancel:!0})}).finally(function(){e.isTogglingAccountLevelSms=!1,e.isSavingAutosms=!1})},e.loadTempAutosms=function(){if(e.accountSettings&&e.accountSettings.autoSms){const t=e.accountSettings.autoSms;e.tempAutosms.enabled=t.enabled||!1,t.sms&&(t.sms.content&&(e.tempAutosms.content=t.sms.content.replace(/\n/g,"<br>")),e.tempAutosms.showWaiverLink=void 0===t.sms.showWaiverLink||t.sms.showWaiverLink,e.tempAutosms.sendType=t.sms.sendType||"delay",e.tempAutosms.delayTime=(t.sms.delayTime||0)+"",e.tempAutosms.timeZone=t.sms.timeZone||"",e.tempAutosms.sendTypeId="delay"===e.tempAutosms.sendType?e.tempAutosms.delayTime+"":Math.floor(e.tempAutosms.delayTime/24)+6+"",e.tempAutosms.delayTimeId="delay"===e.tempAutosms.sendType?"9":e.tempAutosms.delayTime%24+"")}e.loadTimezones(),e.isAutosmsTouched=!1,e.isLoadingSettings=!1},e.accountSettings&&e.loadTempAutosms(),e.$watch("accountSettings",function(t,i){t&&!i&&e.loadTempAutosms()})}]);const r=angular.module("waiverforeverApp.accountSettings.automessage").controller("AccountSettingsAutomessageController",["$scope","$state","$rootScope",function(e,t,i){e.$state=t,e.isCnMarket=i.isCnMarket}])},79637(e){e.exports='<div class="modal-header team-user-header"> <h3 class="modal-title" ng-if="!updateUser" ng-i18next="Create Team User"></h3> <h3 class="modal-title" ng-if="updateUser" ng-i18next="Update Team User"></h3> </div> <div class="modal-body account-settings-module"> <div class="row wf-form" ng-if="!updateUser"> <form name="createUserEmail"> <div class="col-xs-4 wf-form-title-inline" ng-i18next="Email"></div> <div class="col-xs-8"> <input autofocus ng-model="admin.username" class="wf-input wf-block" type="text" ng-i18next="[placeholder]Email" ng-disabled="updateUser" ng-pattern="emailRegex" ng-required="true" name="email"/> <div class="wf-input-error" ng-messages="createUserEmail.email.$error"> <p ng-message="pattern" ng-i18next="Invalid email format."></p> </div> </div> </form> </div> <div class="row wf-form" ng-if="!updateUser"> <div class="col-xs-4 wf-form-title-inline" ng-i18next="Human Name"></div> <div class="col-xs-8"> <input autofocus autocomplete="off" ng-model="admin.humanName" class="wf-input wf-block" type="text" ng-i18next="[placeholder]Human Name"/> </div> </div> <div class="row wf-form" ng-if="updateUser"> <div class="col-xs-12 user-info-row"> <span class="user-avatar text-center" ng-bind="usernameFirstChar"></span> <span class="user-name" ng-bind="admin.username"></span> </div> <div class="col-xs-12 text-center"> <input autofocus autocomplete="off" ng-model="admin.humanName" class="wf-input wf-block" type="text" ng-i18next="[placeholder]Human Name"/>
1 <input ng-if="!isUsernameEmail" autocomplete="new-password" ng-model="admin.password" class="wf-input wf-block" type="password" ng-i18next="[placeholder]Password"/> <button ng-if="isUsernameEmail" class="wf-button reset-pwd-btn" ng-click="requestResetUserPwd()"> <div ng-if="sendingRequest" class="loading-img"></div> {{getResetBtnText()}} </button> </div> </div> <div class="row"> <div class="col-md-12"> <h4 ng-i18next="User Permissions"></h4> <h5 ng-i18next="Account level"></h5> <div class="permission-table"> <div uib-tooltip="{{\'Ability to change account settings\' | i18next}}" tooltip-placement="top" tooltip-append-to-body="true"> <div class="wf-logo-checkbox clickable" ng-class="{\'active\': admin.permissionMap.account_settings}" ng-click="admin.permissionMap.account_settings=!admin.permissionMap.account_settings"> <div> <img ng-src="/app/static/images/teamUsers/account-management.svg"/> <div ng-i18next="Account Management"></div> </div> <img ng-src="{{admin.permissionMap.account_settings?\'/app/static/images/c
1hecked-icon.svg\':\'/app/static/images/unchecked-icon.svg\'}}"/> </div> </div> <div uib-tooltip="{{\'Ability to change billing info\' | i18next}}" tooltip-placement="top" tooltip-append-to-body="true"> <div class="wf-logo-checkbox clickable" ng-class="{\'active\': admin.permissionMap.billing}" ng-click="admin.permissionMap.billing=!admin.permissionMap.billing"> <div> <img ng-src="/app/static/images/teamUsers/billing.svg"/> <div ng-i18next="Billing"></div> </div> <img ng-src="{{admin.permissionMap.billing?\'/app/static/images/checked-icon.svg\':\'/app/static/images/unchecked-icon.svg\'}}"/> </div> </div> <div uib-tooltip="{{\'Ability to create/delete template\' | i18next}}" tooltip-placement="top" tooltip-append-to-body="true"> <div class="wf-logo-checkbox clickable" ng-class="{\'active\': admin.permissionMap.template_management}" ng-click="admin.permissionMap.template_management=!admin.permissionMap.template_management"> <div> <img ng-src="/app/static/images/teamUsers/template-management.svg"/> <div ng-i18next="Template Management"></div> </div> <img ng-src="{{admin.permissionMap.template_management?\'/app/static/images/checked-icon.svg\':\'/app/static/images/unchecked-icon.svg\'}}"/> </div> </div> <div uib-tooltip="{{\'Ability to access My Customers page\' | i18next}}" tooltip-placement="top" tooltip-append-to-body="true"> <div class="wf-logo-checkbox clickable" ng-class="{\'active\': admin.permissionMap.crm}" ng-click="admin.permissionMap.crm=!admin.permissionMap.crm"> <div> <img ng-src="/app/static/images/teamUsers/crm.svg"/> <div ng-i18next="My Customers"></div> </div> <img ng-src="{{admin.permissionMap.crm?\'/app/static/images/checked-icon.svg\':\'/app/static/images/unchecked-icon.svg\'}}"/> </div> </div> </div> <h5 ng-i18next="Template level"></h5> <div class="permission-table col-5"> <div uib-tooltip="{{\'Ability to update template and template settings\' | i18next}}" tooltip-placement="top" tooltip-append-to-body="true"> <div class="wf-logo-checkbox clickable" ng-class="{\'active\': admin.permissionMap.template_editing}" ng-click="admin.permissionMap.template_editing=!admin.permissionMap.template_editing"> <div> <img ng-src="/app/static/images/teamUsers/template-editing.svg"/> <div ng-i18next="Template Editing"></div> </div> <img ng-src="{{admin.permissionMap.template_editing?\'/app/static/images/checked-icon.svg\':\'/app/static/images/unchecked-icon.svg\'}}"/> </div> </div> <div uib-tooltip="{{\'Ability to view waivers\' | i18next}}" tooltip-placement="top" tooltip-append-to-body="true"> <div class="wf-logo-checkbox clickable" ng-class="{\'active\': admin.permissionMap.view_waiver, \'disabled\': admin.permissionMap.waiver_editing}" ng-click="admin.permissionMap.view_waiver=admin.permissionMap.waiver_editing?admin.permissionMap.waiver_editing:!admin.permissionMap.view_waiver"> <div> <img ng-src="/app/static/images/teamUsers/view-waiver.svg"/> <div ng-i18next="View Waiver"></div> </div> <img ng-src="{{admin.permissionMap.view_waiver?\'/app/static/images/checked-icon.svg\':\'/app/static/images/unchecked-icon.svg\'}}"/> </div> </div> <div uib-tooltip="{{\'Ability to approve waivers and to edit notes/tags of waivers\' | i18next}}" tooltip-placement="top" tooltip-append-to-body="true"> <div class="wf-logo-checkbox clickable" ng-class="{\'active\': admin.permissionMap.waiver_editing}" ng-click="waiverEditingChanged()"> <div> <img ng-src="/app/static/images/teamUsers/waiver-editing.svg"/> <div ng-i18next="Waiver Editing"></div> </div> <img ng-src="{{admin.permissionMap.waiver_editing?\'/app/static/images/checked-icon.svg\':\'/app/static/images/unchecked-icon.svg\'}}"/> </div> </div> <div uib-tooltip="{{\'Ability to view analytics data\' | i18next}}" tooltip-placement="top" tooltip-append-to-body="true"> <div class="wf-logo-checkbox clickable" ng-class="{\'active\': admin.permissionMap.analytics}" ng-click="admin.permissionMap.analytics=!admin.permissionMap.analytics"> <div> <img ng-src="/app/static/images/teamUsers/analytics.svg"/> <div ng-i18next="Analytics"></div> </div> <img ng-src="{{admin.permissionMap.analytics?\'/app/static/images/checked-icon.svg\':\'/app/static/images/unchecked-icon.svg\'}}"/> </div> </div> <div uib-tooltip="{{\'Ability to export waiver data\' | i18next}}" tooltip-placement="top" tooltip-append-to-body="true"> <div class="wf-logo-checkbox clickable" ng-class="{\'active\': admin.permissionMap.data_exporting}" ng-click="admin.permissionMap.data_exporting=!admin.permissionMap.data_exporting"> <div> <img ng-src="/app/static/images/teamUsers/data-exporting.svg"/> <div ng-i18next="Data Exporting"></div> </div> <img ng-src="{{admin.permissionMap.data_exporting?\'/app/static/images/checked-icon.svg\':\'/app/static/images/unchecked-icon.svg\'}}"/> </div> </div> </div> <div class="wf-btn-group btn-group pull-right"> <label class="btn" ng-model="admin.permissionMap.template_access_list_type" uib-btn-radio="\'blacklist\'" ng-i18next="Blacklist"></label> <label class="btn" ng-model="admin.permissionMap.template_access_list_type" uib-btn-radio="\'whitelist\'" ng-i18next="Whitelist"></label> </div> <h4 ng-i18next="Accessible Templates"></h4> <div> {{totalSelectedTemplates()}} <ng-pluralize count="totalSelectedTemplates()" when="{\'0\': \'template is\',\'one\'
1: \'template is\',\'other\': \'templates are\'}"></ng-pluralize> <span ng-if="admin.permissionMap.template_access_list_type==\'blacklist\'" ng-i18next="blocked"></span> <span ng-if="admin.permissionMap.template_access_list_type==\'whitelist\'" ng-i18next="allowed"></span> for this user </div> <div class="clearfix"></div> <div class="template-access-list"> <div ng-repeat="template in templates" ng-class="{selected: template.isSelected}" class="template clickable" ng-click="template.isSelected=!template.isSelected"> <div class="wf-checkbox" ng-click="$event.stopPropagation()"> <input type="checkbox" name="{{template.id}}" ng-model="template.isSelected" id="{{template.id}}"> <label for="{{template.id}}">{{template.title}}<span ng-if="template.isDisabled"> - (deactivated)</span></label> </div> </div> </div> </div> </div> <br/> <div ng-if="errorMessage" class="alert alert-warning">{{errorMessage}}</div> </div> <div class="modal-footer team-user-footer"> <span class="wf-button wf-button-secondary" ng-click="cancel()" ng-i18next="Cancel"></span> <span class="wf-button" ng-click="ok()" ng-if="!updateUser" ng-i18next="Create"></span> <span class="wf-button" ng-click="ok()" ng-if="updateUser" ng-i18next="Update"></span> </div> '},89571(e){e.exports='<img class="close-button" src="/app/static/images/close.svg" alt="close button" ng-click="vm.dismiss()"/> <div class="hubspot-modal-container"> <h2 class="title" ng-i18next="Hubspot Integration Details"></h2> <h3 class="step-title"> <span ng-i18next="Step1"></span>: <span class="step-name" ng-i18next="Activate the Connection"></span> </h3> <ul class="step-list"> <li class="step-entry"> <span ng-i18next="Please click the link"></span> (<a class="hubspot-connect-link" href="{{vm.hubspotUrl}}" title="{{vm.hubspotUrl}}" target="_blank">{{vm.hubspotUrl}}</a>) <span ng-i18next="to activate the connection."></span> </li> <li class="step-entry" ng-i18next="Click the Check Connection button to validate the connection has been activated."></li> </ul> <div ng-switch="vm.checkConnectionState"> <button class="wf-button-small" ng-switch-when="initial" ng-i18next="Check Connection" ng-click="vm.checkConnection()"></button> <button class="wf-button-small" ng-switch-when="failed" ng-i18next="Check Failed" ng-click="vm.checkConnection()"></button> <button class="wf-button-small" ng-switch-when="checking" ng-i18next="Checking ..."></button> <button class="wf-button-small" ng-switch-when="success" ng-i18next="Success"></button> </div> <h3 class="step-title"> <span ng-i18next="Step2"></span>: <span class="step-name" ng-i18next="Add a new contact property called WaiverForeverLink"></span> </h3> <ul class="step-list"> <li class="step-entry"> <div> <span ng-i18next="In your HubSpot account, click the settings in the top navigation bar."></span> </div> </li> <li class="step-entry" ng-i18next="In the left sidebar menu, navigate to Properties."></li> <li class="step-entry" ng-i18next="Click the Select an object dropdown menu, then select [Contact properties] to create a property for that object. In the upper right, click Create property."></li> <li class="step-entry" ng-i18next=\'Enter "WaiverForeverLink" for the property label, leave the internal name as "waiverforeverlink", select Contact as the Object type, set group as contract information, choose "multi-line text" as - the file type, leave max length as unchecked, then click save.\'></li> <li class="step-entry" ng-i18next="Open any existed contact detail, in your [About this contact] module, Click the setting icon in the top right of this module, click [Add properties] in the right panel, search WaiverForeverLink and check, then click save."></li> <li class="step-entry" ng-i18next="Click the Check Property button to validate the option has been correctly added."></li> </ul> <div ng-switch="vm.checkOptionState"> <button class="wf-button-small" ng-switch-when="initial" ng-i18next="Check Property" ng-click="vm.checkOptions()"></button> <button class="wf-button-small" ng-switch-when="failed" ng-i18next="Check Failed" ng-click="vm.checkOptions()"></button> <button class="wf-button-small" ng-switch-when="checking" ng-i18next="Checking ..."></button> <button class="wf-button-small" ng-switch-when="success" ng-i18next="Success"></button> </div> <h3 class="step-title"> <span ng-i18next="Step3"></span>: <span class="step-name" ng-i18next="Select the template to connect with Hubspot"></span> <span class="step-name">(</span><span class="step-name" ng-i18next="Optional"></span><span class="step-name">)</span> </h3> <ul class="step-list"> <li class="step-entry" ng-i18next="Select the template you want to connect with Hubspot, go to its template setting - integrationï¼ scroll down to Hubspot and turn on the feature."></li> </ul> <a class="help-center-link" href="https://help.waiverforever.com/hc/en-us/articles/39515171925395-Integration-Hubspot-and-WaiverForever" ng-i18next="Click here to read the complete Hubspot and WaiverForever Integration guide"></a> <button class="wf-button-secondary-small dismiss-button" ng-i18next="Dismiss" ng-click="vm.dismiss()"></button> </div> '},93141(e){e.exports='<div class="zapier-modal-container"> <h2 class="zapier-title" ng-i18next="Zapier Integration"></h2> <div class="zapier-body"> <div class="zapier-text" ng-i18next="Zapier Key:"></div> <div class="zapier-key" ng-click="vm.copy()"> {{vm.resolve.key}} <img class="zapier-copy" src="/app/static/images/integrations/copy.svg" alt="copy"> </div> </div> <a class="zapier-help-link" target="_blank" href="https://help.waiverforever.com/hc/en-us/articles/360015183134-How-to-use-the-WaiverForever-Zapier-Integration" ng-i18next="Click here to learn more about how to use zapier"></a> <button class="wf-button zapier-button" ng-click="vm.modalInstance.close()" ng-i18next="OK"></button> </div> '},95914(e){e.exports='<div class="main-body account-settings-module"> <div id="body_section_title"> <div class="row"> <div class="col-md-4"> <span>{{title}}</span> <span class="wf-info clickable" uib-popover-html="settingTooltip" popover-trigger="\'mouseenter\'" popover-placement="bottom-left"> <i class="fa fa-info-circle" aria-hidden="true"></i> </span> </div> </div> </div> <div id="body_section_content" ng-class="{\'mobile-vertical-layout\': shouldUseMobileVerticalLayout()}"> <div class="account-settings-tabs-wrapper" ng-class="{\'disable-horizontal-swipe\': shouldUseMobileVerticalLayout()}"> <button type="button" class="mobile-tab-arrow left" ng-click="scrollTabs(-1)" ng-if="shouldShowMobileTabArrows()" ng-disabled="!tabScroll.canScrollLeft" ng-attr-aria-label="{{\'Scroll tabs left\' | i18next}}"> <i class="fa fa-chevron-left" aria-hidden="true"></i> </button> <tabs data="tabData" class="wf-tabs account-settings-tabs" template-url="ui-router-tabs-custom-ui-view-template.html"></tabs> <button type="button" class="mobile-tab-arrow right" ng-click="scrollTabs(1)" ng-if="shouldShowMobileTabArrows()" ng-disabled="!tabScroll.canScrollRight" ng-attr-aria-label="{{\'Scroll tabs right\' | i18next}}"> <i class="fa fa-chevron-right" aria-hidden="true"></i> </button> </div>
1 <ui-view></ui-view> </div> <div id="body_section_underbar"> </div> </div> '},98332(){angular.module("waiverforeverApp.accountSettings").controller("EditEmailNameModalCtrl",["$scope","$uibModalInstance","email","WFApiClient",function(e,t,i,n){e.newName=angular.copy(i.display_name),e.isUpdating=!1,e.updateName=function(){e.isUpdating=!0;var a={email:i.address,display_name:e.newName};n.post("accountSettings/updateEmail",a).then(function(i){i.data.result&&t.close(e.newName)}).finally(function(){t.dismiss("cancel")})},e.ok=function(){t.close()},e.cancel=function(){t.dismiss("cancel")}}])},99249(e,t,i){angular.module("waiverforeverApp.accountSettings").controller("AccountSettingsApiController",["$scope","$state","$uibModal","$timeout","Confirmation","$location","WFApiClient","premiumModalHelper","toastr",function(e,t,n,a,o,s,l,c,r){e.integrationLimitationDataLoaded=!1,e.isUpdatingApps=!1,e.apps=[],e.fetchApps=function(){return l.get("applications").then(function(t){var i=t.data;i.result&&(e.apps=i.success.applications)}).catch(function(){r.error("Failed to fetch applications.")})},e.showCreateAppModal=function(){if(!e.accountSettings.apiAvailable)return c.open({featureKey:"API & Webhook",featureName:i18next.t("API & Webhook"),description:i18next.t("Unlock the full potential of your business with WaiverForever's innovative APIs â perfect for customizing your own workflows."),source:"integration"});n.open({animation:!0,template:i(22679),controller:"AccountSettingsCreateAppModalCtrl",size:"md"}).result.then(function(t){e.createNewApp(t)},function(){})},e.createNewApp=function(t){e.isUpdatingApps=!0,l.post("applications",t).then(function(t){t.data.result&&e.fetchApps()}).finally(function(){e.isUpdatingApps=!1}).catch(function(){r.error("Failed to create application.")})},e.revokeApiKey=function(t){o.confirm({title:i18next.t("Revoke Application"),message:i18next.t("Please confirm to revoke this app.")}).then(()=>e.revoke(t))},e.revoke=function(t){e.isUpdatingApps=!0,l.post("applications/"+t,{}).then(function(t){t.data.result&&e.fetchApps()}).catch(function(){r.error("Failed to revoke application.")}).finally(function(){e.isUpdatingApps=!1})},e.init=function(){e.fetchApps()},e.init()}])}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.