using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Text; using System.Web.Mvc; using Kendo.Mvc.UI; using Kendo.Mvc.UI.Fluent; using Kreta.Resources; namespace Kreta.Web.Helpers { public static class MultiSelectExtensions { public static MultiSelectBuilder KretaMultiSelect(this HtmlHelper helper, string id, string url = null , string dataTextField = "Text", string datavalueField = "Value", string groupName = null, Type groupType = null, bool isSingleElementSet = true) { var multiSelect = helper.Kendo().MultiSelect() .Name(id) .DataTextField(dataTextField) .DataValueField(datavalueField); if (!string.IsNullOrWhiteSpace(groupName)) { multiSelect.DataSource(source => { source.Custom() .ServerFiltering(enabled: true) .Transport(transport => transport.Read(read => read.Url(url))) .Group(g => g.Add(groupName, groupType)); }); } else { multiSelect.DataSource(source => { source.Custom() .ServerFiltering(enabled: true) .Transport(transport => transport.Read(read => read.Url(url))); }); } SetDataBoundEvent(isSingleElementSet, multiSelect); return multiSelect; } public static MultiSelectBuilder KretaMultiSelect(this HtmlHelper helper, string id, List items, object htmlAttributes = null, bool isSingleElementSet = true) { var multiSelect = helper.Kendo().MultiSelect() .Name(id) .BindTo(items) .HtmlAttributes(htmlAttributes); SetDataBoundEvent(isSingleElementSet, multiSelect); return multiSelect; } public static MultiSelectBuilder KretaMultiSelectFor(this HtmlHelper helper, Expression> expression, IEnumerable selectList, IDictionary htmlAttributes = null, bool isSingleElementSet = true) { var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); if (htmlAttributes == null) { htmlAttributes = new Dictionary(); } if (metadata.IsRequired) { htmlAttributes.Add("data-labelmsg", metadata.DisplayName + " *"); } else { htmlAttributes.Add("data-labelmsg", metadata.DisplayName); } var multiSelect = helper.Kendo() .MultiSelectFor(expression) .BindTo(selectList) .HtmlAttributes(htmlAttributes); SetDataBoundEvent(isSingleElementSet, multiSelect); return multiSelect; } public static MultiSelectBuilder KretaMultiSelectFor(this HtmlHelper helper, Expression> expression, string url, string dataTextField = "Text", string datavalueField = "Value", IDictionary htmlAttributes = null, bool isSingleElementSet = true) { var fieldName = ExpressionHelper.GetExpressionText(expression); var fullBindingName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(fieldName); var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); var value = metadata.Model; if (htmlAttributes == null) { htmlAttributes = new Dictionary(); } if (metadata.IsRequired) { htmlAttributes.Add("data-labelmsg", metadata.DisplayName + " *"); } else { htmlAttributes.Add("data-labelmsg", metadata.DisplayName); } var multiSelect = helper.Kendo() .MultiSelectFor(expression) .DataTextField(dataTextField) .DataValueField(datavalueField) .DataSource(source => { source.Custom() .Transport(transport => { transport.Read( read => read.Url(url)); }); }) .HtmlAttributes(htmlAttributes); SetDataBoundEvent(isSingleElementSet, multiSelect); return multiSelect; } public static MultiSelectBuilder KretaMultiSelectNyomtatvany(this HtmlHelper helper, string id, string url, IDictionary htmlAttributes = null, bool? grouping = null, string groupName = null, bool isSingleElementSet = true) { (htmlAttributes ?? (htmlAttributes = new Dictionary(StringComparer.OrdinalIgnoreCase))).Add("data-labelmsg", id); var multiSelect = helper.Kendo().MultiSelect() .Name(id) .Placeholder(CommonResource.PleaseChoose) .AutoClose(autoClose: false) .HtmlAttributes(htmlAttributes) .DataTextField("Text") .DataValueField("Value"); SetDataBoundEvent(isSingleElementSet, multiSelect); if (grouping == true && !string.IsNullOrWhiteSpace(groupName)) { multiSelect.DataSource(source => { source.Custom() .Transport(transport => transport.Read(read => read.Url(url))) .Group(g => g.Add(groupName, typeof(string))); }); } else { multiSelect.DataSource(source => { source.Custom() .Transport(transport => transport.Read(read => read.Url(url))); }); } multiSelect.Events(e => e.Open("KretaMultiSelectHelper.onOpenDropdownMultiSelect")); return multiSelect; } private static void SetDataBoundEvent(bool isSingleElementSet, MultiSelectBuilder multiSelect) { if (isSingleElementSet) { multiSelect.Events(e => e.DataBound("KretaMultiSelectHelper.dataBoundMultiSelect")); } } public static MvcHtmlString RenderSearchPanel(this MultiSelectBuilder helper) { var labelMsg = ""; foreach (var item in helper.ToComponent().HtmlAttributes) { if (string.Equals(item.Key, "data-labelmsg", StringComparison.OrdinalIgnoreCase) && item.Value != null) { labelMsg = item.Value.ToString(); } } var sb = new StringBuilder(); sb.Append("
"); sb.Append(""); sb.Append("
"); sb.Append(helper.ToHtmlString()); sb.Append("
"); return new MvcHtmlString(sb.ToString()); } public static MvcHtmlString RenderSearchPanelSideBar(this MultiSelectBuilder helper, bool allButtons = false) { var labelMsg = ""; foreach (var item in helper.ToComponent().HtmlAttributes) { if (string.Equals(item.Key, "data-labelmsg", StringComparison.OrdinalIgnoreCase) && item.Value != null) { labelMsg = item.Value.ToString(); } } var name = helper.ToComponent().Name; var sb = new StringBuilder(); sb.Append("
"); sb.Append("
"); sb.Append(""); sb.Append("
"); sb.Append("
"); sb.Append(helper.ToHtmlString()); if (allButtons) { sb.Append("
"); sb.Append(""); sb.Append(""); sb.Append("
"); } sb.Append("
"); sb.Append("
"); if (allButtons) { sb.Append(""); } return new MvcHtmlString(sb.ToString()); } public static MvcHtmlString RenderWithName(this MultiSelectBuilder helper, int labelWidth = 6, int inputWidth = 6, string tooltipResource = null, bool isCustomRequired = false) { var labelMsg = ""; foreach (var item in helper.ToComponent().HtmlAttributes) { if (string.Equals(item.Key, "data-labelmsg", StringComparison.OrdinalIgnoreCase) && item.Value != null) { labelMsg = item.Value.ToString(); } } if (isCustomRequired) { labelMsg += " *"; } var sb = new StringBuilder(); if (string.IsNullOrWhiteSpace(tooltipResource)) { AddRenderWithNameBeginingFrame(sb, labelWidth, inputWidth, helper.ToComponent().Name, labelMsg, string.Empty); } else { AddRenderWithNameTooltipBeginingFrame(sb, labelWidth, inputWidth, helper.ToComponent().Name, labelMsg, string.Empty, tooltipResource); } sb.Append(helper.ToHtmlString()); AddRenderWithNameCloseingFrame(sb); return new MvcHtmlString(sb.ToString()); } public static MvcHtmlString RenderWithName(this MultiSelectBuilder helper, string label, int labelWidth = 6, int inputWidth = 6, string tooltipResource = null) { var sb = new StringBuilder(); if (string.IsNullOrWhiteSpace(tooltipResource)) { AddRenderWithNameBeginingFrame(sb, labelWidth, inputWidth, helper.ToComponent().Name, label, string.Empty); } else { AddRenderWithNameTooltipBeginingFrame(sb, labelWidth, inputWidth, helper.ToComponent().Name, label, string.Empty, tooltipResource); } sb.Append(helper.ToHtmlString()); AddRenderWithNameCloseingFrame(sb); return new MvcHtmlString(sb.ToString()); } public static MvcHtmlString RenderWithoutName(this MultiSelectBuilder helper, int inputWidth = 12, string customClass = "") { var sb = new StringBuilder(); AddRenderWithNameBeginingFrame(sb, 0, inputWidth, helper.ToComponent().Name, string.Empty, customClass); sb.Append(helper.ToHtmlString()); AddRenderWithNameCloseingFrame(sb); return new MvcHtmlString(sb.ToString()); } private static void AddRenderWithNameBeginingFrame(StringBuilder sb, int labelWidth, int inputWidth, string controlName, string labelMsg, string customClass) { sb.AppendFormat("
", BootsrapHelper.GetSizeClasses(labelWidth), customClass); sb.AppendFormat("", controlName, labelMsg); sb.AppendFormat("
", BootsrapHelper.GetSizeClasses(inputWidth), customClass); } private static void AddRenderWithNameTooltipBeginingFrame(StringBuilder sb, int labelWidth, int inputWidth, string controlName, string labelMsg, string customClass, string tooltipResource) { sb.AppendFormat("
", BootsrapHelper.GetSizeClasses(labelWidth), customClass); sb.AppendFormat(""); sb.AppendFormat("
", BootsrapHelper.GetSizeClasses(inputWidth), customClass); } private static void AddRenderWithNameCloseingFrame(StringBuilder sb) { sb.Append("
"); } } }