Reviewed-on: #20 Reviewed-by: Микаэл Оганесян <15lu.akari@unprism.ru> Co-authored-by: fisenko <kkzemeow@gmail.com> Co-committed-by: fisenko <kkzemeow@gmail.com>
This commit is contained in:
@@ -124,6 +124,7 @@ export const clearMapCaches = () => {
|
||||
interface ApiRoute {
|
||||
id: number;
|
||||
route_number: string;
|
||||
route_name: string;
|
||||
path: [number, number][];
|
||||
center_latitude: number;
|
||||
center_longitude: number;
|
||||
@@ -370,6 +371,7 @@ class MapStore {
|
||||
this.routes = routeResponses.map((res) => ({
|
||||
id: res.data.id,
|
||||
route_number: res.data.route_number,
|
||||
route_name: res.data.route_name || "",
|
||||
path: res.data.path,
|
||||
center_latitude: res.data.center_latitude,
|
||||
center_longitude: res.data.center_longitude,
|
||||
@@ -2302,6 +2304,8 @@ const MapSightbar: React.FC<MapSightbarProps> = observer(
|
||||
});
|
||||
feature.setId(`route-${route.id}`);
|
||||
feature.set("featureType", "route");
|
||||
feature.set("routeName", route.route_name);
|
||||
feature.set("routeNumber", route.route_number);
|
||||
return feature;
|
||||
});
|
||||
|
||||
@@ -2317,11 +2321,18 @@ const MapSightbar: React.FC<MapSightbarProps> = observer(
|
||||
|
||||
const filteredFeatures = useMemo(() => {
|
||||
if (!searchQuery.trim()) return allFeatures;
|
||||
return allFeatures.filter((f) =>
|
||||
((f.get("name") as string) || "")
|
||||
.toLowerCase()
|
||||
.includes(searchQuery.toLowerCase())
|
||||
const normalizedQuery = searchQuery.toLowerCase();
|
||||
return allFeatures.filter((f) => {
|
||||
const candidates = [
|
||||
(f.get("name") as string) || "",
|
||||
(f.get("description") as string) || "",
|
||||
(f.get("routeName") as string) || "",
|
||||
(f.get("routeNumber") as string) || "",
|
||||
];
|
||||
return candidates.some((value) =>
|
||||
value.toLowerCase().includes(normalizedQuery)
|
||||
);
|
||||
});
|
||||
}, [allFeatures, searchQuery]);
|
||||
|
||||
const handleFeatureClick = useCallback(
|
||||
@@ -2649,6 +2660,38 @@ const MapSightbar: React.FC<MapSightbarProps> = observer(
|
||||
featureType === "station" &&
|
||||
description &&
|
||||
description.trim() !== "";
|
||||
const routeName =
|
||||
featureType === "route"
|
||||
? (feature.get("routeName") as string) || ""
|
||||
: "";
|
||||
const routeNumber =
|
||||
featureType === "route"
|
||||
? (feature.get("routeNumber") as string) || fName
|
||||
: "";
|
||||
const routeNumberTrimmed = routeNumber.trim();
|
||||
const routeNameTrimmed = routeName.trim();
|
||||
const displayName =
|
||||
featureType === "route" ? routeNumberTrimmed || fName : fName;
|
||||
const showRouteName =
|
||||
featureType === "route" &&
|
||||
routeNameTrimmed !== "" &&
|
||||
routeNameTrimmed !== displayName;
|
||||
const titleParts: string[] = [];
|
||||
if (featureType === "route") {
|
||||
if (routeNumberTrimmed) {
|
||||
titleParts.push(routeNumberTrimmed);
|
||||
}
|
||||
if (routeNameTrimmed) {
|
||||
titleParts.push(routeNameTrimmed);
|
||||
}
|
||||
}
|
||||
const titleText =
|
||||
featureType === "route"
|
||||
? titleParts.join(" • ") ||
|
||||
routeNumberTrimmed ||
|
||||
routeNameTrimmed ||
|
||||
fName
|
||||
: fName;
|
||||
|
||||
return (
|
||||
<div
|
||||
@@ -2667,7 +2710,7 @@ const MapSightbar: React.FC<MapSightbarProps> = observer(
|
||||
checked={isChecked}
|
||||
onChange={() => handleCheckboxChange(fId)}
|
||||
onClick={(e) => e.stopPropagation()}
|
||||
aria-label={`Выбрать ${fName}`}
|
||||
aria-label={`Выбрать ${titleText}`}
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
@@ -2692,9 +2735,9 @@ const MapSightbar: React.FC<MapSightbarProps> = observer(
|
||||
<span
|
||||
className={`font-medium whitespace-nowrap overflow-x-auto block
|
||||
scrollbar-visible`}
|
||||
title={fName}
|
||||
title={titleText}
|
||||
>
|
||||
{fName}
|
||||
{displayName}
|
||||
</span>
|
||||
</div>
|
||||
{showDescription && (
|
||||
@@ -2702,6 +2745,11 @@ const MapSightbar: React.FC<MapSightbarProps> = observer(
|
||||
{description}
|
||||
</div>
|
||||
)}
|
||||
{showRouteName && (
|
||||
<div className="mt-1 text-xs text-gray-600">
|
||||
{routeNameTrimmed}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex-shrink-0 flex items-center space-x-1 opacity-60 group-hover:opacity-100">
|
||||
<button
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -132,12 +132,16 @@ class SightsStore {
|
||||
common: boolean
|
||||
) => {
|
||||
if (common) {
|
||||
// @ts-ignore
|
||||
this.sight!.common = {
|
||||
// @ts-ignore
|
||||
...this.sight!.common,
|
||||
...content,
|
||||
};
|
||||
} else {
|
||||
// @ts-ignore
|
||||
this.sight![language] = {
|
||||
// @ts-ignore
|
||||
...this.sight![language],
|
||||
...content,
|
||||
};
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user