u
This commit is contained in:
@@ -109,131 +109,3 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@code {
|
|
||||||
private UserNode? _currentUser;
|
|
||||||
private bool _isExpanded;
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
await LoadCurrentUser();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task LoadCurrentUser()
|
|
||||||
{
|
|
||||||
// Mock data - replace with actual API call
|
|
||||||
_currentUser = new UserNode
|
|
||||||
{
|
|
||||||
Id = 1,
|
|
||||||
FirstName = "علی",
|
|
||||||
LastName = "رضایی",
|
|
||||||
Avatar = "images/avatar1.jpg",
|
|
||||||
PersonalPurchase = 2500000,
|
|
||||||
TeamPurchase = 15000000,
|
|
||||||
Children = new List<UserNode>
|
|
||||||
{
|
|
||||||
new UserNode
|
|
||||||
{
|
|
||||||
Id = 2,
|
|
||||||
FirstName = "مریم",
|
|
||||||
LastName = "احمدی",
|
|
||||||
Avatar = "images/avatar2.jpg",
|
|
||||||
PersonalPurchase = 1800000,
|
|
||||||
TeamPurchase = 8500000,
|
|
||||||
Children = new List<UserNode>
|
|
||||||
{
|
|
||||||
new UserNode
|
|
||||||
{
|
|
||||||
Id = 5,
|
|
||||||
FirstName = "سارا",
|
|
||||||
LastName = "کریمی",
|
|
||||||
PersonalPurchase = 1200000,
|
|
||||||
TeamPurchase = 3200000
|
|
||||||
},
|
|
||||||
new UserNode
|
|
||||||
{
|
|
||||||
Id = 6,
|
|
||||||
FirstName = "امیر",
|
|
||||||
LastName = "حسینی",
|
|
||||||
PersonalPurchase = 950000,
|
|
||||||
TeamPurchase = 1800000
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new UserNode
|
|
||||||
{
|
|
||||||
Id = 3,
|
|
||||||
FirstName = "حسن",
|
|
||||||
LastName = "کریمی",
|
|
||||||
Avatar = "images/avatar3.jpg",
|
|
||||||
PersonalPurchase = 2200000,
|
|
||||||
TeamPurchase = 9200000,
|
|
||||||
Children = new List<UserNode>
|
|
||||||
{
|
|
||||||
new UserNode
|
|
||||||
{
|
|
||||||
Id = 7,
|
|
||||||
FirstName = "فاطمه",
|
|
||||||
LastName = "رضایی",
|
|
||||||
PersonalPurchase = 1350000,
|
|
||||||
TeamPurchase = 4100000
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new UserNode
|
|
||||||
{
|
|
||||||
Id = 4,
|
|
||||||
FirstName = "زهرا",
|
|
||||||
LastName = "محمدی",
|
|
||||||
Avatar = "images/avatar4.jpg",
|
|
||||||
PersonalPurchase = 1950000,
|
|
||||||
TeamPurchase = 7800000
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ToggleExpand()
|
|
||||||
{
|
|
||||||
_isExpanded = !_isExpanded;
|
|
||||||
StateHasChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ToggleChildExpand(long userId)
|
|
||||||
{
|
|
||||||
var child = FindChild(_currentUser, userId);
|
|
||||||
if (child != null)
|
|
||||||
{
|
|
||||||
child.IsExpanded = !child.IsExpanded;
|
|
||||||
StateHasChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private UserNode? FindChild(UserNode? node, long userId)
|
|
||||||
{
|
|
||||||
if (node == null) return null;
|
|
||||||
if (node.Id == userId) return node;
|
|
||||||
|
|
||||||
if (node.Children != null)
|
|
||||||
{
|
|
||||||
foreach (var child in node.Children)
|
|
||||||
{
|
|
||||||
var found = FindChild(child, userId);
|
|
||||||
if (found != null) return found;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class UserNode
|
|
||||||
{
|
|
||||||
public long Id { get; set; }
|
|
||||||
public string? FirstName { get; set; }
|
|
||||||
public string? LastName { get; set; }
|
|
||||||
public string? Avatar { get; set; }
|
|
||||||
public long? PersonalPurchase { get; set; }
|
|
||||||
public long? TeamPurchase { get; set; }
|
|
||||||
public List<UserNode>? Children { get; set; }
|
|
||||||
public bool IsExpanded { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
130
src/FrontOffice.Main/Shared/OrganizationChart.razor.cs
Normal file
130
src/FrontOffice.Main/Shared/OrganizationChart.razor.cs
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
namespace FrontOffice.Main.Shared;
|
||||||
|
public partial class OrganizationChart
|
||||||
|
{
|
||||||
|
private UserNode? _currentUser;
|
||||||
|
private bool _isExpanded;
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
await LoadCurrentUser();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task LoadCurrentUser()
|
||||||
|
{
|
||||||
|
// Mock data - replace with actual API call
|
||||||
|
_currentUser = new UserNode
|
||||||
|
{
|
||||||
|
Id = 1,
|
||||||
|
FirstName = "علی",
|
||||||
|
LastName = "رضایی",
|
||||||
|
Avatar = "images/avatar1.jpg",
|
||||||
|
PersonalPurchase = 2500000,
|
||||||
|
TeamPurchase = 15000000,
|
||||||
|
Children = new List<UserNode>
|
||||||
|
{
|
||||||
|
new UserNode
|
||||||
|
{
|
||||||
|
Id = 2,
|
||||||
|
FirstName = "مریم",
|
||||||
|
LastName = "احمدی",
|
||||||
|
Avatar = "images/avatar2.jpg",
|
||||||
|
PersonalPurchase = 1800000,
|
||||||
|
TeamPurchase = 8500000,
|
||||||
|
Children = new List<UserNode>
|
||||||
|
{
|
||||||
|
new UserNode
|
||||||
|
{
|
||||||
|
Id = 5,
|
||||||
|
FirstName = "سارا",
|
||||||
|
LastName = "کریمی",
|
||||||
|
PersonalPurchase = 1200000,
|
||||||
|
TeamPurchase = 3200000
|
||||||
|
},
|
||||||
|
new UserNode
|
||||||
|
{
|
||||||
|
Id = 6,
|
||||||
|
FirstName = "امیر",
|
||||||
|
LastName = "حسینی",
|
||||||
|
PersonalPurchase = 950000,
|
||||||
|
TeamPurchase = 1800000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new UserNode
|
||||||
|
{
|
||||||
|
Id = 3,
|
||||||
|
FirstName = "حسن",
|
||||||
|
LastName = "کریمی",
|
||||||
|
Avatar = "images/avatar3.jpg",
|
||||||
|
PersonalPurchase = 2200000,
|
||||||
|
TeamPurchase = 9200000,
|
||||||
|
Children = new List<UserNode>
|
||||||
|
{
|
||||||
|
new UserNode
|
||||||
|
{
|
||||||
|
Id = 7,
|
||||||
|
FirstName = "فاطمه",
|
||||||
|
LastName = "رضایی",
|
||||||
|
PersonalPurchase = 1350000,
|
||||||
|
TeamPurchase = 4100000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new UserNode
|
||||||
|
{
|
||||||
|
Id = 4,
|
||||||
|
FirstName = "زهرا",
|
||||||
|
LastName = "محمدی",
|
||||||
|
Avatar = "images/avatar4.jpg",
|
||||||
|
PersonalPurchase = 1950000,
|
||||||
|
TeamPurchase = 7800000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ToggleExpand()
|
||||||
|
{
|
||||||
|
_isExpanded = !_isExpanded;
|
||||||
|
StateHasChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ToggleChildExpand(long userId)
|
||||||
|
{
|
||||||
|
var child = FindChild(_currentUser, userId);
|
||||||
|
if (child != null)
|
||||||
|
{
|
||||||
|
child.IsExpanded = !child.IsExpanded;
|
||||||
|
StateHasChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private UserNode? FindChild(UserNode? node, long userId)
|
||||||
|
{
|
||||||
|
if (node == null) return null;
|
||||||
|
if (node.Id == userId) return node;
|
||||||
|
|
||||||
|
if (node.Children != null)
|
||||||
|
{
|
||||||
|
foreach (var child in node.Children)
|
||||||
|
{
|
||||||
|
var found = FindChild(child, userId);
|
||||||
|
if (found != null) return found;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class UserNode
|
||||||
|
{
|
||||||
|
public long Id { get; set; }
|
||||||
|
public string? FirstName { get; set; }
|
||||||
|
public string? LastName { get; set; }
|
||||||
|
public string? Avatar { get; set; }
|
||||||
|
public long? PersonalPurchase { get; set; }
|
||||||
|
public long? TeamPurchase { get; set; }
|
||||||
|
public List<UserNode>? Children { get; set; }
|
||||||
|
public bool IsExpanded { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -134,7 +134,7 @@
|
|||||||
.org-level::before {
|
.org-level::before {
|
||||||
content: '';
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: -20px;
|
top: -40px;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
width: 2px;
|
width: 2px;
|
||||||
@@ -142,6 +142,17 @@
|
|||||||
background: #ddd;
|
background: #ddd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.org-level::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: -20px;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 2px;
|
||||||
|
background: #ddd;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
.org-sublevel {
|
.org-sublevel {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
@@ -161,6 +172,17 @@
|
|||||||
background: #ddd;
|
background: #ddd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.org-sublevel::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 2px;
|
||||||
|
background: #ddd;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Responsive adjustments */
|
/* Responsive adjustments */
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.org-chart-container {
|
.org-chart-container {
|
||||||
|
|||||||
Reference in New Issue
Block a user