mirror of https://github.com/abpframework/eventhub
36 changed files with 2602 additions and 22 deletions
@ -0,0 +1,11 @@ |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Application.Dtos; |
|||
using Volo.Abp.Application.Services; |
|||
|
|||
namespace Payment.Admin.Payments |
|||
{ |
|||
public interface IPaymentRequestAdminAppService : IApplicationService |
|||
{ |
|||
Task<PagedResultDto<PaymentRequestWithDetailsDto>> GetListAsync(PaymentRequestGetListInput input); |
|||
} |
|||
} |
|||
@ -0,0 +1,21 @@ |
|||
using System; |
|||
using Payment.PaymentRequests; |
|||
using Volo.Abp.Application.Dtos; |
|||
|
|||
namespace Payment.Admin.Payments |
|||
{ |
|||
public class PaymentRequestGetListInput : PagedAndSortedResultRequestDto |
|||
{ |
|||
// public string CustomerId { get; set; }
|
|||
|
|||
// public string ProductName { get; set; }
|
|||
|
|||
public string Filter { get; set; } |
|||
|
|||
public DateTime? CreationDateMax { get; set; } |
|||
|
|||
public DateTime? CreationDateMin { get; set; } |
|||
|
|||
public PaymentRequestState? Status { get; set; } |
|||
} |
|||
} |
|||
@ -0,0 +1,24 @@ |
|||
using System; |
|||
using Payment.PaymentRequests; |
|||
using Volo.Abp.Application.Dtos; |
|||
using Volo.Abp.Auditing; |
|||
|
|||
namespace Payment.Admin.Payments |
|||
{ |
|||
public class PaymentRequestWithDetailsDto : ExtensibleEntityDto<Guid>, IHasCreationTime |
|||
{ |
|||
public string CustomerId { get; set; } |
|||
|
|||
public string ProductName { get; set; } |
|||
|
|||
public float Price { get; set; } |
|||
|
|||
public string Currency { get; set; } |
|||
|
|||
public PaymentRequestState State { get; set; } |
|||
|
|||
public string FailReason { get; set; } |
|||
|
|||
public DateTime CreationTime { get; } |
|||
} |
|||
} |
|||
@ -0,0 +1,20 @@ |
|||
using Payment.Localization; |
|||
using Volo.Abp.Authorization.Permissions; |
|||
using Volo.Abp.Localization; |
|||
|
|||
namespace Payment.Admin.Permissions |
|||
{ |
|||
public class PaymentAdminPermissionDefinitionProvider : PermissionDefinitionProvider |
|||
{ |
|||
public override void Define(IPermissionDefinitionContext context) |
|||
{ |
|||
var paymentGroup = context.AddGroup(PaymentAdminPermissions.GroupName, L("Permission:Payment")); |
|||
paymentGroup.AddPermission(PaymentAdminPermissions.Request.Default, L("Permission:RequestManagement")); |
|||
} |
|||
|
|||
private static LocalizableString L(string name) |
|||
{ |
|||
return LocalizableString.Create<PaymentResource>(name); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,12 @@ |
|||
namespace Payment.Admin.Permissions |
|||
{ |
|||
public class PaymentAdminPermissions |
|||
{ |
|||
public const string GroupName = "Payment"; |
|||
|
|||
public static class Request |
|||
{ |
|||
public const string Default = GroupName + ".Request"; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,14 @@ |
|||
using AutoMapper; |
|||
using Payment.Admin.Payments; |
|||
using Payment.PaymentRequests; |
|||
|
|||
namespace Payment.Admin |
|||
{ |
|||
public class PaymentAdminApplicationAutoMapperProfile : Profile |
|||
{ |
|||
public PaymentAdminApplicationAutoMapperProfile() |
|||
{ |
|||
CreateMap<PaymentRequest, PaymentRequestWithDetailsDto>(); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,43 @@ |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using Payment.PaymentRequests; |
|||
using Volo.Abp.Application.Dtos; |
|||
using Volo.Abp.Application.Services; |
|||
|
|||
namespace Payment.Admin.Payments |
|||
{ |
|||
public class PaymentRequestAdminAppService : ApplicationService, IPaymentRequestAdminAppService |
|||
{ |
|||
protected IPaymentRequestRepository PaymentRequestRepository { get; } |
|||
|
|||
public PaymentRequestAdminAppService(IPaymentRequestRepository paymentRequestRepository) |
|||
{ |
|||
PaymentRequestRepository = paymentRequestRepository; |
|||
} |
|||
|
|||
public async Task<PagedResultDto<PaymentRequestWithDetailsDto>> GetListAsync(PaymentRequestGetListInput input) |
|||
{ |
|||
var paymentRequests = await PaymentRequestRepository.GetListAsync( |
|||
input.SkipCount, |
|||
input.MaxResultCount, |
|||
input.Sorting, |
|||
input.Filter, |
|||
input.CreationDateMax, |
|||
input.CreationDateMin, |
|||
input.Status |
|||
); |
|||
|
|||
var totalCount = await PaymentRequestRepository.GetCountAsync( |
|||
input.Filter, |
|||
input.CreationDateMax, |
|||
input.CreationDateMin, |
|||
input.Status |
|||
); |
|||
|
|||
return new PagedResultDto<PaymentRequestWithDetailsDto>( |
|||
totalCount, |
|||
ObjectMapper.Map<List<PaymentRequest>, List<PaymentRequestWithDetailsDto>>(paymentRequests) |
|||
); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,43 @@ |
|||
using System.Threading.Tasks; |
|||
using Payment.Admin.Permissions; |
|||
using Payment.Localization; |
|||
using Volo.Abp.UI.Navigation; |
|||
|
|||
namespace Payment.Admin.Navigation |
|||
{ |
|||
public class PaymentAdminBlazorMenuContributor : IMenuContributor |
|||
{ |
|||
public async Task ConfigureMenuAsync(MenuConfigurationContext context) |
|||
{ |
|||
if (context.Menu.Name == StandardMenus.Main) |
|||
{ |
|||
await ConfigureMainMenuAsync(context); |
|||
} |
|||
} |
|||
|
|||
private async Task ConfigureMainMenuAsync(MenuConfigurationContext context) |
|||
{ |
|||
await AddPaymentMenuAsync(context); |
|||
} |
|||
|
|||
private Task AddPaymentMenuAsync(MenuConfigurationContext context) |
|||
{ |
|||
var l = context.GetLocalizer<PaymentResource>(); |
|||
|
|||
var paymentMenu = context.Menu.FindMenuItem(PaymentAdminMenuNames.GroupName); |
|||
if (paymentMenu == null) |
|||
{ |
|||
paymentMenu = new ApplicationMenuItem( |
|||
PaymentAdminMenuNames.GroupName, |
|||
l["Menu:PaymentManagement"], |
|||
icon: "fa fa-money-check", |
|||
url: "/payment/requests", |
|||
requiredPermissionName: PaymentAdminPermissions.Request.Default |
|||
); |
|||
} |
|||
|
|||
context.Menu.AddItem(paymentMenu); |
|||
return Task.CompletedTask; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
namespace Payment.Admin.Navigation |
|||
{ |
|||
public static class PaymentAdminMenuNames |
|||
{ |
|||
public const string GroupName = "Payment"; |
|||
} |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
@page "/Payment/Requests" |
|||
@using global::Payment.Admin.Payments |
|||
@using Volo.Abp.AspNetCore.Components.Web.Theming.Layout |
|||
@using Blazorise |
|||
@using Volo.Abp.Application.Dtos |
|||
@using Volo.Abp.BlazoriseUI.Components.ObjectExtending |
|||
@inherits PaymentAdminComponentBase |
|||
|
|||
@* ************************* PAGE HEADER ************************* *@ |
|||
<PageHeader Title="@L["PaymentRequests"]" BreadcrumbItems="@BreadcrumbItems" Toolbar="@Toolbar"> |
|||
</PageHeader> |
|||
|
|||
@* ************************* DATA GRID ************************* *@ |
|||
<Card> |
|||
<CardBody> |
|||
<AbpExtensibleDataGrid TItem="PaymentRequestWithDetailsDto" |
|||
Data="@Entities" |
|||
ReadData="@OnDataGridReadAsync" |
|||
TotalItems="@TotalCount" |
|||
ShowPager="true" |
|||
PageSize="@PageSize" |
|||
CurrentPage="@CurrentPage" |
|||
Columns="@PaymentRequestTableColumns"> |
|||
</AbpExtensibleDataGrid> |
|||
</CardBody> |
|||
</Card> |
|||
@ -0,0 +1,125 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
using Blazorise; |
|||
using Blazorise.DataGrid; |
|||
using Microsoft.AspNetCore.Components; |
|||
using Payment.Admin.Payments; |
|||
using Volo.Abp.Application.Dtos; |
|||
using Volo.Abp.AspNetCore.Components.Web.Extensibility.TableColumns; |
|||
using Volo.Abp.AspNetCore.Components.Web.Theming.PageToolbars; |
|||
using BreadcrumbItem = Volo.Abp.BlazoriseUI.BreadcrumbItem; |
|||
|
|||
namespace Payment.Admin.Pages.Payment.Requests |
|||
{ |
|||
public partial class Index |
|||
{ |
|||
[Inject] protected IPaymentRequestAdminAppService PaymentRequestAdminAppService { get; set; } |
|||
|
|||
protected PageToolbar Toolbar { get; } = new(); |
|||
|
|||
protected TableColumnDictionary TableColumns { get; } = new(); |
|||
|
|||
protected List<TableColumn> PaymentRequestTableColumns => TableColumns.Get<Index>(); |
|||
|
|||
protected List<BreadcrumbItem> BreadcrumbItems { get; } = new(); |
|||
|
|||
protected IReadOnlyList<PaymentRequestWithDetailsDto> Entities = Array.Empty<PaymentRequestWithDetailsDto>(); |
|||
|
|||
protected virtual int PageSize { get; } = LimitedResultRequestDto.DefaultMaxResultCount; |
|||
|
|||
protected int CurrentPage { get; set; } = 1; |
|||
|
|||
protected string CurrentSorting { get; set; } |
|||
|
|||
protected int? TotalCount { get; set; } |
|||
|
|||
protected PaymentRequestGetListInput GetListInput { get; } = new(); |
|||
|
|||
protected override async Task OnInitializedAsync() |
|||
{ |
|||
await SetBreadCrumbsAsync(); |
|||
await SetTableColumnsAsync(); |
|||
await InvokeAsync(StateHasChanged); |
|||
} |
|||
|
|||
private ValueTask SetBreadCrumbsAsync() |
|||
{ |
|||
BreadcrumbItems.Add(new BreadcrumbItem(L["Menu:PaymentManagement"])); |
|||
BreadcrumbItems.Add(new BreadcrumbItem(L["Menu:PaymentRequests"])); |
|||
return ValueTask.CompletedTask; |
|||
} |
|||
|
|||
protected virtual ValueTask SetTableColumnsAsync() |
|||
{ |
|||
PaymentRequestTableColumns |
|||
.AddRange(new TableColumn[] |
|||
{ |
|||
new TableColumn |
|||
{ |
|||
Title = L["DisplayName:CreationTime"], |
|||
Data = nameof(PaymentRequestWithDetailsDto.CreationTime) |
|||
}, |
|||
new TableColumn |
|||
{ |
|||
Title = L["DisplayName:Price"], |
|||
Data = nameof(PaymentRequestWithDetailsDto.Price) |
|||
}, |
|||
new TableColumn |
|||
{ |
|||
Title = L["DisplayName:Currency"], |
|||
Data = nameof(PaymentRequestWithDetailsDto.Currency) |
|||
}, |
|||
new TableColumn |
|||
{ |
|||
Title = L["DisplayName:State"], |
|||
Data = nameof(PaymentRequestWithDetailsDto.State) |
|||
}, |
|||
new TableColumn |
|||
{ |
|||
Title = L["DisplayName:ProductName"], |
|||
Data = nameof(PaymentRequestWithDetailsDto.ProductName) |
|||
}, |
|||
new TableColumn |
|||
{ |
|||
Title = L["DisplayName:FailReason"], |
|||
Data = nameof(PaymentRequestWithDetailsDto.FailReason) |
|||
} |
|||
}); |
|||
|
|||
return ValueTask.CompletedTask; |
|||
} |
|||
|
|||
protected virtual async Task GetEntitiesAsync() |
|||
{ |
|||
try |
|||
{ |
|||
GetListInput.Sorting = CurrentSorting; |
|||
GetListInput.SkipCount = (CurrentPage - 1) * PageSize; |
|||
GetListInput.MaxResultCount = PageSize; |
|||
|
|||
var result = await PaymentRequestAdminAppService.GetListAsync(GetListInput); |
|||
Entities = result.Items.As<IReadOnlyList<PaymentRequestWithDetailsDto>>(); |
|||
TotalCount = (int?) result.TotalCount; |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
await HandleErrorAsync(ex); |
|||
} |
|||
} |
|||
|
|||
protected virtual async Task OnDataGridReadAsync(DataGridReadDataEventArgs<PaymentRequestWithDetailsDto> e) |
|||
{ |
|||
CurrentSorting = e.Columns |
|||
.Where(c => c.SortDirection != SortDirection.None) |
|||
.Select(c => c.Field + (c.SortDirection == SortDirection.Descending ? " DESC" : "")) |
|||
.JoinAsString(","); |
|||
|
|||
CurrentPage = e.Page; |
|||
|
|||
await GetEntitiesAsync(); |
|||
await InvokeAsync(StateHasChanged); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,14 @@ |
|||
using Payment.Localization; |
|||
using Volo.Abp.AspNetCore.Components; |
|||
|
|||
namespace Payment.Admin |
|||
{ |
|||
public abstract class PaymentAdminComponentBase : AbpComponentBase |
|||
{ |
|||
protected PaymentAdminComponentBase() |
|||
{ |
|||
LocalizationResource = typeof(PaymentResource); |
|||
ObjectMapperContext = typeof(PaymentAdminBlazorModule); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,6 @@ |
|||
@using Microsoft.AspNetCore.Components.Web |
|||
@using Volo.Abp.AspNetCore.Components.Web |
|||
@using Volo.Abp.BlazoriseUI |
|||
@using Volo.Abp.BlazoriseUI.Components |
|||
@using Blazorise |
|||
@using Blazorise.DataGrid |
|||
@ -0,0 +1,26 @@ |
|||
// This file is automatically generated by ABP framework to use MVC Controllers from CSharp
|
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Application.Dtos; |
|||
using Volo.Abp.Http.Client; |
|||
using Volo.Abp.Http.Modeling; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Http.Client.ClientProxying; |
|||
using Payment.Admin.Payments; |
|||
|
|||
// ReSharper disable once CheckNamespace
|
|||
namespace Payment.Admin.Payments.ClientProxies |
|||
{ |
|||
[Dependency(ReplaceServices = true)] |
|||
[ExposeServices(typeof(IPaymentRequestAdminAppService), typeof(PaymentRequestAdminClientProxy))] |
|||
public partial class PaymentRequestAdminClientProxy : ClientProxyBase<IPaymentRequestAdminAppService>, IPaymentRequestAdminAppService |
|||
{ |
|||
public virtual async Task<PagedResultDto<PaymentRequestWithDetailsDto>> GetListAsync(PaymentRequestGetListInput input) |
|||
{ |
|||
return await RequestAsync<PagedResultDto<PaymentRequestWithDetailsDto>>(nameof(GetListAsync), new ClientProxyRequestTypeValue |
|||
{ |
|||
{ typeof(PaymentRequestGetListInput), input } |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,8 @@ |
|||
// This file is part of PaymentRequestAdminClientProxy, you can customize it here
|
|||
// ReSharper disable once CheckNamespace
|
|||
namespace Payment.Admin.Payments.ClientProxies |
|||
{ |
|||
public partial class PaymentRequestAdminClientProxy |
|||
{ |
|||
} |
|||
} |
|||
@ -0,0 +1,132 @@ |
|||
{ |
|||
"modules": { |
|||
"paymentAdmin": { |
|||
"rootPath": "paymentAdmin", |
|||
"remoteServiceName": "PaymentAdmin", |
|||
"controllers": { |
|||
"Payment.Admin.Payments.PaymentRequestAdminController": { |
|||
"controllerName": "PaymentRequestAdmin", |
|||
"controllerGroupName": "PaymentRequestAdmin", |
|||
"type": "Payment.Admin.Payments.PaymentRequestAdminController", |
|||
"interfaces": [ |
|||
{ |
|||
"type": "Payment.Admin.Payments.IPaymentRequestAdminAppService" |
|||
} |
|||
], |
|||
"actions": { |
|||
"GetListAsyncByInput": { |
|||
"uniqueName": "GetListAsyncByInput", |
|||
"name": "GetListAsync", |
|||
"httpMethod": "GET", |
|||
"url": "api/payment/requests", |
|||
"supportedVersions": [], |
|||
"parametersOnMethod": [ |
|||
{ |
|||
"name": "input", |
|||
"typeAsString": "Payment.Admin.Payments.PaymentRequestGetListInput, Payment.Admin.Application.Contracts", |
|||
"type": "Payment.Admin.Payments.PaymentRequestGetListInput", |
|||
"typeSimple": "Payment.Admin.Payments.PaymentRequestGetListInput", |
|||
"isOptional": false, |
|||
"defaultValue": null |
|||
} |
|||
], |
|||
"parameters": [ |
|||
{ |
|||
"nameOnMethod": "input", |
|||
"name": "Filter", |
|||
"jsonName": null, |
|||
"type": "System.String", |
|||
"typeSimple": "string", |
|||
"isOptional": false, |
|||
"defaultValue": null, |
|||
"constraintTypes": null, |
|||
"bindingSourceId": "ModelBinding", |
|||
"descriptorName": "input" |
|||
}, |
|||
{ |
|||
"nameOnMethod": "input", |
|||
"name": "CreationDateMax", |
|||
"jsonName": null, |
|||
"type": "System.DateTime?", |
|||
"typeSimple": "string?", |
|||
"isOptional": false, |
|||
"defaultValue": null, |
|||
"constraintTypes": null, |
|||
"bindingSourceId": "ModelBinding", |
|||
"descriptorName": "input" |
|||
}, |
|||
{ |
|||
"nameOnMethod": "input", |
|||
"name": "CreationDateMin", |
|||
"jsonName": null, |
|||
"type": "System.DateTime?", |
|||
"typeSimple": "string?", |
|||
"isOptional": false, |
|||
"defaultValue": null, |
|||
"constraintTypes": null, |
|||
"bindingSourceId": "ModelBinding", |
|||
"descriptorName": "input" |
|||
}, |
|||
{ |
|||
"nameOnMethod": "input", |
|||
"name": "Status", |
|||
"jsonName": null, |
|||
"type": "Payment.PaymentRequests.PaymentRequestState?", |
|||
"typeSimple": "Payment.PaymentRequests.PaymentRequestState?", |
|||
"isOptional": false, |
|||
"defaultValue": null, |
|||
"constraintTypes": null, |
|||
"bindingSourceId": "ModelBinding", |
|||
"descriptorName": "input" |
|||
}, |
|||
{ |
|||
"nameOnMethod": "input", |
|||
"name": "Sorting", |
|||
"jsonName": null, |
|||
"type": "System.String", |
|||
"typeSimple": "string", |
|||
"isOptional": false, |
|||
"defaultValue": null, |
|||
"constraintTypes": null, |
|||
"bindingSourceId": "ModelBinding", |
|||
"descriptorName": "input" |
|||
}, |
|||
{ |
|||
"nameOnMethod": "input", |
|||
"name": "SkipCount", |
|||
"jsonName": null, |
|||
"type": "System.Int32", |
|||
"typeSimple": "number", |
|||
"isOptional": false, |
|||
"defaultValue": null, |
|||
"constraintTypes": null, |
|||
"bindingSourceId": "ModelBinding", |
|||
"descriptorName": "input" |
|||
}, |
|||
{ |
|||
"nameOnMethod": "input", |
|||
"name": "MaxResultCount", |
|||
"jsonName": null, |
|||
"type": "System.Int32", |
|||
"typeSimple": "number", |
|||
"isOptional": false, |
|||
"defaultValue": null, |
|||
"constraintTypes": null, |
|||
"bindingSourceId": "ModelBinding", |
|||
"descriptorName": "input" |
|||
} |
|||
], |
|||
"returnValue": { |
|||
"type": "Volo.Abp.Application.Dtos.PagedResultDto<Payment.Admin.Payments.PaymentRequestWithDetailsDto>", |
|||
"typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto<Payment.Admin.Payments.PaymentRequestWithDetailsDto>" |
|||
}, |
|||
"allowAnonymous": null, |
|||
"implementFrom": "Payment.Admin.Payments.IPaymentRequestAdminAppService" |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
"types": {} |
|||
} |
|||
@ -0,0 +1,13 @@ |
|||
using Payment.Localization; |
|||
using Volo.Abp.AspNetCore.Mvc; |
|||
|
|||
namespace Payment.Admin |
|||
{ |
|||
public abstract class PaymentAdminController : AbpControllerBase |
|||
{ |
|||
protected PaymentAdminController() |
|||
{ |
|||
LocalizationResource = typeof(PaymentResource); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
using System.Threading.Tasks; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using Volo.Abp; |
|||
using Volo.Abp.Application.Dtos; |
|||
|
|||
namespace Payment.Admin.Payments |
|||
{ |
|||
[RemoteService(Name = PaymentAdminRemoteServiceConsts.RemoteServiceName)] |
|||
[Area("paymentAdmin")] |
|||
[Route("api/payment/requests")] |
|||
public class PaymentRequestAdminController : PaymentAdminController, IPaymentRequestAdminAppService |
|||
{ |
|||
protected IPaymentRequestAdminAppService PaymentRequestAdminAppService { get; } |
|||
|
|||
public PaymentRequestAdminController(IPaymentRequestAdminAppService paymentRequestAdminAppService) |
|||
{ |
|||
PaymentRequestAdminAppService = paymentRequestAdminAppService; |
|||
} |
|||
|
|||
[HttpGet] |
|||
public Task<PagedResultDto<PaymentRequestWithDetailsDto>> GetListAsync(PaymentRequestGetListInput input) |
|||
{ |
|||
return PaymentRequestAdminAppService.GetListAsync(input); |
|||
} |
|||
} |
|||
} |
|||
@ -1,10 +1,30 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Domain.Repositories; |
|||
|
|||
namespace Payment.PaymentRequests |
|||
{ |
|||
public interface IPaymentRequestRepository : IRepository<PaymentRequest, Guid> |
|||
{ |
|||
|
|||
Task<List<PaymentRequest>> GetListAsync( |
|||
int skipCount, |
|||
int maxResultCount, |
|||
string sorting, |
|||
string filter, |
|||
DateTime? creationDateMax = null, |
|||
DateTime? creationDateMin = null, |
|||
PaymentRequestState? state = null, |
|||
CancellationToken cancellationToken = default |
|||
); |
|||
|
|||
Task<int> GetCountAsync( |
|||
string filter, |
|||
DateTime? creationDateMax = null, |
|||
DateTime? creationDateMin = null, |
|||
PaymentRequestState? state = null, |
|||
CancellationToken cancellationToken = default |
|||
); |
|||
} |
|||
} |
|||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in new issue