示例#1
0
        public TabFactory(TabStripTagHelper tabStrip, TagHelperContext context)
        {
            Guard.NotNull(tabStrip, nameof(tabStrip));
            Guard.NotNull(context, nameof(context));

            TabStrip = tabStrip;
            Context  = context;
        }
示例#2
0
        public TabStripCreated(TabStripTagHelper tabStrip, TagHelperContext context)
        {
            Guard.NotNull(tabStrip, nameof(tabStrip));

            TabStrip     = tabStrip;
            TabFactory   = new TabFactory(tabStrip, context);
            TabStripName = tabStrip.Id;
            Html         = tabStrip.HtmlHelper;
            Model        = tabStrip.ViewContext.ViewData.Model;
        }
        public static IHtmlContent LocalizedEditor <TModel, TLocalizedModelLocal>(this IHtmlHelper <TModel> helper,
                                                                                  string name,
                                                                                  Func <int, HelperResult> localizedTemplate,
                                                                                  Func <TModel, HelperResult> masterTemplate)
            where TModel : ILocalizedModel <TLocalizedModelLocal>
            where TLocalizedModelLocal : ILocalizedLocaleModel
        {
            var locales           = helper.ViewData.Model.Locales;
            var hasMasterTemplate = masterTemplate != null;

            if (locales.Count > 1)
            {
                var services            = helper.ViewContext.HttpContext.RequestServices;
                var db                  = services.GetRequiredService <SmartDbContext>();
                var languageService     = services.GetRequiredService <ILanguageService>();
                var localizationService = services.GetRequiredService <ILocalizationService>();
                var tabs                = new List <TabItem>(locales.Count + 1);
                var languages           = new List <Language>(locales.Count + 1);

                // Create the parent tabstrip
                var strip = new TabStripTagHelper
                {
                    ViewContext       = helper.ViewContext,
                    Id                = name,
                    SmartTabSelection = false,
                    Style             = TabsStyle.Tabs,
                    PublishEvent      = false
                };

                if (hasMasterTemplate)
                {
                    var masterLanguage = db.Languages.FindById(languageService.GetMasterLanguageId(), false);
                    languages.Add(masterLanguage);

                    // Add the first default tab for the master template
                    tabs.Add(new TabItem
                    {
                        Selected = true,
                        Text     = localizationService.GetResource("Admin.Common.Standard")
                    });
                }

                // Add all language specific tabs
                for (var i = 0; i < locales.Count; i++)
                {
                    var locale   = locales[i];
                    var language = db.Languages.FindById(locale.LanguageId, false);
                    languages.Add(language);

                    tabs.Add(new TabItem
                    {
                        Selected = !hasMasterTemplate && i == 0,
                        Text     = language.Name,
                        ImageUrl = "~/images/flags/" + language.FlagImageFileName
                    });
                }

                // Create TagHelperContext for tabstrip.
                var stripContext = new TagHelperContext("tabstrip", new TagHelperAttributeList(), new Dictionary <object, object>(), CommonHelper.GenerateRandomDigitCode(10));

                // Must init tabstrip, otherwise "Parent" is null inside tab helpers.
                strip.Init(stripContext);

                // Create tab factory
                var tabFactory = new TabFactory(strip, stripContext);

                // Create AttributeList for tabstrip
                var stripOutputAttrList = new TagHelperAttributeList {
                    new TagHelperAttribute("class", "nav-locales")
                };

                // Emulate tabstrip output
                var stripOutput = new TagHelperOutput("tabstrip", stripOutputAttrList, (_, _) =>
                {
                    // getChildContentAsync for tabstrip
                    for (var i = 0; i < tabs.Count; i++)
                    {
                        var isMaster = hasMasterTemplate && i == 0;
                        var language = languages[i];

                        tabFactory.AddAsync(builder =>
                        {
                            builder.Item = tabs[i];
                            builder
                            .Content(isMaster ? masterTemplate(helper.ViewData.Model) : localizedTemplate(i - 1))
                            .HtmlAttributes("title", language.Name, !isMaster)
                            .ContentHtmlAttributes(new
                            {
                                @class    = "locale-editor-content",
                                data_lang = language.LanguageCulture,
                                data_rtl  = language.Rtl.ToString().ToLower()
                            });
                        }).GetAwaiter().GetResult();
                    }

                    // We don't need the child content for tabstrip. It builds everything without any child content.
                    return(Task.FromResult <TagHelperContent>(new DefaultTagHelperContent()));
                });

                // Process parent tabstrip
                strip.ProcessAsync(stripContext, stripOutput).GetAwaiter().GetResult();

                var wrapper = new TagBuilder("div");
                wrapper.Attributes.Add("class", "locale-editor");

                return(stripOutput.WrapElementWith(wrapper));
            }
            else if (hasMasterTemplate)
            {
                return(masterTemplate(helper.ViewData.Model));
            }

            return(HtmlString.Empty);
        }