Search in sources :

Example 1 with Event

use of org.komunumo.data.entity.Event in project komunumo-server by komunumo.

the class EventPreviewBlock method createLocationSelector.

private Component createLocationSelector(@NotNull final List<Event> events) {
    final var locationSelector = new SubMenu();
    events.stream().map(Event::getLocation).distinct().sorted().map(location -> {
        final var url = URLUtil.createReadableUrl(location);
        return new SubMenuItem("/events/".concat(url), location);
    }).forEach(locationSelector::add);
    return locationSelector;
}
Also used : ContentBlock(org.komunumo.ui.view.website.ContentBlock) DatabaseService(org.komunumo.data.service.DatabaseService) List(java.util.List) Event(org.komunumo.data.entity.Event) URLUtil(org.komunumo.util.URLUtil) Component(com.vaadin.flow.component.Component) SubMenu(org.komunumo.ui.view.website.SubMenu) Div(com.vaadin.flow.component.html.Div) SubMenuItem(org.komunumo.ui.view.website.SubMenuItem) NotNull(org.jetbrains.annotations.NotNull) EventPreview(org.komunumo.ui.view.website.events.EventPreview) SubMenuItem(org.komunumo.ui.view.website.SubMenuItem) Event(org.komunumo.data.entity.Event) SubMenu(org.komunumo.ui.view.website.SubMenu)

Example 2 with Event

use of org.komunumo.data.entity.Event in project komunumo-server by komunumo.

the class EventDialog method createForm.

