mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-07 03:22:23 +00:00
bug5712: Changed grouping of plans to one subscription card from category to new group enum.
- changed some texts of subscriptions and added new comparison column to feature list to get a better idea of the new Data Mining plans in the subscription overview.
This commit is contained in:
1 parent
546a00d733
commit
64900d1a44
18 files changed
+205
-122
No files matched your search
+11
-2
@@ -48,8 +48,8 @@ public class SailingSubscriptionPlan extends SubscriptionPlan {
|
||||
private static final Map<String, SubscriptionPlan> plansById = new HashMap<>();
|
||||
|
||||
private SailingSubscriptionPlan(String id, Set<SubscriptionPrice> prices, Set<PlanCategory> excludesPlanIds,
|
||||
Boolean isOneTimePlan, SubscriptionPlanRole... roles) {
|
||||
super(id, prices, excludesPlanIds, isOneTimePlan, roles);
|
||||
Boolean isOneTimePlan, PlanGroup group, SubscriptionPlanRole... roles) {
|
||||
super(id, prices, excludesPlanIds, isOneTimePlan, group, roles);
|
||||
plansById.put(id, this);
|
||||
}
|
||||
|
||||
@@ -57,16 +57,19 @@ public class SailingSubscriptionPlan extends SubscriptionPlan {
|
||||
Stream.of(new SubscriptionPrice(TRIAL_PREMIUM_PLAN_ITEMPRICE_ID, new BigDecimal(0), USD_CURRENCY_CODE,
|
||||
PaymentInterval.DAY, false)).collect(Collectors.toSet()),
|
||||
Stream.of(PlanCategory.PREMIUM).collect(Collectors.toSet()), true,
|
||||
PlanGroup.PREMIUM,
|
||||
new SubscriptionPlanRole(PremiumRole.getRoleId()));
|
||||
public static final SubscriptionPlan PREMIUM_WEEKLY = new SailingSubscriptionPlan(WEEKLY_PREMIUM_PLAN_ID,
|
||||
Stream.of(new SubscriptionPrice(WEEKLY_PREMIUM_PLAN_ITEMPRICE_ID, new BigDecimal(8.99), USD_CURRENCY_CODE,
|
||||
PaymentInterval.WEEK, true)).collect(Collectors.toSet()),
|
||||
Stream.of(PlanCategory.PREMIUM).collect(Collectors.toSet()), false,
|
||||
PlanGroup.PREMIUM,
|
||||
new SubscriptionPlanRole(PremiumRole.getRoleId()));
|
||||
public static final SubscriptionPlan PREMIUM_YEARLY = new SailingSubscriptionPlan(YEARLY_PREMIUM_PLAN_ID,
|
||||
Stream.of(new SubscriptionPrice(YEARLY_PREMIUM_PLAN_ITEMPRICE_ID, new BigDecimal(49.99), USD_CURRENCY_CODE,
|
||||
PaymentInterval.YEAR, false)).collect(Collectors.toSet()),
|
||||
Stream.of(PlanCategory.PREMIUM).collect(Collectors.toSet()), false,
|
||||
PlanGroup.PREMIUM,
|
||||
new SubscriptionPlanRole(PremiumRole.getRoleId()));
|
||||
|
||||
public static final SubscriptionPlan DATA_MINING_ARCHIVE_TRIAL = new SailingSubscriptionPlan(
|
||||
@@ -74,6 +77,7 @@ public class SailingSubscriptionPlan extends SubscriptionPlan {
|
||||
Stream.of(new SubscriptionPrice(TRIAL_DATA_MINING_ARCHIVE_PLAN_ITEMPRICE_ID, new BigDecimal(0),
|
||||
USD_CURRENCY_CODE, PaymentInterval.DAY, false)).collect(Collectors.toSet()),
|
||||
Stream.of(PlanCategory.DATA_MINING, PlanCategory.PREMIUM).collect(Collectors.toSet()), true,
|
||||
PlanGroup.DATA_MINING_ARCHIVE,
|
||||
new SubscriptionPlanRole(PremiumRole.getRoleId()),
|
||||
new SubscriptionPlanRole(ArchiveDataMiningRole.getRoleId()));
|
||||
public static final SubscriptionPlan DATA_MINING_ARCHIVE_WEEKLY = new SailingSubscriptionPlan(
|
||||
@@ -81,6 +85,7 @@ public class SailingSubscriptionPlan extends SubscriptionPlan {
|
||||
Stream.of(new SubscriptionPrice(WEEKLY_DATA_MINING_ARCHIVE_PLAN_ITEMPRICE_ID, new BigDecimal(89.99),
|
||||
USD_CURRENCY_CODE, PaymentInterval.WEEK, true)).collect(Collectors.toSet()),
|
||||
Stream.of(PlanCategory.DATA_MINING, PlanCategory.PREMIUM).collect(Collectors.toSet()), false,
|
||||
PlanGroup.DATA_MINING_ARCHIVE,
|
||||
new SubscriptionPlanRole(PremiumRole.getRoleId()),
|
||||
new SubscriptionPlanRole(ArchiveDataMiningRole.getRoleId()));
|
||||
public static final SubscriptionPlan DATA_MINING_ARCHIVE_YEARLY = new SailingSubscriptionPlan(
|
||||
@@ -88,6 +93,7 @@ public class SailingSubscriptionPlan extends SubscriptionPlan {
|
||||
Stream.of(new SubscriptionPrice(YEARLY_DATA_MINING_ARCHIVE_PLAN_ITEMPRICE_ID, new BigDecimal(499.99),
|
||||
USD_CURRENCY_CODE, PaymentInterval.YEAR, false)).collect(Collectors.toSet()),
|
||||
Stream.of(PlanCategory.DATA_MINING, PlanCategory.PREMIUM).collect(Collectors.toSet()), false,
|
||||
PlanGroup.DATA_MINING_ARCHIVE,
|
||||
new SubscriptionPlanRole(PremiumRole.getRoleId()),
|
||||
new SubscriptionPlanRole(ArchiveDataMiningRole.getRoleId()));
|
||||
|
||||
@@ -96,18 +102,21 @@ public class SailingSubscriptionPlan extends SubscriptionPlan {
|
||||
Stream.of(new SubscriptionPrice(TRIAL_DATA_MINING_ALL_PLAN_ITEMPRICE_ID, new BigDecimal(0),
|
||||
USD_CURRENCY_CODE, PaymentInterval.DAY, false)).collect(Collectors.toSet()),
|
||||
Stream.of(PlanCategory.DATA_MINING, PlanCategory.PREMIUM).collect(Collectors.toSet()), true,
|
||||
PlanGroup.DATA_MINING_ALL,
|
||||
new SubscriptionPlanRole(PremiumRole.getRoleId()), new SubscriptionPlanRole(AllDataMiningRole.getRoleId()));
|
||||
public static final SubscriptionPlan DATA_MINING_ALL_WEEKLY = new SailingSubscriptionPlan(
|
||||
WEEKLY_DATA_MINING_ALL_PLAN_ID,
|
||||
Stream.of(new SubscriptionPrice(WEEKLY_DATA_MINING_ALL_PLAN_ITEMPRICE_ID, new BigDecimal(189.99),
|
||||
USD_CURRENCY_CODE, PaymentInterval.WEEK, true)).collect(Collectors.toSet()),
|
||||
Stream.of(PlanCategory.DATA_MINING, PlanCategory.PREMIUM).collect(Collectors.toSet()), false,
|
||||
PlanGroup.DATA_MINING_ALL,
|
||||
new SubscriptionPlanRole(PremiumRole.getRoleId()), new SubscriptionPlanRole(AllDataMiningRole.getRoleId()));
|
||||
public static final SubscriptionPlan DATA_MINING_ALL_YEARLY = new SailingSubscriptionPlan(
|
||||
YEARLY_DATA_MINING_ALL_PLAN_ID,
|
||||
Stream.of(new SubscriptionPrice(YEARLY_DATA_MINING_ALL_PLAN_ITEMPRICE_ID, new BigDecimal(999.99),
|
||||
USD_CURRENCY_CODE, PaymentInterval.YEAR, false)).collect(Collectors.toSet()),
|
||||
Stream.of(PlanCategory.DATA_MINING, PlanCategory.PREMIUM).collect(Collectors.toSet()), false,
|
||||
PlanGroup.DATA_MINING_ALL,
|
||||
new SubscriptionPlanRole(PremiumRole.getRoleId()), new SubscriptionPlanRole(AllDataMiningRole.getRoleId()));
|
||||
|
||||
public static Map<Serializable, SubscriptionPlan> getAllInstances() {
|
||||
|
||||
+13
@@ -291,7 +291,20 @@
|
||||
width: 27px;
|
||||
}
|
||||
|
||||
.featureCheck {
|
||||
text-align: center;
|
||||
margin: 0 1em;
|
||||
}
|
||||
|
||||
.featureNone {
|
||||
text-align: center;
|
||||
margin: 0 1em;
|
||||
color: #999;
|
||||
font-size: 32px;
|
||||
}
|
||||
|
||||
.featureHeader {
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
font-size: 1.2em;
|
||||
text-transform: capitalize;
|
||||
|
||||
+9
-9
@@ -23,7 +23,7 @@ import com.google.gwt.user.client.ui.Label;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.common.client.SharedResources;
|
||||
import com.sap.sailing.gwt.home.shared.places.subscription.SailingSubscriptionStringConstants;
|
||||
import com.sap.sailing.gwt.home.shared.places.subscription.SubscriptionCategoryDTO;
|
||||
import com.sap.sailing.gwt.home.shared.places.subscription.SubscriptionGroupDTO;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sse.security.shared.subscription.SubscriptionPrice;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationContextEvent;
|
||||
@@ -69,9 +69,9 @@ public class SubscriptionCard extends Composite {
|
||||
|
||||
private final Consumer<SubscriptionPrice> subscriptionCallback;
|
||||
private SubscriptionPrice currentPrice;
|
||||
private final SubscriptionCategoryDTO subscriptionCategoryDTO;
|
||||
private final SubscriptionGroupDTO subscriptionCategoryDTO;
|
||||
|
||||
public <T> SubscriptionCard(SubscriptionCategoryDTO subscriptionCategroyDTO, Type type, Consumer<SubscriptionPrice> subscriptionCallback, EventBus eventBus, boolean loggedIn) {
|
||||
public <T> SubscriptionCard(SubscriptionGroupDTO subscriptionCategroyDTO, Type type, Consumer<SubscriptionPrice> subscriptionCallback, EventBus eventBus, boolean loggedIn) {
|
||||
this.subscriptionCallback = subscriptionCallback;
|
||||
this.subscriptionCategoryDTO = subscriptionCategroyDTO;
|
||||
SubscriptionCardResources.INSTANCE.css().ensureInjected();
|
||||
@@ -115,7 +115,7 @@ public class SubscriptionCard extends Composite {
|
||||
if (!subscriptionPrice.getDisablePlan()) {
|
||||
prices.add(price);
|
||||
}
|
||||
Label priceInfo = new Label(subscriptionStringConstants.getString(subscriptionCategroyDTO.getSubscriptionCategoryPriceInfoMessageKey()));
|
||||
Label priceInfo = new Label(subscriptionStringConstants.getString(subscriptionCategroyDTO.getSubscriptionGroupPriceInfoMessageKey()));
|
||||
priceInfo.addStyleName(PRICE_INFO_STYLE);
|
||||
if (Boolean.TRUE.equals(subscriptionPrice.getIsOneTimePayment())) {
|
||||
prices.add(priceInfo);
|
||||
@@ -173,10 +173,10 @@ public class SubscriptionCard extends Composite {
|
||||
default:
|
||||
break;
|
||||
}
|
||||
title.setInnerText(subscriptionStringConstants.getString(subscriptionCategroyDTO.getSubscriptionCategoryNameMessageKey()));
|
||||
description.setInnerText(subscriptionStringConstants.getString(subscriptionCategroyDTO.getSubscriptionCategoryDescMessageKey()));
|
||||
info.setInnerText(subscriptionStringConstants.getString(subscriptionCategroyDTO.getSubscriptionCategoryInfoMessageKey()));
|
||||
final String[] featureStrings = subscriptionStringConstants.getStringArray(subscriptionCategroyDTO.getSubscriptionCategoryFeatureMessageKey());
|
||||
title.setInnerText(subscriptionStringConstants.getString(subscriptionCategroyDTO.getSubscriptionGroupNameMessageKey()));
|
||||
description.setInnerText(subscriptionStringConstants.getString(subscriptionCategroyDTO.getSubscriptionGroupDescMessageKey()));
|
||||
info.setInnerText(subscriptionStringConstants.getString(subscriptionCategroyDTO.getSubscriptionGroupInfoMessageKey()));
|
||||
final String[] featureStrings = subscriptionStringConstants.getString(subscriptionCategroyDTO.getSubscriptionGroupFeatureMessageKey()).split("[|]");
|
||||
for (String featureString : featureStrings) {
|
||||
if(featureString != "") {
|
||||
FlowPanel feature = new FlowPanel();
|
||||
@@ -187,7 +187,7 @@ public class SubscriptionCard extends Composite {
|
||||
}
|
||||
}
|
||||
|
||||
public SubscriptionCategoryDTO getSubscriptionCategoryDTO() {
|
||||
public SubscriptionGroupDTO getSubscriptionCategoryDTO() {
|
||||
return subscriptionCategoryDTO;
|
||||
}
|
||||
|
||||
|
||||
+47
-31
@@ -51,32 +51,36 @@ public class SubscriptionCardContainer extends Composite {
|
||||
|
||||
public SubscriptionCardContainer() {
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
featureGrid = new Grid(2, 3);
|
||||
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);
|
||||
addFeature(subscriptionStringMessages.features_events_with_more_regatta_title(), subscriptionStringMessages.features_events_with_more_regatta_description(), true, true);
|
||||
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);
|
||||
addFeature(subscriptionStringMessages.features_imports_title(), subscriptionStringMessages.features_imports_description(), true, true);
|
||||
addFeature(subscriptionStringMessages.features_media_management_title(), subscriptionStringMessages.features_media_management_description(), true, true);
|
||||
addFeature(subscriptionStringMessages.features_limited_live_analytics_title(), subscriptionStringMessages.features_limited_live_analytics_description(), true, true);
|
||||
addFeature(subscriptionStringMessages.features_media_tags_title(), subscriptionStringMessages.features_media_tags_description(), true, true);
|
||||
addFeature(subscriptionStringMessages.features_scoring_title(), subscriptionStringMessages.features_scoring_description(), true, true);
|
||||
addFeature(subscriptionStringMessages.features_wind_analytics_title(), subscriptionStringMessages.features_wind_analytics_description(), false, true);
|
||||
addFeature(subscriptionStringMessages.features_maneuver_analytics_title(), subscriptionStringMessages.features_maneuver_analytics_description(), false, true);
|
||||
addFeature(subscriptionStringMessages.features_competitor_analytics_title(), subscriptionStringMessages.features_competitor_analytics_description(), false, true);
|
||||
addFeature(subscriptionStringMessages.features_advanced_leaderboard_info_title(), subscriptionStringMessages.features_advanced_leaderboard_info_description(), false, true);
|
||||
addFeature(subscriptionStringMessages.features_simulator_title(), subscriptionStringMessages.features_simulator_description(), false, true);
|
||||
addFeature(subscriptionStringMessages.features_map_analytics_title(), subscriptionStringMessages.features_map_analytics_description(), false, true);
|
||||
"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);
|
||||
features.add(featureGrid);
|
||||
emailContact.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
@@ -87,13 +91,13 @@ public class SubscriptionCardContainer extends Composite {
|
||||
});
|
||||
}
|
||||
|
||||
private void addFeature(final String titleString, final String descriptionString, boolean free, boolean premium) {
|
||||
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, description);
|
||||
addFeatureWithDescription(titleString, free, premium, dataMining, description);
|
||||
}
|
||||
|
||||
private void addFeatureWithLink(final String titleString, final String descriptionString, final String link, boolean free, boolean premium) {
|
||||
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()
|
||||
@@ -104,10 +108,10 @@ public class SubscriptionCardContainer extends Composite {
|
||||
+ "</a>");
|
||||
descriptionWithLink.addStyleName(SubscriptionCardResources.INSTANCE.css().featureDescription());
|
||||
descriptionWithLink.add(exampleLink);
|
||||
addFeatureWithDescription(titleString, free, premium, descriptionWithLink);
|
||||
addFeatureWithDescription(titleString, free, premium, dataMining, descriptionWithLink);
|
||||
}
|
||||
|
||||
private void addFeatureWithDescription(final String titleString, boolean free, boolean premium, Widget description) {
|
||||
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
|
||||
int currentRowIndex = featureGrid.getRowCount();
|
||||
featureGrid.resizeRows(currentRowIndex + 1);
|
||||
@@ -117,23 +121,35 @@ public class SubscriptionCardContainer extends Composite {
|
||||
line.add(title);
|
||||
line.add(description);
|
||||
featureGrid.setWidget(currentRowIndex, 0, line);
|
||||
if (free) {
|
||||
createCheckMark(currentRowIndex, 1);
|
||||
}
|
||||
if (premium) {
|
||||
createCheckMark(currentRowIndex, 2);
|
||||
}
|
||||
createCheckMark(currentRowIndex, 1, free);
|
||||
createCheckMark(currentRowIndex, 2, premium);
|
||||
createCheckMark(currentRowIndex, 3, dataMining);
|
||||
}
|
||||
|
||||
private void createCheckMark(int currentRowIndex, final int column) {
|
||||
/**
|
||||
* Paint a check icon or if state is false a X icon.
|
||||
*
|
||||
* @param currentRowIndex
|
||||
* the current row
|
||||
* @param column
|
||||
* the column
|
||||
* @param checkState
|
||||
* the state (true: check, false: X)
|
||||
*/
|
||||
private void createCheckMark(int currentRowIndex, final int column, boolean checkState) {
|
||||
FlowPanel check = new FlowPanel();
|
||||
check.add(new Image(SharedDesktopResources.INSTANCE.dropdownCheck().getSafeUri()));
|
||||
check.addStyleName(SubscriptionCardResources.INSTANCE.css().featureCheck());
|
||||
if (checkState) {
|
||||
check.add(new Image(SharedDesktopResources.INSTANCE.dropdownCheck().getSafeUri()));
|
||||
check.addStyleName(SubscriptionCardResources.INSTANCE.css().featureCheck());
|
||||
} else {
|
||||
check.add(new Label("-"));
|
||||
check.addStyleName(SubscriptionCardResources.INSTANCE.css().featureNone());
|
||||
}
|
||||
featureGrid.setWidget(currentRowIndex, column, check);
|
||||
}
|
||||
|
||||
public void addSubscription(SubscriptionCard subscription) {
|
||||
if (!isSubscriptionPlanExisting(subscription.getSubscriptionCategoryDTO().getSubscriptionCategoryId())) {
|
||||
if (!isSubscriptionPlanExisting(subscription.getSubscriptionCategoryDTO().getSubscriptionGroupId())) {
|
||||
container.add(subscription);
|
||||
}
|
||||
}
|
||||
@@ -143,7 +159,7 @@ public class SubscriptionCardContainer extends Composite {
|
||||
for (int i = 0; i < container.getWidgetCount(); i++) {
|
||||
if (container.getWidget(i) instanceof SubscriptionCard) {
|
||||
SubscriptionCard card = (SubscriptionCard)container.getWidget(i);
|
||||
if (card.getSubscriptionCategoryDTO().getSubscriptionCategoryId().equals(planId)) {
|
||||
if (card.getSubscriptionCategoryDTO().getSubscriptionGroupId().equals(planId)) {
|
||||
isExisting = true;
|
||||
break;
|
||||
}
|
||||
|
||||
+1
@@ -40,6 +40,7 @@ public interface SubscriptionCardResources extends SharedHomeResources {
|
||||
String featureDescription();
|
||||
String featureLink();
|
||||
String featureCheck();
|
||||
String featureNone();
|
||||
String featureHeader();
|
||||
}
|
||||
}
|
||||
+22
-21
@@ -16,7 +16,7 @@ import com.google.gwt.user.client.ui.AcceptsOneWidget;
|
||||
import com.sap.sailing.gwt.home.desktop.partials.subscription.SubscriptionCard.Type;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sse.security.shared.subscription.InvalidSubscriptionProviderException;
|
||||
import com.sap.sse.security.shared.subscription.SubscriptionPlan.PlanCategory;
|
||||
import com.sap.sse.security.shared.subscription.SubscriptionPlan.PlanGroup;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationContextEvent;
|
||||
import com.sap.sse.security.ui.authentication.app.AuthenticationContext;
|
||||
import com.sap.sse.security.ui.shared.subscription.SubscriptionPlanDTO;
|
||||
@@ -71,7 +71,7 @@ public abstract class AbstractSubscriptionActivity extends AbstractActivity impl
|
||||
public void onSuccess(final ArrayList<SubscriptionPlanDTO> result) {
|
||||
view.resetSubscriptions();
|
||||
addFreePlan(view);
|
||||
Map<PlanCategory, SubscriptionCategoryDTO> categoryMap = new HashMap<PlanCategory, SubscriptionCategoryDTO>();
|
||||
Map<PlanGroup, SubscriptionGroupDTO> categoryMap = new HashMap<>();
|
||||
result.forEach(plan -> {
|
||||
final Type type;
|
||||
if (checkIfUserIsOwnerOfThePlan(plan) || checkIfUserIsSubscribedToPlanCategory(plan)) {
|
||||
@@ -81,33 +81,34 @@ public abstract class AbstractSubscriptionActivity extends AbstractActivity impl
|
||||
} else {
|
||||
type = Type.DEFAULT;
|
||||
}
|
||||
plan.getPlanCategory().forEach(category -> {
|
||||
final SubscriptionCategoryDTO categoryDTO;
|
||||
if (categoryMap.containsKey(category)) {
|
||||
categoryDTO = categoryMap.get(category);
|
||||
plan.getPrices().forEach(price -> {
|
||||
price.setDisablePlan(plan.isUserWasAlreadySubscribedToOneTimePlan());
|
||||
categoryDTO.getPrices().add(price);
|
||||
});
|
||||
} else {
|
||||
categoryDTO = new SubscriptionCategoryDTO(category.getId(), plan.isUserSubscribedToPlan(), plan.getPrices(), category, plan.isUserWasAlreadySubscribedToOneTimePlan(), plan.isUserSubscribedToPlanCategory(), plan.getError(), type);
|
||||
categoryMap.put(category, categoryDTO);
|
||||
}
|
||||
categoryDTO.getPrices().forEach(price -> {
|
||||
final SubscriptionGroupDTO categoryDTO;
|
||||
if (categoryMap.containsKey(plan.getGroup())) {
|
||||
categoryDTO = categoryMap.get(plan.getGroup());
|
||||
plan.getPrices().forEach(price -> {
|
||||
price.setDisablePlan(plan.isUserWasAlreadySubscribedToOneTimePlan());
|
||||
categoryDTO.getPrices().add(price);
|
||||
});
|
||||
} else {
|
||||
categoryDTO = new SubscriptionGroupDTO(plan.getGroup().getId(),
|
||||
plan.isUserSubscribedToPlan(), plan.getPrices(), plan.getGroup(),
|
||||
plan.isUserWasAlreadySubscribedToOneTimePlan(),
|
||||
plan.isUserSubscribedToPlanCategory(), plan.getError(), type);
|
||||
categoryMap.put(plan.getGroup(), categoryDTO);
|
||||
}
|
||||
categoryDTO.getPrices().forEach(price -> {
|
||||
price.setDisablePlan(plan.isUserWasAlreadySubscribedToOneTimePlan());
|
||||
});
|
||||
});
|
||||
List<SubscriptionCategoryDTO> categories = new ArrayList<SubscriptionCategoryDTO>(categoryMap.values());
|
||||
categories.sort(new Comparator<SubscriptionCategoryDTO>() {
|
||||
List<SubscriptionGroupDTO> categories = new ArrayList<SubscriptionGroupDTO>(categoryMap.values());
|
||||
categories.sort(new Comparator<SubscriptionGroupDTO>() {
|
||||
|
||||
@Override
|
||||
public int compare(SubscriptionCategoryDTO o1, SubscriptionCategoryDTO o2) {
|
||||
return o1.getPlanCategory().compareTo(o2.getPlanCategory());
|
||||
public int compare(SubscriptionGroupDTO o1, SubscriptionGroupDTO o2) {
|
||||
return o1.getGroup().compareTo(o2.getGroup());
|
||||
}
|
||||
});
|
||||
categories.forEach(category -> {
|
||||
GWT.log("Category: " + category.getSubscriptionCategoryId());
|
||||
GWT.log("Category: " + category.getSubscriptionGroupId());
|
||||
view.addSubscriptionCategory(category, category.getType(), eventBus);
|
||||
});
|
||||
}
|
||||
@@ -118,7 +119,7 @@ public abstract class AbstractSubscriptionActivity extends AbstractActivity impl
|
||||
}
|
||||
|
||||
private void addFreePlan(final SubscriptionView view) {
|
||||
final SubscriptionCategoryDTO freePlan = new SubscriptionCategoryDTO(
|
||||
final SubscriptionGroupDTO freePlan = new SubscriptionGroupDTO(
|
||||
"free_subscription_plan" /* id */, /* isUserSubscribedToPlan */ false,
|
||||
Collections.emptySet() /* prices */, /* planCategory */ null,
|
||||
/* userWasAlreadySubscribedToOneTimePlan */ false, /*isUserSubscribedToPlanCategory*/ false, null /* error */, Type.DEFAULT);
|
||||
|
||||
+19
-19
@@ -5,13 +5,13 @@ import java.util.Set;
|
||||
|
||||
import com.google.gwt.user.client.rpc.IsSerializable;
|
||||
import com.sap.sailing.gwt.home.desktop.partials.subscription.SubscriptionCard;
|
||||
import com.sap.sse.security.shared.subscription.SubscriptionPlan.PlanCategory;
|
||||
import com.sap.sse.security.shared.subscription.SubscriptionPlan.PlanGroup;
|
||||
import com.sap.sse.security.shared.subscription.SubscriptionPrice;
|
||||
|
||||
/**
|
||||
* A class to collect info from a bunch of SubscriptionPlanDTO which can be represented on one card.
|
||||
*/
|
||||
public class SubscriptionCategoryDTO implements IsSerializable {
|
||||
public class SubscriptionGroupDTO implements IsSerializable {
|
||||
private static final long serialVersionUID = -3820239604039244557L;
|
||||
|
||||
public static final String FEATURES_MESSAGE_KEY_SUFFX = "_features";
|
||||
@@ -23,25 +23,25 @@ public class SubscriptionCategoryDTO implements IsSerializable {
|
||||
private final String id;
|
||||
private HashSet<SubscriptionPrice> prices = new HashSet<SubscriptionPrice>();
|
||||
private final Boolean isUserSubscribedToPlan;
|
||||
private final PlanCategory planCategory;
|
||||
private final PlanGroup group;
|
||||
private final Boolean userWasAlreadySubscribedToOneTimePlan;
|
||||
private final Boolean isUserSubscribedToPlanCategory;
|
||||
private final Boolean isUserSubscribedToGroup;
|
||||
private final SubscriptionCard.Type type;
|
||||
|
||||
public SubscriptionCategoryDTO(String id, boolean isUserSubscribedToPlan, Set<SubscriptionPrice> prices,
|
||||
PlanCategory planCategory, boolean userWasAlreadySubscribedToOneTimePlan,
|
||||
boolean isUserSubscribedToPlanCategory, String error, SubscriptionCard.Type type) {
|
||||
public SubscriptionGroupDTO(String id, boolean isUserSubscribedToPlan, Set<SubscriptionPrice> prices,
|
||||
PlanGroup group, boolean userWasAlreadySubscribedToOneTimePlan,
|
||||
boolean isUserSubscribedToGroup, String error, SubscriptionCard.Type type) {
|
||||
this.id = id;
|
||||
this.isUserSubscribedToPlan = isUserSubscribedToPlan;
|
||||
this.planCategory = planCategory;
|
||||
this.group = group;
|
||||
this.userWasAlreadySubscribedToOneTimePlan = userWasAlreadySubscribedToOneTimePlan;
|
||||
this.isUserSubscribedToPlanCategory = isUserSubscribedToPlanCategory;
|
||||
this.isUserSubscribedToGroup = isUserSubscribedToGroup;
|
||||
this.prices = new HashSet<SubscriptionPrice>(prices);
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public PlanCategory getPlanCategory() {
|
||||
return planCategory;
|
||||
public PlanGroup getGroup() {
|
||||
return group;
|
||||
}
|
||||
|
||||
public boolean isUserWasAlreadySubscribedToOneTimePlan() {
|
||||
@@ -52,7 +52,7 @@ public class SubscriptionCategoryDTO implements IsSerializable {
|
||||
return serialVersionUID;
|
||||
}
|
||||
|
||||
public String getSubscriptionCategoryId() {
|
||||
public String getSubscriptionGroupId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@@ -64,31 +64,31 @@ public class SubscriptionCategoryDTO implements IsSerializable {
|
||||
return prices;
|
||||
}
|
||||
|
||||
public boolean isUserSubscribedToPlanCategory() {
|
||||
return isUserSubscribedToPlanCategory;
|
||||
public boolean isUserSubscribedToGroup() {
|
||||
return isUserSubscribedToGroup;
|
||||
}
|
||||
|
||||
public SubscriptionCard.Type getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getSubscriptionCategoryNameMessageKey() {
|
||||
public String getSubscriptionGroupNameMessageKey() {
|
||||
return id + NAME_MESSAGE_KEY_SUFFX;
|
||||
}
|
||||
|
||||
public String getSubscriptionCategoryDescMessageKey() {
|
||||
public String getSubscriptionGroupDescMessageKey() {
|
||||
return id + DESC_MESSAGE_KEY_SUFFX;
|
||||
}
|
||||
|
||||
public String getSubscriptionCategoryInfoMessageKey() {
|
||||
public String getSubscriptionGroupInfoMessageKey() {
|
||||
return id + INFO_MESSAGE_KEY_SUFFIX;
|
||||
}
|
||||
|
||||
public String getSubscriptionCategoryFeatureMessageKey() {
|
||||
public String getSubscriptionGroupFeatureMessageKey() {
|
||||
return id + FEATURES_MESSAGE_KEY_SUFFX;
|
||||
}
|
||||
|
||||
public String getSubscriptionCategoryPriceInfoMessageKey() {
|
||||
public String getSubscriptionGroupPriceInfoMessageKey() {
|
||||
return id + PRICE_INFO_MESSAGE_KEY_SUFFIX;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -8,7 +8,7 @@ import com.sap.sse.security.ui.client.subscription.SubscribeView;
|
||||
|
||||
public interface SubscriptionView extends SubscribeView, IsWidget {
|
||||
|
||||
void addSubscriptionCategory(SubscriptionCategoryDTO plan, final SubscriptionCard.Type type, final EventBus eventBus);
|
||||
void addSubscriptionCategory(SubscriptionGroupDTO plan, final SubscriptionCard.Type type, final EventBus eventBus);
|
||||
|
||||
void resetSubscriptions();
|
||||
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@ public class SubscriptionViewImpl extends Composite implements SubscriptionView
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addSubscriptionCategory(final SubscriptionCategoryDTO category, final SubscriptionCard.Type type,
|
||||
public void addSubscriptionCategory(final SubscriptionGroupDTO category, final SubscriptionCard.Type type,
|
||||
final EventBus eventBus) {
|
||||
switch (type) {
|
||||
case HIGHLIGHT:
|
||||
|
||||
@@ -78,6 +78,8 @@ import com.sap.sse.security.shared.HasPermissions.DefaultActions;
|
||||
import com.sap.sse.security.shared.HasPermissionsProvider;
|
||||
import com.sap.sse.security.shared.RoleDefinition;
|
||||
import com.sap.sse.security.shared.SubscriptionPlanProvider;
|
||||
import com.sap.sse.security.shared.subscription.AllDataMiningRole;
|
||||
import com.sap.sse.security.shared.subscription.ArchiveDataMiningRole;
|
||||
import com.sap.sse.security.util.GenericJSONPreferenceConverter;
|
||||
import com.sap.sse.util.ClearStateTestSupport;
|
||||
import com.sap.sse.util.ServiceTrackerFactory;
|
||||
@@ -266,6 +268,8 @@ public class Activator implements BundleActivator {
|
||||
// TODO: Registering SubscriptionPlan specific RoleDefinitions here requires additional maintenance. Consider
|
||||
// implementing another Construct like OSGIHasPermissionsProvider
|
||||
securityService.getOrCreateRoleDefinitionFromPrototype(PremiumRole.getInstance());
|
||||
securityService.getOrCreateRoleDefinitionFromPrototype(ArchiveDataMiningRole.getInstance());
|
||||
securityService.getOrCreateRoleDefinitionFromPrototype(AllDataMiningRole.getInstance());
|
||||
}, null));
|
||||
final TrackedRaceStatisticsCache trackedRaceStatisticsCache = new TrackedRaceStatisticsCacheImpl();
|
||||
registrations.add(context.registerService(TrackedRaceStatisticsCache.class.getName(),
|
||||
|
||||
+2
-2
@@ -21,8 +21,8 @@ public class SSESubscriptionPlan extends SubscriptionPlan {
|
||||
private static final Map<String, SSESubscriptionPlan> plansById = new HashMap<String, SSESubscriptionPlan>();
|
||||
|
||||
private SSESubscriptionPlan(String id, HashSet<SubscriptionPrice> prices, Set<PlanCategory> planCategories,
|
||||
Boolean isOneTimePlan, SubscriptionPlanRole... roles) {
|
||||
super(id, prices, planCategories, isOneTimePlan, roles);
|
||||
Boolean isOneTimePlan, PlanGroup group, SubscriptionPlanRole... roles) {
|
||||
super(id, prices, planCategories, isOneTimePlan, group, roles);
|
||||
plansById.put(id, this);
|
||||
}
|
||||
|
||||
|
||||
+21
-1
@@ -22,6 +22,7 @@ public abstract class SubscriptionPlan implements Serializable {
|
||||
private final Set<SubscriptionPrice> prices;
|
||||
private final Set<PlanCategory> planCategory;
|
||||
private final Boolean isOneTimePlan;
|
||||
private final PlanGroup group;
|
||||
/**
|
||||
* Roles assigned for this plan, if user subscribe to the plan then the user will be assigned these roles
|
||||
*/
|
||||
@@ -41,13 +42,28 @@ public abstract class SubscriptionPlan implements Serializable {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to organize plans in groups to show on one subscription card.
|
||||
*/
|
||||
public enum PlanGroup {
|
||||
PREMIUM("premium"), DATA_MINING_ALL("data_mining_all"), DATA_MINING_ARCHIVE("data_mining_archive");
|
||||
final String id;
|
||||
PlanGroup(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
}
|
||||
|
||||
protected SubscriptionPlan(String id, Set<SubscriptionPrice> prices, Set<PlanCategory> planCategory,
|
||||
Boolean isOneTimePlan, SubscriptionPlanRole[] roles) {
|
||||
Boolean isOneTimePlan, PlanGroup group, SubscriptionPlanRole[] roles) {
|
||||
this.id = id;
|
||||
this.roles = roles;
|
||||
this.prices = prices;
|
||||
this.planCategory = planCategory;
|
||||
this.isOneTimePlan = isOneTimePlan;
|
||||
this.group = group;
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
@@ -69,6 +85,10 @@ public abstract class SubscriptionPlan implements Serializable {
|
||||
public Boolean getIsOneTimePlan() {
|
||||
return isOneTimePlan;
|
||||
}
|
||||
|
||||
public PlanGroup getGroup() {
|
||||
return group;
|
||||
}
|
||||
|
||||
public boolean isUserInPossessionOfRoles(User user) {
|
||||
boolean foundAll = true;
|
||||
|
||||
+6
-4
@@ -20,22 +20,22 @@ public interface SubscriptionStringConstants extends ConstantsWithLookup {
|
||||
String free_subscription_plan_description();
|
||||
String free_subscription_plan_info();
|
||||
String free_subscription_plan_price_info();
|
||||
String[] free_subscription_plan_features();
|
||||
String free_subscription_plan_features();
|
||||
String premium_name();
|
||||
String premium_description();
|
||||
String premium_price_info();
|
||||
String premium_info();
|
||||
String[] premium_features();
|
||||
String premium_features();
|
||||
String data_mining_archive_name();
|
||||
String data_mining_archive_description();
|
||||
String data_mining_archive_price_info();
|
||||
String data_mining_archive_info();
|
||||
String[] data_mining_archive_features();
|
||||
String data_mining_archive_features();
|
||||
String data_mining_all_name();
|
||||
String data_mining_all_description();
|
||||
String data_mining_all_price_info();
|
||||
String data_mining_all_info();
|
||||
String[] data_mining_all_features();
|
||||
String data_mining_all_features();
|
||||
String free_subscription_plan_shortname();
|
||||
String premium_subscription_plan_shortname();
|
||||
String datamining_subscription_plan_shortname();
|
||||
@@ -71,4 +71,6 @@ public interface SubscriptionStringConstants extends ConstantsWithLookup {
|
||||
String features_media_tags_description();
|
||||
String features_scoring_title();
|
||||
String features_scoring_description();
|
||||
String features_data_mining_title();
|
||||
String features_data_mining_description();
|
||||
}
|
||||
+16
-12
@@ -18,31 +18,31 @@ free_subscription_plan_name=Free
|
||||
free_subscription_plan_description=Try it out
|
||||
free_subscription_plan_info=
|
||||
free_subscription_plan_price_info=
|
||||
free_subscription_plan_features=Basic live wind based leaderboard,\
|
||||
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,\
|
||||
free tracking app or a professional tracking service|\
|
||||
Sync live YouTube videos with your races
|
||||
premium_name=Premium
|
||||
premium_description=A short trial experience of the premium features. Lasts a day.
|
||||
premium_description=All the premium features.
|
||||
premium_info=Everything from free plan plus:
|
||||
premium_price_info=One Time Payment
|
||||
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, \
|
||||
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|\
|
||||
Tag Personal Timeline with Videos and Notes
|
||||
data_mining_archive_name=Data Mining - Archive
|
||||
data_mining_archive_description=
|
||||
data_mining_archive_info=
|
||||
data_mining_archive_description=Data Mining across archived races and events.
|
||||
data_mining_archive_info=Everything from premium plan plus:
|
||||
data_mining_archive_price_info=One Time Payment
|
||||
data_mining_archive_features=
|
||||
data_mining_archive_features=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_description=
|
||||
data_mining_all_info=
|
||||
data_mining_all_description=Data Mining across all races and events
|
||||
data_mining_all_info=Everything from data mining archive plan plus:
|
||||
data_mining_all_price_info=One Time Payment
|
||||
data_mining_all_features=
|
||||
data_mining_all_features=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
|
||||
premium_subscription_plan_shortname=premium
|
||||
datamining_subscription_plan_shortname=data-mining
|
||||
datamining_subscription_plan_shortname=data mining
|
||||
features_limited_live_analytics_title=Live Analytics (limited)
|
||||
features_limited_live_analytics_description=Limited Live Analytics.
|
||||
features_full_live_analytics_title=Live Analytics (full)
|
||||
@@ -75,4 +75,8 @@ features_maneuver_analytics_title=Maneuver Analytics
|
||||
features_maneuver_analytics_description=Advanced analytics regarding maneuver execution of competitors.
|
||||
features_wind_analytics_title=Wind analytics
|
||||
features_wind_analytics_description=Advanced analytics regarding collected wind data.
|
||||
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)
|
||||
|
||||
+13
-9
@@ -20,30 +20,30 @@ free_subscription_plan_name=Free
|
||||
free_subscription_plan_description=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,\
|
||||
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
|
||||
premium_name=Trial
|
||||
premium_description=Eine kurze Kostprobe der Premiummitgliedschaft. Läuft einen Tag.
|
||||
premium_info=Alles vom kostenlosen Plan plus:
|
||||
premium_price_info=einmalige Zahlung
|
||||
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, \
|
||||
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|\
|
||||
Kennzeichnen Sie die persönliche Timeline mit Videos und Notizen
|
||||
data_mining_archive_name=Data Mining - Archive
|
||||
data_mining_archive_description=
|
||||
data_mining_archive_description=Data Mining über archivierte Rennen und Veranstaltungen hinweg.
|
||||
data_mining_archive_info=
|
||||
data_mining_archive_price_info=einmalige Zahlung
|
||||
data_mining_archive_features=
|
||||
data_mining_archive_features=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_description=
|
||||
data_mining_all_description=Data Mining über alle Rennen und Events hinweg
|
||||
data_mining_all_info=
|
||||
data_mining_all_price_info=einmalige Zahlung
|
||||
data_mining_all_features=
|
||||
data_mining_all_features=Leistungsstarkes Data Mining inklusive zusätzlicher Daten aus allen Subdomains von sapsailing.com, z. B.: für Ligen, Live-Events oder Clubserver
|
||||
free_subscription_plan_shortname=free
|
||||
premium_subscription_plan_shortname=premium
|
||||
datamining_subscription_plan_shortname=data-mining
|
||||
datamining_subscription_plan_shortname=data mining
|
||||
features_limited_live_analytics_title=Live Analytics (limitiert)
|
||||
features_limited_live_analytics_description=Limitierte Live-Analyse.
|
||||
features_full_live_analytics_title=Live Analytics (vollständig)
|
||||
@@ -76,3 +76,7 @@ features_maneuver_analytics_title=Manöveranalyse
|
||||
features_maneuver_analytics_description=-Fortgeschrittene Analyseinformationen zu den durchgeführten Manövern der Competitoren.
|
||||
features_wind_analytics_title=Windanalyse
|
||||
features_wind_analytics_description=Analyseinformationen zu den gesammelten Winddaten.
|
||||
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)
|
||||
+1
-1
@@ -245,7 +245,7 @@ public abstract class SubscriptionServiceImpl extends RemoteServiceServlet imple
|
||||
prices.add(price);
|
||||
});
|
||||
return new SubscriptionPlanDTO(plan.getId(), isUserSubscribedToPlan, prices,
|
||||
plan.getPlanCategories(), hasHadSubscriptionForOneTimePlan, isUserSubscribedToPlanCategory, null);
|
||||
plan.getPlanCategories(), hasHadSubscriptionForOneTimePlan, isUserSubscribedToPlanCategory, null, plan.getGroup());
|
||||
}
|
||||
|
||||
private boolean isUserSubscribedToPlan(String planId) {
|
||||
|
||||
+8
-1
@@ -6,6 +6,7 @@ import java.util.Set;
|
||||
import com.google.gwt.user.client.rpc.IsSerializable;
|
||||
import com.sap.sse.security.shared.subscription.SubscriptionPrice;
|
||||
import com.sap.sse.security.shared.subscription.SubscriptionPlan.PlanCategory;
|
||||
import com.sap.sse.security.shared.subscription.SubscriptionPlan.PlanGroup;
|
||||
import com.sap.sse.security.ui.client.subscription.SubscriptionService;
|
||||
|
||||
/**
|
||||
@@ -20,6 +21,7 @@ public class SubscriptionPlanDTO implements HasSubscriptionMessageKeys, IsSerial
|
||||
private Set<PlanCategory> planCategory;
|
||||
private Boolean userWasAlreadySubscribedToOneTimePlan;
|
||||
private Boolean isUserSubscribedToPlanCategory;
|
||||
private PlanGroup group;
|
||||
|
||||
/**
|
||||
* For GWT Serialization only
|
||||
@@ -30,7 +32,7 @@ public class SubscriptionPlanDTO implements HasSubscriptionMessageKeys, IsSerial
|
||||
|
||||
public SubscriptionPlanDTO(String id, boolean isUserSubscribedToPlan, Set<SubscriptionPrice> prices,
|
||||
Set<PlanCategory> planCategory, boolean userWasAlreadySubscribedToOneTimePlan,
|
||||
boolean isUserSubscribedToPlanCategory, String error) {
|
||||
boolean isUserSubscribedToPlanCategory, String error, PlanGroup group) {
|
||||
this.id = id;
|
||||
this.isUserSubscribedToPlan = isUserSubscribedToPlan;
|
||||
this.planCategory = planCategory;
|
||||
@@ -38,6 +40,11 @@ public class SubscriptionPlanDTO implements HasSubscriptionMessageKeys, IsSerial
|
||||
this.isUserSubscribedToPlanCategory = isUserSubscribedToPlanCategory;
|
||||
this.prices = new HashSet<SubscriptionPrice>(prices);
|
||||
this.error = error;
|
||||
this.group = group;
|
||||
}
|
||||
|
||||
public PlanGroup getGroup() {
|
||||
return group;
|
||||
}
|
||||
|
||||
public Set<PlanCategory> getPlanCategory() {
|
||||
|
||||
@@ -14,21 +14,23 @@ Additionally there is a detailed list of all features which are included in a pa
|
||||
com.sap.sailing.domain.common.subscription.SailingSubscriptionPlan
|
||||
|
||||
A plan definition includes the plan and price IDs and a list of connected roles.
|
||||
|
||||
3. Group the plan by defining a (SubscriptionPlan.)PlanGroup and set the group to init of SailingSubscriptionPlan
|
||||
|
||||
3. Add following texts to class (and related property files)
|
||||
4. Add following texts to class (and related property files)
|
||||
|
||||
com.sap.sse.security.ui.client.i18n.subscription.SubscriptionStringConstants
|
||||
|
||||
- `<PLAN-ID>_name`
|
||||
- `<GROUP-ID>_name`
|
||||
- Name or title of the plan (`<H1>`)
|
||||
- `<PLAN-ID>_description`
|
||||
- `<GROUP-ID>_description`
|
||||
- A short description of the plan content (`<H4>`)
|
||||
- `<PLAN-ID>_info`
|
||||
- `<GROUP-ID>_info`
|
||||
- Can be uses for additional info (`<H5>`)
|
||||
- `<PLAN-ID>_price_info`
|
||||
- It's a red rubber stamp over the price. It will only be rendered if not empty text is existing.
|
||||
- `<PLAN-ID>_features`
|
||||
- Comma separated list of feature labels
|
||||
- `<GROUP-ID>_price_info`
|
||||
- It's a red rubber stamp over the price. It will only be rendered if price is a one time payment.
|
||||
- `<GROUP-ID>_features`
|
||||
- Pipe (|) separated list of feature labels
|
||||
|
||||
|
||||
### Business Model Info
|
||||
|
||||
Reference in new issue
Block a user