Skip to content

Commit cc96afd

Browse files
committed
Product\ProductVariant testing... solved several issues
1 parent 0e45939 commit cc96afd

19 files changed

Lines changed: 274 additions & 197 deletions

src/Libraries/SmartStore.Data/Mapping/Catalog/ProductVariantAttributeCombinationMap.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,22 @@ public ProductVariantAttributeCombinationMap()
1010
this.ToTable("ProductVariantAttributeCombination");
1111
this.HasKey(pvac => pvac.Id);
1212

13-
this.Property(pv => pv.Sku).HasMaxLength(400);
14-
this.Property(pv => pv.ManufacturerPartNumber).HasMaxLength(400);
15-
this.Property(pv => pv.Gtin).HasMaxLength(400);
16-
this.Property(pv => pv.AssignedPictureIds).HasMaxLength(1000);
17-
this.Property(pv => pv.Length).HasPrecision(18, 4);
18-
this.Property(pv => pv.Width).HasPrecision(18, 4);
19-
this.Property(pv => pv.Height).HasPrecision(18, 4);
20-
this.Property(pv => pv.BasePriceAmount).HasPrecision(18, 4);
13+
this.Property(pvac => pvac.Sku).HasMaxLength(400);
14+
this.Property(pvac => pvac.ManufacturerPartNumber).HasMaxLength(400);
15+
this.Property(pvac => pvac.Gtin).HasMaxLength(400);
16+
this.Property(pvac => pvac.AssignedPictureIds).HasMaxLength(1000);
17+
this.Property(pvac => pvac.Length).HasPrecision(18, 4);
18+
this.Property(pvac => pvac.Width).HasPrecision(18, 4);
19+
this.Property(pvac => pvac.Height).HasPrecision(18, 4);
20+
this.Property(pvac => pvac.BasePriceAmount).HasPrecision(18, 4);
2121

2222
this.HasRequired(pvac => pvac.Product)
23-
.WithMany(pv => pv.ProductVariantAttributeCombinations)
23+
.WithMany(pvac => pvac.ProductVariantAttributeCombinations)
2424
.HasForeignKey(pvac => pvac.ProductId);
2525

26-
this.HasOptional(pv => pv.DeliveryTime)
26+
this.HasOptional(pvac => pvac.DeliveryTime)
2727
.WithMany()
28-
.HasForeignKey(pv => pv.DeliveryTimeId)
28+
.HasForeignKey(pvac => pvac.DeliveryTimeId)
2929
.WillCascadeOnDelete(false);
3030
}
3131
}

src/Libraries/SmartStore.Data/Mapping/Catalog/ProductVariantAttributeMap.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public ProductVariantAttributeMap()
1212
this.Ignore(pva => pva.AttributeControlType);
1313

1414
this.HasRequired(pva => pva.Product)
15-
.WithMany(pv => pv.ProductVariantAttributes)
15+
.WithMany(pva => pva.ProductVariantAttributes)
1616
.HasForeignKey(pva => pva.ProductId);
1717

1818
this.HasRequired(pva => pva.ProductAttribute)

src/Libraries/SmartStore.Data/Mapping/Catalog/TierPriceMap.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public TierPriceMap()
1212
this.Property(tp => tp.Price).HasPrecision(18, 4);
1313

1414
this.HasRequired(tp => tp.Product)
15-
.WithMany(pv => pv.TierPrices)
15+
.WithMany(p => p.TierPrices)
1616
.HasForeignKey(tp => tp.ProductId);
1717

1818
this.HasOptional(tp => tp.CustomerRole)

src/Libraries/SmartStore.Data/Mapping/Discounts/DiscountMap.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public DiscountMap()
2626
.Map(m => m.ToTable("Discount_AppliedToCategories"));
2727

2828
this.HasMany(dr => dr.AppliedToProducts)
29-
.WithMany(pv => pv.AppliedDiscounts)
29+
.WithMany(p => p.AppliedDiscounts)
3030
.Map(m => m.ToTable("Discount_AppliedToProducts"));
3131
}
3232
}

