Skip to content

Commit 0267598

Browse files
author
Mischa Spelt
committed
Add boolean to get or set sidebar(2) collapsed state
1 parent 75ab692 commit 0267598

File tree

2 files changed

+383
-349
lines changed

2 files changed

+383
-349
lines changed

blazorbootstrap/Components/Sidebar/Sidebar.razor.cs

Lines changed: 191 additions & 174 deletions
Original file line numberDiff line numberDiff line change
@@ -4,207 +4,224 @@ namespace BlazorBootstrap;
44

55
public partial class Sidebar : BlazorBootstrapComponentBase
66
{
7-
#region Fields and Constants
7+
#region Fields and Constants
88

9-
private bool collapseNavMenu = true;
9+
private bool collapseNavMenu = true;
1010

11-
private bool collapseSidebar = false;
11+
private bool collapseSidebar = false;
1212

13-
private bool isMobile = false;
13+
private bool isMobile = false;
1414

15-
private IEnumerable<NavItem>? items = null;
15+
private IEnumerable<NavItem>? items = null;
1616

17-
private DotNetObjectReference<Sidebar> objRef = default!;
17+
private DotNetObjectReference<Sidebar> objRef = default!;
1818

19-
private bool requestInProgress = false;
19+
private bool requestInProgress = false;
2020

21-
#endregion
21+
#endregion
2222

23-
#region Methods
23+
#region Methods
2424

25-
protected override async Task OnAfterRenderAsync(bool firstRender)
25+
protected override async Task OnAfterRenderAsync( bool firstRender )
26+
{
27+
if( firstRender )
2628
{
27-
if (firstRender)
28-
{
29-
await JSRuntime.InvokeVoidAsync("window.blazorBootstrap.sidebar.initialize", Id, objRef);
29+
await JSRuntime.InvokeVoidAsync( "window.blazorBootstrap.sidebar.initialize", Id, objRef );
3030

31-
var width = await JSRuntime.InvokeAsync<int>("window.blazorBootstrap.sidebar.windowSize");
31+
var width = await JSRuntime.InvokeAsync<int>( "window.blazorBootstrap.sidebar.windowSize" );
3232

33-
bsWindowResize(width);
33+
bsWindowResize( width );
3434

35-
await RefreshDataAsync(firstRender);
36-
}
37-
38-
await base.OnAfterRenderAsync(firstRender);
39-
}
40-
41-
protected override async Task OnInitializedAsync()
42-
{
43-
objRef ??= DotNetObjectReference.Create(this);
44-
45-
AdditionalAttributes ??= new Dictionary<string, object>();
46-
47-
await base.OnInitializedAsync();
35+
await RefreshDataAsync( firstRender );
4836
}
4937

50-
[JSInvokable]
51-
public void bsWindowResize(int width)
52-
{
53-
if (width < 641) // mobile
54-
isMobile = true;
55-
else
56-
isMobile = false;
57-
}
38+
await base.OnAfterRenderAsync( firstRender );
39+
}
5840

59-
/// <summary>
60-
/// Refresh the sidebar data.
61-
/// </summary>
62-
/// <returns>Task</returns>
63-
public async Task RefreshDataAsync(bool firstRender = false)
64-
{
65-
if (requestInProgress)
66-
return;
41+
protected override async Task OnInitializedAsync()
42+
{
43+
objRef ??= DotNetObjectReference.Create( this );
6744

68-
requestInProgress = true;
45+
AdditionalAttributes ??= new Dictionary<string, object>();
6946

70-
if (DataProvider != null)
71-
{
72-
var request = new SidebarDataProviderRequest();
73-
var result = await DataProvider.Invoke(request);
74-
items = result != null ? result.Data : new List<NavItem>();
75-
}
47+
await base.OnInitializedAsync();
48+
}
7649

77-
requestInProgress = false;
50+
[JSInvokable]
51+
public void bsWindowResize( int width )
52+
{
53+
if( width < 641 ) // mobile
54+
isMobile = true;
55+
else
56+
isMobile = false;
57+
}
7858

79-
await InvokeAsync(StateHasChanged);
80-
}
59+
/// <summary>
60+
/// Refresh the sidebar data.
61+
/// </summary>
62+
/// <returns>Task</returns>
63+
public async Task RefreshDataAsync( bool firstRender = false )
64+
{
65+
if( requestInProgress )
66+
return;
8167

82-
/// <summary>
83-
/// Toggles sidebar.
84-
/// </summary>
85-
public void ToggleSidebar()
86-
{
87-
collapseSidebar = !collapseSidebar;
88-
StateHasChanged();
89-
}
68+
requestInProgress = true;
9069

91-
internal void HideNavMenuOnMobile()
70+
if( DataProvider != null )
9271
{
93-
if (isMobile && !collapseNavMenu)
94-
collapseNavMenu = true;
72+
var request = new SidebarDataProviderRequest();
73+
var result = await DataProvider.Invoke( request );
74+
items = result != null ? result.Data : new List<NavItem>();
9575
}
9676

97-
private string GetNavMenuCssClass()
98-
{
99-
var classList = new HashSet<string>();
100-
101-
if (collapseNavMenu)
102-
classList.Add("collapse");
77+
requestInProgress = false;
10378

104-
classList.Add("bb-sidebar-content nav-scrollable bb-scrollbar");
79+
await InvokeAsync( StateHasChanged );
80+
}
10581

106-
if (collapseSidebar)
107-
classList.Add("bb-scrollbar-hidden");
82+
/// <summary>
83+
/// Toggles sidebar.
84+
/// </summary>
85+
public void ToggleSidebar()
86+
{
87+
ToggleTo( !collapseSidebar );
88+
}
10889

109-
return string.Join(" ", classList);
90+
private void ToggleTo( bool isCollapsed )
91+
{
92+
if( collapseSidebar != isCollapsed )
93+
{
94+
collapseSidebar = isCollapsed;
95+
StateHasChanged();
11096
}
111-
112-
private void ToggleNavMenu() => collapseNavMenu = !collapseNavMenu;
113-
114-
#endregion
115-
116-
#region Properties, Indexers
117-
118-
protected override string? ClassNames =>
119-
BuildClassNames(Class,
120-
("bb-sidebar", true),
121-
("collapsed", collapseSidebar),
122-
("expanded", !collapseSidebar));
123-
124-
protected override string? StyleNames =>
125-
BuildStyleNames(Style,
126-
($"--bb-sidebar-width: {Width.ToString(CultureInfo.InvariantCulture)}{WidthUnit.ToCssString()};", Width > 0));
127-
128-
/// <summary>
129-
/// Gets or sets the badge text.
130-
/// </summary>
131-
/// <remarks>
132-
/// Default value is null.
133-
/// </remarks>
134-
[Parameter]
135-
public string? BadgeText { get; set; }
136-
137-
/// <summary>
138-
/// Gets or sets the custom icon name.
139-
/// </summary>
140-
/// <remarks>
141-
/// Default value is null.
142-
/// </remarks>
143-
[Parameter]
144-
public string? CustomIconName { get; set; }
145-
146-
/// <summary>
147-
/// Gets or sets the data provider.
148-
/// </summary>
149-
/// <remarks>
150-
/// Default value is null.
151-
/// </remarks>
152-
[Parameter]
153-
[EditorRequired]
154-
public SidebarDataProviderDelegate? DataProvider { get; set; } = default!;
155-
156-
/// <summary>
157-
/// Gets or sets the Href.
158-
/// </summary>
159-
/// <remarks>
160-
/// Default value is <see cref="string.Empty" />.
161-
/// </remarks>
162-
[Parameter]
163-
public string? Href { get; set; } = string.Empty;
164-
165-
/// <summary>
166-
/// Gets or sets the IconName.
167-
/// </summary>
168-
/// <remarks>
169-
/// Default value is <see cref="IconName.None" />.
170-
/// </remarks>
171-
[Parameter]
172-
public IconName IconName { get; set; } = IconName.None;
173-
174-
/// <summary>
175-
/// Gets or sets the sidebar logo.
176-
/// </summary>
177-
/// <remarks>
178-
/// Default value is null.
179-
/// </remarks>
180-
[Parameter]
181-
public string? ImageSrc { get; set; }
182-
183-
private string? navMenuCssClass => GetNavMenuCssClass();
184-
185-
/// <summary>
186-
/// Gets or sets the sidebar title.
187-
/// </summary>
188-
/// <remarks>
189-
/// Default value is null.
190-
/// </remarks>
191-
[Parameter]
192-
[EditorRequired]
193-
public string? Title { get; set; } = default!;
194-
195-
/// <summary>
196-
/// Gets or sets the sidebar width.
197-
/// </summary>
198-
/// <remarks>Default value is 270.</remarks>
199-
[Parameter]
200-
public float Width { get; set; } = 270;
201-
202-
/// <summary>
203-
/// Gets or sets the sidebar width unit.
204-
/// </summary>
205-
/// <remarks>Default value is <see cref="Unit.Px" />.</remarks>
206-
[Parameter]
207-
public Unit WidthUnit { get; set; } = Unit.Px;
208-
209-
#endregion
97+
}
98+
99+
internal void HideNavMenuOnMobile()
100+
{
101+
if( isMobile && !collapseNavMenu )
102+
collapseNavMenu = true;
103+
}
104+
105+
private string GetNavMenuCssClass()
106+
{
107+
var classList = new HashSet<string>();
108+
109+
if( collapseNavMenu )
110+
classList.Add( "collapse" );
111+
112+
classList.Add( "bb-sidebar-content nav-scrollable bb-scrollbar" );
113+
114+
if( collapseSidebar )
115+
classList.Add( "bb-scrollbar-hidden" );
116+
117+
return string.Join( " ", classList );
118+
}
119+
120+
private void ToggleNavMenu() => collapseNavMenu = !collapseNavMenu;
121+
122+
#endregion
123+
124+
#region Properties, Indexers
125+
126+
protected override string? ClassNames =>
127+
BuildClassNames( Class,
128+
("bb-sidebar", true),
129+
("collapsed", collapseSidebar),
130+
("expanded", !collapseSidebar) );
131+
132+
protected override string? StyleNames =>
133+
BuildStyleNames( Style,
134+
($"--bb-sidebar-width: {Width.ToString( CultureInfo.InvariantCulture )}{WidthUnit.ToCssString()};", Width > 0) );
135+
136+
/// <summary>
137+
/// Gets or sets the badge text.
138+
/// </summary>
139+
/// <remarks>
140+
/// Default value is null.
141+
/// </remarks>
142+
[Parameter]
143+
public string? BadgeText { get; set; }
144+
145+
/// <summary>
146+
/// Gets or sets the custom icon name.
147+
/// </summary>
148+
/// <remarks>
149+
/// Default value is null.
150+
/// </remarks>
151+
[Parameter]
152+
public string? CustomIconName { get; set; }
153+
154+
/// <summary>
155+
/// Gets or sets the data provider.
156+
/// </summary>
157+
/// <remarks>
158+
/// Default value is null.
159+
/// </remarks>
160+
[Parameter]
161+
[EditorRequired]
162+
public SidebarDataProviderDelegate? DataProvider { get; set; } = default!;
163+
164+
/// <summary>
165+
/// Gets or sets the Href.
166+
/// </summary>
167+
/// <remarks>
168+
/// Default value is <see cref="string.Empty" />.
169+
/// </remarks>
170+
[Parameter]
171+
public string? Href { get; set; } = string.Empty;
172+
173+
/// <summary>
174+
/// Gets or sets the IconName.
175+
/// </summary>
176+
/// <remarks>
177+
/// Default value is <see cref="IconName.None" />.
178+
/// </remarks>
179+
[Parameter]
180+
public IconName IconName { get; set; } = IconName.None;
181+
182+
/// <summary>
183+
/// Gets or sets the sidebar logo.
184+
/// </summary>
185+
/// <remarks>
186+
/// Default value is null.
187+
/// </remarks>
188+
[Parameter]
189+
public string? ImageSrc { get; set; }
190+
191+
/// <summary>
192+
/// Gets or sets the current collapsed state of the sidebar.
193+
/// </summary>
194+
public bool IsCollapsed
195+
{
196+
get => collapseSidebar;
197+
set => ToggleTo( value );
198+
}
199+
200+
private string? navMenuCssClass => GetNavMenuCssClass();
201+
202+
/// <summary>
203+
/// Gets or sets the sidebar title.
204+
/// </summary>
205+
/// <remarks>
206+
/// Default value is null.
207+
/// </remarks>
208+
[Parameter]
209+
[EditorRequired]
210+
public string? Title { get; set; } = default!;
211+
212+
/// <summary>
213+
/// Gets or sets the sidebar width.
214+
/// </summary>
215+
/// <remarks>Default value is 270.</remarks>
216+
[Parameter]
217+
public float Width { get; set; } = 270;
218+
219+
/// <summary>
220+
/// Gets or sets the sidebar width unit.
221+
/// </summary>
222+
/// <remarks>Default value is <see cref="Unit.Px" />.</remarks>
223+
[Parameter]
224+
public Unit WidthUnit { get; set; } = Unit.Px;
225+
226+
#endregion
210227
}

0 commit comments

Comments
 (0)