@using Indotalent.ConfigBackEnd.Extensions @using Indotalent.Features.Setting.Company @using Indotalent.Features.Setting.Company.Cqrs @using Microsoft.AspNetCore.Components.Web @using Microsoft.JSInterop @using MudBlazor @using Features.Root.Shared @using ClosedXML.Excel @using System.IO @inject CompanyService CompanyService @inject IDialogService DialogService @inject ISnackbar Snackbar @inject IJSRuntime JSRuntime
Company Management Manage organization profile, legal entities, and office locations.
/ Settings / Company
Search
@if (_isExporting) { Processing... } else { Excel } @if (_isRefreshing) { Refreshing... } else { Refresh } @if (_selectedCompany != null) { View Edit Remove } else { Add New Company }
Company Name Email Phone City
@(!string.IsNullOrWhiteSpace(context.Name) ? context.Name.ToInitial() : "?") @context.Name @if (context.IsDefault) { DEFAULT }
@context.Email @context.Phone @context.City
Rows per page: Showing @(GetFilteredData().Count() == 0 ? 0 : _skip + 1)-@Math.Min(_skip + _top, GetFilteredData().Count()) of @GetFilteredData().Count()
Prev @{ var totalPages = _totalPage == 0 ? 1 : _totalPage; var maxVisible = 5; var startPage = Math.Max(1, _currentPage - maxVisible / 2); var endPage = Math.Min(totalPages, startPage + maxVisible - 1); if (endPage - startPage < maxVisible - 1) { startPage = Math.Max(1, endPage - maxVisible + 1); } } @for (int i = startPage; i <= endPage; i++) { var pageNum = i; var isActive = pageNum == _currentPage; @pageNum } Next
@code { [Parameter] public EventCallback OnAdd { get; set; } [Parameter] public EventCallback OnEdit { get; set; } [Parameter] public EventCallback OnView { get; set; } private List _companies = new(); private GetCompanyListResponse? _selectedCompany; private string _searchString = ""; private bool _isRefreshing = false; private bool _isExporting = false; private int _skip = 0; private int _top = 10; private int _totalPage => GetFilteredData().Count() == 0 ? 0 : (int)Math.Ceiling((double)GetFilteredData().Count() / (_top == 0 ? 1 : _top)); private int _currentPage => (_top >= GetFilteredData().Count() || _top == 0) ? 1 : (_skip / _top) + 1; protected override async Task OnInitializedAsync() => await LoadData(); private async Task LoadData() { _isRefreshing = true; _selectedCompany = null; StateHasChanged(); try { var response = await CompanyService.GetCompanyListAsync(); await Task.Delay(500); if (response != null && response.IsSuccess) { _companies = response.Value ?? new List(); } } finally { _isRefreshing = false; StateHasChanged(); } } private IEnumerable GetFilteredData() { if (string.IsNullOrWhiteSpace(_searchString)) return _companies; return _companies.Where(x => (x.Name?.Contains(_searchString, StringComparison.OrdinalIgnoreCase) ?? false) || (x.Email?.Contains(_searchString, StringComparison.OrdinalIgnoreCase) ?? false) || (x.City?.Contains(_searchString, StringComparison.OrdinalIgnoreCase) ?? false) || (x.Phone?.Contains(_searchString, StringComparison.OrdinalIgnoreCase) ?? false) ); } private IEnumerable GetPagedData() => GetFilteredData().Skip(_skip).Take(_top); private void OnSearchClick() { _skip = 0; _selectedCompany = null; StateHasChanged(); } private void HandleSearchKeyDown(KeyboardEventArgs e) { if (e.Key == "Enter") OnSearchClick(); } private async Task ExportToExcel() { _isExporting = true; StateHasChanged(); try { await Task.Delay(1000); using (var workbook = new XLWorkbook()) { var worksheet = workbook.Worksheets.Add("Companies"); var currentRow = 1; worksheet.Cell(currentRow, 1).Value = "Company Name"; worksheet.Cell(currentRow, 2).Value = "Email"; worksheet.Cell(currentRow, 3).Value = "Phone"; worksheet.Cell(currentRow, 4).Value = "City"; worksheet.Cell(currentRow, 5).Value = "Is Default"; var headerRange = worksheet.Range(1, 1, 1, 5); headerRange.Style.Font.Bold = true; headerRange.Style.Fill.BackgroundColor = XLColor.FromHtml("#0D47A1"); headerRange.Style.Font.FontColor = XLColor.White; foreach (var item in GetFilteredData()) { currentRow++; worksheet.Cell(currentRow, 1).Value = item.Name; worksheet.Cell(currentRow, 2).Value = item.Email; worksheet.Cell(currentRow, 3).Value = item.Phone; worksheet.Cell(currentRow, 4).Value = item.City; worksheet.Cell(currentRow, 5).Value = item.IsDefault ? "Yes" : "No"; } worksheet.Columns().AdjustToContents(); using (var stream = new MemoryStream()) { workbook.SaveAs(stream); var content = Convert.ToBase64String(stream.ToArray()); await JSRuntime.InvokeVoidAsync("downloadFile", "Registered_Companies.xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", content); Snackbar.Add("Excel exported successfully", Severity.Success); } } } catch (Exception ex) { Snackbar.Add($"Export failed: {ex.Message}", Severity.Error); } finally { _isExporting = false; StateHasChanged(); } } private void OnPageChanged(int page) { if (page >= 1 && page <= _totalPage) { _skip = (page - 1) * _top; _selectedCompany = null; StateHasChanged(); } } private void OnPageSizeChanged(int size) { _top = size; _skip = 0; _selectedCompany = null; StateHasChanged(); } private async Task InvokeEdit() { if (_selectedCompany == null) return; var request = await MapToUpdateRequest(_selectedCompany.Id); if (request != null) await OnEdit.InvokeAsync(request); } private async Task InvokeView() { if (_selectedCompany == null) return; var request = await MapToUpdateRequest(_selectedCompany.Id); if (request != null) await OnView.InvokeAsync(request); } private async Task MapToUpdateRequest(string id) { var response = await CompanyService.GetCompanyByIdAsync(id); if (response != null && response.IsSuccess && response.Value != null) { var detail = response.Value; return new UpdateCompanyRequest { Id = detail.Id, Name = detail.Name, Description = detail.Description, IsDefault = detail.IsDefault, CurrencyId = detail.CurrencyId, TaxIdentification = detail.TaxIdentification, BusinessLicense = detail.BusinessLicense, CompanyLogo = detail.CompanyLogo, StreetAddress = detail.StreetAddress, City = detail.City, StateProvince = detail.StateProvince, ZipCode = detail.ZipCode, Phone = detail.Phone, Email = detail.Email, SocialMediaLinkedIn = detail.SocialMediaLinkedIn, SocialMediaX = detail.SocialMediaX, SocialMediaFacebook = detail.SocialMediaFacebook, SocialMediaInstagram = detail.SocialMediaInstagram, SocialMediaTikTok = detail.SocialMediaTikTok, OtherInformation1 = detail.OtherInformation1, OtherInformation2 = detail.OtherInformation2, OtherInformation3 = detail.OtherInformation3, CreatedAt = detail.CreatedAt, CreatedBy = detail.CreatedBy, UpdatedAt = detail.UpdatedAt, UpdatedBy = detail.UpdatedBy }; } return null; } private async Task OnDelete() { if (_selectedCompany == null) return; if (_selectedCompany.IsDefault) { Snackbar.Add("Cannot delete the default company. Please set another company as default first.", Severity.Warning); return; } if (_companies.Count <= 1) { Snackbar.Add("Cannot delete the last remaining company. At least one company must exist in the system.", Severity.Error); return; } var parameters = new DialogParameters<_DeleteConfirmation> { { x => x.ContentText, _selectedCompany.Name } }; var options = new DialogOptions { CloseButton = false, MaxWidth = MaxWidth.ExtraSmall, FullWidth = true }; var dialog = await DialogService.ShowAsync<_DeleteConfirmation>("", parameters, options); var result = await dialog.Result; if (result != null && !result.Canceled) { var isSuccess = await CompanyService.DeleteCompanyByIdAsync(_selectedCompany.Id); if (isSuccess) { _selectedCompany = null; await LoadData(); Snackbar.Add("Company deleted successfully", Severity.Success); } else { Snackbar.Add("Delete failed. This record might be protected by the system.", Severity.Error); } } } }