Merge branch 'bug5883'

This commit is contained in:
Wessels, Udo (PPN)
2023-10-07 13:03:56 +02:00
10 changed files with 231 additions and 122 deletions
@@ -9,7 +9,7 @@ import com.sap.sse.security.shared.HasPermissions.DefaultActions;
import com.sap.sse.security.shared.impl.SecuredSecurityTypes;
/**
* Specifies a role that when associated to a user gives access to the streamlet Feature on the RaceMap
* Specifies a role that when associated to a user gives access to several premium features.
*/
public class PremiumRole extends RolePrototype {
private static final UUID ROLE_ID = UUID.fromString("7021e7a2-569a-11ec-bf63-0242ac130002");
@@ -317,7 +317,33 @@
font-weight: bold;
font-size: 1.2em;
text-transform: capitalize;
margin: 0 1em;
margin: 0 auto;
width: 140px;
}
/* Small screens */
@media ( max-width: 400px) {
.featureCheck {
margin: 0 0 0 8px;
}
.featureNone {
margin: 0 0 0 8px;
}
.featureHeader {
white-space: nowrap;
width: auto;
text-align: left;
vertical-align: bottom;
}
.featureHeader div {
-ms-writing-mode: tb-rl;
-webkit-writing-mode: vertical-rl;
writing-mode: vertical-rl;
transform: rotate(180deg);
}
.featureHeader
.featureCheck img {
width: 19px;
}
}
.buttonWarning {
@@ -353,7 +379,7 @@
}
.confirmationDialog button :hover {
background-color: #0081b8;
background-color: #0081b8;
}
.confirmationDialog button {
@@ -2,6 +2,7 @@ package com.sap.sailing.gwt.home.desktop.partials.subscription;
import java.util.ArrayList;
import java.util.List;
import java.util.MissingResourceException;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
@@ -27,13 +28,15 @@ import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.home.desktop.resources.SharedDesktopResources;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.security.shared.subscription.SubscriptionPlan;
import com.sap.sse.security.ui.client.i18n.subscription.SubscriptionStringConstants;
public class SubscriptionCardContainer extends Composite {
private static final String SUPPORT_EMAIL = "support@sapsailing.com";
private static SubscriptionContainerUiBinder uiBinder = GWT.create(SubscriptionContainerUiBinder.class);
private static final SubscriptionStringConstants subscriptionStringMessages = SubscriptionStringConstants.INSTANCE;
private static final SubscriptionStringConstants i18n = SubscriptionStringConstants.INSTANCE;
private final static int TITLE_DESCRIPTION_ROW = 0;
@UiField
Button businessModelInfoButton;
@@ -43,7 +46,7 @@ public class SubscriptionCardContainer extends Composite {
FlowPanel container;
@UiField
FlowPanel features;
final Grid featureGrid;
interface SubscriptionContainerUiBinder extends UiBinder<Widget, SubscriptionCardContainer> {
@@ -51,79 +54,65 @@ public class SubscriptionCardContainer extends Composite {
public SubscriptionCardContainer() {
initWidget(uiBinder.createAndBindUi(this));
featureGrid = new Grid(2, 4);
final Label freePlanTitle = new Label(subscriptionStringMessages.free_subscription_plan_shortname());
freePlanTitle.addStyleName(SubscriptionCardResources.INSTANCE.css().featureHeader());
featureGrid.setWidget(0, 1, freePlanTitle);
final Label premiumPlanTitle = new Label(subscriptionStringMessages.premium_subscription_plan_shortname());
premiumPlanTitle.addStyleName(SubscriptionCardResources.INSTANCE.css().featureHeader());
featureGrid.setWidget(0, 2, premiumPlanTitle);
final Label dataMiningArchivePlanTitle = new Label(subscriptionStringMessages.datamining_subscription_plan_shortname());
dataMiningArchivePlanTitle.addStyleName(SubscriptionCardResources.INSTANCE.css().featureHeader());
featureGrid.setWidget(0, 3, dataMiningArchivePlanTitle);
addFeatureWithLink(subscriptionStringMessages.features_organize_events_title(),
subscriptionStringMessages.features_organize_events_description(),
"https://support.sapsailing.com/hc/en-us/articles/360018169799-Create-a-simple-event-on-my-sapsailing-com",
true, true, true);
addFeature(subscriptionStringMessages.features_events_with_more_regatta_title(), subscriptionStringMessages.features_events_with_more_regatta_description(), true, true, true);
addFeatureWithLink(subscriptionStringMessages.features_connect_to_tractrac_title(),
subscriptionStringMessages.features_connect_to_tractrac_description(),
"https://tractrac.com/", true, true, true);
addFeature(subscriptionStringMessages.features_imports_title(), subscriptionStringMessages.features_imports_description(), true, true, true);
addFeature(subscriptionStringMessages.features_media_management_title(), subscriptionStringMessages.features_media_management_description(), true, true, true);
addFeature(subscriptionStringMessages.features_limited_live_analytics_title(), subscriptionStringMessages.features_limited_live_analytics_description(), true, true, true);
addFeature(subscriptionStringMessages.features_media_tags_title(), subscriptionStringMessages.features_media_tags_description(), true, true, true);
addFeature(subscriptionStringMessages.features_scoring_title(), subscriptionStringMessages.features_scoring_description(), true, true, true);
addFeature(subscriptionStringMessages.features_wind_analytics_title(), subscriptionStringMessages.features_wind_analytics_description(), false, true, true);
addFeature(subscriptionStringMessages.features_maneuver_analytics_title(), subscriptionStringMessages.features_maneuver_analytics_description(), false, true, true);
addFeature(subscriptionStringMessages.features_competitor_analytics_title(), subscriptionStringMessages.features_competitor_analytics_description(), false, true, true);
addFeature(subscriptionStringMessages.features_advanced_leaderboard_info_title(), subscriptionStringMessages.features_advanced_leaderboard_info_description(), false, true, true);
addFeature(subscriptionStringMessages.features_simulator_title(), subscriptionStringMessages.features_simulator_description(), false, true, true);
addFeature(subscriptionStringMessages.features_map_analytics_title(), subscriptionStringMessages.features_map_analytics_description(), false, true, true);
addFeature(subscriptionStringMessages.features_data_mining_title(), subscriptionStringMessages.features_data_mining_description(), false, false, true);
featureGrid = new Grid(2, 5);
int rowIndex = 0;
for (final SubscriptionPlan.PlanCategory category : SubscriptionPlan.PlanCategory.getCategoriesWithFeature()) {
rowIndex++;
final Label title = new Label(i18n.getString(category.getId() + "_name"));
featureGrid.setWidget(0, rowIndex, title);
featureGrid.getCellFormatter().addStyleName(0, rowIndex, SubscriptionCardResources.INSTANCE.css().featureHeader());
}
// add features to list
for (final String featureId : SubscriptionPlan.PlanCategory.getAllFeatureIds()) {
addFeature(featureId);
}
features.add(featureGrid);
emailContact.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Window.Location.assign("mailto:" + SUPPORT_EMAIL
+ "?subject=" + UriUtils.encode(subscriptionStringMessages.support_subject()));
Window.Location
.assign("mailto:" + SUPPORT_EMAIL + "?subject=" + UriUtils.encode(i18n.support_subject()));
}
});
}
private void addFeature(final String titleString, final String descriptionString, boolean free, boolean premium, boolean dataMining) {
Label description = new Label(descriptionString);
description.addStyleName(SubscriptionCardResources.INSTANCE.css().featureDescription());
addFeatureWithDescription(titleString, free, premium, dataMining, description);
}
private void addFeatureWithLink(final String titleString, final String descriptionString, final String link, boolean free, boolean premium, boolean dataMining) {
SimplePanel descriptionWithLink = new SimplePanel();
HTML exampleLink = new HTML(descriptionString+ "&nbsp;<a href=\""
+ new SafeHtmlBuilder().appendEscaped(link).toSafeHtml().asString()
+ "\" title=\"" + StringMessages.INSTANCE.moreInfo() + "\""
+ " class=\"" + SubscriptionCardResources.INSTANCE.css().featureLink() + "\""
+ "target=\"_blank\">"
+ new SafeHtmlBuilder().appendEscaped("").toSafeHtml().asString()
+ "</a>");
descriptionWithLink.addStyleName(SubscriptionCardResources.INSTANCE.css().featureDescription());
descriptionWithLink.add(exampleLink);
addFeatureWithDescription(titleString, free, premium, dataMining, descriptionWithLink);
}
private void addFeatureWithDescription(final String titleString, boolean free, boolean premium, boolean dataMining, Widget description) {
// get size but index starts with 0 therefore row count is current index + 1
private void addFeature(final String featureId) {
int currentRowIndex = featureGrid.getRowCount();
// get size but index starts with 0 therefore row count is current index + 1
featureGrid.resizeRows(currentRowIndex + 1);
VerticalPanel line = new VerticalPanel();
String titleString = i18n.getString(featureId + "_title");
String descriptionString = i18n.getString(featureId + "_description");
// title
Label title = new Label(titleString);
title.addStyleName(SubscriptionCardResources.INSTANCE.css().featureTitle());
line.add(title);
line.add(description);
featureGrid.setWidget(currentRowIndex, 0, line);
createCheckMark(currentRowIndex, 1, free);
createCheckMark(currentRowIndex, 2, premium);
createCheckMark(currentRowIndex, 3, dataMining);
// description
try {
String urlString = i18n.getString(featureId + "_url");
// add a description with link
SimplePanel descriptionWithLink = new SimplePanel();
HTML exampleLink = new HTML(descriptionString + "&nbsp;<a href=\""
+ new SafeHtmlBuilder().appendEscaped(urlString).toSafeHtml().asString() + "\" title=\""
+ StringMessages.INSTANCE.moreInfo() + "\"" + " class=\""
+ SubscriptionCardResources.INSTANCE.css().featureLink() + "\"" + "target=\"_blank\">"
+ new SafeHtmlBuilder().appendEscaped("").toSafeHtml().asString() + "</a>");
descriptionWithLink.addStyleName(SubscriptionCardResources.INSTANCE.css().featureDescription());
descriptionWithLink.add(exampleLink);
line.add(descriptionWithLink);
} catch (MissingResourceException e) {
// add a description without link
Label description = new Label(descriptionString);
description.addStyleName(SubscriptionCardResources.INSTANCE.css().featureDescription());
line.add(description);
}
featureGrid.setWidget(currentRowIndex, TITLE_DESCRIPTION_ROW, line);
// create check marks
int columnIndex = 0;
for (final SubscriptionPlan.PlanCategory category : SubscriptionPlan.PlanCategory.getCategoriesWithFeature()) {
columnIndex++;
createCheckMark(currentRowIndex, columnIndex, category.containsFeature(featureId));
}
}
/**
@@ -147,18 +136,18 @@ public class SubscriptionCardContainer extends Composite {
}
featureGrid.setWidget(currentRowIndex, column, check);
}
public void addSubscription(SubscriptionCard subscription) {
if (!isSubscriptionPlanExisting(subscription.getSubscriptionGroupDTO().getSubscriptionGroupId())) {
container.add(subscription);
}
}
private boolean isSubscriptionPlanExisting(String planId) {
boolean isExisting = false;
for (int i = 0; i < container.getWidgetCount(); i++) {
if (container.getWidget(i) instanceof SubscriptionCard) {
SubscriptionCard card = (SubscriptionCard)container.getWidget(i);
SubscriptionCard card = (SubscriptionCard) container.getWidget(i);
if (card.getSubscriptionGroupDTO().getSubscriptionGroupId().equals(planId)) {
isExisting = true;
break;
@@ -167,7 +156,7 @@ public class SubscriptionCardContainer extends Composite {
}
return isExisting;
}
public void resetSubscriptions() {
List<SubscriptionCard> subscriptionCardsToRemove = new ArrayList<>();
for (int i = 0; i < container.getWidgetCount(); i++) {
@@ -175,7 +164,7 @@ public class SubscriptionCardContainer extends Composite {
subscriptionCardsToRemove.add((SubscriptionCard) container.getWidget(i));
}
}
for (SubscriptionCard card: subscriptionCardsToRemove) {
for (SubscriptionCard card : subscriptionCardsToRemove) {
container.remove(card);
}
}
@@ -183,9 +172,9 @@ public class SubscriptionCardContainer extends Composite {
@UiHandler("businessModelInfoButton")
void onClick(ClickEvent e) {
VerticalPanel content = new VerticalPanel();
HTMLPanel title = new HTMLPanel("h1", subscriptionStringMessages.businessModelTitle());
HTMLPanel title = new HTMLPanel("h1", i18n.businessModelTitle());
content.add(title);
Label body = new Label(subscriptionStringMessages.businessModelDescription());
Label body = new Label(i18n.businessModelDescription());
content.add(body);
PopupPanel popup = new PopupPanel();
popup.setWidget(content);
@@ -7,7 +7,7 @@ import com.sap.sse.security.shared.WildcardPermission;
import com.sap.sse.security.shared.impl.SecuredSecurityTypes;
/**
* Specifies a role that when associated to a user gives access to the streamlet Feature on the RaceMap
* Specifies a role that when associated to a user gives access to the date mining functionality on all servers.
*/
public class AllDataMiningRole extends RolePrototype {
private static final long serialVersionUID = 6671501683896115261L;
@@ -7,7 +7,7 @@ import com.sap.sse.security.shared.WildcardPermission;
import com.sap.sse.security.shared.impl.SecuredSecurityTypes;
/**
* Specifies a role that when associated to a user gives access to the streamlet Feature on the RaceMap
* Specifies a role that when associated to a user gives access to the date mining functionality on archive server.
*/
public class ArchiveDataMiningRole extends RolePrototype {
private static final long serialVersionUID = 6671501683896115261L;
@@ -2,7 +2,12 @@ package com.sap.sse.security.shared.subscription;
import java.io.Serializable;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.sap.sse.security.shared.impl.Role;
import com.sap.sse.security.shared.impl.User;
@@ -28,18 +33,104 @@ public abstract class SubscriptionPlan implements Serializable {
*/
private final SubscriptionPlanRole[] roles;
/*
/**
* Used to make Plans of the same category mutually exclusive.
* BASIC is a dummy category used to define the features in the feature list.
*/
public enum PlanCategory {
PREMIUM("premium"), DATA_MINING_ARCHIVE("data_mining_archive"), DATA_MINING_ALL("data_mining_all"), TRIAL("trial");
BASIC("free_subscription_plan",
"features_organize_events",
"features_events_with_more_regatta",
"features_connect_to_tractrac",
"features_imports",
"features_media_management",
"features_limited_live_analytics",
"features_media_tags",
"features_scoring"),
PREMIUM("premium",
"features_organize_events",
"features_events_with_more_regatta",
"features_connect_to_tractrac",
"features_imports",
"features_media_management",
"features_limited_live_analytics",
"features_media_tags",
"features_scoring",
"features_wind_analytics",
"features_maneuver_analytics",
"features_competitor_analytics",
"features_advanced_leaderboard_info",
"features_simulator",
"features_map_analytics"),
DATA_MINING_ARCHIVE("data_mining_archive",
"features_organize_events",
"features_events_with_more_regatta",
"features_connect_to_tractrac",
"features_imports",
"features_media_management",
"features_limited_live_analytics",
"features_media_tags",
"features_scoring",
"features_wind_analytics",
"features_maneuver_analytics",
"features_competitor_analytics",
"features_advanced_leaderboard_info",
"features_simulator",
"features_map_analytics",
"features_data_mining"),
DATA_MINING_ALL("data_mining_all",
"features_organize_events",
"features_events_with_more_regatta",
"features_connect_to_tractrac",
"features_imports",
"features_media_management",
"features_limited_live_analytics",
"features_media_tags",
"features_scoring",
"features_wind_analytics",
"features_maneuver_analytics",
"features_competitor_analytics",
"features_advanced_leaderboard_info",
"features_simulator",
"features_map_analytics",
"features_data_mining",
"features_data_mining_all"),
TRIAL("trial");
final String id;
PlanCategory(String id) {
final Set<String> featureIds;
PlanCategory(String id, String...featureIds) {
this.id = id;
this.featureIds = new HashSet<>(Arrays.asList(featureIds));
}
public String getId() {
return id;
}
public boolean containsFeature(String featureId) {
return featureIds.contains(featureId);
}
private boolean hasFeature() {
return !featureIds.isEmpty();
}
public static List<PlanCategory> getCategoriesWithFeature() {
return Stream.of(PlanCategory.values())
.filter(c -> c.hasFeature())
.collect(Collectors.toList());
}
public static Set<String> getAllFeatureIds() {
final Set<String> featureIds = new LinkedHashSet<>();
for (final PlanCategory category : PlanCategory.values()) {
featureIds.addAll(category.featureIds);
}
return featureIds;
}
}
/**
@@ -62,10 +62,12 @@ public interface SubscriptionStringConstants extends ConstantsWithLookup {
String features_full_live_analytics_description();
String features_organize_events_title();
String features_organize_events_description();
String features_organize_events_url();//
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_url();//
String features_imports_title();
String features_imports_description();
String features_media_management_title();
@@ -78,4 +80,6 @@ public interface SubscriptionStringConstants extends ConstantsWithLookup {
String features_scoring_description();
String features_data_mining_title();
String features_data_mining_description();
String features_data_mining_all_title();
String features_data_mining_all_description();
}
@@ -14,12 +14,12 @@ businessModelDescription=We decided to extend our free solution by a Subscriptio
support, maintenance and further development of the Sailing Analytics. You can leave your \
suggestions at https://bugzilla.sapsailing.com and follow the development progress there. \
We thank you for your understanding and continued support!
free_subscription_plan_name=Free
free_subscription_plan_description=Try it out
free_subscription_plan_name=Basic
free_subscription_plan_description=Create your own account. Try it out.
free_subscription_plan_info=
free_subscription_plan_price_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 \
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
premium_name=Premium
@@ -29,25 +29,25 @@ premium_info=
premium_price_info=One Time Payment
premium_features=\
Everything from the free plan|\
Full live analytics with hundreds of features including, wind streamlet, comparison charts or gap to leader|\
Full live analytics with hundreds of features including, wind streamlets, comparison charts or gap to leader|\
Tag personal timeline with videos and notes|\
Advanced in-map visualizations and much more.|\
See full premium feature-list below
data_mining_archive_name=Data Mining - Archive
data_mining_archive_name=Data\u00A0Mining - Archive
data_mining_archive_description=Data Mining across archived races and events
data_mining_archive_info=
data_mining_archive_price_info=One Time Payment
data_mining_archive_features=\
Everything from Premium plan|\
Powerful data mining for archived races and events that can be found under www.sapsailing.com
data_mining_all_name=Data Mining - ALL
data_mining_all_name=Data Mining - All
data_mining_all_description=Data Mining across all races and events
data_mining_all_info=
data_mining_all_price_info=One Time Payment
data_mining_all_features=\
Everything from Data Mining Archive plan|\
Powerful data mining including additional data from all sub domains of sapsailing.com, e.g.: for leagues, live events or club servers
free_subscription_plan_shortname=free
free_subscription_plan_shortname=basic
premium_subscription_plan_shortname=premium
datamining_subscription_plan_shortname=data mining
features_limited_live_analytics_title=Live Analytics (limited)
@@ -55,11 +55,13 @@ features_limited_live_analytics_description=Limited Live Analytics
features_full_live_analytics_title=Live Analytics (full)
features_full_live_analytics_description=Full live analytics with hundreds of features including wind streamlets, comparison charts, advanced map visualizations and much more
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 like Trac Trac. Maneuever detection and Analytics
features_organize_events_description=Run the Sailing Analytics at your regatta with our free tracking app or a professional tracking service like Trac Trac. Maneuever detection and Analytics
features_organize_events_url=https://support.sapsailing.com/hc/en-us/articles/360018169799-Create-a-simple-event-on-my-sapsailing-com
features_events_with_more_regatta_title=Events with more than one regatta
features_events_with_more_regatta_description=You can create a multi-class event or a season of events counting in a seasonal leaderboard
features_connect_to_tractrac_title=Connect to Trac Trac
features_connect_to_tractrac_description=Connect to professional tracking service
features_connect_to_tractrac_url=https://tractrac.com/
features_imports_title=Import external data
features_imports_description=Import GPX and KML file formats, GRIB files and Expedition logs
features_media_management_title=Media Management
@@ -70,7 +72,7 @@ features_media_tags_title=Link and upload media (tags)
features_media_tags_description=Place and read comments (notes and images on timeline)
features_scoring_title=Scoring
features_scoring_description=Low-Point, High-Point, various tie breaking variants, ToT/ToD as well as ORC Performance Curve Scoring handicap support
features_map_analytics_title=Map Analytics
features_map_analytics_title=Map analytics
features_map_analytics_description=Wind streamlets
features_simulator_title=Simulator
features_simulator_description=Simulation and analysis
@@ -82,12 +84,15 @@ features_maneuver_analytics_title=Maneuver Analytics
features_maneuver_analytics_description=Advanced analytics regarding maneuver execution of competitors, including maneuver loss, turn rate and maneuver angle
features_wind_analytics_title=Wind analytics
features_wind_analytics_description=Advanced analytics regarding collected wind data; colored animated overlay and strip charts for every wind source considered
features_data_mining_title=Data Mining
features_data_mining_description=Data Mining across races and events. \
Depending on plan type for archive only (everything that can be found under www.sapsailing.com) \
or all sub domains (e.g. for leagues, live events or club servers)
trial_name=Trial
trial_description=Free trial of all plans for one day, including the 'Premium' and the 'Data Mining' plan. Can be subscribed to only once
features_data_mining_title=Data\u00A0Mining-Archive
features_data_mining_description=Use Data Mining on data from past events across races and events
features_data_mining_all_title=Data Mining - All
features_data_mining_all_description=While with the "Archive" plan you can use data mining for past events that have already been archived, \
the "All" plan allows you to use data mining also for live events and ongoing league seasons. \
It also includes all data from archive (everything that can be found under www.sapsailing.com) \
and all sub domains (e.g. for leagues, live events or club servers)
trial_name=Free Trial
trial_description=Free trial of all plans for one day, including the "Premium" and both "Data Mining" plans. Can be subscribed to only once
trial_info=
trial_price_info=Test One Day for Free
trial_features=\
@@ -16,12 +16,12 @@ businessModelDescription=Wir haben uns entschieden, unsere kostenlose Lösung um
verwendet. Beschreibe Deine Vorschläge für Verbesserungen und neue Funktionen unter \
https://bugzilla.sapsailing.com und verfolge den Entwicklungsfortschritt. \
Vielen Dank für Dein Verständnis und Deine Unterstützung!
free_subscription_plan_name=Free
free_subscription_plan_description=Probier es aus
free_subscription_plan_name=Basic
free_subscription_plan_description=Erstellen Sie Ihr eigenes Konto und probier es aus
free_subscription_plan_info=
free_subscription_plan_price_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|\
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
premium_name=Premium
premium_description=Alle Premium-Funktionen, z.B. das Wind-Overlay für die Kartenansicht, Simulation für schnellste Kurse, \
@@ -40,7 +40,7 @@ data_mining_archive_price_info=einmalige Zahlung
data_mining_archive_features=\
Alle Features des Premium Plans|\
Leistungsstarkes Data Mining für archivierte Rennen und Veranstaltungen, die unter www.sapsailing.com zu finden sind
data_mining_all_name=Data Mining - All
data_mining_all_name=Data Mining - All / Testversion
data_mining_all_description=Data Mining über alle Rennen und Events hinweg
data_mining_all_info=
data_mining_all_price_info=einmalige Zahlung
@@ -82,12 +82,16 @@ features_maneuver_analytics_title=Manöveranalyse
features_maneuver_analytics_description=-Fortgeschrittene Analyseinformationen zu den durchgeführten Manövern der Teilnehmer, inklusive Manöververlust, Manöverwinkel und Drehgeschwindigkeit
features_wind_analytics_title=Windanalyse
features_wind_analytics_description=Analyseinformationen zu den gesammelten Winddaten; farbiges animiertes Karten-Overlay sowie grafischer Verlauf der Historie jeder einzelnen Windquelle
features_data_mining_title=Data Mining
features_data_mining_description=Data Mining über Rennen und Events hinweg. \
Je nach Plantyp nur für Archivserver (alles was unter www.sapsailing.com zu finden ist) \
oder alle Subdomains (z. B. für Ligen, Live-Events oder Vereinsserver)
trial_name=Trial
trial_description=Kostenlose Trial-Version aller Pläne für einen Tag, einschließlich des "Premium"- und des "Data Mining"-Plans. Kann nur einmal abonniert werden
features_data_mining_title=Data Mining - Archive
features_data_mining_description=Data Mining über bereits vergangene Rennen und Events hinweg.
features_data_mining_all_title=Data Mining - All
features_data_mining_all_description=Während Sie den Data Mining „Archive“-Plan für bereits archivierte vergangene Ereignisse nutzen können, \
können Sie den Data Mining „All“-Plan auch für Live-Events und laufende Ligasaisons nutzen. \
Alle Daten vom Archivserver (alles was unter www.sapsailing.com zu finden ist) \
oder von allen Subdomains (z. B. für Ligen, Live-Events oder Vereinsserver) sind \
ebenfalls enthalten.
trial_name=Kostenlose Testversion
trial_description=Kostenlose Testversion aller Pläne für einen Tag, einschließlich des "Premium" und der beiden "Data Mining" Pläne. Diese kann nur einmal abonniert werden
trial_info=
trial_price_info=Einen Tag kostenlos testen
trial_features=\
+11 -21
View File
@@ -58,34 +58,24 @@ To edit text of business model description you can adjust the texts in resouce c
To add, remove or edit a feature of the feature list
1. Add following texts to class (and related property files)
1. Add a feature to all plan categories it is included in. Therefore, add the feature id to the categories in
com.sap.sse.security.shared.subscription.SubscriptionPlan.PlanCategory
2. Add the text keys to `SubscriptionStringConstants` and maintain related labels in the property files.
Text resource file:
com.sap.sse.security.ui.client.i18n.subscription.SubscriptionStringConstants
Key pattern (all three keys are mandatory needed, but url can be empty, then the link element will not be rendered):
- `<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. The boolean values activate or deactivate the checkboxes for the FREE and PREMIUM diff view.
public SubscriptionCardContainer() {
initWidget(uiBinder.createAndBindUi(this));
addFeature("features_live_analytics", true, true);
addFeatureWithLink("features_organize_events", false, true);
Short names for the diff view can be defined with following keys
- `free_subscription_plan_shortname`
- `premium_subscription_plan_shortname`
They will be displayed in uppercase letters.
- `<FEATURE-ID>_url`
- An __optional__ url to an external resource like picture, video or homepage
## Cancellation