workarea-reviews 3.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +20 -0
  3. data/.eslintignore +2 -0
  4. data/.eslintrc +24 -0
  5. data/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  6. data/.github/ISSUE_TEMPLATE/documentation-request.md +17 -0
  7. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  8. data/.gitignore +16 -0
  9. data/.scss-lint.yml +188 -0
  10. data/.yardopts +1 -0
  11. data/CHANGELOG.md +763 -0
  12. data/CODE_OF_CONDUCT.md +3 -0
  13. data/CONTRIBUTING.md +3 -0
  14. data/Gemfile +6 -0
  15. data/LICENSE +52 -0
  16. data/README.md +107 -0
  17. data/Rakefile +54 -0
  18. data/app/assets/images/workarea/admin/icons/star.svg +1 -0
  19. data/app/assets/images/workarea/storefront/icons/empty_star.svg +1 -0
  20. data/app/assets/images/workarea/storefront/icons/half_star.svg +1 -0
  21. data/app/assets/images/workarea/storefront/icons/star.svg +1 -0
  22. data/app/assets/javascripts/workarea/storefront/reviews/modules/product_review_ajax_submit.js +39 -0
  23. data/app/assets/javascripts/workarea/storefront/reviews/modules/product_reviews_sort_menus.js +82 -0
  24. data/app/assets/javascripts/workarea/storefront/reviews/modules/rating_buttons.js +103 -0
  25. data/app/assets/javascripts/workarea/storefront/reviews/templates/sort_by_property.jst.ejs +11 -0
  26. data/app/assets/stylesheets/workarea/storefront/reviews/components/_rating.scss +28 -0
  27. data/app/assets/stylesheets/workarea/storefront/reviews/components/_reviews.scss +59 -0
  28. data/app/assets/stylesheets/workarea/storefront/reviews/components/_reviews_aggregate.scss +38 -0
  29. data/app/assets/stylesheets/workarea/storefront/reviews/components/_write_review.scss +63 -0
  30. data/app/controllers/workarea/admin/catalog_products_controller.decorator +9 -0
  31. data/app/controllers/workarea/admin/import_reviews_controller.rb +35 -0
  32. data/app/controllers/workarea/admin/reviews_controller.rb +51 -0
  33. data/app/controllers/workarea/storefront/review_requests_controller.rb +50 -0
  34. data/app/controllers/workarea/storefront/reviews_controller.rb +53 -0
  35. data/app/helpers/workarea/admin/reviews_helper.rb +12 -0
  36. data/app/helpers/workarea/storefront/reviews_helper.rb +24 -0
  37. data/app/mailers/workarea/admin/status_report_mailer.decorator +8 -0
  38. data/app/mailers/workarea/storefront/review_mailer.rb +23 -0
  39. data/app/models/workarea/catalog/product.decorator +15 -0
  40. data/app/models/workarea/fulfillment.decorator +11 -0
  41. data/app/models/workarea/review.rb +135 -0
  42. data/app/models/workarea/review/request.rb +62 -0
  43. data/app/models/workarea/search/admin/review.rb +72 -0
  44. data/app/models/workarea/search/storefront/product.decorator +9 -0
  45. data/app/models/workarea/sort.decorator +17 -0
  46. data/app/queries/workarea/review_request_params.rb +47 -0
  47. data/app/queries/workarea/review_summary.rb +11 -0
  48. data/app/queries/workarea/search/admin_reviews.rb +40 -0
  49. data/app/queries/workarea/search/category_browse.decorator +9 -0
  50. data/app/queries/workarea/search/product_search.decorator +9 -0
  51. data/app/seeds/review_seeds.rb +49 -0
  52. data/app/services/workarea/create_review.rb +99 -0
  53. data/app/view_models/workarea/admin/product_view_model.decorator +7 -0
  54. data/app/view_models/workarea/admin/review_view_model.rb +23 -0
  55. data/app/view_models/workarea/admin/reviews_search_view_model.rb +46 -0
  56. data/app/view_models/workarea/storefront/product_view_model.decorator +13 -0
  57. data/app/view_models/workarea/storefront/review_view_model.rb +14 -0
  58. data/app/views/workarea/admin/activities/_review_create.html.haml +12 -0
  59. data/app/views/workarea/admin/activities/_review_destroy.html.haml +10 -0
  60. data/app/views/workarea/admin/activities/_review_update.html.haml +10 -0
  61. data/app/views/workarea/admin/reviews/_aux_navigation.html.haml +5 -0
  62. data/app/views/workarea/admin/reviews/_catalog_products_aux_link.html.haml +5 -0
  63. data/app/views/workarea/admin/reviews/_dashboard_navigation.html.haml +1 -0
  64. data/app/views/workarea/admin/reviews/_menu.html.haml +3 -0
  65. data/app/views/workarea/admin/reviews/_summary.html.haml +12 -0
  66. data/app/views/workarea/admin/reviews/edit.html.haml +77 -0
  67. data/app/views/workarea/admin/reviews/index.html.haml +74 -0
  68. data/app/views/workarea/admin/status_report_mailer/_reviews.html.haml +5 -0
  69. data/app/views/workarea/storefront/products/_rating.html.haml +10 -0
  70. data/app/views/workarea/storefront/products/_reviews.html.haml +23 -0
  71. data/app/views/workarea/storefront/products/_reviews_aggregate.html.haml +22 -0
  72. data/app/views/workarea/storefront/products/_reviews_summary.html.haml +2 -0
  73. data/app/views/workarea/storefront/review_mailer/review_request.html.haml +22 -0
  74. data/app/views/workarea/storefront/review_requests/show.html.haml +44 -0
  75. data/app/views/workarea/storefront/reviews/new.html.haml +68 -0
  76. data/app/views/workarea/storefront/style_guides/_reviews_product_summary_docs.html.haml +13 -0
  77. data/app/views/workarea/storefront/style_guides/components/_reviews.html.haml +17 -0
  78. data/app/workers/workarea/create_review_requests.rb +33 -0
  79. data/app/workers/workarea/schedule_review_requests.rb +44 -0
  80. data/app/workers/workarea/send_review_requests.rb +12 -0
  81. data/app/workers/workarea/update_product_review_data.rb +26 -0
  82. data/bin/rails +18 -0
  83. data/config/initializers/append_points.rb +70 -0
  84. data/config/initializers/assets.rb +1 -0
  85. data/config/initializers/configuration.rb +29 -0
  86. data/config/initializers/rack_attack.rb +11 -0
  87. data/config/initializers/recaptcha.rb +19 -0
  88. data/config/initializers/scheduled_jobs.rb +8 -0
  89. data/config/locales/en.yml +104 -0
  90. data/config/routes.rb +21 -0
  91. data/lib/tasks/verify.rake +16 -0
  92. data/lib/workarea/mailer_previews/storefront/review_mailer_preview.rb +10 -0
  93. data/lib/workarea/reviews.rb +13 -0
  94. data/lib/workarea/reviews/engine.rb +12 -0
  95. data/lib/workarea/reviews/version.rb +5 -0
  96. data/test/dummy/Rakefile +6 -0
  97. data/test/dummy/app/assets/config/manifest.js +4 -0
  98. data/test/dummy/app/assets/images/.keep +0 -0
  99. data/test/dummy/app/assets/javascripts/application.js +13 -0
  100. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  101. data/test/dummy/app/controllers/application_controller.rb +3 -0
  102. data/test/dummy/app/controllers/concerns/.keep +0 -0
  103. data/test/dummy/app/helpers/application_helper.rb +2 -0
  104. data/test/dummy/app/jobs/application_job.rb +2 -0
  105. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  106. data/test/dummy/app/models/concerns/.keep +0 -0
  107. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  108. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  109. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  110. data/test/dummy/bin/bundle +3 -0
  111. data/test/dummy/bin/rails +4 -0
  112. data/test/dummy/bin/rake +4 -0
  113. data/test/dummy/bin/setup +34 -0
  114. data/test/dummy/bin/update +29 -0
  115. data/test/dummy/config.ru +5 -0
  116. data/test/dummy/config/application.rb +25 -0
  117. data/test/dummy/config/boot.rb +5 -0
  118. data/test/dummy/config/cable.yml +9 -0
  119. data/test/dummy/config/environment.rb +5 -0
  120. data/test/dummy/config/environments/development.rb +55 -0
  121. data/test/dummy/config/environments/production.rb +86 -0
  122. data/test/dummy/config/environments/test.rb +43 -0
  123. data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
  124. data/test/dummy/config/initializers/assets.rb +11 -0
  125. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  126. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  127. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  128. data/test/dummy/config/initializers/inflections.rb +16 -0
  129. data/test/dummy/config/initializers/mime_types.rb +4 -0
  130. data/test/dummy/config/initializers/new_framework_defaults.rb +21 -0
  131. data/test/dummy/config/initializers/session_store.rb +3 -0
  132. data/test/dummy/config/initializers/workarea.rb +5 -0
  133. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  134. data/test/dummy/config/locales/en.yml +23 -0
  135. data/test/dummy/config/puma.rb +47 -0
  136. data/test/dummy/config/routes.rb +5 -0
  137. data/test/dummy/config/secrets.yml +22 -0
  138. data/test/dummy/config/spring.rb +6 -0
  139. data/test/dummy/db/seeds.rb +2 -0
  140. data/test/dummy/lib/assets/.keep +0 -0
  141. data/test/dummy/log/.keep +0 -0
  142. data/test/factories/reviews.rb +32 -0
  143. data/test/fixtures/reviews.csv +5 -0
  144. data/test/helpers/workarea/admin/reviews_helper_test.rb +17 -0
  145. data/test/helpers/workarea/storefront/reviews_helper_test.rb +19 -0
  146. data/test/integration/workarea/admin/reviews_integration_test.rb +33 -0
  147. data/test/integration/workarea/storefront/review_requests_integration_test.rb +63 -0
  148. data/test/integration/workarea/storefront/reviews_integration_test.rb +82 -0
  149. data/test/javascripts/fixtures/product_review_ajax_submit.html.haml +4 -0
  150. data/test/javascripts/product_review_ajax_submit_spec.js +28 -0
  151. data/test/javascripts/spec_helper.js +23 -0
  152. data/test/models/workarea/review/request_test.rb +18 -0
  153. data/test/models/workarea/review_test.rb +94 -0
  154. data/test/models/workarea/search/storefront/product_test.decorator +14 -0
  155. data/test/queries/workarea/review_request_params_test.rb +64 -0
  156. data/test/services/workarea/create_review_test.rb +131 -0
  157. data/test/system/workarea/admin/review_system_test.rb +96 -0
  158. data/test/system/workarea/storefront/review_request_system_test.rb +34 -0
  159. data/test/system/workarea/storefront/review_system_test.rb +113 -0
  160. data/test/teaspoon_env.rb +10 -0
  161. data/test/test_helper.rb +11 -0
  162. data/test/workers/workarea/create_review_requests_test.rb +38 -0
  163. data/test/workers/workarea/schedule_review_requests_test.rb +115 -0
  164. data/test/workers/workarea/send_review_requests_test.rb +30 -0
  165. data/workarea-reviews.gemspec +22 -0
  166. metadata +241 -0
