-
-
-
Bot Settings
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
}
@code {
diff --git a/WebUI/Components/Shared/CenteredCard.razor b/WebUI/Components/Shared/CenteredCard.razor
new file mode 100644
index 0000000..c93cf73
--- /dev/null
+++ b/WebUI/Components/Shared/CenteredCard.razor
@@ -0,0 +1,14 @@
+
+
+
+
@Title
+ @ChildContent
+
+
+
+
+@code {
+
+ [Parameter] public string Title { get; set; } = string.Empty;
+ [Parameter] public RenderFragment ChildContent { get; set; } = default!;
+}
\ No newline at end of file
diff --git a/WebUI/Components/Shared/ModernCheckbox.razor b/WebUI/Components/Shared/ModernCheckbox.razor
new file mode 100644
index 0000000..392436c
--- /dev/null
+++ b/WebUI/Components/Shared/ModernCheckbox.razor
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+@code {
+ [Parameter] public string Label { get; set; } = string.Empty;
+ [Parameter] public bool Checked { get; set; }
+ [Parameter] public EventCallback
CheckedChanged { get; set; }
+
+ private string CheckboxId { get; } = $"checkbox_{Guid.NewGuid().ToString("N")}";
+
+ private async Task OnChange(ChangeEventArgs e)
+ {
+ if (e.Value is bool value)
+ {
+ Checked = value;
+ await CheckedChanged.InvokeAsync(value);
+ }
+ }
+}
\ No newline at end of file
diff --git a/WebUI/Components/Shared/ModernFileUploader.razor b/WebUI/Components/Shared/ModernFileUploader.razor
new file mode 100644
index 0000000..9bf66c9
--- /dev/null
+++ b/WebUI/Components/Shared/ModernFileUploader.razor
@@ -0,0 +1,78 @@
+@inject IJSRuntime JS
+
+
+
+
+ @if (string.IsNullOrEmpty(SelectedFileName))
+ {
+
Click to upload a file
+ }
+ @if (!string.IsNullOrEmpty(SelectedFileName))
+ {
+
Selected: @SelectedFileName
+ }
+
+
+
+
+@if (!string.IsNullOrEmpty(UploadMessage))
+{
+ @UploadMessage
+}
+
+
+
+@code {
+ private string? SelectedFileName;
+ private string? UploadMessage;
+
+ [Parameter] public List AllowedFileTypes { get; set; } = new List();
+ [Parameter] public long MaxFileSize { get; set; } = 10 * 1024 * 1024;
+ [Parameter] public EventCallback OnFileUploaded { get; set; }
+
+ private DotNetObjectReference? dotNetRef;
+
+ protected override async Task OnAfterRenderAsync(bool firstRender)
+ {
+ if (firstRender)
+ {
+ dotNetRef = DotNetObjectReference.Create(this);
+ }
+ }
+
+ private async Task TriggerFileInputClick()
+ {
+ await JS.InvokeVoidAsync("triggerInputClick", "hiddenFileInput");
+ }
+
+ private async Task HandleFileChange(InputFileChangeEventArgs e)
+ {
+ var file = e.File;
+ UploadMessage = null;
+
+ if (AllowedFileTypes.Count > 0 && !AllowedFileTypes.Any(type => file.Name.EndsWith(type, StringComparison.OrdinalIgnoreCase)))
+ {
+ UploadMessage = $"Invalid file type. Allowed types: {string.Join(", ", AllowedFileTypes)}.";
+ SelectedFileName = null;
+ return;
+ }
+
+ if (file.Size > MaxFileSize)
+ {
+ UploadMessage = $"File too large. Max allowed size is {MaxFileSize / (1024 * 1024)} MB.";
+ SelectedFileName = null;
+ return;
+ }
+
+ SelectedFileName = file.Name;
+ await OnFileUploaded.InvokeAsync(file);
+ }
+
+ public void Dispose()
+ {
+ dotNetRef?.Dispose();
+ }
+}
\ No newline at end of file
diff --git a/WebUI/Components/Shared/ModernLabel.razor b/WebUI/Components/Shared/ModernLabel.razor
new file mode 100644
index 0000000..f3f261d
--- /dev/null
+++ b/WebUI/Components/Shared/ModernLabel.razor
@@ -0,0 +1,7 @@
+
+
+@code {
+ [Parameter] public string Text { get; set; } = string.Empty;
+}
\ No newline at end of file
diff --git a/WebUI/Components/Shared/RoundedTextBox.razor b/WebUI/Components/Shared/RoundedTextBox.razor
new file mode 100644
index 0000000..9c514d9
--- /dev/null
+++ b/WebUI/Components/Shared/RoundedTextBox.razor
@@ -0,0 +1,24 @@
+
+
+
+
+@code {
+ [Parameter] public string Placeholder { get; set; } = string.Empty;
+
+ [Parameter] public string Value { get; set; } = string.Empty;
+
+ [Parameter] public EventCallback ValueChanged { get; set; }
+
+ private async Task OnInput(ChangeEventArgs e)
+ {
+ if (e.Value is string newValue)
+ {
+ Value = newValue;
+ await ValueChanged.InvokeAsync(Value);
+ }
+ }
+}
\ No newline at end of file
diff --git a/WebUI/WebUI.csproj b/WebUI/WebUI.csproj
index d428ef0..fb8d5f9 100644
--- a/WebUI/WebUI.csproj
+++ b/WebUI/WebUI.csproj
@@ -15,8 +15,4 @@
-
-
-
-
diff --git a/WebUI/wwwroot/Components/Shared/ModernFileUploader/modernFileUploader.css b/WebUI/wwwroot/Components/Shared/ModernFileUploader/modernFileUploader.css
new file mode 100644
index 0000000..1ade7fb
--- /dev/null
+++ b/WebUI/wwwroot/Components/Shared/ModernFileUploader/modernFileUploader.css
@@ -0,0 +1,3 @@
+.upload-box.dragover {
+ border-color: #3b82f6;
+}
diff --git a/WebUI/wwwroot/Components/Shared/ModernFileUploader/modernFileUploader.js b/WebUI/wwwroot/Components/Shared/ModernFileUploader/modernFileUploader.js
new file mode 100644
index 0000000..35f3c6e
--- /dev/null
+++ b/WebUI/wwwroot/Components/Shared/ModernFileUploader/modernFileUploader.js
@@ -0,0 +1,3 @@
+window.triggerInputClick = function (id) {
+ document.getElementById(id)?.click();
+};
\ No newline at end of file