// just a lot of fields for the form
@SuppressWarnings("checkstyle:MethodLength")
@Override
public void createForm(@NotNull final FormLayout formLayout, @NotNull final Binder<Event> binder) {
    final var type = new Select<>(EventType.values());
    final var title = new TextField("Title");
    final var subtitle = new TextField("Subtitle");
    final var speaker = new MultiselectComboBox<EventSpeakerEntity>("Speaker");
    final var organizer = new MultiselectComboBox<Member>("Organizer");
    final var description = new RichTextEditor();
    final var keyword = new MultiselectComboBox<KeywordEntity>("Keyword");
    final var agenda = new RichTextEditor();
    final var level = new Select<>(EventLevel.values());
    final var language = new Select<>(EventLanguage.values());
    final var room = new TextField("Room");
    final var travelInstructions = new TextField("Travel instructions");
    final var location = new ComboBox<String>("Location");
    final var webinarUrl = new TextField("Webinar URL");
    final var youtTube = new TextField("YouTube");
    final var date = new DateTimePicker("Date & Time");
    final var duration = new TimePicker("Duration");
    final var eventUrl = new TextField("Event URL");
    final var attendeeLimit = new IntegerField("Attendee limit (0 = no limit)");
    final var membersOnly = new Checkbox("Members only");
    final var published = new Checkbox("Published");
    type.setLabel("Type");
    type.setRequiredIndicatorVisible(true);
    title.setRequiredIndicatorVisible(true);
    title.setValueChangeMode(EAGER);
    title.addValueChangeListener(changeEvent -> {
        if (eventUrl.getValue().equals(URLUtil.createReadableUrl(changeEvent.getOldValue()))) {
            eventUrl.setValue(URLUtil.createReadableUrl(changeEvent.getValue()));
        }
    });
    subtitle.setValueChangeMode(EAGER);
    speaker.setOrdered(true);
    speaker.setItemLabelGenerator(EventSpeakerEntity::fullName);
    speaker.setItems(databaseService.getAllEventSpeakers());
    organizer.setOrdered(true);
    organizer.setItemLabelGenerator(value -> String.format("%s %s", value.getFirstName(), value.getLastName()));
    organizer.setItems(databaseService.getAllAdmins());
    organizer.setRequiredIndicatorVisible(true);
    keyword.setOrdered(true);
    keyword.setItemLabelGenerator(KeywordEntity::keyword);
    keyword.setItems(databaseService.getAllKeywords());
    level.setLabel("Level");
    language.setLabel("Language");
    location.setItems(databaseService.getAllEventLocations());
    location.setAllowCustomValue(true);
    location.addValueChangeListener(changeEvent -> {
        final var value = changeEvent.getValue();
        final var isOnline = "Online".equalsIgnoreCase(value);
        webinarUrl.setEnabled(isOnline);
        webinarUrl.setRequiredIndicatorVisible(published.getValue() && isOnline);
        room.setRequiredIndicatorVisible(!isOnline);
        updateEventUrlPrefix(location, date, eventUrl);
        binder.validate();
    });
    room.setValueChangeMode(EAGER);
    travelInstructions.setValueChangeMode(EAGER);
    webinarUrl.setValueChangeMode(EAGER);
    date.setMin(LocalDateTime.now());
    date.addValueChangeListener(changeEvent -> updateEventUrlPrefix(location, date, eventUrl));
    duration.setStep(Duration.ofMinutes(15));
    duration.setMin(LocalTime.of(1, 0));
    duration.setMax(LocalTime.of(3, 0));
    eventUrl.setValueChangeMode(EAGER);
    updateEventUrlPrefix(location, date, eventUrl);
    attendeeLimit.setMin(0);
    attendeeLimit.setMax(500);
    attendeeLimit.setStep(10);
    attendeeLimit.setHasControls(true);
    published.addValueChangeListener(changeEvent -> {
        final var value = changeEvent.getValue();
        speaker.setRequiredIndicatorVisible(value);
        level.setRequiredIndicatorVisible(value);
        description.setRequiredIndicatorVisible(value);
        language.setRequiredIndicatorVisible(value);
        location.setRequiredIndicatorVisible(value);
        room.setRequiredIndicatorVisible(!"Online".equalsIgnoreCase(location.getValue()));
        date.setRequiredIndicatorVisible(value);
        duration.setRequiredIndicatorVisible(value);
        eventUrl.setRequiredIndicatorVisible(value);
        binder.validate();
    });
    formLayout.add(type, title, subtitle, speaker, organizer, level, new CustomLabel("Description"), description, keyword, new CustomLabel("Agenda"), agenda, language, location, room, travelInstructions, webinarUrl, youtTube, date, duration, eventUrl, attendeeLimit, membersOnly, published);
    binder.forField(type).withValidator(value -> !published.getValue() || value != null, "Please select a type").bind(Event::getType, Event::setType);
    binder.forField(title).withValidator(new StringLengthValidator("Please enter a title (max. 255 chars)", 1, 255)).bind(Event::getTitle, Event::setTitle);
    binder.forField(subtitle).withValidator(new StringLengthValidator("The subtitle is too long (max. 255 chars)", 0, 255)).bind(Event::getSubtitle, Event::setSubtitle);
    binder.forField(speaker).withValidator(value -> !published.getValue() || !value.isEmpty(), "Please select at least one speaker").bind(this::getSpeakers, this::setSpeakers);
    binder.forField(organizer).withValidator(value -> !value.isEmpty(), "Please select at least one organizer").bind(this::getOrganizer, this::setOrganizer);
    binder.forField(level).withValidator(value -> !published.getValue() || value != null, "Please select a level").bind(Event::getLevel, Event::setLevel);
    binder.forField(description.asHtml()).withValidator(value -> !published.getValue() || value != null && !value.isBlank(), "Please enter a description").bind(Event::getDescription, Event::setDescription);
    binder.forField(keyword).bind(this::getKeyword, this::setKeyword);
    binder.forField(agenda.asHtml()).bind(Event::getAgenda, Event::setAgenda);
    binder.forField(language).withValidator(value -> !published.getValue() || value != null, "Please select a language").bind(Event::getLanguage, Event::setLanguage);
    binder.forField(location).withValidator(value -> !published.getValue() || value != null, "Please select a location").bind(Event::getLocation, Event::setLocation);
    binder.forField(room).withValidator(value -> !published.getValue() || "Online".equalsIgnoreCase(location.getValue()) || !value.isBlank(), "Please enter a room").bind(Event::getRoom, Event::setRoom);
    binder.forField(travelInstructions).withValidator(value -> value.isBlank() || URLUtil.isValid(value), "Please enter a valid URL").bind(Event::getTravelInstructions, Event::setTravelInstructions);
    binder.forField(webinarUrl).withValidator(value -> !published.getValue() || !"Online".equalsIgnoreCase(location.getValue()) || URLUtil.isValid(value), "Please enter a valid URL").bind(Event::getWebinarUrl, Event::setWebinarUrl);
    binder.forField(youtTube).bind(Event::getYoutube, Event::setYoutube);
    binder.forField(date).withValidator(value -> isPastEvent(date) || !published.getValue() && (value == null || value.isAfter(LocalDateTime.now())) || value != null && value.isAfter(LocalDateTime.now()), "Please enter a date and time in the future").bind(Event::getDate, Event::setDate);
    binder.forField(duration).withValidator(value -> !published.getValue() || (value != null && value.isAfter(LocalTime.MIN) && value.isBefore(LocalTime.MAX)), "Please enter a duration").bind(Event::getDuration, Event::setDuration);
    // TODO check for duplicates
    binder.forField(eventUrl).withValidator(value -> !published.getValue() || value != null && !value.isBlank(), "Please enter a valid event URL").bind(Event::getEventUrl, Event::setEventUrl);
    binder.forField(attendeeLimit).bind(Event::getAttendeeLimit, Event::setAttendeeLimit);
    binder.forField(membersOnly).bind(Event::getMembersOnly, Event::setMembersOnly);
    binder.forField(published).bind(Event::getPublished, Event::setPublished);
    afterOpen = () -> {
        webinarUrl.setEnabled("Online".equalsIgnoreCase(location.getValue()));
        if (isPastEvent(date)) {
            binder.setReadOnly(true);
            binder.setValidatorsDisabled(true);
            youtTube.setReadOnly(false);
        }
    };
}
Also used : Member(org.komunumo.data.entity.Member) EventLevel(org.komunumo.data.db.enums.EventLevel) Event(org.komunumo.data.entity.Event) CustomLabel(org.komunumo.ui.component.CustomLabel) Select(com.vaadin.flow.component.select.Select) Binder(com.vaadin.flow.data.binder.Binder) LocalDateTime(java.time.LocalDateTime) ComboBox(com.vaadin.flow.component.combobox.ComboBox) EditDialog(org.komunumo.ui.component.EditDialog) KeywordEntity(org.komunumo.data.entity.KeywordEntity) EventLanguage(org.komunumo.data.db.enums.EventLanguage) AuthenticatedUser(org.komunumo.security.AuthenticatedUser) MultiselectComboBox(org.vaadin.gatanaso.MultiselectComboBox) IntegerField(com.vaadin.flow.component.textfield.IntegerField) Duration(java.time.Duration) LocalTime(java.time.LocalTime) TextField(com.vaadin.flow.component.textfield.TextField) EAGER(com.vaadin.flow.data.value.ValueChangeMode.EAGER) URLUtil(org.komunumo.util.URLUtil) Set(java.util.Set) TimePicker(com.vaadin.flow.component.timepicker.TimePicker) EventSpeakerEntity(org.komunumo.data.entity.EventSpeakerEntity) Collectors(java.util.stream.Collectors) FormLayout(com.vaadin.flow.component.formlayout.FormLayout) Checkbox(com.vaadin.flow.component.checkbox.Checkbox) StringLengthValidator(com.vaadin.flow.data.validator.StringLengthValidator) Nullable(org.jetbrains.annotations.Nullable) DatabaseService(org.komunumo.data.service.DatabaseService) RichTextEditor(com.vaadin.flow.component.richtexteditor.RichTextEditor) Year(java.time.Year) NotNull(org.jetbrains.annotations.NotNull) Callback(org.komunumo.Callback) DateTimePicker(org.komunumo.ui.component.DateTimePicker) Span(com.vaadin.flow.component.html.Span) EventType(org.komunumo.data.db.enums.EventType) TimePicker(com.vaadin.flow.component.timepicker.TimePicker) DateTimePicker(org.komunumo.ui.component.DateTimePicker) CustomLabel(org.komunumo.ui.component.CustomLabel) MultiselectComboBox(org.vaadin.gatanaso.MultiselectComboBox) EventSpeakerEntity(org.komunumo.data.entity.EventSpeakerEntity) ComboBox(com.vaadin.flow.component.combobox.ComboBox) MultiselectComboBox(org.vaadin.gatanaso.MultiselectComboBox) StringLengthValidator(com.vaadin.flow.data.validator.StringLengthValidator) IntegerField(com.vaadin.flow.component.textfield.IntegerField) DateTimePicker(org.komunumo.ui.component.DateTimePicker) KeywordEntity(org.komunumo.data.entity.KeywordEntity) Checkbox(com.vaadin.flow.component.checkbox.Checkbox) Select(com.vaadin.flow.component.select.Select) TextField(com.vaadin.flow.component.textfield.TextField) Event(org.komunumo.data.entity.Event) RichTextEditor(com.vaadin.flow.component.richtexteditor.RichTextEditor)

