Webiant Logo Webiant Logo
  1. No results found.

    Try your search with a different keyword or use * as a wildcard.

FilterLevelValueModelFactory.cs

using Microsoft.AspNetCore.Mvc.Rendering;
using Nop.Core.Domain.FilterLevels;
using Nop.Services.Catalog;
using Nop.Services.FilterLevels;
using Nop.Services.Localization;
using Nop.Web.Models.Catalog;

namespace Nop.Web.Factories;

public partial class FilterLevelValueModelFactory : IFilterLevelValueModelFactory
{
    #region Fields

    protected readonly ICatalogModelFactory _catalogModelFactory;
    protected readonly IFilterLevelValueService _filterLevelValueService;
    protected readonly ILocalizationService _localizationService;

    #endregion

    #region Ctor

    public FilterLevelValueModelFactory(ICatalogModelFactory catalogModelFactory,
        IFilterLevelValueService filterLevelValueService,
        ILocalizationService localizationService)
    {
        _catalogModelFactory = catalogModelFactory;
        _filterLevelValueService = filterLevelValueService;
        _localizationService = localizationService;
    }

    #endregion

    #region Utilities

    /// 
    /// Prepare available filter level values
    /// 
    /// Filter level value items
    /// Filter level value enum
    /// A task that represents the asynchronous operation
    protected virtual async Task PrepareFilterLevelValuesAsync(IList items, FilterLevelEnum filterLevelValueEnum, string filterLevelValue = null)
    {
        ArgumentNullException.ThrowIfNull(items);

        var param1 = filterLevelValueEnum == FilterLevelEnum.FilterLevel1 ? filterLevelValue : null;
        var param2 = filterLevelValueEnum == FilterLevelEnum.FilterLevel2 ? filterLevelValue : null;
        var param3 = filterLevelValueEnum == FilterLevelEnum.FilterLevel3 ? filterLevelValue : null;

        //prepare available filter level values
        var availableFilterLevelValues = (await _filterLevelValueService.GetAllFilterLevelValuesAsync(param1, param2, param3))
            .Select(filterLevelValue =>
            {
                // filter by filter level value enum
                return filterLevelValueEnum switch
                {
                    FilterLevelEnum.FilterLevel1 => filterLevelValue.FilterLevel1Value,
                    FilterLevelEnum.FilterLevel2 => filterLevelValue.FilterLevel2Value,
                    FilterLevelEnum.FilterLevel3 => filterLevelValue.FilterLevel3Value,
                    _ => string.Empty,
                };
            })
            .Distinct()
            .OrderBy(levelValue => levelValue)
            .ToList();

        foreach (var flv in availableFilterLevelValues)
            items.Add(new SelectListItem { Value = flv, Text = flv });

        //insert special item for the default value
        var defaultItemText = await _localizationService.GetResourceAsync("Admin.Common.Select");
        items.Insert(0, new SelectListItem { Text = defaultItemText, Value = "" });
    }

    #endregion

    #region Methods

    /// 
    /// Prepare the filter level value overview model
    /// 
    /// Filter level values
    /// 
    /// The result contains the filter level value overview model
    /// 
    public virtual FilterLevelValueOverviewModel PrepareFilterLevelValueOverviewModel(IList filterLevelValues)
    {
        ArgumentNullException.ThrowIfNull(filterLevelValues);

        var (filterLevel1Disabled, filterLevel2Disabled, filterLevel3Disabled) = _filterLevelValueService.IsFilterLevelDisabled();

        var model = new FilterLevelValueOverviewModel
        {
            TotalFilterLevelValues = filterLevelValues.Count,
            FilterLevel1ValueEnabled = !filterLevel1Disabled,
            FilterLevel2ValueEnabled = !filterLevel2Disabled,
            FilterLevel3ValueEnabled = !filterLevel3Disabled
        };

        foreach (var filterLevelValue in filterLevelValues)
        {
            var itemModel = new FilterLevelValueInfoModel
            {
                FilterLevel1Value = filterLevelValue.FilterLevel1Value,
                FilterLevel2Value = filterLevelValue.FilterLevel2Value,
                FilterLevel3Value = filterLevelValue.FilterLevel3Value,
            };
            model.FilterLevelValues.Add(itemModel);
        }

        return model;
    }    

    /// 
    /// Prepare filter level value search model
    /// 
    /// Filter level value search model
    /// 
    /// A task that represents the asynchronous operation
    /// The task result contains the filter level value search model
    /// 
    public virtual async Task PrepareFilterLevelValueSearchModelAsync(FilterLevelValueSearchModel searchModel)
    {
        ArgumentNullException.ThrowIfNull(searchModel);

        var (filterLevel1Disabled, filterLevel2Disabled, filterLevel3Disabled) = _filterLevelValueService.IsFilterLevelDisabled();

        //prepare filter (0 - all;)
        searchModel.HideSearchFilterValue1 = filterLevel1Disabled;
        if (!filterLevel1Disabled)
            await PrepareFilterLevelValuesAsync(searchModel.AvailableFilterLevel1Values, FilterLevelEnum.FilterLevel1);

        searchModel.HideSearchFilterValue2 = filterLevel2Disabled;
        searchModel.HideSearchFilterValue3 = filterLevel3Disabled;

        return searchModel;
    }

    /// 
    /// Prepare search filter level value model
    /// 
    /// Search filter level value model
    /// Model to get the catalog products
    /// 
    /// A task that represents the asynchronous operation
    /// The task result contains the search filter level value model
    /// 
    public virtual async Task PrepareSearchFilterLevelValueModelAsync(SearchFilterLevelValueModel model, CatalogProductsCommand command)
    {
        ArgumentNullException.ThrowIfNull(model);
        ArgumentNullException.ThrowIfNull(command);

        var (filterLevel1Disabled, filterLevel2Disabled, filterLevel3Disabled) = _filterLevelValueService.IsFilterLevelDisabled();
        model.HideSearchFilterValue1 = filterLevel1Disabled;
        model.HideSearchFilterValue2 = filterLevel2Disabled;
        model.HideSearchFilterValue3 = filterLevel3Disabled;

        if (!filterLevel1Disabled)
        {
            await PrepareFilterLevelValuesAsync(model.AvailableFilterLevel1Values, FilterLevelEnum.FilterLevel1);
            foreach (var item in model.AvailableFilterLevel1Values)
            {
                if (item.Value == model.fl1id)
                    item.Selected = true;
            }

            if (!string.IsNullOrEmpty(model.fl1id) && !filterLevel2Disabled)
            {
                await PrepareFilterLevelValuesAsync(model.AvailableFilterLevel2Values, FilterLevelEnum.FilterLevel2, model.fl2id);
                foreach (var item in model.AvailableFilterLevel2Values)
                {
                    if (item.Value == model.fl2id)
                        item.Selected = true;
                }

                if (!filterLevel3Disabled)
                {
                    await PrepareFilterLevelValuesAsync(model.AvailableFilterLevel3Values, FilterLevelEnum.FilterLevel3, model.fl3id);
                    foreach (var item in model.AvailableFilterLevel3Values)
                    {
                        if (item.Value == model.fl3id)
                            item.Selected = true;
                    }
                }
            }

            model.CatalogProductsModel = await _catalogModelFactory.PrepareSearchProductsByFilterLevelValuesModelAsync(model, command);
        }

        return model;
    }

    #endregion
}