refactor: relocate system admin pages and apply minor UI adjustments across various application pages.

This commit is contained in:
Ho Ngoc Hai
2026-02-12 16:25:52 +07:00
parent bb64486c18
commit 38bfe14e73
26 changed files with 68 additions and 61 deletions

View File

@@ -4,8 +4,8 @@
Design: pencil-design/src/pages/tPOS/admin/admin-dashboard.pen
*@
@inherits LayoutComponentBase
@inject IStringLocalizer<AdminLayout> L
@inject NavigationManager NavigationManager
@inject IJSRuntime JS
<MudThemeProvider IsDarkMode="true" Theme="_theme" />
<MudPopoverProvider />
@@ -27,59 +27,59 @@
@* Navigation *@
<nav class="admin-sidebar__nav">
@* TỔNG QUAN *@
<span class="admin-nav-label">@L["Nav_Overview"]</span>
<span class="admin-nav-label">Tổng quan</span>
<NavLink href="/admin" class="admin-nav-item" Match="NavLinkMatch.All" ActiveClass="admin-nav-item--active">
<i data-lucide="layout-dashboard"></i>
<span>Dashboard</span>
</NavLink>
@* CỬA HÀNG *@
<span class="admin-nav-label">@L["Nav_Store"]</span>
<span class="admin-nav-label">Cửa hàng</span>
<NavLink href="/admin/stores" class="admin-nav-item" ActiveClass="admin-nav-item--active">
<i data-lucide="store"></i>
<span>@L["Nav_StoreManagement"]</span>
<span>Quản lý cửa hàng</span>
</NavLink>
<NavLink href="/admin/products" class="admin-nav-item admin-nav-item--sub" ActiveClass="admin-nav-item--active">
<i data-lucide="package"></i>
<span>@L["Nav_Products"]</span>
<span>Sản phẩm & Menu</span>
</NavLink>
<NavLink href="/admin/staff" class="admin-nav-item admin-nav-item--sub" ActiveClass="admin-nav-item--active">
<i data-lucide="users"></i>
<span>@L["Nav_Staff"]</span>
<span>Nhân sự</span>
</NavLink>
<NavLink href="/admin/inventory" class="admin-nav-item admin-nav-item--sub" ActiveClass="admin-nav-item--active">
<i data-lucide="warehouse"></i>
<span>@L["Nav_Inventory"]</span>
<span>Kho hàng</span>
</NavLink>
<NavLink href="/admin/devices" class="admin-nav-item admin-nav-item--sub" ActiveClass="admin-nav-item--active">
<NavLink href="/admin/system/devices" class="admin-nav-item admin-nav-item--sub" ActiveClass="admin-nav-item--active">
<i data-lucide="monitor"></i>
<span>@L["Nav_Devices"]</span>
<span>Thiết bị</span>
</NavLink>
@* KINH DOANH *@
<span class="admin-nav-label">@L["Nav_Business"]</span>
<span class="admin-nav-label">Kinh doanh</span>
<NavLink href="/admin/customers" class="admin-nav-item" ActiveClass="admin-nav-item--active">
<i data-lucide="heart"></i>
<span>@L["Nav_Customers"]</span>
<span>Khách hàng & Loyalty</span>
</NavLink>
<NavLink href="/admin/reports" class="admin-nav-item" ActiveClass="admin-nav-item--active">
<NavLink href="/admin/finance/revenue" class="admin-nav-item" ActiveClass="admin-nav-item--active">
<i data-lucide="bar-chart-2"></i>
<span>@L["Nav_Reports"]</span>
<span>Báo cáo & Phân tích</span>
</NavLink>
<NavLink href="/admin/finance" class="admin-nav-item" ActiveClass="admin-nav-item--active">
<i data-lucide="wallet"></i>
<span>@L["Nav_Finance"]</span>
<span>Tài chính</span>
</NavLink>
@* HỆ THỐNG *@
<span class="admin-nav-label">@L["Nav_System"]</span>
<span class="admin-nav-label">Hệ thống</span>
<NavLink href="/admin/roles" class="admin-nav-item" ActiveClass="admin-nav-item--active">
<i data-lucide="shield"></i>
<span>@L["Nav_Roles"]</span>
<span>Phân quyền</span>
</NavLink>
<NavLink href="/admin/settings" class="admin-nav-item" ActiveClass="admin-nav-item--active">
<NavLink href="/admin/system/audit" class="admin-nav-item" ActiveClass="admin-nav-item--active">
<i data-lucide="settings"></i>
<span>@L["Nav_Settings"]</span>
<span>Cài đặt</span>
</NavLink>
</nav>
@@ -90,7 +90,7 @@
<span class="admin-user-name">Velik Ho</span>
<span class="admin-user-role">Owner</span>
</div>
<button @onclick="Logout" title="@L["Nav_Logout"]">
<button @onclick="Logout" title="Đăng xuất">
<i data-lucide="log-out"></i>
</button>
</div>
@@ -111,6 +111,13 @@
@code {
private bool _sidebarOpen = false;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
// EN: Re-init Lucide icons after every render (Blazor navigation replaces DOM)
// VI: Khởi tạo lại Lucide icons sau mỗi lần render (Blazor navigation thay đổi DOM)
try { await JS.InvokeVoidAsync("lucide.createIcons"); } catch { /* ignore if lucide not loaded */ }
}
private void ToggleSidebar() => _sidebarOpen = !_sidebarOpen;
private void CloseSidebar() => _sidebarOpen = false;
private void Logout() => NavigationManager.NavigateTo("/login");

