Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,139 +1,140 @@
@namespace Bit.BlazorUI
@inherits BitComponentBase
@typeparam TItem
@namespace Bit.BlazorUI
@inherits BitComponentBase
@typeparam TItem

<CascadingValue Value="this" IsFixed="true">
<div style="display:none" hidden>@(Options ?? ChildContent)</div>
</CascadingValue>

@{
var _selectedItem = Sticky ? SelectedItem : null;
}
<div @ref="RootElement" @attributes="HtmlAttributes"
id="@_Id"
style="@StyleBuilder.Value"
class="@ClassBuilder.Value"
dir="@Dir?.ToString().ToLower()">
<button @onclick="() => HandleOnHeaderClick(_selectedItem)"
type="button"
tabindex="@(IsEnabled ? 0 : -1)"
aria-label="@AriaLabel"
aria-hidden="@AriaHidden"
aria-describedby="@AriaDescription"
style="@GetStyle(_selectedItem);@Styles?.OperatorButton"
class="bit-mnb-opb @GetClass(_selectedItem) @Classes?.OperatorButton">
@if (Sticky)
{
var template = GetTemplate(_selectedItem);
if (template is not null)
{
@template(_selectedItem!)
}
else if (ItemTemplate is not null)
{
@ItemTemplate(_selectedItem)
}
else
{
var icon = GetIcon(_selectedItem);
@if (icon is not null)
{
<i style="@Styles?.OperatorButtonIcon" class="@icon.GetCssClasses() @Classes?.OperatorButtonIcon" />
}
<span style="@Styles?.OperatorButtonText" class="bit-mnb-btx @Classes?.OperatorButtonText">
@GetText(_selectedItem)
</span>
}
}
else
{
var headerIcon = BitIconInfo.From(Icon, IconName);
@if (HeaderTemplate is not null)
{
@HeaderTemplate
}
else
{
@if (headerIcon is not null)
{
<i style="@Styles?.Icon" class="@headerIcon.GetCssClasses() @Classes?.Icon" />
}

@if (Text.HasValue())
{
<span style="@Styles?.Text" class="bit-mnb-btx @Classes?.Text">@Text</span>
}
}
}

@if (Split is false)
{
var chevronIcon = BitIconInfo.From(ChevronDownIcon, ChevronDownIconName ?? "ChevronRight bit-ico-r90");
<i style="@Styles?.ChevronDown" class="@chevronIcon?.GetCssClasses() @Classes?.ChevronDown" />
}
</button>

@if (Split)
{
<span style="@Styles?.Separator" class="bit-mnb-spb @Classes?.Separator"></span>

<button @onclick="OpenCallout"
type="button"
tabindex="@(IsEnabled ? 0 : -1)"
style="@Styles?.ChevronDownButton"
class="bit-mnb-chb @Classes?.ChevronDownButton">
@{
var chevronIcon = BitIconInfo.From(ChevronDownIcon, ChevronDownIconName ?? "ChevronRight bit-ico-r90");
}
<i style="@Styles?.ChevronDown" class="@chevronIcon?.GetCssClasses() @Classes?.ChevronDown" />
</button>
}
</div>

<CascadingValue Value="this" IsFixed="true">
<div style="display:none" hidden>@(Options ?? ChildContent)</div>
</CascadingValue>
<div @onclick="CloseCallout" @onclick:stopPropagation
style="display:@(IsOpen ? "block" : "none");@Styles?.Overlay"
id="@_overlayId"
class="bit-mnb-ovl @Classes?.Overlay"></div>

@{
var _selectedItem = Sticky ? SelectedItem : null;
}
<div @ref="RootElement" @attributes="HtmlAttributes"
id="@_Id"
style="@StyleBuilder.Value"
class="@ClassBuilder.Value"
dir="@Dir?.ToString().ToLower()">
<button @onclick="() => HandleOnHeaderClick(_selectedItem)"
type="button"
tabindex="@(IsEnabled ? 0 : -1)"
aria-label="@AriaLabel"
aria-hidden="@AriaHidden"
aria-describedby="@AriaDescription"
style="@GetStyle(_selectedItem);@Styles?.OperatorButton"
class="bit-mnb-opb @GetClass(_selectedItem) @Classes?.OperatorButton">
@if (Sticky)
{
var template = GetTemplate(_selectedItem);
if (template is not null)
{
@template(_selectedItem!)
}
else if (ItemTemplate is not null)
{
@ItemTemplate(_selectedItem)
}
else
{
var icon = GetIcon(_selectedItem);
@if (icon is not null)
{
<i style="@Styles?.OperatorButtonIcon" class="@icon.GetCssClasses() @Classes?.OperatorButtonIcon" />
}
<span style="@Styles?.OperatorButtonText" class="bit-mnb-btx @Classes?.OperatorButtonText">
@GetText(_selectedItem)
</span>
}
}
else
{
var headerIcon = BitIconInfo.From(Icon, IconName);
@if (HeaderTemplate is not null)
{
@HeaderTemplate
}
else
{
@if (headerIcon is not null)
{
<i style="@Styles?.Icon" class="@headerIcon.GetCssClasses() @Classes?.Icon" />
}

@if (Text.HasValue())
{
<span style="@Styles?.Text" class="bit-mnb-btx @Classes?.Text">@Text</span>
}
}
}