src/Presentation/SmartStore.Web/Administration/Controllers/ProductController.cs

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,13 +1143,16 @@ public ActionResult RelatedProductList(GridCommand command, int productId)
11431143
var relatedProductsModel = relatedProducts
11441144
.Select(x =>
11451145
{
1146+
var product2 = _productService.GetProductById(x.ProductId2);
1147+
11461148
return new ProductModel.RelatedProductModel()
11471149
{
11481150
Id = x.Id,
1149-
//ProductId1 = x.ProductId1,
11501151
ProductId2 = x.ProductId2,
1151-
Product2Name = _productService.GetProductById(x.ProductId2).Name,
1152-
DisplayOrder = x.DisplayOrder
1152+
Product2Name = product2.Name,
1153+
DisplayOrder = x.DisplayOrder,
1154+
Product2Sku = product2.Sku,
1155+
Product2Published = product2.Published
11531156
};
11541157
})
11551158
.ToList();
@@ -1228,6 +1231,11 @@ public ActionResult RelatedProductAddPopup(int productId)
12281231
foreach (var m in _manufacturerService.GetAllManufacturers(true))
12291232
model.AvailableManufacturers.Add(new SelectListItem() { Text = m.Name, Value = m.Id.ToString() });
12301233

1234+
//stores
1235+
model.AvailableStores.Add(new SelectListItem() { Text = _localizationService.GetResource("Admin.Common.All"), Value = "0" });
1236+
foreach (var s in _storeService.GetAllStores())
1237+
model.AvailableStores.Add(new SelectListItem() { Text = s.Name, Value = s.Id.ToString() });
1238+
12311239
//product types
12321240
model.AvailableProductTypes = ProductType.SimpleProduct.ToSelectList(false).ToList();
12331241
model.AvailableProductTypes.Insert(0, new SelectListItem() { Text = _localizationService.GetResource("Admin.Common.All"), Value = "0" });
@@ -1249,6 +1257,7 @@ public ActionResult RelatedProductAddPopupList(GridCommand command, ProductModel
12491257
ctx.CategoryIds.Add(model.SearchCategoryId);
12501258

12511259
ctx.ManufacturerId = model.SearchManufacturerId;
1260+
ctx.StoreId = model.SearchStoreId;
12521261
ctx.Keywords = model.SearchProductName;
12531262
ctx.LanguageId = _workContext.WorkingLanguage.Id;
12541263
ctx.OrderBy = ProductSortingEnum.Position;
@@ -1316,12 +1325,15 @@ public ActionResult CrossSellProductList(GridCommand command, int productId)
13161325
var crossSellProductsModel = crossSellProducts
13171326
.Select(x =>
13181327
{
1328+
var product2 = _productService.GetProductById(x.ProductId2);
1329+
13191330
return new ProductModel.CrossSellProductModel()
13201331
{
13211332
Id = x.Id,
1322-
//ProductId1 = x.ProductId1,
13231333
ProductId2 = x.ProductId2,
1324-
Product2Name = _productService.GetProductById(x.ProductId2).Name,
1334+
Product2Name = product2.Name,
1335+
Product2Sku = product2.Sku,
1336+
Product2Published = product2.Published
13251337
};
13261338
})
13271339
.ToList();
@@ -1384,6 +1396,11 @@ public ActionResult CrossSellProductAddPopup(int productId)
13841396
foreach (var m in _manufacturerService.GetAllManufacturers(true))
13851397
model.AvailableManufacturers.Add(new SelectListItem() { Text = m.Name, Value = m.Id.ToString() });
13861398

1399+
//stores
1400+
model.AvailableStores.Add(new SelectListItem() { Text = _localizationService.GetResource("Admin.Common.All"), Value = "0" });
1401+
foreach (var s in _storeService.GetAllStores())
1402+
model.AvailableStores.Add(new SelectListItem() { Text = s.Name, Value = s.Id.ToString() });
1403+
13871404
//product types
13881405
model.AvailableProductTypes = ProductType.SimpleProduct.ToSelectList(false).ToList();
13891406
model.AvailableProductTypes.Insert(0, new SelectListItem() { Text = _localizationService.GetResource("Admin.Common.All"), Value = "0" });
@@ -1404,6 +1421,7 @@ public ActionResult CrossSellProductAddPopupList(GridCommand command, ProductMod
14041421
if (model.SearchCategoryId > 0)
14051422
ctx.CategoryIds.Add(model.SearchCategoryId);
14061423
ctx.ManufacturerId = model.SearchManufacturerId;
1424+
ctx.StoreId = model.SearchStoreId;
14071425
ctx.Keywords = model.SearchProductName;
14081426
ctx.LanguageId = _workContext.WorkingLanguage.Id;
14091427
ctx.OrderBy = ProductSortingEnum.Position;
@@ -1481,7 +1499,9 @@ public ActionResult AssociatedProductList(GridCommand command, int productId)
14811499
{
14821500
Id = x.Id,
14831501
ProductName = x.Name,
1484-
DisplayOrder = x.DisplayOrder
1502+
DisplayOrder = x.DisplayOrder,
1503+
Sku = x.Sku,
1504+
Published = x.Published
14851505
};
14861506
})
14871507
.ToList();

