use of com.vaadin.flow.data.binder.Binder in project ArchCNL by Mari-Wie.
the class PresetsDialogPresenter method createRulesAndMappingsForMicroserviceArchitecture.
private void createRulesAndMappingsForMicroserviceArchitecture(ArchitectureRuleManager ruleManager, ConceptManager conceptManager, RelationManager relationManager) {
MicroserviceArchitectureBuilder microserviceArchitectureBuilder = new MicroserviceArchitectureBuilder();
ArchitecturalStyleForm form = (ArchitecturalStyleForm) tabsToComponent.get(architectureInformationTab);
Map<String, Binder<ArchitectureInformation>> architectureInfoBinders = form.getUngroupedArchitectureInformationBinders();
Map<Integer, Set<TwoColumnGridEntry>> architectureInformationGroupsAndEntries = form.getArchitectureInformationGroupsAndEntries();
// map ungrouped architecture information
mapUiInputToArchitectureInformation(microserviceArchitectureBuilder, architectureInfoBinders);
// map grouped architecture information
mapGroupedUIInputsToArchitectureInformation(microserviceArchitectureBuilder, architectureInformationGroupsAndEntries);
// create the rules
MicroserviceArchitecture microserviceArchitecture = microserviceArchitectureBuilder.build();
// only rules that are selected
Set<String> rulesToCreate = new HashSet<String>();
for (ArchitectureRuleConfig ruleConfig : architectureConfig.getRules()) {
if (ruleConfig.isActive()) {
rulesToCreate.add(ruleConfig.getRule());
}
}
microserviceArchitecture.setArchitectureRules(rulesToCreate);
microserviceArchitecture.createRulesAndMappings(ruleManager, conceptManager, relationManager);
// this updates Concepts/Rules/Relations in the MainView
fireEvent(new UpdateRulesConceptsAndRelationsRequestedEvent(this, false));
}
use of com.vaadin.flow.data.binder.Binder 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);
}
};
}
use of com.vaadin.flow.data.binder.Binder in project komunumo-server by komunumo.
the class SponsorDialog method createForm.
@Override
public void createForm(@NotNull final FormLayout formLayout, @NotNull final Binder<SponsorRecord> binder) {
final var name = new TextField("Name");
final var website = new TextField("Website");
final var level = new ComboBox<SponsorLevel>("Level");
final var logo = new ImageUploadField("Logo");
final var description = new RichTextEditor();
final var validFrom = new DatePicker("Valid from");
final var validTo = new DatePicker("Valid to");
final var domains = new TagField("Domains");
name.setRequiredIndicatorVisible(true);
name.setValueChangeMode(EAGER);
website.setValueChangeMode(EAGER);
level.setItems(SponsorLevel.values());
formLayout.add(name, website, level, logo, new CustomLabel("Description"), description, validFrom, validTo, domains);
binder.forField(name).withValidator(new StringLengthValidator("Please enter the name of the sponsor (max. 255 chars)", 1, 255)).bind(SponsorRecord::getName, SponsorRecord::setName);
binder.forField(website).withValidator(value -> value.isEmpty() || value.startsWith("https://"), "The website address must start with \"https://\"").withValidator(new StringLengthValidator("The website address is too long (max. 255 chars)", 0, 255)).bind(SponsorRecord::getWebsite, SponsorRecord::setWebsite);
binder.forField(level).bind(SponsorRecord::getLevel, SponsorRecord::setLevel);
binder.forField(logo).withValidator(value -> value.isEmpty() || value.startsWith("data:") || value.startsWith("https://"), "The logo must be uploaded or the logo address must be secure (HTTPS)").withValidator(new StringLengthValidator("The logo is too big (max. 100 KB)", 0, 100_000)).bind(SponsorRecord::getLogo, SponsorRecord::setLogo);
binder.forField(description.asHtml()).withValidator(new StringLengthValidator("The description is too long (max. 100'000 chars)", 0, 100_000)).bind(SponsorRecord::getDescription, SponsorRecord::setDescription);
binder.forField(validFrom).withValidator(value -> value == null || validTo.isEmpty() || value.isBefore(validTo.getValue()), "The valid from date must be before the valid to date").bind(SponsorRecord::getValidFrom, SponsorRecord::setValidFrom);
binder.forField(validTo).withValidator(value -> value == null || validFrom.isEmpty() || value.isAfter(validFrom.getValue()), "The valid to date must be after the valid from date").bind(SponsorRecord::getValidTo, SponsorRecord::setValidTo);
binder.forField(domains).bind(this::getDomains, this::setDomains);
}
use of com.vaadin.flow.data.binder.Binder in project komunumo-server by komunumo.
the class NewsDialog method createForm.
@Override
public void createForm(@NotNull final FormLayout formLayout, @NotNull final Binder<NewsRecord> binder) {
final var title = new TextField("Title");
final var subtitle = new TextField("Subtitle");
final var teaser = new RichTextEditor();
final var message = new RichTextEditor();
final var showFrom = new DateTimePicker("Show from");
final var showTo = new DateTimePicker("Show to");
title.setRequiredIndicatorVisible(true);
title.setValueChangeMode(EAGER);
subtitle.setValueChangeMode(EAGER);
formLayout.add(title, subtitle, new CustomLabel("Teaser"), teaser, new CustomLabel("Message"), message, showFrom, showTo);
binder.forField(title).withValidator(new StringLengthValidator("Please enter the title of the news (max. 255 chars)", 1, 255)).bind(NewsRecord::getTitle, NewsRecord::setTitle);
binder.forField(subtitle).withValidator(new StringLengthValidator("The subtitle is too long (max. 255 chars)", 0, 255)).bind(NewsRecord::getSubtitle, NewsRecord::setSubtitle);
binder.forField(teaser.asHtml()).withValidator(new StringLengthValidator("The teaser is too long (max. 1'000 chars)", 0, 1_000)).bind(NewsRecord::getTeaser, NewsRecord::setTeaser);
binder.forField(message.asHtml()).withValidator(new StringLengthValidator("The message is too long (max. 100'000 chars)", 0, 100_000)).bind(NewsRecord::getMessage, NewsRecord::setMessage);
binder.forField(showFrom).withValidator(value -> value == null || showTo.isEmpty() || value.isBefore(showTo.getValue()), "The show from date must be before the show to date").bind(NewsRecord::getShowFrom, NewsRecord::setShowFrom);
binder.forField(showTo).withValidator(value -> value == null || showFrom.isEmpty() || value.isAfter(showFrom.getValue()), "The show to date must be after the show from date").bind(NewsRecord::getShowTo, NewsRecord::setShowTo);
}
use of com.vaadin.flow.data.binder.Binder in project docs by vaadin.
the class CrudColumns method createEditor.
private CrudEditor<Person> createEditor() {
TextField firstName = new TextField("First name");
EmailField email = new EmailField("Email");
TextField profession = new TextField("Profession");
DatePicker birthday = new DatePicker("Birthday");
FormLayout form = new FormLayout(firstName, email, profession, birthday);
Binder<Person> binder = new Binder<>(Person.class);
binder.forField(firstName).asRequired().bind(Person::getFirstName, Person::setFirstName);
binder.forField(email).asRequired().bind(Person::getEmail, Person::setEmail);
binder.forField(profession).asRequired().bind(Person::getProfession, Person::setProfession);
binder.forField(birthday).asRequired().withConverter(new LocalDateToDateConverter()).bind(Person::getBirthday, Person::setBirthday);
return new BinderCrudEditor<>(binder, form);
}
Aggregations