View File

@@ -41,10 +41,10 @@
<div style="display:flex;align-items:center;gap:10px;">
<i data-lucide="grip-vertical" style="width:16px;height:16px;color:var(--admin-text-tertiary);cursor:grab;"></i>
<h3 class="admin-panel__title" style="margin:0;">
<i data-lucide="@section.Icon" style="color:@section.Color;"></i>
@section.Name
<i data-lucide="@(section.Icon)" style="color:@(section.Color);"></i>
@(section.Name)
</h3>
<span class="admin-tab__badge">@section.Items.Length</span>
<span class="admin-tab__badge">@(section.Items.Length)</span>
</div>
<div style="display:flex;gap:8px;align-items:center;">
<MudSwitch T="bool" Value="section.Visible" Color="Color.Primary" />
@@ -59,7 +59,7 @@
<div style="display:flex;align-items:center;gap:12px;padding:10px 8px;border-bottom:1px solid var(--admin-border-subtle);">
<i data-lucide="grip-vertical" style="width:14px;height:14px;color:var(--admin-text-tertiary);cursor:grab;"></i>
<div style="width:40px;height:40px;background:@(section.Color)15;border-radius:8px;display:flex;align-items:center;justify-content:center;">
<i data-lucide="@section.Icon" style="width:18px;height:18px;color:@section.Color;"></i>
<i data-lucide="@(section.Icon)" style="width:18px;height:18px;color:@(section.Color);"></i>
</div>
<div style="flex:1;">
<div style="font-size:14px;font-weight:500;">@item.Name</div>

View File

@@ -217,8 +217,8 @@
private string _city = "";
private string _phone = "";
private string _email = "";
private string _openTime = "07:00";
private string _closeTime = "22:00";
private TimeOnly _openTime = new TimeOnly(7, 0);
private TimeOnly _closeTime = new TimeOnly(22, 0);
private HashSet<string> _activeDays = new() { "T2", "T3", "T4", "T5", "T6", "T7" };
private record StoreType(string Key, string Label, string Icon, string Color, string Desc);

View File

@@ -104,13 +104,13 @@
</div>
@if (SelectedRoom.Status == "available")
{
<button class="pos-btn-checkout" @onclick="() => NavigateTo("karaoke/room-select")">
<button class="pos-btn-checkout" @onclick="@(() => NavigateTo("karaoke/room-select"))">
<i data-lucide="play" style="width:18px;height:18px;"></i> Mở phiên
</button>
}
else if (SelectedRoom.Status == "occupied")
{
<button class="pos-btn-checkout" @onclick="() => NavigateTo("karaoke/room-session")">
<button class="pos-btn-checkout" @onclick="@(() => NavigateTo("karaoke/room-session"))">
<i data-lucide="receipt" style="width:18px;height:18px;"></i> Xem chi tiết
</button>
}

View File

