kreta/KretaWeb/Helpers/RangeDatePickerExtensions.cs
2024-03-13 00:33:46 +01:00

227 lines
14 KiB
C#

using System;
using System.Linq.Expressions;
using System.Text;
using System.Web.Mvc;
using Kreta.Framework;
namespace Kreta.Web.Helpers
{
public static class RangeDatePickerExtensions
{
public static MvcHtmlString KretaRangeDatePicker<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> fromExpression, Expression<Func<TModel, TValue>> toExpression, string title = "")
{
var fromFieldName = ExpressionHelper.GetExpressionText(fromExpression);
var fromFieldId = fromFieldName.Replace(".", "_");
var fromMetadata = ModelMetadata.FromLambdaExpression(fromExpression, helper.ViewData);
var fromDisplayName = fromMetadata.DisplayName;
var toFieldName = ExpressionHelper.GetExpressionText(toExpression);
var toFieldId = toFieldName.Replace(".", "_");
var toMetadata = ModelMetadata.FromLambdaExpression(toExpression, helper.ViewData);
var toDisplayName = toMetadata.DisplayName;
StringBuilder sb = new StringBuilder();
string fromDate = "<input id='" + fromFieldId + "' name='" + fromFieldName + "' />";
string toDate = "<input id='" + toFieldId + "' name='" + toFieldName + "' />";
string scriptTag = @"<script>
$(document).ready(function () {
function start" + fromFieldId + @"Change() {
var startDate = start" + fromFieldId + @".value(), endDate = end" + toFieldId + @".value();
if (typeof startDate !== 'undefined' && typeof endDate !== 'undefined'){
if (startDate) {
startDate = new Date(startDate);
startDate.setDate(startDate.getDate());
end" + toFieldId + @".min(startDate);
} else if (endDate) {
start" + fromFieldId + @".max(new Date(endDate));
} else {
endDate = new Date();
start" + fromFieldId + @".max(endDate);
end" + toFieldId + @".min(endDate);
}
}
}
function end" + toFieldId + @"Change() {
var endDate = end" + toFieldId + @".value(), startDate = start" + fromFieldId + @".value();
if (endDate) {
endDate = new Date(endDate);
endDate.setDate(endDate.getDate());
start" + fromFieldId + @".max(endDate);
} else if (startDate) {
end" + toFieldId + @".min(new Date(startDate));
} else {
endDate = new Date();
start" + fromFieldId + @".max(endDate);
end" + toFieldId + @".min(endDate);
}
}
var start" + fromFieldId + @" = $('#" + fromFieldId + @"').kendoDatePicker({
change: start" + fromFieldId + @"Change,
'format': 'yyyy. MM. dd.'
}).data('kendoDatePicker');
var end" + toFieldId + @" = $('#" + toFieldId + @"').kendoDatePicker({
change: end" + toFieldId + @"Change,
'format': 'yyyy. MM. dd.'
}).data('kendoDatePicker');
start" + fromFieldId + @".max(end" + toFieldId + @".value());
end" + toFieldId + @".min(start" + fromFieldId + @".value());
$('#" + fromFieldId + @"').parent().parent().after('" + string.Format("<span class=\"searchPanelLabel\">{0}</span>", StringResourcesUtil.GetString(3080)) + @"');
$('#" + toFieldId + @"').parent().parent().after('" + string.Format("<span class=\"searchPanelLabel\">{0}</span>", StringResourcesUtil.GetString(3081)) + @"');
});
</script>";
string displayName = "";
if (!string.IsNullOrWhiteSpace(title))
{ displayName = title; }
else
{
if (!string.IsNullOrWhiteSpace(fromDisplayName))
{ displayName = fromDisplayName; }
else
{
if (!string.IsNullOrWhiteSpace(toDisplayName))
{ displayName = toDisplayName; }
}
}
sb.Append("<div class=\"searchPanelRow\">");
sb.Append("<div class=\"searchPanelRowTitle\">");
sb.Append("<label class=\"searchPanelLabel\" for=\"").Append("aaa").Append("\">").Append(displayName).Append("</label>");
sb.Append("</div>");
sb.Append("<div class=\"searchPanelRowValue\">");
sb.Append(fromDate).Append("&nbsp;").Append(toDate).Append(scriptTag);
sb.Append("</div>");
sb.Append("</div>");
return new MvcHtmlString(sb.ToString());
}
public static MvcHtmlString KretaRangeDatePickerSideBar<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> fromExpression, Expression<Func<TModel, TValue>> toExpression, string title = "")
{
var fromFieldName = ExpressionHelper.GetExpressionText(fromExpression);
var fromFieldId = fromFieldName.Replace(".", "_");
var fromMetadata = ModelMetadata.FromLambdaExpression(fromExpression, helper.ViewData);
var fromDisplayName = fromMetadata.DisplayName;
var fromValue = fromMetadata.Model;
var toFieldName = ExpressionHelper.GetExpressionText(toExpression);
var toFieldId = toFieldName.Replace(".", "_");
var toMetadata = ModelMetadata.FromLambdaExpression(toExpression, helper.ViewData);
var toDisplayName = toMetadata.DisplayName;
var toValue = toMetadata.Model;
StringBuilder sb = new StringBuilder();
string fromDate = "<input id='" + fromFieldId + "' name='" + fromFieldName + "' value='" + fromValue + "' />";
string toDate = "<input id='" + toFieldId + "' name='" + toFieldName + "' value='" + toValue + "' />";
string scriptTag = @"<script>
$(document).ready(function () {
function start" + fromFieldId + @"Change() {
var startDate = start" + fromFieldId + @".value(), endDate = end" + toFieldId + @".value();
if (startDate) {
startDate = new Date(startDate);
startDate.setDate(startDate.getDate());
end" + toFieldId + @".min(startDate);
} else if (endDate) {
start" + fromFieldId + @".max(new Date(endDate));
end" + toFieldId + @".min(new Date(1900, 0, 1));
} else {
endDate = new Date();
start" + fromFieldId + @".max(endDate);
end" + toFieldId + @".min(endDate);
}
}
function end" + toFieldId + @"Change() {
var endDate = end" + toFieldId + @".value(), startDate = start" + fromFieldId + @".value();
if (endDate) {
endDate = new Date(endDate);
endDate.setDate(endDate.getDate());
start" + fromFieldId + @".max(endDate);
} else if (startDate) {
end" + toFieldId + @".min(new Date(startDate));
start" + fromFieldId + @".max(new Date(2099, 11, 31));
} else {
endDate = new Date();
start" + fromFieldId + @".max(endDate);
end" + toFieldId + @".min(endDate);
}
}
function open" + fromFieldId + @"Change() {
var endDate = Date.parse($('#" + toFieldId + @"').val());
if(isNaN(endDate)){
start" + fromFieldId + @".max(new Date(2099, 11, 31));
}
}
function open" + toFieldId + @"Change() {
var startDate = Date.parse( $('#" + fromFieldId + @"').val());
if(isNaN(startDate)){
end" + toFieldId + @".min(new Date(1900, 0, 1));
}
}
var start" + fromFieldId + @" = $('#" + fromFieldId + @"').kendoDatePicker({
change: start" + fromFieldId + @"Change,
open: open" + fromFieldId + @"Change,
'format': 'yyyy. MM. dd.'
}).data('kendoDatePicker');
var end" + toFieldId + @" = $('#" + toFieldId + @"').kendoDatePicker({
change: end" + toFieldId + @"Change,
open: open" + toFieldId + @"Change,
'format': 'yyyy. MM. dd.'
}).data('kendoDatePicker');
start" + fromFieldId + @".max(end" + toFieldId + @".value());
end" + toFieldId + @".min(start" + fromFieldId + @".value());
$('#" + fromFieldId + @"').parent().parent().after('" + string.Format("<span class=\"searchPanelLabel\">{0}</span>", StringResourcesUtil.GetString(3080)) + @"');
$('#" + toFieldId + @"').parent().parent().after('" + string.Format("<span class=\"searchPanelLabel\">{0}</span>", StringResourcesUtil.GetString(3081)) + @"');
});
</script>";
string displayName = "";
if (!string.IsNullOrWhiteSpace(title))
{ displayName = title; }
else
{
if (!string.IsNullOrWhiteSpace(fromDisplayName))
{ displayName = fromDisplayName; }
else
{
if (!string.IsNullOrWhiteSpace(toDisplayName))
{ displayName = toDisplayName; }
}
}
sb.Append("<div class=\"searchPanelRow\">");
sb.Append("<div class=\"searchPanelRowTitle\">");
sb.Append("<label class=\"searchPanelLabel\" for=\"").Append("aaa").Append("\">").Append(displayName).Append("</label>");
sb.Append("</div>");
sb.Append("<div class=\"searchPanelRowValue\">");
sb.Append(fromDate).Append("<br />").Append(toDate).Append(scriptTag);
sb.Append("</div>");
sb.Append("</div>");
sb.Append("<script>$(\"#").Append(fromFieldId).Append("\").kendoMaskedDatePicker();$(\"#").Append(toFieldName).Append("\").kendoMaskedDatePicker();");
sb.Append("$(\"#").Append(fromFieldId).Append("\").change(function() {{ KretaDateTimeHelper.validateDate($(this)); }});");
sb.Append("$(\"#").Append(toFieldId).Append("\").change(function() {{ KretaDateTimeHelper.validateDate($(this)); }});");
sb.Append("</script>");
return new MvcHtmlString(sb.ToString());
}
}
}