fi.evolver.ai.vaadin.util.FormUtils Maven / Gradle / Ivy
package fi.evolver.ai.vaadin.util;
import java.io.*;
import java.util.List;
import java.util.Optional;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.vaadin.flow.component.ClickNotifier;
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.notification.Notification;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import fi.evolver.ai.vaadin.component.form.FormDialog;
import fi.evolver.ai.vaadin.component.form.TextAreaForm;
import fi.evolver.ai.vaadin.entity.ConcurrentValueGetterSetter;
import fi.evolver.ai.vaadin.entity.HasValueGetterSetter;
import fi.evolver.ai.vaadin.util.ChatUtils.CommandType;
public class FormUtils {
private static final Logger LOG = LoggerFactory.getLogger(FormUtils.class);
private FormUtils() { /* Utility class */ }
public static , C extends Component> T createFormDialogOpenComponent(FormDialog dialog, Supplier componentBuilder) {
T openComponent = componentBuilder.get();
openComponent.addClickListener(e -> dialog.open());
return openComponent;
}
public static , C extends Component> T createFormDialogOpenComponent(FormDialog dialog, Function componentBuilder, String text) {
return createFormDialogOpenComponent(dialog, () -> componentBuilder.apply(text));
}
public static , C extends Component> T createFormDialogOpenComponent(FormDialog dialog, BiFunction componentBuilder, String text, Component component) {
return createFormDialogOpenComponent(dialog, () -> componentBuilder.apply(text, component));
}
public static void setFormDialogStore(FormDialog dialog, HasValueGetterSetter store) {
dialog.addOpenListener(store::getValue);
dialog.addSaveClickListener(store::setValue);
}
public static FormDialog createTemplateFormDialog(HasValueGetterSetter store) {
FormDialog formDialog = new FormDialog<>(new TextAreaForm(), "util.form.editTemplate", true);
setFormDialogStore(formDialog, store);
return formDialog;
}
public static Function> createPromptEditChatCommandHandler(Dialog editFormDialog, boolean adminOnly) {
return (chatCommand) -> {
if (!AuthUtils.isAdminUser() && adminOnly) {
LOG.info("Non-admin user tried to edit prompt");
return Optional.empty();
}
if (chatCommand.equals(CommandType.EDIT_PROMPT)) {
LOG.debug("Editing prompt");
editFormDialog.open();
return Optional.of(editFormDialog.getTranslation("util.form.editingPrompt"));
}
return Optional.empty();
};
}
public static Dialog createFormSelectDialog(List> forms) {
VerticalLayout column = new VerticalLayout();
Dialog formSelectDialog = new Dialog(column);
for (FormDialog form : forms) {
Button formBtn = createFormDialogOpenComponent(form, Button::new, form.getTitle());
formBtn.addClickListener(e -> formSelectDialog.close());
formBtn.setWidthFull();
column.add(formBtn);
}
return formSelectDialog;
}
public static class ResourceFileStore implements HasValueGetterSetter {
private static final Logger LOG = LoggerFactory.getLogger(ResourceFileStore.class);
private final String resource;
private ResourceFileStore(String resource) {
this.resource = resource;
}
@Override
public String getValue() {
String s = "";
try (BufferedReader br = new BufferedReader(new InputStreamReader(FormUtils.class.getResourceAsStream(resource)))) {
String line;
while ((line = br.readLine()) != null)
s += line + "\n";
}
catch (IOException e) {
LOG.error("Failed to load resource: {}", e.getMessage());
return "ERROR: Failed to load resource: " + e.getMessage();
}
return s;
}
@Override
public void setValue(String value) {
try (BufferedWriter bw = new BufferedWriter(new FileWriter(FormUtils.class.getResource(resource).getPath()))) {
bw.write(value);
}
catch (IOException e) {
LOG.error("Failed to save resource: {}", e.getMessage());
Notification.show("ERROR: Failed to save resource: " + e.getMessage());
}
}
public static ConcurrentValueGetterSetter asConcurrent(String resource) {
return new ConcurrentValueGetterSetter<>(new ResourceFileStore(resource));
}
}
}