@page "/campaigns" @using Hcs.WebApp.BackgroundServices @using Hcs.WebApp.Services @using Microsoft.AspNetCore.Authorization @implements IDisposable @attribute [Authorize] @inject AuthenticationStateProvider AuthenticationStateProvider @inject HeadquartersService HeadquartersService @inject CampaignManagementState CampaignManagementState @inject OperationExecutionState OperationExecutionState @inject ResultGetState ResultGetState Кампании @code { PageState state; RadzenDataGrid campaignsDataGrid; RadzenDataGrid operationsDataGrid; IEnumerable? campaigns; Campaign? expandedCampaign; protected override async Task OnAfterRenderAsync(bool firstRender) { await base.OnAfterRenderAsync(firstRender); if (firstRender) { ChangeState(PageState.Loading); var state = await AuthenticationStateProvider.GetAuthenticationStateAsync(); if (state.User.IsOperatorOrHigher()) { campaigns = await HeadquartersService.GetCampaignsAsync(); CampaignManagementState.OnCampaignCreated += OnCampaignCreated; CampaignManagementState.OnCampaignStarted += OnCampaignStarted; CampaignManagementState.OnCampaignProgressStep += OnCampaignProgressStep; CampaignManagementState.OnCampaignEnded += OnCampaignEnded; OperationExecutionState.OnOperationStarted += OnOperationStarted; OperationExecutionState.OnOperationExecuted += OnOperationExecuted; OperationExecutionState.OnOperationEnded += OnOperationEnded; ResultGetState.OnOperationEnded += OnOperationEnded; } ChangeState(PageState.Idle); } } async Task RowExpandAsync(Campaign campaign) { expandedCampaign = campaign; if (campaign.Operations == null) { campaign.Operations = await HeadquartersService.GetOperationsAsync(campaign.Id); } } void RowCollapse(Campaign campaign) { if (expandedCampaign != null && expandedCampaign.Id == campaign.Id) { expandedCampaign = null; } campaign.Operations = null; } void ChangeState(PageState state) { if (this.state == state) return; this.state = state; StateHasChanged(); } void OnCampaignCreated(Campaign campaign) { Task.Run(RefreshCampaigns); } async Task RefreshCampaigns() { await InvokeAsync(() => ChangeState(PageState.Loading)); var refreshedCampaigns = await HeadquartersService.GetCampaignsAsync(); await InvokeAsync(() => { campaigns = refreshedCampaigns; expandedCampaign = null; ChangeState(PageState.Idle); }); } void OnCampaignStarted(int campaignId, DateTime startedAt) { InvokeAsync(() => { var targetCampaign = campaigns?.FirstOrDefault(x => x.Id == campaignId); if (targetCampaign != null) { targetCampaign.StartedAt = startedAt; campaignsDataGrid.Reload(); } if (expandedCampaign != null && expandedCampaign.Id == campaignId) { campaignsDataGrid.CollapseAll(); } }); } void OnCampaignProgressStep(int campaignId, int step, int progress) { InvokeAsync(() => { var targetCampaign = campaigns?.FirstOrDefault(x => x.Id == campaignId); if (targetCampaign != null) { targetCampaign.Step = step; targetCampaign.Progress = progress; campaignsDataGrid.Reload(); if (expandedCampaign != null && expandedCampaign.Id == campaignId) { campaignsDataGrid.CollapseAll(); } } }); } void OnCampaignEnded(int campaignId, Campaign.CampaignType type, DateTime endedAt, string failureReason) { InvokeAsync(() => { var targetCampaign = campaigns?.FirstOrDefault(x => x.Id == campaignId); if (targetCampaign != null) { targetCampaign.EndedAt = endedAt; targetCampaign.FailureReason = failureReason; campaignsDataGrid.Reload(); } if (expandedCampaign != null && expandedCampaign.Id == campaignId) { campaignsDataGrid.CollapseAll(); } }); } void OnOperationStarted(int operationId, int campaignId, DateTime startedAt) { InvokeAsync(() => { if (expandedCampaign != null && expandedCampaign.Id == campaignId) { var targetOperation = expandedCampaign.Operations?.FirstOrDefault(x => x.Id == operationId); if (targetOperation != null) { targetOperation.StartedAt = startedAt; operationsDataGrid.Reload(); } } }); } void OnOperationExecuted(int operationId, int campaignId, string messageGuid) { InvokeAsync(() => { if (expandedCampaign != null && expandedCampaign.Id == campaignId) { var targetOperation = expandedCampaign.Operations?.FirstOrDefault(x => x.Id == operationId); if (targetOperation != null) { targetOperation.MessageGuid = messageGuid; operationsDataGrid.Reload(); } } }); } void OnOperationEnded(int operationId, int campaignId, DateTime endedAt, string failureReason) { InvokeAsync(() => { if (expandedCampaign != null && expandedCampaign.Id == campaignId) { var targetOperation = expandedCampaign.Operations?.FirstOrDefault(x => x.Id == operationId); if (targetOperation != null) { targetOperation.EndedAt = endedAt; targetOperation.FailureReason = failureReason; operationsDataGrid.Reload(); } } }); } public void Dispose() { CampaignManagementState.OnCampaignCreated -= OnCampaignCreated; CampaignManagementState.OnCampaignStarted -= OnCampaignStarted; CampaignManagementState.OnCampaignProgressStep -= OnCampaignProgressStep; CampaignManagementState.OnCampaignEnded -= OnCampaignEnded; OperationExecutionState.OnOperationStarted -= OnOperationStarted; OperationExecutionState.OnOperationExecuted -= OnOperationExecuted; OperationExecutionState.OnOperationEnded -= OnOperationEnded; ResultGetState.OnOperationEnded -= OnOperationEnded; } }