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(" ").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()); } } }