Skip to content

Commit 316b335

Browse files
authored
Merge pull request #127 from programcsharp/bootstrap-5
Bootstrap 5
2 parents ceb4f6e + 2f5a073 commit 316b335

15 files changed

+160
-102
lines changed

Build/CommonAssemblyInfo.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@
1515
//
1616
// You can specify all the values or you can default the Revision and Build Numbers
1717
// by using the '*' as shown below:
18-
[assembly: AssemblyVersion("3.7.7")]
19-
[assembly: AssemblyFileVersion("3.7.7")]
20-
//[assembly: AssemblyInformationalVersion("2.5-filters")]
18+
[assembly: AssemblyVersion("3.7.8")]
19+
[assembly: AssemblyFileVersion("3.7.8")]
20+
[assembly: AssemblyInformationalVersion("3.7.8-beta")]

Griddly.Mvc/GriddlyCss.cs

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,26 @@ public struct GriddlyCss
1919
public string FloatRight { get; set; }
2020
public string GriddlyDefault { get; set; }
2121
public string TableDefault { get; set; }
22+
public string FooterDefault { get; set; }
2223
public string ButtonDefault { get; set; }
2324
public GriddlyCssIcons Icons { get; set; }
24-
public bool IsBootstrap4 { get; set; }
25+
[Obsolete("Use Is(CssFramework.Bootstrap4)")]
26+
public bool IsBootstrap4
27+
{
28+
get => this.Is(CssFramework.Bootstrap4);
29+
set => this.Framework = value ? CssFramework.Bootstrap4 : CssFramework.Bootstrap3;
30+
}
2531
public bool InlineFilterUseFilterClass { get; set; }
32+
public CssFramework Framework { get; set; }
33+
34+
public bool Is(params CssFramework[] inFrameworks)
35+
{
36+
return inFrameworks != null && inFrameworks.Contains(this.Framework);
37+
}
2638

2739
public static GriddlyCss Bootstrap3Defaults = new GriddlyCss()
2840
{
41+
Framework = CssFramework.Bootstrap3,
2942
TextCenter = "text-center",
3043
TextRight = "text-right",
3144
FloatRight = "pull-right",
@@ -47,7 +60,7 @@ public struct GriddlyCss
4760

4861
public static GriddlyCss Bootstrap4Defaults = new GriddlyCss()
4962
{
50-
IsBootstrap4 = true,
63+
Framework = CssFramework.Bootstrap4,
5164
TextCenter = "text-center",
5265
TextRight = "text-right",
5366
FloatRight = "float-right",
@@ -66,4 +79,33 @@ public struct GriddlyCss
6679
CaretDown = "fa fa-caret-down"
6780
}
6881
};
82+
83+
public static GriddlyCss Bootstrap5Defaults = new GriddlyCss()
84+
{
85+
Framework = CssFramework.Bootstrap5,
86+
TextCenter = "text-center",
87+
TextRight = "text-end",
88+
FloatRight = "float-end",
89+
GriddlyDefault = null,
90+
TableDefault = "table table-bordered table-hover",
91+
ButtonDefault = "btn btn-outline-secondary",
92+
Icons = new GriddlyCssIcons()
93+
{
94+
Calendar = "fa fa-calendar-alt",
95+
Remove = "fa fa-times",
96+
ListMultipleSelected = "fa fa-check",
97+
ListSingleSelected = "fas fa-check-circle",
98+
Check = "fa fa-check-square",
99+
Filter = "fa fa-filter",
100+
Clear = "fa fa-ban",
101+
CaretDown = "fa fa-caret-down"
102+
}
103+
};
104+
}
105+
106+
public enum CssFramework
107+
{
108+
Bootstrap3,
109+
Bootstrap4,
110+
Bootstrap5,
69111
}

Griddly.Mvc/GriddlySettings.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ public abstract class GriddlySettings : IGriddlyFilterSettings
1111
public static string DefaultTableClassName { get => DefaultCss.TableDefault; set => DefaultCss.TableDefault = value; }
1212
[Obsolete("Use DefaultCss.ButtonDefault")]
1313
public static string DefaultButtonClassName { get => DefaultCss.ButtonDefault; set => DefaultCss.ButtonDefault = value; }
14-
[Obsolete("Use DefaultCss.IsBootstrap4")]
15-
public static bool IsBootstrap4 => DefaultCss.IsBootstrap4;
14+
[Obsolete("Use DefaultCss.Is(CssFramework.Bootstrap4)")]
15+
public static bool IsBootstrap4 => DefaultCss.Is(CssFramework.Bootstrap4);
1616
#endregion
1717