Example 3 with Event

use of org.komunumo.data.entity.Event in project komunumo-server by komunumo.

the class EventsView method createSubMenu.

private Component createSubMenu(@NotNull final List<Event> events, @Nullable final String actualLocation) {
    final var subMenu = new SubMenu();
    subMenu.add(new SubMenuItem("/events", "upcoming", true));
    subMenu.add(new SubMenuItem("/events", "all locations", actualLocation == null));
    events.stream().map(Event::getLocation).distinct().sorted().map(location -> {
        final var url = URLUtil.createReadableUrl(location);
        if (url.equals(actualLocation)) {
            selectedLocation = location;
        }
        return new SubMenuItem("/events/".concat(url), location, url.equals(actualLocation));
    }).forEach(subMenu::add);
    final var pastEvents = new SubMenuItem("/events/past", "Past Events");
    pastEvents.addClassName("past-events");
    subMenu.add(pastEvents);
    return subMenu;
}
Also used : Serial(java.io.Serial) BeforeEnterEvent(com.vaadin.flow.router.BeforeEnterEvent) Event(org.komunumo.data.entity.Event) URLUtil(org.komunumo.util.URLUtil) Component(com.vaadin.flow.component.Component) WebsiteLayout(org.komunumo.ui.view.website.WebsiteLayout) CssImport(com.vaadin.flow.component.dependency.CssImport) H1(com.vaadin.flow.component.html.H1) SubMenu(org.komunumo.ui.view.website.SubMenu) Div(com.vaadin.flow.component.html.Div) H3(com.vaadin.flow.component.html.H3) H2(com.vaadin.flow.component.html.H2) Route(com.vaadin.flow.router.Route) RouteAlias(com.vaadin.flow.router.RouteAlias) ContentBlock(org.komunumo.ui.view.website.ContentBlock) Nullable(org.jetbrains.annotations.Nullable) DatabaseService(org.komunumo.data.service.DatabaseService) List(java.util.List) HasDynamicTitle(com.vaadin.flow.router.HasDynamicTitle) SubMenuItem(org.komunumo.ui.view.website.SubMenuItem) AnonymousAllowed(com.vaadin.flow.server.auth.AnonymousAllowed) NotNull(org.jetbrains.annotations.NotNull) BeforeEnterObserver(com.vaadin.flow.router.BeforeEnterObserver) SubMenuItem(org.komunumo.ui.view.website.SubMenuItem) BeforeEnterEvent(com.vaadin.flow.router.BeforeEnterEvent) Event(org.komunumo.data.entity.Event) SubMenu(org.komunumo.ui.view.website.SubMenu)

Aggregations

NotNull (org.jetbrains.annotations.NotNull)3 Event (org.komunumo.data.entity.Event)3 DatabaseService (org.komunumo.data.service.DatabaseService)3 URLUtil (org.komunumo.util.URLUtil)3 Component (com.vaadin.flow.component.Component)2 Div (com.vaadin.flow.component.html.Div)2 List (java.util.List)2 Nullable (org.jetbrains.annotations.Nullable)2 Checkbox (com.vaadin.flow.component.checkbox.Checkbox)1 ComboBox (com.vaadin.flow.component.combobox.ComboBox)1 CssImport (com.vaadin.flow.component.dependency.CssImport)1 FormLayout (com.vaadin.flow.component.formlayout.FormLayout)1 H1 (com.vaadin.flow.component.html.H1)1 H2 (com.vaadin.flow.component.html.H2)1 H3 (com.vaadin.flow.component.html.H3)1 Span (com.vaadin.flow.component.html.Span)1 RichTextEditor (com.vaadin.flow.component.richtexteditor.RichTextEditor)1 Select (com.vaadin.flow.component.select.Select)1 IntegerField (com.vaadin.flow.component.textfield.IntegerField)1 TextField (com.vaadin.flow.component.textfield.TextField)1