JobList filter fix
This commit is contained in:
9
.gitignore
vendored
9
.gitignore
vendored
@@ -562,4 +562,11 @@ coverage/
|
|||||||
## Temporary folders
|
## Temporary folders
|
||||||
##
|
##
|
||||||
tmp/
|
tmp/
|
||||||
temp/
|
temp/
|
||||||
|
|
||||||
|
##
|
||||||
|
## LocalDB Development Files
|
||||||
|
##
|
||||||
|
DevTools/LocalDB/backups/*.bak
|
||||||
|
DevTools/LocalDB/backups/*.bacpac
|
||||||
|
DevTools/LocalDB/data/
|
||||||
@@ -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()
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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)))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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}";
|
||||||
|
|||||||
Reference in New Issue
Block a user