Skip to content

Commit

Permalink
feat(page-tabs): Add closeable option to TabOptions (#1807) (#1808)
Browse files Browse the repository at this point in the history
Co-authored-by: pankey.chen <[email protected]>
  • Loading branch information
pankey888 and pankey.chen authored Mar 28, 2024
1 parent 3dff902 commit c55f832
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 24 deletions.
2 changes: 1 addition & 1 deletion docs/Masa.Blazor.Docs/Shared/PageTabsLayout.razor
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
{
if (pathValue.AbsolutePath == "/blazor/examples/page-tabs/page2")
{
return new TabOptions("Custom tab title", "mdi-tab", "font-weight-bold");
return new TabOptions("Custom tab title", "mdi-tab", "font-weight-bold", false);
}

return null;
Expand Down
19 changes: 11 additions & 8 deletions src/Masa.Blazor/Presets/PageTabs/PPageTabs.razor
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,17 @@
@tabTitle
</span>

<MButton Icon
Class="@_tabBlock.Element("close").Build()"
OnClick="() => HandleOnCloseTab(patternPath, tabTitle)"
Small
OnClickStopPropagation
OnClickPreventDefault>
<MIcon Small>@(CloseIcon ?? "$close")</MIcon>
</MButton>
@if ((tabOptions == null) || tabOptions.Closeable)
{
<MButton Icon
Class="@_tabBlock.Element("close").Build()"
OnClick="() => HandleOnCloseTab(patternPath, tabTitle)"
Small
OnClickStopPropagation
OnClickPreventDefault>
<MIcon Small>@(CloseIcon ?? "$close")</MIcon>
</MButton>
}
</MTab>
}

Expand Down
38 changes: 28 additions & 10 deletions src/Masa.Blazor/Presets/PageTabs/PPageTabs.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -141,20 +141,26 @@ protected override IEnumerable<string> BuildComponentClass()
[MasaApiPublicMethod]
public void CloseAllTabs(bool disableAutoNavigation = false)
{
PatternPaths.Clear();
TabsUpdated?.Invoke(this, Array.Empty<PatternPath>());
PageTabsProvider?.RemoveAllPathTitles();
var toClosePatternPaths = PatternPaths.Where(p => IsCloseable(p));
PatternPaths.RemoveAll(p => toClosePatternPaths.Contains(p));
TabsUpdated?.Invoke(this, PatternPaths.ToArray());
var closingAbsolutePaths = toClosePatternPaths.Select(p => p.AbsolutePath).ToArray();
PageTabsProvider?.RemovePathTitles(closingAbsolutePaths);

if (!disableAutoNavigation)
{
NavigationManager.NavigateTo(NoDataPath);
if (PatternPaths.Count > 0)
NavigationManager.NavigateTo(PatternPaths[0].AbsolutePath);
else
NavigationManager.NavigateTo(NoDataPath);
}
}

[MasaApiPublicMethod]
public void CloseCurrentTab(bool disableAutoNavigation = false)
{
var current = GetCurrentPatternPath();
if (!IsCloseable(current)) return;

if (!disableAutoNavigation)
{
Expand Down Expand Up @@ -263,8 +269,17 @@ private string DefaultTabTitle(string absolutePath)
return absolutePath.TrimEnd('/').Split('/').Last();
}

private bool IsCloseable(PatternPath patternPath)
{
var pathValue = new PageTabPathValue(patternPath.AbsolutePath, patternPath.AbsolutePath == NavigationManager.GetAbsolutePath());
var tabOptions = TabOptions?.Invoke(pathValue);
return (tabOptions == null) || tabOptions.Closeable;
}

private async Task HandleOnCloseTab(PatternPath patternPath, string tabTitle)
{
if (!IsCloseable(patternPath)) return;

if (AskBeforeClosing)
{
bool isConfirmed;
Expand Down Expand Up @@ -304,10 +319,11 @@ private void HandleOnCloseTabsToTheLeft()

var index = PatternPaths.FindIndex(p => p == _contextmenuPath);

var closingAbsolutePaths = PatternPaths.Take(index + 1).Select(p => p.AbsolutePath).ToArray();
var toClosePatternPaths = PatternPaths.Take(index).Where(p => IsCloseable(p));
var closingAbsolutePaths = toClosePatternPaths.Select(p => p.AbsolutePath).ToArray();
PageTabsProvider?.RemovePathTitles(closingAbsolutePaths);

PatternPaths.RemoveRange(0, index);
PatternPaths.RemoveAll(p => toClosePatternPaths.Contains(p));

if (!PatternPaths.Contains(currentPath))
{
Expand All @@ -329,10 +345,11 @@ private void HandleOnCloseTabsToTheRight()
var startIndex = index + 1;
var count = PatternPaths.Count - startIndex;

var closingAbsolutePaths = PatternPaths.Skip(startIndex).Take(count).Select(p => p.AbsolutePath).ToArray();
var toClosePatternPaths = PatternPaths.Skip(startIndex).Take(count).Where(p => IsCloseable(p));
var closingAbsolutePaths = toClosePatternPaths.Select(p => p.AbsolutePath).ToArray();
PageTabsProvider?.RemovePathTitles(closingAbsolutePaths);

PatternPaths.RemoveRange(startIndex, count);
PatternPaths.RemoveAll(p => toClosePatternPaths.Contains(p));

if (!PatternPaths.Contains(currentPath))
{
Expand Down Expand Up @@ -387,10 +404,11 @@ private void CloseTab(PatternPath patternPath)

private void CloseOtherTabs(PatternPath current)
{
var closingAbsolutePath = PatternPaths.Where(p => p != current).Select(p => p.AbsolutePath).ToArray();
var toClosePatternPaths = PatternPaths.Where(p => p != current && IsCloseable(p));
var closingAbsolutePath = toClosePatternPaths.Select(p => p.AbsolutePath).ToArray();
PageTabsProvider?.RemovePathTitles(closingAbsolutePath);

PatternPaths.RemoveAll(p => p != current);
PatternPaths.RemoveAll(p => toClosePatternPaths.Contains(p));

NavigationManager.NavigateTo(current.AbsolutePath);

Expand Down
13 changes: 8 additions & 5 deletions src/Masa.Blazor/Presets/PageTabs/TabOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,29 @@ public class TabOptions

public string? TitleStyle { get; set; }

public TabOptions()
public bool Closeable { get; set; } = true;

public TabOptions(bool closeable = true)
{
Closeable = closeable;
}

public TabOptions(string? title)
public TabOptions(string? title, bool closeable = true) : this(closeable)
{
Title = title;
}

public TabOptions(string? title, string? icon) : this(title)
public TabOptions(string? title, string? icon, bool closeable = true) : this(title, closeable)
{
Icon = icon;
}

public TabOptions(string? title, string? icon, string? titleClass) : this(title, icon)
public TabOptions(string? title, string? icon, string? titleClass, bool closeable = true) : this(title, icon, closeable)
{
TitleClass = titleClass;
}

public TabOptions(string? title, string? icon, string? titleClass, string? @class) : this(title, icon, titleClass)
public TabOptions(string? title, string? icon, string? titleClass, string? @class, bool closeable = true) : this(title, icon, titleClass, closeable)
{
Class = @class;
}
Expand Down

0 comments on commit c55f832

Please sign in to comment.