diff options
| author | Jake Mannens <jake@asger.xyz> | 2023-08-22 10:00:21 +1000 |
|---|---|---|
| committer | Jake Mannens <jake@asger.xyz> | 2023-08-22 10:00:21 +1000 |
| commit | be4496b110e68e2c5a8f76f8ed770e9818befd68 (patch) | |
| tree | 25f597f34eaf357bd90a5b6b9b5440b7bf699ce1 /Pages | |
| parent | c29bdd4a9ec782411f57e3c798e1bb01ca7d417d (diff) | |
Finalised initial implementation of NSFW tag filtering
Diffstat (limited to 'Pages')
| -rw-r--r-- | Pages/Component/NsfwSwitch.razor | 8 | ||||
| -rw-r--r-- | Pages/Component/Switch.razor | 5 | ||||
| -rw-r--r-- | Pages/Component/TagSelectDialog.razor | 18 | ||||
| -rw-r--r-- | Pages/Gallery.razor | 44 | ||||
| -rw-r--r-- | Pages/TagDefinitions.razor | 29 | ||||
| -rw-r--r-- | Pages/Upload.razor | 14 | ||||
| -rw-r--r-- | Pages/Upload.razor.css | 9 |
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 |
