diff --git a/docs/src/fancydialogs/changelog/v0.md b/docs/src/fancydialogs/changelog/v0.md index 62ebadd2..cac5b944 100644 --- a/docs/src/fancydialogs/changelog/v0.md +++ b/docs/src/fancydialogs/changelog/v0.md @@ -5,6 +5,10 @@ order: 1 # FancyDialogs v0.x.x +## v0.0.5 [!badge variant="info" text="2025-06-20"] + +- Added support for text fields in dialogs + ## v0.0.4 [!badge variant="info" text="2025-06-20"] - Added fancyanalytics integration diff --git a/plugins/fancydialogs/VERSION b/plugins/fancydialogs/VERSION index 05b19b1f..fa3de586 100644 --- a/plugins/fancydialogs/VERSION +++ b/plugins/fancydialogs/VERSION @@ -1 +1 @@ -0.0.4 \ No newline at end of file +0.0.5 \ No newline at end of file diff --git a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/ConfirmationDialog.java b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/ConfirmationDialog.java index aa345706..37d11872 100644 --- a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/ConfirmationDialog.java +++ b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/ConfirmationDialog.java @@ -3,6 +3,7 @@ package com.fancyinnovations.fancydialogs.api; import com.fancyinnovations.fancydialogs.api.data.DialogBodyData; import com.fancyinnovations.fancydialogs.api.data.DialogButton; import com.fancyinnovations.fancydialogs.api.data.DialogData; +import com.fancyinnovations.fancydialogs.api.data.inputs.DialogInputs; import org.bukkit.entity.Player; import java.util.List; @@ -105,6 +106,7 @@ public class ConfirmationDialog { title, false, List.of(new DialogBodyData(question)), + DialogInputs.EMPTY, // TODO add support for confirmation phrases List.of(confirmBtn, cancelBtn) ); diff --git a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/NoticeDialog.java b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/NoticeDialog.java index 9b735244..8f224a10 100644 --- a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/NoticeDialog.java +++ b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/NoticeDialog.java @@ -2,6 +2,7 @@ package com.fancyinnovations.fancydialogs.api; import com.fancyinnovations.fancydialogs.api.data.DialogBodyData; import com.fancyinnovations.fancydialogs.api.data.DialogData; +import com.fancyinnovations.fancydialogs.api.data.inputs.DialogInputs; import org.bukkit.entity.Player; import java.util.List; @@ -25,6 +26,7 @@ public class NoticeDialog { List.of( new DialogBodyData(this.text) ), + DialogInputs.EMPTY, List.of() ); } diff --git a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/DialogData.java b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/DialogData.java index a26936aa..91f116e2 100644 --- a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/DialogData.java +++ b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/DialogData.java @@ -1,5 +1,6 @@ package com.fancyinnovations.fancydialogs.api.data; +import com.fancyinnovations.fancydialogs.api.data.inputs.DialogInputs; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -9,6 +10,7 @@ public record DialogData( @NotNull String title, boolean canCloseWithEscape, @NotNull List body, + @NotNull DialogInputs inputs, @NotNull List buttons ) { diff --git a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogInput.java b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogInput.java new file mode 100644 index 00000000..c72a6047 --- /dev/null +++ b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogInput.java @@ -0,0 +1,26 @@ +package com.fancyinnovations.fancydialogs.api.data.inputs; + +public abstract class DialogInput { + + protected final String key; + protected final String label; + protected final int order; + + public DialogInput(String key, String label, int order) { + this.key = key; + this.label = label; + this.order = order; + } + + public String getKey() { + return key; + } + + public String getLabel() { + return label; + } + + public int getOrder() { + return order; + } +} diff --git a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogInputs.java b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogInputs.java new file mode 100644 index 00000000..cd388d8b --- /dev/null +++ b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogInputs.java @@ -0,0 +1,28 @@ +package com.fancyinnovations.fancydialogs.api.data.inputs; + +import java.util.ArrayList; +import java.util.List; + +public record DialogInputs( + List textFields +) { + + public static final DialogInputs EMPTY = new DialogInputs(List.of()); + + public List all() { + List all = new ArrayList<>(); + if (textFields != null) { + all.addAll(textFields); + } + + all.sort((o1, o2) -> { + if (o1.getOrder() == o2.getOrder()) { + return 0; + } + return o1.getOrder() < o2.getOrder() ? -1 : 1; + }); + + return all; + } + +} diff --git a/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogTextField.java b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogTextField.java new file mode 100644 index 00000000..5e60f3fc --- /dev/null +++ b/plugins/fancydialogs/fd-api/src/main/java/com/fancyinnovations/fancydialogs/api/data/inputs/DialogTextField.java @@ -0,0 +1,27 @@ +package com.fancyinnovations.fancydialogs.api.data.inputs; + +public class DialogTextField extends DialogInput { + + private final String placeholder; + private final int maxLength; + private final int maxLines; + + public DialogTextField(String key, String label, int order, String placeholder, int maxLength, int maxLines) { + super(key, label, order); + this.placeholder = placeholder; + this.maxLength = maxLength; + this.maxLines = maxLines; + } + + public String getPlaceholder() { + return placeholder; + } + + public int getMaxLength() { + return maxLength; + } + + public int getMaxLines() { + return maxLines; + } +} diff --git a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/dialog/DialogImpl.java b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/dialog/DialogImpl.java index ca3aa01e..15efaf37 100644 --- a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/dialog/DialogImpl.java +++ b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/dialog/DialogImpl.java @@ -4,6 +4,8 @@ import com.fancyinnovations.fancydialogs.api.Dialog; import com.fancyinnovations.fancydialogs.api.data.DialogBodyData; import com.fancyinnovations.fancydialogs.api.data.DialogButton; import com.fancyinnovations.fancydialogs.api.data.DialogData; +import com.fancyinnovations.fancydialogs.api.data.inputs.DialogInput; +import com.fancyinnovations.fancydialogs.api.data.inputs.DialogTextField; import de.oliver.fancysitula.api.dialogs.FS_CommonDialogData; import de.oliver.fancysitula.api.dialogs.FS_DialogAction; import de.oliver.fancysitula.api.dialogs.actions.FS_CommonButtonData; @@ -11,6 +13,9 @@ import de.oliver.fancysitula.api.dialogs.actions.FS_DialogActionButton; import de.oliver.fancysitula.api.dialogs.actions.FS_DialogCustomAction; import de.oliver.fancysitula.api.dialogs.body.FS_DialogBody; import de.oliver.fancysitula.api.dialogs.body.FS_DialogTextBody; +import de.oliver.fancysitula.api.dialogs.inputs.FS_DialogInput; +import de.oliver.fancysitula.api.dialogs.inputs.FS_DialogInputControl; +import de.oliver.fancysitula.api.dialogs.inputs.FS_DialogTextInput; import de.oliver.fancysitula.api.dialogs.types.FS_MultiActionDialog; import de.oliver.fancysitula.api.entities.FS_RealPlayer; import de.oliver.fancysitula.factories.FancySitula; @@ -39,6 +44,30 @@ public class DialogImpl extends Dialog { body.add(fsDialogTextBody); } + List inputs = new ArrayList<>(); + for (DialogInput input : data.inputs().all()) { + FS_DialogInputControl control = null; + if (input instanceof DialogTextField textField) { + control = new FS_DialogTextInput( + 200, // default width + textField.getLabel(), + !textField.getLabel().isEmpty(), + textField.getPlaceholder(), + textField.getMaxLength(), + textField.getMaxLines() > 0 ? + new FS_DialogTextInput.MultilineOptions(textField.getMaxLines(), null) : + null + ); + } + + if (control == null) { + throw new IllegalArgumentException("Unsupported input type: " + input.getClass().getSimpleName()); + } + + FS_DialogInput fsDialogInput = new FS_DialogInput(input.getKey(), control); + inputs.add(fsDialogInput); + } + List actions = new ArrayList<>(); for (DialogButton button : data.buttons()) { FS_DialogActionButton fsDialogActionButton = new FS_DialogActionButton( @@ -66,7 +95,8 @@ public class DialogImpl extends Dialog { false, FS_DialogAction.CLOSE, body, - List.of( + inputs +// List.of( // new FS_DialogInput( // "input1", // new FS_DialogTextInput( @@ -112,7 +142,7 @@ public class DialogImpl extends Dialog { // true // ) // ) - ) +// ) ), actions, // actions null, diff --git a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/registry/DefaultDialogs.java b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/registry/DefaultDialogs.java index 43865a07..0ab21cbe 100644 --- a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/registry/DefaultDialogs.java +++ b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/registry/DefaultDialogs.java @@ -4,6 +4,8 @@ import com.fancyinnovations.fancydialogs.FancyDialogsPlugin; import com.fancyinnovations.fancydialogs.api.data.DialogBodyData; import com.fancyinnovations.fancydialogs.api.data.DialogButton; import com.fancyinnovations.fancydialogs.api.data.DialogData; +import com.fancyinnovations.fancydialogs.api.data.inputs.DialogInputs; +import com.fancyinnovations.fancydialogs.api.data.inputs.DialogTextField; import com.fancyinnovations.fancydialogs.dialog.DialogImpl; import com.fancyinnovations.fancydialogs.storage.DialogStorage; @@ -40,6 +42,18 @@ public class DefaultDialogs { new DialogBodyData("Explore more features in the documentation (click here)."), new DialogBodyData("Enjoy using FancyDialogs :D") ), + new DialogInputs( + List.of( + new DialogTextField( + "fav_color", + "What is your favorite color?", + 1, + "Gold", + 50, + 1 + ) + ) + ), List.of( new DialogButton( "Close", @@ -47,10 +61,10 @@ public class DefaultDialogs { List.of() ), new DialogButton( - "Run command", - "Click to give yourself an apple :)", + "Show favourite color", + "Click to show your fav color :D", List.of( - new DialogButton.DialogAction("console_command", "give @p minecraft:apple 1") + new DialogButton.DialogAction("message", "Your favorite color is: {fav_color}") ) ) ) @@ -70,6 +84,7 @@ public class DefaultDialogs { new DialogBodyData("We are glad to have you here!"), new DialogBodyData("If you have any questions, feel free to ask our staff members.") ), + DialogInputs.EMPTY, List.of( new DialogButton( "Read the rules", @@ -111,6 +126,7 @@ public class DefaultDialogs { List.of( new DialogBodyData("Here you can quickly access some of the most important features of our server.") ), + DialogInputs.EMPTY, List.of( new DialogButton( "Visit our website",