Webiant Logo Webiant Logo
  1. No results found.

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

PropertyManager.cs

using System.Drawing;
using ClosedXML.Excel;
using Microsoft.AspNetCore.Mvc.Rendering;
using Nop.Core.Domain.Catalog;
using Nop.Core.Domain.Localization;

namespace Nop.Services.ExportImport.Help;

/// 
/// Class for working with PropertyByName object list
/// 
/// Object type
/// Language
public partial class PropertyManager where L : Language
{
    /// 
    /// Default properties
    /// 
    protected readonly Dictionary> _defaultProperties;

    /// 
    /// Localized properties
    /// 
    protected readonly Dictionary> _localizedProperties;

    /// 
    /// Catalog settings
    /// 
    protected readonly CatalogSettings _catalogSettings;

    /// 
    /// Languages
    /// 
    protected readonly IList _languages;

    /// 
    /// Ctor
    /// 
    /// Default access properties
    /// Catalog settings
    /// Localized access properties
    /// Languages
    public PropertyManager(IEnumerable> defaultProperties, CatalogSettings catalogSettings, IEnumerable> localizedProperties = null, IList languages = null)
    {
        _defaultProperties = new Dictionary>();
        _catalogSettings = catalogSettings;
        _localizedProperties = new Dictionary>();
        _languages = new List();

        if (languages != null)
            _languages = languages;

        var poz = 1;
        foreach (var propertyByName in defaultProperties.Where(p => !p.Ignore))
        {
            propertyByName.PropertyOrderPosition = poz;
            poz++;
            _defaultProperties.Add(propertyByName.PropertyName, propertyByName);
        }

        if (_languages.Count >= 2 && localizedProperties != null)
        {
            var lpoz = 1;
            foreach (var propertyByName in localizedProperties.Where(p => !p.Ignore))
            {
                propertyByName.PropertyOrderPosition = lpoz;
                lpoz++;
                _localizedProperties.Add(propertyByName.PropertyName, propertyByName);
            }
        }
    }

    /// 
    /// Export objects to XLSX
    /// 
    /// Type of object
    /// The objects to export
    /// 
    /// A task that represents the asynchronous operation
    /// The task result contains the 
    /// 
    public virtual async Task ExportToXlsxAsync(IEnumerable itemsToExport)
    {
        await using var stream = new MemoryStream();
        // ok, we can run the real code of the sample now
        using (var workbook = new XLWorkbook())
        {
            // uncomment this line if you want the XML written out to the outputDir
            //xlPackage.DebugMode = true; 

            // get handles to the worksheets
            var worksheet = workbook.Worksheets.Add(typeof(T).Name);
            var fWorksheet = workbook.Worksheets.Add("DataForFilters");
            fWorksheet.Visibility = XLWorksheetVisibility.VeryHidden;

            //create Headers and format them 
            WriteDefaultCaption(worksheet);

            var lwss = new Dictionary();

            if (_languages.Count >= 2)
            {
                foreach (var language in _languages)
                {
                    var lws = workbook.Worksheets.Add(language.UniqueSeoCode);
                    lwss.Add(language, lws);
                    WriteLocalizedCaption(lws);
                }
            }

            var row = 2;
            foreach (var items in itemsToExport)
            {
                CurrentObject = items;
                await WriteDefaultToXlsxAsync(worksheet, row, fWorksheet: fWorksheet);

                foreach (var lws in lwss)
                {
                    CurrentLanguage = lws.Key;
                    await WriteLocalizedToXlsxAsync(lws.Value, row, fWorksheet: fWorksheet);
                }

                row++;
            }

            workbook.SaveAs(stream);
        }

        CurrentObject = default;
        return stream.ToArray();
    }

    /// 
    /// Current object to access
    /// 
    public T CurrentObject { get; set; }

    /// 
    /// Current language to access
    /// 
    public L CurrentLanguage { get; set; }

    /// 
    /// Return property index
    /// 
    /// Property name
    /// 
    public int GetIndex(string propertyName)
    {
        if (!_defaultProperties.TryGetValue(propertyName, out var value))
            return -1;

        return value.PropertyOrderPosition;
    }

