bug5510: rework on subscription overview

- added modal dialog with info to business model
- added info text to subscription card for showing e.g. 'Everything from plan x plus'
- added a list of all features
- added documentation to wiki
This commit is contained in:
Udo Wessels
2021-11-29 17:29:57 +01:00
parent c3d1744fcf
commit f637c0be25
17 changed files with 545 additions and 136 deletions
+2
View File
@@ -91,6 +91,8 @@ SAP is at the center of todays technology revolution, developing innovations
* [[Prionet related information|wiki/info/misc/prionet-related-information]]
* [[TracTrac Workshop 2013|wiki/info/misc/tractracworkshop2013]]
* [[Subscriptions|wiki/info/misc/subscriptions]]
## HowTo
* [[Onboarding|wiki/howto/onboarding]]
@@ -1,154 +1,246 @@
.content {
padding: 0 6px;
}
.feature:before {
content: "";
position: absolute;
background-image: resourceUrl("greenCheck");
background-repeat: no-repeat;
background-size: contain;
background-position: top left;
margin-left: -25px;
height: 20px;
width: 20px;
content: "";
position: absolute;
background-image: resourceUrl("greenCheck");
background-repeat: no-repeat;
background-size: contain;
background-position: top left;
margin-left: -25px;
height: 20px;
width: 20px;
}
.feature {
padding-left: 25px;
margin-bottom: 1em;
padding-left: 25px;
margin-bottom: 1em;
}
.features {
margin: 30px;
text-align: left;
margin: 30px;
text-align: left;
}
.highlight {
}
.owned {
}
.free {
}
.subscription {
order: 20;
text-align: center;
width: 390px;
margin-bottom: 30px;
order: 20;
text-align: center;
width: 390px;
margin-bottom: 30px;
}
/* Small screens */
@media (max-width: 400px) {
.subscription {
width: 100%;
margin-right: 5px;
margin-left: 5px;
}
@media ( max-width: 400px) {
.subscription {
width: 100%;
margin-right: 5px;
margin-left: 5px;
}
}
.subscription.individual {
order: 999;
order: 999;
}
.subscription.highlight {
order: 1;
order: 1;
}
.subscription.owned {
order: 100;
order: 100;
}
.subscriptionBody {
border: solid;
border-width: 1px;
border-color: #ddd;
border-radius: .333333333333333em;
margin-bottom: -50px;
height: 100%;
border: solid;
border-width: 1px;
border-color: #ddd;
border-radius: .333333333333333em;
margin-bottom: -50px;
height: 100%;
}
.highlight .subscriptionBody {
border-top-left-radius: 0;
border-top-right-radius: 0;
border-bottom-left-radius: .333333333333333em;
border-bottom-right-radius: .333333333333333em;
border-color: #8ab54e;
border-top-left-radius: 0;
border-top-right-radius: 0;
border-bottom-left-radius: .333333333333333em;
border-bottom-right-radius: .333333333333333em;
border-color: #8ab54e;
}
.owned .subscriptionBody {
border-top-left-radius: 0;
border-top-right-radius: 0;
border-bottom-left-radius: .333333333333333em;
border-bottom-right-radius: .333333333333333em;
border-color: #ddd;
border-top-left-radius: 0;
border-top-right-radius: 0;
border-bottom-left-radius: .333333333333333em;
border-bottom-right-radius: .333333333333333em;
border-color: #ddd;
}
.subscriptionFooter {
}
.highlightHeader {
visibility: hidden;
border: solid;
border-width: 1px;
border-top-left-radius: .333333333333333em;
border-top-right-radius: .333333333333333em;
height: 30px;
padding: 5px;
color: #fff;
font-size: 1em;
font-weight: bold;
visibility: hidden;
border: solid;
border-width: 1px;
border-top-left-radius: .333333333333333em;
border-top-right-radius: .333333333333333em;
height: 30px;
padding: 5px;
color: #fff;
font-size: 1em;
font-weight: bold;
}
.highlight .highlightHeader {
visibility: visible;
border-color: #8ab54e;
background-color: #8ab54e;
visibility: visible;
border-color: #8ab54e;
background-color: #8ab54e;
}
.owned .highlightHeader {
visibility: visible;
border-color: #ddd;
background-color: #ddd;
visibility: visible;
border-color: #ddd;
background-color: #ddd;
}
.title {
background-color: #f2f2f2;
margin: 0;
border-bottom-color: #ddd;
min-height: 3em;
display: flex;
align-items: center;
justify-content: center;
background-color: #f2f2f2;
margin: 0;
border-bottom-color: #ddd;
min-height: 3em;
display: flex;
align-items: center;
justify-content: center;
}
.description {
margin: 20px;
margin: 20px;
}
.info {
}
.price {
width: 100%;
border: solid;
border-width: 1px;
border-radius: .333333333333333em;
border-color: #ddd;
padding: 0.5em;
margin-bottom: 0.5em;
font-size: 24px;
font-weight: 700;
width: 100%;
border: solid;
border-width: 1px;
border-radius: .333333333333333em;
border-color: #ddd;
padding: 0.5em;
margin-bottom: 0.5em;
font-size: 24px;
font-weight: 700;
}
.price:hover {
border-color: #d79900;
background-color: #8ab54e;
color: #fff;
border-color: #d79900;
background-color: #8ab54e;
color: #fff;
}
.free .price, .individual .price {
border-color: #f0ab00;
background-color: #f0ab00;
color: #fff;
border-color: #f0ab00;
background-color: #f0ab00;
color: #fff;
}
.price.selected {
background-color: #f0ab00;
color: #fff;
background-color: #f0ab00;
color: #fff;
}
.free .price:hover, .individual .price:hover {
border-color: #d79900;
border-color: #d79900;
}
.price.selected:hover {
border-color: #d79900;
border-color: #d79900;
}
.prices {
padding: 1em;
width: 100%;
padding: 1em;
width: 100%;
}
.subscribe {
margin-left: auto;
margin-right: auto;
margin-bottom: 30px;
display: block;
margin-left: auto;
margin-right: auto;
margin-bottom: 30px;
display: block;
}
.container {
display: flex;
flex-flow: row wrap;
gap: 1em;
margin-bottom: 1em;
justify-content: center;
display: flex;
flex-flow: row wrap;
gap: 1em;
margin-bottom: 1em;
justify-content: center;
}
.popupContent {
background: rgba(255, 255, 255, 0.95);
border-radius: 4px;
border: 1px solid #c9caca;
margin-top: 5px;
max-width: 800px;
padding: 10px;
}
.popupGlass {
background-color: rgba(0, 0, 0, 0.5);
}
.subscriptionHeader {
width: 100%;
display: block;
position: relative;
padding: 4px;
}
.hint {
position: absolute;
color: #333;
font-size: 12px;
width: 100%;
top: 3px;
text-align: right;
}
.hint button {
background: none;
border: 1px solid transparent;
border-radius: 4px;
color: #333
}
.hint button:hover {
background: #0081b8;
color: #fff;
}
.featureList dt {
font-size: 1.2em;
font-weight: bold;
margin-top: 1em;
margin-bottom: 0.5em;
}
.featureList dd {
font-size: 1em;
font-weight: 600;
}
@@ -56,6 +56,8 @@ public class SubscriptionCard extends Composite {
@UiField
HeadingElement description;
@UiField
HeadingElement info;
@UiField
FlowPanel prices;
@UiField
FlowPanel features;
@@ -165,6 +167,7 @@ public class SubscriptionCard extends Composite {
final SailingSubscriptionStringConstants subscriptionStringConstants = SailingSubscriptionStringConstants.INSTANCE;
title.setInnerText(subscriptionStringConstants.getString(subscriptionPlanDTO.getNameMessageKey()));
description.setInnerText(subscriptionStringConstants.getString(subscriptionPlanDTO.getDescMessageKey()));
info.setInnerText(subscriptionStringConstants.getString(subscriptionPlanDTO.getInfoMessageKey()));
final String[] featureStrings = subscriptionStringConstants.getStringArray(subscriptionPlanDTO.getFeatureMessageKey());
for (String featureString : featureStrings) {
if(featureString != "") {
@@ -13,6 +13,7 @@
<h1 ui:field="title" class="{local.css.title}"></h1>
<g:FlowPanel ui:field="prices" styleName="{local.css.prices}"></g:FlowPanel>
<h4 ui:field="description" class="{local.css.description}"></h4>
<h5 ui:field="info" class="{local.css.info}"></h5>
<g:FlowPanel ui:field="features" styleName="{local.css.features}"></g:FlowPanel>
</div>
<div class="{local.css.subscriptionFooter}">
@@ -1,28 +1,108 @@
package com.sap.sailing.gwt.home.desktop.partials.subscription;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.DListElement;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.PopupPanel.AnimationType;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sse.security.ui.client.i18n.subscription.SubscriptionStringConstants;
public class SubscriptionCardContainer extends Composite {
private static SubscriptionContainerUiBinder uiBinder = GWT.create(SubscriptionContainerUiBinder.class);
@UiField
Button businessModelInfoButton;
interface SubscriptionContainerUiBinder extends UiBinder<Widget, SubscriptionCardContainer> {
}
public SubscriptionCardContainer() {
initWidget(uiBinder.createAndBindUi(this));
addFeature("features_live_analytics");
addFeatureWithLink("features_organize_events");
addFeature("features_events_with_more_regatta");
addFeatureWithLink("features_connect_to_tractrac");
addFeature("features_imports");
addFeature("features_media_management");
addFeature("features_analytic_charts");
addFeature("features_map_analytics");
addFeature("features_maneuver_analytics");
addFeature("features_media_tags");
addFeature("features_scoring");
}
private void addFeature(String featureKey) {
final Element dt = DOM.createElement("dt");
dt.setInnerHTML(SubscriptionStringConstants.INSTANCE.getString(featureKey + "_title"));
final Element dd = DOM.createElement("dd");
dd.setInnerHTML(SubscriptionStringConstants.INSTANCE.getString(featureKey + "_description"));
features.appendChild(dt);
features.appendChild(dd);
}
private void addFeatureWithLink(String featureKey) {
final Element dt = DOM.createElement("dt");
dt.setInnerHTML(SubscriptionStringConstants.INSTANCE.getString(featureKey + "_title"));
final Element dd = DOM.createElement("dd");
HorizontalPanel description = new HorizontalPanel();
description.add(new Label(SubscriptionStringConstants.INSTANCE.getString(featureKey + "_description")));
String link = SubscriptionStringConstants.INSTANCE.getString(featureKey + "_link");
HTML exampleLink = new HTML("<a href=\""
+ new SafeHtmlBuilder().appendEscaped(link).toSafeHtml().asString()
+ "\" target=\"_blank\">&nbsp;"
+ new SafeHtmlBuilder().appendEscaped("[...]").toSafeHtml().asString()
+ "</a>");
description.add(exampleLink);
dd.appendChild(description.getElement());
features.appendChild(dt);
features.appendChild(dd);
}
@UiField
FlowPanel container;
@UiField
DListElement features;
public void addSubscription(SubscriptionCard subscription) {
container.add(subscription);
}
@UiHandler("businessModelInfoButton")
void onClick(ClickEvent e) {
VerticalPanel content = new VerticalPanel();
HTMLPanel title = new HTMLPanel("h1", SubscriptionStringConstants.INSTANCE.businessModelTitle());
content.add(title);
Label body = new Label(SubscriptionStringConstants.INSTANCE.businessModelDescription());
content.add(body);
PopupPanel popup = new PopupPanel();
popup.setWidget(content);
popup.addStyleName(SubscriptionCardResources.INSTANCE.css().popupContent());
popup.setGlassStyleName(SubscriptionCardResources.INSTANCE.css().popupGlass());
popup.setAnimationEnabled(true);
popup.setAnimationType(AnimationType.CENTER);
popup.setGlassEnabled(true);
popup.setModal(true);
popup.setAutoHideEnabled(true);
popup.addAutoHidePartner(businessModelInfoButton.getElement());
popup.center();
}
}
@@ -1,13 +1,44 @@
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<ui:with field="i18n" type="com.sap.sailing.gwt.ui.client.StringMessages" />
<ui:with field="main" type="com.sap.sailing.gwt.common.client.SharedResources" />
<ui:with field="local" type="com.sap.sailing.gwt.home.desktop.partials.subscription.SubscriptionCardResources"></ui:with>
<ui:with field="i18n"
type="com.sap.sailing.gwt.ui.client.StringMessages" />
<ui:with field="main"
type="com.sap.sailing.gwt.common.client.SharedResources" />
<ui:with field="local"
type="com.sap.sailing.gwt.home.desktop.partials.subscription.SubscriptionCardResources"></ui:with>
<ui:style>
</ui:style>
<g:HTMLPanel styleName="{main.mediaCss.stackenblochen}">
<h1><ui:text from="{i18n.subscriptionPlanOverview}" /></h1>
<g:FlowPanel ui:field="container" styleName="{local.css.container}"></g:FlowPanel>
<g:HTMLPanel styleName="{main.mediaCss.stackenblochen} {local.css.content}">
<div class="{local.css.subscriptionHeader}">
<span class="{local.css.hint}">
<g:Button ui:field="businessModelInfoButton">
<b></b>
<ui:text
from="{i18n.subscriptionBusinessModelInfoButton}" />
</g:Button>
</span>
</div>
<h1>
<ui:text from="{i18n.subscriptionPlanOverview}" />
</h1>
<g:FlowPanel ui:field="container"
styleName="{local.css.container}"></g:FlowPanel>
<div class="{local.css.subscriptionHeader}">
<span class="{local.css.hint}">
<g:Button ui:field="emailContact">
<ui:text from="{i18n.contactServicesAndInformation}" />
<b></b>
</g:Button>
</span>
<span>&nbsp;</span>
</div>
<h1>
<ui:text from="{i18n.premiumFeatureList}" />
</h1>
<h2>
<ui:text from="{i18n.premiumFeatureListDescription}" />
</h2>
<dl ui:field="features" class="{local.css.featureList}"></dl>
</g:HTMLPanel>
</ui:UiBinder>
@@ -12,6 +12,7 @@ public interface SubscriptionCardResources extends SharedHomeResources {
LocalCss css();
public interface LocalCss extends CssResource {
String content();
String free();
String feature();
String highlight();
@@ -20,6 +21,7 @@ public interface SubscriptionCardResources extends SharedHomeResources {
String subscription();
String title();
String description();
String info();
String price();
String selected();
String prices();
@@ -29,5 +31,10 @@ public interface SubscriptionCardResources extends SharedHomeResources {
String highlightHeader();
String subscriptionBody();
String subscriptionFooter();
String popupGlass();
String popupContent();
String subscriptionHeader();
String hint();
String featureList();
}
}
@@ -43,7 +43,6 @@ public class SubscriptionActivity extends AbstractActivity {
view.addSubscriptionPlan(plan, Type.DEFAULT, eventBus);
}
});
addIndividual(eventBus, view);
}
@Override
@@ -51,14 +50,6 @@ public class SubscriptionActivity extends AbstractActivity {
clientFactory.createErrorView("TODO Failed to load subscription plans", caught);
}
private void addIndividual(final EventBus eventBus, final SubscriptionView view) {
final SubscriptionPlanDTO individualPlan = new SubscriptionPlanDTO("individual_subscription_plan" /* id */,
/* isUserSubscribedToPlan */ false,
Collections.emptySet() /* prices */,
null /* error */);
view.addSubscriptionPlan(individualPlan, Type.INDIVIDUAL, eventBus);
}
private void addFreePlan(final SubscriptionView view) {
final SubscriptionPlanDTO freePlan = new SubscriptionPlanDTO("free_subscription_plan" /* id */,
/* isUserSubscribedToPlan */ false,
@@ -8,6 +8,7 @@ encoding//src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ja.pr
encoding//src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_pt.properties=UTF-8
encoding//src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ru.properties=UTF-8
encoding//src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_zh.properties=UTF-8
encoding//src/main/java/com/sap/sse/security/ui/client/i18n/subscription/SubscriptionStringConstants_de.properties=UTF-8
encoding//src/main/java/com/sap/sse/security/ui/login/LoginView.java=utf-8
encoding//src/main/java/com/sap/sse/security/ui/oauth/client/util/ClientUtils.java=utf-8
encoding//src/main/java/com/sap/sse/security/ui/servlet/RedirectServlet.java=utf-8
@@ -199,6 +199,10 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages {
String selectOption();
String currentlyUnableToSubscribe();
String subscriptionPlanOverview();
String subscriptionBusinessModelInfoButton();
String contactServicesAndInformation();
String premiumFeatureList();
String premiumFeatureListDescription();
String selectSubscriptionPlan();
String features();
String price();
@@ -206,6 +206,10 @@ selectOption=Please select an option.
currentlyUnableToSubscribe=Currently unable to create new Subscriptions. Please try again later.
subscribe=Subscribe
subscriptionPlanOverview=Subscription Plan Overview
subscriptionBusinessModelInfoButton=More info about our business model
contactServicesAndInformation=Contact us for additional services and information requests
premiumFeatureList=Complete Feature List
premiumFeatureListDescription=Premium Features That Are Available for Subscriber
selectSubscriptionPlan=Please select a subscription plan to subscribe to.
features=Features
price=Price
@@ -204,6 +204,10 @@ selectOption=Bitte eine Option auswählen.
currentlyUnableToSubscribe=Abschließen eines Abbonements derzeit nicht möglich. Bitte versuchen sie es später erneut.
subscribe=Abonnieren
subscriptionPlanOverview=Abonnementübersicht
subscriptionBusinessModelInfoButton=Weitere Informationen zu unserem Geschäftsmodell
contactServicesAndInformation=Kontaktieren Sie uns für zusätzliche Dienstleistungen und Informationsanfragen
premiumFeatureList=Vollständige Feature-Liste
premiumFeatureListDescription=Premium-Funktionen, die für Abonnenten verfügbar sind
selectSubscriptionPlan=Bitte wählen sie einen Abonnementplan aus.
features=Enthalten
price=Preis
@@ -8,20 +8,48 @@ import com.google.gwt.i18n.client.LocalizableResource.DefaultLocale;
public interface SubscriptionStringConstants extends ConstantsWithLookup {
public static final SubscriptionStringConstants INSTANCE = GWT.create(SubscriptionStringConstants.class);
String free_subscription_plan_name();
String free_subscription_plan_description();
String[] free_subscription_plan_features();
String payment_interval_YEAR();
String payment_interval_MONTH();
String payment_interval_WEEK();
String payment_interval_DAY();
String individual_subscription_plan_name();
String individual_subscription_plan_description();
String[] individual_subscription_plan_features();
String businessModelTitle();
String businessModelDescription();
String free_subscription_plan_name();
String free_subscription_plan_description();
String free_subscription_plan_info();
String[] free_subscription_plan_features();
String yearly_premium_name();
String yearly_premium_description();
String yearly_premium_info();
String[] yearly_premium_features();
String weekly_premium_name();
String weekly_premium_description();
String weekly_premium_info();
String[] weekly_premium_features();
String features_live_analytics_title();
String features_live_analytics_description();
String features_live_analytics_link();
String features_organize_events_title();
String features_organize_events_description();
String features_organize_events_link();
String features_events_with_more_regatta_title();
String features_events_with_more_regatta_description();
String features_connect_to_tractrac_title();
String features_connect_to_tractrac_description();
String features_connect_to_tractrac_link();
String features_imports_title();
String features_imports_description();
String features_media_management_title();
String features_media_management_description();
String features_analytic_charts_title();
String features_analytic_charts_description();
String features_map_analytics_title();
String features_map_analytics_description();
String features_maneuver_analytics_title();
String features_maneuver_analytics_description();
String features_media_tags_title();
String features_media_tags_description();
String features_scoring_title();
String features_scoring_description();
}
@@ -1,16 +1,59 @@
free_subscription_plan_name=Free
free_subscription_plan_description=Try it out
free_subscription_plan_features=Start your first steps in SAP sailing, Use basic features of SAP Sailing Analytics, Have a look on SAP Sailing Race Manager, Try more features and functions that will improve your life in sailing
payment_interval_YEAR=year
payment_interval_MONTH=month
payment_interval_WEEK=week
payment_interval_DAY=day
individual_subscription_plan_name=Enterprise
individual_subscription_plan_description=For individual offer contact us!
individual_subscription_plan_features=
businessModelTitle=Business Model
businessModelDescription=We decided to extend our free solution by a Subscription Business Model. \
But why did we do it? \
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt \
ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo \
dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit \
amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor \
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et \
justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum \
dolor sit amet.
free_subscription_plan_name=Free
free_subscription_plan_description=Try it out
free_subscription_plan_info=
free_subscription_plan_features=Basic live wind based leaderboard,\
Create your own account and carry out the sailing analytics for your regatta or training with our \
free tracking app or a professional tracking service,\
Sync live YouTube videos with your races
yearly_premium_name=Yearly Premium
yearly_premium_description=Premium for a year. Reocuring
yearly_premium_features=Everything in weekly, Additional Features
yearly_premium_description=Full Access to all Features for one Year (auto renewing)
yearly_premium_info=Everything from Weekly Premium plus:
yearly_premium_features=\
Place and read comments (notes and images on timeline)
weekly_premium_name=Weekly Premium
weekly_premium_description=One week premium. Non-Reocuring
weekly_premium_features=Show streamlets, Additional Leaderboard info, Analysis-Charts
weekly_premium_description=Full Access to all Features for one Week (one time payment)
weekly_premium_info=Everything from free plan plus:
weekly_premium_features=\
Full Live Analytics with hundreds of features including wind streamlets, comparison charts, \
advanced in-map visualizations and much more. See full premium feature-list below\u00A0\u21E9, \
Tag Personal Timeline with Videos and Notes
features_live_analytics_title=Live Analytics
features_live_analytics_description=Full Live Analytics with hundreds of features including wind streamlets, comparison charts, advanced map visualizations and much more.
features_live_analytics_link=https://file-examples-com.github.io/uploads/2017/04/file_example_MP4_480_1_5MG.mp4
features_organize_events_title=Organize Events
features_organize_events_description=Run the Sailing Analytics at your Regatta with our free tracking app or a professional tracking service*. (below: *Like Trac Trac ) Maneuever detection and Analytics
features_organize_events_link=https://file-examples-com.github.io/uploads/2017/04/file_example_MP4_480_1_5MG.mp4
features_events_with_more_regatta_title=Events with more than one regatta
features_events_with_more_regatta_description=-
features_connect_to_tractrac_title=Connect to Trac Trac
features_connect_to_tractrac_description=Connect to professional tracking service
features_connect_to_tractrac_link=https://tractrac.com/
features_imports_title=Import external data
features_imports_description=Import GPX and KML file formats
features_media_management_title=Media Management
features_media_management_description=Integrate/upload and replay video and Pictures
features_analytic_charts_title=Analytic Charts
features_analytic_charts_description=Charts like...
features_map_analytics_title=Map Analytics
features_map_analytics_description=Wind streamlets and boatspeed vizualization
features_maneuver_analytics_title=Maneuver Analytics
features_maneuver_analytics_description=-
features_media_tags_title=Link and upload media (tags)
features_media_tags_description=-
features_scoring_title=Scoring
features_scoring_description=ORC PCS scoring
@@ -1,15 +1,57 @@
free_subscription_plan_name=Free
free_subscription_plan_description=Probier es aus
free_subscription_plan_features=Starten Sie Ihre ersten Schritte in SAP sailing, Grundfunktionen von SAP Sailing Analytics nutzen, Werfen Sie einen Blick auf den SAP Sailing Race Manager, free_subscription_plan_features=Probieren Sie weitere Features und Funktionen aus, die Ihr Leben beim Segeln verbessern werden
payment_interval_YEAR=Jahr
payment_interval_MONTH=Monat
payment_interval_WEEK=Woche
payment_interval_DAY=Tag
individual_subscription_plan_name=Enterprise
individual_subscription_plan_description=Für ein individuelles Angebot kontaktieren Sie uns!
individual_subscription_plan_features=
businessModelTitle=Business Model
businessModelDescription=Wir haben uns entschieden, unsere kostenlose Lösung um ein Abonnement-Geschftsmodell zu erweitern. \
Aber warum haben wir es getan? \
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt \
ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo \
dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit \
amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor \
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et \
justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum \
dolor sit amet.
free_subscription_plan_name=Free
free_subscription_plan_description=Probier es aus
free_subscription_plan_info=
free_subscription_plan_features=Standart Live-Wind-basierte Bestenliste,\
Erstellen Sie Ihr eigenes Konto und führen Sie die Segelanalyse für Ihre Regatta oder Ihr Training mit unserer kostenlosen Tracking-App oder einem professionellen Tracking-Service durch,\
Synchronisiere YouTube-Videos mit deinen Rennen
yearly_premium_name=Jahresabo
yearly_premium_description=Ein Jahr Premium. Wiederkehrend.
yearly_premium_features=Alles in weekly, Zusätzliche Features
yearly_premium_info=Alles aus dem Jahresabo plus:
yearly_premium_features=Alles in weekly, Zusätzliche Features
weekly_premium_name=Wochenabo
weekly_premium_description=Eine Woche Premium. Nicht wiederkehrend, Streamlets anzeigen, Zusätzliche Leaderboard Info, Analyse-Charts
weekly_premium_description=Voller Zugriff auf alle Funktionen für eine Woche (einmalige Zahlung)
weekly_premium_info=Alles vom kostenlosen Plan plus:
weekly_premium_features=\
Vollständige Live-Analyse mit Hunderten von Funktionen, einschließlich Windströmungen, Vergleichstabellen, \
erweiterte In-Map-Visualisierungen und vieles mehr. Siehe die vollständige Liste der Premiumfunktionen unten\u00A0\u21E9, \
Kennzeichnen Sie die persönliche Timeline mit Videos und Notizen
features_live_analytics_title=Live Analytics
features_live_analytics_description=Vollständige Live-Analyse mit Hunderten von Funktionen, darunter Windströmungen, Vergleichsdiagramme, erweiterte Kartenvisualisierungen und vieles mehr.
features_live_analytics_link=https://file-examples-com.github.io/uploads/2017/04/file_example_MP4_480_1_5MG.mp4
features_organize_events_title=Veranstaltungen organisieren
features_organize_events_description=Führen Sie die Sailing Analytics bei Ihrer Regatta mit unserer kostenlosen Tracking-App oder einem professionellen Tracking-Service* durch. (unten: *Wie Trac Trac) Manövererkennung und Analyse
features_organize_events_link=https://file-examples-com.github.io/uploads/2017/04/file_example_MP4_480_1_5MG.mp4
features_events_with_more_regatta_title=Veranstaltungen mit mehr als einer Regatta
features_events_with_more_regatta_description=-
features_connect_to_tractrac_title=Mit Trac Trac verbinden
features_connect_to_tractrac_description=Verbinden Sie sich mit einem professionellen Tracking-Service
features_connect_to_tractrac_link=https://tractrac.com/
features_imports_title=Externe Daten importieren
features_imports_description=GPX- und KML-Dateiformate importieren
features_media_management_title=Media Management
features_media_management_description=Integrieren/hochladen und wiedergeben von Videos und Bildern
features_analytic_charts_title=Analysediagramme
features_analytic_charts_description=...
features_map_analytics_title=Map Analytics
features_map_analytics_description=Visualisierung von Windströmungen und Bootsgeschwindigkeit
features_maneuver_analytics_title=Manöveranalyse
features_maneuver_analytics_description=-
features_media_tags_title=LMedien verlinken und hochladen (Tags)
features_media_tags_description=-
features_scoring_title=Scoring
features_scoring_description=ORC PCS Wertungen
@@ -14,6 +14,7 @@ public class SubscriptionPlanDTO implements IsSerializable {
private static final String FEATURES_MESSAGE_KEY_SUFFX = "_features";
private static final String NAME_MESSAGE_KEY_SUFFX = "_name";
private static final String DESC_MESSAGE_KEY_SUFFX = "_description";
private static final String INFO_MESSAGE_KEY_SUFFIX = "_info";
private static final long serialVersionUID = -1990028347487353679L;
private String id;
private HashSet<SubscriptionPrice> prices = new HashSet<SubscriptionPrice>();
@@ -58,6 +59,10 @@ public class SubscriptionPlanDTO implements IsSerializable {
return this.id + DESC_MESSAGE_KEY_SUFFX;
}
public String getInfoMessageKey() {
return this.id + INFO_MESSAGE_KEY_SUFFIX;
}
public String getFeatureMessageKey() {
return this.id + FEATURES_MESSAGE_KEY_SUFFX;
}
+71
View File
@@ -0,0 +1,71 @@
# Subscriptions
## Subscription Overview Page
The subscription overview page includes a set of subscription cards, like the free plan but also the plans subscribable by Chargebee.
Additionally there is a detailed list of all features which are included in a paid subscription.
### Add a subscription plan
1. Create a plan in Chargebee. We need afterwards the plan ID and price ID
2. Add a plan definition in class
com.sap.sailing.domain.common.subscription.SailingSubscriptionPlan
A plan definition includes the plan and price IDs and a list of connected roles.
3. Add following texts to class (and related property files)
com.sap.sse.security.ui.client.i18n.subscription.SubscriptionStringConstants
- `<PLAN-ID>_name`
- Name or title of the plan (`<H1>`)
- `<PLAN-ID>_description`
- A short description of the plan content (`<H4>`)
- `<PLAN-ID>_info`
- Can be uses for additional info (`<H5>`)
- `<PLAN-ID>_features`
- Comma separated list of feature labels
### Business Model Info
To edit text of business model description you can adjust the texts in resouce class (and related property files)
com.sap.sse.security.ui.client.i18n.subscription.SubscriptionStringConstants
- `businessModelTitle`
- Titel of text shown in modal dialog
- `businessModelDescription`
- The text body of the modal dialog
### Features
To add, remove or edit a feature of the feature list
1. Add following texts to class (and related property files)
com.sap.sse.security.ui.client.i18n.subscription.SubscriptionStringConstants
- `<FEATURE-ID>_title`
- Name or title of the feature
- `<FEATURE-ID>_description`
- A description of the feature
- `<FEATURE-ID>_link`
- An optional link to an external resource like picture, video or homepage
2. Register feateure with the &lt;FEATURE-ID&gt; in class
com.sap.sailing.gwt.home.desktop.partials.subscription.SubscriptionCardContainer
as pure textual feature or feature with link.
public SubscriptionCardContainer() {
initWidget(uiBinder.createAndBindUi(this));
addFeature("features_live_analytics");
addFeatureWithLink("features_organize_events");
### Further Resources
com.sap.sse.security.ui.client.i18n.StringMessages