ant-design-blazor/components/select/internal/SelectContent.razor
Andrzej Bakun 7bab36dea7 fix(module: select): bind value change lock, tags and labels fix, overlay reposition (#1191)
* fix(module:select) _setLabel not needed for non-tags

fix for exception when label is a property with getter only

* fix(module:select): bind-Value lock if changed outside component

* fix(module:Select): overlay reposition SelectContent resize
2021-03-02 22:01:57 +08:00

191 lines
7.9 KiB
C#

@using AntDesign
@namespace AntDesign.Select.Internal
@typeparam TItemValue
@typeparam TItem
@{
bool showPrefixAsSeparate = false;
bool showPrefixInSelected = false;
if (ParentSelect.PrefixIcon != null)
{
showPrefixAsSeparate = ParentSelect.PrefixIcon != null && !(ParentSelect.SelectMode != SelectMode.Default && ParentSelect.SelectedOptionItems.Any());
showPrefixInSelected = !showPrefixAsSeparate;
}
}
<div class="@Prefix-selector" @ref="@Ref" style="@(ParentSelect.PrefixIcon is null?"":"padding-left: 4px;")">
@if (showPrefixAsSeparate)
{
<span class="@Prefix-prefix" unselectable="on" aria-hidden="true" style="user-select: none;display:flex;align-items: center;padding-right: 4px;" >
@ParentSelect.PrefixIcon
</span>
}
<div style="display: flex;position: relative;flex-grow: 1;flex-wrap: wrap;align-items: center;">
@if (ShowPlaceholder)
{
@if (showPrefixAsSeparate)
{
<span class="@Prefix-selection-placeholder" style="left: 0px;">@Placeholder</span>
}
else
{
<span class="@Prefix-selection-placeholder">@Placeholder</span>
}
}
else
{
@if (ParentSelect.SelectMode == SelectMode.Default)
{
var selectedItem = ParentSelect.SelectedOptionItems.FirstOrDefault();
//Console.WriteLine($"({ParentSelect.Id}): {selectedItem.Value} => {selectedItem.Label}");
if (string.IsNullOrEmpty(SearchValue) && selectedItem != null)
{
@if (ParentLabelTemplate != null)
{
<CascadingValue Value="this" Name="SelectContent">
<CascadingValue Value="@selectedItem" Name="SelectOption">
@ParentLabelTemplate(selectedItem.Item)
</CascadingValue>
</CascadingValue>
}
else
{
<span class="@Prefix-selection-item">
<span class="@Prefix-selection-item-content">@selectedItem.Label</span>
</span>
}
}
}
else
{
var selectedItems = ParentSelect.SelectedOptionItems;
@if (showPrefixInSelected)
{
<span class="@Prefix-prefix" unselectable="on" aria-hidden="true" style="user-select: none;display:flex;align-items: center;padding-right: 4px;" >
@ParentSelect.PrefixIcon
</span>
}
@foreach (var selectedOption in selectedItems)
{
@if (ParentLabelTemplate != null)
{
<CascadingValue Value="this" Name="SelectContent">
<CascadingValue Value="@selectedOption" Name="SelectOption">
@ParentLabelTemplate(selectedOption.Item)
</CascadingValue>
</CascadingValue>
}
else
{
<span class="@Prefix-selection-item">
<span class="@Prefix-selection-item-content">@selectedOption.Label</span>
<span unselectable="on" aria-hidden="true" style="user-select: none;" class="@Prefix-selection-item-remove"
@onclick="()=> OnRemoveSelected.InvokeAsync(selectedOption)" @onclick:stopPropagation="true">
<Icon Type="close"></Icon>
</span>
</span>
}
}
}
}
<span class="@Prefix-selection-search" style="@_inputWidth">
<input @ref="ParentSelect._inputRef"
@oninput="OnInput"
@onkeyup="OnKeyUp"
@onkeydown="OnKeyDown"
@onfocus="OnFocus"
@onblur="OnBlur"
@attributes=@AdditonalAttributes()
@onkeypress="@OnKeyPressEventHandler"
@onkeypress:preventDefault="@_suppressInput"
@onkeypress:stopPropagation="true"
@bind-value="@SearchValue"
id="@ParentSelect.Id"
role="combobox"
class="@Prefix-selection-search-input"
autocomplete="off"
aria-owns="@(ParentSelect.Id)_list"
aria-expanded="@IsOverlayShow"
aria-autocomplete="list"
aria-controls="@(ParentSelect.Id)_list"
style="@_inputStyle"/>
@if (ParentSelect.SelectMode != SelectMode.Default)
{
<span class="@Prefix-selection-search-mirror" aria-hidden="true">&nbsp;</span>
}
</span>
</div>
</div>
@if (ParentSelect.SelectMode == SelectMode.Default)
{
if (ParentSelect.SuffixIcon != null)
{
<span class="ant-select-arrow" unselectable="on" aria-hidden="true" style="user-select: none;" @onclick="@ParentSelect.OnArrowClick" @onclick:stopPropagation="true">
@ParentSelect.SuffixIcon
</span>
}
else if (ParentSelect.Loading)
{
<span class="ant-select-arrow ant-select-arrow-loading" unselectable="on" aria-hidden="true" style="user-select: none;">
<Icon Type="loading"></Icon>
</span>
}
else
{
if (ShowArrowIcon)
{
<span class="ant-select-arrow" unselectable="on" aria-hidden="true" style="user-select: none;" @onclick="@ParentSelect.OnArrowClick" @onclick:stopPropagation="true">
@if (ParentSelect.IsSearchEnabled && IsOverlayShow)
{
if (ShowSearchIcon)
{
<Icon Type="search"></Icon>
}
}
else
{
<Icon Type="down"></Icon>
}
</span>
}
else
{
<span class="ant-select-arrow" unselectable="on" aria-hidden="true" style="user-select: none;" @onclick="@ParentSelect.OnArrowClick" @onclick:stopPropagation="true">
@if (ParentSelect.IsSearchEnabled && IsOverlayShow)
{
if (ShowSearchIcon)
{
<Icon Type="search"></Icon>
}
}
</span>
}
@if (!ParentSelect.Disabled && ParentSelect.AllowClear && ParentSelect.HasValue)
{
<span class="ant-select-clear" unselectable="on" aria-hidden="true" style="user-select: none;" @onclick="OnClearClick" @onclick:stopPropagation="true">
<Icon Type="close-circle" Theme="fill"></Icon>
</span>
}
}
}
else
{
@if (ParentSelect.SuffixIcon != null)
{
<span class="ant-select-arrow" unselectable="on" aria-hidden="true" style="user-select: none;" @onclick="@ParentSelect.OnArrowClick" @onclick:stopPropagation="true">
@ParentSelect.SuffixIcon
</span>
}
@if (!ParentSelect.Disabled && ParentSelect.AllowClear && ParentSelect.HasValue)
{
<span class="ant-select-clear" unselectable="on" aria-hidden="true" style="user-select: none;" @onclick="OnClearClick" @onclick:stopPropagation="true">
<Icon Type="close-circle" Theme="fill"></Icon>
</span>
}
}