@@ -4,207 +4,224 @@ namespace BlazorBootstrap;
44
55public 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