src/Presentation/SmartStore.Web/Administration/Models/Catalog/ProductModel.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,12 @@ public class RelatedProductModel : EntityModelBase
441441

442442
[SmartResourceDisplayName("Admin.Catalog.Products.RelatedProducts.Fields.DisplayOrder")]
443443
public int DisplayOrder { get; set; }
444+
445+
[SmartResourceDisplayName("Admin.Catalog.Products.Fields.Sku")]
446+
public string Product2Sku { get; set; }
447+
448+
[SmartResourceDisplayName("Admin.Catalog.Products.Fields.Published")]
449+
public bool Product2Published { get; set; }
444450
}
445451

446452
public class AddRelatedProductModel : ModelBase
@@ -449,6 +455,7 @@ public AddRelatedProductModel()
449455
{
450456
AvailableCategories = new List<SelectListItem>();
451457
AvailableManufacturers = new List<SelectListItem>();
458+
AvailableStores = new List<SelectListItem>();
452459
AvailableProductTypes = new List<SelectListItem>();
453460
}
454461
public GridModel<ProductModel> Products { get; set; }
@@ -463,11 +470,15 @@ public AddRelatedProductModel()
463470
[SmartResourceDisplayName("Admin.Catalog.Products.List.SearchManufacturer")]
464471
public int SearchManufacturerId { get; set; }
465472

473+
[SmartResourceDisplayName("Admin.Catalog.Products.List.SearchStore")]
474+
public int SearchStoreId { get; set; }
475+
466476
[SmartResourceDisplayName("Admin.Catalog.Products.List.SearchProductType")]
467477
public int SearchProductTypeId { get; set; }
468478

469479
public IList<SelectListItem> AvailableCategories { get; set; }
470480
public IList<SelectListItem> AvailableManufacturers { get; set; }
481+
public IList<SelectListItem> AvailableStores { get; set; }
471482
public IList<SelectListItem> AvailableProductTypes { get; set; }
472483

473484
public int ProductId { get; set; }
@@ -482,6 +493,12 @@ public partial class AssociatedProductModel : EntityModelBase
482493

483494
[SmartResourceDisplayName("Admin.Catalog.Products.AssociatedProducts.Fields.DisplayOrder")]
484495
public int DisplayOrder { get; set; }
496+
497+
[SmartResourceDisplayName("Admin.Catalog.Products.Fields.Sku")]
498+
public string Sku { get; set; }
499+
500+
[SmartResourceDisplayName("Admin.Catalog.Products.Fields.Published")]
501+
public bool Published { get; set; }
485502
}
486503
public partial class AddAssociatedProductModel : ModelBase
487504
{
@@ -521,6 +538,12 @@ public class CrossSellProductModel : EntityModelBase
521538

522539
[SmartResourceDisplayName("Admin.Catalog.Products.CrossSells.Fields.Product")]
523540
public string Product2Name { get; set; }
541+
542+
[SmartResourceDisplayName("Admin.Catalog.Products.Fields.Sku")]
543+
public string Product2Sku { get; set; }
544+
545+
[SmartResourceDisplayName("Admin.Catalog.Products.Fields.Published")]
546+
public bool Product2Published { get; set; }
524547
}
525548

