diff --git a/frontend/src/components/ItineraryTimeline.tsx b/frontend/src/components/ItineraryTimeline.tsx index 4f8e6ae..044f43e 100644 --- a/frontend/src/components/ItineraryTimeline.tsx +++ b/frontend/src/components/ItineraryTimeline.tsx @@ -259,11 +259,11 @@ export const ItineraryTimeline = ({ }, [legs, expandedStageId]); return ( -
+
{legs.length === 0 ? ( -
- -

Chưa có chặng nào trong lộ trình.

+
+ +

Chưa có chặng nào trong lộ trình.

) : ( legs.map((leg, legIdx) => { @@ -278,15 +278,15 @@ export const ItineraryTimeline = ({ const prevLegLastLoc = legIdx > 0 ? legs[legIdx - 1]?.locations.slice(-1)[0] : null; return ( -
+
{/* Folder header row - clickable to toggle exclusive expansion */}
toggleStageExpanded(leg.id)} className="folder-header-row animate-in fade-in slide-in-from-bottom-4 duration-300 hover:bg-gray-50/50 transition-colors" > -
+
- + {leg.sequence}
@@ -466,29 +466,29 @@ export const ItineraryTimeline = ({ {isStartPoint && ( Điểm bắt đầu )} - {isEndPoint && ( - Điểm kết thúc - )} -

{ - e.stopPropagation(); - onNavigate?.(location); - }} - className={`font-semibold text-lg cursor-pointer hover:text-blue-600 transition-colors select-none ${location.status === 'COMPLETED' ? 'text-gray-500 line-through' : 'text-gray-800'}`} - > - {location.name} -

-
+{isEndPoint && ( + Điểm kết thúc + )} +

{ + e.stopPropagation(); + onNavigate?.(location); + }} + className={`font-semibold text-base sm:text-lg cursor-pointer hover:text-blue-600 transition-colors select-none ${location.status === 'COMPLETED' ? 'text-gray-500 line-through' : 'text-gray-800'}`} + > + {location.name} +

+
- {location.address} + {location.address}
{location.note && ( -
+
{location.note}
)} {dwellMinutes !== null && ( -
+
Thời gian dừng: {formatTravelTime(dwellMinutes)}
diff --git a/frontend/src/pages/MemberDashboard.tsx b/frontend/src/pages/MemberDashboard.tsx index 2d38784..a37b5d0 100644 --- a/frontend/src/pages/MemberDashboard.tsx +++ b/frontend/src/pages/MemberDashboard.tsx @@ -1120,8 +1120,8 @@ const renderInitialsAvatar = (name: string, sizeClass = 'w-10 h-10 text-sm') => ); } - return ( -
+return ( +
{/* Background Glow */}
@@ -1129,7 +1129,7 @@ const renderInitialsAvatar = (name: string, sizeClass = 'w-10 h-10 text-sm') =>
diff --git a/frontend/src/pages/MyPhotosPage.tsx b/frontend/src/pages/MyPhotosPage.tsx index 9df1034..fa00c54 100644 --- a/frontend/src/pages/MyPhotosPage.tsx +++ b/frontend/src/pages/MyPhotosPage.tsx @@ -230,27 +230,27 @@ export const MyPhotosPage = ({ onBack }: { onBack: () => void }) => { }; return ( -
+
{/* Header */} -
+
-

Ảnh của tôi

+

Ảnh của tôi

Kho lưu trữ ảnh gốc cá nhân

{/* Filter Bar */} -
+
Bộ lọc:
-
-
+
+
{selectedTourIdForPhoto === 'all' ? 'Tất cả hành trình' : toursWithPhotos.find(t => t.id === selectedTourIdForPhoto)?.title || 'Tour đã chọn'}
@@ -295,28 +295,28 @@ export const MyPhotosPage = ({ onBack }: { onBack: () => void }) => {
-
+
{isLoading ? ( -
- -

Đang tải kho ảnh...

+
+ +

Đang tải kho ảnh...

) : photos.length === 0 ? ( -
- -

Chưa có ảnh nào

-

Hãy tham gia các chuyến đi và lưu lại khoảnh khắc nhé!

+
+ +

Chưa có ảnh nào

+

Hãy tham gia các chuyến đi và lưu lại khoảnh khắc nhé!

) : (
-
+
{/* Left Column: Tour List */} -
-

Hành trình của bạn

-
+
+

Hành trình của bạn

+
{/* Right Column: Large Photo Display */} -
+
{selectedPhotoForDisplay ? (
-
+
Selected setIsFullscreen(true)} /> @@ -542,13 +542,13 @@ export const MyPhotosPage = ({ onBack }: { onBack: () => void }) => {

Kho ảnh ({filteredPhotos.length})

-
+
{filteredPhotos.map((photo: any) => (
setSelectedPhotoForDisplay(photo)} className={`aspect-square bg-slate-950 rounded-xl overflow-hidden relative group border-2 transition-all cursor-pointer ${ - selectedPhotoForDisplay?.id === photo.id ? 'border-indigo-505 border-indigo-500 scale-[0.98]' : 'border-transparent hover:border-slate-700' + selectedPhotoForDisplay?.id === photo.id ? 'border-indigo-500 scale-[0.98]' : 'border-transparent hover:border-slate-700' }`} > +
{/* Top Navigation Bar */}
-

+

{tourInfo.title}

@@ -1932,10 +1932,10 @@ export const TourDetailPage = ({ )}
- {!(activeTab === 'plan' && viewMode === 'map') && ( +{!(activeTab === 'plan' && viewMode === 'map') && ( <> {/* Tour Header Info */} -
+
-
-
-

{tourInfo.title}

+
+
+

{tourInfo.title}

{/* Nhãn hiển thị ngay dưới Tiêu đề */} {currentTour?.tags && currentTour.tags.length > 0 && ( @@ -2296,10 +2296,10 @@ export const TourDetailPage = ({ onOpenNavigationPage={onOpenNavigationPage} /> ) : ( -
+
{/* Search Bar Overlay - Thanh tìm kiếm địa điểm trên bản đồ lộ trình */} {!isPublicView && ( -
+
= ({ tourId, }; return ( -
+

{routeData.tourTitle || "Bản đồ chỉ đường"}