mirror of https://github.com/abpframework/abp.git
10 changed files with 325 additions and 2 deletions
@ -0,0 +1,25 @@ |
|||||
|
using Microsoft.AspNetCore.Mvc.Localization; |
||||
|
using Microsoft.AspNetCore.Mvc.Razor.Internal; |
||||
|
using ProductManagement.Localization; |
||||
|
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; |
||||
|
|
||||
|
namespace ProductManagement.Pages.ProductManagement |
||||
|
{ |
||||
|
public abstract class ProductManagementPage : AbpPage |
||||
|
{ |
||||
|
[RazorInject] |
||||
|
public IHtmlLocalizer<ProductManagementResource> L { get; set; } |
||||
|
|
||||
|
public const string DefaultTitle = "ProductManagement"; |
||||
|
|
||||
|
public string GetTitle(string title = null) |
||||
|
{ |
||||
|
if (string.IsNullOrWhiteSpace(title)) |
||||
|
{ |
||||
|
return DefaultTitle; |
||||
|
} |
||||
|
|
||||
|
return title; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
@page |
||||
|
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal |
||||
|
@inherits ProductManagement.Pages.ProductManagement.ProductManagementPage |
||||
|
@model ProductManagement.Pages.ProductManagement.Products.CreateModel |
||||
|
@{ |
||||
|
Layout = null; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
<abp-dynamic-form submit-button="false" abp-model="Product" asp-page="/ProductManagement/Products/Create"> |
||||
|
<abp-modal size="@(AbpModalSize.Large)"> |
||||
|
<abp-modal-header title="@L["Create"].Value"></abp-modal-header> |
||||
|
<abp-modal-body> |
||||
|
<abp-form-content /> |
||||
|
</abp-modal-body> |
||||
|
<abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"> |
||||
|
</abp-modal-footer> |
||||
|
</abp-modal> |
||||
|
</abp-dynamic-form> |
||||
@ -0,0 +1,49 @@ |
|||||
|
using System.ComponentModel.DataAnnotations; |
||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; |
||||
|
|
||||
|
namespace ProductManagement.Pages.ProductManagement.Products |
||||
|
{ |
||||
|
public class CreateModel : AbpPageModel |
||||
|
{ |
||||
|
private readonly IProductAppService _productAppService; |
||||
|
|
||||
|
[BindProperty] |
||||
|
public ProductCreateModalView Product { get; set; } = new ProductCreateModalView(); |
||||
|
|
||||
|
public CreateModel(IProductAppService productAppService) |
||||
|
{ |
||||
|
_productAppService = productAppService; |
||||
|
} |
||||
|
|
||||
|
public void OnGet() |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
public async Task<IActionResult> OnPostAsync() |
||||
|
{ |
||||
|
var createProductDto = ObjectMapper.Map<ProductCreateModalView, CreateProductDto>(Product); |
||||
|
|
||||
|
await _productAppService.CreateAsync(createProductDto); |
||||
|
|
||||
|
return NoContent(); |
||||
|
} |
||||
|
|
||||
|
public class ProductCreateModalView |
||||
|
{ |
||||
|
[Required] |
||||
|
[StringLength(ProductConsts.MaxCodeLength)] |
||||
|
public string Code { get; set; } |
||||
|
|
||||
|
[Required] |
||||
|
[StringLength(ProductConsts.MaxNameLength)] |
||||
|
public string Name { get; set; } |
||||
|
|
||||
|
public float Price { get; set; } |
||||
|
|
||||
|
public int StockCount { get; set; } |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
@page |
||||
|
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal |
||||
|
@inherits ProductManagement.Pages.ProductManagement.ProductManagementPage |
||||
|
@model ProductManagement.Pages.ProductManagement.Products.EditModel |
||||
|
@{ |
||||
|
Layout = null; |
||||
|
} |
||||
|
|
||||
|
<abp-dynamic-form submit-button="false" abp-model="Product" asp-page="/ProductManagement/Products/Edit"> |
||||
|
<abp-modal size="@(AbpModalSize.Large)"> |
||||
|
<abp-modal-header title="@L["Edit"].Value"></abp-modal-header> |
||||
|
<abp-modal-body> |
||||
|
<abp-form-content /> |
||||
|
</abp-modal-body> |
||||
|
<abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"> |
||||
|
</abp-modal-footer> |
||||
|
</abp-modal> |
||||
|
</abp-dynamic-form> |
||||
@ -0,0 +1,67 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.ComponentModel.DataAnnotations; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Microsoft.AspNetCore.Mvc.RazorPages; |
||||
|
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; |
||||
|
|
||||
|
namespace ProductManagement.Pages.ProductManagement.Products |
||||
|
{ |
||||
|
public class EditModel : AbpPageModel |
||||
|
{ |
||||
|
private readonly IProductAppService _productAppService; |
||||
|
|
||||
|
[BindProperty] |
||||
|
public ProductEditModalView Product { get; set; } = new ProductEditModalView(); |
||||
|
|
||||
|
public EditModel(IProductAppService productAppService) |
||||
|
{ |
||||
|
_productAppService = productAppService; |
||||
|
} |
||||
|
|
||||
|
public void OnGet() |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
public async Task<ActionResult> OnGetAsync(Guid productId) |
||||
|
{ |
||||
|
var productDto = await _productAppService.GetAsync(productId); |
||||
|
|
||||
|
Product = ObjectMapper.Map<ProductDto, ProductEditModalView>(productDto); |
||||
|
|
||||
|
return Page(); |
||||
|
} |
||||
|
|
||||
|
public async Task OnPostAsync() |
||||
|
{ |
||||
|
await _productAppService.UpdateAsync(Product.Id, new UpdateProductDto() |
||||
|
{ |
||||
|
Code = Product.Code, |
||||
|
Name = Product.Name, |
||||
|
Price = Product.Price, |
||||
|
StockCount = Product.StockCount |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
public class ProductEditModalView |
||||
|
{ |
||||
|
[HiddenInput] |
||||
|
[Required] |
||||
|
public Guid Id { get; set; } |
||||
|
|
||||
|
[Required] |
||||
|
[StringLength(ProductConsts.MaxCodeLength)] |
||||
|
public string Code { get; set; } |
||||
|
|
||||
|
[Required] |
||||
|
[StringLength(ProductConsts.MaxNameLength)] |
||||
|
public string Name { get; set; } |
||||
|
|
||||
|
public float Price { get; set; } |
||||
|
|
||||
|
public int StockCount { get; set; } |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,42 @@ |
|||||
|
@page |
||||
|
@using Microsoft.AspNetCore.Authorization |
||||
|
@using ProductManagement |
||||
|
@inherits ProductManagement.Pages.ProductManagement.ProductManagementPage |
||||
|
@model ProductManagement.Pages.ProductManagement.Products.IndexModel |
||||
|
@inject IAuthorizationService Authorization |
||||
|
@{ |
||||
|
ViewBag.PageTitle = "Products"; |
||||
|
} |
||||
|
|
||||
|
@section scripts { |
||||
|
<abp-script src="/Pages/ProductManagement/Products/index.js" /> |
||||
|
} |
||||
|
|
||||
|
<abp-card> |
||||
|
<abp-card-header> |
||||
|
<abp-row> |
||||
|
<abp-column size-md="_6"> |
||||
|
<h2>@L["Products"]</h2> |
||||
|
</abp-column> |
||||
|
<abp-column size-md="_6" class="text-right"> |
||||
|
@if (await Authorization.IsGrantedAsync(ProductManagementPermissions.Products.Create)) |
||||
|
{ |
||||
|
<abp-button icon="plus" text="@L["CreateANewProduct"].Value" button-type="Primary" id="CreateNewProductButtonId"></abp-button> |
||||
|
} |
||||
|
</abp-column> |
||||
|
</abp-row> |
||||
|
</abp-card-header> |
||||
|
<abp-card-body> |
||||
|
<abp-table striped-rows="true" id="ProductsTable" class="nowrap"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th>@L["Actions"]</th> |
||||
|
<th>@L["Code"]</th> |
||||
|
<th>@L["Name"]</th> |
||||
|
<th>@L["Price"]</th> |
||||
|
<th>@L["StockCount"]</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
</abp-table> |
||||
|
</abp-card-body> |
||||
|
</abp-card> |
||||
@ -0,0 +1,12 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; |
||||
|
|
||||
|
namespace ProductManagement.Pages.ProductManagement.Products |
||||
|
{ |
||||
|
public class IndexModel : AbpPageModel |
||||
|
{ |
||||
|
public async Task OnGetAsync() |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,81 @@ |
|||||
|
$(function () { |
||||
|
|
||||
|
var l = abp.localization.getResource('ProductManagement'); |
||||
|
var _createModal = new abp.ModalManager(abp.appPath + 'ProductManagement/Products/Create'); |
||||
|
var _editModal = new abp.ModalManager(abp.appPath + 'ProductManagement/Products/Edit'); |
||||
|
|
||||
|
var _dataTable = $('#ProductsTable').DataTable(abp.libs.datatables.normalizeConfiguration({ |
||||
|
processing: true, |
||||
|
serverSide: true, |
||||
|
paging: true, |
||||
|
searching: false, |
||||
|
autoWidth: false, |
||||
|
scrollCollapse: true, |
||||
|
order: [[1, "desc"]], |
||||
|
ajax: abp.libs.datatables.createAjax(productManagement.products.getListPaged), |
||||
|
columnDefs: [ |
||||
|
{ |
||||
|
rowAction: { |
||||
|
items: |
||||
|
[ |
||||
|
{ |
||||
|
text: l('Edit'), |
||||
|
visible: function () { |
||||
|
return true; //TODO: Check permission
|
||||
|
}, |
||||
|
action: function (data) { |
||||
|
_editModal.open({ |
||||
|
productId: data.record.id |
||||
|
}); |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
text: l('Delete'), |
||||
|
visible: function () { |
||||
|
return true; //TODO: Check permission
|
||||
|
}, |
||||
|
confirmMessage: function (data) { return l('ProductDeletionWarningMessage'); }, |
||||
|
action: function (data) { |
||||
|
productManagement.products |
||||
|
.delete(data.record.id) |
||||
|
.then(function () { |
||||
|
_dataTable.ajax.reload(); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
target: 1, |
||||
|
data: "code" |
||||
|
}, |
||||
|
{ |
||||
|
target: 2, |
||||
|
data: "name" |
||||
|
}, |
||||
|
{ |
||||
|
target: 3, |
||||
|
data: "price" |
||||
|
}, |
||||
|
{ |
||||
|
target: 4, |
||||
|
data: "stockCount" |
||||
|
} |
||||
|
] |
||||
|
})); |
||||
|
|
||||
|
|
||||
|
$("#CreateNewProductButtonId").click(function () { |
||||
|
_createModal.open(); |
||||
|
}); |
||||
|
|
||||
|
_createModal.onClose(function () { |
||||
|
_dataTable.ajax.reload(); |
||||
|
}); |
||||
|
|
||||
|
_editModal.onResult(function () { |
||||
|
_dataTable.ajax.reload(); |
||||
|
}); |
||||
|
|
||||
|
}); |
||||
Loading…
Reference in new issue