From 3dcf7750f7e2bdd51891d2c084727bd3a6249ea9 Mon Sep 17 00:00:00 2001 From: Joe Milazzo Date: Tue, 9 Jan 2024 16:04:25 -0600 Subject: [PATCH] Kavita+ Tweaks (#2595) --- .github/ISSUE_TEMPLATE/bug_report.yml | 14 +- API.Benchmark/API.Benchmark.csproj | 4 +- API.Tests/API.Tests.csproj | 6 +- API.Tests/Parser/MangaParserTests.cs | 1 + API/API.csproj | 30 +- API/Controllers/ScrobblingController.cs | 27 +- .../Repositories/ScrobbleEventRepository.cs | 10 +- API/Entities/Scrobble/ScrobbleEventFilter.cs | 4 + API/Services/Plus/ScrobblingService.cs | 61 +- .../Tasks/Scanner/Parser/DefaultParser.cs | 3 +- API/Services/Tasks/Scanner/Parser/Parser.cs | 2 +- Kavita.Common/Kavita.Common.csproj | 2 +- UI/Web/package-lock.json | 636 +++++++++--------- UI/Web/package.json | 40 +- UI/Web/src/app/_services/nav.service.ts | 13 +- .../book-line-overlay.component.ts | 9 +- .../reset-password.component.ts | 14 +- .../splash-container.component.html | 6 +- .../splash-container.component.ts | 22 +- .../user-holds/user-holds.component.ts | 2 - openapi.json | 9 + 21 files changed, 501 insertions(+), 414 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 726393b90..938c7d8bf 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,6 +1,6 @@ name: Bug Report description: Create a report to help us improve -title: "" +title: "Bug Title Here" # Add a title field labels: ["needs-triage"] assignees: body: @@ -16,7 +16,7 @@ body: id: what-happened attributes: label: What happened? - description: Also tell us, what steps you took so we can try to reproduce. + description: Also tell us what steps you took so we can try to reproduce. placeholder: Tell us what you see! value: "" validations: @@ -52,7 +52,7 @@ body: - type: dropdown id: desktop-OS attributes: - label: If issue being seen on Desktop, what OS are you running where you see the issue? + label: If the issue is being seen on Desktop, what OS are you running where you see the issue? multiple: false options: - Windows @@ -61,7 +61,7 @@ body: - type: dropdown id: desktop-browsers attributes: - label: If issue being seen in the UI, what browsers are you seeing the problem on? + label: If the issue is being seen in the UI, what browsers are you seeing the problem on? multiple: true options: - Firefox @@ -71,7 +71,7 @@ body: - type: dropdown id: mobile-OS attributes: - label: If issue being seen on Mobile, what OS are you running where you see the issue? + label: If the issue is being seen on Mobile, what OS are you running where you see the issue? multiple: false options: - Android @@ -79,7 +79,7 @@ body: - type: dropdown id: mobile-browsers attributes: - label: If issue being seen on UI, what browsers are you seeing the problem on? + label: If the issue is being seen on the UI, what browsers are you seeing the problem on? multiple: true options: - Firefox @@ -97,7 +97,7 @@ body: attributes: label: Additional Notes description: Any other information about the issue not covered in this form? - placeholder: e.g. Running Kavita on a raspberry pi, updating from X version, using LSIO container, etc + placeholder: e.g. Running Kavita on a Raspberry Pi, updating from X version, using LSIO container, etc value: "" validations: required: true diff --git a/API.Benchmark/API.Benchmark.csproj b/API.Benchmark/API.Benchmark.csproj index cbfd1d715..ebc913fe1 100644 --- a/API.Benchmark/API.Benchmark.csproj +++ b/API.Benchmark/API.Benchmark.csproj @@ -10,8 +10,8 @@ - - + + diff --git a/API.Tests/API.Tests.csproj b/API.Tests/API.Tests.csproj index f6ceb75d3..a6d94e708 100644 --- a/API.Tests/API.Tests.csproj +++ b/API.Tests/API.Tests.csproj @@ -6,13 +6,13 @@ - + - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/API.Tests/Parser/MangaParserTests.cs b/API.Tests/Parser/MangaParserTests.cs index 5ba6a35b7..fe307092e 100644 --- a/API.Tests/Parser/MangaParserTests.cs +++ b/API.Tests/Parser/MangaParserTests.cs @@ -292,6 +292,7 @@ public class MangaParserTests [InlineData("Accel World Chapter 001 Volume 002", "1")] [InlineData("Bleach 001-003", "1-3")] [InlineData("Accel World Volume 2", "0")] + [InlineData("Historys Strongest Disciple Kenichi_v11_c90-98", "90-98")] public void ParseChaptersTest(string filename, string expected) { Assert.Equal(expected, API.Services.Tasks.Scanner.Parser.Parser.ParseChapter(filename)); diff --git a/API/API.csproj b/API/API.csproj index 8ce0a6a57..e6444da45 100644 --- a/API/API.csproj +++ b/API/API.csproj @@ -53,7 +53,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -63,26 +63,26 @@ - + - - + + - + - - - - + + + + - + @@ -92,17 +92,17 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + - + diff --git a/API/Controllers/ScrobblingController.cs b/API/Controllers/ScrobblingController.cs index fc32c3a46..3e623de92 100644 --- a/API/Controllers/ScrobblingController.cs +++ b/API/Controllers/ScrobblingController.cs @@ -39,22 +39,27 @@ public class ScrobblingController : BaseApiController _localizationService = localizationService; } + /// + /// Get the current user's AniList token + /// + /// [HttpGet("anilist-token")] public async Task GetAniListToken() { - // Validate the license - var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername()); if (user == null) return Unauthorized(); return Ok(user.AniListAccessToken); } + /// + /// Update the current user's AniList token + /// + /// + /// [HttpPost("update-anilist-token")] public async Task UpdateAniListToken(AniListUpdateDto dto) { - // Validate the license - var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername()); if (user == null) return Unauthorized(); @@ -71,6 +76,11 @@ public class ScrobblingController : BaseApiController return Ok(); } + /// + /// Checks if the current Scrobbling token for the given Provider has expired for the current user + /// + /// + /// [HttpGet("token-expired")] public async Task> HasTokenExpired(ScrobbleProvider provider) { @@ -159,15 +169,20 @@ public class ScrobblingController : BaseApiController var user = await _unitOfWork.UserRepository.GetUserByIdAsync(User.GetUserId(), AppUserIncludes.ScrobbleHolds); if (user == null) return Unauthorized(); if (user.ScrobbleHolds.Any(s => s.SeriesId == seriesId)) - return Ok(await _localizationService.Translate(User.GetUserId(), "nothing-to-do")); + return Ok(await _localizationService.Translate(user.Id, "nothing-to-do")); - var seriesHold = new ScrobbleHoldBuilder().WithSeriesId(seriesId).Build(); + var seriesHold = new ScrobbleHoldBuilder() + .WithSeriesId(seriesId) + .Build(); user.ScrobbleHolds.Add(seriesHold); _unitOfWork.UserRepository.Update(user); try { _unitOfWork.UserRepository.Update(user); await _unitOfWork.CommitAsync(); + + // When a hold is placed on a series, clear any pre-existing Scrobble Events + await _scrobblingService.ClearEventsForSeries(user.Id, seriesId); return Ok(); } catch (DbUpdateConcurrencyException ex) diff --git a/API/Data/Repositories/ScrobbleEventRepository.cs b/API/Data/Repositories/ScrobbleEventRepository.cs index bff82c681..7d3567831 100644 --- a/API/Data/Repositories/ScrobbleEventRepository.cs +++ b/API/Data/Repositories/ScrobbleEventRepository.cs @@ -27,7 +27,7 @@ public interface IScrobbleRepository Task ClearScrobbleErrors(); Task HasErrorForSeries(int seriesId); Task GetEvent(int userId, int seriesId, ScrobbleEventType eventType); - Task> GetUserEvents(int userId); + Task> GetUserEventsForSeries(int userId, int seriesId); Task> GetUserEvents(int userId, ScrobbleEventFilter filter, UserParams pagination); } @@ -127,16 +127,17 @@ public class ScrobbleRepository : IScrobbleRepository return await _context.ScrobbleEvent.FirstOrDefaultAsync(e => e.AppUserId == userId && e.SeriesId == seriesId && e.ScrobbleEventType == eventType); } - public async Task> GetUserEvents(int userId) + + public async Task> GetUserEventsForSeries(int userId, int seriesId) { return await _context.ScrobbleEvent - .Where(e => e.AppUserId == userId) + .Where(e => e.AppUserId == userId && !e.IsProcessed) .Include(e => e.Series) .OrderBy(e => e.LastModifiedUtc) .AsSplitQuery() - .ProjectTo(_mapper.ConfigurationProvider) .ToListAsync(); } + public async Task> GetUserEvents(int userId, ScrobbleEventFilter filter, UserParams pagination) { var query = _context.ScrobbleEvent @@ -146,6 +147,7 @@ public class ScrobbleRepository : IScrobbleRepository .WhereIf(!string.IsNullOrEmpty(filter.Query), s => EF.Functions.Like(s.Series.Name, $"%{filter.Query}%") ) + .WhereIf(!filter.IncludeReviews, e => e.ScrobbleEventType != ScrobbleEventType.Review) .AsSplitQuery() .ProjectTo(_mapper.ConfigurationProvider); diff --git a/API/Entities/Scrobble/ScrobbleEventFilter.cs b/API/Entities/Scrobble/ScrobbleEventFilter.cs index 526843b68..1153e90e9 100644 --- a/API/Entities/Scrobble/ScrobbleEventFilter.cs +++ b/API/Entities/Scrobble/ScrobbleEventFilter.cs @@ -15,4 +15,8 @@ public class ScrobbleEventFilter /// A query to search against /// public string Query { get; set; } + /// + /// Include reviews in the result - Note: Review Scrobbling is disabled + /// + public bool IncludeReviews { get; set; } = false; } diff --git a/API/Services/Plus/ScrobblingService.cs b/API/Services/Plus/ScrobblingService.cs index 7c117debc..d93a93020 100644 --- a/API/Services/Plus/ScrobblingService.cs +++ b/API/Services/Plus/ScrobblingService.cs @@ -53,6 +53,7 @@ public interface IScrobblingService [AutomaticRetry(Attempts = 3, OnAttemptsExceeded = AttemptsExceededAction.Delete)] Task ProcessUpdatesSinceLastSync(); Task CreateEventsFromExistingHistory(int userId = 0); + Task ClearEventsForSeries(int userId, int seriesId); } public class ScrobblingService : IScrobblingService @@ -542,6 +543,26 @@ public class ScrobblingService : IScrobblingService } } + /// + /// Removes all events (active) that are tied to a now-on hold series + /// + /// + /// + public async Task ClearEventsForSeries(int userId, int seriesId) + { + _logger.LogInformation("Clearing Pre-existing Scrobble events for Series {SeriesId} by User {UserId} as Series is now on hold list", seriesId, userId); + var events = await _unitOfWork.ScrobbleRepository.GetUserEventsForSeries(userId, seriesId); + foreach (var scrobble in events) + { + _unitOfWork.ScrobbleRepository.Remove(scrobble); + } + + await _unitOfWork.CommitAsync(); + } + + /// + /// Removes all events that have been processed that are 7 days old + /// [DisableConcurrentExecution(60 * 60 * 60)] [AutomaticRetry(Attempts = 3, OnAttemptsExceeded = AttemptsExceededAction.Delete)] public async Task ClearProcessedEvents() @@ -594,10 +615,10 @@ public class ScrobblingService : IScrobblingService .Where(e => librariesWithScrobbling.Contains(e.LibraryId)) .Where(e => !errors.Contains(e.SeriesId)) .ToList(); - var reviewEvents = (await _unitOfWork.ScrobbleRepository.GetByEvent(ScrobbleEventType.Review)) - .Where(e => librariesWithScrobbling.Contains(e.LibraryId)) - .Where(e => !errors.Contains(e.SeriesId)) - .ToList(); + // var reviewEvents = (await _unitOfWork.ScrobbleRepository.GetByEvent(ScrobbleEventType.Review)) + // .Where(e => librariesWithScrobbling.Contains(e.LibraryId)) + // .Where(e => !errors.Contains(e.SeriesId)) + // .ToList(); var decisions = addToWantToRead .GroupBy(item => new { item.SeriesId, item.AppUserId }) .Select(group => new @@ -624,7 +645,7 @@ public class ScrobblingService : IScrobblingService await SetAndCheckRateLimit(userRateLimits, user, license.Value); } - var totalProgress = readEvents.Count + decisions.Count + ratingEvents.Count + decisions.Count + reviewEvents.Count; + var totalProgress = readEvents.Count + decisions.Count + ratingEvents.Count + decisions.Count;// + reviewEvents.Count; _logger.LogInformation("Found {TotalEvents} Scrobble Events", totalProgress); try @@ -671,21 +692,21 @@ public class ScrobblingService : IScrobblingService Year = evt.Series.Metadata.ReleaseYear })); - progressCounter = await ProcessEvents(reviewEvents, userRateLimits, usersToScrobble.Count, progressCounter, - totalProgress, evt => Task.FromResult(new ScrobbleDto() - { - Format = evt.Format, - AniListId = evt.AniListId, - MALId = (int?) evt.MalId, - ScrobbleEventType = evt.ScrobbleEventType, - AniListToken = evt.AppUser.AniListAccessToken, - SeriesName = evt.Series.Name, - LocalizedSeriesName = evt.Series.LocalizedName, - Rating = evt.Rating, - Year = evt.Series.Metadata.ReleaseYear, - ReviewBody = evt.ReviewBody, - ReviewTitle = evt.ReviewTitle - })); + // progressCounter = await ProcessEvents(reviewEvents, userRateLimits, usersToScrobble.Count, progressCounter, + // totalProgress, evt => Task.FromResult(new ScrobbleDto() + // { + // Format = evt.Format, + // AniListId = evt.AniListId, + // MALId = (int?) evt.MalId, + // ScrobbleEventType = evt.ScrobbleEventType, + // AniListToken = evt.AppUser.AniListAccessToken, + // SeriesName = evt.Series.Name, + // LocalizedSeriesName = evt.Series.LocalizedName, + // Rating = evt.Rating, + // Year = evt.Series.Metadata.ReleaseYear, + // ReviewBody = evt.ReviewBody, + // ReviewTitle = evt.ReviewTitle + // })); progressCounter = await ProcessEvents(decisions, userRateLimits, usersToScrobble.Count, progressCounter, totalProgress, evt => Task.FromResult(new ScrobbleDto() diff --git a/API/Services/Tasks/Scanner/Parser/DefaultParser.cs b/API/Services/Tasks/Scanner/Parser/DefaultParser.cs index 742ed50d1..c0b1b55c9 100644 --- a/API/Services/Tasks/Scanner/Parser/DefaultParser.cs +++ b/API/Services/Tasks/Scanner/Parser/DefaultParser.cs @@ -49,6 +49,7 @@ public class DefaultParser : IDefaultParser // If library type is Image or this is not a cover image in a non-image library, then use dedicated parsing mechanism if (type == LibraryType.Image || Parser.IsImage(filePath)) { + // TODO: We can move this up one level return ParseImage(filePath, rootPath, ret); } @@ -78,7 +79,7 @@ public class DefaultParser : IDefaultParser var edition = Parser.ParseEdition(fileName); if (!string.IsNullOrEmpty(edition)) { - ret.Series = Parser.CleanTitle(ret.Series.Replace(edition, ""), type is LibraryType.Comic); + ret.Series = Parser.CleanTitle(ret.Series.Replace(edition, string.Empty), type is LibraryType.Comic); ret.Edition = edition; } diff --git a/API/Services/Tasks/Scanner/Parser/Parser.cs b/API/Services/Tasks/Scanner/Parser/Parser.cs index 0b71ec67b..b30fd9f7f 100644 --- a/API/Services/Tasks/Scanner/Parser/Parser.cs +++ b/API/Services/Tasks/Scanner/Parser/Parser.cs @@ -543,7 +543,7 @@ public static class Parser { // Historys Strongest Disciple Kenichi_v11_c90-98.zip, ...c90.5-100.5 new Regex( - @"(\b|_)(c|ch)(\.?\s?)(?(\d+(\.\d)?)-?(\d+(\.\d)?)?)", + @"(\b|_)(c|ch)(\.?\s?)(?(\d+(\.\d)?)(-\d+(\.\d)?)?)", MatchOptions, RegexTimeout), // [Suihei Kiki]_Kasumi_Otoko_no_Ko_[Taruby]_v1.1.zip new Regex( diff --git a/Kavita.Common/Kavita.Common.csproj b/Kavita.Common/Kavita.Common.csproj index 392be3b13..c313b21f2 100644 --- a/Kavita.Common/Kavita.Common.csproj +++ b/Kavita.Common/Kavita.Common.csproj @@ -14,7 +14,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/UI/Web/package-lock.json b/UI/Web/package-lock.json index 4bb7bdb06..03304d32a 100644 --- a/UI/Web/package-lock.json +++ b/UI/Web/package-lock.json @@ -8,17 +8,17 @@ "name": "kavita-webui", "version": "0.4.2", "dependencies": { - "@angular/animations": "^17.0.6", + "@angular/animations": "^17.0.8", "@angular/cdk": "^17.0.4", - "@angular/common": "^17.0.6", - "@angular/compiler": "^17.0.6", - "@angular/core": "^17.0.6", - "@angular/forms": "^17.0.6", - "@angular/localize": "^17.0.6", - "@angular/platform-browser": "^17.0.6", - "@angular/platform-browser-dynamic": "^17.0.6", - "@angular/router": "^17.0.6", - "@fortawesome/fontawesome-free": "^6.4.2", + "@angular/common": "^17.0.8", + "@angular/compiler": "^17.0.8", + "@angular/core": "^17.0.8", + "@angular/forms": "^17.0.8", + "@angular/localize": "^17.0.8", + "@angular/platform-browser": "^17.0.8", + "@angular/platform-browser-dynamic": "^17.0.8", + "@angular/router": "^17.0.8", + "@fortawesome/fontawesome-free": "^6.5.1", "@iharbeck/ngx-virtual-scroller": "^17.0.0", "@iplab/ngx-file-upload": "^17.0.0", "@microsoft/signalr": "^7.0.12", @@ -37,7 +37,7 @@ "luxon": "^3.4.4", "ng-circle-progress": "^1.7.1", "ng-lazyload-image": "^9.1.3", - "ng-select2-component": "^13.0.9", + "ng-select2-component": "^14.0.0", "ngx-color-picker": "^16.0.0", "ngx-extended-pdf-viewer": "^18.1.9", "ngx-file-drop": "^16.0.0", @@ -53,17 +53,17 @@ "zone.js": "^0.14.2" }, "devDependencies": { - "@angular-devkit/build-angular": "^17.0.7", - "@angular-eslint/builder": "^17.1.1", - "@angular-eslint/eslint-plugin": "^17.1.1", - "@angular-eslint/eslint-plugin-template": "^17.1.1", - "@angular-eslint/schematics": "^17.1.1", - "@angular-eslint/template-parser": "^17.1.1", - "@angular/cli": "^17.0.7", - "@angular/compiler-cli": "^17.0.6", + "@angular-devkit/build-angular": "^17.0.9", + "@angular-eslint/builder": "^17.2.0", + "@angular-eslint/eslint-plugin": "^17.2.0", + "@angular-eslint/eslint-plugin-template": "^17.2.0", + "@angular-eslint/schematics": "^17.2.0", + "@angular-eslint/template-parser": "^17.2.0", + "@angular/cli": "^17.0.9", + "@angular/compiler-cli": "^17.0.8", "@types/d3": "^7.4.3", "@types/file-saver": "^2.0.7", - "@types/luxon": "^3.3.7", + "@types/luxon": "^3.4.0", "@types/node": "^20.10.0", "@typescript-eslint/eslint-plugin": "^6.13.0", "@typescript-eslint/parser": "^6.13.0", @@ -97,12 +97,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1700.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1700.7.tgz", - "integrity": "sha512-32uitQKsYLGXAKoXBsmOnPsTt9pS+b9cnFI9ZvBFVhJ31I2EOM7vGcMFalhTxdB/DkVHk4TyO78efV0V26DwCA==", + "version": "0.1700.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1700.9.tgz", + "integrity": "sha512-B8OeUrvJj5JsfOJIibpoVjvuZzthPFxf1LvuUXTyQcqDUscJAe/RJBc2woT6ss13Iv/HWt8mgaMPP4CccckdNg==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.0.7", + "@angular-devkit/core": "17.0.9", "rxjs": "7.8.1" }, "engines": { @@ -112,15 +112,15 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.0.7.tgz", - "integrity": "sha512-AtEzLk6n6BXqQzk0Bsupe6GV0IgUe7RbpBfqROi+NZqMA7OUAHCX3xA6M68Qu+5KxBtW7T5lHeZZ7iP/y39wtQ==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.0.9.tgz", + "integrity": "sha512-yH6AfR2/CXrp05dIFQCroyl6Eaq8mS6tt4P7yS48+KXvAbQq2KzYW+TrDD4flFXe3qLVQGFpds3jE2auiwhHsA==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1700.7", - "@angular-devkit/build-webpack": "0.1700.7", - "@angular-devkit/core": "17.0.7", + "@angular-devkit/architect": "0.1700.9", + "@angular-devkit/build-webpack": "0.1700.9", + "@angular-devkit/core": "17.0.9", "@babel/core": "7.23.2", "@babel/generator": "7.23.0", "@babel/helper-annotate-as-pure": "7.22.5", @@ -131,7 +131,7 @@ "@babel/preset-env": "7.23.2", "@babel/runtime": "7.23.2", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "17.0.7", + "@ngtools/webpack": "17.0.9", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.16", @@ -670,12 +670,12 @@ "dev": true }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1700.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1700.7.tgz", - "integrity": "sha512-B9Mg/qYDpE5my8PJ3VPQyRSUV0Oq1bFUzU8s0ZpqEZl1URKc04pm0LtLmebrMIcUZgDiGk0RHaD+O1E9IV/bdQ==", + "version": "0.1700.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1700.9.tgz", + "integrity": "sha512-NBpTb5kdnTePtNirsJQFXfOIFKTPdDqJe0b0sI3FI860po7uvUFu1m5pL5QSkJLmdqrjfPkNq7svGf7NlHQ8JA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1700.7", + "@angular-devkit/architect": "0.1700.9", "rxjs": "7.8.1" }, "engines": { @@ -689,9 +689,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.7.tgz", - "integrity": "sha512-vATobHo5O5tJba424hJfQWLb40GzvZPNsI74dcgSUTgrDph8ksmk5xB9OvEvf0INorQZ2IMphj/VIWj4/+JqSA==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.9.tgz", + "integrity": "sha512-r5jqwpWOgowqe9KSDqJ3iSbmsEt2XPjSvRG4DSI2T9s31bReoMtreo8b7wkRa2B3hbcDnstFbn8q27VvJDqRaQ==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -728,12 +728,12 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.7.tgz", - "integrity": "sha512-BY11OkJkM3xyXcvyD7x5kGY/c8Ufd4AfPvI0D9imhVxbns45Q48b1DlvCQvSnCJ/s+OwnkrYb/Efa70ZiaGu8A==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.9.tgz", + "integrity": "sha512-5ti7g45F2KjDJS0DbgnOGI1GyKxGpn4XsKTYJFJrSAWj6VpuvPy/DINRrXNuRVo09VPEkqA+IW7QwaG9icptQg==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.0.7", + "@angular-devkit/core": "17.0.9", "jsonc-parser": "3.2.0", "magic-string": "0.30.5", "ora": "5.4.1", @@ -746,13 +746,13 @@ } }, "node_modules/@angular-eslint/builder": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.1.1.tgz", - "integrity": "sha512-QGnIaypNP1osDObTIRJ5JF1KdMBn2oghZXMZAFN+qc+4+EX0SLfrSVw0YTZRH1Sg8ns3/Q+E6jYrswrhV1JmKQ==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.2.0.tgz", + "integrity": "sha512-xPxgCTPcnFRT8OYs9R5UZVAtzVouIIfdMOqTcB847Cev4H8kqRz0gO5aqkQiL+0erwnLf8D4nRzMTJjSBpQQNw==", "dev": true, "dependencies": { - "@nx/devkit": "17.1.3", - "nx": "17.1.3" + "@nx/devkit": "17.2.8", + "nx": "17.2.8" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -760,19 +760,19 @@ } }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.1.1.tgz", - "integrity": "sha512-xRlSh9qjdUdUKAy/0UQsxX7wf1tHApAsHsfismebPriqfmVAPyEg4HBrM8ImWaZxiqaTGC1AyHsUBQD5FK8o6w==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.2.0.tgz", + "integrity": "sha512-uBvPbPE2JxqpdLs//Nd5+TRLgjxDxvTYgmGFTKI9Eo98krqps+rhSQCRSHWACukzc25X3Q4ITHfvjODQL8qQkg==", "dev": true }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.1.1.tgz", - "integrity": "sha512-fFOBlCOVObVu3gjLj+0BypqO1ZR/0bfJnDElqMdYwJG7zRaFT8NNQbrOo/q/GQoqOFoNna6mw3teTGsd5JnL2A==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.2.0.tgz", + "integrity": "sha512-8A3hD/11N6QEchsAGggTPmNsa0GS5p44t930slMsxrTvdSlKAo56FzVdxwSkOcejKIJs57oWxoKvtK4UyLYkeA==", "dev": true, "dependencies": { - "@angular-eslint/utils": "17.1.1", - "@typescript-eslint/utils": "6.13.1" + "@angular-eslint/utils": "17.2.0", + "@typescript-eslint/utils": "6.18.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -780,15 +780,15 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.1.1.tgz", - "integrity": "sha512-unZ6QNwtxuB8Eni7UPdw7uK6iZipZUXIsH+ZuLMOxwFgGMqeRnpv8SW0212rto3d/Ec0jESzVHKcwZ9pT+jxgw==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.2.0.tgz", + "integrity": "sha512-CkcAOWWqNwX0FXeLwJu0Vctso8q/NPHJ95R2Cy8hjwuMyFF83/vDouyeIjYC+SRv6hbevmNa+BbdYXhQZinIHw==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.1.1", - "@angular-eslint/utils": "17.1.1", - "@typescript-eslint/type-utils": "6.13.1", - "@typescript-eslint/utils": "6.13.1", + "@angular-eslint/bundled-angular-compiler": "17.2.0", + "@angular-eslint/utils": "17.2.0", + "@typescript-eslint/type-utils": "6.18.0", + "@typescript-eslint/utils": "6.18.0", "aria-query": "5.3.0", "axobject-query": "4.0.0" }, @@ -798,16 +798,16 @@ } }, "node_modules/@angular-eslint/schematics": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.1.1.tgz", - "integrity": "sha512-Bkt8iOXWRQGSrcLRGzdyJLvSPcIChW5+dh5lXa5GhdLmVAF7jpjxqGwW0rNb5JhLa/phyH0XQIpLBaOPtacSMA==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.2.0.tgz", + "integrity": "sha512-lV2+2H3Hf6FCJfM+cddJ/7ss3qc99OO2wuvTjGNH512mP75tvfLakV+e6TFFdzK0km+ceXvB2VqNXMSShB4PVQ==", "dev": true, "dependencies": { - "@angular-eslint/eslint-plugin": "17.1.1", - "@angular-eslint/eslint-plugin-template": "17.1.1", - "@nx/devkit": "17.1.3", + "@angular-eslint/eslint-plugin": "17.2.0", + "@angular-eslint/eslint-plugin-template": "17.2.0", + "@nx/devkit": "17.2.8", "ignore": "5.3.0", - "nx": "17.1.3", + "nx": "17.2.8", "strip-json-comments": "3.1.1", "tmp": "0.2.1" }, @@ -816,27 +816,43 @@ } }, "node_modules/@angular-eslint/template-parser": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.1.1.tgz", - "integrity": "sha512-ofL46rNhRVeSxrSQF0vwhKMco+vJuo+ZGjSOzFmT9N3KAMB0j+WXTbpyGGMy0gQSBc4W6p+j+zxGa2CR2xb6wA==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.2.0.tgz", + "integrity": "sha512-Js9w1IXWPvXEjd05bWkZzRaLw0g0mJPztAWOj3DiU7H9LKkautQq0zZu02cAAnXZim2CsAagEh2GmGjhaYvoKg==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.1.1", - "eslint-scope": "^7.0.0" + "@angular-eslint/bundled-angular-compiler": "17.2.0", + "eslint-scope": "^8.0.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", "typescript": "*" } }, - "node_modules/@angular-eslint/utils": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.1.1.tgz", - "integrity": "sha512-CTNPOb05S/DII/Fm8JYUvKo+B4u/ctHjGJ0X1YXUR0q31oaGqTE3KePGq76+Y6swRDf9NjUIcfcnZp3u3j4CBQ==", + "node_modules/@angular-eslint/template-parser/node_modules/eslint-scope": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.0.tgz", + "integrity": "sha512-zj3Byw6jX4TcFCJmxOzLt6iol5FAr9xQyZZSQjEzW2UiCJXLwXdRIKCYVFftnpZckaC9Ps9xlC7jB8tSeWWOaw==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.1.1", - "@typescript-eslint/utils": "6.13.1" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@angular-eslint/utils": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.2.0.tgz", + "integrity": "sha512-J7DsFKb5yxv8te8LQvChNn6MBvKulcBx+jtHX1uen+uuuv8XhZuVMZXS0rolUkdl1Q0mBeHpkuO2q6Vh17pqbQ==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "17.2.0", + "@typescript-eslint/utils": "6.18.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -844,9 +860,9 @@ } }, "node_modules/@angular/animations": { - "version": "17.0.6", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.0.6.tgz", - "integrity": "sha512-fic61LjLHry79c5H9UGM8Ff311MJnf9an7EukLj2aLJ3J0uadL/H9de7dDp8PaIT10DX9g+aRTIKOmF3PmmXIQ==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.0.8.tgz", + "integrity": "sha512-iKJ2s4ZqVoGS9tSRBuuwYEWTV+Rw6b4zDY1rqiXvbZrpNRxfzYr6s+aYsLQQEindZ4hzxgp9j60FJ8aE/g4w6A==", "dependencies": { "tslib": "^2.3.0" }, @@ -854,7 +870,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.0.6" + "@angular/core": "17.0.8" } }, "node_modules/@angular/cdk": { @@ -874,15 +890,15 @@ } }, "node_modules/@angular/cli": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.0.7.tgz", - "integrity": "sha512-oSa0GVAQNA7wFbLJYeaO3kV4iUcbKEqXDLxcIE8s1GfHddBOlXH2P1T4fXonCBl5qvV+joP0G0+fs7I0w2utZQ==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.0.9.tgz", + "integrity": "sha512-a1rLAu3TNU5d56ozBnx9UZchJDKC8qMvZL4ThJhcaTUJb0Cj//gqLJdNdMcB0p1Ve9lmmAQ3J17+2Xij1u3sNg==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1700.7", - "@angular-devkit/core": "17.0.7", - "@angular-devkit/schematics": "17.0.7", - "@schematics/angular": "17.0.7", + "@angular-devkit/architect": "0.1700.9", + "@angular-devkit/core": "17.0.9", + "@angular-devkit/schematics": "17.0.9", + "@schematics/angular": "17.0.9", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.1", @@ -941,9 +957,9 @@ "dev": true }, "node_modules/@angular/common": { - "version": "17.0.6", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.0.6.tgz", - "integrity": "sha512-FZtf8ol8W2V21ZDgFtcxmJ6JJKUO97QZ+wr/bosyYEryWMmn6VGrbOARhfW7BlrEgn14NdFkLb72KKtqoqRjrg==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.0.8.tgz", + "integrity": "sha512-fFfwtdg7H+OkqnvV/ENu8F8KGfgIiH16DDbQqYY5KQyyQB+SMsoVW29F1fGx6Y30s7ZlsLOy6cHhgrw74itkSw==", "dependencies": { "tslib": "^2.3.0" }, @@ -951,14 +967,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.0.6", + "@angular/core": "17.0.8", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "17.0.6", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.0.6.tgz", - "integrity": "sha512-PaCNnlPcL0rvByKCBUUyLWkKJYXOrcfKlYYvcacjOzEUgZeEpekG81hMRb9u/Pz+A+M4HJSTmdgzwGP35zo8qw==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.0.8.tgz", + "integrity": "sha512-48jWypuhBGTrUUbkz1vB9gjbKKZ3hpuJ2DUUncd331Yw4tqkqZQbBa/E3ei4IHiCxEvW2uX3lI4AwlhuozmUtA==", "dependencies": { "tslib": "^2.3.0" }, @@ -966,7 +982,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.0.6" + "@angular/core": "17.0.8" }, "peerDependenciesMeta": { "@angular/core": { @@ -975,10 +991,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "17.0.6", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.0.6.tgz", - "integrity": "sha512-C1Gfh9kbjYZezEMOwxnvUTHuPXa+6pk7mAfSj8e5oAO6E+wfo2dTxv1J5zxa3KYzxPYMNfF8OFvLuMKsw7lXjA==", - "dev": true, + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.0.8.tgz", + "integrity": "sha512-ny2SMVgl+icjMuU5ZM57yFGUrhjR0hNxfCn0otAD3jUFliz/Onu9l6EPRKA5Cr8MZx3mg3rTLSBMD17YT8rsOg==", "dependencies": { "@babel/core": "7.23.2", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -998,14 +1013,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.0.6", + "@angular/compiler": "17.0.8", "typescript": ">=5.2 <5.3" } }, "node_modules/@angular/core": { - "version": "17.0.6", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.0.6.tgz", - "integrity": "sha512-QzfKRTDNgGOY9D5VxenUUz20cvPVC+uVw9xiqkDuHgGfLYVFlCAK9ymFYkdUCLTcVzJPxckP+spMpPX8nc4Aqw==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.0.8.tgz", + "integrity": "sha512-tzYsK24LdkNuKNJK6efF4XOqspvF/qOe9j/n1Y61a6mNvFwsJFGbcmdZMby4hI/YRm6oIDoIIFjSep8ycp6Pbw==", "dependencies": { "tslib": "^2.3.0" }, @@ -1018,9 +1033,9 @@ } }, "node_modules/@angular/forms": { - "version": "17.0.6", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.0.6.tgz", - "integrity": "sha512-n/trsMtQHUBGiWz5lFaggMcMOuw0gH+96TCtHxQiUYJOdrbOemkFdGrNh3B4fGHmogWuOYJVF5FAm97WRES2XA==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.0.8.tgz", + "integrity": "sha512-WZBHbMQjaSovAzOMhKqZN+m7eUPGfOzh9rKFKvj6UQLIJ9qSpEpqlvL0omU1z/47s3XXeLiBzomMiRfQISJvvw==", "dependencies": { "tslib": "^2.3.0" }, @@ -1028,16 +1043,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.0.6", - "@angular/core": "17.0.6", - "@angular/platform-browser": "17.0.6", + "@angular/common": "17.0.8", + "@angular/core": "17.0.8", + "@angular/platform-browser": "17.0.8", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/localize": { - "version": "17.0.6", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.0.6.tgz", - "integrity": "sha512-LHLadqRQ4lnM0VxWZld2JLO50t3URi7on0YhZp6p/xhY6cQLcTG3GDNGC/k8dg8JW/7aXJU0hmJEMcop9ELM7g==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.0.8.tgz", + "integrity": "sha512-1zW8qWKNMH3r/x4KpwzzUmVY+iN76vYdhjA6gzZDnpJxpon9eyljNEildj9+zSWeNUr2LgJ6HnkIX9q1f3mXfA==", "dependencies": { "@babel/core": "7.23.2", "fast-glob": "3.3.1", @@ -1052,14 +1067,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.0.6", - "@angular/compiler-cli": "17.0.6" + "@angular/compiler": "17.0.8", + "@angular/compiler-cli": "17.0.8" } }, "node_modules/@angular/platform-browser": { - "version": "17.0.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.0.6.tgz", - "integrity": "sha512-nBhWH1MKT2WswgRNIoMnmNAt0n5/fG59BanJtodW71//Aj5aIE+BuVoFgK3wmO8IMoeP4i4GXRInBXs6lUMOJw==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.0.8.tgz", + "integrity": "sha512-XaI+p2AxQaIHzR761lhPUf4OcOp46WDW0IfbvOzaezHE+8r81joZyVSDQPgXSa/aRfI58YhcfUavuGqyU3PphA==", "dependencies": { "tslib": "^2.3.0" }, @@ -1067,9 +1082,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/animations": "17.0.6", - "@angular/common": "17.0.6", - "@angular/core": "17.0.6" + "@angular/animations": "17.0.8", + "@angular/common": "17.0.8", + "@angular/core": "17.0.8" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1078,9 +1093,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "17.0.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.6.tgz", - "integrity": "sha512-5ZEmBtBkqamTaWjUXCls7G1f3xyK/ykXE7hnUV9CgGqXKrNkxblmbtOhoWdsbuIYjjdxQcAk1qtg/Rg21wcc4w==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.8.tgz", + "integrity": "sha512-BIXNKnfBZb8sdluQ7WIhIXFuVnsJJ0SV+aiMKzQ7B6XhWoAXZQnlvON2thydjIIVuCvaF3YmWTbILI2K8YZ2jQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -1088,16 +1103,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.0.6", - "@angular/compiler": "17.0.6", - "@angular/core": "17.0.6", - "@angular/platform-browser": "17.0.6" + "@angular/common": "17.0.8", + "@angular/compiler": "17.0.8", + "@angular/core": "17.0.8", + "@angular/platform-browser": "17.0.8" } }, "node_modules/@angular/router": { - "version": "17.0.6", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.0.6.tgz", - "integrity": "sha512-xW6yDxREpBOB9MoODSfIw5HwkwLK+OgK34Q6sGYs0ft9UryMoFwft+pHGAaDz2nzhA72n+Ht9B2eai78UE9jGQ==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.0.8.tgz", + "integrity": "sha512-ptphcRe1RG/mIS60R7ZPilkkrxautqB0sOhds3h5VP3g628G1a2HWzvnmvjEfpJWDMFivV32VJMMBtTLqGr+0Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -1105,9 +1120,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.0.6", - "@angular/core": "17.0.6", - "@angular/platform-browser": "17.0.6", + "@angular/common": "17.0.8", + "@angular/core": "17.0.8", + "@angular/platform-browser": "17.0.8", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -3327,9 +3342,9 @@ } }, "node_modules/@fortawesome/fontawesome-free": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.4.2.tgz", - "integrity": "sha512-m5cPn3e2+FDCOgi1mz0RexTUvvQibBebOUlUlW0+YrMjDTPkiJ6VTKukA1GRsvRw+12KyJndNjj0O4AgTxm2Pg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.1.tgz", + "integrity": "sha512-CNy5vSwN3fsUStPRLX7fUYojyuzoEMSXPl7zSLJ8TgtRfjv24LOnOWKT2zYwaHZCJGkdyRnTmstR0P+Ah503Gw==", "hasInstallScript": true, "engines": { "node": ">=6" @@ -3715,9 +3730,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.0.7.tgz", - "integrity": "sha512-gwhUhpwXn0trwwKdSu9WlJbEcLt+s/2fPwoD9lZ0y3wXfrOogsfcNBJKeO5BZf1h+A3AWt7ePmgrZXSJM+865Q==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.0.9.tgz", + "integrity": "sha512-ilbzwW30NaccrhYbdY3jy/ZpbC0l7W6+L2Cd3dzHFQ1gZGckibDdMzjibW/vyq/vRf0xr25+oBVIqUn8kZ606g==", "dev": true, "engines": { "node": "^18.13.0 || >=20.9.0", @@ -3953,21 +3968,21 @@ } }, "node_modules/@nrwl/devkit": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-17.1.3.tgz", - "integrity": "sha512-8HfIY7P3yIYfQ/XKuHoq0GGLA9GpwWtBlI9kPQ0ygjuJ9BkpiGMtQvO6003zs7c6vpc2vNeG+Jmi72+EKvoN5A==", + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-17.2.8.tgz", + "integrity": "sha512-l2dFy5LkWqSA45s6pee6CoqJeluH+sjRdVnAAQfjLHRNSx6mFAKblyzq5h1f4P0EUCVVVqLs+kVqmNx5zxYqvw==", "dev": true, "dependencies": { - "@nx/devkit": "17.1.3" + "@nx/devkit": "17.2.8" } }, "node_modules/@nrwl/tao": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-17.1.3.tgz", - "integrity": "sha512-9YpfEkUpVqOweqgQvMDcWApNx4jhCqBNH5IByZj302Enp3TLnQSvhuX5Dfr8hNQRQokIpEn6tW8SGTctTM5LXw==", + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-17.2.8.tgz", + "integrity": "sha512-Qpk5YKeJ+LppPL/wtoDyNGbJs2MsTi6qyX/RdRrEc8lc4bk6Cw3Oul1qTXCI6jT0KzTz+dZtd0zYD/G7okkzvg==", "dev": true, "dependencies": { - "nx": "17.1.3", + "nx": "17.2.8", "tslib": "^2.3.0" }, "bin": { @@ -3975,12 +3990,12 @@ } }, "node_modules/@nx/devkit": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-17.1.3.tgz", - "integrity": "sha512-1Is7ooovg3kdGJ5VdkePulRUDaMYLLULr+LwXgx7oHSW7AY2iCmhkoOE/vSR7DJ6rkey2gYx7eT1IoRoORiIaQ==", + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-17.2.8.tgz", + "integrity": "sha512-6LtiQihtZwqz4hSrtT5cCG5XMCWppG6/B8c1kNksg97JuomELlWyUyVF+sxmeERkcLYFaKPTZytP0L3dmCFXaw==", "dev": true, "dependencies": { - "@nrwl/devkit": "17.1.3", + "@nrwl/devkit": "17.2.8", "ejs": "^3.1.7", "enquirer": "~2.3.6", "ignore": "^5.0.4", @@ -3993,9 +4008,9 @@ } }, "node_modules/@nx/nx-darwin-arm64": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-17.1.3.tgz", - "integrity": "sha512-f4qLa0y3C4uuhYKgq+MU892WaQvtvmHqrEhHINUOxYXNiLy2sgyJPW0mOZvzXtC4dPaUmiVaFP5RMVzc8Lxhtg==", + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-17.2.8.tgz", + "integrity": "sha512-dMb0uxug4hM7tusISAU1TfkDK3ixYmzc1zhHSZwpR7yKJIyKLtUpBTbryt8nyso37AS1yH+dmfh2Fj2WxfBHTg==", "cpu": [ "arm64" ], @@ -4009,9 +4024,9 @@ } }, "node_modules/@nx/nx-darwin-x64": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-17.1.3.tgz", - "integrity": "sha512-kh76ZjqkLeQUIAfTa9G/DFFf+e1sZ5ipDzk7zFGhZ2k68PoQoFdsFOO3C513JmuEdavspts6Hkifsqh61TaE+A==", + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-17.2.8.tgz", + "integrity": "sha512-0cXzp1tGr7/6lJel102QiLA4NkaLCkQJj6VzwbwuvmuCDxPbpmbz7HC1tUteijKBtOcdXit1/MEoEU007To8Bw==", "cpu": [ "x64" ], @@ -4025,9 +4040,9 @@ } }, "node_modules/@nx/nx-freebsd-x64": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-17.1.3.tgz", - "integrity": "sha512-CRuVL5ZSLb+Gc8vwMUUe9Pl/1Z26YtXMKTahBMQh2dac63vzLgzqIV4c66aduUl1x2M0kGYBSIIRG9z0/BgWeg==", + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-17.2.8.tgz", + "integrity": "sha512-YFMgx5Qpp2btCgvaniDGdu7Ctj56bfFvbbaHQWmOeBPK1krNDp2mqp8HK6ZKOfEuDJGOYAp7HDtCLvdZKvJxzA==", "cpu": [ "x64" ], @@ -4041,9 +4056,9 @@ } }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-17.1.3.tgz", - "integrity": "sha512-KDBmd5tSrg93g/oij/eGW4yeVNVK3DBIM4VYAS2vtkIgVOGoqcQ+SEIeMK3nMUJP9jGyblt3QNj5ZsJBtScwQw==", + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-17.2.8.tgz", + "integrity": "sha512-iN2my6MrhLRkVDtdivQHugK8YmR7URo1wU9UDuHQ55z3tEcny7LV3W9NSsY9UYPK/FrxdDfevj0r2hgSSdhnzA==", "cpu": [ "arm" ], @@ -4057,9 +4072,9 @@ } }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-17.1.3.tgz", - "integrity": "sha512-W2tNL/7sIwoQKLmuy68Usd6TZzIZvxZt4UE30kDwGc2RSap6RCHAvDbzSxtW+L4+deC9UxX0Tty0VuW+J8FjSg==", + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-17.2.8.tgz", + "integrity": "sha512-Iy8BjoW6mOKrSMiTGujUcNdv+xSM1DALTH6y3iLvNDkGbjGK1Re6QNnJAzqcXyDpv32Q4Fc57PmuexyysZxIGg==", "cpu": [ "arm64" ], @@ -4073,9 +4088,9 @@ } }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-17.1.3.tgz", - "integrity": "sha512-Oto3gkLd7yweuVUCsSHwm4JkAIbcxpPJP0ycRHI/PRHPMIOPiMX8r651QM1amMyKAbJtAe047nyb9Sh1X0FA4A==", + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-17.2.8.tgz", + "integrity": "sha512-9wkAxWzknjpzdofL1xjtU6qPFF1PHlvKCZI3hgEYJDo4mQiatGI+7Ttko+lx/ZMP6v4+Umjtgq7+qWrApeKamQ==", "cpu": [ "arm64" ], @@ -4089,9 +4104,9 @@ } }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-17.1.3.tgz", - "integrity": "sha512-pJS994sa5PBPFak93RydTB9KdEmiVb3rgiSB7PDBegphERbzHEB77B7G8M5TZ62dGlMdplIEKmdhY5XNqeAf9A==", + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-17.2.8.tgz", + "integrity": "sha512-sjG1bwGsjLxToasZ3lShildFsF0eyeGu+pOQZIp9+gjFbeIkd19cTlCnHrOV9hoF364GuKSXQyUlwtFYFR4VTQ==", "cpu": [ "x64" ], @@ -4105,9 +4120,9 @@ } }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-17.1.3.tgz", - "integrity": "sha512-4Hcx5Fg/88jV+bcTr6P0dM4unXNvKgrGJe3oK9/sgEhiW6pD2UAFjv16CCSRcWhDUAzUDqcwnD2fgg+vnAJG6g==", + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-17.2.8.tgz", + "integrity": "sha512-QiakXZ1xBCIptmkGEouLHQbcM4klQkcr+kEaz2PlNwy/sW3gH1b/1c0Ed5J1AN9xgQxWspriAONpScYBRgxdhA==", "cpu": [ "x64" ], @@ -4121,9 +4136,9 @@ } }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-17.1.3.tgz", - "integrity": "sha512-dUasEuskmDxUL36XA0GZqSb9233suE4wKhxrMobyFBzHUZ2tq/unzOpPjYfqDBie4QIvF8tEpAjQsLds8LWgbw==", + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-17.2.8.tgz", + "integrity": "sha512-XBWUY/F/GU3vKN9CAxeI15gM4kr3GOBqnzFZzoZC4qJt2hKSSUEWsMgeZtsMgeqEClbi4ZyCCkY7YJgU32WUGA==", "cpu": [ "arm64" ], @@ -4137,9 +4152,9 @@ } }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-17.1.3.tgz", - "integrity": "sha512-eTuTpBHFvA5NFJh/iosmqCL4JOAjDrwXLSMgfKrZKjiApHMG1T/5Hb+PrsNpt+WnGp94ur7c4Dtx4xD5vlpAEw==", + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-17.2.8.tgz", + "integrity": "sha512-HTqDv+JThlLzbcEm/3f+LbS5/wYQWzb5YDXbP1wi7nlCTihNZOLNqGOkEmwlrR5tAdNHPRpHSmkYg4305W0CtA==", "cpu": [ "x64" ], @@ -4177,13 +4192,13 @@ } }, "node_modules/@schematics/angular": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.7.tgz", - "integrity": "sha512-d7QKmcKrM4owb/2bR7Ipf23roiNbvbD/x7reNhQAtKAPLSHJ3Ulkf1+Yv+dj+9f+K7y9SBviEUSrD27BQ9WaxQ==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.9.tgz", + "integrity": "sha512-XPaHAhobxdQMswH8wSrfToKN7wmGJFh/K5jq/3J+78KeSBZStYxZkVIQbvJkSU8Y1MsdVaeMYKDE8rjFN83OYA==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.0.7", - "@angular-devkit/schematics": "17.0.7", + "@angular-devkit/core": "17.0.9", + "@angular-devkit/schematics": "17.0.9", "jsonc-parser": "3.2.0" }, "engines": { @@ -4749,9 +4764,9 @@ "dev": true }, "node_modules/@types/luxon": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.7.tgz", - "integrity": "sha512-gKc9P2d4g5uYwmy4s/MO/yOVPmvHyvzka1YH6i5dM03UrFofHSmgc0D0ymbDRStFWHusk6cwwF6nhLm/ckBbbQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.0.tgz", + "integrity": "sha512-PEVoA4MOfSsFNaPrZjIUGUZujBDxnO/tj2A2N9KfzlR+pNgpBdDuk0TmRvSMAVUP5q4q8IkMEZ8UOp3MIr+QgA==", "dev": true }, "node_modules/@types/mime": { @@ -4770,18 +4785,18 @@ } }, "node_modules/@types/node-forge": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz", - "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==", + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", "dev": true }, "node_modules/@types/range-parser": { @@ -5180,13 +5195,13 @@ "dev": true }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz", - "integrity": "sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.0.tgz", + "integrity": "sha512-o/UoDT2NgOJ2VfHpfr+KBY2ErWvCySNUIX/X7O9g8Zzt/tXdpfEU43qbNk8LVuWUT2E0ptzTWXh79i74PP0twA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1" + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -5197,13 +5212,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.1.tgz", - "integrity": "sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.0.tgz", + "integrity": "sha512-ZeMtrXnGmTcHciJN1+u2CigWEEXgy1ufoxtWcHORt5kGvpjjIlK9MUhzHm4RM8iVy6dqSaZA/6PVkX6+r+ChjQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.13.1", - "@typescript-eslint/utils": "6.13.1", + "@typescript-eslint/typescript-estree": "6.18.0", + "@typescript-eslint/utils": "6.18.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -5224,9 +5239,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.1.tgz", - "integrity": "sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.0.tgz", + "integrity": "sha512-/RFVIccwkwSdW/1zeMx3hADShWbgBxBnV/qSrex6607isYjj05t36P6LyONgqdUrNLl5TYU8NIKdHUYpFvExkA==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -5237,16 +5252,17 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz", - "integrity": "sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.0.tgz", + "integrity": "sha512-klNvl+Ql4NsBNGB4W9TZ2Od03lm7aGvTbs0wYaFYsplVPhr+oeXjlPZCDI4U9jgJIDK38W1FKhacCFzCC+nbIg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1", + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", + "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, @@ -5263,6 +5279,15 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -5275,6 +5300,21 @@ "node": ">=10" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -5297,17 +5337,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.1.tgz", - "integrity": "sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.0.tgz", + "integrity": "sha512-wiKKCbUeDPGaYEYQh1S580dGxJ/V9HI7K5sbGAVklyf+o5g3O+adnS4UNJajplF4e7z2q0uVBaTdT/yLb4XAVA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.13.1", - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/scope-manager": "6.18.0", + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/typescript-estree": "6.18.0", "semver": "^7.5.4" }, "engines": { @@ -5355,12 +5395,12 @@ "dev": true }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz", - "integrity": "sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.0.tgz", + "integrity": "sha512-1wetAlSZpewRDb2h9p/Q8kRjdGuqdTAQbkJIOUMLug2LBLG+QOjiWoSj6/3B/hA9/tVTFFdtiKvAYoYnSRW/RA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/types": "6.18.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -5818,7 +5858,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -5852,9 +5891,9 @@ } }, "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, "node_modules/array-union": { @@ -6075,7 +6114,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, "engines": { "node": ">=8" } @@ -6167,13 +6205,11 @@ } }, "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dev": true, "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" } @@ -6685,7 +6721,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "funding": [ { "type": "individual", @@ -6973,8 +7008,7 @@ "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { "version": "0.4.2", @@ -7705,12 +7739,6 @@ "node": ">=8" } }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -7977,7 +8005,6 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -7987,7 +8014,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -8740,12 +8766,6 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, "node_modules/express/node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -9141,9 +9161,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "dev": true, "funding": [ { @@ -9275,7 +9295,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -10059,7 +10078,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -11697,29 +11715,17 @@ } }, "node_modules/ng-select2-component": { - "version": "13.0.9", - "resolved": "https://registry.npmjs.org/ng-select2-component/-/ng-select2-component-13.0.9.tgz", - "integrity": "sha512-Bj7lHCiHnwNFECyzpn0LyD3IOPnBbIHHYXxpFU313QZgVkEz7oiF9nBnkorAAABIfLk4EiU0nBQkY3CmbVOgfg==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/ng-select2-component/-/ng-select2-component-14.0.0.tgz", + "integrity": "sha512-AYfF3Hyc+RtryoWIpBVBOBqjF6wKFB6KfzYVrtENEqv6W3qDRRQDfm17CFXm1UZxgoprlsYOeefo4aD4R06s5g==", "dependencies": { - "ngx-infinite-scroll": ">=16.0.0", + "ngx-infinite-scroll": ">=17.0.0", "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/cdk": ">=16.1.0", - "@angular/common": ">=16.1.0", - "@angular/core": ">=16.1.0" - } - }, - "node_modules/ng-select2-component/node_modules/ngx-infinite-scroll": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-16.0.0.tgz", - "integrity": "sha512-bzyNYd+wVlUUxcopRVr2DAa81eEc8vITtKVvb+c7R1uy8hWPTlxOEXf3L1qA4FMwTEzCQ9b37TXzlJji3qBy+A==", - "dependencies": { - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/common": ">=16.0.0 <17.0.0", - "@angular/core": ">=16.0.0 <17.0.0" + "@angular/cdk": ">=17.0.0", + "@angular/common": ">=17.0.0", + "@angular/core": ">=17.0.0" } }, "node_modules/ngx-color-picker": { @@ -11764,6 +11770,18 @@ "@angular/core": ">=14.0.0" } }, + "node_modules/ngx-infinite-scroll": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-17.0.0.tgz", + "integrity": "sha512-pQXLuRiuhRuDKD3nmgyW1V08JVNBepmk6nb8qjHc5hgsWNts01+R/p33rYcRDzcut6/PWqGyrZ9o9i8swzMYMA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">=17.0.0 <18.0.0", + "@angular/core": ">=17.0.0 <18.0.0" + } + }, "node_modules/ngx-slider-v2": { "version": "17.0.0", "resolved": "https://registry.npmjs.org/ngx-slider-v2/-/ngx-slider-v2-17.0.0.tgz", @@ -11972,7 +11990,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -12118,13 +12135,13 @@ } }, "node_modules/nx": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/nx/-/nx-17.1.3.tgz", - "integrity": "sha512-6LYoTt01nS1d/dvvYtRs+pEAMQmUVsd2fr/a8+X1cDjWrb8wsf1O3DwlBTqKOXOazpS3eOr0Ukc9N1svbu7uXA==", + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/nx/-/nx-17.2.8.tgz", + "integrity": "sha512-rM5zXbuXLEuqQqcjVjClyvHwRJwt+NVImR2A6KFNG40Z60HP6X12wAxxeLHF5kXXTDRU0PFhf/yACibrpbPrAw==", "dev": true, "hasInstallScript": true, "dependencies": { - "@nrwl/tao": "17.1.3", + "@nrwl/tao": "17.2.8", "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "3.0.0-rc.46", "@zkochan/js-yaml": "0.0.6", @@ -12156,7 +12173,6 @@ "tmp": "~0.2.1", "tsconfig-paths": "^4.1.2", "tslib": "^2.3.0", - "v8-compile-cache": "2.3.0", "yargs": "^17.6.2", "yargs-parser": "21.1.1" }, @@ -12165,16 +12181,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "17.1.3", - "@nx/nx-darwin-x64": "17.1.3", - "@nx/nx-freebsd-x64": "17.1.3", - "@nx/nx-linux-arm-gnueabihf": "17.1.3", - "@nx/nx-linux-arm64-gnu": "17.1.3", - "@nx/nx-linux-arm64-musl": "17.1.3", - "@nx/nx-linux-x64-gnu": "17.1.3", - "@nx/nx-linux-x64-musl": "17.1.3", - "@nx/nx-win32-arm64-msvc": "17.1.3", - "@nx/nx-win32-x64-msvc": "17.1.3" + "@nx/nx-darwin-arm64": "17.2.8", + "@nx/nx-darwin-x64": "17.2.8", + "@nx/nx-freebsd-x64": "17.2.8", + "@nx/nx-linux-arm-gnueabihf": "17.2.8", + "@nx/nx-linux-arm64-gnu": "17.2.8", + "@nx/nx-linux-arm64-musl": "17.2.8", + "@nx/nx-linux-x64-gnu": "17.2.8", + "@nx/nx-linux-x64-musl": "17.2.8", + "@nx/nx-win32-arm64-msvc": "17.2.8", + "@nx/nx-win32-x64-msvc": "17.2.8" }, "peerDependencies": { "@swc-node/register": "^1.6.7", @@ -12211,12 +12227,12 @@ "dev": true }, "node_modules/nx/node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", "dev": true, "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -13400,7 +13416,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -13411,8 +13426,7 @@ "node_modules/reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, "node_modules/regenerate": { "version": "1.4.2", @@ -13882,7 +13896,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "devOptional": true }, "node_modules/sass": { "version": "1.69.5", @@ -13998,7 +14012,6 @@ "version": "7.5.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -14013,7 +14026,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -14024,8 +14036,7 @@ "node_modules/semver/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/send": { "version": "0.16.2", @@ -15276,7 +15287,6 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -15477,12 +15487,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -15834,9 +15838,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.15.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.15.1.tgz", - "integrity": "sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/UI/Web/package.json b/UI/Web/package.json index 1ccc7a248..911fe6143 100644 --- a/UI/Web/package.json +++ b/UI/Web/package.json @@ -13,17 +13,17 @@ }, "private": true, "dependencies": { - "@angular/animations": "^17.0.6", + "@angular/animations": "^17.0.8", "@angular/cdk": "^17.0.4", - "@angular/common": "^17.0.6", - "@angular/compiler": "^17.0.6", - "@angular/core": "^17.0.6", - "@angular/forms": "^17.0.6", - "@angular/localize": "^17.0.6", - "@angular/platform-browser": "^17.0.6", - "@angular/platform-browser-dynamic": "^17.0.6", - "@angular/router": "^17.0.6", - "@fortawesome/fontawesome-free": "^6.4.2", + "@angular/common": "^17.0.8", + "@angular/compiler": "^17.0.8", + "@angular/core": "^17.0.8", + "@angular/forms": "^17.0.8", + "@angular/localize": "^17.0.8", + "@angular/platform-browser": "^17.0.8", + "@angular/platform-browser-dynamic": "^17.0.8", + "@angular/router": "^17.0.8", + "@fortawesome/fontawesome-free": "^6.5.1", "@iharbeck/ngx-virtual-scroller": "^17.0.0", "@iplab/ngx-file-upload": "^17.0.0", "@microsoft/signalr": "^7.0.12", @@ -42,7 +42,7 @@ "luxon": "^3.4.4", "ng-circle-progress": "^1.7.1", "ng-lazyload-image": "^9.1.3", - "ng-select2-component": "^13.0.9", + "ng-select2-component": "^14.0.0", "ngx-color-picker": "^16.0.0", "ngx-extended-pdf-viewer": "^18.1.9", "ngx-file-drop": "^16.0.0", @@ -58,17 +58,17 @@ "zone.js": "^0.14.2" }, "devDependencies": { - "@angular-devkit/build-angular": "^17.0.7", - "@angular-eslint/builder": "^17.1.1", - "@angular-eslint/eslint-plugin": "^17.1.1", - "@angular-eslint/eslint-plugin-template": "^17.1.1", - "@angular-eslint/schematics": "^17.1.1", - "@angular-eslint/template-parser": "^17.1.1", - "@angular/cli": "^17.0.7", - "@angular/compiler-cli": "^17.0.6", + "@angular-devkit/build-angular": "^17.0.9", + "@angular-eslint/builder": "^17.2.0", + "@angular-eslint/eslint-plugin": "^17.2.0", + "@angular-eslint/eslint-plugin-template": "^17.2.0", + "@angular-eslint/schematics": "^17.2.0", + "@angular-eslint/template-parser": "^17.2.0", + "@angular/cli": "^17.0.9", + "@angular/compiler-cli": "^17.0.8", "@types/d3": "^7.4.3", "@types/file-saver": "^2.0.7", - "@types/luxon": "^3.3.7", + "@types/luxon": "^3.4.0", "@types/node": "^20.10.0", "@typescript-eslint/eslint-plugin": "^6.13.0", "@typescript-eslint/parser": "^6.13.0", diff --git a/UI/Web/src/app/_services/nav.service.ts b/UI/Web/src/app/_services/nav.service.ts index 68df048f9..8ed9d03e7 100644 --- a/UI/Web/src/app/_services/nav.service.ts +++ b/UI/Web/src/app/_services/nav.service.ts @@ -6,6 +6,8 @@ import {environment} from "../../environments/environment"; import {SideNavStream} from "../_models/sidenav/sidenav-stream"; import {TextResonse} from "../_types/text-response"; import {DashboardStream} from "../_models/dashboard/dashboard-stream"; +import {AccountService} from "./account.service"; +import {tap} from "rxjs/operators"; @Injectable({ providedIn: 'root' @@ -34,9 +36,16 @@ export class NavService { private renderer: Renderer2; baseUrl = environment.apiUrl; - constructor(@Inject(DOCUMENT) private document: Document, rendererFactory: RendererFactory2, private httpClient: HttpClient) { + constructor(@Inject(DOCUMENT) private document: Document, rendererFactory: RendererFactory2, private httpClient: HttpClient, private accountService: AccountService) { this.renderer = rendererFactory.createRenderer(null, null); - this.showNavBar(); + + // To avoid flashing, let's check if we are authenticated before we show + this.accountService.currentUser$.subscribe(u => { + if (u) { + this.showNavBar(); + } + }); + const sideNavState = (localStorage.getItem(this.localStorageSideNavKey) === 'true') || false; this.sideNavCollapseSource.next(sideNavState); this.showSideNav(); diff --git a/UI/Web/src/app/book-reader/_components/book-line-overlay/book-line-overlay.component.ts b/UI/Web/src/app/book-reader/_components/book-line-overlay/book-line-overlay.component.ts index 73b0fe1bc..9a02dd58b 100644 --- a/UI/Web/src/app/book-reader/_components/book-line-overlay/book-line-overlay.component.ts +++ b/UI/Web/src/app/book-reader/_components/book-line-overlay/book-line-overlay.component.ts @@ -84,12 +84,19 @@ export class BookLineOverlayComponent implements OnInit { const selection = window.getSelection(); if (!event.target) return; + + if ((selection === null || selection === undefined || selection.toString().trim() === '' || selection.toString().trim() === this.selectedText)) { if (this.selectedText !== '') { event.preventDefault(); event.stopPropagation(); } - this.reset(); + + const isRightClick = (event instanceof MouseEvent && event.button === 2); + if (!isRightClick) { + this.reset(); + } + return; } diff --git a/UI/Web/src/app/registration/_components/reset-password/reset-password.component.ts b/UI/Web/src/app/registration/_components/reset-password/reset-password.component.ts index 9d91b10a6..578457884 100644 --- a/UI/Web/src/app/registration/_components/reset-password/reset-password.component.ts +++ b/UI/Web/src/app/registration/_components/reset-password/reset-password.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core'; +import {ChangeDetectionStrategy, Component, inject} from '@angular/core'; import { Validators, FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms'; import { Router } from '@angular/router'; import { ToastrService } from 'ngx-toastr'; @@ -6,6 +6,7 @@ import { AccountService } from 'src/app/_services/account.service'; import { NgIf } from '@angular/common'; import { SplashContainerComponent } from '../splash-container/splash-container.component'; import {TranslocoDirective} from "@ngneat/transloco"; +import {NavService} from "../../../_services/nav.service"; @Component({ selector: 'app-reset-password', @@ -17,12 +18,19 @@ import {TranslocoDirective} from "@ngneat/transloco"; }) export class ResetPasswordComponent { + private readonly router = inject(Router); + private readonly accountService = inject(AccountService); + private readonly toastr = inject(ToastrService); + private readonly navService = inject(NavService); + registerForm: FormGroup = new FormGroup({ email: new FormControl('', [Validators.required, Validators.email]), }); - constructor(private router: Router, private accountService: AccountService, - private toastr: ToastrService) {} + constructor() { + this.navService.hideNavBar(); + this.navService.hideSideNav(); + } submit() { const model = this.registerForm.get('email')?.value; diff --git a/UI/Web/src/app/registration/_components/splash-container/splash-container.component.html b/UI/Web/src/app/registration/_components/splash-container/splash-container.component.html index 3c07ea1b0..1041bc951 100644 --- a/UI/Web/src/app/registration/_components/splash-container/splash-container.component.html +++ b/UI/Web/src/app/registration/_components/splash-container/splash-container.component.html @@ -1,5 +1,5 @@ -