diff --git a/src/main/java/alfio/config/Initializer.java b/src/main/java/alfio/config/Initializer.java index b894f76da9..0448767132 100644 --- a/src/main/java/alfio/config/Initializer.java +++ b/src/main/java/alfio/config/Initializer.java @@ -79,7 +79,7 @@ private void configureSessionCookie(ServletContext servletContext) { @Override protected Class[] getRootConfigClasses() { - return new Class[] { DataSourceConfiguration.class, WebSecurityConfig.class }; + return new Class[] { SystemConfiguration.class, DataSourceConfiguration.class, WebSecurityConfig.class }; } @Override diff --git a/src/main/java/alfio/config/MvcConfiguration.java b/src/main/java/alfio/config/MvcConfiguration.java index e1befefb32..badeebe8de 100644 --- a/src/main/java/alfio/config/MvcConfiguration.java +++ b/src/main/java/alfio/config/MvcConfiguration.java @@ -24,6 +24,7 @@ import com.fasterxml.jackson.datatype.jsr310.JSR310Module; import com.samskivert.mustache.Mustache; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.ResourceLoaderAware; import org.springframework.context.annotation.Bean; @@ -71,6 +72,9 @@ public class MvcConfiguration extends WebMvcConfigurerAdapter implements Resourc private ResourceLoader resourceLoader; + @Autowired + private MessageSource messageSource; + @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); @@ -136,22 +140,11 @@ public void postHandle(HttpServletRequest request, HttpServletResponse response, }; } - @Bean - public MessageSource messageSource() { - ResourceBundleMessageSource source = new ResourceBundleMessageSource(); - source.setBasenames("alfio.i18n.application", "alfio.i18n.admin"); - //since we have all the english translations in the default file, we don't need - //the fallback to the system locale. - source.setFallbackToSystemLocale(false); - source.setAlwaysUseMessageFormat(true); - return source; - } - @Bean public LocalizationMessageInterceptor getTemplateMessagesInterceptor() { LocalizationMessageInterceptor interceptor = new LocalizationMessageInterceptor(); interceptor.setLocaleResolver(getLocaleResolver()); - interceptor.setMessageSource(messageSource()); + interceptor.setMessageSource(messageSource); return interceptor; } diff --git a/src/main/java/alfio/config/SystemConfiguration.java b/src/main/java/alfio/config/SystemConfiguration.java new file mode 100644 index 0000000000..748c77b65d --- /dev/null +++ b/src/main/java/alfio/config/SystemConfiguration.java @@ -0,0 +1,38 @@ +/** + * This file is part of alf.io. + * + * alf.io is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * alf.io is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with alf.io. If not, see . + */ +package alfio.config; + +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.ResourceBundleMessageSource; + +@Configuration +public class SystemConfiguration { + + @Bean + public MessageSource messageSource() { + ResourceBundleMessageSource source = new ResourceBundleMessageSource(); + source.setBasenames("alfio.i18n.application", "alfio.i18n.admin"); + //since we have all the english translations in the default file, we don't need + //the fallback to the system locale. + source.setFallbackToSystemLocale(false); + source.setAlwaysUseMessageFormat(true); + return source; + } + +} diff --git a/src/main/java/alfio/controller/ReservationController.java b/src/main/java/alfio/controller/ReservationController.java index 634cb7bc50..e503e4ad18 100644 --- a/src/main/java/alfio/controller/ReservationController.java +++ b/src/main/java/alfio/controller/ReservationController.java @@ -18,23 +18,35 @@ import alfio.controller.form.PaymentForm; import alfio.controller.form.ReservationForm; +import alfio.controller.form.UpdateTicketOwnerForm; import alfio.controller.support.TemplateManager; +import alfio.controller.support.TemplateProcessor; import alfio.manager.EventManager; import alfio.manager.StripeManager; import alfio.manager.TicketReservationManager; import alfio.manager.support.OrderSummary; +import alfio.manager.support.PDFTemplateBuilder; import alfio.manager.support.PaymentResult; +import alfio.manager.support.TextTemplateBuilder; import alfio.manager.system.Mailer; import alfio.model.Event; import alfio.model.Ticket; +import alfio.model.TicketCategory; import alfio.model.TicketReservation; import alfio.model.modification.TicketReservationWithOptionalCodeModification; import alfio.model.user.Organization; import alfio.repository.EventRepository; +import alfio.repository.TicketCategoryRepository; +import alfio.repository.TicketRepository; import alfio.repository.user.OrganizationRepository; import alfio.util.OptionalWrapper; +import alfio.util.ValidationResult; +import alfio.util.Validator; +import com.google.zxing.WriterException; +import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.lang3.tuple.Triple; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.MessageSourceResolvable; @@ -48,6 +60,7 @@ import org.springframework.web.servlet.support.RequestContextUtils; import javax.servlet.http.HttpServletRequest; +import java.io.IOException; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -64,19 +77,22 @@ public class ReservationController { private final Mailer mailer; private final TemplateManager templateManager; private final MessageSource messageSource; + private final TicketRepository ticketRepository; + private final TicketCategoryRepository ticketCategoryRepository; // private final EventController eventController; @Autowired - public ReservationController(EventRepository eventRepository, - EventManager eventManager, - TicketReservationManager ticketReservationManager, - OrganizationRepository organizationRepository, - StripeManager stripeManager, - Mailer mailer, - TemplateManager templateManager, - MessageSource messageSource, - EventController eventController) { + public ReservationController(EventRepository eventRepository, + EventManager eventManager, + TicketReservationManager ticketReservationManager, + OrganizationRepository organizationRepository, + StripeManager stripeManager, + Mailer mailer, + TemplateManager templateManager, + MessageSource messageSource, + TicketRepository ticketRepository, + TicketCategoryRepository ticketCategoryRepository, EventController eventController) { this.eventRepository = eventRepository; this.eventManager = eventManager; this.ticketReservationManager = ticketReservationManager; @@ -85,6 +101,8 @@ public ReservationController(EventRepository eventRepository, this.mailer = mailer; this.templateManager = templateManager; this.messageSource = messageSource; + this.ticketRepository = ticketRepository; + this.ticketCategoryRepository = ticketCategoryRepository; this.eventController = eventController; } @@ -162,8 +180,7 @@ public String showReservationPage( return "/event/reservation-page"; } else if (reservation.get().getStatus() == TicketReservation.TicketReservationStatus.COMPLETE) { - - + model.addAttribute("reservationId", reservationId); model.addAttribute("reservation", reservation.get()); model.addAttribute("confirmationEmailSent", confirmationEmailSent); @@ -179,6 +196,7 @@ public String showReservationPage( model.addAttribute("ticketsAreAllAssigned", tickets.stream().allMatch(Ticket::getAssigned)); model.addAttribute("countries", getLocalizedCountries(RequestContextUtils.getLocale(request))); model.addAttribute("pageTitle", "reservation-page-complete.header.title"); + model.asMap().putIfAbsent("validationResult", ValidationResult.success()); return "/event/reservation-page-complete"; } else { // reservation status has status IN_PAYMENT or STUCK. @@ -260,6 +278,79 @@ public String reSendReservationConfirmationEmail(@PathVariable("eventName") Stri return "redirect:/event/" + eventName + "/reservation/" + reservationId + "?confirmation-email-sent=true"; } + + @RequestMapping(value = "/event/{eventName}/reservation/{reservationId}/ticket/{ticketIdentifier}/assign", method = RequestMethod.POST, headers = "X-Requested-With=XMLHttpRequest") + public String ajaxAssignTicketToPerson(@PathVariable("eventName") String eventName, + @PathVariable("reservationId") String reservationId, + @PathVariable("ticketIdentifier") String ticketIdentifier, + UpdateTicketOwnerForm updateTicketOwner, + BindingResult bindingResult, + HttpServletRequest request, + Model model) throws Exception { + + assignTicket(eventName, reservationId, ticketIdentifier, updateTicketOwner, bindingResult, request, model); + return "/event/assign-ticket-result"; + + } + + @RequestMapping(value = "/event/{eventName}/reservation/{reservationId}/ticket/{ticketIdentifier}/assign", method = RequestMethod.POST) + public String assignTicketToPerson(@PathVariable("eventName") String eventName, + @PathVariable("reservationId") String reservationId, + @PathVariable("ticketIdentifier") String ticketIdentifier, + UpdateTicketOwnerForm updateTicketOwner, + BindingResult bindingResult, + HttpServletRequest request, + Model model) throws Exception { + + Optional> result = assignTicket(eventName, reservationId, ticketIdentifier, updateTicketOwner, bindingResult, request, model); + return result.map(t -> "redirect:/event/"+t.getMiddle().getShortName()+"/reservation/"+t.getRight().getTicketsReservationId()).orElse("redirect:/"); + } + + private Optional> assignTicket(String eventName, String reservationId, String ticketIdentifier, UpdateTicketOwnerForm updateTicketOwner, BindingResult bindingResult, HttpServletRequest request, Model model) { + Optional> triple = ticketReservationManager.fetchComplete(eventName, reservationId, ticketIdentifier) + .map(result -> { + Ticket t = result.getRight(); + Validate.isTrue(!t.getLockedAssignment(), "cannot change a locked ticket"); + final Event event = result.getLeft(); + final TicketReservation ticketReservation = result.getMiddle(); + ValidationResult validationResult = Validator.validateTicketAssignment(updateTicketOwner, bindingResult) + .ifSuccess(() -> updateTicketOwner(updateTicketOwner, request, t, event, ticketReservation)); + return Triple.of(validationResult, event, ticketRepository.findByUUID(t.getUuid())); + }); + triple.ifPresent(t -> { + model.addAttribute("value", t.getRight()); + model.addAttribute("validationResult", t.getLeft()); + model.addAttribute("countries", getLocalizedCountries(RequestContextUtils.getLocale(request))); + model.addAttribute("event", t.getMiddle()); + }); + return triple; + } + + private void updateTicketOwner(UpdateTicketOwnerForm updateTicketOwner, HttpServletRequest request, Ticket t, Event event, TicketReservation ticketReservation) { + ticketReservationManager.updateTicketOwner(t, RequestContextUtils.getLocale(request), event, updateTicketOwner, + getConfirmationTextBuilder(request, t, event, ticketReservation), + getOwnerChangeTextBuilder(request, t, event), + preparePdfTicket(request, event, ticketReservation, t)); + } + + private TextTemplateBuilder getOwnerChangeTextBuilder(HttpServletRequest request, Ticket t, Event event) { + return TemplateProcessor.buildEmailForOwnerChange(t.getEmail(), event, t, organizationRepository, ticketReservationManager, templateManager, request); + } + + private TextTemplateBuilder getConfirmationTextBuilder(HttpServletRequest request, Ticket t, Event event, TicketReservation ticketReservation) { + return TemplateProcessor.buildEmail(event, organizationRepository, ticketReservation, t, templateManager, request); + } + + private PDFTemplateBuilder preparePdfTicket(HttpServletRequest request, Event event, TicketReservation ticketReservation, Ticket ticket) { + TicketCategory ticketCategory = ticketCategoryRepository.getById(ticket.getCategoryId(), event.getId()); + Organization organization = organizationRepository.getById(event.getOrganizationId()); + try { + return TemplateProcessor.buildPDFTicket(request, event, ticketReservation, ticket, ticketCategory, organization, templateManager); + } catch (WriterException | IOException e) { + throw new IllegalStateException(e); + } + } + private void sendReservationCompleteEmail(HttpServletRequest request, Event event, TicketReservation reservation) { String reservationTxt = templateManager.render("/alfio/templates/confirmation-email-txt.ms", diff --git a/src/main/java/alfio/controller/api/EventApiController.java b/src/main/java/alfio/controller/api/EventApiController.java deleted file mode 100644 index 5d106d10f5..0000000000 --- a/src/main/java/alfio/controller/api/EventApiController.java +++ /dev/null @@ -1,114 +0,0 @@ -/** - * This file is part of alf.io. - * - * alf.io is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * alf.io is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with alf.io. If not, see . - */ -package alfio.controller.api; - -import alfio.controller.form.UpdateTicketOwnerForm; -import alfio.controller.support.TemplateManager; -import alfio.controller.support.TemplateProcessor; -import alfio.manager.TicketReservationManager; -import alfio.manager.support.PDFTemplateBuilder; -import alfio.manager.support.TextTemplateBuilder; -import alfio.model.Event; -import alfio.model.Ticket; -import alfio.model.TicketCategory; -import alfio.model.TicketReservation; -import alfio.model.user.Organization; -import alfio.repository.TicketCategoryRepository; -import alfio.repository.user.OrganizationRepository; -import alfio.util.ValidationResult; -import alfio.util.Validator; -import com.google.zxing.WriterException; -import org.apache.commons.lang3.Validate; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.BindingResult; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.Locale; - -@RestController -@RequestMapping("/event/{eventName}") -public class EventApiController { - - private final TicketReservationManager ticketReservationManager; - private final OrganizationRepository organizationRepository; - private final TemplateManager templateManager; - private final TicketCategoryRepository ticketCategoryRepository; - - @Autowired - public EventApiController(TicketReservationManager ticketReservationManager, - OrganizationRepository organizationRepository, - TemplateManager templateManager, - TicketCategoryRepository ticketCategoryRepository) { - this.ticketReservationManager = ticketReservationManager; - this.organizationRepository = organizationRepository; - this.templateManager = templateManager; - this.ticketCategoryRepository = ticketCategoryRepository; - } - - @RequestMapping(value = "/reservation/{reservationId}/{ticketIdentifier}", method = RequestMethod.POST) - public ValidationResult assignTicketToPerson(@PathVariable("eventName") String eventName, - @PathVariable("reservationId") String reservationId, - @PathVariable("ticketIdentifier") String ticketIdentifier, - UpdateTicketOwnerForm updateTicketOwner, - BindingResult bindingResult, - HttpServletRequest request, - HttpServletResponse response, - Locale locale) throws Exception { - - return ticketReservationManager.fetchComplete(eventName, reservationId, ticketIdentifier) - .map(result -> { - Ticket t = result.getRight(); - Validate.isTrue(!t.getLockedAssignment(), "cannot change a locked ticket"); - final Event event = result.getLeft(); - final TicketReservation ticketReservation = result.getMiddle(); - return Validator.validateTicketAssignment(updateTicketOwner, bindingResult) - .ifSuccess(() -> updateTicketOwner(updateTicketOwner, request, locale, t, event, ticketReservation)); - }).orElse(ValidationResult.failed()); - - } - - private void updateTicketOwner(UpdateTicketOwnerForm updateTicketOwner, HttpServletRequest request, Locale locale, Ticket t, Event event, TicketReservation ticketReservation) { - ticketReservationManager.updateTicketOwner(t, locale, event, updateTicketOwner, - getConfirmationTextBuilder(request, t, event, ticketReservation), - getOwnerChangeTextBuilder(request, t, event), - preparePdfTicket(request, event, ticketReservation, t)); - } - - private TextTemplateBuilder getOwnerChangeTextBuilder(HttpServletRequest request, Ticket t, Event event) { - return TemplateProcessor.buildEmailForOwnerChange(t.getEmail(), event, t, organizationRepository, ticketReservationManager, templateManager, request); - } - - private TextTemplateBuilder getConfirmationTextBuilder(HttpServletRequest request, Ticket t, Event event, TicketReservation ticketReservation) { - return TemplateProcessor.buildEmail(event, organizationRepository, ticketReservation, t, templateManager, request); - } - - private PDFTemplateBuilder preparePdfTicket(HttpServletRequest request, Event event, TicketReservation ticketReservation, Ticket ticket) { - TicketCategory ticketCategory = ticketCategoryRepository.getById(ticket.getCategoryId(), event.getId()); - Organization organization = organizationRepository.getById(event.getOrganizationId()); - try { - return TemplateProcessor.buildPDFTicket(request, event, ticketReservation, ticket, ticketCategory, organization, templateManager); - } catch (WriterException | IOException e) { - throw new IllegalStateException(e); - } - } -} diff --git a/src/main/java/alfio/manager/TicketReservationManager.java b/src/main/java/alfio/manager/TicketReservationManager.java index 26249cc8d8..29a2c54909 100644 --- a/src/main/java/alfio/manager/TicketReservationManager.java +++ b/src/main/java/alfio/manager/TicketReservationManager.java @@ -41,6 +41,7 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.MessageSource; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/alfio/repository/TicketRepository.java b/src/main/java/alfio/repository/TicketRepository.java index c42561a491..c35d2230dd 100644 --- a/src/main/java/alfio/repository/TicketRepository.java +++ b/src/main/java/alfio/repository/TicketRepository.java @@ -82,7 +82,7 @@ int reserveTickets(@Bind("reservationId") String reservationId, @Query("update ticket set email_address = :email, full_name = :fullName where uuid = :ticketIdentifier") int updateTicketOwner(@Bind("ticketIdentifier") String ticketIdentifier, @Bind("email") String email, @Bind("fullName") String fullName); - @Query("update ticket set job_title = :jobTitle, company = :company, phone_number = :phoneNumber, address = :address, country = :country, tshirt_size = :tShirtSize, notes = :notes, user_language = :userLanguage, where uuid = :ticketIdentifier") + @Query("update ticket set job_title = :jobTitle, company = :company, phone_number = :phoneNumber, address = :address, country = :country, tshirt_size = :tShirtSize, notes = :notes, user_language = :userLanguage where uuid = :ticketIdentifier") int updateOptionalTicketInfo(@Bind("ticketIdentifier") String ticketIdentifier, @Bind("jobTitle") String jobTitle, @Bind("company") String company, diff --git a/src/main/resources/alfio/i18n/application.properties b/src/main/resources/alfio/i18n/application.properties index 9772d560ab..54967e5097 100644 --- a/src/main/resources/alfio/i18n/application.properties +++ b/src/main/resources/alfio/i18n/application.properties @@ -82,12 +82,12 @@ reservation-page-complete.update=Update reservation-page-complete.cancel=Cancel reservation-page-complete.download-ticket=Download reservation-page-complete.resend-reservation-email=Resend reservation email -reservation-page-complete.send-ticket-by-email-to=Send by email +reservation-page-complete.send-ticket-by-email-to=Send reservation-page-complete.info-update=You can update the owner of a ticket: a new email will be sent, the previously sent ticket will be invalidated. reservation-page-complete.info-assign=Your reservation for the event {0} has been completed. In order to view and download your tickets, please assign them. reservation-page-complete.info-assign-email=An email has already been sent to {0}. Didn''t you receive any message? Please check your ''spam'' folder and if nothing found click on the following button to send it again reservation-page-complete.show-ticket=View -reservation-page-complete.update-ticket-owner=Update owner +reservation-page-complete.update-ticket-owner=Update reservation-page-complete.assigned-to=Assigned to {0} <{1}> reservation-page-complete.ticket-type=Ticket type\: reservation-page-complete.ticket-not-assigned=not yet assigned @@ -100,7 +100,8 @@ reservation-page-complete.address=Address reservation-page-complete.country=Country reservation-page-complete.t-shirt-size=T-Shirt size reservation-page-complete.notes=Notes -reservation-page-complete.notes.placeholder=Do you have any particular needing about food, accessibility, etc.? Please let us know +reservation-page-complete.notes.placeholder=Should you have any special need (such as but not limited to diet or accessibility requirements) please let us know +reservation-page-complete.please-check-input-fields=Please check input values. #show-ticket show-ticket.header.title=Your Ticket for {0} @@ -130,7 +131,7 @@ error.STEP2_STRIPE_missing=There is no card on a customer that is being charged. error.STEP2_STRIPE_processing_error=An error occurred while processing the card. error.STEP2_STRIPE_abort=A network error has occurred, and you have not been charged. Please try again. error.STEP2_STRIPE_rate_limit=A network error has occurred, and you have not been charged. Please try again. -error.STEP2_STRIPE_unexpected=An unexpected error has occurred. Please contact the event\u00B4s organizers in order to get assistance. +error.STEP2_STRIPE_unexpected=An unexpected error has occurred. Please contact the event''s organizers in order to get assistance. error.STEP_2_PAYMENT_PROCESSING_ERROR=Payment processing error: {0} error.STEP_2_MISSING_STRIPE_TOKEN=Error with the payment processor: missing token, have you enabled javascript? diff --git a/src/main/resources/alfio/i18n/application_it.properties b/src/main/resources/alfio/i18n/application_it.properties index f2c9fa3bcc..f2d77859c1 100644 --- a/src/main/resources/alfio/i18n/application_it.properties +++ b/src/main/resources/alfio/i18n/application_it.properties @@ -72,11 +72,11 @@ reservation-page-complete.update=Modifica reservation-page-complete.cancel=Annulla reservation-page-complete.download-ticket=Scarica reservation-page-complete.resend-reservation-email=Invia email prenotazione -reservation-page-complete.send-ticket-by-email-to=Invia via email +reservation-page-complete.send-ticket-by-email-to=Invia reservation-page-complete.info-update=Puoi aggiornare l''intestatario di un biglietto. In questo caso verr\u00E0 inviata una nuova email ed il vecchio biglietto verr\u00E0 annullato. reservation-page-complete.info-assign=La tua prenotazione per l''evento {0} \u00E8 stata completata con successo. Ti preghiamo di assegnare tutti i biglietti in modo da poter effettuare il download. reservation-page-complete.show-ticket=Visualizza -reservation-page-complete.update-ticket-owner=Modifica intestatario +reservation-page-complete.update-ticket-owner=Modifica reservation-page-complete.assigned-to=Assegnato a {0} <{1}> reservation-page-complete.ticket-type=Tipo del biglietto\: reservation-page-complete.ticket-nr=Biglietto n. {0} @@ -182,4 +182,5 @@ breadcrumb.step2=Prenota breadcrumb.step3=Assegna e scarica reservation-page-complete.info-assign-email=\u00C8 gi\u00E0 stata spedita un''email all''indirizzo {0}. Se non l''hai ricevuta\: hai gi\u00E0 controllato la cartella ''posta indesiderata''? Clicca sul bottone sottostante per inviarla nuovamente reservation-page-complete.notes=Note -reservation-page-complete.notes.placeholder=Hai qualche esigenza particolare per quanto riguarda ad esempio cibo o accessibilità? Per favore, faccelo sapere! +reservation-page-complete.notes.placeholder=Hai qualche esigenza particolare (ad esempio per quanto riguarda cibo o accessibilit\u00E0)? Per favore, faccelo sapere! +reservation-page-complete.please-check-input-fields=Controlla i valori immessi. \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/templates/event/assign-ticket-form.ms b/src/main/webapp/WEB-INF/templates/event/assign-ticket-form.ms new file mode 100644 index 0000000000..34b036c249 --- /dev/null +++ b/src/main/webapp/WEB-INF/templates/event/assign-ticket-form.ms @@ -0,0 +1,101 @@ +{{#assigned}} +
+

{{#i18n}}reservation-page-complete.assigned-to [{{fullName}}] [{{email}}]{{/i18n}}

+
+ + +
+ {{^lockedAssignment}} + + {{/lockedAssignment}} +
+
+{{/assigned}} +{{#validationResult}} + {{^isSuccess}} +
{{#i18n}}reservation-page-complete.please-check-input-fields{{/i18n}}
+ {{/isSuccess}} +{{/validationResult}} +
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+ + + {{#assigned}} + + {{/assigned}} + + +
+
+
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/templates/event/assign-ticket-result.ms b/src/main/webapp/WEB-INF/templates/event/assign-ticket-result.ms new file mode 100644 index 0000000000..24229186d3 --- /dev/null +++ b/src/main/webapp/WEB-INF/templates/event/assign-ticket-result.ms @@ -0,0 +1,5 @@ +{{#value}} +
+ {{> /event/assign-ticket-form}} +
+{{/value}} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/templates/event/reservation-page-complete.ms b/src/main/webapp/WEB-INF/templates/event/reservation-page-complete.ms index c1bd1271c1..3e657b92fd 100644 --- a/src/main/webapp/WEB-INF/templates/event/reservation-page-complete.ms +++ b/src/main/webapp/WEB-INF/templates/event/reservation-page-complete.ms @@ -68,111 +68,15 @@
    {{#ticketsByCategory}} {{#value}} -
  • +
  • {{#i18n}}reservation-page-complete.ticket-nr [{{-index}}]{{/i18n}}

    - {{^assigned}}{{#i18n}}reservation-page-complete.ticket-not-assigned{{/i18n}}{{/assigned}}
    {{#i18n}}reservation-page-complete.ticket-type{{/i18n}} {{key.name}} - {{#assigned}} -
    -

    {{#i18n}}reservation-page-complete.assigned-to [{{fullName}}] [{{email}}]{{/i18n}}

    - - -
    - {{/assigned}} - -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - -
    -
    - - - {{#assigned}} - - {{/assigned}} - - -
    -
    -
    -
  • +
    + {{> /event/assign-ticket-form}} +
    + {{/value}} {{/ticketsByCategory}}
diff --git a/src/main/webapp/resources/bower_components/components-font-awesome/fonts/fontawesome-webfont.eot b/src/main/webapp/resources/bower_components/components-font-awesome/fonts/fontawesome-webfont.eot old mode 100755 new mode 100644 diff --git a/src/main/webapp/resources/bower_components/components-font-awesome/fonts/fontawesome-webfont.svg b/src/main/webapp/resources/bower_components/components-font-awesome/fonts/fontawesome-webfont.svg old mode 100755 new mode 100644 diff --git a/src/main/webapp/resources/bower_components/components-font-awesome/fonts/fontawesome-webfont.ttf b/src/main/webapp/resources/bower_components/components-font-awesome/fonts/fontawesome-webfont.ttf old mode 100755 new mode 100644 diff --git a/src/main/webapp/resources/bower_components/components-font-awesome/fonts/fontawesome-webfont.woff b/src/main/webapp/resources/bower_components/components-font-awesome/fonts/fontawesome-webfont.woff old mode 100755 new mode 100644 diff --git a/src/main/webapp/resources/js/event/reservation-page-complete.js b/src/main/webapp/resources/js/event/reservation-page-complete.js index 60b4619a31..97d9a6e6b6 100644 --- a/src/main/webapp/resources/js/event/reservation-page-complete.js +++ b/src/main/webapp/resources/js/event/reservation-page-complete.js @@ -3,30 +3,52 @@ 'use strict'; $(function() { - $(".update-ticket-owner").click(function() { - $($(this).attr('href')).show().find("input:first").focus(); - return false; - }); - - - $(".cancel-update").click(function() { - $('#' + $(this).attr('data-for-form')).hide(); - }) - - - $("[data-dismiss=alert]").click(function() { - $(this).parent().hide('medium'); - }); - - - $("select").map(function() { - - if($(this).attr('value').length > 0) { - $(this).find("option[value="+$(this).attr('value')+"]").attr('selected','selected'); - } - }); - - $('.show-by-default').not(':eq(0)').hide(); + + var initListeners = function() { + $(".update-ticket-owner").click(function() { + $($(this).attr('href')).show().find("input:first").focus(); + return false; + }); + + + $(".cancel-update").click(function() { + $('#' + $(this).attr('data-for-form')).hide(); + }); + + + $("[data-dismiss=alert]").click(function() { + $(this).parent().hide('medium'); + }); + + + $("select").map(function() { + + if($(this).attr('value').length > 0) { + $(this).find("option[value="+$(this).attr('value')+"]").attr('selected','selected'); + } + }); + + $('.submit-assignee-data').click(function() { + var frm = $(this.form); + var action = frm.attr('action'); + var uuid = frm.attr('data-ticket-uuid'); + if (!frm[0].checkValidity()) { + return true;//trigger the HTML5 error messages. Thanks to Abraham http://stackoverflow.com/a/11867013 + } + jQuery.ajax({ + url: action, + type: 'POST', + data: frm.serialize(), + success: function(result) { + $('#ticket-detail-'+uuid).replaceWith(result); + initListeners(); + } + }); + return false; + }); + }; + + initListeners(); });