1818
#if NETFRAMEWORK
@@ -106,6 +106,7 @@ public GriddlySettings(IHtmlHelper html)
106106

107107
ClassName = DefaultCss.GriddlyDefault;
108108
TableClassName = DefaultCss.TableDefault;
109+
FooterClassName = DefaultCss.FooterDefault;
109110
FooterTemplate = DefaultFooterTemplate;
110111
HeaderTemplate = DefaultHeaderTemplate;
111112
FilterModalHeaderTemplate = DefaultFilterModalHeaderTemplate;
@@ -143,6 +144,7 @@ public static void ConfigureBootstrap4Defaults()
143144
public string Title { get; set; }
144145
public string ClassName { get; set; }
145146
public string TableClassName { get; set; }
147+
public string FooterClassName { get; set; }
146148
public FilterMode? AllowedFilterModes { get; set; }
147149
public FilterMode? InitialFilterMode { get; set; }
148150
public bool IsFilterFormInline { get; set; }

Griddly.NetCore.Razor/Pages/Shared/Griddly/BootstrapButton.cshtml

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,13 @@
4343

4444
bool clearSelectionOnAction = button.ClearSelectionOnAction ?? (button.Action == GriddlyButtonAction.Ajax || button.Action == GriddlyButtonAction.AjaxBulk);
4545

46-
<a data-role="griddly-button" class="@(!item.isMenuItem ? css.ButtonDefault : null) @button.ClassName @(item.isDropdown && button.DropdownCaret != GriddlyDropdownCaret.Split ? "dropdown-toggle" : null) @(!button.Enabled || button.EnableOnSelection == true ? "disabled" : null) @(!string.IsNullOrWhiteSpace(button.Icon) ? "btn-with-icon" : null) @(item.isMenuItem && css.IsBootstrap4 ? "dropdown-item" : null)"
46+
<a data-role="griddly-button" class="@(!item.isMenuItem ? css.ButtonDefault : null) @button.ClassName @(item.isDropdown && button.DropdownCaret != GriddlyDropdownCaret.Split ? "dropdown-toggle" : null) @(!button.Enabled || button.EnableOnSelection == true ? "disabled" : null) @(!string.IsNullOrWhiteSpace(button.Icon) ? "btn-with-icon" : null) @(item.isMenuItem && css.Is(CssFramework.Bootstrap4, CssFramework.Bootstrap5) ? "dropdown-item" : null)"
4747
@*onclick="@(button.Action == GriddlyButtonAction.Javascript ? button.Argument : null)"*@
4848
title="@button.Title"
4949
@Html.AttributeIf("target", button.Action == GriddlyButtonAction.Navigate && !string.IsNullOrWhiteSpace(button.Target), button.Target)
5050
href="@(href ?? "javscript:void()")"
5151
@Html.AttributeIf("data-toggle", button.Action != GriddlyButtonAction.Navigate && button.Action != GriddlyButtonAction.Javascript, button.Action.ToString().ToLower())
52-
@Html.AttributeIf("data-toggle", item.isDropdown && button.DropdownCaret != GriddlyDropdownCaret.Split, "dropdown")
52+
@Html.AttributeIf(css.Is(CssFramework.Bootstrap3, CssFramework.Bootstrap4) ? "data-toggle" : "data-bs-toggle", item.isDropdown && button.DropdownCaret != GriddlyDropdownCaret.Split, "dropdown")
5353
@Html.AttributeIf("data-onclick", button.Action == GriddlyButtonAction.Javascript && !string.IsNullOrWhiteSpace(button.Argument), button.Argument)
5454
@Html.AttributeIf("data-url", button.Action == GriddlyButtonAction.Ajax || button.Action == GriddlyButtonAction.AjaxBulk || button.Action == GriddlyButtonAction.Post || button.Action == GriddlyButtonAction.PostCriteria, button.Argument)
5555
@Html.AttributeIf("data-target", button.Action != GriddlyButtonAction.Navigate && !string.IsNullOrWhiteSpace(button.Target), button.Target)
@@ -72,7 +72,7 @@
7272
}
7373
@button.Text
7474

