1010namespace BootstrapBlazor . Components ;
1111
1212/// <summary>
13- /// Tab 组件
13+ /// Tab component
1414/// </summary>
1515public partial class Tab : IHandlerException
1616{
1717 private bool FirstRender { get ; set ; } = true ;
1818
19- private static string ? GetContentClassString ( TabItem item ) => CssBuilder . Default ( "tabs-body-content" )
20- . AddClass ( "d-none" , ! item . IsActive )
21- . Build ( ) ;
22-
2319 private string ? WrapClassString => CssBuilder . Default ( "tabs-nav-wrap" )
2420 . AddClass ( "extend" , ShouldShowExtendButtons ( ) )
2521 . Build ( ) ;
2622
2723 private static string ? GetItemWrapClassString ( TabItem item ) => CssBuilder . Default ( "tabs-item-wrap" )
28- . AddClass ( "active" , item . IsActive && ! item . IsDisabled )
24+ . AddClass ( "active" , item is { IsActive : true , IsDisabled : false } )
2925 . Build ( ) ;
3026
3127 private string ? GetClassString ( TabItem item ) => CssBuilder . Default ( "tabs-item" )
@@ -58,25 +54,25 @@ public partial class Tab : IHandlerException
5854 private readonly List < TabItem > _draggedItems = new ( 50 ) ;
5955
6056 /// <summary>
61- /// 获得/设置 TabItem 集合
57+ /// Gets the collection of tab items.
6258 /// </summary>
6359 public IEnumerable < TabItem > Items => TabItems ;
6460
6561 private List < TabItem > TabItems => _dragged ? _draggedItems : _items ;
6662
6763 /// <summary>
68- /// 获得/设置 是否为排除地址 默认 false
64+ /// Gets or sets the excluded link. Default is false.
6965 /// </summary>
7066 private bool Excluded { get ; set ; }
7167
7268 /// <summary>
73- /// 获得/设置 是否为卡片样式 默认 false
69+ /// Gets or sets whether card style. Default is false.
7470 /// </summary>
7571 [ Parameter ]
7672 public bool IsCard { get ; set ; }
7773
7874 /// <summary>
79- /// 获得/设置 是否为带边框卡片样式 默认 false
75+ /// Gets or sets whether border card style. Default is false.
8076 /// </summary>
8177 [ Parameter ]
8278 public bool IsBorderCard { get ; set ; }
@@ -294,6 +290,30 @@ public partial class Tab : IHandlerException
294290 [ Parameter ]
295291 public TabStyle TabStyle { get ; set ; }
296292
293+ /// <summary>
294+ /// Gets or sets whether show the toolbar. Default is false.
295+ /// </summary>
296+ [ Parameter ]
297+ public bool ShowToolbar { get ; set ; }
298+
299+ /// <summary>
300+ /// Gets or sets whether show the full screen button. Default is true.
301+ /// </summary>
302+ [ Parameter ]
303+ public bool ShowFullscreenToolbarButton { get ; set ; } = true ;
304+
305+ /// <summary>
306+ /// Gets or sets whether show the full screen button. Default is true.
307+ /// </summary>
308+ [ Parameter ]
309+ public bool ShowRefreshToolbarButton { get ; set ; } = true ;
310+
311+ /// <summary>
312+ /// Gets or sets the refresh toolbar button icon string. Default is null.
313+ /// </summary>
314+ [ Parameter ]
315+ public string ? RefreshToolbarButtonIcon { get ; set ; }
316+
297317 [ CascadingParameter ]
298318 private Layout ? Layout { get ; set ; }
299319
@@ -330,6 +350,8 @@ public partial class Tab : IHandlerException
330350
331351 private string ? DraggableString => AllowDrag ? "true" : null ;
332352
353+ private readonly ConcurrentDictionary < TabItem , TabItemContent > _cache = [ ] ;
354+
333355 /// <summary>
334356 /// <inheritdoc/>
335357 /// </summary>
@@ -360,8 +382,16 @@ protected override void OnParametersSet()
360382 NextIcon ??= IconTheme . GetIconByKey ( ComponentIcons . TabNextIcon ) ;
361383 DropdownIcon ??= IconTheme . GetIconByKey ( ComponentIcons . TabDropdownIcon ) ;
362384 CloseIcon ??= IconTheme . GetIconByKey ( ComponentIcons . TabCloseIcon ) ;
385+ RefreshToolbarButtonIcon ??= IconTheme . GetIconByKey ( ComponentIcons . TabRefreshButtonIcon ) ;
363386
364- AdditionalAssemblies ??= new [ ] { Assembly . GetEntryAssembly ( ) ! } ;
387+ if ( AdditionalAssemblies is null )
388+ {
389+ var entryAssembly = Assembly . GetEntryAssembly ( ) ;
390+ if ( entryAssembly is not null )
391+ {
392+ AdditionalAssemblies = [ entryAssembly ] ;
393+ }
394+ }
365395
366396 if ( Placement != Placement . Top && TabStyle == TabStyle . Chrome )
367397 {
@@ -805,7 +835,7 @@ public void SetDisabledItem(TabItem item, bool disabled)
805835 }
806836 if ( TabItems . Any ( i => i . IsActive ) == false )
807837 {
808- TabItems . Where ( i => ! i . IsDisabled ) . FirstOrDefault ( ) ? . SetActive ( true ) ;
838+ TabItems . FirstOrDefault ( i => ! i . IsDisabled ) ? . SetActive ( true ) ;
809839 }
810840 StateHasChanged ( ) ;
811841 }
@@ -819,15 +849,15 @@ private RenderFragment RenderTabItemContent(TabItem item) => builder =>
819849
820850 if ( item . IsActive )
821851 {
822- builder . AddContent ( 0 , item . ChildContent ) ;
852+ builder . AddContent ( 0 , item . RenderContent ( _cache ) ) ;
823853 if ( IsLazyLoadTabItem )
824854 {
825855 LazyTabCache . AddOrUpdate ( item , _ => true , ( _ , _ ) => true ) ;
826856 }
827857 }
828858 else if ( ! IsLazyLoadTabItem || item . AlwaysLoad || LazyTabCache . TryGetValue ( item , out var init ) && init )
829859 {
830- builder . AddContent ( 0 , item . ChildContent ) ;
860+ builder . AddContent ( 0 , item . RenderContent ( _cache ) ) ;
831861 }
832862 } ;
833863
@@ -876,7 +906,15 @@ public async Task DragItemCallback(int originIndex, int currentIndex)
876906 }
877907 }
878908
879- private string ? GetIdByTabItem ( TabItem item ) => ( ShowFullScreen && item . ShowFullScreen ) ? ComponentIdGenerator . Generate ( item ) : null ;
909+ private string ? GetIdByTabItem ( TabItem item ) => ComponentIdGenerator . Generate ( item ) ;
910+
911+ private Task OnRefreshAsync ( )
912+ {
913+ // refresh the active tab item
914+ var item = TabItems . FirstOrDefault ( i => i . IsActive ) ;
915+ item . Refresh ( _cache ) ;
916+ return Task . CompletedTask ;
917+ }
880918
881919 /// <summary>
882920 /// <inheritdoc/>
0 commit comments