Skip to content

Commit

Permalink
#111 admin: create/update additional options, public facing ui: displ…
Browse files Browse the repository at this point in the history
…ay both additional options and donations
  • Loading branch information
syjer committed May 21, 2017
1 parent 68dc62e commit 4d495d4
Show file tree
Hide file tree
Showing 12 changed files with 70 additions and 40 deletions.
16 changes: 13 additions & 3 deletions src/main/java/alfio/controller/EventController.java
Original file line number Diff line number Diff line change
Expand Up @@ -224,8 +224,9 @@ public String showEvent(@PathVariable("eventName") String eventName,
boolean validPaymentConfigured = isEventHasValidPaymentConfigurations(event, configurationManager);

List<SaleableAdditionalService> notExpiredServices = additionalServices.stream().filter(SaleableAdditionalService::isNotExpired).collect(Collectors.toList());
List<SaleableAdditionalService> donations = notExpiredServices.stream().filter(a -> a.getType() == AdditionalService.AdditionalServiceType.DONATION).collect(Collectors.toList());
List<SaleableAdditionalService> supplements = notExpiredServices.stream().filter(a -> a.getType() == AdditionalService.AdditionalServiceType.SUPPLEMENT).collect(Collectors.toList());

List<SaleableAdditionalService> supplements = adjustIndex(0, notExpiredServices.stream().filter(a -> a.getType() == AdditionalService.AdditionalServiceType.SUPPLEMENT).collect(Collectors.toList()));
List<SaleableAdditionalService> donations = adjustIndex(supplements.size(), notExpiredServices.stream().filter(a -> a.getType() == AdditionalService.AdditionalServiceType.DONATION).collect(Collectors.toList()));

model.addAttribute("event", eventDescriptor)//
.addAttribute("organization", organizationRepository.getById(event.getOrganizationId()))
Expand Down Expand Up @@ -337,7 +338,16 @@ public String reserveTicket(@PathVariable("eventName") String eventName,

private SaleableAdditionalService getSaleableAdditionalService(Event event, Locale locale, AdditionalService as, PromoCodeDiscount promoCodeDiscount) {
return new SaleableAdditionalService(event, as, additionalServiceTextRepository.findBestMatchByLocaleAndType(as.getId(), locale.getLanguage(), AdditionalServiceText.TextType.TITLE).getValue(),
additionalServiceTextRepository.findBestMatchByLocaleAndType(as.getId(), locale.getLanguage(), AdditionalServiceText.TextType.DESCRIPTION).getValue(), promoCodeDiscount);
additionalServiceTextRepository.findBestMatchByLocaleAndType(as.getId(), locale.getLanguage(), AdditionalServiceText.TextType.DESCRIPTION).getValue(), promoCodeDiscount, 0);
}

private static List<SaleableAdditionalService> adjustIndex(int offset, List<SaleableAdditionalService> l) {
List<SaleableAdditionalService> n = new ArrayList<>(l.size());

for(int i = 0; i < l.size(); i++) {
n.add(l.get(i).withIndex(i+offset));
}
return n;
}

private static boolean shouldApplyDiscount(PromoCodeDiscount promoCodeDiscount, TicketCategory ticketCategory) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,19 @@ public class SaleableAdditionalService implements PriceContainer {
private final String title;
private final String description;
private final PromoCodeDiscount promoCodeDiscount;
private final int index;

public SaleableAdditionalService(Event event, AdditionalService additionalService, String title, String description, PromoCodeDiscount promoCodeDiscount) {
public SaleableAdditionalService(Event event, AdditionalService additionalService, String title, String description, PromoCodeDiscount promoCodeDiscount, int index) {
this.event = event;
this.additionalService = additionalService;
this.title = title;
this.description = description;
this.promoCodeDiscount = promoCodeDiscount;
this.index = index;
}

public SaleableAdditionalService withIndex(int index) {
return new SaleableAdditionalService(this.event, this.additionalService, this.title, this.description, this.promoCodeDiscount, index);
}

public boolean isExpired() {
Expand Down
19 changes: 8 additions & 11 deletions src/main/java/alfio/model/modification/EventModification.java
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ public static class AdditionalService {
private final List<AdditionalServiceText> description;
private final BigDecimal finalPrice;
private final String currencyCode;
private final alfio.model.AdditionalService.AdditionalServiceType type = alfio.model.AdditionalService.AdditionalServiceType.DONATION;
private final alfio.model.AdditionalService.AdditionalServiceType type;
private final alfio.model.AdditionalService.SupplementPolicy supplementPolicy = null;

@JsonCreator
Expand All @@ -236,8 +236,9 @@ public AdditionalService(@JsonProperty("id") Integer id,
@JsonProperty("vatType") alfio.model.AdditionalService.VatType vatType,
@JsonProperty("additionalServiceFields") List<AdditionalField> additionalServiceFields,
@JsonProperty("title") List<AdditionalServiceText> title,
@JsonProperty("description") List<AdditionalServiceText> description) {
this(id, price, fixPrice, ordinal, availableQuantity, maxQtyPerOrder, inception, expiration, vat, vatType, additionalServiceFields, title, description, null, null);
@JsonProperty("description") List<AdditionalServiceText> description,
@JsonProperty("type")alfio.model.AdditionalService.AdditionalServiceType type) {
this(id, price, fixPrice, ordinal, availableQuantity, maxQtyPerOrder, inception, expiration, vat, vatType, additionalServiceFields, title, description, null, null, type);
}

private AdditionalService(Integer id,
Expand All @@ -254,7 +255,8 @@ private AdditionalService(Integer id,
List<AdditionalServiceText> title,
List<AdditionalServiceText> description,
BigDecimal finalPrice,
String currencyCode) {
String currencyCode,
alfio.model.AdditionalService.AdditionalServiceType type) {
this.id = id;
this.price = price;
this.fixPrice = fixPrice;
Expand All @@ -270,6 +272,7 @@ private AdditionalService(Integer id,
this.description = description;
this.finalPrice = finalPrice;
this.currencyCode = currencyCode;
this.type = type;
}

public static Builder from(alfio.model.AdditionalService src) {
Expand All @@ -284,7 +287,6 @@ public static class Builder {
private List<AdditionalServiceText> title = new ArrayList<>();
private List<AdditionalServiceText> description = new ArrayList<>();
private PriceContainer priceContainer;
private String uuid = UUID.randomUUID().toString();

private Builder(alfio.model.AdditionalService src) {
this.src = src;
Expand All @@ -300,11 +302,6 @@ public Builder withPriceContainer(PriceContainer priceContainer) {
return this;
}

public Builder withAdditionalFields(List<AdditionalField> additionalServiceFields) {
this.additionalServiceFields = additionalServiceFields;
return this;
}

public Builder withText(List<alfio.model.AdditionalServiceText> text) {
Map<Boolean, List<AdditionalServiceText>> byType = text.stream()
.map(AdditionalServiceText::from)
Expand All @@ -320,7 +317,7 @@ public AdditionalService build() {
String currencyCode = priceContainer.map(PriceContainer::getCurrencyCode).orElse("");
return new AdditionalService(src.getId(), Optional.ofNullable(src.getSrcPriceCts()).map(MonetaryUtil::centsToUnit).orElse(BigDecimal.ZERO),
src.isFixPrice(), src.getOrdinal(), src.getAvailableQuantity(), src.getMaxQtyPerOrder(), DateTimeModification.fromZonedDateTime(src.getInception(zoneId)),
DateTimeModification.fromZonedDateTime(src.getExpiration(zoneId)), src.getVat(), src.getVatType(), additionalServiceFields, title, description, finalPrice, currencyCode);
DateTimeModification.fromZonedDateTime(src.getExpiration(zoneId)), src.getVat(), src.getVatType(), additionalServiceFields, title, description, finalPrice, currencyCode, src.getType());
}

}
Expand Down
6 changes: 3 additions & 3 deletions src/main/webapp/WEB-INF/templates/event/additional-service.ms
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,14 @@
</div>
<div class="col-sm-2 text-align-center">
{{#saleable}}
<input name="additionalService[{{-index}}].additionalServiceId" value="{{id}}" type="hidden">
<input name="additionalService[{{index}}].additionalServiceId" value="{{id}}" type="hidden">
{{#fixPrice}}
<select aria-labelledby="{{id}}-label" name="additionalService[{{-index}}].quantity" class="form-control text-align-center" placeholder="0" autocomplete="off">
<select aria-labelledby="{{id}}-label" name="additionalService[{{index}}].quantity" class="form-control text-align-center" placeholder="0" autocomplete="off">
{{#amountOfTickets}}<option value="{{this}}">{{this}}</option>{{/amountOfTickets}}
</select>
{{/fixPrice}}
{{^fixPrice}}
<input type="number" min="0" step="any" name="additionalService[{{-index}}].amount" class="form-control" title="">
<input type="number" min="0" step="any" name="additionalService[{{index}}].amount" class="form-control" title="">
{{/fixPrice}}
{{/saleable}}
{{^saleable}}
Expand Down
4 changes: 2 additions & 2 deletions src/main/webapp/WEB-INF/templates/event/show-event.ms
Original file line number Diff line number Diff line change
Expand Up @@ -110,9 +110,9 @@
{{#showAdditionalServicesSupplements}}
<h2>{{#i18n}}show-event.additional-services{{/i18n}}</h2>
<ul class="list-group">
{{#enabledAdditionalServicesDonations}}
{{#enabledAdditionalServicesSupplements}}
{{> /event/additional-service.ms }}
{{/enabledAdditionalServicesDonations}}
{{/enabledAdditionalServicesSupplements}}
</ul>
{{/showAdditionalServicesSupplements}}
{{#showAdditionalServicesDonations}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ <h5 class="text-muted">Attendees' full name, e-mail and language are collected b
</div>

<div class="wMarginBottom">
<additional-services data-selected-languages="event.locales" data-event-is-free-of-charge="event.freeOfCharge" data-available-languages="allLanguages" data-on-modification="setAdditionalServices(event, additionalServices)" data-event-start-date="event.begin | formatDateTimeModification"></additional-services>
<additional-services data-title="Donation options" data-icon="fa-gift" data-selected-languages="event.locales" data-type="DONATION" data-event-is-free-of-charge="event.freeOfCharge" data-available-languages="allLanguages" data-on-modification="setAdditionalServices(event, additionalServices)" data-event-start-date="event.begin | formatDateTimeModification"></additional-services>
</div>

<hr class="wMarginTop30px"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,10 @@ <h4 class="text-muted">Details</h4>
<a ui-sref="events.single.promoCodes({eventName: ctrl.event.shortName})"><i class="fa fa-percent"></i> Promo Codes</a>
</li>
<li role="presentation" data-ui-sref-active="active">
<a ui-sref="events.single.donations({eventName: ctrl.event.shortName})"><i class="fa fa-money"></i> Donation options</a>
<a ui-sref="events.single.additionalServices({eventName: ctrl.event.shortName})"><i class="fa fa-money"></i> Additional options</a>
</li>
<li role="presentation" data-ui-sref-active="active">
<a ui-sref="events.single.donations({eventName: ctrl.event.shortName})"><i class="fa fa-gift"></i> Donation options</a>
</li>
<li role="presentation" data-ui-sref-active="active">
<a data-ui-sref="events.single.reservationsList({eventName:ctrl.event.shortName})"><i class="fa fa-ticket"></i> Reservations</a>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
onModification: '&',
eventId: '=',
eventStartDate: '=',
eventIsFreeOfCharge: '='
eventIsFreeOfCharge: '=',
title: '@',
icon: '@',
type: '@'
},
bindToController: true,
templateUrl: '../resources/js/admin/feature/additional-service/additional-services.html',
Expand All @@ -25,7 +28,9 @@
onEditComplete: '&',
onDismiss: '&',
eventStartDate: '=',
selectedLanguages: '='
selectedLanguages: '=',
title:'<',
type:'<'
},
bindToController: true,
templateUrl: '../resources/js/admin/feature/additional-service/edit-additional-service.html',
Expand Down Expand Up @@ -110,11 +115,13 @@
var parentCtrl = self;
var modal = $uibModal.open({
size:'lg',
template:'<edit-additional-service data-editing-item="ctrl.item" data-titles="ctrl.titles" data-descriptions="ctrl.descriptions" data-on-edit-complete="ctrl.onEditComplete(item)" data-on-dismiss="ctrl.onDismiss()" data-event-start-date="ctrl.eventStartDate"></edit-additional-service>',
template:'<edit-additional-service data-type="ctrl.type" data-title="ctrl.title" data-editing-item="ctrl.item" data-titles="ctrl.titles" data-descriptions="ctrl.descriptions" data-on-edit-complete="ctrl.onEditComplete(item)" data-on-dismiss="ctrl.onDismiss()" data-event-start-date="ctrl.eventStartDate"></edit-additional-service>',
backdrop: 'static',
controller: function() {
var ctrl = this;
ctrl.item = angular.copy(item);
ctrl.title = parentCtrl.title;
ctrl.type = parentCtrl.type;
ctrl.selectedLanguages = parentCtrl.selectedLanguages;
ctrl.titles = _.filter(angular.copy(parentCtrl.titles), function(t) {
return (t.localeValue & ctrl.selectedLanguages) === t.localeValue;
Expand Down Expand Up @@ -255,6 +262,7 @@
ctrl.types = ['DONATION'];
ctrl.save = function() {
if(ctrl.additionalServiceForm.$valid) {
ctrl.item.type = ctrl.type; // fix type
ValidationService.validationPerformer($q, AdditionalServiceManager.validate, ctrl.item, ctrl.additionalServiceForm).then(function() {
ctrl.onEditComplete({'item': ctrl.item});
}, angular.noop);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
<div class="page-header">
<h3><i class="fa fa-money"></i> Donation options</h3>
<span class="text-muted">here you can add one or more "donation" option.</span>
<h3><i class="fa {{ctrl.icon}}"></i> {{ctrl.title}}</h3>
</div>
<div class="panel panel-default" data-ng-repeat="item in ctrl.displayList">
<div class="panel panel-default" data-ng-repeat="item in ctrl.displayList | filter : {type: ctrl.type}">
<div data-ng-if="item.id" id="additional-service-{{item.id}}"></div>
<div class="panel-heading">
<div class="panel-title">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<form name="ctrl.additionalServiceForm" data-ng-submit="ctrl.save()" novalidate data-error-sensitive="">
<div class="modal-content">
<div class="modal-header">
<h2 class="modal-title">Edit Donation option</h2>
<h2 class="modal-title">Edit {{ctrl.title}}</h2>
</div>
<div class="modal-body">

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,9 +137,16 @@
controllerAs: '$ctrl',
resolve: loadEvent
})
.state('events.single.additionalServices', {
url: '/additional-services',
template: '<additional-services data-type="SUPPLEMENT" data-title="Additional services" data-icon="fa-money" selected-languages="$ctrl.loadEvent.locales" event-is-free-of-charge="$ctrl.loadEvent.freeOfCharge" event-id="$ctrl.loadEvent.id" event-start-date="$ctrl.loadEvent.formattedBegin"></additional-services>',
controller: loadEventCtrl,
controllerAs: '$ctrl',
resolve: loadEvent
})
.state('events.single.donations', {
url: '/donations',
template: '<additional-services selected-languages="$ctrl.loadEvent.locales" event-is-free-of-charge="$ctrl.loadEvent.freeOfCharge" event-id="$ctrl.loadEvent.id" event-start-date="$ctrl.loadEvent.formattedBegin"></additional-services>',
template: '<additional-services data-type="DONATION" data-title="Donation options" data-icon="fa-gift" selected-languages="$ctrl.loadEvent.locales" event-is-free-of-charge="$ctrl.loadEvent.freeOfCharge" event-id="$ctrl.loadEvent.id" event-start-date="$ctrl.loadEvent.formattedBegin"></additional-services>',
controller: loadEventCtrl,
controllerAs: '$ctrl',
resolve: loadEvent
Expand Down
Loading

0 comments on commit 4d495d4

Please sign in to comment.