@@ -70,12 +70,12 @@
display:flex;gap:8px;">
<button style="flex:1;padding:14px;border-radius:var(--pos-radius);background:var(--pos-bg-interactive);
border:none;color:var(--pos-text-primary);cursor:pointer;font-size:13px;font-weight:500;"
@onclick="() => NavigateTo("karaoke/room-map")">
@onclick="@(() => NavigateTo("karaoke/room-map"))">
<i data-lucide="layout-grid" style="width:16px;height:16px;display:inline;"></i> Sơ đồ
</button>
<button style="flex:1;padding:14px;border-radius:var(--pos-radius);background:var(--pos-bg-interactive);
border:none;color:var(--pos-text-primary);cursor:pointer;font-size:13px;font-weight:500;"
@onclick="() => NavigateTo("karaoke/service-display")">
@onclick="@(() => NavigateTo("karaoke/service-display"))">
<i data-lucide="bell" style="width:16px;height:16px;display:inline;"></i> Gọi phục vụ
</button>
</div>

View File

@@ -69,13 +69,13 @@
<div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:12px;">
<button style="padding:12px;border-radius:var(--pos-radius);background:var(--pos-bg-interactive);
border:none;color:var(--pos-text-primary);cursor:pointer;font-size:13px;font-weight:500;"
@onclick="() => NavigateTo("karaoke/order-fnb")">
@onclick="@(() => NavigateTo("karaoke/order-fnb"))">
<i data-lucide="utensils" style="width:16px;height:16px;display:block;margin:0 auto 4px;"></i>
Gọi F&B
</button>
<button style="padding:12px;border-radius:var(--pos-radius);background:var(--pos-bg-interactive);
border:none;color:var(--pos-text-primary);cursor:pointer;font-size:13px;font-weight:500;"
@onclick="() => NavigateTo("karaoke/room-session")">
@onclick="@(() => NavigateTo("karaoke/room-session"))">
<i data-lucide="timer" style="width:16px;height:16px;display:block;margin:0 auto 4px;"></i>
Gia hạn
</button>
@@ -108,7 +108,7 @@
<span class="pos-cart-total__value">@FormatPrice(_selectedRoom.Status == "occupied" ? 520_000 : 0)</span>
</div>
<button class="pos-btn-checkout" style="height:52px;font-size:16px;"
@onclick="() => NavigateTo("karaoke/room-session")">
@onclick="@(() => NavigateTo("karaoke/room-session"))">
<i data-lucide="receipt" style="width:18px;height:18px;"></i>
@(_selectedRoom.Status == "available" ? "Mở phiên" : "Chi tiết")
</button>

View File

@@ -11,7 +11,7 @@
<div style="display:flex;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid var(--pos-border-subtle);flex-shrink:0;">
<button style="background:var(--pos-bg-interactive);border:none;color:var(--pos-text-primary);
padding:8px 12px;border-radius:8px;cursor:pointer;font-size:13px;"
@onclick="() => NavigateTo("karaoke")">
@onclick="@(() => NavigateTo("karaoke"))">
<i data-lucide="arrow-left" style="width:16px;height:16px;display:inline;"></i>
</button>
<span style="font-size:16px;font-weight:700;">Happy Hour & Khuyến mãi</span>

View File

@@ -13,7 +13,7 @@
<div style="display:flex;align-items:center;gap:12px;margin-bottom:16px;">
<button style="background:var(--pos-bg-interactive);border:none;color:var(--pos-text-primary);
padding:8px 12px;border-radius:8px;cursor:pointer;font-size:13px;"
@onclick="() => NavigateTo("karaoke")">
@onclick="@(() => NavigateTo("karaoke"))">
<i data-lucide="arrow-left" style="width:16px;height:16px;display:inline;"></i>
</button>
<span style="font-size:16px;font-weight:700;">Thẻ thành viên</span>
@@ -137,7 +137,7 @@
<span style="color:#22C55E;">@_selectedReward.Value</span>
</div>
}
<button class="pos-btn-checkout" @onclick="() => NavigateTo("karaoke/room-session")">
<button class="pos-btn-checkout" @onclick="@(() => NavigateTo("karaoke/room-session"))">
<i data-lucide="check" style="width:18px;height:18px;"></i> Áp dụng
</button>
</div>

View File

@@ -12,7 +12,7 @@
<div style="display:flex;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid var(--pos-border-subtle);">
<button style="background:var(--pos-bg-interactive);border:none;color:var(--pos-text-primary);
padding:8px 12px;border-radius:8px;cursor:pointer;font-size:13px;"
@onclick="() => NavigateTo("karaoke/room-session")">
@onclick="@(() => NavigateTo("karaoke/room-session"))">
<i data-lucide="arrow-left" style="width:16px;height:16px;display:inline;"></i>
</button>
<span style="font-size:16px;font-weight:700;">Gọi F&B</span>
@@ -90,7 +90,7 @@
<span class="pos-cart-total__label">Tổng F&B</span>
<span class="pos-cart-total__value">@FormatPrice(_orderItems.Sum(i => i.Price * i.Qty))</span>
</div>
<button class="pos-btn-checkout" @onclick="() => NavigateTo("karaoke/room-session")">
<button class="pos-btn-checkout" @onclick="@(() => NavigateTo("karaoke/room-session"))">
<i data-lucide="send" style="width:18px;height:18px;"></i> Gửi đơn
</button>
</div>

