summaryrefslogtreecommitdiff
path: root/Pages/Component
diff options
context:
space:
mode:
authorJake Mannens <jake@asger.xyz>2023-08-16 14:19:33 +1000
committerJake Mannens <jake@asger.xyz>2023-08-16 14:19:33 +1000
commit596f79318b41b7da60da0f82794f56f306842973 (patch)
treea6523f99fa70ea6da1780347201e06943f56778f /Pages/Component
parent8e94a12be4a56447e78d68c37def772bef8cade4 (diff)
Fixed most existing dialogs
Diffstat (limited to 'Pages/Component')
-rw-r--r--Pages/Component/MediaTagTable.razor69
-rw-r--r--Pages/Component/TagSelectDialog.razor49
2 files changed, 68 insertions, 50 deletions
diff --git a/Pages/Component/MediaTagTable.razor b/Pages/Component/MediaTagTable.razor
index 1bd4de4..d4a4283 100644
--- a/Pages/Component/MediaTagTable.razor
+++ b/Pages/Component/MediaTagTable.razor
@@ -9,24 +9,27 @@
<th>Tag Name</th>
<th></th>
</tr>
- @foreach(var tag in userTags) {
- bool isImplicit = IsImplicit(tag);
+ @foreach(var tagDef in tagDefs) {
<tr>
<td>
- @if(isImplicit) {
- <i>@tag.Namespace</i>
+ @if(implicitTags[tagDef.Guid]) {
+ <i>@tagDef.Namespace</i>
} else {
- @tag.Namespace
+ @tagDef.Namespace
}
</td>
<td>
- @if(isImplicit) {
- <i>@tag.Name</i>
+ @if(implicitTags[tagDef.Guid]) {
+ <i>@tagDef.Name</i>
} else {
- @tag.Name
+ @tagDef.Name
+ }
+ </td>
+ <td>
+ @if(!implicitTags[tagDef.Guid]) {
+ <a href="javascript:;" @onclick=@(() => Delete(tagDef))>Delete</a>
}
</td>
- <td><a href="javascript:;" @onclick=@(() => Delete(tag))>Delete</a></td>
</tr>
}
</table>
@@ -35,32 +38,38 @@
[Parameter]
public Media Media { get; set; }
- private IEnumerable<TagDefinition> userTags {
- get {
- using var db = dbFactory.CreateDbContext();
- if(db.Entry(Media).State == EntityState.Detached)
- db.Attach(Media);
- return GetTagRecursive(
- Media.Tags
- .Select(t => t.TagDefinition))
- .Where(td => td.Source == TagSource.UserTag)
- .OrderBy(td => td.Namespace)
- .ThenBy(td => td.Name)
- .ToArray();
- }
- }
+ private TagDefinition[] tagDefs;
+ private Dictionary<Guid, bool> implicitTags;
- public void Refresh() => StateHasChanged();
+ protected override void OnInitialized() => LoadTagDefs();
- private void Delete(TagDefinition tagDef) {
- tagService.RemoveTag(Media, tagDef);
+ public void Refresh() {
+ LoadTagDefs();
StateHasChanged();
}
- private bool IsImplicit(TagDefinition tagDef) =>
- !Media.Tags
- .Select(t => t.TagDefinition.Guid)
- .Contains(tagDef.Guid);
+ private void Delete(TagDefinition tagDef) {
+ tagService.RemoveTag(Media.Guid, tagDef.Guid);
+ Refresh();
+ }
+
+ private void LoadTagDefs() {
+ using var db = dbFactory.CreateDbContext();
+ var media = db.Media.First(m => m.ObjectId == Media.ObjectId);
+
+ tagDefs = GetTagRecursive(
+ media.Tags
+ .Select(t => t.TagDefinition))
+ .Where(td => td.Source == TagSource.UserTag)
+ .OrderBy(td => td.Namespace)
+ .ThenBy(td => td.Name)
+ .ToArray();
+
+ implicitTags = new(tagDefs
+ .Select(td => new KeyValuePair<Guid, bool>(
+ td.Guid,
+ !media.Tags.Select(t => t.TagDefinition.Guid).Contains(td.Guid))));
+}
private IEnumerable<TagDefinition> GetTagRecursive(IEnumerable<TagDefinition> tagDefs) =>
tagDefs
diff --git a/Pages/Component/TagSelectDialog.razor b/Pages/Component/TagSelectDialog.razor
index 590c8f2..ebf6d58 100644
--- a/Pages/Component/TagSelectDialog.razor
+++ b/Pages/Component/TagSelectDialog.razor
@@ -1,13 +1,20 @@
-@inject HBContext db
+@inject IDbContextFactory<HBContext> dbFactory
+@implements IDisposable
<link rel="stylesheet" href="@(nameof(HyperBooru)).styles.css"/>
<Dialog Title=@(Title ?? "Select one or more tag(s)") @ref=dialog>
<input type="text" placeholder="Search"/>
<div class="tag-definitions">
- @foreach(var tagDef in tagDefinitions) {
- <input type="checkbox" id="tagDef-@tagDef.Guid" @onchange=@(e => Checked(tagDef, e.Value))/>
- <label for="tagDef-@tagDef.Guid">@tagDef.Name</label>
+ @for(int i = 0; i < tagDefinitions.Count(); i++) {
+ var local = i;
+ <input
+ type="checkbox"
+ id="tagDef-@tagDefinitions[i].tagDefinition.Guid"
+ @bind=tagDefinitions[local].selected />
+ <label for="tagDef-@tagDefinitions[i].tagDefinition.Guid">
+ @tagDefinitions[i].tagDefinition.Name
+ </label>
}
</div>
<div class="button-container">
@@ -28,32 +35,34 @@
set => visible = dialog.Visible = value;
}
- private bool visible;
+ private (TagDefinition tagDefinition, bool selected)[] tagDefinitions;
- private Dialog dialog;
+ private HBContext db;
- private IEnumerable<TagDefinition> tagDefinitions => db.TagDefinitions
- .Where(td => td.Source == TagSource.UserTag)
- .OrderBy(td => td.Name);
+ private Dialog dialog;
- private List<TagDefinition> selected = new();
+ private bool visible;
public void Show() => Visible = true;
public void Hide() => Visible = false;
+ protected override void OnInitialized() {
+ db = dbFactory.CreateDbContext();
+ tagDefinitions = db.TagDefinitions
+ .Where(td => td.Source == TagSource.UserTag)
+ .OrderBy(td => td.Name)
+ .Select(td => new Tuple<TagDefinition, bool>(td, false).ToValueTuple())
+ .ToArray();
+ }
+
private async void Submit() {
- await OnSubmit.InvokeAsync(selected.ToArray());
- selected.Clear();
+ await OnSubmit.InvokeAsync(
+ tagDefinitions.Select(e => e.tagDefinition).ToArray());
+ for(int i = 0; i < tagDefinitions.Count(); i++)
+ tagDefinitions[i].selected = false;
Hide();
StateHasChanged();
}
- private void Checked(TagDefinition tagDef, object? isChecked) {
- if(isChecked is bool && (bool) isChecked == true)
- if (!selected.Contains(tagDef))
- selected.Add(tagDef);
- else
- if (selected.Contains(tagDef))
- selected.Remove(tagDef);
- }
+ public void Dispose() => db.Dispose();
}