    /// 
    /// Remove object by property name
    /// 
    /// Property name
    public void Remove(string propertyName)
    {
        _defaultProperties.Remove(propertyName);
    }

    /// 
    /// Write default object data to XLSX worksheet
    /// 
    /// Data worksheet
    /// Row index
    /// Cell offset
    /// Filters worksheet
    /// A task that represents the asynchronous operation
    public virtual async Task WriteDefaultToXlsxAsync(IXLWorksheet worksheet, int row, int cellOffset = 0, IXLWorksheet fWorksheet = null)
    {
        if (CurrentObject == null)
            return;

        var xlRrow = worksheet.Row(row);
        xlRrow.Style.Alignment.WrapText = false;
        foreach (var prop in _defaultProperties.Values)
        {
            var cell = xlRrow.Cell(prop.PropertyOrderPosition + cellOffset);
            if (prop.IsDropDownCell && _catalogSettings.ExportImportRelatedEntitiesByName)
            {
                var dropDownElements = prop.GetDropDownElements();
                if (!dropDownElements.Any())
                {
                    cell.Value = string.Empty;
                    continue;
                }

                cell.Value = prop.GetItemText(await prop.GetProperty(CurrentObject, CurrentLanguage));

                if (!UseDropdownLists)
                    continue;

                var validator = cell.GetDataValidation();
                validator.InCellDropdown = true;

                validator.IgnoreBlanks = prop.AllowBlank;

                if (fWorksheet == null)
                    continue;

                var fRow = 1;
                foreach (var dropDownElement in dropDownElements)
                {
                    var fCell = fWorksheet.Row(fRow++).Cell(prop.PropertyOrderPosition);

                    if (!fCell.IsEmpty() && fCell.Value.ToString() == dropDownElement)
                        break;

                    fCell.Value = dropDownElement;
                }

                validator.List(fWorksheet.Range(1, prop.PropertyOrderPosition, dropDownElements.Length, prop.PropertyOrderPosition), true);
            }
            else
            {
                var value = await prop.GetProperty(CurrentObject, CurrentLanguage);
                cell.SetValue((XLCellValue)value?.ToString());
            }
            cell.Style.Alignment.WrapText = false;
        }
    }

    /// 
    /// Write localized data to XLSX worksheet
    /// 
    /// Data worksheet
    /// Row index
    /// Cell offset
    /// Filters worksheet
    /// A task that represents the asynchronous operation
    public virtual async Task WriteLocalizedToXlsxAsync(IXLWorksheet worksheet, int row, int cellOffset = 0, IXLWorksheet fWorksheet = null)
    {
        if (CurrentObject == null)
            return;

        var xlRrow = worksheet.Row(row);
        xlRrow.Style.Alignment.WrapText = false;
        foreach (var prop in _localizedProperties.Values)
        {
            var cell = xlRrow.Cell(prop.PropertyOrderPosition + cellOffset);
            if (prop.IsDropDownCell && _catalogSettings.ExportImportRelatedEntitiesByName)
            {
                var dropDownElements = prop.GetDropDownElements();
                if (!dropDownElements.Any())
                {
                    cell.Value = string.Empty;
                    continue;
                }

                cell.Value = prop.GetItemText(await prop.GetProperty(CurrentObject, CurrentLanguage));

                if (!UseDropdownLists)
                    continue;

                var validator = cell.GetDataValidation();
                validator.InCellDropdown = true;

                validator.IgnoreBlanks = prop.AllowBlank;

                if (fWorksheet == null)
                    continue;

                var fRow = 1;
                foreach (var dropDownElement in dropDownElements)
                {
                    var fCell = fWorksheet.Row(fRow++).Cell(prop.PropertyOrderPosition);

                    if (!fCell.IsEmpty() && fCell.Value.ToString() == dropDownElement)
                        break;

                    fCell.Value = dropDownElement;
                }

                validator.List(fWorksheet.Range(1, prop.PropertyOrderPosition, dropDownElements.Length, prop.PropertyOrderPosition), true);
            }
            else
            {
                var value = await prop.GetProperty(CurrentObject, CurrentLanguage);
                cell.SetValue((XLCellValue)value?.ToString());
            }
            cell.Style.Alignment.WrapText = false;
        }
    }

