Skip to content

Commit 5fcee7d

Browse files
authored
Merge pull request #14 from spech66/copilot/add-generic-filter-component
Add tree-structured query builder with AND/OR groups for advanced filtering
2 parents 8444101 + ad6618e commit 5fcee7d

36 files changed

Lines changed: 7503 additions & 62 deletions

LifelogBb/ApiControllers/BaseCRUDController.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,20 @@ public BaseCRUDController(S service)
2020

2121
// GET: api/[controller]
2222
[HttpGet]
23-
public virtual async Task<ActionResult<IEnumerable<OUTP>>> GetAll()
23+
public virtual async Task<ActionResult<IEnumerable<OUTP>>> GetAll([FromQuery] string? filter)
2424
{
25-
return Ok(await _service.GetAll());
25+
if (!string.IsNullOrWhiteSpace(filter))
26+
{
27+
try
28+
{
29+
return await _service.GetAll(filter);
30+
}
31+
catch (ArgumentException e)
32+
{
33+
return BadRequest(new { message = e.Message });
34+
}
35+
}
36+
return await _service.GetAll();
2637
}
2738

2839
// GET: api/[controller]/5

LifelogBb/ApiControllers/BaseRController.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,20 @@ public BaseRController(S service)
1919

2020
// GET: api/[controller]
2121
[HttpGet]
22-
public virtual async Task<ActionResult<IEnumerable<OUTP>>> GetAll()
22+
public virtual async Task<ActionResult<IEnumerable<OUTP>>> GetAll([FromQuery] string? filter)
2323
{
24-
return Ok(await _service.GetAll());
24+
if (!string.IsNullOrWhiteSpace(filter))
25+
{
26+
try
27+
{
28+
return await _service.GetAll(filter);
29+
}
30+
catch (ArgumentException e)
31+
{
32+
return BadRequest(new { message = e.Message });
33+
}
34+
}
35+
return await _service.GetAll();
2536
}
2637

2738
// GET: api/[controller]/5

LifelogBb/ApiServices/BaseCRUDService.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using Microsoft.EntityFrameworkCore;
44
using AutoMapper;
55
using LifelogBb.Models.Entities;
6+
using LifelogBb.Utilities;
67