@@ -0,0 +1,9 @@
1
+ module Workarea
2
+ decorate Search::CategoryBrowse, with: :reviews do
3
+ class_methods do
4
+ def available_sorts
5
+ super.tap { |sorts| sorts << Sort.top_rated }
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Workarea
2
+ decorate Search::ProductSearch, with: :reviews do
3
+ class_methods do
4
+ def available_sorts
5
+ super.tap { |sorts| sorts << Sort.top_rated }
6
+ end
7
+ end
8
+ end
9
+ end
@@ -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,7 @@
1
+ module Workarea
2
+ decorate Admin::ProductViewModel, with: :reviews do
3
+ def pending_reviews_count
4
+ Review.pending.where(product_id: model.id).count
5
+ end
6
+ end
7
+ 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,13 @@
1
+ module Workarea
2
+ decorate Storefront::ProductViewModel, with: :reviews do
3
+ def has_reviews?
4
+ total_reviews > 0
5
+ end
6
+
7
+ def reviews
8
+ @reviews ||= Review
9
+ .find_for_product(model.id)
10
+ .order(created_at: :desc)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ module Workarea
2
+ module Storefront
3
+ class ReviewViewModel < ApplicationViewModel
4
+ def requires_public_info?
5
+ anonymous? || user.public_info.blank?
6
+ end
7
+
8
+ def user
9
+ return if anonymous?
10
+ @user ||= User.find(user_id)
11
+ end
12
+ end
13
+ end
14
+ 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,5 @@
1
+ .grid__cell
2
+ = link_to reviews_path(q: %{"#{model.id}"}, sort: 'newest') do
3
+ = t('workarea.admin.catalog_products.reviews_link')
4
+ - if model.pending_reviews_count > 0
5
+ = t('workarea.admin.catalog_products.pending', pending: model.pending_reviews_count)
@@ -0,0 +1 @@
1
+ %li= link_to t('workarea.admin.dashboards.marketing.reviews'), reviews_path, class: 'dashboard__navigation-link'
@@ -0,0 +1,3 @@
1
+ %li{ class: "primary-nav__item" }
2
+ = link_to reviews_path, class: navigation_link_classes(reviews_path) do
3
+ = t('workarea.admin.reviews.menu.product_reviews', count: Workarea::Review.pending.count)
@@ -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