Develop#9
Conversation
Added a filter to allow users to view jobs with or without descriptions. Updated Jobs.razor UI with a new dropdown, extended filter logic and JobListingService to support the new NeedsDescription property, and persisted filter state in JobViewState. Updated binary assets to reflect these changes.
Qodana for JVMIt seems all right 👌 No new problems were found according to the checks applied ☁️ View the detailed Qodana report Contact Qodana teamContact us at qodana-support@jetbrains.com
|
There was a problem hiding this comment.
Pull request overview
Adds a new “Description” filter to the job listing UI and filtering pipeline so users can narrow results based on whether listings are missing descriptions, alongside updating the bundled portable artifacts.
Changes:
- Added
NeedsDescriptiontoJobListingFilterand applied it inFilterJobListings. - Added a Description dropdown filter in
Jobs.razorand persisted it viaJobViewState. - Updated Git LFS pointers for portable ZIP split parts (x86/x64).
Reviewed changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| Services/JobListingService.cs | Introduces NeedsDescription filter logic and adds the filter field to JobListingFilter. |
| Components/Pages/Jobs.razor | Adds the UI control and wires it into filtering and view-state persistence. |
| Models/AppSettings.cs | Persists the new filter selection in JobViewState. |
| Portable/JobTracker-x86.zip.001 | Updates LFS pointer for x86 portable artifact part. |
| Portable/JobTracker-x86.zip.002 | Updates LFS pointer for x86 portable artifact part. |
| Portable/JobTracker-x64.zip.001 | Updates LFS pointer for x64 portable artifact part. |
| Portable/JobTracker-x64.zip.002 | Updates LFS pointer for x64 portable artifact part. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| // Needs description filter | ||
| if (filter.NeedsDescription.HasValue) | ||
| { | ||
| if (filter.NeedsDescription.Value) | ||
| query = query.Where(j => string.IsNullOrWhiteSpace(j.Description)); | ||
| else | ||
| query = query.Where(j => !string.IsNullOrWhiteSpace(j.Description)); |
There was a problem hiding this comment.
The new NeedsDescription filter only checks for an empty/whitespace Description, but elsewhere in this service “needs description” is defined as empty OR very short (e.g., < 100 chars in UpdateJobDescription, GetJobsNeedingDescriptions, and stats). This makes the UI filter inconsistent with the existing badge/API and will miss jobs that have a stub description. Consider using the same predicate here (including the length threshold) and reusing it for both the true and false branches to keep behavior consistent.
| // Needs description filter | |
| if (filter.NeedsDescription.HasValue) | |
| { | |
| if (filter.NeedsDescription.Value) | |
| query = query.Where(j => string.IsNullOrWhiteSpace(j.Description)); | |
| else | |
| query = query.Where(j => !string.IsNullOrWhiteSpace(j.Description)); | |
| const int MinimumDescriptionLength = 100; | |
| bool NeedsDescription(JobListing job) => | |
| string.IsNullOrWhiteSpace(job.Description) || | |
| job.Description.Trim().Length < MinimumDescriptionLength; | |
| // Needs description filter | |
| if (filter.NeedsDescription.HasValue) | |
| { | |
| if (filter.NeedsDescription.Value) | |
| query = query.Where(NeedsDescription); | |
| else | |
| query = query.Where(j => !NeedsDescription(j)); |
| filter.Interest = string.IsNullOrEmpty(selectedInterest) ? null : Enum.Parse<InterestStatus>(selectedInterest); | ||
| filter.HasSalary = selectedHasSalary == "true" ? true : selectedHasSalary == "false" ? false : null; | ||
| filter.SalarySourceFilter = selectedHasSalary == "posted" || selectedHasSalary == "estimated" || selectedHasSalary == "not-estimated" ? selectedHasSalary : null; | ||
| filter.NeedsDescription = selectedNeedsDescription == "true" ? true : selectedNeedsDescription == "false" ? false : null; | ||
| filter.ApplicationStage = string.IsNullOrEmpty(selectedApplicationStage) ? null : Enum.Parse<ApplicationStage>(selectedApplicationStage); |
There was a problem hiding this comment.
selectedNeedsDescription is now part of the active filter state (filter.NeedsDescription), but it isn’t included in the filter preset save/restore logic (SaveCurrentAsPreset / OnPresetSelected). This means presets won’t persist the new Description filter selection. Consider extending SavedFilterPreset and updating preset save/restore to include this field for consistent behavior with the other filter controls.
filter changes