View File

@@ -13,7 +13,7 @@
<div style="display:flex;align-items:center;gap:12px;">
<button style="background:var(--pos-bg-interactive);border:none;color:var(--pos-text-primary);
padding:8px 12px;border-radius:8px;cursor:pointer;font-size:13px;"
@onclick="() => NavigateTo("karaoke")">
@onclick="@(() => NavigateTo("karaoke"))">
<i data-lucide="arrow-left" style="width:16px;height:16px;display:inline;"></i> Quay lại
</button>
<span style="font-size:16px;font-weight:700;">Sơ đồ phòng</span>

View File

@@ -13,7 +13,7 @@
<div style="display:flex;align-items:center;gap:12px;margin-bottom:16px;">
<button style="background:var(--pos-bg-interactive);border:none;color:var(--pos-text-primary);
padding:8px 12px;border-radius:8px;cursor:pointer;font-size:13px;"
@onclick="() => NavigateTo("karaoke")">
@onclick="@(() => NavigateTo("karaoke"))">
<i data-lucide="arrow-left" style="width:16px;height:16px;display:inline;"></i>
</button>
<span style="font-size:16px;font-weight:700;">Chọn phòng</span>
@@ -135,7 +135,7 @@
<span class="pos-cart-total__label">Tổng cộng</span>
<span class="pos-cart-total__value">@FormatPrice(_selectedRoom.PricePerHour * _selectedHours)</span>
</div>
<button class="pos-btn-checkout" @onclick="() => NavigateTo("karaoke/room-session")">
<button class="pos-btn-checkout" @onclick="@(() => NavigateTo("karaoke/room-session"))">
<i data-lucide="play" style="width:18px;height:18px;"></i> Bắt đầu phiên
</button>
</div>

View File

@@ -13,7 +13,7 @@
<div style="display:flex;align-items:center;gap:12px;margin-bottom:16px;">
<button style="background:var(--pos-bg-interactive);border:none;color:var(--pos-text-primary);
padding:8px 12px;border-radius:8px;cursor:pointer;font-size:13px;"
@onclick="() => NavigateTo("karaoke")">
@onclick="@(() => NavigateTo("karaoke"))">
<i data-lucide="arrow-left" style="width:16px;height:16px;display:inline;"></i>
</button>
<div>
@@ -70,7 +70,7 @@
</button>
<button style="padding:14px 8px;border-radius:var(--pos-radius);background:rgba(34,197,94,.15);
border:none;color:#22C55E;cursor:pointer;font-size:13px;font-weight:500;"
@onclick="() => NavigateTo("karaoke/order-fnb")">
@onclick="@(() => NavigateTo("karaoke/order-fnb"))">
<i data-lucide="utensils" style="width:18px;height:18px;display:block;margin:0 auto 4px;"></i>
Gọi F&B
</button>

View File

@@ -13,7 +13,7 @@
<div style="display:flex;align-items:center;gap:12px;">
<button style="background:var(--pos-bg-interactive);border:none;color:var(--pos-text-primary);
padding:8px 12px;border-radius:8px;cursor:pointer;font-size:13px;"
@onclick="() => NavigateTo("karaoke")">
@onclick="@(() => NavigateTo("karaoke"))">
<i data-lucide="arrow-left" style="width:16px;height:16px;display:inline;"></i>
</button>
<span style="font-size:16px;font-weight:700;">Yêu cầu phục vụ</span>
@@ -97,7 +97,7 @@
{
<button style="padding:8px 14px;border-radius:8px;background:var(--pos-orange-primary);
border:none;color:#FFF;cursor:pointer;font-size:12px;font-weight:600;"
@onclick="() => req.Status = "processing"">
@onclick="@(() => req.Status = "processing")">
Nhận
</button>
}
@@ -105,7 +105,7 @@
{
<button style="padding:8px 14px;border-radius:8px;background:rgba(34,197,94,.15);
border:none;color:#22C55E;cursor:pointer;font-size:12px;font-weight:600;"
@onclick="() => req.Status = "completed"">
@onclick="@(() => req.Status = "completed")">
Xong
</button>
}