    /// 
    /// Read object data from default XLSX worksheet
    /// 
    /// worksheet
    /// Row index
    /// /// Cell offset
    public virtual void ReadDefaultFromXlsx(IXLWorksheet worksheet, int row, int cellOffset = 0)
    {
        if (worksheet?.Cells() == null)
            return;

        foreach (var prop in _defaultProperties.Values)
        {
            prop.PropertyValue = worksheet.Row(row).Cell(prop.PropertyOrderPosition + cellOffset).Value;
        }
    }

    /// 
    /// Read object data from localized XLSX worksheet
    /// 
    /// worksheet
    /// Row index
    /// /// Cell offset
    public virtual void ReadLocalizedFromXlsx(IXLWorksheet worksheet, int row, int cellOffset = 0)
    {
        if (worksheet?.Cells() == null)
            return;

        foreach (var prop in _localizedProperties.Values)
        {
            prop.PropertyValue = worksheet.Row(row).Cell(prop.PropertyOrderPosition + cellOffset).Value;
        }
    }

    /// 
    /// Write caption (first row) to default XLSX worksheet
    /// 
    /// worksheet
    /// Row number
    /// Cell offset
    public virtual void WriteDefaultCaption(IXLWorksheet worksheet, int row = 1, int cellOffset = 0)
    {
        foreach (var caption in _defaultProperties.Values)
        {
            var cell = worksheet.Row(row).Cell(caption.PropertyOrderPosition + cellOffset);
            cell.Value = caption.ToString();

            SetCaptionStyle(cell);
        }
    }

    /// 
    /// Write caption (first row) to localized XLSX worksheet
    /// 
    /// worksheet
    /// Row number
    /// Cell offset
    public virtual void WriteLocalizedCaption(IXLWorksheet worksheet, int row = 1, int cellOffset = 0)
    {
        foreach (var caption in _localizedProperties.Values)
        {
            var cell = worksheet.Row(row).Cell(caption.PropertyOrderPosition + cellOffset);
            cell.Value = caption.ToString();

            SetCaptionStyle(cell);
        }
    }

    /// 
    /// Set caption style to excel cell
    /// 
    /// Excel cell
    public void SetCaptionStyle(IXLCell cell)
    {
        cell.Style.Fill.PatternType = XLFillPatternValues.Solid;
        cell.Style.Fill.BackgroundColor = XLColor.FromColor(Color.FromArgb(184, 204, 228));
        cell.Style.Font.Bold = true;
    }

    /// 
    /// Count of default properties
    /// 
    public int Count => _defaultProperties.Count;

    /// 
    /// Get default property by name
    /// 
    /// 
    /// 
    public PropertyByName GetDefaultProperty(string propertyName)
    {
        return _defaultProperties.TryGetValue(propertyName, out var value) ? value : null;
    }

    /// 
    /// Get localized property by name
    /// 
    /// 
    /// 
    public PropertyByName GetLocalizedProperty(string propertyName)
    {
        return _localizedProperties.TryGetValue(propertyName, out var value) ? value : null;
    }

    /// 
    /// Get default property array
    /// 
    public PropertyByName[] GetDefaultProperties => _defaultProperties.Values.ToArray();

    /// 
    /// Get localized property array
    /// 
    public PropertyByName[] GetLocalizedProperties => _localizedProperties.Values.ToArray();

    /// 
    /// Set SelectList
    /// 
    /// Property name
    /// SelectList
    public void SetSelectList(string propertyName, SelectList list)
    {
        var tempProperty = GetDefaultProperty(propertyName);
        if (tempProperty != null)
            tempProperty.DropDownElements = list;
    }

    /// 
    /// Is caption
    /// 
    public bool IsCaption => _defaultProperties.Values.All(p => p.IsCaption);

    /// 
    /// Gets a value indicating whether need create dropdown list for export
    /// 
    public bool UseDropdownLists => _catalogSettings.ExportImportUseDropdownlistsForAssociatedEntities && _catalogSettings.ExportImportRelatedEntitiesByName;
}