summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--DbMedia.cs4
-rw-r--r--HyperBooruContext.cs5
-rw-r--r--MediaController.cs8
-rw-r--r--Pages/TagDefinitions.cshtml.cs2
-rw-r--r--Pages/ViewMedia.cshtml27
-rw-r--r--Pages/ViewMedia.cshtml.cs25
-rw-r--r--Pages/ViewMedia.cshtml.css4
-rw-r--r--TagController.cs40
-rw-r--r--wwwroot/styles/global.css36
9 files changed, 127 insertions, 24 deletions
diff --git a/DbMedia.cs b/DbMedia.cs
index 311e412..016e7f7 100644
--- a/DbMedia.cs
+++ b/DbMedia.cs
@@ -13,6 +13,10 @@ public class DbMedia : DbObject {
public string? LongDescription { get; set; }
public virtual List<DbUploadedFile> UploadedFiles { get; set; } = new();
+ public bool IsIngest => Tags
+ .Select(t => t.TagDefinition)
+ .Any(td => td.Source == TagSource.Internal && td.Name == "ingest");
+
public DbMedia() =>
base.ObjectType = ObjectType.Media;
diff --git a/HyperBooruContext.cs b/HyperBooruContext.cs
index fecbc4c..3a9aa0f 100644
--- a/HyperBooruContext.cs
+++ b/HyperBooruContext.cs
@@ -28,5 +28,10 @@ public class HyperBooruDbContext : DbContext {
modelBuilder.Entity<DbTag>().ToTable("Tags");
modelBuilder.Entity<DbMedia>().ToTable("Media");
modelBuilder.Entity<DbUploadedFile>().ToTable("UploadedFiles");
+
+ modelBuilder.Entity<DbTagDefinition>().HasData(new DbTagDefinition[] {
+ new() { ObjectId = -1, Source = TagSource.Internal, Name = "nsfw" },
+ new() { ObjectId = -2, Source = TagSource.Internal, Name = "ingest" }
+ });
}
} \ No newline at end of file
diff --git a/MediaController.cs b/MediaController.cs
index 29a8f88..620b3ee 100644
--- a/MediaController.cs
+++ b/MediaController.cs
@@ -64,7 +64,7 @@ public class MediaController : Controller {
if(w > image.Width || h > image.Height)
return BadRequest("Requested thumbnail size is larger than original media");
- int width = (int) (w is not null ? w : image.Width * h / image.Height);
+ int width = (int) (w is not null ? w : image.Width * h / image.Height);
int height = (int) (h is not null ? h : image.Height * w / image.Width);
var thumbPath = config.GetPath(media, width, height);
@@ -166,11 +166,17 @@ public class MediaController : Controller {
.FirstOrDefault(m => m.Checksum == hash);
if(media is null) {
+ var ingestTagDef = db.TagDefinitions
+ .First(td => td.Source == TagSource.Internal && td.Name == "ingest");
+
media = new() {
Checksum = hash,
MimeType = mime,
UploadedFiles = new() {
fileRecord
+ },
+ Tags = new() {
+ new() { TagDefinition = ingestTagDef }
}
};
diff --git a/Pages/TagDefinitions.cshtml.cs b/Pages/TagDefinitions.cshtml.cs
index e2253d6..afbad87 100644
--- a/Pages/TagDefinitions.cshtml.cs
+++ b/Pages/TagDefinitions.cshtml.cs
@@ -5,7 +5,7 @@ namespace HyperBooru.Pages;
public class TagDefinitionsModel : PageModel {
public IEnumerable<DbTagDefinition> TagDefinitions =>
- db.TagDefinitions;
+ db.TagDefinitions.Where(td => td.Source == TagSource.UserTag);
private HyperBooruDbContext db;
diff --git a/Pages/ViewMedia.cshtml b/Pages/ViewMedia.cshtml
index e37bbf1..e77ec22 100644
--- a/Pages/ViewMedia.cshtml
+++ b/Pages/ViewMedia.cshtml
@@ -115,28 +115,41 @@
}
</table>
<div class="button-container">
- <button onclick="showDeleteDialog(true)">Delete</button>
+ <button onclick="showDeleteDialog(true)" id="delete-button">Delete</button>
+ <button>Apply</button>
</div>
</div>
<div id="metadata-tags">
<table class="data-table">
<tr>
- <th>Source</th>
<th>Namespace</th>
<th>Tag Name</th>
<th></th>
</tr>
- @foreach(var tag in Model.Media.Tags.Select(t => t.TagDefinition)) {
+ @foreach(var tag in Model.UserTags) {
+ bool isImplicit = Model.IsImplicit(tag);
<tr>
- <td>@tag.Source</td>
- <td>@tag.Namespace</td>
- <td>@tag.Name</td>
+ <td>
+ @if(isImplicit) {
+ <i>@tag.Namespace</i>
+ } else {
+ @tag.Namespace
+ }
+ </td>
+ <td>
+ @if(isImplicit) {
+ <i>@tag.Name</i>
+ } else {
+ @tag.Name
+ }
+ </td>
<td><a href="javascript:;" onclick="removeTag(this, '@tag.Guid')">Delete</a></td>
</tr>
}
</table>
<div class="button-container">
- <button onclick="showTagDialog(true)">Add Tag</button>
+ <button onclick="showTagDialog(true)" class="secondary">Add Tag</button>
+ <button onclick="show">Tagging Complete</button>
</div>
</div>
</div>
diff --git a/Pages/ViewMedia.cshtml.cs b/Pages/ViewMedia.cshtml.cs
index 476ea40..76c515b 100644
--- a/Pages/ViewMedia.cshtml.cs
+++ b/Pages/ViewMedia.cshtml.cs
@@ -6,8 +6,10 @@ namespace HyperBooru.Pages;
public class ViewMediaModel : PageModel {
public DbMedia Media { get; private set; }
+ public DbTagDefinition[] UserTags { get; private set; }
+
public IEnumerable<DbTagDefinition> TagDefinitions =>
- db.TagDefinitions;
+ db.TagDefinitions.Where(td => td.Source == TagSource.UserTag);
private HyperBooruDbContext db;
@@ -15,12 +17,27 @@ public class ViewMediaModel : PageModel {
this.db = db;
public IActionResult OnGet([FromQuery(Name = "m")] Guid mediaId) {
- var media = db.Media.First(m => m.Guid == mediaId);
- if(media is null)
+ Media = db.Media.First(m => m.Guid == mediaId);
+ if(Media is null)
return NotFound();
- Media = media;
+ UserTags = GetTagRecursive(
+ Media.Tags
+ .Select(t => t.TagDefinition))
+ .OrderBy(td => td.Namespace)
+ .ThenBy(td => td.Name)
+ .ToArray();
return Page();
}
+
+ public bool IsImplicit(DbTagDefinition tagDef) =>
+ !Media.Tags
+ .Select(t => t.TagDefinition.Guid)
+ .Contains(tagDef.Guid);
+
+ private IEnumerable<DbTagDefinition> GetTagRecursive(IEnumerable<DbTagDefinition> tagDefs) =>
+ tagDefs
+ .Concat(tagDefs.SelectMany(td => GetTagRecursive(td.ImplicitTags)))
+ .DistinctBy(td => td.Guid);
} \ No newline at end of file
diff --git a/Pages/ViewMedia.cshtml.css b/Pages/ViewMedia.cshtml.css
index 622de48..29094b8 100644
--- a/Pages/ViewMedia.cshtml.css
+++ b/Pages/ViewMedia.cshtml.css
@@ -52,6 +52,10 @@ div#metadata-fileinfo > table td {
font-size: 8pt;
}
+div#metadata-fileinfo button#delete-button {
+ background: #ff4848;
+}
+
div#metadata-tags > table td {
font-size: 8pt;
}
diff --git a/TagController.cs b/TagController.cs
index 5c9fa39..6972da2 100644
--- a/TagController.cs
+++ b/TagController.cs
@@ -54,6 +54,46 @@ public class TagController : Controller {
return Ok();
}
+ [HttpPost("{tagId}/implicit/{implicitTagId}")]
+ public IActionResult AddImplicitTag(
+ [FromRoute] Guid tagId,
+ [FromRoute] Guid implicitTagId) {
+
+ var tagDef = db.TagDefinitions.First(td => td.Guid == tagId);
+ var implicitTagDef = db.TagDefinitions.First(td => td.Guid == implicitTagId);
+
+ if(tagDef is null || implicitTagDef is null)
+ return NotFound();
+
+ if(tagDef.ImplicitTags.Select(td => td.Guid).Contains(implicitTagId))
+ return BadRequest();
+
+ tagDef.ImplicitTags.Add(implicitTagDef);
+ db.SaveChanges();
+
+ return Ok();
+ }
+
+ [HttpDelete("{tagId}/implicit/{implicitTagId}")]
+ public IActionResult RemoveImplicitTag(
+ [FromRoute] Guid tagId,
+ [FromRoute] Guid implicitTagId) {
+
+ var tagDef = db.TagDefinitions.First(td => td.Guid == tagId);
+ var implicitTagDef = db.TagDefinitions.First(td => td.Guid == implicitTagId);
+
+ if(tagDef is null || implicitTagDef is null)
+ return NotFound();
+
+ if(!tagDef.ImplicitTags.Select(td => td.Guid).Contains(implicitTagId))
+ return BadRequest();
+
+ tagDef.ImplicitTags.Remove(implicitTagDef);
+ db.SaveChanges();
+
+ return Ok();
+ }
+
[HttpPost("def")]
public void CreateTagDefinition(
[FromForm] string name,
diff --git a/wwwroot/styles/global.css b/wwwroot/styles/global.css
index 969c531..83d76ec 100644
--- a/wwwroot/styles/global.css
+++ b/wwwroot/styles/global.css
@@ -1,15 +1,19 @@
:root {
- --col-accent-pri: #0aa;
- --col-accent-pri-hl: #0cc;
- --col-bg: #222;
- --col-dialog-bg: #333;
- --col-navbar-bg: var(--col-accent-pri);
- --col-button-pri: var(--col-accent-pri);
- --col-button-pri-hl: var(--col-accent-pri-hl);
- --col-button-sec: #555;
- --col-button-sec-hl: #777;
- --col-scrollbar: #666666;
- --col-scrollbar-hover: #aaaaaa;
+ --col-accent-pri: #0aa;
+ --col-accent-pri-hl: #0cc;
+ --col-bg: #222;
+ --col-dialog-bg: #333;
+ --col-navbar-bg: var(--col-accent-pri);
+ --col-button-pri: var(--col-accent-pri);
+ --col-button-pri-hl: var(--col-accent-pri-hl);
+ --col-button-disabled: #777;
+ --col-button-disabled-bg: #444;
+ --col-button-sec: #555;
+ --col-button-sec-hl: #777;
+ --col-button-sec-disabled: #555;
+ --col-button-sec-disabled-bg: #000;
+ --col-scrollbar: #666666;
+ --col-scrollbar-hover: #aaaaaa;
}
body {
@@ -43,6 +47,11 @@ button, input[type=submit] {
user-select: none;
}
+button:disabled {
+ color: var(--col-button-disabled) !important;
+ background: var(--col-button-disabled-bg) !important;
+}
+
button.secondary {
background: var(--col-button-sec);
}
@@ -56,6 +65,11 @@ button.secondary:active {
color: var(--col-button-sec);
}
+button.secondary:disabled {
+ color: var(--col-button-sec-disabled) !important;
+ background: var(--col-button-sec-disabled-bg) !important;
+}
+
button:hover, input[type=submit]:hover {
background: var(--col-button-pri-hl);
}