View File

@@ -13,7 +13,7 @@
{
<button class="pos-category-tab @(section == _activeSection ? "pos-category-tab--active" : "")"
@onclick="() => _activeSection = section">
@section
@(section)
</button>
}
</div>
@@ -72,7 +72,7 @@
<span class="pos-cart-total__label">Tổng cộng</span>
<span class="pos-cart-total__value">@FormatPrice(SelectedTable.Status == "occupied" ? _demoOrderItems.Sum(i => i.Price * i.Qty) : 0)</span>
</div>
<button class="pos-btn-checkout" @onclick="() => NavigateTo($\"restaurant/table-detail\")">
<button class="pos-btn-checkout" @onclick="@(() => NavigateTo("restaurant/table-detail"))">
<i data-lucide="receipt"></i> Xem hóa đơn
</button>
</div>

View File

@@ -71,7 +71,7 @@
<span class="pos-cart-total__value">@FormatPrice(_selected.Status == "occupied" ? _items.Sum(i => i.Price * i.Qty) : 0)</span>
</div>
<button class="pos-btn-checkout" style="height:52px;font-size:16px;"
@onclick="() => NavigateTo(\"restaurant/waiter-pad\")">
@onclick="@(() => NavigateTo("restaurant/waiter-pad"))">
<i data-lucide="utensils"></i> Gọi món
</button>
</div>

View File

@@ -9,7 +9,7 @@
<div style="flex:1;display:flex;flex-direction:column;overflow:hidden;">
@* ═══ HEADER / TIÊU ĐỀ ═══ *@
<div style="padding:12px 16px;border-bottom:1px solid var(--pos-border-subtle);display:flex;align-items:center;gap:12px;">
<button class="pos-category-tab" @onclick="() => NavigateTo(\"restaurant\")">
<button class="pos-category-tab" @onclick="@(() => NavigateTo("restaurant"))">
<i data-lucide="arrow-left" style="width:14px;"></i> Quay lại
</button>
<span style="font-size:16px;font-weight:700;">Báo cáo cuối ngày</span>

View File

@@ -9,7 +9,7 @@
<div style="flex:1;display:flex;flex-direction:column;overflow:hidden;">
@* ═══ HEADER / TIÊU ĐỀ ═══ *@
<div style="padding:12px 16px;border-bottom:1px solid var(--pos-border-subtle);display:flex;align-items:center;gap:12px;">
<button class="pos-category-tab" @onclick="() => NavigateTo(\"restaurant\")">
<button class="pos-category-tab" @onclick="@(() => NavigateTo("restaurant"))">
<i data-lucide="arrow-left" style="width:14px;"></i> Quay lại
</button>
<span style="font-size:16px;font-weight:700;">Màn hình bếp</span>
@@ -66,21 +66,21 @@
@if (status.Key == "new")
{
<button class="pos-btn-checkout" style="height:36px;font-size:13px;background:var(--pos-warning);"
@onclick="() => ticket.Status = \"cooking\"">
@onclick="@(() => ticket.Status = "cooking")">
<i data-lucide="chef-hat" style="width:14px;"></i> Bắt đầu nấu
</button>
}
else if (status.Key == "cooking")
{
<button class="pos-btn-checkout" style="height:36px;font-size:13px;background:var(--pos-success);"
@onclick="() => ticket.Status = \"ready\"">
@onclick="@(() => ticket.Status = "ready")">
<i data-lucide="check" style="width:14px;"></i> Sẵn sàng
</button>
}
else
{
<button class="pos-btn-checkout" style="height:36px;font-size:13px;background:var(--pos-bg-interactive);color:var(--pos-text-secondary);"
@onclick="() => ticket.Status = \"served\"">
@onclick="@(() => ticket.Status = "served")">
<i data-lucide="truck" style="width:14px;"></i> Đã mang ra
</button>
}

View File

@@ -9,7 +9,7 @@
<div style="flex:1;display:flex;flex-direction:column;overflow:hidden;">
@* ═══ HEADER / TIÊU ĐỀ ═══ *@
<div style="padding:12px 16px;border-bottom:1px solid var(--pos-border-subtle);display:flex;align-items:center;gap:12px;">
<button class="pos-category-tab" @onclick="() => NavigateTo(\"restaurant\")">
<button class="pos-category-tab" @onclick="@(() => NavigateTo("restaurant"))">
<i data-lucide="arrow-left" style="width:14px;"></i> Quay lại
</button>
<span style="font-size:16px;font-weight:700;">Lịch sử đơn hàng</span>