526549
public class AddCrossSellProductModel : ModelBase
@@ -529,6 +552,7 @@ public AddCrossSellProductModel()
529552
{
530553
AvailableCategories = new List<SelectListItem>();
531554
AvailableManufacturers = new List<SelectListItem>();
555+
AvailableStores = new List<SelectListItem>();
532556
AvailableProductTypes = new List<SelectListItem>();
533557
}
534558
public GridModel<ProductModel> Products { get; set; }
@@ -543,11 +567,15 @@ public AddCrossSellProductModel()
543567
[SmartResourceDisplayName("Admin.Catalog.Products.List.SearchManufacturer")]
544568
public int SearchManufacturerId { get; set; }
545569

570+
[SmartResourceDisplayName("Admin.Catalog.Products.List.SearchStore")]
571+
public int SearchStoreId { get; set; }
572+
546573
[SmartResourceDisplayName("Admin.Catalog.Products.List.SearchProductType")]
547574
public int SearchProductTypeId { get; set; }
548575

549576
public IList<SelectListItem> AvailableCategories { get; set; }
550577
public IList<SelectListItem> AvailableManufacturers { get; set; }
578+
public IList<SelectListItem> AvailableStores { get; set; }
551579
public IList<SelectListItem> AvailableProductTypes { get; set; }
552580

553581
public int ProductId { get; set; }

src/Presentation/SmartStore.Web/Administration/Views/Product/AssociatedProductAddPopup.cshtml

Lines changed: 11 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,6 @@
1616
<div class="title">
1717
@T("Admin.Catalog.Products.AssociatedProducts.AddNew")
1818
</div>
19-
<div class="options">
20-
<button type="submit" id="save" name="save" value="save" class="btn btn-primary">
21-
<i class="icon-ok"></i>
22-
@T("Admin.Common.Save")
23-
</button>
24-
</div>
2519
</div>
2620

2721
if (ViewBag.RefreshPage == true)
@@ -76,7 +70,7 @@
7670
</tr>
7771
<tr>
7872
<td colspan="2">
79-
<button type="submit" id="search-products" class="btn"><i class="icon-search"></i>&nbsp;@T("Admin.Common.Search")</button>
73+
<button type="submit" id="search-products" value="search-products" class="btn"><i class="icon-search"></i>&nbsp;@T("Admin.Common.Search")</button>
8074
</td>
8175
</tr>
8276
</table>
@@ -93,17 +87,10 @@
9387
columns.Bound(x => x.Id)
9488
.Template(x => string.Format("<input type='checkbox' name='SelectedProductIds' value='{0}' class='checkboxGroups'/>", x.Id))
9589
.ClientTemplate("<input type='checkbox' name='SelectedProductIds' value='<#= Id #>' class='checkboxGroups'/>")
96-
.Title("<input id='mastercheckbox' type='checkbox'/>")
9790
.Width(50)
98-
.HtmlAttributes(new { style = "text-align:center" })
99-
.HeaderHtmlAttributes(new { style = "text-align:center" });
100-
101-
columns.Bound(x => x.Name)
102-
.Template(x => Html.ActionLink(x.Name, "Edit", new { id = x.Id }))
103-
.ClientTemplate("<a href='Edit/<#= Id #>'><#= Name #></a>");
91+
.HtmlAttributes(new { style = "text-align:center" });
92+
columns.Bound(x => x.Name);
10493
columns.Bound(x => x.Sku);
105-
columns.Bound(x => x.Price);
106-
columns.Bound(x => x.StockQuantity);
10794
columns.Bound(x => x.Published)
10895
.Template(item => @Html.SymbolForBool(item.Published))
10996
.ClientTemplate(@Html.SymbolForBool("Published"))
@@ -112,24 +99,24 @@
11299
})
113100
.Pageable(settings => settings.PageSize(gridPageSize).Position(GridPagerPosition.Both))
114101
.DataBinding(dataBinding => dataBinding.Ajax().Select("AssociatedProductAddPopupList", "Product"))
115-
.ClientEvents(events => events.OnDataBinding("productsGrid_onDataBinding").OnDataBound("productsGrid_onDataBound"))
102+
.ClientEvents(events => events.OnDataBinding("associatedProducts_onDataBinding"))
116103
.EnableCustomBinding(true))
117104
</td>
118105
</tr>
106+
<tr>
107+
<td colspan="2">
108+
<p></p>
109+
<button type="submit" name="save" value="save" class="btn btn-primary"><i class="icon-ok icon-white"></i>&nbsp;@T("Admin.Common.Save")</button>
110+
</td>
111+
</tr>
119112
</table>
120113

