320 lines
14 KiB
C#
320 lines
14 KiB
C#
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<SelectListItem> 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<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, IDictionary<string, object> htmlAttributes = null, bool isSingleElementSet = true)
|
|
{
|
|
var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
|
|
|
|
if (htmlAttributes == null)
|
|
{
|
|
htmlAttributes = new Dictionary<string, object>();
|
|
}
|
|
|
|
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<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string url, string dataTextField = "Text", string datavalueField = "Value", IDictionary<string, object> 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<string, object>();
|
|
}
|
|
|
|
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<string, object> htmlAttributes = null, bool? grouping = null, string groupName = null, bool isSingleElementSet = true)
|
|
{
|
|
(htmlAttributes ?? (htmlAttributes = new Dictionary<string, object>(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("<div class=\"searchInputRowHeight\"><div>");
|
|
sb.Append("<label class=\"searchPanelInputLabel\" for=\"").Append(helper.ToComponent().Name).Append("\">").Append(labelMsg).Append("</label>");
|
|
sb.Append("</div><div>");
|
|
sb.Append(helper.ToHtmlString());
|
|
sb.Append("</div></div>");
|
|
|
|
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("<div class=\"searchPanelRow\">");
|
|
sb.Append("<div class=\"searchPanelRowTitle\">");
|
|
sb.Append("<label class=\"searchPanelLabel\" for=\"").Append(name).Append("\">").Append(labelMsg).Append("</label>");
|
|
sb.Append("</div>");
|
|
sb.Append("<div class=\"searchPanelRowValue\">");
|
|
sb.Append(helper.ToHtmlString());
|
|
|
|
if (allButtons)
|
|
{
|
|
sb.Append("<div style=\"margin-top: 3px;\">");
|
|
sb.Append("<button id=\"selectAll").Append(name).Append("\" type=\"button\" title=\"").Append(CommonResource.MindenElemKivalasztasa).Append("\" data-role=\"button\" class=\"k-button\" role=\"button\" aria-disabled=\"false\" tabindex=\"0\">+</button>");
|
|
sb.Append("<button id=\"deselectAll").Append(name).Append("\" type=\"button\" title=\"").Append(CommonResource.MindenElemEltavolitasa).Append("\" data-role=\"button\" class=\"k-button\" role=\"button\" aria-disabled=\"false\" tabindex=\"0\" style=\"margin-left: 3px;\">-</button>");
|
|
sb.Append("</div>");
|
|
}
|
|
|
|
sb.Append("</div>");
|
|
sb.Append("</div>");
|
|
|
|
if (allButtons)
|
|
{
|
|
sb.Append("<script>$(document).ready(function() { ");
|
|
sb.Append("var comp = $(\"#").Append(name).Append("\").data(\"kendoMultiSelect\");");
|
|
sb.Append("$(\"#selectAll").Append(name).Append("\").click(function() {{ var values = []; $.each(comp.dataSource.data(), function(i, v) {{ values.push(v.Value); }}); comp.value(values); }});");
|
|
sb.Append("$(\"#deselectAll").Append(name).Append("\").click(function() {{ comp.value([]); }});");
|
|
sb.Append("});</script>");
|
|
}
|
|
|
|
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("<div class=\"{0} {1} \">", BootsrapHelper.GetSizeClasses(labelWidth), customClass);
|
|
sb.AppendFormat("<label class=\"windowInputLabel\" for=\"{0}\">{1}</label>", controlName, labelMsg);
|
|
sb.AppendFormat("</div><div class=\"{0} {1}\">", BootsrapHelper.GetSizeClasses(inputWidth), customClass);
|
|
}
|
|
|
|
private static void AddRenderWithNameTooltipBeginingFrame(StringBuilder sb, int labelWidth, int inputWidth, string controlName, string labelMsg, string customClass, string tooltipResource)
|
|
{
|
|
sb.AppendFormat("<div class=\"{0} {1} kretaLabelTooltip \">", BootsrapHelper.GetSizeClasses(labelWidth), customClass);
|
|
sb.AppendFormat("<label class=\"windowInputLabel\" for=\"{0}\">{1}", controlName, labelMsg);
|
|
sb.Append(" <img class='kretaLabelTooltipImg' />");
|
|
sb.AppendFormat("<span class=\"kretaLabelTooltipText\">{0}</span>", tooltipResource);
|
|
sb.Append("</label>");
|
|
sb.AppendFormat("</div><div class=\"{0} {1}\">", BootsrapHelper.GetSizeClasses(inputWidth), customClass);
|
|
}
|
|
|
|
private static void AddRenderWithNameCloseingFrame(StringBuilder sb)
|
|
{
|
|
sb.Append("</div>");
|
|
}
|
|
}
|
|
}
|