@if (Split is false)
{
var chevronIcon = BitIconInfo.From(ChevronDownIcon, ChevronDownIconName ?? "ChevronRight bit-ico-r90");
<i style="@Styles?.ChevronDown" class="@chevronIcon?.GetCssClasses() @Classes?.ChevronDown" />
}
</button>

@if (Split)
{
<span style="@Styles?.Separator" class="bit-mnb-spb @Classes?.Separator"></span>

<button @onclick="OpenCallout"
type="button"
tabindex="@(IsEnabled ? 0 : -1)"
style="@Styles?.ChevronDownButton"
class="bit-mnb-chb @Classes?.ChevronDownButton">
@{
var chevronIcon = BitIconInfo.From(ChevronDownIcon, ChevronDownIconName ?? "ChevronRight bit-ico-r90");
}
<i style="@Styles?.ChevronDown" class="@chevronIcon?.GetCssClasses() @Classes?.ChevronDown" />
</button>
}

<div @onclick="CloseCallout" @onclick:stopPropagation
style="display:@(IsOpen ? "block" : "none");@Styles?.Overlay"
class="bit-mnb-ovl @Classes?.Overlay"></div>

<div id="@_calloutId"
style="@Styles?.Callout"
class="bit-mnb-cal @Classes?.Callout">
<ul role="presentation" style="@Styles?.CalloutContainer" class="bit-mnb-cul @Classes?.CalloutContainer">
@foreach (var (item, idx) in _items.Select((item, idx) => (item, idx)))
{
if (Sticky && item == SelectedItem) continue;

var template = GetTemplate(item);
var isEnabled = GetIsEnabled(item);
<li role="presentation" @key="@GetItemKey(item, idx.ToString())" style="@Styles?.ItemWrapper" class="@Classes?.ItemWrapper">
<button @onclick="() => HandleOnItemClick(item)" @onclick:stopPropagation
role="menuitem"
type="@_buttonType.GetValue()"
tabindex="@(isEnabled ? 0 : -1)"
disabled="@(isEnabled is false)"
aria-disabled="@(isEnabled is false)"
style="@GetStyle(item);@Styles?.ItemButton"
class="bit-mnb-itm @GetClass(item) @Classes?.ItemButton">
@if (template is not null)
{
@template(item)
}
else if (ItemTemplate is not null)
{
@ItemTemplate(item)
}
else
{
var itemIcon = GetIcon(item);
@if (itemIcon is not null)
{
<i style="@Styles?.ItemIcon" class="bit-mnb-iic @itemIcon.GetCssClasses() @Classes?.ItemIcon" />
}
<span style="@Styles?.ItemText" class="bit-mnb-btx @Classes?.ItemText">
@GetText(item)
</span>
}
</button>
</li>
}
</ul>
</div>
</div>
<div id="@_calloutId"
style="@Styles?.Callout"
class="bit-mnb-cal @Classes?.Callout">
<ul role="presentation" style="@Styles?.CalloutContainer" class="bit-mnb-cul @Classes?.CalloutContainer">
@foreach (var (item, idx) in _items.Select((item, idx) => (item, idx)))
{
if (Sticky && item == SelectedItem) continue;

var template = GetTemplate(item);
var isEnabled = GetIsEnabled(item);
<li role="presentation" @key="@GetItemKey(item, idx.ToString())" style="@Styles?.ItemWrapper" class="@Classes?.ItemWrapper">
<button @onclick="() => HandleOnItemClick(item)" @onclick:stopPropagation
role="menuitem"
type="@_buttonType.GetValue()"
tabindex="@(isEnabled ? 0 : -1)"
disabled="@(isEnabled is false)"
aria-disabled="@(isEnabled is false)"
style="@GetStyle(item);@Styles?.ItemButton"
class="bit-mnb-itm @GetClass(item) @Classes?.ItemButton">
@if (template is not null)
{
@template(item)
}
else if (ItemTemplate is not null)
{
@ItemTemplate(item)
}
else
{
var itemIcon = GetIcon(item);
@if (itemIcon is not null)
{
<i style="@Styles?.ItemIcon" class="bit-mnb-iic @itemIcon.GetCssClasses() @Classes?.ItemIcon" />
}
<span style="@Styles?.ItemText" class="bit-mnb-btx @Classes?.ItemText">
@GetText(item)
</span>
}
</button>
</li>
}
</ul>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public partial class BitMenuButton<TItem> : BitComponentBase where TItem : class
private List<TItem> _items = [];
private BitButtonType _buttonType;
private string _calloutId = default!;
private string _overlayId = default!;
private IEnumerable<TItem> _oldItems = default!;
private DotNetObjectReference<BitMenuButton<TItem>> _dotnetObj = default!;

Expand Down Expand Up @@ -271,6 +272,7 @@ protected override void RegisterCssStyles()
protected override async Task OnInitializedAsync()
{
_calloutId = $"BitMenuButton-{UniqueId}-callout";
_overlayId = $"BitMenuButton-{UniqueId}-overlay";

if (Sticky && SelectedItemHasBeenSet is false && DefaultSelectedItem is not null)
{
Expand Down Expand Up @@ -617,6 +619,7 @@ await _js.BitCalloutToggleCallout(
component: null,
calloutId: _calloutId,
callout: null,
overlayId: _overlayId,
isCalloutOpen: IsOpen,
responsiveMode: BitResponsiveMode.None,
dropDirection: BitDropDirection.TopAndBottom,
Expand Down
Loading
Loading