summaryrefslogtreecommitdiff
path: root/Pages/Component
diff options
context:
space:
mode:
authorJake Mannens <jake@asger.xyz>2023-08-28 02:56:35 +1000
committerJake Mannens <jake@asger.xyz>2023-08-28 02:56:35 +1000
commitff1b492c53b44fa10e7cd4170b4cfb0b7bfdc6e9 (patch)
tree0cca8e20b27bad74666772475ddbbab955b704c3 /Pages/Component
parent5128d5b72e89179d6a1e38c1b558e6a7309f7b4b (diff)
Added tag aliases and imrpoved selection dialog
Diffstat (limited to 'Pages/Component')
-rw-r--r--Pages/Component/TagSelectDialog.razor71
1 files changed, 70 insertions, 1 deletions
diff --git a/Pages/Component/TagSelectDialog.razor b/Pages/Component/TagSelectDialog.razor
index 5ab7b0a..f21d570 100644
--- a/Pages/Component/TagSelectDialog.razor
+++ b/Pages/Component/TagSelectDialog.razor
@@ -6,9 +6,11 @@
<link rel="stylesheet" href="@(nameof(HyperBooru)).styles.css"/>
<Dialog Title=@(Title ?? "Select one or more tag(s)") @ref=dialog>
- <input type="text" placeholder="Search"/>
+ <input type="text" placeholder="Search" @ref=queryInput @oninput=QueryInput @onkeypress=QueryKey value=@query autofocus/>
<div class="tag-definitions">
@for(int i = 0; i < tagDefinitions.Count(); i++) {
+ if(!MatchesQuery(tagDefinitions[i].tagDefinition))
+ continue;
var local = i;
<input
type="checkbox"
@@ -40,6 +42,7 @@
set {
if(value)
LoadTags();
+ query = null;
visible = dialog.Visible = value;
}
}
@@ -52,6 +55,9 @@
private bool visible;
+ private string? query;
+ private ElementReference queryInput;
+
public void Show() => Visible = true;
public void Hide() => Visible = false;
@@ -60,6 +66,11 @@
LoadTags();
}
+ protected override void OnAfterRender(bool firstRender) {
+ if(Visible)
+ queryInput.FocusAsync();
+ }
+
private void LoadTags() {
db = dbFactory.CreateDbContext();
@@ -79,6 +90,64 @@
.ToArray();
}
+ private void QueryInput(ChangeEventArgs e) {
+ query = (string?) e.Value;
+ StateHasChanged();
+ }
+
+ private void QueryKey(KeyboardEventArgs e) {
+ if(e.Code != "Enter" && e.Code != "NumpadEnter")
+ return;
+
+ if(string.IsNullOrEmpty(query)) {
+ Submit();
+ return;
+ }
+
+ int c = 0;
+ int? last = null;
+ for(int i = 0; i < tagDefinitions.Count(); i++) {
+ if(!MatchesQuery(tagDefinitions[i].tagDefinition))
+ continue;
+ last = i;
+ c++;
+ }
+
+ if(c == 1 && last is not null)
+ tagDefinitions[(int) last].selected =
+ !tagDefinitions[(int) last].selected;
+
+ query = null;
+ StateHasChanged();
+ }
+
+ private bool MatchesQuery(TagDefinition tagDef) {
+ TagDefinition? singleTag = null;
+
+ if(string.IsNullOrEmpty(query))
+ return true;
+
+ singleTag = tagDefinitions.FirstOrDefault(
+ e => string.Equals(
+ e.tagDefinition.Alias,
+ query,
+ StringComparison.OrdinalIgnoreCase)).tagDefinition;
+
+ if(singleTag is not null)
+ return tagDef.Guid == singleTag.Guid;
+
+ singleTag = tagDefinitions.FirstOrDefault(
+ e => string.Equals(
+ e.tagDefinition.Name,
+ query,
+ StringComparison.OrdinalIgnoreCase)).tagDefinition;
+
+ if(singleTag is not null)
+ return tagDef.Guid == singleTag.Guid;
+
+ return tagDef.Name.ToLower().Contains(query.ToLower());
+ }
+
private async void Submit() {
await OnSubmit.InvokeAsync(
tagDefinitions