From ff1b492c53b44fa10e7cd4170b4cfb0b7bfdc6e9 Mon Sep 17 00:00:00 2001 From: Jake Mannens Date: Mon, 28 Aug 2023 02:56:35 +1000 Subject: Added tag aliases and imrpoved selection dialog --- Pages/Component/TagSelectDialog.razor | 71 ++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) (limited to 'Pages/Component') 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 @@ - +
@for(int i = 0; i < tagDefinitions.Count(); i++) { + if(!MatchesQuery(tagDefinitions[i].tagDefinition)) + continue; var local = i; 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 -- cgit v1.3