From 81e357d226f36a6cf0f494d3c384b92d6802b5e5 Mon Sep 17 00:00:00 2001 From: Ho Ngoc Hai Date: Sun, 1 Mar 2026 04:43:18 +0700 Subject: [PATCH] =?UTF-8?q?feat(admin):=20P4=20=E2=80=94=20Notifications,?= =?UTF-8?q?=20Customer=20detail,=20Photo=20upload?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - G9: Notification bell with dropdown panel (4 demo alerts) - G6+: Customer detail expandable rows + action buttons - B4: Before/After photo upload with dual dropzones + history grid --- .../Pages/Admin/Shop/ShopPage.razor | 114 ++++++++++++++++-- 1 file changed, 105 insertions(+), 9 deletions(-) diff --git a/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Shop/ShopPage.razor b/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Shop/ShopPage.razor index 8e7c2875..c8dc9c0a 100644 --- a/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Shop/ShopPage.razor +++ b/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Shop/ShopPage.razor @@ -17,6 +17,42 @@

@_sectionTitle

@(_shopName ?? "Cửa hàng") • @_verticalLabel

+
+ @* G9: Notification Bell *@ +
+ + @if (_showNotifications) + { +
+
+ 🔔 Thông báo + Xem tất cả +
+ @foreach (var notif in new[] { + new { Icon = "⚠️", Title = "Sắp hết hàng", Desc = "Espresso chỉ còn 3 phần", Time = "5 phút trước", Color = "#F59E0B" }, + new { Icon = "📦", Title = "Đơn hàng mới", Desc = "Bàn 3 — Phở bò x2, Gỏi cuốn x1", Time = "12 phút trước", Color = "#3B82F6" }, + new { Icon = "✅", Title = "Ca làm hoàn thành", Desc = "Nguyễn Văn A đã kết thúc ca chiều", Time = "1 giờ trước", Color = "#22C55E" }, + new { Icon = "💰", Title = "Giao dịch ví", Desc = "Nạp thêm 500,000₫ vào ví store", Time = "3 giờ trước", Color = "#8B5CF6" } }) + { +
+
+ @notif.Icon +
+
@notif.Title
+
@notif.Desc
+
@notif.Time
+
+
+
+ } +
+ } +
+
@* ═══ CONTENT ═══ *@ @@ -431,15 +467,50 @@ Cấp bậc EXP Ngày tham gia + @foreach (var m in filteredMembers) { - + var isExpanded = _selectedCustomerId == m.Id; + @m.Id.ToString()[..8] @(m.LevelName ?? "—") @m.TotalExpEarned.ToString("N0") @m.CreatedAt.ToString("dd/MM/yyyy") + + @if (isExpanded) + { + +
+
+
+ +
@m.Id.ToString()
+
+
+ +
@(m.LevelName ?? "Chưa xếp hạng") • @m.TotalExpEarned.ToString("N0") EXP
+
+
+ +
@m.CreatedAt.ToString("dd/MM/yyyy HH:mm")
+
+
+
+ + + +
+
+ + } } @@ -842,15 +913,37 @@ {

📷 Ảnh Before / After

-
-
- +
+
+
+
+
+
+ @foreach (var (label, icon) in new[] { ("Before", "image"), ("After", "image-plus") }) + { +
+
+
Upload ảnh @label
+
Kéo thả hoặc click để chọn ảnh
+
JPG, PNG, HEIC • Max 10MB
+
+ } +
+
+

📅 Lịch sử ảnh

+
+ @foreach (var (date, desc, color) in new[] { ("15/02", "Buổi 1 — Before", "#3B82F6"), ("22/02", "Buổi 2 — After", "#22C55E"), ("01/03", "Buổi 3 — After", "#8B5CF6") }) + { +
+
+
+
@desc
+
@date/2026
+
+
+ } +
-

So sánh kết quả điều trị

-

Upload ảnh trước/sau điều trị để theo dõi tiến triển và tư vấn khách hàng.

-
} @@ -1056,6 +1149,9 @@ private int _calendarWeekOffset; private string _kdsStation = "all"; private string _treatmentTab = "treatment"; + // P4 state: notifications, customer detail + private bool _showNotifications; + private Guid? _selectedCustomerId; private List _resources = new(); // Customer filter state private string _customerSearch = "";