Replace WebGridBootstrapPager

Improve Leaf details page
This commit is contained in:
2020-06-28 17:37:06 -04:00
parent 6f907bd1c6
commit 2b5de1c4cd
13 changed files with 93 additions and 119 deletions
Binary file not shown.
+11
View File
@@ -1,5 +1,6 @@
using System.Collections.Specialized; using System.Collections.Specialized;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Runtime.CompilerServices;
namespace LeafWeb.WebCms.Models namespace LeafWeb.WebCms.Models
{ {
@@ -67,5 +68,15 @@ namespace LeafWeb.WebCms.Models
return nvs; return nvs;
} }
public bool HasExtendedParameters =>
!(
string.IsNullOrEmpty(siteid)
&& string.IsNullOrEmpty(species)
&& string.IsNullOrEmpty(lat)
&& string.IsNullOrEmpty(latr)
&& string.IsNullOrEmpty(lon)
&& string.IsNullOrEmpty(lonr)
);
} }
} }
+6 -4
View File
@@ -1,7 +1,6 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using AutoMapper; using AutoMapper;
using LeafWeb.Core.Entities; using LeafWeb.Core.Entities;
using LeafWeb.Core.Utility;
namespace LeafWeb.WebCms.Models namespace LeafWeb.WebCms.Models
{ {
@@ -9,15 +8,16 @@ namespace LeafWeb.WebCms.Models
{ {
/// <summary>Site identifier</summary> /// <summary>Site identifier</summary>
/// <remarks>do not leave blank between letters</remarks> /// <remarks>do not leave blank between letters</remarks>
[ParseInfo(1)]
[Display(Name = "Site Id")] [Display(Name = "Site Id")]
public string SiteId { get; set; } public string SiteId { get; set; }
/// <summary>Site latitude, northern hemisphere positive</summary> /// <summary>Site latitude, northern hemisphere positive</summary>
[Display(Name = "Latitude (&deg;)")]
[DisplayFormat(DataFormatString = "{0} &deg;")] [DisplayFormat(DataFormatString = "{0} &deg;")]
public double? Latitude { get; set; } public double? Latitude { get; set; }
/// <summary>Site longitude, east positive</summary> /// <summary>Site longitude, east positive</summary>
[Display(Name = "Longitude (&deg;)")]
[DisplayFormat(DataFormatString = "{0} &deg;")] [DisplayFormat(DataFormatString = "{0} &deg;")]
public double? Longitude { get; set; } public double? Longitude { get; set; }
@@ -25,9 +25,11 @@ namespace LeafWeb.WebCms.Models
[DisplayFormat(DataFormatString = "{0} m")] [DisplayFormat(DataFormatString = "{0} m")]
public double? Elevation { get; set; } public double? Elevation { get; set; }
/*
/// <summary>the year when the A/Ci data is taken</summary> /// <summary>the year when the A/Ci data is taken</summary>
[DisplayFormat(DataFormatString = "{0} year")] [DisplayFormat(DataFormatString = "{0} year")]
public int? SampleYear { get; set; } public string SampleYear { get; set; }
/// <summary>the day of year (since 1 Jan) when the A/Ci data is taken</summary> /// <summary>the day of year (since 1 Jan) when the A/Ci data is taken</summary>
[ParseInfo(6, units: "day")] [ParseInfo(6, units: "day")]
@@ -85,7 +87,7 @@ namespace LeafWeb.WebCms.Models
/// <summary>dry leaf phosphorus content of the sample</summary> /// <summary>dry leaf phosphorus content of the sample</summary>
[ParseInfo(19, units: "%")] [ParseInfo(19, units: "%")]
public double? LfPhosphContent { get; set; } public double? LfPhosphContent { get; set; }
*/
static LeafInputDataSiteViewModel() static LeafInputDataSiteViewModel()
{ {
Mapper.CreateMap<LeafInputDataSite, LeafInputDataSiteViewModel>(); Mapper.CreateMap<LeafInputDataSite, LeafInputDataSiteViewModel>();
+2 -2
View File
@@ -22,12 +22,12 @@ namespace LeafWeb.WebCms.Utility
} }
} }
public static void SetButtonDisabled(this ViewDataDictionary vdd) public static void SetCssDisabled(this ViewDataDictionary vdd)
{ {
vdd.AddCssClass("disabled"); vdd.AddCssClass("disabled");
} }
public static bool IsButtonDisabled(this ViewDataDictionary vdd) public static bool IsCssDisabled(this ViewDataDictionary vdd)
{ {
return vdd.ContainsKey(KeyName) && ((string[]) vdd[KeyName]).Contains("disabled"); return vdd.ContainsKey(KeyName) && ((string[]) vdd[KeyName]).Contains("disabled");
} }
+41 -82
View File
@@ -12,16 +12,22 @@ namespace LeafWeb.WebCms.Utility
public static HelperResult PagerList( public static HelperResult PagerList(
this WebGrid webGrid, this WebGrid webGrid,
WebGridPagerModes mode = WebGridPagerModes.NextPrevious | WebGridPagerModes.Numeric, WebGridPagerModes mode = WebGridPagerModes.NextPrevious | WebGridPagerModes.Numeric,
string firstText = null, string firstText = "First",
string previousText = null, string previousText = "Prev",
string nextText = null, string nextText = "Next",
string lastText = null, string lastText = "Last",
int numericLinksCount = 5, int numericLinksCount = 5,
string paginationStyle = null) string paginationStyle = null)
{ {
return PagerList(webGrid, mode, firstText, previousText, nextText, lastText, numericLinksCount, paginationStyle, explicitlyCalled: true); return PagerList(webGrid, mode, firstText, previousText, nextText, lastText, numericLinksCount,
paginationStyle, true);
} }
/* bootstrap pagination classes */
private const string ulClass = "pagination";
private const string liClass = "page-item";
private const string aClass = "page-link";
private static HelperResult PagerList( private static HelperResult PagerList(
WebGrid webGrid, WebGrid webGrid,
WebGridPagerModes mode, WebGridPagerModes mode,
@@ -33,144 +39,104 @@ namespace LeafWeb.WebCms.Utility
string paginationStyle, string paginationStyle,
bool explicitlyCalled) bool explicitlyCalled)
{ {
var currentPage = webGrid.PageIndex;
int currentPage = webGrid.PageIndex; var totalPages = webGrid.PageCount;
int totalPages = webGrid.PageCount; var lastPage = totalPages - 1;
int lastPage = totalPages - 1;
var ul = new TagBuilder("ul"); var ul = new TagBuilder("ul");
ul.AddCssClass(ulClass);
ul.AddCssClass(paginationStyle); ul.AddCssClass(paginationStyle);
var li = new List<TagBuilder>(); var li = new List<TagBuilder>();
if (webGrid.TotalRowCount <= webGrid.PageCount) if (webGrid.TotalRowCount <= webGrid.PageCount)
{ return new HelperResult(writer => writer.Write(string.Empty));
return new HelperResult(writer =>
{
writer.Write(string.Empty);
});
}
if(ModeEnabled(mode, WebGridPagerModes.FirstLast)) if (ModeEnabled(mode, WebGridPagerModes.FirstLast) && totalPages > 1)
{ {
if(String.IsNullOrEmpty(firstText))
{
firstText = "First";
}
var part = new TagBuilder("li") var part = new TagBuilder("li")
{ {
InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(0), firstText) InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(0), firstText)
}; };
part.AddCssClass(liClass);
if(currentPage == 0) if (currentPage == 0) part.AddCssClass("disabled");
{
part.MergeAttribute("class", "disabled");
}
li.Add(part); li.Add(part);
} }
if(ModeEnabled(mode, WebGridPagerModes.NextPrevious)) if (ModeEnabled(mode, WebGridPagerModes.NextPrevious) && totalPages > 1)
{ {
if(String.IsNullOrEmpty(previousText)) var page = currentPage == 0 ? 0 : currentPage - 1;
{
previousText = "Prev";
}
int page = currentPage == 0 ? 0 : currentPage - 1;
var part = new TagBuilder("li") var part = new TagBuilder("li")
{ {
InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(page), previousText) InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(page), previousText)
}; };
part.AddCssClass(liClass);
if(currentPage == 0) if (currentPage == 0) part.AddCssClass("disabled");
{
part.MergeAttribute("class", "disabled");
}
li.Add(part); li.Add(part);
} }
if (ModeEnabled(mode, WebGridPagerModes.Numeric) && totalPages > 1)
if(ModeEnabled(mode, WebGridPagerModes.Numeric) && (totalPages > 1))
{ {
int last = currentPage + (numericLinksCount / 2); var last = currentPage + numericLinksCount / 2;
int first = last - numericLinksCount + 1; var first = last - numericLinksCount + 1;
if (last > lastPage) if (last > lastPage)
{ {
first -= last - lastPage; first -= last - lastPage;
last = lastPage; last = lastPage;
} }
if (first < 0) if (first < 0)
{ {
last = Math.Min(last + (0 - first), lastPage); last = Math.Min(last + (0 - first), lastPage);
first = 0; first = 0;
} }
for(int i = first; i <= last; i++)
{
for (var i = first; i <= last; i++)
{
var pageText = (i + 1).ToString(CultureInfo.InvariantCulture); var pageText = (i + 1).ToString(CultureInfo.InvariantCulture);
var part = new TagBuilder("li") var part = new TagBuilder("li")
{ {
InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(i), pageText) InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(i), pageText)
}; };
part.AddCssClass(liClass);
if(i == currentPage) if (i == currentPage) part.AddCssClass("active");
{
part.MergeAttribute("class", "active");
}
li.Add(part); li.Add(part);
} }
} }
if(ModeEnabled(mode, WebGridPagerModes.NextPrevious)) if (ModeEnabled(mode, WebGridPagerModes.NextPrevious) && totalPages > 1)
{ {
if(String.IsNullOrEmpty(nextText)) var page = currentPage == lastPage ? lastPage : currentPage + 1;
{
nextText = "Next";
}
int page = currentPage == lastPage ? lastPage : currentPage + 1;
var part = new TagBuilder("li") var part = new TagBuilder("li")
{ {
InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(page), nextText) InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(page), nextText)
}; };
part.AddCssClass(liClass);
if(currentPage == lastPage) if (currentPage == lastPage) part.AddCssClass("disabled");
{
part.MergeAttribute("class", "disabled");
}
li.Add(part); li.Add(part);
} }
if(ModeEnabled(mode, WebGridPagerModes.FirstLast)) if (ModeEnabled(mode, WebGridPagerModes.FirstLast) && totalPages > 1)
{ {
if(String.IsNullOrEmpty(lastText))
{
lastText = "Last";
}
var part = new TagBuilder("li") var part = new TagBuilder("li")
{ {
InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(lastPage), lastText) InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(lastPage), lastText)
}; };
if (currentPage == lastPage) if (currentPage == lastPage)
{ part.AddCssClass("disabled");
part.MergeAttribute("class", "disabled");
}
li.Add(part); li.Add(part);
} }
ul.InnerHtml = string.Join("", li); ul.InnerHtml = string.Join("", li);
@@ -185,36 +151,29 @@ namespace LeafWeb.WebCms.Utility
span.InnerHtml = ul.ToString(); span.InnerHtml = ul.ToString();
html = span.ToString(); html = span.ToString();
} }
else else
{ {
html = ul.ToString(); html = ul.ToString();
} }
return new HelperResult(writer => return new HelperResult(writer => writer.Write(html));
{
writer.Write(html);
});
} }
private static String GridLink(WebGrid webGrid, string url, string text) private static string GridLink(WebGrid webGrid, string url, string text)
{ {
TagBuilder builder = new TagBuilder("a"); var builder = new TagBuilder("a");
builder.SetInnerText(text); builder.SetInnerText(text);
builder.MergeAttribute("href", url); builder.MergeAttribute("href", url);
builder.AddCssClass(aClass);
if (webGrid.IsAjaxEnabled) if (webGrid.IsAjaxEnabled)
{
builder.MergeAttribute("data-swhglnk", "true"); builder.MergeAttribute("data-swhglnk", "true");
}
return builder.ToString(TagRenderMode.Normal); return builder.ToString(TagRenderMode.Normal);
} }
private static bool ModeEnabled(WebGridPagerModes mode, WebGridPagerModes modeCheck) private static bool ModeEnabled(WebGridPagerModes mode, WebGridPagerModes modeCheck)
{ {
return (mode & modeCheck) == modeCheck; return (mode & modeCheck) == modeCheck;
} }
} }
} }
+3 -3
View File
@@ -73,7 +73,7 @@
if (!item.HasLeafChart) if (!item.HasLeafChart)
{ {
cssClass.SetButtonDisabled(); cssClass.SetCssDisabled();
} }
@Html.Partial("DisplayTemplates/_ChartLink", (int)item.LeafInputId, cssClass) @Html.Partial("DisplayTemplates/_ChartLink", (int)item.LeafInputId, cssClass)
} }
@@ -84,7 +84,7 @@
= CssClassUtil.CreateCssClassDataDictionary("btn", "btn-outline-secondary"); = CssClassUtil.CreateCssClassDataDictionary("btn", "btn-outline-secondary");
if (!item.IsDeletable) if (!item.IsDeletable)
{ {
cssClass.SetButtonDisabled(); cssClass.SetCssDisabled();
} }
@Html.Partial("DisplayTemplates/_DeleteForm", Tuple.Create(item.LeafInputId, item.Identifier), cssClass) @Html.Partial("DisplayTemplates/_DeleteForm", Tuple.Create(item.LeafInputId, item.Identifier), cssClass)
@@ -96,7 +96,7 @@
= CssClassUtil.CreateCssClassDataDictionary("btn", "btn-outline-secondary"); = CssClassUtil.CreateCssClassDataDictionary("btn", "btn-outline-secondary");
if (!item.IsCancellable) if (!item.IsCancellable)
{ {
cssClass.SetButtonDisabled(); cssClass.SetCssDisabled();
} }
@Html.Partial("DisplayTemplates/_CancelForm", Tuple.Create(item.LeafInputId, item.Identifier), cssClass) @Html.Partial("DisplayTemplates/_CancelForm", Tuple.Create(item.LeafInputId, item.Identifier), cssClass)
} }
+5 -5
View File
@@ -37,7 +37,7 @@
</div><!-- /input-group --> </div><!-- /input-group -->
</div> </div>
</div> </div>
<div class="row collapse ml-1 mr-1" id="additionalSearch"> <div class="row @if(Model.Q.HasExtendedParameters) {<text>show</text>} collapse ml-1 mr-1" id="additionalSearch">
<div class="col-lg-8 offset-lg-4 card card-body"> <div class="col-lg-8 offset-lg-4 card card-body">
<div class="row"> <div class="row">
@@ -89,7 +89,7 @@
grid.Column("", format: item => Actions(item.Value), canSort: false)), grid.Column("", format: item => Actions(item.Value), canSort: false)),
htmlAttributes: new { @class = "table table-sm table-striped table-bordered table-hover" } htmlAttributes: new { @class = "table table-sm table-striped table-bordered table-hover" }
) )
@grid.BootstrapPager() @grid.PagerList()
</div> </div>
} }
else else
@@ -150,7 +150,7 @@ else
if (!item.HasLeafChart) if (!item.HasLeafChart)
{ {
cssClass.SetButtonDisabled(); cssClass.SetCssDisabled();
} }
@Html.Partial("DisplayTemplates/_ChartLink", (int)item.Id, cssClass) @Html.Partial("DisplayTemplates/_ChartLink", (int)item.Id, cssClass)
} }
@@ -212,7 +212,7 @@ else
= CssClassUtil.CreateCssClassDataDictionary("dropdown-item"); = CssClassUtil.CreateCssClassDataDictionary("dropdown-item");
if (!item.IsDeletable) if (!item.IsDeletable)
{ {
cssClass.SetButtonDisabled(); cssClass.SetCssDisabled();
} }
@Html.Partial("DisplayTemplates/_DeleteForm", Tuple.Create(item.Id, item.Identifier), cssClass) @Html.Partial("DisplayTemplates/_DeleteForm", Tuple.Create(item.Id, item.Identifier), cssClass)
} }
@@ -223,7 +223,7 @@ else
= CssClassUtil.CreateCssClassDataDictionary("dropdown-item"); = CssClassUtil.CreateCssClassDataDictionary("dropdown-item");
if (!item.IsCancellable) if (!item.IsCancellable)
{ {
cssClass.SetButtonDisabled(); cssClass.SetCssDisabled();
} }
@Html.Partial("DisplayTemplates/_CancelForm", Tuple.Create(item.Id, item.Identifier), cssClass) @Html.Partial("DisplayTemplates/_CancelForm", Tuple.Create(item.Id, item.Identifier), cssClass)
} }
+2 -2
View File
@@ -16,15 +16,15 @@
), ),
htmlAttributes: new { @class = "table table-sm table-striped table-bordered table-hover" } htmlAttributes: new { @class = "table table-sm table-striped table-bordered table-hover" }
) )
@grid.PagerList()
</div> </div>
@grid.BootstrapPager()
@helper ChartLink(LeafInput leafInput) @helper ChartLink(LeafInput leafInput)
{ {
var cssClass = CssClassUtil.CreateCssClassDataDictionary("btn", " btn-outline-secondary", "btn-sm"); var cssClass = CssClassUtil.CreateCssClassDataDictionary("btn", " btn-outline-secondary", "btn-sm");
if (!leafInput.HasLeafChart) if (!leafInput.HasLeafChart)
{ {
cssClass.SetButtonDisabled(); cssClass.SetCssDisabled();
} }
@Html.Partial("DisplayTemplates/_ChartButton", leafInput.Id, cssClass) @Html.Partial("DisplayTemplates/_ChartButton", leafInput.Id, cssClass)
} }
@@ -1,17 +1,23 @@
@model IEnumerable<LeafInputDataSiteViewModel> @using System.Collections.ObjectModel
@model IEnumerable<LeafInputDataSiteViewModel>
@{ @{
//Layout = "~/Views/Shared/DisplayTemplates/_FieldLayout.cshtml"; //Layout = "~/Views/Shared/DisplayTemplates/_FieldLayout.cshtml";
Rend("Site Id", string.Join(", ", Model.Select(m => m.SiteId).Distinct()));
Rend("Latitude", string.Join(", ", Model.Select(m => m.Latitude).Distinct()));
} }
@helper Rend(string label, string value) @Rend("Site Id", Model.Select(m => m.SiteId))
@Rend("Latitude [&deg;]", Model.Select(m => m.Latitude?.ToString()))
@Rend("Longitude [&deg;]", Model.Select(m => m.Longitude?.ToString()))
@Rend("Elevation [m]", Model.Select(m => m.Elevation?.ToString()))
@helper Rend(string label, IEnumerable<string> values)
{ {
var value = string.Join(", ", values.Distinct());
<div class="row pb-lg-2 pb-sm-1 @if (ViewData.Model == null){<text>d-none</text> }"> <div class="row pb-lg-2 pb-sm-1 @if (ViewData.Model == null){<text>d-none</text> }">
<div class="col-sm-3 text-truncate"> <div class="col-sm-3 text-truncate border-right border-bottom pl-4 pl-sm-5">
@label @Html.Raw(label)
</div> </div>
<div class="col-sm-9"> <div class="col-sm-9 border-bottom pl-5 pl-sm-2">
@value @value
</div> </div>
</div> </div>
@@ -9,7 +9,7 @@
new { @class = "confirm clearfix", confirm_msg = "Cancelling cannot be undone! Confirm cancelling '" + identifier + "'." })) new { @class = "confirm clearfix", confirm_msg = "Cancelling cannot be undone! Confirm cancelling '" + identifier + "'." }))
{ {
<input type="hidden" name="id" value="@leafInputId"/> <input type="hidden" name="id" value="@leafInputId"/>
<button type="submit" @Html.Partial("DisplayTemplates/_ViewDataCssClass") @if(ViewData.IsButtonDisabled()) {<text>disabled</text>}> <button type="submit" @Html.Partial("DisplayTemplates/_ViewDataCssClass") @if(ViewData.IsCssDisabled()) {<text>disabled</text>}>
<span class="fa fa-ban"></span> Cancel <span class="fa fa-ban"></span> Cancel
</button> </button>
} }
@@ -9,7 +9,7 @@
new { @class = "confirm clearfix", confirm_msg = "Deletion cannot be undone! Confirm deleting '" + identifier + "'." })) new { @class = "confirm clearfix", confirm_msg = "Deletion cannot be undone! Confirm deleting '" + identifier + "'." }))
{ {
<input type="hidden" name="id" value="@leafInputId"/> <input type="hidden" name="id" value="@leafInputId"/>
<button type="submit" @Html.Partial("DisplayTemplates/_ViewDataCssClass") @if(ViewData.IsButtonDisabled()) {<text>disabled</text>}> <button type="submit" @Html.Partial("DisplayTemplates/_ViewDataCssClass") @if(ViewData.IsCssDisabled()) {<text>disabled</text>}>
<span class="fa fa-remove"></span> Delete <span class="fa fa-remove"></span> Delete
</button> </button>
} }
-1
View File
@@ -16,7 +16,6 @@
<namespaces> <namespaces>
<add namespace="System.Web.WebPages" /> <add namespace="System.Web.WebPages" />
<add namespace="System.Web.Optimization" /> <add namespace="System.Web.Optimization" />
<add namespace="WebGridBootstrapPager" />
<add namespace="LeafWeb.Core.Utility" /> <add namespace="LeafWeb.Core.Utility" />
<add namespace="LeafWeb.WebCms.Models" /> <add namespace="LeafWeb.WebCms.Models" />
<add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc" />
+1 -4
View File
@@ -323,10 +323,6 @@
<HintPath>..\packages\WebGrease.1.6.0\lib\WebGrease.dll</HintPath> <HintPath>..\packages\WebGrease.1.6.0\lib\WebGrease.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="WebGridBootstrapPager, Version=1.0.6.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\References\WebGridBootstrapPager.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="App_Plugins\ModelsBuilder\modelsbuilder.controller.js" /> <Content Include="App_Plugins\ModelsBuilder\modelsbuilder.controller.js" />
@@ -1134,6 +1130,7 @@
<Compile Include="Utility\RequireRequestValueAttribute.cs" /> <Compile Include="Utility\RequireRequestValueAttribute.cs" />
<Compile Include="Utility\Validation.cs" /> <Compile Include="Utility\Validation.cs" />
<Compile Include="Utility\CssClassUtil.cs" /> <Compile Include="Utility\CssClassUtil.cs" />
<Compile Include="Utility\WebGridExtensions.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Core\Core.csproj"> <ProjectReference Include="..\Core\Core.csproj">