121114
<script type="text/javascript">
122-
var selectedIds = [];
123-
124115
$(document).ready(function () {
125-
126116
$('#search-products').click(function () {
127117
var grid = $('#products-grid').data('tGrid');
128118
grid.currentPage = 1; //new search. Set page size to 1
129119
grid.ajaxRequest();
130-
//clear selected checkboxes
131-
$('.checkboxGroups').attr('checked', false).change();
132-
selectedIds = [];
133120
return false;
134121
});
135122
@@ -139,35 +126,9 @@
139126
return false;
140127
}
141128
});
142-
143-
$('#mastercheckbox').click(function () {
144-
$('.checkboxGroups').attr('checked', $(this).is(':checked')).change();
145-
});
146-
147-
//wire up checkboxes.
148-
$('#products-grid input[type=checkbox][id!=mastercheckbox]').live('change', function (e) {
149-
var $check = $(this);
150-
if ($check.is(":checked") == true) {
151-
var checked = jQuery.inArray($check.val(), selectedIds);
152-
if (checked == -1) {
153-
//add id to selectedIds.
154-
selectedIds.push($check.val());
155-
}
156-
}
157-
else {
158-
var checked = jQuery.inArray($check.val(), selectedIds);
159-
if (checked > -1) {
160-
//remove id from selectedIds.
161-
selectedIds = $.grep(selectedIds, function (item, index) {
162-
return item != $check.val();
163-
});
164-
}
165-
}
166-
productsGrid_updateMasterCheckbox();
167-
});
168129
});
169130
170-
function productsGrid_onDataBinding(e) {
131+
function associatedProducts_onDataBinding(e) {
171132
var searchModel = {
172133
SearchProductName: $('#@Html.FieldIdFor(model => model.SearchProductName)').val(),
173134
SearchCategoryId: $('#SearchCategoryId').val(),
@@ -177,22 +138,5 @@
177138
};
178139
e.data = searchModel;
179140
}
180-
181-
function productsGrid_onDataBound(e) {
182-
$('#products-grid input[type=checkbox][id!=mastercheckbox]').each(function () {
183-
var currentId = $(this).val();
184-
var checked = jQuery.inArray(currentId, selectedIds);
185-
//set checked based on if current checkbox's value is in selectedIds.
186-
$(this).attr('checked', checked > -1);
187-
});
188-
189-
productsGrid_updateMasterCheckbox();
190-
}
191-
192-
function productsGrid_updateMasterCheckbox() {
193-
var numChkBoxes = $('#products-grid input[type=checkbox][id!=mastercheckbox]').length;
194-
var numChkBoxesChecked = $('#products-grid input[type=checkbox][checked][id!=mastercheckbox]').length;
195-
$('#mastercheckbox').attr('checked', numChkBoxes == numChkBoxesChecked && numChkBoxes > 0);
196-
}
197141
</script>
198142
}

0 commit comments

Comments
 (0)