summaryrefslogtreecommitdiff
path: root/Pages
diff options
context:
space:
mode:
authorJake Mannens <jake@asger.xyz>2023-08-20 22:59:09 +1000
committerJake Mannens <jake@asger.xyz>2025-08-18 17:03:21 +1000
commit4558ed9d6cbc59229cd56cc7a6c36b1df0b8199a (patch)
tree24b27334ed8dc3cbcdc6cca9def75bca176c8764 /Pages
parentd7bc8b58f750c1a5c629915ed2097e477d204a67 (diff)
NSFW tagging and tag editing
Diffstat (limited to 'Pages')
-rw-r--r--Pages/Component/MediaTagTable.razor7
-rw-r--r--Pages/Component/Switch.razor15
-rw-r--r--Pages/Component/Switch.razor.css25
-rw-r--r--Pages/TagDefinitions.razor54
-rw-r--r--Pages/TagDefinitions.razor.css4
-rw-r--r--Pages/ViewMedia.razor97
-rw-r--r--Pages/ViewMedia.razor.css2
7 files changed, 149 insertions, 55 deletions
diff --git a/Pages/Component/MediaTagTable.razor b/Pages/Component/MediaTagTable.razor
index 278304d..ce42e48 100644
--- a/Pages/Component/MediaTagTable.razor
+++ b/Pages/Component/MediaTagTable.razor
@@ -28,6 +28,8 @@
<td>
@if(!e.isImplicit) {
<a href="javascript:;" @onclick=@(() => Delete(e.tagDef))>Delete</a>
+ } else {
+ <a href="javascript:;" @onclick=@(() => MakeExplicit(e.tagDef))>Make Explicit</a>
}
</td>
</tr>
@@ -60,4 +62,9 @@
.Where(e => e.tagDefinition.Source == TagSource.UserTag)
.ToArray();
}
+
+ private void MakeExplicit(TagDefinition tagDef) {
+ tagService.AddTag(Media, tagDef);
+ Refresh();
+ }
}
diff --git a/Pages/Component/Switch.razor b/Pages/Component/Switch.razor
new file mode 100644
index 0000000..ffb3543
--- /dev/null
+++ b/Pages/Component/Switch.razor
@@ -0,0 +1,15 @@
+<link rel="stylesheet" href="@(nameof(HyperBooru)).styles.css"/>
+
+<label>
+ <input
+ type="checkbox"
+ @onchange=@(e => OnToggle.InvokeAsync((e.Value as bool?) ?? false))
+ hidden/>
+ <div class="switch-outer">
+ <div class="switch-inner"/>
+ </div>
+</label>
+
+@code {
+ public EventCallback<bool> OnToggle { get; set; }
+}
diff --git a/Pages/Component/Switch.razor.css b/Pages/Component/Switch.razor.css
new file mode 100644
index 0000000..6b1f5d5
--- /dev/null
+++ b/Pages/Component/Switch.razor.css
@@ -0,0 +1,25 @@
+div.switch-outer {
+ background: var(--col-switch-bg);
+ border-radius: 20px;
+ border: 1px solid var(--col-switch-fg);
+ cursor: pointer;
+ height: 20px;
+ transition: background 0.1s linear;
+ width: 40px;
+}
+
+div.switch-inner {
+ background: var(--col-switch-fg);
+ border-radius: 20px;
+ height: 20px;
+ transition: margin-left 0.1s linear;
+ width: 20px;
+}
+
+input:checked + div.switch-outer {
+ background: var(--col-switch-bg-hl);
+}
+
+input:checked + div.switch-outer > div.switch-inner {
+ margin-left: 20px;
+}
diff --git a/Pages/TagDefinitions.razor b/Pages/TagDefinitions.razor
index cb0a17c..a9e1ebe 100644
--- a/Pages/TagDefinitions.razor
+++ b/Pages/TagDefinitions.razor
@@ -6,6 +6,10 @@
<link rel="stylesheet" type="text/css" href="@(nameof(HyperBooru)).styles.css"/>
+<div class="button-container">
+ <button @onclick=@(() => createTagDialog.Show())>Create</button>
+</div>
+
<table id="tag-definitions" class="data-table">
<tr>
<th>Namespace</th>
@@ -23,21 +27,24 @@
</i>
</td>
<td>
+ <a href="/Gallery?q=@tagDef.Name">Search</a>
+ <a href="javascript:;" @onclick=@(() => PromptToEdit(tagDef))>Edit</a>
<a href="javascript:;" @onclick=@(() => PromptToDelete(tagDef))>
Delete
</a>
<a href="javascript:;" @onclick=@(() => PromptImplicitTags(tagDef))>
Implicit Tags
</a>
+ @if(tagDef.ImplicitTags.Select(td => td.Guid).Contains(HBContext.NSFWTag)) {
+ <a href="javascript:;" @onclick=@(() => SetNsfw(tagDef, false))>Make SFW</a>
+ } else {
+ <a href="javascript:;" @onclick=@(() => SetNsfw(tagDef, true))>Make NSFW</a>
+ }
</td>
</tr>
}
</table>
-<div class="button-container">
- <button @onclick=@(() => createTagDialog.Show())>Create</button>
-</div>
-
<Dialog Title="Create a new tag definition" @ref=createTagDialog>
<form @onsubmit=CreateTagDefinition>
<label>Name</label>
@@ -51,6 +58,19 @@
</form>
</Dialog>
+<Dialog Title="Edit tag" @ref=editTagDialog>
+ <form @onsubmit=EditTagDefinition>
+ <label>Name</label>
+ <input type="text" @bind=tagName required/>
+ <label>Namespace</label>
+ <input type="text" @bind=tagNamespace/>
+ <div class="button-container">
+ <button class="secondary" @onclick=@(() => editTagDialog.Hide())>Cancel</button>
+ <button type="submit">Apply</button>
+ </div>
+ </form>
+</Dialog>
+
<Dialog Title="Are you sure you want to delete this tag definition?" @ref=deleteTagDialog>
<div class="button-container">
<button @onclick=@(() => deleteTagDialog.Hide()) class="secondary">Cancel</button>
@@ -65,12 +85,14 @@
@code {
private Dialog createTagDialog;
private Dialog deleteTagDialog;
+ private Dialog editTagDialog;
private TagSelectDialog implicitTagDialog;
private string tagName;
private string? tagNamespace;
private TagDefinition? toDelete;
+ private TagDefinition? toEdit;
private TagDefinition? toEditImplicit;
private TagDefinition[] tagDefinitions =>
@@ -89,6 +111,21 @@
StateHasChanged();
}
+ private void PromptToEdit(TagDefinition toEdit) {
+ this.toEdit = toEdit;
+ tagName = toEdit.Name;
+ tagNamespace = toEdit.Namespace;
+ editTagDialog.Show();
+ }
+
+ private void EditTagDefinition() {
+ if(toEdit is null)
+ return;
+
+ tagService.UpdateTagDefinition(toEdit, tagName, tagNamespace);
+ StateHasChanged();
+ }
+
private void PromptToDelete(TagDefinition toDelete) {
this.toDelete = toDelete;
deleteTagDialog.Show();
@@ -116,4 +153,13 @@
tagService.SetImplicitTags(toEditImplicit, tagDefs);
StateHasChanged();
}
+
+ private void SetNsfw(TagDefinition tagDef, bool nsfw) {
+ if(nsfw) {
+ tagService.AddTag(tagDef.Guid, HBContext.NSFWTag);
+ } else {
+ tagService.RemoveTag(tagDef.Guid, HBContext.NSFWTag);
+ }
+ StateHasChanged();
+ }
}
diff --git a/Pages/TagDefinitions.razor.css b/Pages/TagDefinitions.razor.css
index 93001c7..933cb4f 100644
--- a/Pages/TagDefinitions.razor.css
+++ b/Pages/TagDefinitions.razor.css
@@ -5,8 +5,4 @@
div.button-container {
display: flex;
justify-content: flex-end;
-}
-
-table#tag-definitions td:first-child {
- font-family: 'Lucida Console';
} \ No newline at end of file
diff --git a/Pages/ViewMedia.razor b/Pages/ViewMedia.razor
index 68cc313..e559460 100644
--- a/Pages/ViewMedia.razor
+++ b/Pages/ViewMedia.razor
@@ -10,51 +10,56 @@
<div id="content">
<img src="/media/@(media.Guid)"/>
<div id="metadata">
- <TabContainer>
- <TabPane Title="Media Info">
- <div id="metadata-fileinfo">
- <p>Title: <i>@(@media.ShortDescription ?? "None")</i></p>
- <p>Description: <i>@(media.LongDescription ?? "None")</i></p>
- <p id="metadata-uploadhistory">Upload history</p>
- <hr />
- <table class="data-table">
- <tr>
- <th>Created On</th>
- <th>Last Write</th>
- <th>Uploaded On</th>
- <th>Filename</th>
- <th>Original Checksum</th>
- </tr>
- @foreach(var file in media.UploadedFiles) {
- <tr>
- <td>@(file.CreateTime?.ToString() ?? "N/A")</td>
- <td>@(file.LastWriteTime?.ToString() ?? "N/A")</td>
- <td>@file.UploadTime</td>
- <td>@file.Filename</td>
- <td>@file.OriginalChecksum</td>
- </tr>
- }
- </table>
- <div class="button-container">
- <button @onclick=@(() => deleteDialog.Show()) class="warning">Delete</button>
- <button>Apply</button>
- </div>
- </div>
- </TabPane>
- <TabPane Title="Tags">
- <div id="metadata-tags">
- <MediaTagTable Media=media @ref=mediaTagTable/>
- <div class="button-container">
- <button @onclick=@(() => tagDialog.Show()) class="secondary">Add Tag</button>
- @if(media.IsIngest) {
- <button @onclick=@(() => SetIngest(false))>Mark Tagging Complete</button>
- } else {
- <button class="secondary" @onclick=@(() => SetIngest(true))>Mark Tagging Incomplete</button>
- }
- </div>
- </div>
- </TabPane>
- </TabContainer>
+ <div id="metadata-fileinfo">
+ @if(true) {
+ <label>
+ Title:
+ <input type="text" style="width:100%;"/>
+ </label>
+ <p>Description:</p>
+ <textarea/>
+ } else {
+ <p>Title: <i>@(@media.ShortDescription ?? "None")</i></p>
+ <p>Description: <i>@(media.LongDescription ?? "None")</i></p>
+ }
+ <p class="heading">Upload history</p>
+ <hr/>
+ <table class="data-table">
+ <tr>
+ <th>Created On</th>
+ <th>Last Write</th>
+ <th>Uploaded On</th>
+ <th>Filename</th>
+ <th>Original Checksum</th>
+ </tr>
+ @foreach(var file in media.UploadedFiles) {
+ <tr>
+ <td>@(file.CreateTime?.ToString() ?? "N/A")</td>
+ <td>@(file.LastWriteTime?.ToString() ?? "N/A")</td>
+ <td>@file.UploadTime</td>
+ <td>@file.Filename</td>
+ <td>@file.OriginalChecksum</td>
+ </tr>
+ }
+ </table>
+ <div class="button-container">
+ <button @onclick=@(() => deleteDialog.Show()) class="warning">Delete</button>
+ <button>Apply</button>
+ </div>
+ </div>
+ <div id="metadata-tags">
+ <p class="heading">Tags</p>
+ <hr/>
+ <MediaTagTable Media=media @ref=mediaTagTable/>
+ <div class="button-container">
+ <button @onclick=@(() => tagDialog.Show()) class="secondary">Add Tag</button>
+ @if(media.IsIngest) {
+ <button @onclick=@(() => SetIngest(false))>Mark Tagging Complete</button>
+ } else {
+ <button class="secondary" @onclick=@(() => SetIngest(true))>Mark Tagging Incomplete</button>
+ }
+ </div>
+ </div>
</div>
</div>
@@ -105,7 +110,7 @@
private void SetIngest(bool ingest) {
var ingestTag = db.TagDefinitions
- .First(td => td.Source == TagSource.Internal && td.Name == "ingest");
+ .First(td => td.Guid == HBContext.IngestTag);
if(!ingest)
media.Tags.RemoveAll(t => t.TagDefinition.Guid == ingestTag.Guid);
diff --git a/Pages/ViewMedia.razor.css b/Pages/ViewMedia.razor.css
index 8a59041..8a6a95a 100644
--- a/Pages/ViewMedia.razor.css
+++ b/Pages/ViewMedia.razor.css
@@ -24,7 +24,7 @@ div#metadata-fileinfo > table td {
font-size: 8pt;
}
-p#metadata-uploadhistory {
+p.heading {
margin-top: 30px;
}