JobList filter fix

This commit is contained in:
2025-12-08 21:28:24 +01:00
parent d2fb9b8071
commit 1f95d57717
6 changed files with 49 additions and 18 deletions

7
.gitignore vendored
View File

@@ -563,3 +563,10 @@ coverage/
## ##
tmp/ tmp/
temp/ temp/
##
## LocalDB Development Files
##
DevTools/LocalDB/backups/*.bak
DevTools/LocalDB/backups/*.bacpac
DevTools/LocalDB/data/

View File

@@ -36,7 +36,7 @@ public class JobsController : Controller
public async Task<IActionResult> GetAll( public async Task<IActionResult> GetAll(
[FromQuery] int start = 0, [FromQuery] int start = 0,
[FromQuery] int limit = 50, [FromQuery] int limit = 50,
[FromQuery] JobStatus? status = null, [FromQuery] List<JobStatus>? statuses = null,
[FromQuery] JobType? jobType = null, [FromQuery] JobType? jobType = null,
[FromQuery] Guid? layerId = null) [FromQuery] Guid? layerId = null)
{ {
@@ -54,9 +54,9 @@ public class JobsController : Controller
var query = _db.QueueJobs.AsQueryable(); var query = _db.QueueJobs.AsQueryable();
if (status.HasValue) if (statuses != null && statuses.Count > 0)
{ {
query = query.Where(j => j.Status == status.Value); query = query.Where(j => statuses.Contains(j.Status));
} }
if (jobType.HasValue) if (jobType.HasValue)
@@ -71,8 +71,11 @@ public class JobsController : Controller
var totalCount = await query.CountAsync(); var totalCount = await query.CountAsync();
// Sort by: Priority ASC (0=highest), JobType, then CreatedAt DESC
var items = await query var items = await query
.OrderByDescending(j => j.CreatedAt) .OrderBy(j => j.Priority)
.ThenBy(j => j.JobType)
.ThenByDescending(j => j.CreatedAt)
.Skip(start) .Skip(start)
.Take(limit) .Take(limit)
.AsNoTracking() .AsNoTracking()

View File

@@ -22,8 +22,6 @@
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.0" />
<PackageReference Include="Google.Apis.Sheets.v4" Version="1.68.0.3525" /> <PackageReference Include="Google.Apis.Sheets.v4" Version="1.68.0.3525" />
<PackageReference Include="Google.Apis.Drive.v3" Version="1.68.0.3490" /> <PackageReference Include="Google.Apis.Drive.v3" Version="1.68.0.3490" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -12,25 +12,28 @@
Expanded="true"> Expanded="true">
<MudGrid AlignItems="Center"> <MudGrid AlignItems="Center">
<MudItem xs="12" sm="6" md="3"> <MudItem xs="12" sm="6" md="3">
<MudSelect T="JobStatus?" <MudSelect T="JobStatus"
@bind-Value="selectedStatus" SelectedValues="selectedStatuses"
Label="Status" Label="Status"
Placeholder="All statuses" Placeholder="All statuses"
MultiSelection="true"
Clearable="true" Clearable="true"
SelectedValuesChanged="OnStatusFilterChanged"
OnClearButtonClick="OnStatusClear"> OnClearButtonClick="OnStatusClear">
@foreach (JobStatus status in Enum.GetValues(typeof(JobStatus))) @foreach (JobStatus status in Enum.GetValues(typeof(JobStatus)))
{ {
<MudSelectItem T="JobStatus?" Value="@status">@status.ToString()</MudSelectItem> <MudSelectItem T="JobStatus" Value="@status">@status.ToString()</MudSelectItem>
} }
</MudSelect> </MudSelect>
</MudItem> </MudItem>
<MudItem xs="12" sm="6" md="3"> <MudItem xs="12" sm="6" md="3">
<MudSelect T="JobType?" <MudSelect T="JobType?"
@bind-Value="selectedJobType" Value="selectedJobType"
Label="Job Type" Label="Job Type"
Placeholder="All types" Placeholder="All types"
Clearable="true" Clearable="true"
ValueChanged="OnJobTypeFilterChanged"
OnClearButtonClick="OnJobTypeClear"> OnClearButtonClick="OnJobTypeClear">
@foreach (JobType type in Enum.GetValues(typeof(JobType))) @foreach (JobType type in Enum.GetValues(typeof(JobType)))
{ {

View File

@@ -20,7 +20,7 @@ public partial class Index : ComponentBase, IDisposable
private bool isLoading = false; private bool isLoading = false;
private int currentPage = 1; private int currentPage = 1;
private int pageSize = 50; private int pageSize = 50;
private JobStatus? selectedStatus = null; private IEnumerable<JobStatus> selectedStatuses = new HashSet<JobStatus>();
private JobType? selectedJobType = null; private JobType? selectedJobType = null;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
@@ -60,7 +60,8 @@ public partial class Index : ComponentBase, IDisposable
try try
{ {
jobs = await JobService.GetJobsAsync(currentPage, pageSize, selectedStatus, selectedJobType); var statusList = selectedStatuses?.ToList();
jobs = await JobService.GetJobsAsync(currentPage, pageSize, statusList, selectedJobType);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -81,15 +82,29 @@ public partial class Index : ComponentBase, IDisposable
private async Task ClearFilters() private async Task ClearFilters()
{ {
selectedStatus = null; selectedStatuses = new HashSet<JobStatus>();
selectedJobType = null; selectedJobType = null;
currentPage = 1; currentPage = 1;
await LoadJobs(); await LoadJobs();
} }
private async Task OnStatusFilterChanged(IEnumerable<JobStatus> values)
{
selectedStatuses = values;
currentPage = 1;
await LoadJobs();
}
private async Task OnJobTypeFilterChanged(JobType? value)
{
selectedJobType = value;
currentPage = 1;
await LoadJobs();
}
private async Task OnStatusClear() private async Task OnStatusClear()
{ {
selectedStatus = null; selectedStatuses = new HashSet<JobStatus>();
currentPage = 1; currentPage = 1;
await LoadJobs(); await LoadJobs();
} }

View File

@@ -19,13 +19,18 @@ public class JobService
PropertyNameCaseInsensitive = true PropertyNameCaseInsensitive = true
}; };
public async Task<PagedResult<QueueJob>> GetJobsAsync(int page = 1, int pageSize = 50, JobStatus? status = null, JobType? jobType = null, Guid? layerId = null) public async Task<PagedResult<QueueJob>> GetJobsAsync(int page = 1, int pageSize = 50, List<JobStatus>? statuses = null, JobType? jobType = null, Guid? layerId = null)
{ {
var start = (page - 1) * pageSize; var start = (page - 1) * pageSize;
var query = $"Jobs?start={start}&limit={pageSize}"; var query = $"Jobs?start={start}&limit={pageSize}";
if (status.HasValue) if (statuses != null && statuses.Count > 0)
query += $"&status={(int)status.Value}"; {
foreach (var status in statuses)
{
query += $"&statuses={(int)status}";
}
}
if (jobType.HasValue) if (jobType.HasValue)
query += $"&jobType={(int)jobType.Value}"; query += $"&jobType={(int)jobType.Value}";