using Microsoft.AspNetCore.Mvc; using Nop.Core.Domain.Common; using Nop.Services.Attributes; using Nop.Services.Localization; using Nop.Services.Logging; using Nop.Services.Messages; using Nop.Services.Security; using Nop.Web.Areas.Admin.Factories; using Nop.Web.Areas.Admin.Infrastructure.Mapper.Extensions; using Nop.Web.Areas.Admin.Models.Common; using Nop.Web.Framework.Mvc; using Nop.Web.Framework.Mvc.Filters; namespace Nop.Web.Areas.Admin.Controllers; public partial class AddressAttributeController : BaseAdminController { #region Fields protected readonly IAddressAttributeModelFactory _addressAttributeModelFactory; protected readonly IAttributeService _addressAttributeService; protected readonly ICustomerActivityService _customerActivityService; protected readonly ILocalizedEntityService _localizedEntityService; protected readonly ILocalizationService _localizationService; protected readonly INotificationService _notificationService; protected readonly IPermissionService _permissionService; #endregion #region Ctor public AddressAttributeController(IAddressAttributeModelFactory addressAttributeModelFactory, IAttributeService addressAttributeService, ICustomerActivityService customerActivityService, ILocalizedEntityService localizedEntityService, ILocalizationService localizationService, INotificationService notificationService, IPermissionService permissionService) { _addressAttributeModelFactory = addressAttributeModelFactory; _addressAttributeService = addressAttributeService; _customerActivityService = customerActivityService; _localizedEntityService = localizedEntityService; _localizationService = localizationService; _notificationService = notificationService; _permissionService = permissionService; } #endregion #region Utilities protected virtual async Task UpdateAttributeLocalesAsync(AddressAttribute addressAttribute, AddressAttributeModel model) { foreach (var localized in model.Locales) { await _localizedEntityService.SaveLocalizedValueAsync(addressAttribute, x => x.Name, localized.Name, localized.LanguageId); } } protected virtual async Task UpdateValueLocalesAsync(AddressAttributeValue addressAttributeValue, AddressAttributeValueModel model) { foreach (var localized in model.Locales) { await _localizedEntityService.SaveLocalizedValueAsync(addressAttributeValue, x => x.Name, localized.Name, localized.LanguageId); } } #endregion #region Address attributes public virtual IActionResult Index() { return RedirectToAction("List"); } public virtual IActionResult ListBlock() { return PartialView("ListBlock"); } [CheckPermission(StandardPermission.Configuration.MANAGE_SETTINGS)] public virtual IActionResult List() { //select an appropriate card SaveSelectedCardName("customersettings-addressformfields"); //we just redirect a user to the address settings page return RedirectToAction("CustomerUser", "Setting"); } [HttpPost] [CheckPermission(StandardPermission.Configuration.MANAGE_SETTINGS)] public virtual async Task List(AddressAttributeSearchModel searchModel) { //prepare model var model = await _addressAttributeModelFactory.PrepareAddressAttributeListModelAsync(searchModel); return Json(model); } [CheckPermission(StandardPermission.Configuration.MANAGE_SETTINGS)] public virtual async Task Create() { //prepare model var model = await _addressAttributeModelFactory.PrepareAddressAttributeModelAsync(new AddressAttributeModel(), null); return View(model); } [HttpPost, ParameterBasedOnFormName("save-continue", "continueEditing")] [CheckPermission(StandardPermission.Configuration.MANAGE_SETTINGS)] public virtual async Task Create(AddressAttributeModel model, bool continueEditing) { if (ModelState.IsValid) { var addressAttribute = model.ToEntity(); await _addressAttributeService.InsertAttributeAsync(addressAttribute); //activity log await _customerActivityService.InsertActivityAsync("AddNewAddressAttribute", string.Format(await _localizationService.GetResourceAsync("ActivityLog.AddNewAddressAttribute"), addressAttribute.Id), addressAttribute); //locales await UpdateAttributeLocalesAsync(addressAttribute, model); _notificationService.SuccessNotification(await _localizationService.GetResourceAsync("Admin.Address.AddressAttributes.Added")); if (!continueEditing) return RedirectToAction("List"); return RedirectToAction("Edit", new { id = addressAttribute.Id }); } //prepare model model = await _addressAttributeModelFactory.PrepareAddressAttributeModelAsync(model, null, true); //if we got this far, something failed, redisplay form return View(model); } [CheckPermission(StandardPermission.Configuration.MANAGE_SETTINGS)] public virtual async Task Edit(int id) { //try to get an address attribute with the specified id var addressAttribute = await _addressAttributeService.GetAttributeByIdAsync(id); if (addressAttribute == null) return RedirectToAction("List"); //prepare model var model = await _addressAttributeModelFactory.PrepareAddressAttributeModelAsync(null, addressAttribute); return View(model); } [HttpPost, ParameterBasedOnFormName("save-continue", "continueEditing")] [CheckPermission(StandardPermission.Configuration.MANAGE_SETTINGS)] public virtual async Task Edit(AddressAttributeModel model, bool continueEditing) { //try to get an address attribute with the specified id var addressAttribute = await _addressAttributeService.GetAttributeByIdAsync(model.Id); if (addressAttribute == null) return RedirectToAction("List"); if (ModelState.IsValid) { addressAttribute = model.ToEntity(addressAttribute); await _addressAttributeService.UpdateAttributeAsync(addressAttribute); //activity log await _customerActivityService.InsertActivityAsync("EditAddressAttribute", string.Format(await _localizationService.GetResourceAsync("ActivityLog.EditAddressAttribute"), addressAttribute.Id), addressAttribute); //locales await UpdateAttributeLocalesAsync(addressAttribute, model); _notificationService.SuccessNotification(await _localizationService.GetResourceAsync("Admin.Address.AddressAttributes.Updated")); if (!continueEditing) return RedirectToAction("List"); return RedirectToAction("Edit", new { id = addressAttribute.Id }); } //prepare model model = await _addressAttributeModelFactory.PrepareAddressAttributeModelAsync(model, addressAttribute, true); //if we got this far, something failed, redisplay form return View(model); } [HttpPost] [CheckPermission(StandardPermission.Configuration.MANAGE_SETTINGS)] public virtual async Task Delete(int id) { //try to get an address attribute with the specified id var addressAttribute = await _addressAttributeService.GetAttributeByIdAsync(id); if (addressAttribute == null) return RedirectToAction("List"); await _addressAttributeService.DeleteAttributeAsync(addressAttribute); //activity log await _customerActivityService.InsertActivityAsync("DeleteAddressAttribute", string.Format(await _localizationService.GetResourceAsync("ActivityLog.DeleteAddressAttribute"), addressAttribute.Id), addressAttribute); _notificationService.SuccessNotification(await _localizationService.GetResourceAsync("Admin.Address.AddressAttributes.Deleted")); return RedirectToAction("List"); } #endregion #region Address attribute values [HttpPost] [CheckPermission(StandardPermission.Configuration.MANAGE_SETTINGS)] public virtual async Task ValueList(AddressAttributeValueSearchModel searchModel) { //try to get an address attribute with the specified id var addressAttribute = await _addressAttributeService.GetAttributeByIdAsync(searchModel.AddressAttributeId) ?? throw new ArgumentException("No address attribute found with the specified id"); //prepare model var model = await _addressAttributeModelFactory.PrepareAddressAttributeValueListModelAsync(searchModel, addressAttribute); return Json(model); } [CheckPermission(StandardPermission.Configuration.MANAGE_SETTINGS)] public virtual async Task ValueCreatePopup(int addressAttributeId) { //try to get an address attribute with the specified id var addressAttribute = await _addressAttributeService.GetAttributeByIdAsync(addressAttributeId); if (addressAttribute == null) return RedirectToAction("List"); //prepare model var model = await _addressAttributeModelFactory .PrepareAddressAttributeValueModelAsync(new AddressAttributeValueModel(), addressAttribute, null); return View(model); } [HttpPost] [CheckPermission(StandardPermission.Configuration.MANAGE_SETTINGS)] public virtual async Task ValueCreatePopup(AddressAttributeValueModel model) { //try to get an address attribute with the specified id var addressAttribute = await _addressAttributeService.GetAttributeByIdAsync(model.AttributeId); if (addressAttribute == null) return RedirectToAction("List"); if (ModelState.IsValid) { var addressAttributeValue = model.ToEntity(); await _addressAttributeService.InsertAttributeValueAsync(addressAttributeValue); //activity log await _customerActivityService.InsertActivityAsync("AddNewAddressAttributeValue", string.Format(await _localizationService.GetResourceAsync("ActivityLog.AddNewAddressAttributeValue"), addressAttributeValue.Id), addressAttributeValue); await UpdateValueLocalesAsync(addressAttributeValue, model); ViewBag.RefreshPage = true; return View(model); } //prepare model model = await _addressAttributeModelFactory.PrepareAddressAttributeValueModelAsync(model, addressAttribute, null, true); //if we got this far, something failed, redisplay form return View(model); } [CheckPermission(StandardPermission.Configuration.MANAGE_SETTINGS)] public virtual async Task ValueEditPopup(int id) { //try to get an address attribute value with the specified id var addressAttributeValue = await _addressAttributeService.GetAttributeValueByIdAsync(id); if (addressAttributeValue == null) return RedirectToAction("List"); //try to get an address attribute with the specified id var addressAttribute = await _addressAttributeService.GetAttributeByIdAsync(addressAttributeValue.AttributeId); if (addressAttribute == null) return RedirectToAction("List"); //prepare model var model = await _addressAttributeModelFactory.PrepareAddressAttributeValueModelAsync(null, addressAttribute, addressAttributeValue); return View(model); } [HttpPost] [CheckPermission(StandardPermission.Configuration.MANAGE_SETTINGS)] public virtual async Task ValueEditPopup(AddressAttributeValueModel model) { //try to get an address attribute value with the specified id var addressAttributeValue = await _addressAttributeService.GetAttributeValueByIdAsync(model.Id); if (addressAttributeValue == null) return RedirectToAction("List"); //try to get an address attribute with the specified id var addressAttribute = await _addressAttributeService.GetAttributeByIdAsync(addressAttributeValue.AttributeId); if (addressAttribute == null) return RedirectToAction("List"); if (ModelState.IsValid) { addressAttributeValue = model.ToEntity(addressAttributeValue); await _addressAttributeService.UpdateAttributeValueAsync(addressAttributeValue); await UpdateValueLocalesAsync(addressAttributeValue, model); //activity log await _customerActivityService.InsertActivityAsync("EditAddressAttributeValue", string.Format(await _localizationService.GetResourceAsync("ActivityLog.EditAddressAttributeValue"), addressAttributeValue.Id), addressAttributeValue); ViewBag.RefreshPage = true; return View(model); } //prepare model model = await _addressAttributeModelFactory.PrepareAddressAttributeValueModelAsync(model, addressAttribute, addressAttributeValue, true); //if we got this far, something failed, redisplay form return View(model); } [HttpPost] [CheckPermission(StandardPermission.Configuration.MANAGE_SETTINGS)] public virtual async Task ValueDelete(int id) { //try to get an address attribute value with the specified id var addressAttributeValue = await _addressAttributeService.GetAttributeValueByIdAsync(id) ?? throw new ArgumentException("No address attribute value found with the specified id", nameof(id)); await _addressAttributeService.DeleteAttributeValueAsync(addressAttributeValue); //activity log await _customerActivityService.InsertActivityAsync("DeleteAddressAttributeValue", string.Format(await _localizationService.GetResourceAsync("ActivityLog.DeleteAddressAttributeValue"), addressAttributeValue.Id), addressAttributeValue); return new NullJsonResult(); } #endregion }