diff --git a/.gitignore b/.gitignore
index 3508f6e..2f9a25a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,10 @@
# ---> VisualStudio
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
-##
+##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
-# User-specific files
+# User-specific files
*.rsuser
*.suo
*.user
diff --git a/src/BackOffice/Common/Utilities/RouteConstance.cs b/src/BackOffice/Common/Utilities/RouteConstance.cs
index 9da68a5..6298da1 100644
--- a/src/BackOffice/Common/Utilities/RouteConstance.cs
+++ b/src/BackOffice/Common/Utilities/RouteConstance.cs
@@ -8,6 +8,7 @@ public static class RouteConstance
public const string Package = "/PackagePage/";
public const string Role = "/RolePage/";
public const string UserPage = "/UserPage/";
+ public const string InvitationsReport = "/InvitationsReportPage/";
public const string UserOrder = "/UserOrderPage/";
public const string Orders = "/OrdersPage/";
public const string OrdersSalesReports = "/OrdersSalesReportsPage/";
diff --git a/src/BackOffice/Pages/User/InvitationsReportPage.razor b/src/BackOffice/Pages/User/InvitationsReportPage.razor
new file mode 100644
index 0000000..ebf2740
--- /dev/null
+++ b/src/BackOffice/Pages/User/InvitationsReportPage.razor
@@ -0,0 +1,85 @@
+@attribute [Route(RouteConstance.InvitationsReport)]
+@using CMSMicroservice.Protobuf.Protos.User
+@using BackOffice.Common.BaseComponents
+@using DataModel = CMSMicroservice.Protobuf.Protos.User.InvitationReportModel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ همه
+ فعال
+ غیرفعال
+
+
+
+
+
+
+ گزارش دعوتها (جدیدترین اول)
+
+
+
+
+
+ @($"{context.Item.InviterFirstName} {context.Item.InviterLastName}".Trim())
+ @context.Item.InviterMobile
+
+
+
+
+ @($"{context.Item.InviteeFirstName} {context.Item.InviteeLastName}".Trim())
+ @context.Item.InviteeMobile
+
+
+
+
+ @(context.Item.InviteeRegisteredAt?.ToDateTime().ToLocalTime().ToString("yyyy/MM/dd HH:mm") ?? "—")
+
+
+
+
+ @if (context.Item.InviteeClubActive)
+ {
+ فعال
+ }
+ else
+ {
+ غیرفعال
+ }
+
+
+
+
+ @(context.Item.InvitedAt?.ToDateTime().ToLocalTime().ToString("yyyy/MM/dd HH:mm") ?? "—")
+
+
+
+
+
+
+
+ موردی یافت نشد
+
+
+
+
diff --git a/src/BackOffice/Pages/User/InvitationsReportPage.razor.cs b/src/BackOffice/Pages/User/InvitationsReportPage.razor.cs
new file mode 100644
index 0000000..fd37548
--- /dev/null
+++ b/src/BackOffice/Pages/User/InvitationsReportPage.razor.cs
@@ -0,0 +1,74 @@
+using CMSMicroservice.Protobuf.Protos.User;
+using BackOffice.Common.BaseComponents;
+using Microsoft.AspNetCore.Components;
+using MudBlazor;
+using DataModel = CMSMicroservice.Protobuf.Protos.User.InvitationReportModel;
+
+namespace BackOffice.Pages.User;
+
+public partial class InvitationsReportPage
+{
+ [Inject] public UserContract.UserContractClient UserContract { get; set; } = default!;
+
+ private MudDataGrid _gridData = default!;
+ private BasePageComponent _basePage = default!;
+ private GetInvitationsByFilterRequest _request = new() { Filter = new() };
+ private string _clubActiveFilter = string.Empty;
+
+ private async Task> ServerReload(GridState state)
+ {
+ _request.Filter ??= new();
+ ApplyClubFilter();
+ _request.PaginationState ??= new();
+ _request.PaginationState.PageNumber = state.Page + 1;
+ _request.PaginationState.PageSize = state.PageSize;
+ _request.SortBy = "newest";
+
+ var result = await UserContract.GetInvitationsByFilterAsync(_request);
+ if (result?.Models != null && result.Models.Any())
+ {
+ return new GridData
+ {
+ Items = result.Models.ToList(),
+ TotalItems = (int)result.MetaData.TotalCount
+ };
+ }
+
+ return new GridData();
+ }
+
+ private void ApplyClubFilter()
+ {
+ _request.Filter ??= new();
+ if (_clubActiveFilter == "true")
+ _request.Filter.InviteeClubActive = true;
+ else if (_clubActiveFilter == "false")
+ _request.Filter.InviteeClubActive = false;
+ else
+ _request.Filter.InviteeClubActive = null;
+ }
+
+ private void ReLoadData()
+ {
+ _ = _gridData.ReloadServerData();
+ }
+
+ public async Task OnFilterSubmit()
+ {
+ ApplyClubFilter();
+ _basePage.IsFiltered = true;
+ StateHasChanged();
+ ReLoadData();
+ await Task.CompletedTask;
+ }
+
+ public async Task OnFilterCleared()
+ {
+ _basePage.IsFiltered = false;
+ _clubActiveFilter = string.Empty;
+ _request = new() { Filter = new() };
+ StateHasChanged();
+ ReLoadData();
+ await Task.CompletedTask;
+ }
+}
diff --git a/src/BackOffice/Shared/NavMenu.razor b/src/BackOffice/Shared/NavMenu.razor
index c2c9776..4e825a7 100644
--- a/src/BackOffice/Shared/NavMenu.razor
+++ b/src/BackOffice/Shared/NavMenu.razor
@@ -185,6 +185,11 @@
Icon="@Icons.Material.Filled.People">
کاربران
+
+ گزارش دعوتها
+
}
@if (CanManageRoles)