75-
@if (item.isDropdown && button.DropdownCaret == GriddlyDropdownCaret.Inline && !css.IsBootstrap4)
75+
@if (item.isDropdown && button.DropdownCaret == GriddlyDropdownCaret.Inline && css.Is(CssFramework.Bootstrap3))
7676
{
7777
<span class="@css.Icons.CaretDown"></span>
7878
}
@@ -82,7 +82,7 @@
8282
Func<List<GriddlyButton>, IHtmlContent> RenderList = @<text>@{
8383
foreach (GriddlyButton button in item)
8484
{
85-
if (css.IsBootstrap4)
85+
if (css.Is(CssFramework.Bootstrap4, CssFramework.Bootstrap5))
8686
{
8787
if (button.IsSeparator)
8888
{
@@ -149,14 +149,20 @@ else
149149
@RenderLink((Model, true, false))
150150
@if (Model.DropdownCaret == GriddlyDropdownCaret.Split)
151151
{
152-
<button type="button" class="dropdown-toggle dropdown-toggle-split @css.ButtonDefault" data-toggle="dropdown">
153-
@if (!css.IsBootstrap4)
152+
<button type="button" class="dropdown-toggle dropdown-toggle-split @css.ButtonDefault" data-toggle="@(css.Is(CssFramework.Bootstrap3, CssFramework.Bootstrap4) ? "dropdown" : null)" data-bs-toggle="@(css.Is(CssFramework.Bootstrap5) ? "dropdown" : null)">
153+
@if (css.Is(CssFramework.Bootstrap3))
154154
{
155155
<span class="@css.Icons.CaretDown"></span>
156156
}
157157
</button>
158158
}
159-
@if (css.IsBootstrap4)
159+
@if (css.Is(CssFramework.Bootstrap5))
160+
{
161+
<div class="dropdown-menu @(Model.AlignRight ? "dropdown-menu-end float-end" : "")">
162+
@RenderList(Model.Buttons)
163+
</div>
164+
}
165+
else if (css.Is(CssFramework.Bootstrap4))
160166
{
161167
<div class="dropdown-menu @(Model.AlignRight ? "dropdown-menu-right float-right" : "")">
162168
@RenderList(Model.Buttons)

Griddly.NetCore.Razor/Pages/Shared/Griddly/Griddly.cshtml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -391,9 +391,9 @@
391391
@if (settings.FooterTemplate == null || simple)
392392
{
393393
<span class="griddly-summary">
394-
<span class="@(settings.Css.IsBootstrap4 ? "d-none d-sm-inline" : "hidden-xs")">Records</span>
394+
<span class="@(settings.Css.Is(CssFramework.Bootstrap4, CssFramework.Bootstrap5) ? "d-none d-sm-inline" : "hidden-xs")">Records</span>
395395
<span class="griddly-recordstart">@(Model.PageNumber * Model.PageSize + (Model.Total > 0 ? 1 : 0))</span>
396-
<span class="@(settings.Css.IsBootstrap4 ? "d-none d-sm-inline" : "hidden-xs")">through</span><span class="@(settings.Css.IsBootstrap4 ? "d-inline d-sm-none" : "visible-xs-inline")">-</span>
396+
<span class="@(settings.Css.Is(CssFramework.Bootstrap4, CssFramework.Bootstrap5) ? "d-none d-sm-inline" : "hidden-xs")">through</span><span class="@(settings.Css.Is(CssFramework.Bootstrap4, CssFramework.Bootstrap5) ? "d-inline d-sm-none" : "visible-xs-inline")">-</span>
397397
<span class="griddly-recordend">@(Model.PageNumber * Model.PageSize + Model.Count)</span>
398398
of <span class="griddly-recordtotal">@Model.Total</span>
399399
</span>

Griddly.NetCore.Razor/Pages/Shared/Griddly/GriddlyFilterForm.cshtml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
Func<SelectListItem, IHtmlContent> RenderListItem = @<option value="@item.Value" selected="@item.Selected">@item.Text</option>;
2020

2121
Func<(Func<dynamic, IHtmlContent> content, bool prepend), IHtmlContent> InputGroupAddon = @<text>@{
22-
if (css.IsBootstrap4)
22+
if (css.Is(CssFramework.Bootstrap4, CssFramework.Bootstrap5))
2323
{
2424
<div class="input-group-@(item.prepend ? "prepend" : "append")"><span class="input-group-text">@item.content(null)</span></div>
2525
}
@@ -59,7 +59,7 @@ Func<(Func<dynamic, IHtmlContent> content, bool prepend), IHtmlContent> InputGro
5959
@Html.AttributeIf("data-griddly-filter-isnullable", filterList != null, x => filterList.IsNullable.ToString().ToLower())
6060
@Html.AttributeIf("data-griddly-filter-displayitemcount", filterList != null, x => filterList.DisplayItemCount)
6161
@Html.AttributeIf("data-griddly-filter-displayincludecaption", filterList != null, x => filterList.DisplayIncludeCaption.ToString().ToLower())>
62-
<label for="[email protected]" class="col-sm-3 @(css.IsBootstrap4 ? "col-form-label" : "control-label")">@filter.Caption</label>
62+
<label for="[email protected]" class="col-sm-3 @(css.Is(CssFramework.Bootstrap4, CssFramework.Bootstrap5) ? "col-form-label" : "control-label")">@filter.Caption</label>
6363
<div class="col-sm-9">
6464
@if (filterBox != null)
6565
{
@@ -144,7 +144,7 @@ Func<(Func<dynamic, IHtmlContent> content, bool prepend), IHtmlContent> InputGro
144144
{
145145
filterList.SetSelectedItems(defaultValue);
146146

147-
<select class="form-control" id="[email protected]" name="@filter.Field" @(filterList.IsMultiple ? "multiple" : null) @if (filter.InputHtmlAttributes != null) { foreach (var attr in filter.InputHtmlAttributes) { <text> @attr.Key="@attr.Value" </text> } }>
147+
<select class="form-control @(css.Is(CssFramework.Bootstrap5) ? "form-select" : null)" id="[email protected]" name="@filter.Field" @(filterList.IsMultiple ? "multiple" : null) @if (filter.InputHtmlAttributes != null) { foreach (var attr in filter.InputHtmlAttributes) { <text> @attr.Key="@attr.Value" </text> } }>
148148
@foreach (SelectListItem item in filterList.Items)
149149
{
150150
SelectListItemGroup group = item as SelectListItemGroup;

Griddly.NetCore.Razor/Pages/Shared/Griddly/GriddlyFilterInline.cshtml

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,25 @@
1616

1717
Func<(GriddlyFilterList filter, SelectListItem item, bool isGrouped), IHtmlContent> RenderListItem = @<text>@{
1818
var className = (item.item.Selected ? "griddly-filter-selected" : null) + " " + (item.isGrouped ? "griddly-list-group" : null);
19-
if (!css.IsBootstrap4)
19+
if (css.Is(CssFramework.Bootstrap3))
2020
{
2121
@Html.Raw("<li class=\"" + className + "\">")
2222
}
2323

24-
<a href="javascript:;" class="@(css.IsBootstrap4 ? "dropdown-item " + className : null)">
24+
<a href="javascript:;" class="@(css.Is(CssFramework.Bootstrap4, CssFramework.Bootstrap5) ? "dropdown-item " + className : null)">
2525
<input name="@item.filter.Field" type="@(item.filter.IsMultiple ? "checkbox" : "radio")" checked="@(item.item.Selected)" value="@item.item.Value" />
2626
<i class="@(item.filter.IsMultiple ? css.Icons.ListMultipleSelected : css.Icons.ListSingleSelected) griddly-filter-selected-indicator"></i>
2727
@item.item.Text
2828
</a>
2929

30-
if (!css.IsBootstrap4)
30+
if (css.Is(CssFramework.Bootstrap3))
3131
{
3232
@Html.Raw("</li>")
3333
}
3434
}</text>;
3535

3636
Func<(GriddlyFilterList filterList, SelectListItemGroup group), IHtmlContent> ListGroupHeader = @<text>@{
37-
var tag = css.IsBootstrap4 ? "div" : "li";
37+
var tag = css.Is(CssFramework.Bootstrap4, CssFramework.Bootstrap5) ? "div" : "li";
3838
var className = item.filterList.IsMultiple && item.group.Items.All(x => x.Selected) ? "griddly-filter-selected" : null;
3939

4040
@Html.Raw("<" + tag + " class=\"griddly-list-group-header " + className + "\">")
@@ -54,7 +54,7 @@ Func<(GriddlyFilterList filterList, SelectListItemGroup group), IHtmlContent> Li
5454

5555
Func<Func<dynamic, IHtmlContent>, IHtmlContent> DropdownMenu = @<text>@{
5656
var css = Model.Css;
57-
if (css.IsBootstrap4)
57+
if (css.Is(CssFramework.Bootstrap4, CssFramework.Bootstrap5))
5858
{
5959
<div class="dropdown-menu">
6060
@item(null)
@@ -70,7 +70,7 @@ Func<Func<dynamic, IHtmlContent>, IHtmlContent> DropdownMenu = @<text>@{
7070

7171
Func<(Func<dynamic, IHtmlContent> content, bool prepend), IHtmlContent> InputGroupAddon = @<text>@{
7272
var css = Model.Css;
73-
if (css.IsBootstrap4)
73+
if (css.Is(CssFramework.Bootstrap4, CssFramework.Bootstrap5))
7474
{
7575
<div class="input-group-@(item.prepend?"prepend":"append")"><span class="input-group-text">@item.content(null)</span></div>
7676
}
@@ -197,7 +197,7 @@ Func<(Func<dynamic, IHtmlContent> content, bool prepend), IHtmlContent> InputGro
197197
{
198198
<span class="input-group-addon">%</span>
199199
}*@
200-
<span class="@(css.IsBootstrap4 ? "input-group-append" : "input-group-btn")">
200+
<span class="@(css.Is(CssFramework.Bootstrap4, CssFramework.Bootstrap5) ? "input-group-append" : "input-group-btn")">
201201
<a class="@css.ButtonDefault griddly-filter-clear" href="javascript:;" tabindex="-1"><i class="@(css.Icons.Remove)"></i></a>
202202
</span>
203203
</div>
@@ -219,7 +219,7 @@ Func<(Func<dynamic, IHtmlContent> content, bool prepend), IHtmlContent> InputGro
219219
{
220220
<span class="input-group-addon">%</span>
221221
}*@
222-
<span class="@(css.IsBootstrap4 ? "input-group-append" : "input-group-btn")">
222+
<span class="@(css.Is(CssFramework.Bootstrap4, CssFramework.Bootstrap5) ? "input-group-append" : "input-group-btn")">
223223
<a class="@css.ButtonDefault griddly-filter-clear" href="javascript:;" tabindex="-1"><i class="@(css.Icons.Remove)"></i></a>
224224
</span>
225225
</div>
@@ -239,7 +239,7 @@ Func<(Func<dynamic, IHtmlContent> content, bool prepend), IHtmlContent> InputGro
239239
{
240240
<span class="input-group-addon">%</span>
241241
}*@
242-
<span class="@(css.IsBootstrap4 ? "input-group-append" : "input-group-btn")">
242+
<span class="@(css.Is(CssFramework.Bootstrap4, CssFramework.Bootstrap5) ? "input-group-append" : "input-group-btn")">
243243
<a class="@css.ButtonDefault griddly-filter-clear" href="javascript:;" tabindex="-1"><i class="@(css.Icons.Remove)"></i></a>
244244
</span>
245245
</div>
@@ -249,10 +249,10 @@ Func<(Func<dynamic, IHtmlContent> content, bool prepend), IHtmlContent> InputGro
249249
if (filterList.IsMultiple)
250250
{
251251
<div class="input-group griddly-filter-buttons">
252-
<span class="input-group-btn @(css.IsBootstrap4 ? "w-50" : null)">
252+
<span class="input-group-btn @(css.Is(CssFramework.Bootstrap4, CssFramework.Bootstrap5) ? "w-50" : null)">
253253
<a class="@css.ButtonDefault griddly-select-all" href="javascript:;"><i class="@(css.Icons.Check)"></i> Select All</a>
254254
</span>
255-
<span class="input-group-btn @(css.IsBootstrap4 ? "w-50" : null)">
255+
<span class="input-group-btn @(css.Is(CssFramework.Bootstrap4, CssFramework.Bootstrap5) ? "w-50" : null)">
256256
<a class="@css.ButtonDefault griddly-clear" href="javascript:;"><i class="@(css.Icons.Clear)"></i> Clear</a>
257257
</span>
258258
</div>

0 commit comments

Comments
 (0)