summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJake Mannens <jake@asger.xyz>2023-08-28 02:56:35 +1000
committerJake Mannens <jake@asger.xyz>2025-08-20 00:48:43 +1000
commit8f258529e94b3c5b741a0315bcd75af24b5a8b5a (patch)
tree8d16a7e88e075cbd370a9b61040c97ad14e9f223
parent0850585fb3507fbae3fe311633cc91b5a9334a00 (diff)
Added tag aliases and imrpoved selection dialog
-rw-r--r--Pages/Component/TagSelectDialog.razor71
-rw-r--r--Pages/TagDefinitions.razor12
-rw-r--r--Services/TagService.cs18
-rw-r--r--Tag.cs1
4 files changed, 91 insertions, 11 deletions
diff --git a/Pages/Component/TagSelectDialog.razor b/Pages/Component/TagSelectDialog.razor
index e9f3295..2ba34e9 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;
var ns = tagDefinitions[i].tagDefinition.Namespace;
var alias = tagDefinitions[i].tagDefinition.Alias;
@@ -48,6 +50,7 @@
set {
if(value)
LoadTags();
+ query = null;
visible = dialog.Visible = value;
}
}
@@ -60,6 +63,9 @@
private bool visible;
+ private string? query;
+ private ElementReference queryInput;
+
public void Show() => Visible = true;
public void Hide() => Visible = false;
@@ -68,6 +74,11 @@
LoadTags();
}
+ protected override void OnAfterRender(bool firstRender) {
+ if(Visible)
+ queryInput.FocusAsync();
+ }
+
private void LoadTags() {
db = dbFactory.CreateDbContext();
@@ -87,6 +98,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
diff --git a/Pages/TagDefinitions.razor b/Pages/TagDefinitions.razor
index bd7394d..878b9a2 100644
--- a/Pages/TagDefinitions.razor
+++ b/Pages/TagDefinitions.razor
@@ -16,12 +16,14 @@
<TabPane Title="@(ns ?? "Default")">
<table id="tag-definitions" class="data-table">
<tr>
+ <th>Alias</th>
<th>Name</th>
<th>Implicit Tags</th>
<th></th>
</tr>
@foreach(var tagDef in tagDefinitions.Where(td => td.Namespace == ns)) {
<tr data-guid="@tagDef.Guid">
+ <td>@tagDef.Alias</td>
<td>@tagDef.Name</td>
<td>
<i>
@@ -59,6 +61,8 @@
<input type="text" @bind=tagName required/>
<label>Namespace</label>
<input type="text" @bind=tagNamespace/>
+ <label>Alias</label>
+ <input type="text" @bind=tagAlias/>
<div class="button-container">
<button class="secondary" @onclick=@(() => createTagDialog.Hide())>Cancel</button>
<button type="submit">Create</button>
@@ -72,6 +76,8 @@
<input type="text" @bind=tagName required/>
<label>Namespace</label>
<input type="text" @bind=tagNamespace/>
+ <label>Alias</label>
+ <input type="text" @bind=tagAlias/>
<div class="button-container">
<button class="secondary" @onclick=@(() => editTagDialog.Hide())>Cancel</button>
<button type="submit">Apply</button>
@@ -98,6 +104,7 @@
private string tagName;
private string? tagNamespace;
+ private string? tagAlias;
private TagDefinition? toDelete;
private TagDefinition? toEdit;
@@ -130,7 +137,7 @@
if(string.IsNullOrEmpty(tagNamespace))
tagNamespace = null;
- tagService.CreateTagDefinition(tagName, tagNamespace);
+ tagService.CreateTagDefinition(tagName, tagNamespace, tagAlias);
createTagDialog.Hide();
StateHasChanged();
}
@@ -139,6 +146,7 @@
this.toEdit = toEdit;
tagName = toEdit.Name;
tagNamespace = toEdit.Namespace;
+ tagAlias = toEdit.Alias;
editTagDialog.Show();
}
@@ -146,7 +154,7 @@
if(toEdit is null)
return;
- tagService.UpdateTagDefinition(toEdit, tagName, tagNamespace);
+ tagService.UpdateTagDefinition(toEdit, tagName, tagNamespace, tagAlias);
StateHasChanged();
}
diff --git a/Services/TagService.cs b/Services/TagService.cs
index a0fd19e..2648bb3 100644
--- a/Services/TagService.cs
+++ b/Services/TagService.cs
@@ -18,11 +18,11 @@ public interface ITagService {
public void AddImplicitTag(TagDefinition tagDef, TagDefinition implicitTagDef);
public void RemoveImplicitTag(Guid tagDef, Guid implicitTagDef);
public void RemoveImplicitTag(TagDefinition tagDef, TagDefinition implicitTagDef);
- public void CreateTagDefinition(string name, string? @namespace);
+ public void CreateTagDefinition(string name, string? @namespace = null, string? alias = null);
public void DeleteTagDefinition(Guid tagDef);
public void DeleteTagDefinition(TagDefinition tagDef);
- public void UpdateTagDefinition(Guid tagDef, string name, string? @namespace);
- public void UpdateTagDefinition(TagDefinition tagDef, string name, string? @namespace);
+ public void UpdateTagDefinition(Guid tagDef, string name, string? @namespace = null, string? alias = null);
+ public void UpdateTagDefinition(TagDefinition tagDef, string name, string? @namespace = null, string? alias = null);
public (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(Guid obj);
public (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(HBObject obj);
public (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(TagDefinition tagDef);
@@ -123,13 +123,14 @@ public class TagService : ITagService {
public void RemoveImplicitTag(TagDefinition tagDef, TagDefinition implicitTagDef) =>
RemoveImplicitTag(tagDef, implicitTagDef);
- public void CreateTagDefinition(string name, string? @namespace) {
+ public void CreateTagDefinition(string name, string? @namespace = null, string? alias = null) {
using var db = dbFactory.CreateDbContext();
TagDefinition tagdef = new() {
Source = TagSource.UserTag,
Namespace = @namespace,
- Name = name
+ Name = name,
+ Alias = alias
};
if(!db.TagDefinitions.Contains(tagdef))
db.TagDefinitions.Add(tagdef);
@@ -156,7 +157,7 @@ public class TagService : ITagService {
public void DeleteTagDefinition(TagDefinition tagDef) =>
DeleteTagDefinition(tagDef.Guid);
- public void UpdateTagDefinition(Guid tagDef, string name, string? @namespace) {
+ public void UpdateTagDefinition(Guid tagDef, string name, string? @namespace = null, string? alias = null) {
using var db = dbFactory.CreateDbContext();
if(string.IsNullOrEmpty(@namespace))
@@ -165,12 +166,13 @@ public class TagService : ITagService {
var tag = db.TagDefinitions.First(td => td.Guid == tagDef);
tag.Name = name;
tag.Namespace = @namespace;
+ tag.Alias = alias;
db.SaveChanges();
}
- public void UpdateTagDefinition(TagDefinition tagDef, string name, string? @namespace) =>
- UpdateTagDefinition(tagDef.Guid, name, @namespace);
+ public void UpdateTagDefinition(TagDefinition tagDef, string name, string? @namespace = null, string? alias = null) =>
+ UpdateTagDefinition(tagDef.Guid, name, @namespace, alias);
private (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(IEnumerable<TagDefinition> tagDefs) {
using var db = dbFactory.CreateDbContext();
diff --git a/Tag.cs b/Tag.cs
index 70d70c9..81c5f67 100644
--- a/Tag.cs
+++ b/Tag.cs
@@ -13,6 +13,7 @@ public class TagDefinition : HBObject {
public TagSource Source { get; set; } = TagSource.Internal;
public string? Namespace { get; set; }
public string Name { get; set; }
+ public string? Alias { get; set;}
public virtual List<TagDefinition> ImplicitTags { get; set; } = new();
}