summaryrefslogtreecommitdiff
path: root/Pages
diff options
context:
space:
mode:
authorJake Mannens <jake@asger.xyz>2023-08-22 10:00:21 +1000
committerJake Mannens <jake@asger.xyz>2023-08-22 10:00:21 +1000
commitbe4496b110e68e2c5a8f76f8ed770e9818befd68 (patch)
tree25f597f34eaf357bd90a5b6b9b5440b7bf699ce1 /Pages
parentc29bdd4a9ec782411f57e3c798e1bb01ca7d417d (diff)
Finalised initial implementation of NSFW tag filtering
Diffstat (limited to 'Pages')
-rw-r--r--Pages/Component/NsfwSwitch.razor8
-rw-r--r--Pages/Component/Switch.razor5
-rw-r--r--Pages/Component/TagSelectDialog.razor18
-rw-r--r--Pages/Gallery.razor44
-rw-r--r--Pages/TagDefinitions.razor29
-rw-r--r--Pages/Upload.razor14
-rw-r--r--Pages/Upload.razor.css9
7 files changed, 93 insertions, 34 deletions
diff --git a/Pages/Component/NsfwSwitch.razor b/Pages/Component/NsfwSwitch.razor
new file mode 100644
index 0000000..d4e809b
--- /dev/null
+++ b/Pages/Component/NsfwSwitch.razor
@@ -0,0 +1,8 @@
+@inject IUserStateService userState
+
+<Switch InitialValue=userState.ShowNsfw OnToggle=ToggleNsfw/>
+
+@code {
+ private void ToggleNsfw(bool showNsfw) =>
+ userState.ShowNsfw = showNsfw;
+} \ No newline at end of file
diff --git a/Pages/Component/Switch.razor b/Pages/Component/Switch.razor
index ffb3543..d11ac81 100644
--- a/Pages/Component/Switch.razor
+++ b/Pages/Component/Switch.razor
@@ -3,6 +3,7 @@
<label>
<input
type="checkbox"
+ checked=@InitialValue
@onchange=@(e => OnToggle.InvokeAsync((e.Value as bool?) ?? false))
hidden/>
<div class="switch-outer">
@@ -11,5 +12,9 @@
</label>
@code {
+ [Parameter]
+ public bool InitialValue { get; set; } = false;
+
+ [Parameter]
public EventCallback<bool> OnToggle { get; set; }
}
diff --git a/Pages/Component/TagSelectDialog.razor b/Pages/Component/TagSelectDialog.razor
index d9e297a..94693e5 100644
--- a/Pages/Component/TagSelectDialog.razor
+++ b/Pages/Component/TagSelectDialog.razor
@@ -1,4 +1,6 @@
@inject IDbContextFactory<HBContext> dbFactory
+@inject ITagService tagService
+@inject IUserStateService userState
@implements IDisposable
<link rel="stylesheet" href="@(nameof(HyperBooru)).styles.css"/>
@@ -53,7 +55,10 @@
public void Show() => Visible = true;
public void Hide() => Visible = false;
- protected override void OnInitialized() => LoadTags();
+ protected override void OnInitialized() {
+ userState.ShowNsfwChanged += ShowNsfwChanged;
+ LoadTags();
+ }
private void LoadTags() {
db = dbFactory.CreateDbContext();
@@ -63,6 +68,11 @@
tagDefinitions = db.TagDefinitions
.Where(td => td.Source == TagSource.UserTag)
.OrderBy(td => td.Name)
+ .AsEnumerable()
+ .Where(td => userState.ShowNsfw || !tagService
+ .GetAllTags(td)
+ .Select(e => e.tagDefinition.Guid)
+ .Contains(HBContext.NsfwTag))
.Select(td => new Tuple<TagDefinition, bool>(
td,
selected.Contains(td.Guid)).ToValueTuple())
@@ -81,5 +91,11 @@
StateHasChanged();
}
+ public async void ShowNsfwChanged(object? sender, bool showNsfw) =>
+ await InvokeAsync(() => {
+ LoadTags();
+ StateHasChanged();
+ });
+
public void Dispose() => db.Dispose();
}
diff --git a/Pages/Gallery.razor b/Pages/Gallery.razor
index fb58ca0..b07c5e3 100644
--- a/Pages/Gallery.razor
+++ b/Pages/Gallery.razor
@@ -1,7 +1,9 @@
@page "/"
@page "/Gallery"
@inject IDbContextFactory<HBContext> dbFactory
+@inject ITagService tagService
@inject ISearchService searchService
+@inject IUserStateService userState
<PageTitle>@(Query is null ? "Gallery" : "Search Results")</PageTitle>
@@ -29,24 +31,42 @@
private Media[] Media;
+ protected override void OnInitialized() =>
+ userState.ShowNsfwChanged += ShowNsfwChanged;
+
protected override void OnParametersSet() => LoadMedia();
private void LoadMedia() {
using var db = dbFactory.CreateDbContext();
+ IEnumerable<Media> media = db.Media
+ .OrderByDescending(m => m.ObjectId)
+ .ToArray();
+
+ if(Query is not null)
+ media = searchService.Search(Query)
+ .OrderByDescending(m => m.ObjectId);
+
if(Ingest is not null && Ingest == true) {
- Media = db.Media
- .OrderByDescending(m => m.ObjectId)
- .ToArray()
- .Where(m => m.IsIngest)
- .ToArray();
- } else {
- if(Query is null)
- Media = db.Media
- .OrderByDescending(m => m.ObjectId)
- .ToArray();
- else
- Media = searchService.Search(Query);
+ media = media
+ .AsEnumerable()
+ .Where(m => m.IsIngest);
}
+
+ if(!userState.ShowNsfw)
+ media = media
+ .AsEnumerable()
+ .Where(m => !tagService.GetAllTags(m)
+ .Select(e => e.tagDefinition.Guid)
+ .Contains(HBContext.NsfwTag));
+
+ Media = media.ToArray();
+ }
+
+ private async void ShowNsfwChanged(object? sender, bool showNsfw) {
+ await InvokeAsync(() => {
+ LoadMedia();
+ StateHasChanged();
+ });
}
}
diff --git a/Pages/TagDefinitions.razor b/Pages/TagDefinitions.razor
index a9e1ebe..7d9c3a1 100644
--- a/Pages/TagDefinitions.razor
+++ b/Pages/TagDefinitions.razor
@@ -1,6 +1,7 @@
@page "/TagDefinitions"
@inject IDbContextFactory<HBContext> dbFactory
@inject ITagService tagService
+@inject IUserStateService userState
<PageTitle>Tag Definitions</PageTitle>
@@ -23,7 +24,10 @@
<td>@tagDef.Name</td>
<td>
<i>
- @(string.Join(", ", tagDef.ImplicitTags.Select(it => it.Name).Order()))
+ @(string.Join(", ", tagDef.ImplicitTags
+ .Where(it => it.Source == TagSource.UserTag)
+ .Select(it => it.Name)
+ .Order()))
</i>
</td>
<td>
@@ -35,7 +39,7 @@
<a href="javascript:;" @onclick=@(() => PromptImplicitTags(tagDef))>
Implicit Tags
</a>
- @if(tagDef.ImplicitTags.Select(td => td.Guid).Contains(HBContext.NSFWTag)) {
+ @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>
@@ -100,8 +104,17 @@
.Where(td => td.Source == TagSource.UserTag)
.OrderBy(td => td.Namespace)
.ThenBy(td => td.Name)
+ .AsEnumerable()
+ .Where(td => userState.ShowNsfw || !tagService
+ .GetAllTags(td)
+ .Select(td => td.tagDefinition.Guid)
+ .Contains(HBContext.NsfwTag))
.ToArray();
+ protected override void OnInitialized() =>
+ userState.ShowNsfwChanged += ShowNsfwChanged;
+
+
private void CreateTagDefinition() {
if(string.IsNullOrEmpty(tagNamespace))
tagNamespace = null;
@@ -155,11 +168,13 @@
}
private void SetNsfw(TagDefinition tagDef, bool nsfw) {
- if(nsfw) {
- tagService.AddTag(tagDef.Guid, HBContext.NSFWTag);
- } else {
- tagService.RemoveTag(tagDef.Guid, HBContext.NSFWTag);
- }
+ if(nsfw)
+ tagService.AddImplicitTag(tagDef.Guid, HBContext.NsfwTag);
+ else
+ tagService.RemoveImplicitTag(tagDef.Guid, HBContext.NsfwTag);
StateHasChanged();
}
+
+ private async void ShowNsfwChanged(object? sender, bool showNsfw) =>
+ await InvokeAsync(() => StateHasChanged());
}
diff --git a/Pages/Upload.razor b/Pages/Upload.razor
index 33153d2..c139aef 100644
--- a/Pages/Upload.razor
+++ b/Pages/Upload.razor
@@ -2,20 +2,10 @@
<link rel="stylesheet" href="@(nameof(HyperBooru)).styles.css"/>
-<div id="dropzone" class="@((dropHover ? "drop-hover" : ""))">
- <InputFile
- multiple
- title=""
- accept="image/*"
- OnChange=FileInputChange
- @ondragenter=@(() => dropHover = true)
- @ondragleave=@(() => dropHover = false)/>
+<div id="dropzone">
<p>Drag a file to upload it</p>
+ <input type="file" accept="image/*"/>
</div>
@code {
- private bool dropHover = false;
-
- private void FileInputChange(IFileListEntry[] files) {
- }
} \ No newline at end of file
diff --git a/Pages/Upload.razor.css b/Pages/Upload.razor.css
index 4064467..76891de 100644
--- a/Pages/Upload.razor.css
+++ b/Pages/Upload.razor.css
@@ -6,6 +6,7 @@
position: relative;
top: 50%;
transform: translate(-50%, -50%);
+ transition: border-color 0.1s linear;
width: 700px;
}
@@ -19,10 +20,14 @@ div#dropzone p {
transform: translate(-50%, -50%);
}
-div#dropzone.drop-hover {
+div#dropzone input {
+ display: none;
+}
+
+div#dropzone:hover {
border: 3px dashed white;
}
-div#dropzone.drop-hover p {
+div#dropzone:hover p {
color: white;
} \ No newline at end of file