|
2 | 2 | // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. |
3 | 3 | // Website: https://www.blazor.zone or https://argozhang.github.io/ |
4 | 4 |
|
| 5 | +using System.Runtime.CompilerServices; |
| 6 | + |
5 | 7 | namespace BootstrapBlazor.Components; |
6 | 8 |
|
7 | 9 | /// <summary> |
@@ -43,7 +45,11 @@ public partial class SelectCity |
43 | 45 | private readonly HashSet<string> _values = []; |
44 | 46 | private string? _searchText; |
45 | 47 |
|
46 | | - private string? GetActiveClass(string item) => _values.Contains(item) || CurrentValue == item ? "active" : null; |
| 48 | + private string? GetActiveClass(string item) => CssBuilder.Default() |
| 49 | + .AddClass("active", _values.Contains(item) || CurrentValue == item) |
| 50 | + .AddClass("prev", !string.IsNullOrEmpty(_searchText) && PinYinService.GetFirstLetters(item).StartsWith(_searchText)) |
| 51 | + .Build(); |
| 52 | + |
47 | 53 |
|
48 | 54 | /// <summary> |
49 | 55 | /// <inheritdoc/> |
@@ -98,18 +104,18 @@ private RenderFragment RenderCities() => builder => |
98 | 104 | } |
99 | 105 | }; |
100 | 106 |
|
101 | | - private void OnSelectProvince(string province) |
| 107 | + private void OnSelectProvince(string provinceName) |
102 | 108 | { |
103 | 109 | if (!IsMultiple) |
104 | 110 | { |
105 | 111 | return; |
106 | 112 | } |
107 | 113 |
|
108 | | - HashSet<string> cities = province switch |
| 114 | + HashSet<string> cities = provinceName switch |
109 | 115 | { |
110 | 116 | "直辖市" => Municipalities, |
111 | 117 | "特别行政区" => SpecialAdministrativeRegions, |
112 | | - _ => GetCities(province) |
| 118 | + _ => GetCities(provinceName) |
113 | 119 | }; |
114 | 120 | foreach (var city in cities.Where(city => !_values.Remove(city))) |
115 | 121 | { |
@@ -141,16 +147,41 @@ private HashSet<string> GetProvinces() |
141 | 147 | return Provinces; |
142 | 148 | } |
143 | 149 |
|
144 | | - // 处理直辖市 |
145 | | - if (PinYinZXS.Contains(_searchText)) |
146 | | - { |
147 | | - return ["直辖市"]; |
148 | | - } |
| 150 | + return [.. GenerateProvincePinYin().Where(i => FilterProvince(i, _searchText)).Select(i => i.Name)]; |
| 151 | + } |
149 | 152 |
|
150 | | - return Provinces; |
| 153 | + [MethodImpl(MethodImplOptions.AggressiveInlining)] |
| 154 | + private static bool FilterProvince(ProvinceItem item, string searchText) => item.PinYin.StartsWith(searchText) || item.Cities.Any(city => city.PinYin.StartsWith(searchText)); |
| 155 | + |
| 156 | + private static HashSet<ProvinceItem>? _provinceItems; |
| 157 | + |
| 158 | + private HashSet<ProvinceItem> GenerateProvincePinYin() |
| 159 | + { |
| 160 | + _provinceItems ??= [.. Provinces.Select(i => new ProvinceItem() |
| 161 | + { |
| 162 | + PinYin = PinYinService.GetFirstLetters(i), |
| 163 | + Name = i, |
| 164 | + Cities = [.. GetCities(i).Select(i => new CityItem() |
| 165 | + { |
| 166 | + PinYin = PinYinService.GetFirstLetters(i), |
| 167 | + Name = i |
| 168 | + })] |
| 169 | + })]; |
| 170 | + return _provinceItems; |
151 | 171 | } |
152 | 172 |
|
153 | | - private static readonly HashSet<string> PinYinZXS = ["BJ", "TJ", "SH", "CQ"]; |
| 173 | + private HashSet<string> GetCities(string provinceName) => provinceName switch |
| 174 | + { |
| 175 | + "直辖市" => Municipalities, |
| 176 | + "特别行政区" => SpecialAdministrativeRegions, |
| 177 | + _ => RegionService.GetCities(provinceName) |
| 178 | + }; |
| 179 | + |
| 180 | + private static HashSet<CityItem> GenerateCityPinYin(HashSet<string> cities) => [.. cities.Select(i => new CityItem() |
| 181 | + { |
| 182 | + PinYin = PinYinService.GetFirstLetters(i), |
| 183 | + Name = i |
| 184 | + })]; |
154 | 185 |
|
155 | 186 | private static readonly HashSet<string> Provinces = [ |
156 | 187 | "直辖市", |
@@ -188,19 +219,4 @@ private HashSet<string> GetProvinces() |
188 | 219 | private static readonly HashSet<string> Municipalities = ["北京市", "天津市", "上海市", "重庆市"]; |
189 | 220 |
|
190 | 221 | private static readonly HashSet<string> SpecialAdministrativeRegions = ["香港特别行政区", "澳门特别行政区"]; |
191 | | - |
192 | | - private HashSet<string> GetCities(string provinceName) |
193 | | - { |
194 | | - if (provinceName == "直辖市") |
195 | | - { |
196 | | - return Municipalities; |
197 | | - } |
198 | | - |
199 | | - if (provinceName == "特别行政区") |
200 | | - { |
201 | | - return SpecialAdministrativeRegions; |
202 | | - } |
203 | | - |
204 | | - return RegionService.GetCities(provinceName); |
205 | | - } |
206 | 222 | } |
0 commit comments