78
namespace LifelogBb.ApiServices
89
{
@@ -21,8 +22,13 @@ public virtual async Task<ActionResult<IEnumerable<OUTP>>> GetAll()
2122
{
2223
var entities = await _repository.Query.ToListAsync();
2324
return _mapper.Map<List<OUTP>>(entities);
24-
//var notes = _repository.Query.GetPaged(1, 3);
25-
//return _mapper.Map<PagedResult<NoteOutput>>(notes);
25+
}
26+
27+
public virtual async Task<ActionResult<IEnumerable<OUTP>>> GetAll(string? filterJson)
28+
{
29+
var query = _repository.Query.FilterByGroup<TEntity>(filterJson, throwOnInvalidFilter: true);
30+
var entities = await query.ToListAsync();
31+
return _mapper.Map<List<OUTP>>(entities);
2632
}
2733

2834
public virtual async Task<OUTP> GetById(long id)

LifelogBb/ApiServices/BaseRService.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using Microsoft.EntityFrameworkCore;
44
using AutoMapper;
55
using LifelogBb.Models.Entities;
6+
using LifelogBb.Utilities;
67

78
namespace LifelogBb.ApiServices
89
{
@@ -23,6 +24,13 @@ public virtual async Task<ActionResult<IEnumerable<OUTP>>> GetAll()
2324
return _mapper.Map<List<OUTP>>(entities);
2425
}
2526

27+
public virtual async Task<ActionResult<IEnumerable<OUTP>>> GetAll(string? filterJson)
28+
{
29+
var query = _repository.Query.FilterByGroup<TEntity>(filterJson, throwOnInvalidFilter: true);
30+
var entities = await query.ToListAsync();
31+
return _mapper.Map<List<OUTP>>(entities);
32+
}
33+
2634
public virtual async Task<OUTP> GetById(long id)
2735
{
2836
var entity = await _repository.Query.FirstOrDefaultAsync(m => m.Id == id);

LifelogBb/Controllers/BucketListsController.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public async Task<IActionResult> Index(string sortOrder, string currentFilter, s
5151
}
5252

5353
// GET: BucketLists/Table/
54-
public async Task<IActionResult> Table(string sortOrder, string currentFilter, string searchString, int? pageNumber)
54+
public async Task<IActionResult> Table(string sortOrder, string currentFilter, string searchString, string? filter, int? pageNumber)
5555
{
5656
ViewData["CurrentSort"] = sortOrder;
5757

@@ -65,8 +65,10 @@ public async Task<IActionResult> Table(string sortOrder, string currentFilter, s
6565
}
6666

6767
ViewData["CurrentFilter"] = searchString;
68+
ViewData["Filter"] = filter;
6869

6970
var items = from s in _context.BucketLists select s;
71+
items = items.FilterByGroup(filter);
7072
items = items.SortByName(sortOrder, $"{nameof(BucketList.CreatedAt)}_desc");
7173

7274
var config = Config.GetConfig(_context);

LifelogBb/Controllers/EnduranceTrainingsController.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public async Task<IActionResult> Index()
6060
}
6161

6262
// GET: EnduranceTrainings/Table
63-
public async Task<IActionResult> Table(string sortOrder, string currentFilter, string searchString, int? pageNumber)
63+
public async Task<IActionResult> Table(string sortOrder, string currentFilter, string searchString, string? filter, int? pageNumber)
6464
{
6565
ViewData["CurrentSort"] = sortOrder;
6666

@@ -74,8 +74,10 @@ public async Task<IActionResult> Table(string sortOrder, string currentFilter, s
7474
}
7575

7676
ViewData["CurrentFilter"] = searchString;
77+
ViewData["Filter"] = filter;
7778

7879
var trainings = from s in _context.EnduranceTrainings select s;
80+
trainings = trainings.FilterByGroup(filter);
7981
trainings = trainings.SortByName(sortOrder, $"{nameof(EnduranceTraining.CreatedAt)}_desc");
8082

8183
var config = Config.GetConfig(_context);

LifelogBb/Controllers/GoalsController.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public async Task<IActionResult> Index()
4949
}
5050

5151
// GET: Goals/Table
52-
public async Task<IActionResult> Table(string sortOrder, string currentFilter, string searchString, int? pageNumber)
52+
public async Task<IActionResult> Table(string sortOrder, string currentFilter, string searchString, string? filter, int? pageNumber)
5353
{
5454
ViewData["CurrentSort"] = sortOrder;
5555

@@ -63,8 +63,10 @@ public async Task<IActionResult> Table(string sortOrder, string currentFilter, s
6363
}
6464

6565
ViewData["CurrentFilter"] = searchString;
66+
ViewData["Filter"] = filter;
6667

6768
var goals = from s in _context.Goals select s;
69+
goals = goals.FilterByGroup(filter);
6870
goals = goals.SortByName(sortOrder, $"{nameof(Goal.CreatedAt)}_desc");
6971

7072
var config = Config.GetConfig(_context);

LifelogBb/Controllers/HabitsController.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public async Task<IActionResult> Index()
9292
}
9393

9494
// GET: Habits/Table
95-
public async Task<IActionResult> Table(string sortOrder, string currentFilter, string searchString, int? pageNumber)
95+
public async Task<IActionResult> Table(string sortOrder, string currentFilter, string searchString, string? filter, int? pageNumber)
9696
{
9797
ViewData["CurrentSort"] = sortOrder;
9898

@@ -106,8 +106,10 @@ public async Task<IActionResult> Table(string sortOrder, string currentFilter, s
106106
}
107107

108108
ViewData["CurrentFilter"] = searchString;
109+
ViewData["Filter"] = filter;
109110

110111
var habits = from s in _context.Habits select s;
112+
habits = habits.FilterByGroup(filter);
111113
habits = habits.SortByName(sortOrder, $"{nameof(Habit.CreatedAt)}_desc");
112114

113115
var config = Config.GetConfig(_context);

LifelogBb/Controllers/JournalsController.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public async Task<IActionResult> CalendarEvents()
4141
}
4242

4343
// GET: Journals/Table
44-
public async Task<IActionResult> Table(string sortOrder, string currentFilter, string searchString, int? pageNumber)
44+
public async Task<IActionResult> Table(string sortOrder, string currentFilter, string searchString, string? filter, int? pageNumber)
4545
{
4646
ViewData["CurrentSort"] = sortOrder;
4747

@@ -55,8 +55,10 @@ public async Task<IActionResult> Table(string sortOrder, string currentFilter, s
5555
}
5656

5757
ViewData["CurrentFilter"] = searchString;
58+
ViewData["Filter"] = filter;
5859

5960
var journals = from s in _context.Journals select s;
61+
journals = journals.FilterByGroup(filter);
6062
journals = journals.SortByName(sortOrder, $"{nameof(Journal.Date)}_desc");
6163

6264
var config = Config.GetConfig(_context);

LifelogBb/Controllers/QuotesController.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public async Task<IActionResult> Index(string sortOrder, string currentFilter, s
5353
}
5454

5555
// GET: Quotes/Table/
56-
public async Task<IActionResult> Table(string sortOrder, string currentFilter, string searchString, int? pageNumber)
56+
public async Task<IActionResult> Table(string sortOrder, string currentFilter, string searchString, string? filter, int? pageNumber)
5757
{
5858
ViewData["CurrentSort"] = sortOrder;
5959

@@ -67,8 +67,10 @@ public async Task<IActionResult> Table(string sortOrder, string currentFilter, s
6767
}
6868

6969
ViewData["CurrentFilter"] = searchString;
70+
ViewData["Filter"] = filter;
7071

7172
var quotes = from s in _context.Quotes select s;
73+
quotes = quotes.FilterByGroup(filter);
7274
quotes = quotes.SortByName(sortOrder, $"{nameof(Quote.CreatedAt)}_desc");
7375

7476
var config = Config.GetConfig(_context);

0 commit comments

Comments
 (0)