Event Widget Update (#1098)
* Took care of some notes in the code * Fixed an issue where Extra might get flagged as special too early, if in a word like Extraordinary * Moved Tag cleanup code into Scanner service. Added a SplitQuery to another heavy API. Refactored Scan loop to remove parallelism and use async instead. * Lots of rework on the codebase to support detailed messages and easier management of message sending. Need to take a break on this work. * Progress is being made, but slowly. Code is broken in this commit. * Progress is being made, but slowly. Code is broken in this commit. * Fixed merge issue * Fixed unit tests * CoverUpdate is now hooked into new ProgressEvent structure * Refactored code to remove custom observables and have everything use standard messages$ * Refactored a ton of instances to NotificationProgressEvent style and tons of the UI to respect that too. UI is still a bit buggy, but wholistically the work is done. * Working much better. Sometimes events come in too fast. Currently cover update progress doesn't display on UI * Fixed unit tests * Removed SignalREvent to minimize internal event types. Updated the UI to use progress bars. Finished SiteThemeService. * Merged metadata refresh progress events and changed library scan events to merge cleaner in the UI * Changed RefreshMetadataProgress to CoverUpdateProgress to reflect the event better. * Theme Cleanup (#1089) * Fixed e-ink theme not properly applying correctly * Fixed some seed changes. Changed card checkboxes to use our themed ones * Fixed recently added carousel not going to recently-added page * Fixed an issue where no results found would show when searching for a library name * Cleaned up list a bit, typeahead dropdown still needs work * Added a TODO to streamline series-card component * Removed ng-lazyload-image module since we don't use it. We use lazysizes * Darken card on hover * Fixing accordion focus style * ux pass updates - Fixed typeahead width - Fixed changelog download buttons - Fixed a select - Fixed various input box-shadows - Fixed all anchors to only have underline on hover - Added navtab hover and active effects * more ux pass - Fixed spacing on theme cards - Fixed some light theme issues - Exposed text-muted-color for theme card subtitle color * UX pass fixes - Changed back to bright green for primary on dark theme - Changed fa icon to black on e-ink * Merged changelog component * Fixed anchor buttons text decoration * Changed nav tabs to have a background color instead of open active state * When user is not authenticated, make sure we set default theme (dark) * Cleanup on carousel * Updated Users tab to use small buttons with icons to align with Library tab * Cleaned up brand to not underline, removed default link underline on hover in dropdown and pill tabs * Fixed collection detail posters not rendering Co-authored-by: Robbie Davis <robbie@therobbiedavis.com> * Bump versions by dotnet-bump-version. * Tweaked some of the emitting code * Some css, but pretty bad. Robbie please save me * Removed a todo * styling update * Only send filename on FileScanProgress * Some console.log spam cleanup * Various updates * Show events widget activity based on activeEvents * progress bar color updates * Code cleanup Co-authored-by: Robbie Davis <robbie@therobbiedavis.com>
This commit is contained in:
parent
d24620fd15
commit
eddbb7ab18
49 changed files with 1022 additions and 463 deletions
|
|
@ -1,16 +1,90 @@
|
|||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using API.DTOs.Update;
|
||||
using API.Entities;
|
||||
|
||||
namespace API.SignalR
|
||||
{
|
||||
public static class MessageFactory
|
||||
{
|
||||
/// <summary>
|
||||
/// An update is available for the Kavita instance
|
||||
/// </summary>
|
||||
public const string UpdateAvailable = "UpdateAvailable";
|
||||
/// <summary>
|
||||
/// Used to tell when a scan series completes
|
||||
/// </summary>
|
||||
public const string ScanSeries = "ScanSeries";
|
||||
/// <summary>
|
||||
/// Event sent out during Refresh Metadata for progress tracking
|
||||
/// </summary>
|
||||
private const string CoverUpdateProgress = "CoverUpdateProgress";
|
||||
/// <summary>
|
||||
/// Series is added to server
|
||||
/// </summary>
|
||||
public const string SeriesAdded = "SeriesAdded";
|
||||
/// <summary>
|
||||
/// Series is removed from server
|
||||
/// </summary>
|
||||
public const string SeriesRemoved = "SeriesRemoved";
|
||||
/// <summary>
|
||||
/// When a user is connects/disconnects from server
|
||||
/// </summary>
|
||||
public const string OnlineUsers = "OnlineUsers";
|
||||
/// <summary>
|
||||
/// When a series is added to a collection
|
||||
/// </summary>
|
||||
public const string SeriesAddedToCollection = "SeriesAddedToCollection";
|
||||
/// <summary>
|
||||
/// When an error occurs during a scan library task
|
||||
/// </summary>
|
||||
public const string ScanLibraryError = "ScanLibraryError";
|
||||
/// <summary>
|
||||
/// Event sent out during backing up the database
|
||||
/// </summary>
|
||||
private const string BackupDatabaseProgress = "BackupDatabaseProgress";
|
||||
/// <summary>
|
||||
/// Event sent out during cleaning up temp and cache folders
|
||||
/// </summary>
|
||||
private const string CleanupProgress = "CleanupProgress";
|
||||
/// <summary>
|
||||
/// Event sent out during downloading of files
|
||||
/// </summary>
|
||||
private const string DownloadProgress = "DownloadProgress";
|
||||
/// <summary>
|
||||
/// A cover was updated
|
||||
/// </summary>
|
||||
public const string CoverUpdate = "CoverUpdate";
|
||||
/// <summary>
|
||||
/// A custom site theme was removed or added
|
||||
/// </summary>
|
||||
private const string SiteThemeProgress = "SiteThemeProgress";
|
||||
/// <summary>
|
||||
/// A type of event that has progress (determinate or indeterminate).
|
||||
/// The underlying event will have a name to give details on how to handle.
|
||||
/// </summary>
|
||||
public const string NotificationProgress = "NotificationProgress";
|
||||
/// <summary>
|
||||
/// Event sent out when Scan Loop is parsing a file
|
||||
/// </summary>
|
||||
private const string FileScanProgress = "FileScanProgress";
|
||||
/// <summary>
|
||||
/// A generic error that can occur in background processing
|
||||
/// </summary>
|
||||
public const string Error = "Error";
|
||||
/// <summary>
|
||||
/// When DB updates are occuring during a library/series scan
|
||||
/// </summary>
|
||||
private const string ScanProgress = "ScanProgress";
|
||||
|
||||
|
||||
public static SignalRMessage ScanSeriesEvent(int seriesId, string seriesName)
|
||||
{
|
||||
return new SignalRMessage()
|
||||
{
|
||||
Name = SignalREvents.ScanSeries,
|
||||
Name = ScanSeries,
|
||||
Body = new
|
||||
{
|
||||
SeriesId = seriesId,
|
||||
|
|
@ -23,7 +97,7 @@ namespace API.SignalR
|
|||
{
|
||||
return new SignalRMessage()
|
||||
{
|
||||
Name = SignalREvents.SeriesAdded,
|
||||
Name = SeriesAdded,
|
||||
Body = new
|
||||
{
|
||||
SeriesId = seriesId,
|
||||
|
|
@ -37,7 +111,7 @@ namespace API.SignalR
|
|||
{
|
||||
return new SignalRMessage()
|
||||
{
|
||||
Name = SignalREvents.SeriesRemoved,
|
||||
Name = SeriesRemoved,
|
||||
Body = new
|
||||
{
|
||||
SeriesId = seriesId,
|
||||
|
|
@ -47,11 +121,15 @@ namespace API.SignalR
|
|||
};
|
||||
}
|
||||
|
||||
public static SignalRMessage ScanLibraryProgressEvent(int libraryId, float progress)
|
||||
public static SignalRMessage CoverUpdateProgressEvent(int libraryId, float progress, string eventType, string subtitle = "")
|
||||
{
|
||||
return new SignalRMessage()
|
||||
{
|
||||
Name = SignalREvents.ScanLibraryProgress,
|
||||
Name = CoverUpdateProgress,
|
||||
Title = "Refreshing Covers",
|
||||
SubTitle = subtitle,
|
||||
EventType = eventType,
|
||||
Progress = ProgressType.Determinate,
|
||||
Body = new
|
||||
{
|
||||
LibraryId = libraryId,
|
||||
|
|
@ -61,37 +139,40 @@ namespace API.SignalR
|
|||
};
|
||||
}
|
||||
|
||||
public static SignalRMessage RefreshMetadataProgressEvent(int libraryId, float progress)
|
||||
public static SignalRMessage BackupDatabaseProgressEvent(float progress, string subtitle = "")
|
||||
{
|
||||
return new SignalRMessage()
|
||||
{
|
||||
Name = SignalREvents.RefreshMetadataProgress,
|
||||
Body = new
|
||||
Name = BackupDatabaseProgress,
|
||||
Title = "Backing up Database",
|
||||
SubTitle = subtitle,
|
||||
EventType = progress switch
|
||||
{
|
||||
LibraryId = libraryId,
|
||||
Progress = progress,
|
||||
EventTime = DateTime.Now
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
public static SignalRMessage BackupDatabaseProgressEvent(float progress)
|
||||
{
|
||||
return new SignalRMessage()
|
||||
{
|
||||
Name = SignalREvents.BackupDatabaseProgress,
|
||||
0f => "started",
|
||||
1f => "ended",
|
||||
_ => "updated"
|
||||
},
|
||||
Progress = ProgressType.Determinate,
|
||||
Body = new
|
||||
{
|
||||
Progress = progress
|
||||
}
|
||||
};
|
||||
}
|
||||
public static SignalRMessage CleanupProgressEvent(float progress)
|
||||
public static SignalRMessage CleanupProgressEvent(float progress, string subtitle = "")
|
||||
{
|
||||
return new SignalRMessage()
|
||||
{
|
||||
Name = SignalREvents.CleanupProgress,
|
||||
Name = CleanupProgress,
|
||||
Title = "Performing Cleanup",
|
||||
SubTitle = subtitle,
|
||||
EventType = progress switch
|
||||
{
|
||||
0f => "started",
|
||||
1f => "ended",
|
||||
_ => "updated"
|
||||
},
|
||||
Progress = ProgressType.Determinate,
|
||||
Body = new
|
||||
{
|
||||
Progress = progress
|
||||
|
|
@ -100,21 +181,26 @@ namespace API.SignalR
|
|||
}
|
||||
|
||||
|
||||
|
||||
public static SignalRMessage UpdateVersionEvent(UpdateNotificationDto update)
|
||||
{
|
||||
return new SignalRMessage
|
||||
{
|
||||
Name = SignalREvents.UpdateAvailable,
|
||||
Name = UpdateAvailable,
|
||||
Title = "Update Available",
|
||||
SubTitle = update.UpdateTitle,
|
||||
EventType = ProgressEventType.Single,
|
||||
Progress = ProgressType.None,
|
||||
Body = update
|
||||
};
|
||||
}
|
||||
|
||||
public static SignalRMessage SeriesAddedToCollection(int tagId, int seriesId)
|
||||
public static SignalRMessage SeriesAddedToCollectionEvent(int tagId, int seriesId)
|
||||
{
|
||||
return new SignalRMessage
|
||||
{
|
||||
Name = SignalREvents.UpdateAvailable,
|
||||
Name = SeriesAddedToCollection,
|
||||
Progress = ProgressType.None,
|
||||
EventType = ProgressEventType.Single,
|
||||
Body = new
|
||||
{
|
||||
TagId = tagId,
|
||||
|
|
@ -123,11 +209,15 @@ namespace API.SignalR
|
|||
};
|
||||
}
|
||||
|
||||
public static SignalRMessage ScanLibraryError(int libraryId)
|
||||
public static SignalRMessage ScanLibraryErrorEvent(int libraryId, string libraryName)
|
||||
{
|
||||
return new SignalRMessage
|
||||
{
|
||||
Name = SignalREvents.ScanLibraryError,
|
||||
Name = ScanLibraryError,
|
||||
Title = "Error",
|
||||
SubTitle = $"Error Scanning {libraryName}",
|
||||
Progress = ProgressType.None,
|
||||
EventType = ProgressEventType.Single,
|
||||
Body = new
|
||||
{
|
||||
LibraryId = libraryId,
|
||||
|
|
@ -135,11 +225,15 @@ namespace API.SignalR
|
|||
};
|
||||
}
|
||||
|
||||
public static SignalRMessage DownloadProgressEvent(string username, string downloadName, float progress)
|
||||
public static SignalRMessage DownloadProgressEvent(string username, string downloadName, float progress, string eventType = "updated")
|
||||
{
|
||||
return new SignalRMessage()
|
||||
{
|
||||
Name = SignalREvents.DownloadProgress,
|
||||
Name = DownloadProgress,
|
||||
Title = $"Downloading {downloadName}",
|
||||
SubTitle = $"{username} is downloading {downloadName}",
|
||||
EventType = eventType,
|
||||
Progress = ProgressType.Determinate,
|
||||
Body = new
|
||||
{
|
||||
UserName = username,
|
||||
|
|
@ -149,11 +243,73 @@ namespace API.SignalR
|
|||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Represents a file being scanned by Kavita for processing and grouping
|
||||
/// </summary>
|
||||
/// <remarks>Does not have a progress as it's unknown how many files there are. Instead sends -1 to represent indeterminate</remarks>
|
||||
/// <param name="filename"></param>
|
||||
/// <param name="libraryName"></param>
|
||||
/// <param name="eventType"></param>
|
||||
/// <returns></returns>
|
||||
public static SignalRMessage FileScanProgressEvent(string filename, string libraryName, string eventType)
|
||||
{
|
||||
return new SignalRMessage()
|
||||
{
|
||||
Name = FileScanProgress,
|
||||
Title = $"Scanning {libraryName}",
|
||||
SubTitle = Path.GetFileName(filename),
|
||||
EventType = eventType,
|
||||
Progress = ProgressType.Indeterminate,
|
||||
Body = new
|
||||
{
|
||||
Title = $"Scanning {libraryName}",
|
||||
Subtitle = filename,
|
||||
Filename = filename,
|
||||
EventTime = DateTime.Now,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static SignalRMessage DbUpdateProgressEvent(Series series, string eventType)
|
||||
{
|
||||
// TODO: I want this as a detail of a Scanning Series and we can put more information like Volume or Chapter here
|
||||
return new SignalRMessage()
|
||||
{
|
||||
Name = ScanProgress,
|
||||
Title = $"Scanning {series.Library.Name}",
|
||||
SubTitle = series.Name,
|
||||
EventType = eventType,
|
||||
Progress = ProgressType.Indeterminate,
|
||||
Body = new
|
||||
{
|
||||
Title = "Updating Series",
|
||||
SubTitle = series.Name
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static SignalRMessage LibraryScanProgressEvent(string libraryName, string eventType, string seriesName = "")
|
||||
{
|
||||
// TODO: I want this as a detail of a Scanning Series and we can put more information like Volume or Chapter here
|
||||
return new SignalRMessage()
|
||||
{
|
||||
Name = ScanProgress,
|
||||
Title = $"Scanning {libraryName}",
|
||||
SubTitle = seriesName,
|
||||
EventType = eventType,
|
||||
Progress = ProgressType.Indeterminate,
|
||||
Body = null
|
||||
};
|
||||
}
|
||||
|
||||
public static SignalRMessage CoverUpdateEvent(int id, string entityType)
|
||||
{
|
||||
return new SignalRMessage()
|
||||
{
|
||||
Name = SignalREvents.CoverUpdate,
|
||||
Name = CoverUpdate,
|
||||
Title = "Updating Cover",
|
||||
//SubTitle = series.Name, // TODO: Refactor this
|
||||
Progress = ProgressType.None,
|
||||
Body = new
|
||||
{
|
||||
Id = id,
|
||||
|
|
@ -162,17 +318,18 @@ namespace API.SignalR
|
|||
};
|
||||
}
|
||||
|
||||
public static SignalRMessage SiteThemeProgressEvent(int themeIteratedCount, int totalThemesToIterate, string themeName, float progress)
|
||||
public static SignalRMessage SiteThemeProgressEvent(string subtitle, string themeName, string eventType)
|
||||
{
|
||||
return new SignalRMessage()
|
||||
{
|
||||
Name = SignalREvents.SiteThemeProgress,
|
||||
Name = SiteThemeProgress,
|
||||
Title = "Scanning Site Theme",
|
||||
SubTitle = subtitle,
|
||||
EventType = eventType,
|
||||
Progress = ProgressType.Indeterminate,
|
||||
Body = new
|
||||
{
|
||||
TotalUpdates = totalThemesToIterate,
|
||||
CurrentCount = themeIteratedCount,
|
||||
ThemeName = themeName,
|
||||
Progress = progress
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue