Webiant Logo Webiant Logo
  1. No results found.

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

HtmlExtensions.cs

using System.Globalization;
using System.Text;
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Rendering;
using Nop.Core.Infrastructure;
using Nop.Services.Localization;
using Nop.Services.Themes;
using Nop.Web.Framework.Extensions;
using Nop.Web.Framework.Themes;
using Nop.Web.Framework.UI.Paging;
using Nop.Web.Models.Boards;
using Nop.Web.Models.Common;

namespace Nop.Web.Extensions;

public static class HtmlExtensions
{
    /// 
    /// Ger JQuery Datepicker date format from the .net current culture
    /// 
    /// HtmlHelper object.
    /// Format string that supported in JQuery Datepicker.
    public static string GetJQueryDateFormat(this IHtmlHelper html)
    {
        /*
            *  Date used in this comment : 5th - Nov - 2009 (Thursday)
            *
            *  .NET    JQueryUI        Output      Comment
            *  --------------------------------------------------------------
            *  d       d               5           day of month(No leading zero)
            *  dd      dd              05          day of month(two digit)
            *  ddd     D               Thu         day short name
            *  dddd    DD              Thursday    day long name
            *  M       m               11          month of year(No leading zero)
            *  MM      mm              11          month of year(two digit)
            *  MMM     M               Nov         month name short
            *  MMMM    MM              November    month name long.
            *  yy      y               09          Year(two digit)
            *  yyyy    yy              2009        Year(four digit)             *
            */

        var currentFormat = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;

        // Convert the date
        currentFormat = currentFormat.Replace("dddd", "DD");
        currentFormat = currentFormat.Replace("ddd", "D");

        // Convert month
        if (currentFormat.Contains("MMMM"))
        {
            currentFormat = currentFormat.Replace("MMMM", "MM");
        }
        else if (currentFormat.Contains("MMM"))
        {
            currentFormat = currentFormat.Replace("MMM", "M");
        }
        else if (currentFormat.Contains("MM"))
        {
            currentFormat = currentFormat.Replace("MM", "mm");
        }
        else
        {
            currentFormat = currentFormat.Replace("M", "m");
        }

        // Convert year
        currentFormat = currentFormat.Contains("yyyy") ?
            currentFormat.Replace("yyyy", "yy") : currentFormat.Replace("yy", "y");

        return currentFormat;
    }

