workarea-reviews 3.0.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.editorconfig +20 -0
- data/.eslintignore +2 -0
- data/.eslintrc +24 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
- data/.github/ISSUE_TEMPLATE/documentation-request.md +17 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.gitignore +16 -0
- data/.scss-lint.yml +188 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +763 -0
- data/CODE_OF_CONDUCT.md +3 -0
- data/CONTRIBUTING.md +3 -0
- data/Gemfile +6 -0
- data/LICENSE +52 -0
- data/README.md +107 -0
- data/Rakefile +54 -0
- data/app/assets/images/workarea/admin/icons/star.svg +1 -0
- data/app/assets/images/workarea/storefront/icons/empty_star.svg +1 -0
- data/app/assets/images/workarea/storefront/icons/half_star.svg +1 -0
- data/app/assets/images/workarea/storefront/icons/star.svg +1 -0
- data/app/assets/javascripts/workarea/storefront/reviews/modules/product_review_ajax_submit.js +39 -0
- data/app/assets/javascripts/workarea/storefront/reviews/modules/product_reviews_sort_menus.js +82 -0
- data/app/assets/javascripts/workarea/storefront/reviews/modules/rating_buttons.js +103 -0
- data/app/assets/javascripts/workarea/storefront/reviews/templates/sort_by_property.jst.ejs +11 -0
- data/app/assets/stylesheets/workarea/storefront/reviews/components/_rating.scss +28 -0
- data/app/assets/stylesheets/workarea/storefront/reviews/components/_reviews.scss +59 -0
- data/app/assets/stylesheets/workarea/storefront/reviews/components/_reviews_aggregate.scss +38 -0
- data/app/assets/stylesheets/workarea/storefront/reviews/components/_write_review.scss +63 -0
- data/app/controllers/workarea/admin/catalog_products_controller.decorator +9 -0
- data/app/controllers/workarea/admin/import_reviews_controller.rb +35 -0
- data/app/controllers/workarea/admin/reviews_controller.rb +51 -0
- data/app/controllers/workarea/storefront/review_requests_controller.rb +50 -0
- data/app/controllers/workarea/storefront/reviews_controller.rb +53 -0
- data/app/helpers/workarea/admin/reviews_helper.rb +12 -0
- data/app/helpers/workarea/storefront/reviews_helper.rb +24 -0
- data/app/mailers/workarea/admin/status_report_mailer.decorator +8 -0
- data/app/mailers/workarea/storefront/review_mailer.rb +23 -0
- data/app/models/workarea/catalog/product.decorator +15 -0
- data/app/models/workarea/fulfillment.decorator +11 -0
- data/app/models/workarea/review.rb +135 -0
- data/app/models/workarea/review/request.rb +62 -0
- data/app/models/workarea/search/admin/review.rb +72 -0
- data/app/models/workarea/search/storefront/product.decorator +9 -0
- data/app/models/workarea/sort.decorator +17 -0
- data/app/queries/workarea/review_request_params.rb +47 -0
- data/app/queries/workarea/review_summary.rb +11 -0
- data/app/queries/workarea/search/admin_reviews.rb +40 -0
- data/app/queries/workarea/search/category_browse.decorator +9 -0
- data/app/queries/workarea/search/product_search.decorator +9 -0
- data/app/seeds/review_seeds.rb +49 -0
- data/app/services/workarea/create_review.rb +99 -0
- data/app/view_models/workarea/admin/product_view_model.decorator +7 -0
- data/app/view_models/workarea/admin/review_view_model.rb +23 -0
- data/app/view_models/workarea/admin/reviews_search_view_model.rb +46 -0
- data/app/view_models/workarea/storefront/product_view_model.decorator +13 -0
- data/app/view_models/workarea/storefront/review_view_model.rb +14 -0
- data/app/views/workarea/admin/activities/_review_create.html.haml +12 -0
- data/app/views/workarea/admin/activities/_review_destroy.html.haml +10 -0
- data/app/views/workarea/admin/activities/_review_update.html.haml +10 -0
- data/app/views/workarea/admin/reviews/_aux_navigation.html.haml +5 -0
- data/app/views/workarea/admin/reviews/_catalog_products_aux_link.html.haml +5 -0
- data/app/views/workarea/admin/reviews/_dashboard_navigation.html.haml +1 -0
- data/app/views/workarea/admin/reviews/_menu.html.haml +3 -0
- data/app/views/workarea/admin/reviews/_summary.html.haml +12 -0
- data/app/views/workarea/admin/reviews/edit.html.haml +77 -0
- data/app/views/workarea/admin/reviews/index.html.haml +74 -0
- data/app/views/workarea/admin/status_report_mailer/_reviews.html.haml +5 -0
- data/app/views/workarea/storefront/products/_rating.html.haml +10 -0
- data/app/views/workarea/storefront/products/_reviews.html.haml +23 -0
- data/app/views/workarea/storefront/products/_reviews_aggregate.html.haml +22 -0
- data/app/views/workarea/storefront/products/_reviews_summary.html.haml +2 -0
- data/app/views/workarea/storefront/review_mailer/review_request.html.haml +22 -0
- data/app/views/workarea/storefront/review_requests/show.html.haml +44 -0
- data/app/views/workarea/storefront/reviews/new.html.haml +68 -0
- data/app/views/workarea/storefront/style_guides/_reviews_product_summary_docs.html.haml +13 -0
- data/app/views/workarea/storefront/style_guides/components/_reviews.html.haml +17 -0
- data/app/workers/workarea/create_review_requests.rb +33 -0
- data/app/workers/workarea/schedule_review_requests.rb +44 -0
- data/app/workers/workarea/send_review_requests.rb +12 -0
- data/app/workers/workarea/update_product_review_data.rb +26 -0
- data/bin/rails +18 -0
- data/config/initializers/append_points.rb +70 -0
- data/config/initializers/assets.rb +1 -0
- data/config/initializers/configuration.rb +29 -0
- data/config/initializers/rack_attack.rb +11 -0
- data/config/initializers/recaptcha.rb +19 -0
- data/config/initializers/scheduled_jobs.rb +8 -0
- data/config/locales/en.yml +104 -0
- data/config/routes.rb +21 -0
- data/lib/tasks/verify.rake +16 -0
- data/lib/workarea/mailer_previews/storefront/review_mailer_preview.rb +10 -0
- data/lib/workarea/reviews.rb +13 -0
- data/lib/workarea/reviews/engine.rb +12 -0
- data/lib/workarea/reviews/version.rb +5 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/config/manifest.js +4 -0
- data/test/dummy/app/assets/images/.keep +0 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/controllers/concerns/.keep +0 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/jobs/application_job.rb +2 -0
- data/test/dummy/app/mailers/application_mailer.rb +4 -0
- data/test/dummy/app/models/concerns/.keep +0 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +34 -0
- data/test/dummy/bin/update +29 -0
- data/test/dummy/config.ru +5 -0
- data/test/dummy/config/application.rb +25 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/cable.yml +9 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +55 -0
- data/test/dummy/config/environments/production.rb +86 -0
- data/test/dummy/config/environments/test.rb +43 -0
- data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/new_framework_defaults.rb +21 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/workarea.rb +5 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/puma.rb +47 -0
- data/test/dummy/config/routes.rb +5 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config/spring.rb +6 -0
- data/test/dummy/db/seeds.rb +2 -0
- data/test/dummy/lib/assets/.keep +0 -0
- data/test/dummy/log/.keep +0 -0
- data/test/factories/reviews.rb +32 -0
- data/test/fixtures/reviews.csv +5 -0
- data/test/helpers/workarea/admin/reviews_helper_test.rb +17 -0
- data/test/helpers/workarea/storefront/reviews_helper_test.rb +19 -0
- data/test/integration/workarea/admin/reviews_integration_test.rb +33 -0
- data/test/integration/workarea/storefront/review_requests_integration_test.rb +63 -0
- data/test/integration/workarea/storefront/reviews_integration_test.rb +82 -0
- data/test/javascripts/fixtures/product_review_ajax_submit.html.haml +4 -0
- data/test/javascripts/product_review_ajax_submit_spec.js +28 -0
- data/test/javascripts/spec_helper.js +23 -0
- data/test/models/workarea/review/request_test.rb +18 -0
- data/test/models/workarea/review_test.rb +94 -0
- data/test/models/workarea/search/storefront/product_test.decorator +14 -0
- data/test/queries/workarea/review_request_params_test.rb +64 -0
- data/test/services/workarea/create_review_test.rb +131 -0
- data/test/system/workarea/admin/review_system_test.rb +96 -0
- data/test/system/workarea/storefront/review_request_system_test.rb +34 -0
- data/test/system/workarea/storefront/review_system_test.rb +113 -0
- data/test/teaspoon_env.rb +10 -0
- data/test/test_helper.rb +11 -0
- data/test/workers/workarea/create_review_requests_test.rb +38 -0
- data/test/workers/workarea/schedule_review_requests_test.rb +115 -0
- data/test/workers/workarea/send_review_requests_test.rb +30 -0
- data/workarea-reviews.gemspec +22 -0
- metadata +241 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
module Workarea
|
2
|
+
class ReviewSeeds
|
3
|
+
def perform
|
4
|
+
puts 'Adding reviews...'
|
5
|
+
|
6
|
+
Sidekiq::Callbacks.disable do
|
7
|
+
create_reviews_for_catalog
|
8
|
+
create_review_request_email_content
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def create_reviews_for_catalog
|
15
|
+
Workarea::Catalog::Product.all.each_by(100) do |product|
|
16
|
+
reviews = Array.new(rand(10)) { create_review(product) }
|
17
|
+
next unless reviews.size > 0
|
18
|
+
|
19
|
+
Workarea::Review.collection.insert_many(reviews.map(&:as_document))
|
20
|
+
UpdateProductReviewData.perform_async(product.id)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def create_review(product)
|
25
|
+
Workarea::Review.new(
|
26
|
+
product_id: product.id,
|
27
|
+
user_id: BSON::ObjectId.new,
|
28
|
+
rating: rand(5) + 1,
|
29
|
+
title: Faker::Lorem.sentence,
|
30
|
+
body: Faker::Lorem.paragraph,
|
31
|
+
approved: [true, false].sample,
|
32
|
+
user_info: Faker::Internet.user_name,
|
33
|
+
verified: [true, false].sample,
|
34
|
+
created_at: rand(45).days.ago,
|
35
|
+
updated_at: Time.current
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
def create_review_request_email_content
|
40
|
+
Content::Email.create!(
|
41
|
+
type: 'review_request',
|
42
|
+
content: <<~HTML
|
43
|
+
<h1>Let us know what you think!</h1>
|
44
|
+
<p>Your feedback is important to us.</p>
|
45
|
+
HTML
|
46
|
+
)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module Workarea
|
2
|
+
class CreateReview
|
3
|
+
include ActiveModel::Validations
|
4
|
+
|
5
|
+
validate :valid_review
|
6
|
+
validates :first_name, :last_name, presence: true
|
7
|
+
|
8
|
+
attr_reader :review, :user, :params
|
9
|
+
|
10
|
+
def self.for(product: nil, user: nil, params: {})
|
11
|
+
review = Review.new(
|
12
|
+
product_id: product.try(:id),
|
13
|
+
user_id: user.try(:id)
|
14
|
+
)
|
15
|
+
|
16
|
+
new(review, user: user, params: params)
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(review, user: nil, params: {})
|
20
|
+
@review = review
|
21
|
+
@user = user
|
22
|
+
@params = params
|
23
|
+
end
|
24
|
+
|
25
|
+
def save
|
26
|
+
update_user_attributes
|
27
|
+
update_attributes
|
28
|
+
|
29
|
+
return false unless valid?
|
30
|
+
review.save.tap { |result| update_review_requests if result }
|
31
|
+
end
|
32
|
+
|
33
|
+
def verified?
|
34
|
+
user_order_ids_with_product.any?
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def user_order_ids_with_product
|
40
|
+
return [] unless user.present?
|
41
|
+
|
42
|
+
@user_users_with_product ||=
|
43
|
+
Order.placed
|
44
|
+
.where(user_id: user.id.to_s)
|
45
|
+
.where('items.product_id' => review.product_id)
|
46
|
+
.pluck(:id)
|
47
|
+
end
|
48
|
+
|
49
|
+
def update_user_attributes
|
50
|
+
return if !user.present? || user.public_info.present?
|
51
|
+
user.update_attributes(params.slice(:first_name, :last_name))
|
52
|
+
end
|
53
|
+
|
54
|
+
def update_attributes
|
55
|
+
review.assign_attributes(
|
56
|
+
params
|
57
|
+
.slice(:rating, :body, :title)
|
58
|
+
.merge(
|
59
|
+
user_info: user_info,
|
60
|
+
first_name: first_name,
|
61
|
+
last_name: last_name,
|
62
|
+
email: email,
|
63
|
+
verified: verified?
|
64
|
+
)
|
65
|
+
)
|
66
|
+
end
|
67
|
+
|
68
|
+
def update_review_requests
|
69
|
+
return unless user_order_ids_with_product.any?
|
70
|
+
Review::Request.cancel_for_orders!(user_order_ids_with_product)
|
71
|
+
end
|
72
|
+
|
73
|
+
def user_info
|
74
|
+
return user.public_info if user&.public_info.present?
|
75
|
+
|
76
|
+
"#{first_name&.first} #{last_name&.first}".strip
|
77
|
+
end
|
78
|
+
|
79
|
+
def first_name
|
80
|
+
params[:first_name].presence || user&.first_name
|
81
|
+
end
|
82
|
+
|
83
|
+
def last_name
|
84
|
+
params[:last_name].presence || user&.last_name
|
85
|
+
end
|
86
|
+
|
87
|
+
def email
|
88
|
+
params[:email].presence || user&.email
|
89
|
+
end
|
90
|
+
|
91
|
+
def valid_review
|
92
|
+
unless review.valid?
|
93
|
+
review.errors.each do |attr, error|
|
94
|
+
errors.add(attr, error)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Admin
|
3
|
+
class ReviewViewModel < ApplicationViewModel
|
4
|
+
delegate :primary_image, to: :product, allow_nil: true
|
5
|
+
|
6
|
+
def name
|
7
|
+
if product.present?
|
8
|
+
t('workarea.admin.reviews.index.review_for', product: product.name)
|
9
|
+
else
|
10
|
+
t('workarea.admin.reviews.index.review')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def product
|
15
|
+
@product ||=
|
16
|
+
options[:product] ||
|
17
|
+
ProductViewModel.wrap(Catalog::Product.find(product_id))
|
18
|
+
rescue Mongoid::Errors::DocumentNotFound
|
19
|
+
nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Admin
|
3
|
+
class ReviewsSearchViewModel < SearchViewModel
|
4
|
+
def results
|
5
|
+
@results ||= PagedArray.from(
|
6
|
+
persisted_results.map do |review|
|
7
|
+
ReviewViewModel.new(
|
8
|
+
review,
|
9
|
+
product: products.detect { |p| p.id.to_s == review.product_id.to_s }
|
10
|
+
)
|
11
|
+
end,
|
12
|
+
model.results.page,
|
13
|
+
model.results.per_page,
|
14
|
+
total
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
def sort
|
19
|
+
if options[:sort] == Sort.highest_rating.to_s
|
20
|
+
Sort.highest_rating.to_s
|
21
|
+
elsif options[:sort] == Sort.lowest_rating.to_s
|
22
|
+
Sort.lowest_rating.to_s
|
23
|
+
else
|
24
|
+
super
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def sorts
|
29
|
+
super + [
|
30
|
+
Sort.highest_rating.to_a,
|
31
|
+
Sort.lowest_rating.to_a
|
32
|
+
]
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def products
|
38
|
+
@products ||= ProductViewModel.wrap(
|
39
|
+
Catalog::Product
|
40
|
+
.any_in(id: persisted_results.map(&:product_id))
|
41
|
+
.map { |product| Admin::ProductViewModel.new(product) }
|
42
|
+
)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
.activity
|
2
|
+
.activity__header
|
3
|
+
.activity__avatar
|
4
|
+
= link_to_modifier(entry) do
|
5
|
+
= avatar_for entry.modifier
|
6
|
+
%h3.activity__name= link_to_modifier(entry)
|
7
|
+
%p.activity__time= activity_time(entry.created_at)
|
8
|
+
.activity__message
|
9
|
+
- if entry.audited.present?
|
10
|
+
= t('workarea.admin.activities.review_create_html', name: link_to(t('workarea.admin.activities.review'), edit_review_path(entry.audited)))
|
11
|
+
- else
|
12
|
+
= t('workarea.admin.activities.review_create_html', name: t('workarea.admin.activities.review'))
|
@@ -0,0 +1,10 @@
|
|
1
|
+
.activity
|
2
|
+
.activity__header
|
3
|
+
.activity__avatar
|
4
|
+
= link_to_modifier(entry) do
|
5
|
+
= avatar_for entry.modifier
|
6
|
+
%h3.activity__name= link_to_modifier(entry)
|
7
|
+
%p.activity__time= activity_time(entry.created_at)
|
8
|
+
.activity__message
|
9
|
+
= t('workarea.admin.activities.review_destroy_html', name: entry.model_attributes['title'])
|
10
|
+
= link_to_restore_for(entry)
|
@@ -0,0 +1,10 @@
|
|
1
|
+
.activity
|
2
|
+
.activity__header
|
3
|
+
.activity__avatar
|
4
|
+
= link_to_modifier(entry) do
|
5
|
+
= avatar_for entry.modifier
|
6
|
+
%h3.activity__name= link_to_modifier(entry)
|
7
|
+
%p.activity__time= activity_time(entry.created_at)
|
8
|
+
.activity__message
|
9
|
+
- name = entry.audited.blank? ? entry.model_attributes['title'] : link_to(entry.model_attributes['title'], edit_review_path(entry.audited))
|
10
|
+
= t('workarea.admin.activities.review_update_html', fields: fields_clause_for(entry.tracked_changes), name: name)
|
@@ -0,0 +1,5 @@
|
|
1
|
+
.grid.grid--auto.grid--right.grid--middle
|
2
|
+
- if model.product.present?
|
3
|
+
.grid__cell= link_to t('workarea.admin.reviews.edit.view_product'), catalog_product_path(model.product)
|
4
|
+
- unless model.anonymous?
|
5
|
+
.grid__cell= link_to t('workarea.admin.reviews.edit.view_user'), user_path(model.user_id)
|
@@ -0,0 +1 @@
|
|
1
|
+
%li= link_to t('workarea.admin.dashboards.marketing.reviews'), reviews_path, class: 'dashboard__navigation-link'
|
@@ -0,0 +1,12 @@
|
|
1
|
+
= link_to edit_review_path(model), class: 'summary', data: { global_id: model.to_global_id.to_param } do
|
2
|
+
.summary__image-container
|
3
|
+
= image_tag(product_image_url(model.primary_image, :medium), alt: model.name, class: 'summary__image') if model.primary_image.present?
|
4
|
+
%span.summary__name= model.name
|
5
|
+
.summary__info-container
|
6
|
+
%span.summary__info= local_time_ago(model.updated_at)
|
7
|
+
%span.summary__info
|
8
|
+
- if model.approved
|
9
|
+
= t('workarea.admin.reviews.approved')
|
10
|
+
- else
|
11
|
+
= t('workarea.admin.reviews.pending')
|
12
|
+
%span.summary__type= t('workarea.admin.reviews.summary.type')
|
@@ -0,0 +1,77 @@
|
|
1
|
+
- @page_title = @review.name
|
2
|
+
|
3
|
+
.view
|
4
|
+
.view__header
|
5
|
+
.grid.grid--middle.grid--right
|
6
|
+
.grid__cell.grid__cell--50
|
7
|
+
.view__heading
|
8
|
+
= link_to_index_for(@review)
|
9
|
+
%h1= @review.name
|
10
|
+
.grid__cell.grid__cell--25
|
11
|
+
= render_aux_navigation_for(@review)
|
12
|
+
|
13
|
+
.view__container.view__container--narrow
|
14
|
+
- @review.errors.full_messages.each do |message|
|
15
|
+
= render_message 'error', message
|
16
|
+
|
17
|
+
= form_tag review_path(@review), method: :patch, id: 'sku_form' do
|
18
|
+
.section
|
19
|
+
.grid.grid--huge.grid--middle
|
20
|
+
.grid__cell.grid__cell--50-at-medium
|
21
|
+
.property
|
22
|
+
= label_tag 'review_title', t('workarea.admin.fields.title'), class: 'property__name'
|
23
|
+
= text_field_tag 'review[title]', @review.title, class: 'text-box'
|
24
|
+
|
25
|
+
.grid__cell.grid__cell--50-at-medium
|
26
|
+
.grid.grid--right.grid--auto
|
27
|
+
.grid__cell
|
28
|
+
.property
|
29
|
+
%span.property__name= t('workarea.admin.reviews.approved')
|
30
|
+
= toggle_button_for 'review[approved]', @review.approved
|
31
|
+
|
32
|
+
.property
|
33
|
+
= label_tag 'review_body', t('workarea.admin.fields.body'), class: 'property__name'
|
34
|
+
= text_area_tag 'review[body]', @review.body, class: 'text-box text-box--multi-line'
|
35
|
+
|
36
|
+
.grid.grid--huge
|
37
|
+
.grid__cell.grid__cell--50.grid__cell--25-at-medium
|
38
|
+
.property
|
39
|
+
= label_tag 'review_rating', t('workarea.admin.fields.rating'), class: 'property__name'
|
40
|
+
= @review.rating
|
41
|
+
.grid__cell.grid__cell--50.grid__cell--25-at-medium
|
42
|
+
.property
|
43
|
+
= label_tag 'verified', t('workarea.admin.fields.verified'), class: 'property__name'
|
44
|
+
= t("workarea.admin.#{@review.verified?}")
|
45
|
+
.grid__cell.grid__cell--50.grid__cell--25-at-medium
|
46
|
+
.property
|
47
|
+
= label_tag 'review_updated_at', t('workarea.admin.fields.updated_at'), class: 'property__name'
|
48
|
+
= local_time(@review.updated_at)
|
49
|
+
.grid__cell.grid__cell--50.grid__cell--25-at-medium
|
50
|
+
.property
|
51
|
+
= label_tag 'review_created_at', t('workarea.admin.fields.created_at'), class: 'property__name'
|
52
|
+
= local_time(@review.created_at)
|
53
|
+
|
54
|
+
.grid__cell.grid__cell--50.grid__cell--25-at-medium
|
55
|
+
.property
|
56
|
+
= label_tag 'review_product_id', t('workarea.admin.fields.product_id'), class: 'property__name'
|
57
|
+
- if @review.product.nil?
|
58
|
+
= @review.product_id
|
59
|
+
- else
|
60
|
+
= link_to @review.product_id, catalog_product_path(@review.product)
|
61
|
+
- if @review.anonymous?
|
62
|
+
.grid__cell.grid__cell--50.grid__cell--25-at-medium
|
63
|
+
.property
|
64
|
+
= label_tag 'review_name', t('workarea.admin.fields.name'), class: 'property__name'
|
65
|
+
= [@review.first_name, @review.last_name].join(' ')
|
66
|
+
.grid__cell.grid__cell--50.grid__cell--25-at-medium
|
67
|
+
.property
|
68
|
+
= label_tag 'review_email', t('workarea.admin.fields.email'), class: 'property__name'
|
69
|
+
= @review.email.presence || '--'
|
70
|
+
|
71
|
+
|
72
|
+
.workflow-bar
|
73
|
+
.grid.grid--middle
|
74
|
+
.grid__cell.grid__cell--50
|
75
|
+
= link_to t('workarea.admin.actions.delete'), review_path(@review), data: { method: 'delete', confirm: t('workarea.admin.actions.delete_confirmation')}, class: 'workflow-bar__button workflow-bar__button--delete'
|
76
|
+
.grid__cell.grid__cell--50.align-right
|
77
|
+
.grid__cell= button_tag t('workarea.admin.reviews.edit.save_review'), value: 'save_review', class: 'workflow-bar__button workflow-bar__button--update'
|
@@ -0,0 +1,74 @@
|
|
1
|
+
- @page_title = t('workarea.admin.reviews.index.page_title')
|
2
|
+
|
3
|
+
.view
|
4
|
+
.view__header
|
5
|
+
.grid.grid--middle.grid--center
|
6
|
+
.grid__cell.grid__cell--50
|
7
|
+
.view__heading
|
8
|
+
= link_to "↑ #{t('workarea.admin.reviews.index.dashboard_link')}", marketing_dashboards_path, class: 'view__dashboard-button'
|
9
|
+
%h1= t('workarea.admin.reviews.index.heading')
|
10
|
+
|
11
|
+
.view__container
|
12
|
+
.browsing-controls.browsing-controls--with-divider.browsing-controls--center{ class: ('browsing-controls--filters-displayed' unless @search.toggle_facets?) }
|
13
|
+
= form_tag reviews_path, method: 'get', id: 'review_sort_form' do
|
14
|
+
= facet_hidden_inputs(@search.facets)
|
15
|
+
.browsing-controls__sort
|
16
|
+
.property.property--inline
|
17
|
+
= label_tag 'sort', t('workarea.admin.search.sort_by'), class: 'property__name'
|
18
|
+
= select_tag :sort, options_for_select(@search.sorts, selected: @search.sort), data: { form_submitting_control: '' }
|
19
|
+
|
20
|
+
.browsing-controls__search
|
21
|
+
.search-form
|
22
|
+
= text_field_tag :q, params[:q], class: 'search-form__input', id: 'search_products', title: t('workarea.admin.search.keywords'), placeholder: t('workarea.admin.search.keywords')
|
23
|
+
= submit_tag 'search_orders', class: 'search-form__button'
|
24
|
+
|
25
|
+
= render 'workarea/admin/shared/creation_date', search: @search, form_path: reviews_path
|
26
|
+
|
27
|
+
- if @search.facets.present?
|
28
|
+
- @search.facets.each do |facet|
|
29
|
+
= render "workarea/admin/facets/#{facet.type}", facet: facet
|
30
|
+
|
31
|
+
- if @search.toggle_facets?
|
32
|
+
.browsing-controls__toggle-filters
|
33
|
+
%button.text-button{ type: 'button', data: { toggle_filters: '' } }= t('workarea.admin.search.show_filters')
|
34
|
+
|
35
|
+
= render 'workarea/admin/facets/applied', search: @search, reset_path: reviews_path
|
36
|
+
|
37
|
+
%p.browsing-controls__count= pluralize(@search.total, 'Reviews')
|
38
|
+
|
39
|
+
- if @search.results.any?
|
40
|
+
%table.index-table
|
41
|
+
%thead
|
42
|
+
%tr
|
43
|
+
%th.index-table__control-cell
|
44
|
+
.checkbox
|
45
|
+
= check_box_tag 'select_all', nil, false, id: 'select_all', class: 'checkbox__input', data: { bulk_action_select_all: '' }
|
46
|
+
= label_tag 'select_all', t('workarea.admin.bulk_actions.select_all'), class: 'checkbox__label'
|
47
|
+
%th= t('workarea.admin.fields.name')
|
48
|
+
%th= t('workarea.admin.fields.title')
|
49
|
+
%th.align-center= t('workarea.admin.fields.rating')
|
50
|
+
%th.align-center= t('workarea.admin.fields.approved')
|
51
|
+
%th.align-center= t('workarea.admin.fields.verified')
|
52
|
+
%th= t('workarea.admin.fields.created_at')
|
53
|
+
|
54
|
+
%tbody
|
55
|
+
- @search.results.each do |result|
|
56
|
+
%tr.index-table__row
|
57
|
+
%td.index-table__control-cell
|
58
|
+
.checkbox
|
59
|
+
= check_box_tag 'global_id', result.to_gid_param, false, class: 'checkbox__input', id: dom_id(result), data: { bulk_action_item: '' }
|
60
|
+
= label_tag dom_id(result), '', class: 'checkbox__label', title: t('workarea.admin.bulk_actions.add_summary_button')
|
61
|
+
%td= link_to result.name, edit_review_path(result)
|
62
|
+
%td= result.title
|
63
|
+
%td.align-center= result.rating
|
64
|
+
%td.align-center= t("workarea.admin.#{result.approved}")
|
65
|
+
%td.align-center= t("workarea.admin.#{result.verified}")
|
66
|
+
%td= local_time_ago(result.created_at)
|
67
|
+
|
68
|
+
- if @search.results.total_pages > 1
|
69
|
+
= render 'workarea/admin/shared/pagination', collection: @search.results
|
70
|
+
|
71
|
+
.workflow-bar
|
72
|
+
.grid
|
73
|
+
.grid__cell.grid__cell--50
|
74
|
+
= render 'workarea/admin/shared/bulk_actions', klass: Workarea::Review, search: @search
|