fi.evolver.ai.vaadin.component.form.FormDialog Maven / Gradle / Ivy
package fi.evolver.ai.vaadin.component.form;
import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;
import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.dialog.Dialog;
import com.vaadin.flow.component.html.H2;
import com.vaadin.flow.shared.Registration;
import fi.evolver.ai.vaadin.entity.HasValueGetterSetter;
import fi.evolver.utils.string.StringUtils;
public class FormDialog, FType> extends Dialog implements HasValueGetterSetter {
@Serial
private static final long serialVersionUID = 1L;
private final List> onCloseListeners = new ArrayList<>();
private final List onOpenListeners = new ArrayList<>();
private final F content;
private final String title;
private final Button saveBtn = new Button(getTranslation("common.close"));
public FormDialog(F content, String titleKey, boolean translateTitle) {
if (translateTitle)
this.title = getTranslation(titleKey);
else
this.title = titleKey;
this.content = content;
setWidth("75%");
addFields();
addOpenListener(() -> saveBtn.setText(onCloseListeners.size() > 0 ? getTranslation("common.save") : getTranslation("common.close")));
}
public FormDialog(F content, String title) {
this(content, title, false);
}
public FormDialog(F content) {
this(content, null);
}
@Override
public void setValue(FType value) {
content.setValue(value);
}
@Override
public FType getValue() {
return content.getValue();
}
@Override
public void open() {
onOpenListeners.forEach(Runnable::run);
super.open();
}
@Override
public void close() {
onCloseListeners.forEach(listener -> listener.accept(getValue()));
super.close();
}
public String getTitle() {
return title;
}
public F getContent() {
return content;
}
public Registration addOpenListener(Runnable onOpen) {
return Registration.addAndRemove(onOpenListeners, onOpen);
}
public Registration addOpenListener(Supplier onOpen) {
return addOpenListener(() -> setValue(onOpen.get()));
}
public Registration addSaveClickListener(Consumer onSave) {
return Registration.addAndRemove(onCloseListeners, onSave);
}
public Registration addSaveClickListener(Runnable onSave) {
return addSaveClickListener(val -> onSave.run());
}
private void addFields() {
if (StringUtils.hasText(title))
add(new H2(title));
add(content);
saveBtn.addClickListener((e) -> close());
add(saveBtn);
}
}