View File

@@ -9,7 +9,7 @@
<div style="flex:1;display:flex;flex-direction:column;overflow:hidden;">
@* ═══ HEADER / TIÊU ĐỀ ═══ *@
<div style="padding:12px 16px;border-bottom:1px solid var(--pos-border-subtle);display:flex;align-items:center;gap:12px;">
<button class="pos-category-tab" @onclick="() => NavigateTo(\"restaurant\")">
<button class="pos-category-tab" @onclick="@(() => NavigateTo("restaurant"))">
<i data-lucide="arrow-left" style="width:14px;"></i> Quay lại
</button>
<span style="font-size:16px;font-weight:700;">Đặt bàn trước</span>

View File

@@ -11,7 +11,7 @@
display:flex;flex-direction:column;overflow:hidden;">
@* ═══ HEADER / TIÊU ĐỀ ═══ *@
<div style="padding:16px 20px;border-bottom:1px solid var(--pos-border-subtle);display:flex;align-items:center;gap:12px;">
<button class="pos-category-tab" @onclick="() => NavigateTo(\"restaurant\")">
<button class="pos-category-tab" @onclick="@(() => NavigateTo("restaurant"))">
<i data-lucide="arrow-left" style="width:14px;"></i>
</button>
<div style="flex:1;">
@@ -28,7 +28,7 @@
@foreach (var item in _items)
{
<div style="display:flex;align-items:center;padding:10px 0;border-bottom:1px solid var(--pos-border-subtle);">
<span style="width:28px;font-size:13px;color:var(--pos-text-tertiary);">x@item.Qty</span>
<span style="width:28px;font-size:13px;color:var(--pos-text-tertiary);">x@(item.Qty)</span>
<span style="flex:1;font-size:14px;font-weight:500;">@item.Name</span>
<span style="font-size:14px;font-weight:600;">@FormatPrice(item.Price * item.Qty)</span>
</div>
@@ -58,9 +58,9 @@
@* EN: Split bill toggle / VI: Tùy chọn tách hóa đơn *@
<div style="display:flex;gap:10px;">
<button class="pos-category-tab @(_splitMode == "full" ? "pos-category-tab--active" : "")"
style="flex:1;text-align:center;" @onclick="() => _splitMode = \"full\"">Thanh toán đầy đủ</button>
style="flex:1;text-align:center;" @onclick="@(() => _splitMode = "full")">Thanh toán đầy đủ</button>
<button class="pos-category-tab @(_splitMode == "split" ? "pos-category-tab--active" : "")"
style="flex:1;text-align:center;" @onclick="() => _splitMode = \"split\"">Tách hóa đơn</button>
style="flex:1;text-align:center;" @onclick="@(() => _splitMode = "split")">Tách hóa đơn</button>
</div>
@if (_splitMode == "split")

View File

@@ -9,7 +9,7 @@
<div style="flex:1;display:flex;flex-direction:column;overflow:hidden;">
@* ═══ TOOLBAR / THANH CÔNG CỤ ═══ *@
<div style="padding:12px 16px;border-bottom:1px solid var(--pos-border-subtle);display:flex;align-items:center;gap:12px;">
<button class="pos-category-tab pos-category-tab--active" @onclick="() => NavigateTo(\"restaurant\")">
<button class="pos-category-tab pos-category-tab--active" @onclick="@(() => NavigateTo("restaurant"))">
<i data-lucide="arrow-left" style="width:14px;"></i> Quay lại
</button>
<span style="flex:1;font-size:16px;font-weight:700;">Quản lý sơ đồ bàn</span>

View File

@@ -9,7 +9,7 @@
<div class="pos-product-panel" style="display:flex;flex-direction:column;overflow:hidden;">
@* ═══ HEADER / TIÊU ĐỀ ═══ *@
<div style="padding:12px 16px;border-bottom:1px solid var(--pos-border-subtle);display:flex;align-items:center;gap:12px;">
<button class="pos-category-tab" @onclick="() => NavigateTo(\"restaurant\")">
<button class="pos-category-tab" @onclick="@(() => NavigateTo("restaurant"))">
<i data-lucide="arrow-left" style="width:14px;"></i> Quay lại
</button>
<span style="font-size:16px;font-weight:700;">Gọi món — Bàn 3</span>