using NLog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace ICS360.Models
{
public class PaginationHelper
{
private readonly ILogger _logger;
public PaginationHelper(ILogger logger)
{
_logger = logger;
}
public JsonResult GetFilteredData<T>(
List<T> sourceData,
int take,
int skip,
string filter,
Func<T, string> filterProperty,
string[] selectedIds,
Func<T, string> idProperty) where T : IBaseFilterResult
{
try
{
var filteredData = sourceData;
// Apply filter search text if provided
if (!string.IsNullOrEmpty(filter))
{
filteredData = sourceData
.Where(item => filterProperty(item)
.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0)
.ToList();
}
var total = filteredData.Count;
// Sort with selected items first, then by display name
var orderedData = filteredData
.OrderByDescending(item => selectedIds != null &&
selectedIds.Contains(idProperty(item)))
.ThenBy(item => filterProperty(item))
.ToList();
var pagedData = orderedData
.Skip(skip)
.Take(take)
.Select(item =>
{
item.IsSelected = selectedIds != null && selectedIds.Contains(idProperty(item));
return item;
})
.ToList();
return new JsonResult
{
Data = new { Data = pagedData, Total = total },
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
catch (Exception ex)
{
_logger.Error(ex);
return new JsonResult
{
Data = new { Data = new List<T>(), Total = 0 },
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
}
public JsonResult GetIndicesByIds<T, TId>(
List<T> sourceData,
List<TId> ids,
Func<T, TId> idProperty) where TId : IEquatable<TId>
{
if (ids == null || !ids.Any())
{
return new JsonResult
{
Data = new List<int>(),
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
try
{
var indices = ids
.Select(id => sourceData.FindIndex(item => idProperty(item).Equals(id)))
.Where(index => index >= 0)
.ToList();
return new JsonResult
{
Data = indices,
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
catch (Exception ex)
{
_logger.Error(ex);
return new JsonResult
{
Data = new List<int>(),
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
}
}
}