mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-19 04:05:36 +00:00
Merge branch 'bug5883'
This commit is contained in:
+1
-1
@@ -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");
|
||||
|
||||
+28
-2
@@ -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 {
|
||||
|
||||
+57
-68
@@ -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+ " <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 + " <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);
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+94
-3
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+4
@@ -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();
|
||||
}
|
||||
|
||||
+20
-15
@@ -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=\
|
||||
|
||||
+14
-10
@@ -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=\
|
||||
|
||||
@@ -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 <FEATURE-ID> 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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user