a first prototype for a Qualtrics integration

This commit is contained in:
Axel Uhl committed 2020-05-11 16:49:40 +02:00
1 parent 8806700013
commit 73ebc58c36
19 files changed
+123 -34

No files matched your search

@@ -2,5 +2,6 @@
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.7.0//EN" "http://gwtproject.org/doctype/2.7.0/gwt-module.dtd"> <!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.7.0//EN" "http://gwtproject.org/doctype/2.7.0/gwt-module.dtd">
<module> <module>
<inherits name='com.sap.sailing.gwt.home.HomeBase'/> <inherits name='com.sap.sailing.gwt.home.HomeBase'/>
<inherits name='com.sap.sse.gwt.Qualtrics'/>
<entry-point class="com.sap.sailing.gwt.home.shared.SwitchingEntryPoint" /> <entry-point class="com.sap.sailing.gwt.home.shared.SwitchingEntryPoint" />
</module> </module>
@@ -22,7 +22,7 @@
<inherits name='com.google.gwt.ajaxloader.AjaxLoader' /> <inherits name='com.google.gwt.ajaxloader.AjaxLoader' />
<inherits name='com.google.gwt.maps.Maps' /> <inherits name='com.google.gwt.maps.Maps' />
<!-- module containing locale configuration --> <!-- module containing locale configuration -->
<inherits name='com.sap.sailing.gwt.common.SailingLocalesAllPermutations' /> <inherits name='com.sap.sailing.gwt.common.SailingLocalesAllPermutations' />
<source path='client' /> <source path='client' />
@@ -38,10 +38,10 @@
<inherits name='com.sap.sailing.gwt.ui.SourceActions'/> <inherits name='com.sap.sailing.gwt.ui.SourceActions'/>
<inherits name='com.sap.sailing.gwt.ui.SourceSimulator'/> <inherits name='com.sap.sailing.gwt.ui.SourceSimulator'/>
<inherits name="com.sap.sailing.gwt.ui.SourceAdminConsole"/> <inherits name="com.sap.sailing.gwt.ui.SourceAdminConsole"/>
<!-- TODO: probably only used for flag images. Move RegattaRaceStatesFlagsResources to shared --> <!-- TODO: probably only used for flag images. Move RegattaRaceStatesFlagsResources to shared -->
<inherits name="com.sap.sailing.gwt.regattaoverview.SourceRegattaOverview"/> <inherits name="com.sap.sailing.gwt.regattaoverview.SourceRegattaOverview"/>
<inherits name="com.sap.sailing.gwt.ui.SourceLeaderboard"/> <inherits name="com.sap.sailing.gwt.ui.SourceLeaderboard"/>
<inherits name="com.sap.sailing.gwt.ui.SourceRaceboard"/> <inherits name="com.sap.sailing.gwt.ui.SourceRaceboard"/>
<inherits name='com.sap.sse.gwt.CommonControlCSS'/> <inherits name='com.sap.sse.gwt.CommonControlCSS'/>
<inherits name='com.sap.sailing.gwt.settings.Settings'/> <inherits name='com.sap.sailing.gwt.settings.Settings'/>
@@ -22,6 +22,7 @@ import com.sap.sailing.gwt.home.shared.SwitchingEntryPoint;
import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.controls.languageselect.LanguageSelector; import com.sap.sse.gwt.client.controls.languageselect.LanguageSelector;
import com.sap.sse.gwt.qualtrics.Qualtrics;
import com.sap.sse.gwt.shared.ClientConfiguration; import com.sap.sse.gwt.shared.ClientConfiguration;
import com.sap.sse.gwt.shared.DebugConstants; import com.sap.sse.gwt.shared.DebugConstants;
@@ -32,7 +33,7 @@ public class Footer extends Composite {
} }
@UiField AnchorElement whatsNewAnchor; @UiField AnchorElement whatsNewAnchor;
@UiField AnchorElement sapJobsAnchor; @UiField AnchorElement supportAnchor;
@UiField AnchorElement feedbackAnchor; @UiField AnchorElement feedbackAnchor;
@UiField LanguageSelector languageSelector; @UiField LanguageSelector languageSelector;
@UiField DivElement copyrightDiv; @UiField DivElement copyrightDiv;
@@ -59,23 +60,29 @@ public class Footer extends Composite {
} }
} }
}); });
Event.sinkEvents(feedbackAnchor, Event.ONCLICK);
Event.setEventListener(feedbackAnchor, event->{
if (Event.ONCLICK == event.getTypeInt()) {
event.preventDefault();
event.stopPropagation();
Qualtrics.triggerIntercepts();
}
});
if (!ClientConfiguration.getInstance().isBrandingActive()) { if (!ClientConfiguration.getInstance().isBrandingActive()) {
copyrightDiv.getStyle().setDisplay(NONE); copyrightDiv.getStyle().setDisplay(NONE);
languageSelector.setLabelText(StringMessages.INSTANCE.whitelabelFooterLanguage()); languageSelector.setLabelText(StringMessages.INSTANCE.whitelabelFooterLanguage());
sapJobsAnchor.getStyle().setDisplay(Display.NONE); supportAnchor.getStyle().setDisplay(Display.NONE);
feedbackAnchor.getStyle().setDisplay(Display.NONE); feedbackAnchor.getStyle().setDisplay(Display.NONE);
whatsNewAnchor.getStyle().setDisplay(Display.NONE); whatsNewAnchor.getStyle().setDisplay(Display.NONE);
imprintAnchorLink.getStyle().setDisplay(Display.NONE); imprintAnchorLink.getStyle().setDisplay(Display.NONE);
privacyAnchorLink.getStyle().setDisplay(Display.NONE); privacyAnchorLink.getStyle().setDisplay(Display.NONE);
} }
copyrightDiv.setAttribute(DebugConstants.DEBUG_ID_ATTRIBUTE, "copyrightDiv"); copyrightDiv.setAttribute(DebugConstants.DEBUG_ID_ATTRIBUTE, "copyrightDiv");
sapJobsAnchor.setAttribute(DEBUG_ID_ATTRIBUTE, "sapJobsAnchor"); supportAnchor.setAttribute(DEBUG_ID_ATTRIBUTE, "feedbackAnchor");
feedbackAnchor.setAttribute(DEBUG_ID_ATTRIBUTE, "feedbackAnchor"); feedbackAnchor.setAttribute(DEBUG_ID_ATTRIBUTE, "feedbackAnchor");
whatsNewAnchor.setAttribute(DEBUG_ID_ATTRIBUTE, "whatsNewAnchor"); whatsNewAnchor.setAttribute(DEBUG_ID_ATTRIBUTE, "whatsNewAnchor");
imprintAnchorLink.setAttribute(DEBUG_ID_ATTRIBUTE, "imprintAnchorLink"); imprintAnchorLink.setAttribute(DEBUG_ID_ATTRIBUTE, "imprintAnchorLink");
privacyAnchorLink.setAttribute(DEBUG_ID_ATTRIBUTE, "privacyAnchorLink"); privacyAnchorLink.setAttribute(DEBUG_ID_ATTRIBUTE, "privacyAnchorLink");
languageSelector.getElement().setAttribute(DEBUG_ID_ATTRIBUTE, "languageSelector"); languageSelector.getElement().setAttribute(DEBUG_ID_ATTRIBUTE, "languageSelector");
} }
} }
@@ -20,10 +20,10 @@
<a ui:field="privacyAnchorLink" href="https://www.sap.com/about/legal/privacy.html" target="_blank" class="{local_res.css.sitefooter_links_link}"> <a ui:field="privacyAnchorLink" href="https://www.sap.com/about/legal/privacy.html" target="_blank" class="{local_res.css.sitefooter_links_link}">
<ui:text from='{i18n.footerPrivacy}' /> <ui:text from='{i18n.footerPrivacy}' />
</a> </a>
<a ui:field="sapJobsAnchor" href="https://jobs.sap.com" target="_blank" class="{local_res.css.sitefooter_links_link}"> <a ui:field="supportAnchor" href="mailto:support%40sapsailing.com?subject=[SAP Sailing] Feedback" target="_blank" class="{local_res.css.sitefooter_links_link}">
<ui:text from='{i18n.footerJobs}'/> <ui:text from='{i18n.footerSupport}' />
</a> </a>
<a ui:field="feedbackAnchor" href="mailto:support%40sapsailing.com?subject=[SAP Sailing] Feedback" target="_blank" class="{local_res.css.sitefooter_links_link}"> <a ui:field="feedbackAnchor" href="" class="{local_res.css.sitefooter_links_link}">
<ui:text from='{i18n.footerFeedback}' /> <ui:text from='{i18n.footerFeedback}' />
</a> </a>
<a ui:field="mobileUi" href="HomeMobile.html" <a ui:field="mobileUi" href="HomeMobile.html"
@@ -21,6 +21,7 @@ import com.sap.sailing.gwt.home.mobile.app.MobilePlacesNavigator;
import com.sap.sailing.gwt.home.shared.SwitchingEntryPoint; import com.sap.sailing.gwt.home.shared.SwitchingEntryPoint;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.controls.languageselect.LanguageSelector; import com.sap.sse.gwt.client.controls.languageselect.LanguageSelector;
import com.sap.sse.gwt.qualtrics.Qualtrics;
import com.sap.sse.gwt.shared.ClientConfiguration; import com.sap.sse.gwt.shared.ClientConfiguration;
/** /**
@@ -33,7 +34,7 @@ public class Footer extends Composite {
} }
@UiField Anchor whatsNewLinkUi; @UiField Anchor whatsNewLinkUi;
@UiField AnchorElement sapJobsAnchor; @UiField AnchorElement supportAnchor;
@UiField AnchorElement feedbackAnchor; @UiField AnchorElement feedbackAnchor;
@UiField LanguageSelector languageSelector; @UiField LanguageSelector languageSelector;
@UiField DivElement copyrightDiv; @UiField DivElement copyrightDiv;
@@ -45,10 +46,8 @@ public class Footer extends Composite {
public Footer(MobilePlacesNavigator placeNavigator) { public Footer(MobilePlacesNavigator placeNavigator) {
this.placeNavigator = placeNavigator; this.placeNavigator = placeNavigator;
FooterResources.INSTANCE.css().ensureInjected(); FooterResources.INSTANCE.css().ensureInjected();
initWidget(uiBinder.createAndBindUi(this)); initWidget(uiBinder.createAndBindUi(this));
placeNavigator.getImprintNavigation().configureAnchorElement(imprintAnchorLink); placeNavigator.getImprintNavigation().configureAnchorElement(imprintAnchorLink);
DOM.sinkEvents(desktopUi, Event.ONCLICK); DOM.sinkEvents(desktopUi, Event.ONCLICK);
DOM.setEventListener(desktopUi, new EventListener() { DOM.setEventListener(desktopUi, new EventListener() {
@Override @Override
@@ -59,11 +58,18 @@ public class Footer extends Composite {
} }
} }
}); });
Event.sinkEvents(feedbackAnchor, Event.ONCLICK);
Event.setEventListener(feedbackAnchor, event->{
if (Event.ONCLICK == event.getTypeInt()) {
event.preventDefault();
event.stopPropagation();
Qualtrics.triggerIntercepts();
}
});
if (!ClientConfiguration.getInstance().isBrandingActive()) { if (!ClientConfiguration.getInstance().isBrandingActive()) {
copyrightDiv.getStyle().setDisplay(NONE); copyrightDiv.getStyle().setDisplay(NONE);
languageSelector.setLabelText(StringMessages.INSTANCE.whitelabelFooterLanguage()); languageSelector.setLabelText(StringMessages.INSTANCE.whitelabelFooterLanguage());
sapJobsAnchor.getStyle().setDisplay(Display.NONE); supportAnchor.getStyle().setDisplay(Display.NONE);
feedbackAnchor.getStyle().setDisplay(Display.NONE); feedbackAnchor.getStyle().setDisplay(Display.NONE);
whatsNewLinkUi.getElement().getStyle().setDisplay(Display.NONE); whatsNewLinkUi.getElement().getStyle().setDisplay(Display.NONE);
imprintAnchorLink.getStyle().setDisplay(Display.NONE); imprintAnchorLink.getStyle().setDisplay(Display.NONE);
@@ -74,5 +80,4 @@ public class Footer extends Composite {
void onWhatsNew(ClickEvent e) { void onWhatsNew(ClickEvent e) {
placeNavigator.getWhatsNewNavigation(WhatsNewPlace.WhatsNewNavigationTabs.SailingAnalytics).goToPlace(); placeNavigator.getWhatsNewNavigation(WhatsNewPlace.WhatsNewNavigationTabs.SailingAnalytics).goToPlace();
} }
} }
@@ -24,16 +24,14 @@
title="{i18n.footerPrivacy}"> title="{i18n.footerPrivacy}">
<ui:text from='{i18n.footerPrivacy}' /> <ui:text from='{i18n.footerPrivacy}' />
</a> </a>
|
<a ui:field="sapJobsAnchor" href="https://jobs.sap.com" target="_blank">
<ui:text from='{i18n.footerJobs}'/>
</a>
<br></br> <br></br>
<a ui:field="feedbackAnchor" href="mailto:support%40sapsailing.com?subject=[SAP Sailing] Feedback" <a ui:field="supportAnchor" href="mailto:support%40sapsailing.com?subject=[SAP Sailing] Support"
title="{i18n.footerFeedback}"> title="{i18n.footerSupport}">
<ui:text from='{i18n.footerSupport}' />
</a>
<a ui:field="feedbackAnchor" href="" title="{i18n.footerFeedback}">
<ui:text from='{i18n.footerFeedback}' /> <ui:text from='{i18n.footerFeedback}' />
</a> </a>
|
<a ui:field="desktopUi" href="HomeDesktop.html" title="Desktop"> <a ui:field="desktopUi" href="HomeDesktop.html" title="Desktop">
Desktop Desktop
</a> </a>
@@ -14,6 +14,5 @@ public interface FooterResources extends ClientBundle {
String sitefooter(); String sitefooter();
String sitefooter_language(); String sitefooter_language();
String sitefooter_links(); String sitefooter_links();
} }
} }
@@ -49,10 +49,8 @@ public class SwitchingEntryPoint implements EntryPoint {
public void onModuleLoad() { public void onModuleLoad() {
Document.get().getElementById("loading").removeFromParent(); Document.get().getElementById("loading").removeFromParent();
LOG.info("Start switching entry point"); LOG.info("Start switching entry point");
SharedResources.INSTANCE.mediaCss().ensureInjected(); SharedResources.INSTANCE.mediaCss().ensureInjected();
SharedResources.INSTANCE.mainCss().ensureInjected(); SharedResources.INSTANCE.mainCss().ensureInjected();
String hash = Window.Location.getHash(); String hash = Window.Location.getHash();
if (hash != null && hash.startsWith("#")) { if (hash != null && hash.startsWith("#")) {
hash = hash.substring(1); hash = hash.substring(1);
@@ -150,5 +148,4 @@ public class SwitchingEntryPoint implements EntryPoint {
} }
}); });
} }
} }
@@ -2,10 +2,6 @@
<!-- Could not determine the version of your GWT SDK; using the module DTD from GWT 1.6.4. You may want to change this. --> <!-- Could not determine the version of your GWT SDK; using the module DTD from GWT 1.6.4. You may want to change this. -->
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.7.0//EN" "http://gwtproject.org/doctype/2.7.0/gwt-module.dtd"> <!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.7.0//EN" "http://gwtproject.org/doctype/2.7.0/gwt-module.dtd">
<module> <module>
<source path='client'/> <source path='client'/>
</module> </module>
@@ -1709,6 +1709,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String footerLegal(); String footerLegal();
String footerPrivacy(); String footerPrivacy();
String footerFeedback(); String footerFeedback();
String footerSupport();
String headerLogo(); String headerLogo();
String headerSearchPlaceholder(); String headerSearchPlaceholder();
String mainEventShowAll(); String mainEventShowAll();
@@ -1712,6 +1712,7 @@ footerLanguage=SAP Sailing in
footerLegal=Legal Disclosure footerLegal=Legal Disclosure
footerPrivacy=Privacy footerPrivacy=Privacy
footerFeedback=Feedback footerFeedback=Feedback
footerSupport=Support
headerLogo=Sailing Analytics headerLogo=Sailing Analytics
headerSearchPlaceholder=Search headerSearchPlaceholder=Search
mainEventShowAll=Show All Events mainEventShowAll=Show All Events
@@ -1696,6 +1696,7 @@ footerLanguage=SAP Sailing in
footerLegal=Impressum footerLegal=Impressum
footerPrivacy=Datenschutz footerPrivacy=Datenschutz
footerFeedback=Feedback footerFeedback=Feedback
footerSupport=Support
headerLogo=Sailing Analytics headerLogo=Sailing Analytics
headerSearchPlaceholder=Suche headerSearchPlaceholder=Suche
mainEventShowAll=Zeige alle Veranstaltungen mainEventShowAll=Zeige alle Veranstaltungen
@@ -68,6 +68,7 @@ Export-Package: com.google.gwt.user.client.rpc.core.java.util,
com.sap.sse.gwt.dispatch.shared.commands, com.sap.sse.gwt.dispatch.shared.commands,
com.sap.sse.gwt.dispatch.shared.exceptions, com.sap.sse.gwt.dispatch.shared.exceptions,
com.sap.sse.gwt.linker, com.sap.sse.gwt.linker,
com.sap.sse.gwt.qualtrics,
com.sap.sse.gwt.resources, com.sap.sse.gwt.resources,
com.sap.sse.gwt.server, com.sap.sse.gwt.server,
com.sap.sse.gwt.server.filestorage, com.sap.sse.gwt.server.filestorage,
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.7.0//EN" "http://gwtproject.org/doctype/2.7.0/gwt-module.dtd">
<module>
<inherits name="com.google.gwt.user.User" />
<entry-point class="com.sap.sse.gwt.qualtrics.QualtricsInjectingEntryPoint" />
<source path="qualtrics" />
</module>
@@ -0,0 +1,45 @@
package com.sap.sse.gwt.qualtrics;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.ScriptInjector;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.dom.client.Document;
/**
* Convenience class to inject Qualtrics script content. To use a Qualtrics survey in your entry point, inherit the
* {@code com.sap.sse.gwt.Qualtrics} module which has an entry point that injects the script code needed. Then,
* if your Qualtrics "Intercept" is setup of for an explicit JavaScript trigger, establish
*/
public final class Qualtrics {
public static QualtricsRessource QUALTRICS_RESSOURCES = GWT.create(QualtricsRessource.class);
private static boolean isInjected = false;
protected Qualtrics() {
}
/**
* inject minimal js required for Qualtrics survey
*/
public static void ensureInjected() {
if (!isInjected) {
ScriptInjector.fromString(QUALTRICS_RESSOURCES.qualtricsLoadingCode().getText()).setWindow(ScriptInjector.TOP_WINDOW).inject();
// Now produce the following div:
// <div id='ZN_7WmsxxHQyCeUivX'><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
final DivElement div = Document.get().createDivElement();
div.setId("ZN_7WmsxxHQyCeUivX");
div.setInnerHTML("<!--DO NOT REMOVE-CONTENTS PLACED HERE-->");
isInjected = true;
}
}
/**
* Use this, e.g., in your "onclick" handler for your anchor, link or button to trigger the Qualtrics Intercepts
* loaded for your page that are configured for explicit JavaScript invocation.
*/
public static native void triggerIntercepts() /*-{
$wnd.QSI.API.unload();
$wnd.QSI.API.load();
$wnd.QSI.API.run();
}-*/;
}
@@ -0,0 +1,12 @@
package com.sap.sse.gwt.qualtrics;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
public class QualtricsInjectingEntryPoint implements EntryPoint {
@Override
public void onModuleLoad() {
GWT.log("Inject Qualtrics");
Qualtrics.ensureInjected();
}
}
@@ -0,0 +1,9 @@
package com.sap.sse.gwt.qualtrics;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.TextResource;
public interface QualtricsRessource extends ClientBundle {
@Source("resources/qualtrics.js")
TextResource qualtricsLoadingCode();
}
@@ -0,0 +1,9 @@
/* BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET */
(function(){var g=function(e,h,f,g){
this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
this.start=function(){var t=this;"complete"!==document.readyState?window.addEventListener?window.addEventListener("load",function(){t.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){t.go()}):t.go()};};
try{(new g(100,"r","QSI_S_ZN_7WmsxxHQyCeUivX","https://zn7wmsxxhqyceuivx-sapdemo.siteintercept.qualtrics.com/SIE/?Q_ZID=ZN_7WmsxxHQyCeUivX")).start()}catch(i){}})();
/* END WEBSITE FEEDBACK SNIPPET */
@@ -4,7 +4,7 @@ import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.ScriptInjector; import com.google.gwt.core.client.ScriptInjector;
/** /**
* Convinience class to inject common control css content * Convenience class to inject common control css content
* *
* @author pgtaboada * @author pgtaboada
* *