Skip to content

Commit 1e74b7e

Browse files
committed
#1857 Allow a store owner to reply to product reviews
P.S. Separate task for vendors (#1980)
1 parent c706700 commit 1e74b7e

File tree

15 files changed

+112
-6
lines changed

15 files changed

+112
-6
lines changed

src/Libraries/Nop.Core/Domain/Catalog/ProductReview.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ public partial class ProductReview : BaseEntity
4242
/// </summary>
4343
public string ReviewText { get; set; }
4444

45+
/// <summary>
46+
/// Gets or sets the reply text
47+
/// </summary>
48+
public string ReplyText { get; set; }
49+
4550
/// <summary>
4651
/// Review rating
4752
/// </summary>

src/Libraries/Nop.Services/Catalog/ProductService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1967,7 +1967,7 @@ public virtual IPagedList<ProductReview> GetAllProductReviews(int customerId, bo
19671967
if (productId > 0)
19681968
query = query.Where(c => c.ProductId == productId);
19691969

1970-
query = query.OrderBy(c => c.CreatedOnUtc);
1970+
query = query.OrderBy(c => c.CreatedOnUtc).ThenBy(c => c.Id);
19711971

19721972
var productReviews = new PagedList<ProductReview>(query, pageIndex, pageSize);
19731973

src/Presentation/Nop.Web/Administration/Controllers/ProductReviewController.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public ProductReviewController(IProductService productService,
5656

5757
[NonAction]
5858
protected virtual void PrepareProductReviewModel(ProductReviewModel model,
59-
ProductReview productReview, bool excludeProperties, bool formatReviewText)
59+
ProductReview productReview, bool excludeProperties, bool formatReviewAndReplyText)
6060
{
6161
if (model == null)
6262
throw new ArgumentNullException("model");
@@ -76,10 +76,16 @@ protected virtual void PrepareProductReviewModel(ProductReviewModel model,
7676
if (!excludeProperties)
7777
{
7878
model.Title = productReview.Title;
79-
if (formatReviewText)
79+
if (formatReviewAndReplyText)
80+
{
8081
model.ReviewText = Core.Html.HtmlHelper.FormatText(productReview.ReviewText, false, true, false, false, false, false);
82+
model.ReplyText = Core.Html.HtmlHelper.FormatText(productReview.ReplyText, false, true, false, false, false, false);
83+
}
8184
else
85+
{
8286
model.ReviewText = productReview.ReviewText;
87+
model.ReplyText = productReview.ReplyText;
88+
}
8389
model.IsApproved = productReview.IsApproved;
8490
}
8591
}
@@ -168,6 +174,7 @@ public ActionResult Edit(ProductReviewModel model, bool continueEditing)
168174

169175
productReview.Title = model.Title;
170176
productReview.ReviewText = model.ReviewText;
177+
productReview.ReplyText = model.ReplyText;
171178
productReview.IsApproved = model.IsApproved;
172179
_productService.UpdateProduct(productReview.Product);
173180

src/Presentation/Nop.Web/Administration/Models/Catalog/ProductReviewModel.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ public partial class ProductReviewModel : BaseNopEntityModel
3030
[NopResourceDisplayName("Admin.Catalog.ProductReviews.Fields.ReviewText")]
3131
public string ReviewText { get; set; }
3232

33+
[AllowHtml]
34+
[NopResourceDisplayName("Admin.Catalog.ProductReviews.Fields.ReplyText")]
35+
public string ReplyText { get; set; }
36+
3337
[NopResourceDisplayName("Admin.Catalog.ProductReviews.Fields.Rating")]
3438
public int Rating { get; set; }
3539

src/Presentation/Nop.Web/Administration/Views/ProductReview/List.cshtml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,10 +192,17 @@
192192
title: "@T("Admin.Catalog.ProductReviews.Fields.ReviewText")",
193193
width: 400,
194194
encoded: false
195+
}, {
196+
field: "ReplyText",
197+
title: "@T("Admin.Catalog.ProductReviews.Fields.ReplyText")",
198+
width: 400,
199+
encoded: false
195200
}, {
196201
field: "Rating",
197202
title: "@T("Admin.Catalog.ProductReviews.Fields.Rating")",
198-
width: 100
203+
width: 100,
204+
headerAttributes: { style: "text-align:center" },
205+
attributes: { style: "text-align:center" }
199206
}, {
200207
field: "IsApproved",
201208
title: "@T("Admin.Catalog.ProductReviews.Fields.IsApproved")",

src/Presentation/Nop.Web/Administration/Views/ProductReview/_CreateOrUpdate.cshtml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,15 @@
5050
@Html.ValidationMessageFor(model => model.ReviewText)
5151
</div>
5252
</div>
53+
<div class="form-group">
54+
<div class="col-md-3">
55+
@Html.NopLabelFor(model => model.ReplyText)
56+
</div>
57+
<div class="col-md-9">
58+
@Html.NopTextAreaFor(model => model.ReplyText)
59+
@Html.ValidationMessageFor(model => model.ReplyText)
60+
</div>
61+
</div>
5362
<div class="form-group">
5463
<div class="col-md-3">
5564
@Html.NopLabelFor(model => model.Rating)

src/Presentation/Nop.Web/App_Data/Localization/defaultResources.nopres.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2358,6 +2358,12 @@
23582358
<LocaleResource Name="Admin.Catalog.ProductReviews.Fields.Rating.Hint">
23592359
<Value>The customer's product rating.</Value>
23602360
</LocaleResource>
2361+
<LocaleResource Name="Admin.Catalog.ProductReviews.Fields.ReplyText">
2362+
<Value>Reply text</Value>
2363+
</LocaleResource>
2364+
<LocaleResource Name="Admin.Catalog.ProductReviews.Fields.ReplyText.Hint">
2365+
<Value>The reply text (by a store owner). If specified, then it'll be visible to a customer. Leave empty to ignore this functionality.</Value>
2366+
</LocaleResource>
23612367
<LocaleResource Name="Admin.Catalog.ProductReviews.Fields.ReviewText">
23622368
<Value>Review text</Value>
23632369
</LocaleResource>
@@ -15276,6 +15282,9 @@
1527615282
<LocaleResource Name="Reviews.ProductReviewsFor">
1527715283
<Value>Product reviews for</Value>
1527815284
</LocaleResource>
15285+
<LocaleResource Name="Reviews.Reply">
15286+
<Value>A manager responded to this review</Value>
15287+
</LocaleResource>
1527915288
<LocaleResource Name="Reviews.SeeAfterApproving">
1528015289
<Value>You will see the product review after approving by a store administrator.</Value>
1528115290
</LocaleResource>

src/Presentation/Nop.Web/Factories/ProductModelFactory.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1338,6 +1338,7 @@ public virtual ProductReviewsModel PrepareProductReviewsModel(ProductReviewsMode
13381338
AllowViewingProfiles = _customerSettings.AllowViewingProfiles && customer != null && !customer.IsGuest(),
13391339
Title = pr.Title,
13401340
ReviewText = pr.ReviewText,
1341+
ReplyText = pr.ReplyText,
13411342
Rating = pr.Rating,
13421343
Helpfulness = new ProductReviewHelpfulnessModel
13431344
{
@@ -1381,8 +1382,8 @@ public virtual CustomerProductReviewsModel PrepareCustomerProductReviewsModel(in
13811382
ProductSeName = product.GetSeName(),
13821383
Rating = review.Rating,
13831384
ReviewText = review.ReviewText,
1384-
WrittenOnStr =
1385-
_dateTimeHelper.ConvertToUserTime(product.CreatedOnUtc, DateTimeKind.Utc).ToString("g")
1385+
ReplyText = review.ReplyText,
1386+
WrittenOnStr = _dateTimeHelper.ConvertToUserTime(product.CreatedOnUtc, DateTimeKind.Utc).ToString("g")
13861387
};
13871388

13881389
if (_catalogSettings.ProductReviewsMustBeApproved)

src/Presentation/Nop.Web/Models/Catalog/CustomerProductReviewModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public class CustomerProductReviewModel : BaseNopModel
1111
public string ProductSeName { get; set; }
1212
public string Title { get; set; }
1313
public string ReviewText { get; set; }
14+
public string ReplyText { get; set; }
1415
public int Rating { get; set; }
1516
public string WrittenOnStr { get; set; }
1617
public string ApprovalStatus { get; set; }

src/Presentation/Nop.Web/Models/Catalog/ProductReviewModel.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ public partial class ProductReviewModel : BaseNopEntityModel
4848

4949
public string ReviewText { get; set; }
5050

51+
public string ReplyText { get; set; }
52+
5153
public int Rating { get; set; }
5254

5355
public ProductReviewHelpfulnessModel Helpfulness { get; set; }

0 commit comments

Comments
 (0)