Overview
Enterprise applications often rely on legacy or complex data sources that struggle to provide real-time responses. By blocking the loading of an interface while waiting for these slow sources, the user experience is degraded. This component allows your interfaces to load immediately with data that's available already and receive push updates once the slow to request data is available. This allows the user to start working with the data they have immediately without being blocked by the slowest data source.
Key Features & Functionality
Hello. I am having problems, regardless of the browser I am using. I have tried Edge, Chrome or Firefox). It has started to occur recently.
The onError parameter is always executed with the value '<!DOCTYPE html>' in the save!value variable.
The database where the events are written is jdbc/Appian and they are high availability Appian Cloud environments. Sail Events Field and Sail Events Servlet are in the latest versions.
Checking the http call log in the browser, the response is the login html in Appian. It looks as if the communication between call and response is lost, including the user's session in Appian.
I look forward to hearing from you. Thank you very much.
<!DOCTYPE html> <link rel="stylesheet" href="https://web-assets.appian-cdn.com/YWUtMjQuMy4yMDAuMA/portal/css/banner.css?appian_environment=tempo" type="text/css" /> <script type="text/javascript"> var hasSiteWideBanner = "false"; if (window.APPIAN) { window.APPIAN.bannerInfo = { hasSiteWideBanner: hasSiteWideBanner === 'true', bannerMessage: "", bannerColor: "#666666", bannerTextColor: "#ffffff" }; } </script> <html lang="en" dir="ltr"> <head> <!-- IMPORTANT: this cannot have any style/script between it and the top of the head! IE requires it to handle versions properly. See http://www.modern.ie/en-us/performance/how-to-use-x-ua-compatible for more --> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="content-type" content="text/html" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" href="https://web-assets.appian-cdn.com/YWUtMjQuMy4yMDAuMA/portal/css/standard_styles_static.css?appian_environment=tempo" type="text/css" /> <script type="text/javascript"> function isInIframe() { try { return window.self !== window.top; } catch (exception) { // if in cross-origin, cannot access window.top return true; } } </script> <link rel="stylesheet" href="https://web-assets.appian-cdn.com/YWUtMjQuMy4yMDAuMA/portal/css/login.css?appian_environment=tempo" type="text/css" /> <link rel="shortcut icon" href="https://XXXXXXXXX.appiancloud.com/suite/rest/a/content/latest/branding/favicon/1538660930000" /> <style> body.appian-body { background: #ebf1f7; } body.appian-body.mobile-landing { background: #fff; } .appian-body .message { color: red; } .appian-body form .field input { color: #333; border-color: #ccc; } .appian-body .submitButton { background-color: #E8E8E8; border: 1px solid #B0B0B0; color: #333333; font-size: 11px; font-weight: bold; } .appian-body .login_background { background-color: #ec0000; } .appian-body .login_box input[type=text]:focus, .appian-body .login_box input[type=password]:focus { border: 1px solid #ec0000; } .appian-body .button_box_links a:active { border-color: #ec0000; } .appian-body #back_link, .appian-body .button_box_links a, .appian-body .logoutForm #returnLink { color: #ec0000; } .appian-body .button_box_links a:hover, .appian-body .button_box_links a:focus { border-bottom: 1px solid #ec0000; color: #ec0000; } .appian-body .btn { color: #ec0000; border: 1px solid #ec0000; } .appian-body input.iBlueButton { border: 1px solid #ec0000; background-color: #ec0000; } .appian-body .btn.primary { background-color: #ec0000; } .appian-body .btn:active, .appian-body .btn:focus, .appian-body .btn:hover, .appian-body .choice_pair input[type=checkbox]:focus + label:before, .appian-body input.iBlueButton:active, .appian-body input.iBlueButton:focus, .appian-body input.iBlueButton:hover { box-shadow: 0 0px 5px #ec0000; } .appian-body input.iText:focus { border: 1px solid #ec0000 !important; /* ASI styles using !important to set blue border color */ } .appian-body .logoutForm #returnLink:hover { border-bottom: 1px solid #ec0000 } .appian-body #back_link:hover { color: #ec0000; border-bottom: 1px solid #ec0000; } .appian-body .choice_pair input[type=checkbox]:checked + label:before { background-color: #ec0000; border-color: #ec0000; } .appian-body .mobile_landing_links { color: #777; } .appian-body .mobile_landing_links a { color: #ec0000; } .appian-body a.mobile_landing_button.primary { color: #fff; background-color: #ec0000; } .appian-body a.mobile_landing_button.secondary { color: #ec0000; border: 1px solid #ec0000; } </style> <title>Appian for XXXXXXXXX Espana (CERT)</title> <script> var isEmbeddedLogin = location.pathname.indexOf('/suite/cors/wc') === 0; (function() { // frame buster; make sure we are not loaded within a frameset if (!location.origin){ location.origin = location.protocol+"//"+location.hostname; if (location.port && (location.port != 80 && location.port != 443)) { location.origin = location.origin +":"+location.port; } } if (top != self) { if ( /https*[:][/][/]XXXXXXXXX.XXXXXXXXX.cert.corp[/].*/.test(document.referrer) || /https*[:][/][/]cloudsoppre-dynamic.XXXXXXXXX.pre.corp[/].*/.test(document.referrer) || /https*[:][/][/]cloudsoppre-static.XXXXXXXXX.pre.corp[/].*/.test(document.referrer) || /https*[:][/][/]cloudsoppre.XXXXXXXXX.pre.corp[/].*/.test(document.referrer) || /https*[:][/][/]sestructurales.pru.bsch[/].*/.test(document.referrer) ){ } else if (document.referrer.indexOf(location.origin+'/') != 0 || !isEmbeddedLogin) { top.location.replace(self.location.href); } } // if redirection to login occurs in a window opened from // the main one, then redirect the main window to the login // page and close the child var ENVIRONMENT_PARAM_NAME = 'appian_environment'; try{ if(top.opener && top.opener.location.href && !isEmbeddedLogin) { var environmentRegex = new RegExp(ENVIRONMENT_PARAM_NAME + "=\\S+$"); top.opener.location.replace(location.pathname.replace(environmentRegex, top.opener.location.pathname.match(environmentRegex))); top.close(); } } catch(e){} })(); function getCookieValue(name) { var name = name + "="; var cookieArray = document.cookie.split(';'); for(var i=0; i<cookieArray.length; i++) { var currentCookie = cookieArray[i]; while (currentCookie.charAt(0)==' ') { currentCookie = currentCookie.substring(1); } if (currentCookie.indexOf(name) != -1) { return currentCookie.substring(name.length,currentCookie.length); } } return ""; } function addClass(el, newClassName){ el.className += ' ' + newClassName; } function removeClass(el, removeClassName){ var elClass = el.className; while(elClass.indexOf(removeClassName) != -1) { elClass = elClass.replace(removeClassName, ''); } el.className = elClass; } function acceptTermsOfService() { addClass(document.getElementById("notification"),"not_visible"); removeClass(document.getElementById("loginForm"),'not_visible'); removeClass(document.getElementById("loginBox"),'notification_form'); document.getElementById("un").focus(); } function supportsSameSiteNone() { return true; } function getCookieAppend() { if (!window.isSecureContext) { return ''; } var append = '; Secure; Partitioned'; if (!supportsSameSiteNone()) { return append; } return append + '; SameSite=None'; } var hasSubmitted = false; var login_jsp = { validateForCookiesAndSecureRequest : function() { if (hasSubmitted) { return false; } var sameSiteAppend = getCookieAppend(); document.cookie = '__appianCookieCheck=isEnabled' + sameSiteAppend; var re = new RegExp('__appianCookieCheck=([^;]*);?','gi'); var appianCookie = re.exec(document.cookie)||[]; var isCookieEnabled = 'isEnabled' === (appianCookie.length>1?appianCookie[1]:''); document.cookie = '__appianCookieCheck=;expires=Fri, 02-Jan-1970 00:00:00 GMT' + sameSiteAppend; if (!isCookieEnabled) { var noCookieMsg = document.getElementById('login_jsp_cookiesMsg'); noCookieMsg.style.display = ''; return false; } var csrfTokenField = document.createElement("input"); csrfTokenField.setAttribute("type", "hidden"); csrfTokenField.setAttribute("name", "X-APPIAN-CSRF-TOKEN"); csrfTokenField.setAttribute("value", getCookieValue("__appianCsrfToken")); document.getElementById("loginForm").appendChild(csrfTokenField); if(isEmbeddedLogin) { const embeddedOriginField = document.createElement("input"); embeddedOriginField.setAttribute("type", "hidden"); embeddedOriginField.setAttribute("name", "embeddedOrigin"); embeddedOriginField.setAttribute("value", location.origin); document.getElementById("loginForm").appendChild(embeddedOriginField); const embeddedQueryStringField = document.createElement("input"); embeddedQueryStringField.setAttribute("type", "hidden"); embeddedQueryStringField.setAttribute("name", "embeddedQueryString"); embeddedQueryStringField.setAttribute("value", location.search); document.getElementById("loginForm").appendChild(embeddedQueryStringField); } hasSubmitted = true; return true; } }; window.sessionStorage && location.hash && sessionStorage.setItem("hash", location.hash); </script> </head> <body onload="try{if(document.getElementsByName('un')[0].value.length>0) {document.getElementsByName('pw')[0].focus();} else { document.getElementsByName('un')[0].focus();}}catch(e){}" class="appian-body"> <div id="systemMessages" style="display: none"> </div> <script type="text/javascript"> if (!isInIframe()) { document.getElementById("systemMessages").style.display="block"; } </script> <div class="appian_logo"> </div> <div class="login_background"> </div> <div id="loginBox" class="login_box "> <div class="login_box_inner"> <div class="login_logo"> <img id="logo" src="https://XXXXXXXXX.appiancloud.com/suite/rest/a/content/latest/branding/logo/1538660930000" alt="Logo"/> </div> <form id="notification" class="not_visible"> <div id="notificationText"></div> <div class="button_box"> <div class="button_box_content"> <div class="button_box_buttons"> <input type="button" class="btn primary" value="Acepto" onclick="acceptTermsOfService()" /> </div> </div> </div> </form> <form id="loginForm" class="" action="/suite/auth?appian_environment=tempo" method="post" onsubmit="return login_jsp.validateForCookiesAndSecureRequest();"> <div class="field_layout"> <label class="accessibilityhidden" for="un">Nombre de usuario</label> <div class="input_below"> <input placeholder="Nombre de usuario" id="un" name="un" type="text" value="" size="34" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" aria-required="true" aria-describedby="errorMsg" /> </div> </div> <div class="field_layout"> <label class="accessibilityhidden" for="pw">Contraseña</label> <div class="input_below"> <input placeholder="Contraseña" id="pw" name="pw" type="password" size="34" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" aria-required="true" aria-describedby="errorMsg" /> </div> </div> <div class="field_layout"> <div> <div class="choice_pair"> <input id="remember" name="_spring_security_remember_me" type="checkbox"/> <label for="remember">Recordarme</label> </div> </div> </div> <script> var key = 'REMEMBER_ME_ENABLED', cookieKey = '__localStorage.'+key; setTimeout(function(){ var el = document.getElementById('remember'); el.checked = localStorage ? 'off' != localStorage.getItem(key) : document.cookie.indexOf(cookieKey+'=off') != -1; window.login_jsp.saveRemember = function() { if (el.checked) { if (localStorage) { localStorage.setItem(key, 'on'); } else { document.cookie = cookieKey+'=on'; } } else { if (localStorage) { localStorage.setItem(key, 'off'); } else { document.cookie = cookieKey+'=off;'; } } return true; }; }, 1); </script> <div class="button_box"> <div class="button_box_content"> <div class="button_box_links"> <div class="button_box_link_wrapper"> <a id="forgotPasswordLink" href="/suite/forgotpasswordrequest?appian_environment=tempo"> ¿Olvidó su contraseña? </a> </div> </div> <div class="button_box_buttons"> <input type="submit" class="btn primary" value="Entrar" onclick="return login_jsp.saveRemember && login_jsp.saveRemember() || true;" /> </div> </div> </div> </form> </div> </div> <div id="copyright"> ©2003-2024 Appian Corporation </div> <link rel="stylesheet" href="https://web-assets.appian-cdn.com/YWUtMjQuMy4yMDAuMA/portal/css/fonts/open-sans.css?appian_environment=tempo" type="text/css" /> </body> </html>
Hi Raul, I’ve had the same issue, and I think it’s because Appian is being opened in incognito mode. I assume it must be using some type of cookie that it can’t access in incognito mode, but that’s just my intuition. The same setup works fine in normal mode on both Edge and Chrome.
Thank you for this very helpful plug-in! I am having trouble when using Edge or Firefox, it works just fine on Chorme.When I use Edge or Firefox the plugin errors out instantly, the errror is the following: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">Is this plug-in only compatible with Chrome?Thanks in advance!
For anyone experiencing this, v1.1.1 of the 'SAIL Events Servlet' plug-in adds support for SQL Server. Thank you for testing mikelGran
Thank you for the functionality. We think it can be very useful! However, we are facing some problems trying to use it.
We have an on premise installation with SQL Server and as soon as we run any SAIL with the saileventfield, we have the following error in tomcat stdout:
2023-11-17 07:48:26,504 [pool-241-thread-1] ERROR com.appiancs.plugins.sailevents.SAILEventsServlet - Error while retrieving event context keys com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near 'LIMIT'. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:262) at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1632) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:600)Is it working on SQL serveR?
The sail-events-field.zip is an Appian Component plug-in (deploy it the same way as regular .jar based plug-ins). There is not example Appian application (yet), however take a look at the documentation for basic SAIL usage examples
Hi Team, Getting the following Error while deploying the zip.
HTTP Code: 500 APNX-1-4198-000 Error Evaluating UI Expression Expression evaluation error [evaluation ID = d1178:4c2ed] : [valid:false,syntaxError:false,value:Expression evaluation error: An error occurred while executing a save: Expression evaluation error at function a!packageTypeFunction [line 4]: ]