    /// 
    /// Prepare a common pager
    /// 
    /// Model type
    /// HTML helper
    /// Pager model
    /// 
    /// A task that represents the asynchronous operation
    /// The task result contains the pager
    /// 
    /// We have two pagers: The first one can have custom routes. The second one just adds query string parameter
    public static async Task PagerAsync(this IHtmlHelper html, PagerModel model)
    {
        if (model.TotalRecords == 0)
            return new HtmlString(string.Empty);

        var localizationService = EngineContext.Current.Resolve();

        var links = new StringBuilder();
        if (model.ShowTotalSummary && (model.TotalPages > 0))
        {
            links.Append("
  • "); links.Append(string.Format(await model.GetCurrentPageTextAsync(), model.PageIndex + 1, model.TotalPages, model.TotalRecords)); links.Append("
  • "); } if (model.ShowPagerItems && (model.TotalPages > 1)) { if (model.ShowFirst) { //first page if ((model.PageIndex >= 3) && (model.TotalPages > model.IndividualPagesDisplayedCount)) { model.RouteValues.PageNumber = 1; links.Append("
  • "); if (model.UseRouteLinks) { var link = html.RouteLink(await model.GetFirstButtonTextAsync(), model.RouteActionName, model.RouteValues, new { title = await localizationService.GetResourceAsync("Pager.FirstPageTitle") }); links.Append(await link.RenderHtmlContentAsync()); } else { var link = html.ActionLink(await model.GetFirstButtonTextAsync(), model.RouteActionName, model.RouteValues, new { title = await localizationService.GetResourceAsync("Pager.FirstPageTitle") }); links.Append(await link.RenderHtmlContentAsync()); } links.Append("
  • "); } } if (model.ShowPrevious) { //previous page if (model.PageIndex > 0) { model.RouteValues.PageNumber = model.PageIndex; links.Append("
  • "); if (model.UseRouteLinks) { var link = html.RouteLink(await model.GetPreviousButtonTextAsync(), model.RouteActionName, model.RouteValues, new { title = await localizationService.GetResourceAsync("Pager.PreviousPageTitle") }); links.Append(await link.RenderHtmlContentAsync()); } else { var link = html.ActionLink(await model.GetPreviousButtonTextAsync(), model.RouteActionName, model.RouteValues, new { title = await localizationService.GetResourceAsync("Pager.PreviousPageTitle") }); links.Append(await link.RenderHtmlContentAsync()); } links.Append("
  • "); } } if (model.ShowIndividualPages) { //individual pages var firstIndividualPageIndex = model.GetFirstIndividualPageIndex(); var lastIndividualPageIndex = model.GetLastIndividualPageIndex(); for (var i = firstIndividualPageIndex; i <= lastIndividualPageIndex; i++) { if (model.PageIndex == i) links.AppendFormat("
  • {0}
  • ", i + 1); else { model.RouteValues.PageNumber = i + 1; links.Append("
  • "); if (model.UseRouteLinks) { var link = html.RouteLink((i + 1).ToString(), model.RouteActionName, model.RouteValues, new { title = string.Format(await localizationService.GetResourceAsync("Pager.PageLinkTitle"), i + 1) }); links.Append(await link.RenderHtmlContentAsync()); } else { var link = html.ActionLink((i + 1).ToString(), model.RouteActionName, model.RouteValues, new { title = string.Format(await localizationService.GetResourceAsync("Pager.PageLinkTitle"), i + 1) }); links.Append(await link.RenderHtmlContentAsync()); } links.Append("
  • "); } } } if (model.ShowNext) { //next page if ((model.PageIndex + 1) < model.TotalPages) { model.RouteValues.PageNumber = (model.PageIndex + 2); links.Append("
  • "); if (model.UseRouteLinks) { var link = html.RouteLink(await model.GetNextButtonTextAsync(), model.RouteActionName, model.RouteValues, new { title = await localizationService.GetResourceAsync("Pager.NextPageTitle") }); links.Append(await link.RenderHtmlContentAsync()); } else { var link = html.ActionLink(await model.GetNextButtonTextAsync(), model.RouteActionName, model.RouteValues, new { title = await localizationService.GetResourceAsync("Pager.NextPageTitle") }); links.Append(await link.RenderHtmlContentAsync()); } links.Append("
  • "); } } if (model.ShowLast) { //last page if (((model.PageIndex + 3) < model.TotalPages) && (model.TotalPages > model.IndividualPagesDisplayedCount)) { model.RouteValues.PageNumber = model.TotalPages; links.Append("
  • "); if (model.UseRouteLinks) { var link = html.RouteLink(await model.GetLastButtonTextAsync(), model.RouteActionName, model.RouteValues, new { title = await localizationService.GetResourceAsync("Pager.LastPageTitle") }); links.Append(await link.RenderHtmlContentAsync()); } else { var link = html.ActionLink(await model.GetLastButtonTextAsync(), model.RouteActionName, model.RouteValues, new { title = await localizationService.GetResourceAsync("Pager.LastPageTitle") }); links.Append(await link.RenderHtmlContentAsync()); } links.Append("
  • "); } } } var result = links.ToString(); if (!string.IsNullOrEmpty(result)) result = "
      " + result + "
    "; return new HtmlString(result); } /// /// Prepare a common pager /// /// HTML helper /// Pager model /// Pager /// We have two pagers: The first one can have custom routes. The second one just adds query string parameter public static Pager Pager(this IHtmlHelper helper, IPageableModel model) { return new Pager(model, helper.ViewContext); } /// /// Prepare a special small pager for forum topics /// /// Model type /// HTML helper /// Model /// /// A task that represents the asynchronous operation /// The task result contains the pager /// public static async Task ForumTopicSmallPagerAsync(this IHtmlHelper html, ForumTopicRowModel model) { var localizationService = EngineContext.Current.Resolve(); var forumTopicId = model.Id; var forumTopicSlug = model.SeName; var totalPages = model.TotalPostPages; if (totalPages > 0) { var links = new StringBuilder(); if (totalPages <= 4) { for (var x = 1; x <= totalPages; x++) { var link = html.RouteLink(x.ToString(), "TopicSlugPaged", new { id = forumTopicId, pageNumber = x, slug = forumTopicSlug }, new { title = string.Format(await localizationService.GetResourceAsync("Pager.PageLinkTitle"), x.ToString()) }); links.Append(await link.RenderHtmlContentAsync()); if (x < totalPages) links.Append(", "); } } else { var link1 = html.RouteLink("1", "TopicSlugPaged", new { id = forumTopicId, pageNumber = 1, slug = forumTopicSlug }, new { title = string.Format(await localizationService.GetResourceAsync("Pager.PageLinkTitle"), 1) }); links.Append(await link1.RenderHtmlContentAsync()); links.Append(" ... "); for (var x = totalPages - 2; x <= totalPages; x++) { var link2 = html.RouteLink(x.ToString(), "TopicSlugPaged", new { id = forumTopicId, pageNumber = x, slug = forumTopicSlug }, new { title = string.Format(await localizationService.GetResourceAsync("Pager.PageLinkTitle"), x.ToString()) }); links.Append(await link2.RenderHtmlContentAsync()); if (x < totalPages) links.Append(", "); } } // Inserts the topic page links into the localized string ([Go to page: {0}]) return new HtmlString(string.Format(await localizationService.GetResourceAsync("Forum.Topics.GotoPostPager"), links)); } return new HtmlString(string.Empty); } /// /// Get a value of the text flow uses for the current UI culture /// /// HTML helper /// A value indicating whether to we should ignore RTL language property for admin area. False by default /// "rtl" if text flows from right to left; otherwise, "ltr". public static string GetUIDirection(this IHtmlHelper html, bool ignoreRtl = false) { if (ignoreRtl) return "ltr"; return CultureInfo.CurrentUICulture.TextInfo.IsRightToLeft ? "rtl" : "ltr"; } /// /// Return a value indicating whether the working language and theme support RTL (right-to-left) /// /// HTML helper /// Theme name /// /// A task that represents the asynchronous operation /// The task result contains the value /// public static async Task ShouldUseRtlThemeAsync(this IHtmlHelper html, string themeName = null) { if (!CultureInfo.CurrentUICulture.TextInfo.IsRightToLeft) return false; //ensure that the active theme also supports it themeName ??= await EngineContext.Current.Resolve().GetWorkingThemeNameAsync(); var theme = await EngineContext.Current.Resolve().GetThemeBySystemNameAsync(themeName); return theme?.SupportRtl ?? false; } }