Compare commits

..

2 Commits

Author SHA1 Message Date
Jean-Baptiste Bellet
e4ad6d736b Canceling an order: clicking on cancel btn or cancel action in dropdown 2023-04-20 13:53:37 +02:00
basilawwad
9f30471373 Use a shared_examples for the order cancellation tests 2023-04-20 12:28:27 +02:00
220 changed files with 2047 additions and 2348 deletions

View File

@@ -5,8 +5,6 @@
#
# cp .env.development .env.local
VERBOSE_QUERY_LOGS=true
SECRET_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
OFN_REDIS_URL="redis://localhost:6379/1"

View File

@@ -18,7 +18,7 @@ permissions:
jobs:
knapsack_rspec_controllers:
runs-on: ubuntu-22.04
runs-on: ubuntu-20.04
services:
postgres:
image: postgres:10
@@ -86,7 +86,7 @@ jobs:
bundle exec rake knapsack_pro:rspec
knapsack_rspec_models:
runs-on: ubuntu-22.04
runs-on: ubuntu-20.04
services:
postgres:
image: postgres:10
@@ -155,7 +155,7 @@ jobs:
bundle exec rake knapsack_pro:rspec
knapsack_rspec_system_admin:
runs-on: ubuntu-22.04
runs-on: ubuntu-20.04
services:
postgres:
image: postgres:10
@@ -233,7 +233,7 @@ jobs:
if-no-files-found: ignore
knapsack_rspec_system_consumer:
runs-on: ubuntu-22.04
runs-on: ubuntu-20.04
services:
postgres:
image: postgres:10
@@ -311,7 +311,7 @@ jobs:
if-no-files-found: ignore
knapsack_rspec_engines:
runs-on: ubuntu-22.04
runs-on: ubuntu-20.04
services:
postgres:
image: postgres:10
@@ -389,7 +389,7 @@ jobs:
if-no-files-found: ignore
knapsack_rspec_test_the_rest:
runs-on: ubuntu-22.04
runs-on: ubuntu-20.04
services:
postgres:
image: postgres:10
@@ -459,7 +459,7 @@ jobs:
bundle exec rake knapsack_pro:rspec
non_knapsack_jest_karma:
runs-on: ubuntu-22.04
runs-on: ubuntu-20.04
services:
postgres:
image: postgres:10

View File

@@ -40,7 +40,6 @@ Metrics/BlockLength:
"resources",
"scenario",
"shared_examples",
"shared_examples_for",
"xdescribe",
]

View File

@@ -1,11 +1,41 @@
# This configuration was generated by
# `rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 1400 --no-auto-gen-timestamp`
# using RuboCop version 1.50.2.
# `rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 1400`
# on 2023-04-14 06:27:24 UTC using RuboCop version 1.50.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
# Offense count: 4
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: TreatCommentsAsGroupSeparators, ConsiderPunctuation, Include.
# Include: **/*.gemfile, **/Gemfile, **/gems.rb
Bundler/OrderedGems:
Exclude:
- 'Gemfile'
# Offense count: 4
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: Severity, Include.
# Include: **/*.gemspec
Gemspec/DeprecatedAttributeAssignment:
Exclude:
- 'engines/catalog/catalog.gemspec'
- 'engines/dfc_provider/dfc_provider.gemspec'
- 'engines/order_management/order_management.gemspec'
- 'engines/web/web.gemspec'
# Offense count: 4
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: Severity, Include.
# Include: **/*.gemspec
Gemspec/RequireMFA:
Exclude:
- 'engines/catalog/catalog.gemspec'
- 'engines/dfc_provider/dfc_provider.gemspec'
- 'engines/order_management/order_management.gemspec'
- 'engines/web/web.gemspec'
# Offense count: 4
# Configuration parameters: Severity, Include.
# Include: **/*.gemspec
@@ -84,6 +114,13 @@ Layout/EmptyLinesAroundBlockBody:
- 'spec/requests/checkout/concurrency_spec.rb'
- 'spec/system/admin/order_cycles/list_spec.rb'
# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: AllowForAlignment, AllowBeforeTrailingComments, ForceEqualSignAlignment.
Layout/ExtraSpacing:
Exclude:
- 'spec/spec_helper.rb'
# Offense count: 2
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle, IndentationWidth.
@@ -199,7 +236,7 @@ Layout/LineEndStringConcatenationIndentation:
- 'spec/system/consumer/cookies_spec.rb'
- 'spec/system/consumer/shopping/cart_spec.rb'
# Offense count: 615
# Offense count: 605
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns.
# URISchemes: http, https
@@ -412,7 +449,7 @@ Layout/TrailingEmptyLines:
Exclude:
- 'Rakefile'
# Offense count: 70
# Offense count: 67
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: AllowInHeredoc.
Layout/TrailingWhitespace:

View File

@@ -71,5 +71,5 @@ From here, your pull request will progress through the [Review, Test, Merge & De
[slack-dev]: https://openfoodnetwork.slack.com/messages/C2GQ45KNU
[ofn-transifex]: https://www.transifex.com/open-food-foundation/open-food-network/
[i18n]: https://github.com/openfoodfoundation/openfoodnetwork/wiki/Internationalisation-%28i18n%29
[welcome-dev]: https://github.com/orgs/openfoodfoundation/projects/5
[welcome-dev]: https://github.com/orgs/openfoodfoundation/projects/2
[ci]: https://github.com/openfoodfoundation/openfoodnetwork/wiki/Continuous-Integration

View File

@@ -14,11 +14,11 @@ gem "aws-sdk-s3", require: false
gem "image_processing"
gem 'activemerchant', '>= 1.78.0'
gem 'rexml'
gem 'angular-rails-templates', '>= 0.3.0'
gem 'awesome_nested_set'
gem 'ransack', '~> 2.6.0'
gem 'responders'
gem 'rexml'
gem 'webpacker', '~> 5'
gem 'i18n'
@@ -70,8 +70,8 @@ gem 'rswag-api'
gem 'rswag-ui'
gem 'omniauth_openid_connect'
gem 'omniauth-rails_csrf_protection'
gem 'openid_connect', '~> 1.3'
gem 'omniauth-rails_csrf_protection'
gem 'angularjs-rails', '1.8.0'
gem 'bugsnag'
@@ -150,7 +150,6 @@ group :test, :development do
gem 'capybara'
gem 'cuprite'
gem 'database_cleaner', require: false
gem 'debug', '>= 1.0.0'
gem "factory_bot_rails", '6.2.0', require: false
gem 'fuubar', '~> 2.5.1'
gem 'json_spec', '~> 1.1.4'
@@ -161,6 +160,7 @@ group :test, :development do
gem 'rswag-specs'
gem 'shoulda-matchers'
gem 'timecop'
gem 'debug', '>= 1.0.0'
end
group :test do
@@ -175,11 +175,10 @@ end
group :development do
gem 'debugger-linecache'
gem 'rails-erd'
gem 'foreman'
gem 'listen'
gem 'pry', '~> 0.13.0'
gem 'query_count'
gem 'rails-erd'
gem 'rubocop'
gem 'rubocop-rails'
gem 'spring'

View File

@@ -137,7 +137,7 @@ GEM
activerecord (>= 6.0, < 7.1)
acts_as_list (1.0.4)
activerecord (>= 4.2)
addressable (2.8.4)
addressable (2.8.2)
public_suffix (>= 2.0.2, < 6.0)
aes_key_wrap (1.1.0)
afm (0.2.2)
@@ -157,7 +157,7 @@ GEM
awesome_nested_set (3.5.0)
activerecord (>= 4.0.0, < 7.1)
aws-eventstream (1.2.0)
aws-partitions (1.750.0)
aws-partitions (1.742.0)
aws-sdk-core (3.171.0)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.651.0)
@@ -166,7 +166,7 @@ GEM
aws-sdk-kms (1.63.0)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.121.0)
aws-sdk-s3 (1.120.1)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4)
@@ -235,10 +235,10 @@ GEM
database_cleaner-core (~> 2.0.0)
database_cleaner-core (2.0.1)
date (3.3.3)
ddtrace (1.11.0)
ddtrace (1.10.1)
debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
libdatadog (~> 2.0.0.1.0)
libddwaf (~> 1.8.2.0.0)
libddwaf (~> 1.6.2.0.0)
msgpack
debase-ruby_core_source (3.2.0)
debug (1.7.2)
@@ -338,7 +338,7 @@ GEM
hiredis (0.6.3)
htmlentities (4.3.4)
httpclient (2.8.3)
i18n (1.13.0)
i18n (1.12.0)
concurrent-ruby (~> 1.0)
i18n-js (3.9.2)
i18n (>= 0.6.6)
@@ -373,14 +373,14 @@ GEM
jsonapi-serializer (2.2.0)
activesupport (>= 4.2)
jwt (2.7.0)
knapsack_pro (3.10.0)
knapsack_pro (3.9.0)
rake
launchy (2.5.0)
addressable (~> 2.7)
letter_opener (1.8.1)
launchy (>= 2.2, < 3)
libdatadog (2.0.0.1.0)
libddwaf (1.8.2.0.0)
libddwaf (1.6.2.0.0)
ffi (~> 1.0)
libv8-node (16.10.0.0)
listen (3.8.0)
@@ -405,7 +405,7 @@ GEM
rake
mini_magick (4.11.0)
mini_mime (1.1.2)
mini_portile2 (2.8.2)
mini_portile2 (2.8.1)
mini_racer (0.6.3)
libv8-node (~> 16.10.0.0)
minitest (5.18.0)
@@ -413,7 +413,7 @@ GEM
money (~> 6.12)
money (6.16.0)
i18n (>= 0.6.4, <= 2)
msgpack (1.7.0)
msgpack (1.6.1)
multi_json (1.15.0)
multi_xml (0.6.0)
net-imap (0.3.4)
@@ -487,12 +487,9 @@ GEM
public_suffix (5.0.1)
puma (6.2.2)
nio4r (~> 2.0)
query_count (1.1.1)
activerecord (>= 4.2)
railties (>= 4.2)
raabro (1.4.0)
racc (1.6.2)
rack (2.2.7)
rack (2.2.6.4)
rack-mini-profiler (2.3.4)
rack (>= 1.2.0)
rack-oauth2 (1.21.3)
@@ -586,7 +583,7 @@ GEM
rspec-core (~> 3.12.0)
rspec-expectations (~> 3.12.0)
rspec-mocks (~> 3.12.0)
rspec-core (3.12.2)
rspec-core (3.12.1)
rspec-support (~> 3.12.0)
rspec-expectations (3.12.2)
diff-lcs (>= 1.2.0, < 2.0)
@@ -605,14 +602,14 @@ GEM
rspec-retry (0.6.2)
rspec-core (> 3.3)
rspec-support (3.12.0)
rswag-api (2.9.0)
rswag-api (2.8.0)
railties (>= 3.1, < 7.1)
rswag-specs (2.9.0)
rswag-specs (2.8.0)
activesupport (>= 3.1, < 7.1)
json-schema (>= 2.2, < 4.0)
railties (>= 3.1, < 7.1)
rspec-core (>= 2.14)
rswag-ui (2.9.0)
rswag-ui (2.8.0)
actionpack (>= 3.1, < 7.1)
railties (>= 3.1, < 7.1)
rubocop (1.50.2)
@@ -655,11 +652,11 @@ GEM
semantic_range (3.0.0)
shoulda-matchers (5.3.0)
activesupport (>= 5.2.0)
sidekiq (7.1.0)
sidekiq (7.0.8)
concurrent-ruby (< 2)
connection_pool (>= 2.3.0)
rack (>= 2.2.4)
redis-client (>= 0.14.0)
redis-client (>= 0.11.0)
sidekiq-scheduler (5.0.2)
rufus-scheduler (~> 3.2)
sidekiq (>= 6, < 8)
@@ -700,7 +697,7 @@ GEM
rack (>= 2, < 4)
railties (>= 5.2, < 8)
redis (>= 4.0, < 6.0)
stringex (2.8.6)
stringex (2.8.5)
stripe (8.5.0)
swd (1.3.0)
activesupport (>= 3)
@@ -729,7 +726,7 @@ GEM
activemodel (>= 3.0.0)
public_suffix
vcr (6.1.0)
view_component (3.0.0)
view_component (2.82.0)
activesupport (>= 5.2.0, < 8.0)
concurrent-ruby (~> 1.0)
method_source (~> 1.0)
@@ -860,7 +857,6 @@ DEPENDENCIES
private_address_check
pry (~> 0.13.0)
puma
query_count
rack-mini-profiler (< 3.0.0)
rack-rewrite
rack-timeout

View File

@@ -12,6 +12,5 @@ angular.module("ofn.admin", [
"admin.orders"
]).config ($httpProvider, $locationProvider, $qProvider) ->
$httpProvider.defaults.headers.common["Accept"] = "application/json, text/javascript, */*"
# for the next line, you should also probably check file: app/assets/javascripts/admin/utils/utils.js.coffee
$locationProvider.hashPrefix('')
$qProvider.errorOnUnhandledRejections(false)

View File

@@ -15,7 +15,7 @@ $(document).ready(function() {
console.log(msg);
});
}
$('.admin-order-edit-form a.ship').click(handle_ship_click);
$('[data-hook=admin_order_edit_form] a.ship').click(handle_ship_click);
//handle shipping method edit click
$('a.edit-method').click(toggleMethodEdit);
@@ -37,7 +37,7 @@ $(document).ready(function() {
console.log(msg);
});
}
$('.admin-order-edit-form a.save-method').click(handle_shipping_method_save);
$('[data-hook=admin_order_edit_form] a.save-method').click(handle_shipping_method_save);
//handle tracking info edit/delete
@@ -64,8 +64,8 @@ $(document).ready(function() {
return Spree.url( Spree.routes.orders_api + "/" + order_number + "/shipments/" + shipmentNumber + ".json");
}
$('.admin-order-edit-form a.save-tracking').click(saveTrackingInfo);
$('.admin-order-edit-form a.delete-tracking').click(deleteTrackingInfo);
$('[data-hook=admin_order_edit_form] a.save-tracking').click(saveTrackingInfo);
$('[data-hook=admin_order_edit_form] a.delete-tracking').click(deleteTrackingInfo);
// handle note edit/delete
@@ -96,8 +96,8 @@ $(document).ready(function() {
});
}
$('.admin-order-edit-form a.save-note').click(saveNote);
$('.admin-order-edit-form a.delete-note').click(deleteNote);
$('[data-hook=admin_order_edit_form] a.save-note').click(saveNote);
$('[data-hook=admin_order_edit_form] a.delete-note').click(deleteNote);
// Makes API call for notes/tracking info
makeApiCall = function(url, params) {

View File

@@ -1,4 +1,3 @@
angular.module("admin.utils", ["templates", "ngSanitize"]).config ($httpProvider, $locationProvider) ->
# for the next line, you should also probably check file: app/assets/javascripts/admin/admin_ofn.js.coffee
$locationProvider.hashPrefix('')
$httpProvider.defaults.headers.common["Accept"] = "application/json, text/javascript, */*"

View File

@@ -1,10 +1,9 @@
# frozen_string_literal: true
class ConfirmModalComponent < ModalComponent
def initialize(id:, confirm_actions: nil, controllers: nil, message: nil, confirm_reflexes: nil)
def initialize(id:, confirm_actions: nil, controllers: nil, message: nil)
super(id: id, close_button: true)
@confirm_actions = confirm_actions
@confirm_reflexes = confirm_reflexes
@controllers = controllers
@message = message
end

View File

@@ -7,4 +7,4 @@
.modal-actions
%input{ class: "button icon-plus #{close_button_class}", type: 'button', value: t('js.admin.modals.cancel'), "data-action": "click->modal#close" }
%input{ class: "button icon-plus primary", type: 'button', value: t('js.admin.modals.confirm'), "data-action": @confirm_actions, "data-reflex": @confirm_reflexes }
%input{ class: "button icon-plus primary", type: 'button', value: t('js.admin.modals.confirm'), "data-action": @confirm_actions }

View File

@@ -10,12 +10,5 @@ module WhiteLabel
# if the distributor has the hide_ofn_navigation preference set to true
# then we should hide the OFN navigation
@hide_ofn_navigation = distributor.hide_ofn_navigation
# if the distributor has the hide_ofn_navigation preference
# set to false, there is no need to check the white_label_logo preference
return unless @hide_ofn_navigation
@white_label_logo = distributor.white_label_logo
@white_label_distributor = distributor
end
end

View File

@@ -9,9 +9,11 @@ module Spree
helper CheckoutHelper
before_action :load_order, only: [:edit, :update, :fire, :resend,
:invoice, :print, :distribution]
before_action :load_distribution_choices, only: [:new, :edit, :update, :distribution]
:invoice, :print]
before_action :load_distribution_choices, only: [:new, :edit, :update]
# Ensure that the distributor is set for an order when
before_action :ensure_distribution, only: :new
before_action :require_distributor_abn, only: :invoice
respond_to :html, :json
@@ -19,20 +21,8 @@ module Spree
def new
@order = Order.create
@order.created_by = spree_current_user
@order.generate_order_number
@order.save
redirect_to spree.distribution_admin_order_path(@order)
end
def distribution
return if order_params.blank?
on_update
@order.assign_attributes(order_params)
return unless @order.save(context: :set_distribution_step)
redirect_to spree.admin_order_customer_path(@order)
redirect_to spree.edit_admin_order_url(@order)
end
def edit
@@ -43,7 +33,12 @@ module Spree
end
def update
on_update
@order.recreate_all_fees!
unless @order.cart?
@order.create_tax_charge!
@order.update_order!
end
if params[:set_distribution_step] && @order.update(order_params)
return redirect_to spree.admin_order_customer_path(@order)
@@ -110,15 +105,6 @@ module Spree
private
def on_update
@order.recreate_all_fees!
return if @order.cart?
@order.create_tax_charge!
@order.update_order!
end
def order_params
return params[:order] if params[:order].blank?
@@ -156,6 +142,17 @@ module Spree
ocs.closed +
ocs.undated
end
def ensure_distribution
unless @order
@order = Spree::Order.new
@order.generate_order_number
@order.save!
end
return if @order.distribution_set?
render 'set_distribution', locals: { order: @order }
end
end
end
end

View File

@@ -7,6 +7,7 @@ module Spree
before_action :load_data
before_action :validate_payment_method_provider, only: [:create]
before_action :load_hubs, only: [:new, :edit, :update]
before_action :validate_calculator_preferred_value, only: [:update]
respond_to :html
@@ -16,10 +17,6 @@ module Spree
@payment_method = payment_method_class.constantize.new(base_params)
@object = @payment_method
if !base_params["calculator_type"] && gateway_params["calculator_type"]
@payment_method.calculator_type = gateway_params["calculator_type"]
end
load_hubs
if @payment_method.save
@@ -47,7 +44,6 @@ module Spree
redirect_to spree.edit_admin_payment_method_path(@payment_method)
else
respond_with(@payment_method)
clear_preference_cache
end
end
@@ -186,23 +182,33 @@ module Spree
end
end
# Ensure the calculator to be updated is the correct type
if params_for_update["calculator_type"] && params_for_update["calculator_attributes"]
add_type_to_calculator_attributes(params_for_update)
end
params_for_update
end
end
def clear_preference_cache
@payment_method.calculator.preferences.each_key do |key|
Rails.cache.delete(@payment_method.calculator.preference_cache_key(key))
def validate_calculator_preferred_value
return if calculator_preferred_values.all? do |value|
preferred_value_from_params = gateway_params.dig(:calculator_attributes, value)
preferred_value_from_params.nil? || Float(preferred_value_from_params,
exception: false)
end
flash[:error] = I18n.t(:calculator_preferred_value_error)
redirect_to spree.edit_admin_payment_method_path(@payment_method)
end
def add_type_to_calculator_attributes(hash)
hash["calculator_attributes"]["type"] = hash["calculator_type"]
def calculator_preferred_values
[
:preferred_amount,
:preferred_flat_percent,
:preferred_flat_percent,
:preferred_first_item,
:preferred_additional_item,
:preferred_max_items,
:preferred_normal_amount,
:preferred_discount_amount,
:preferred_minimal_amount
]
end
end
end

View File

@@ -87,10 +87,4 @@ module EnterprisesHelper
main_app.producers_url
end
end
def main_logo_link(enterprise)
return enterprise.white_label_logo_link if enterprise&.white_label_logo_link.present?
main_app.root_path
end
end

View File

@@ -29,8 +29,8 @@ module Spree
def preference_field_tag(name, value, options)
case options[:type]
when :integer, :decimal
number_field_tag(name, value, preference_field_options(options))
when :integer
text_field_tag(name, value, preference_field_options(options))
when :boolean
hidden_field_tag(name, 0) +
check_box_tag(name, 1, value, preference_field_options(options))
@@ -49,8 +49,8 @@ module Spree
def preference_field_for(form, field, options, object)
case options[:type]
when :integer, :decimal
form.number_field(field, preference_field_options(options))
when :integer
form.text_field(field, preference_field_options(options))
when :boolean
form.check_box(field, preference_field_options(options))
when :string
@@ -80,24 +80,26 @@ module Spree
end
def preference_field_options(options)
field_options =
case options[:type]
when :integer
{ size: 10, class: 'input_integer', step: 1 }
when :decimal
# Allow any number of decimal places
{ size: 10, class: 'input_integer', step: :any }
when :boolean
{}
when :string
{ size: 10, class: 'input_string fullwidth' }
when :password
{ size: 10, class: 'password_string fullwidth' }
when :text
{ rows: 15, cols: 85, class: 'fullwidth' }
else
{ size: 10, class: 'input_string fullwidth' }
end
field_options = case options[:type]
when :integer
{ size: 10,
class: 'input_integer' }
when :boolean
{}
when :string
{ size: 10,
class: 'input_string fullwidth' }
when :password
{ size: 10,
class: 'password_string fullwidth' }
when :text
{ rows: 15,
cols: 85,
class: 'fullwidth' }
else
{ size: 10,
class: 'input_string fullwidth' }
end
field_options.merge!(
readonly: options[:readonly],

View File

@@ -1,11 +1,14 @@
# frozen_string_literal: false
require 'spree/localized_number'
module Calculator
class FlatPercentItemTotal < Spree::Calculator
extend Spree::LocalizedNumber
preference :flat_percent, :decimal, default: 0
validates :preferred_flat_percent,
numericality: true
localize_number :preferred_flat_percent
def self.description
Spree.t(:flat_percent)

View File

@@ -1,15 +1,18 @@
# frozen_string_literal: true
require 'spree/localized_number'
class Calculator::FlatPercentPerItem < Spree::Calculator
# Spree's FlatPercentItemTotal calculator sums all amounts, and then calculates a percentage
# on them.
# In the cart, we display line item individual amounts rounded, so to have consistent
# calculations we do the same internally. Here, we round adjustments at the individual
# item level first, then multiply by the item quantity.
extend Spree::LocalizedNumber
preference :flat_percent, :decimal, default: 0
validates :preferred_flat_percent,
numericality: true
localize_number :preferred_flat_percent
def self.description
I18n.t(:flat_percent_per_item)

View File

@@ -1,11 +1,14 @@
# frozen_string_literal: false
require 'spree/localized_number'
module Calculator
class FlatRate < Spree::Calculator
extend Spree::LocalizedNumber
preference :amount, :decimal, default: 0
validates :preferred_amount,
numericality: true
localize_number :preferred_amount
def self.description
I18n.t(:flat_rate_per_order)

View File

@@ -1,14 +1,17 @@
# frozen_string_literal: false
require 'spree/localized_number'
module Calculator
class FlexiRate < Spree::Calculator
extend Spree::LocalizedNumber
preference :first_item, :decimal, default: 0.0
preference :additional_item, :decimal, default: 0.0
preference :max_items, :integer, default: 0
validates :preferred_first_item,
:preferred_additional_item,
numericality: true
localize_number :preferred_first_item,
:preferred_additional_item
def self.description
I18n.t(:flexible_rate)

View File

@@ -1,11 +1,14 @@
# frozen_string_literal: false
require 'spree/localized_number'
module Calculator
class PerItem < Spree::Calculator
extend Spree::LocalizedNumber
preference :amount, :decimal, default: 0
validates :preferred_amount,
numericality: true
localize_number :preferred_amount
def self.description
I18n.t(:flat_rate_per_item)

View File

@@ -1,15 +1,18 @@
# frozen_string_literal: false
require 'spree/localized_number'
module Calculator
class PriceSack < Spree::Calculator
extend Spree::LocalizedNumber
preference :minimal_amount, :decimal, default: 0
preference :normal_amount, :decimal, default: 0
preference :discount_amount, :decimal, default: 0
validates :preferred_minimal_amount,
:preferred_normal_amount,
:preferred_discount_amount,
numericality: true
localize_number :preferred_minimal_amount,
:preferred_normal_amount,
:preferred_discount_amount
def self.description
I18n.t(:price_sack)

View File

@@ -15,10 +15,6 @@ class Enterprise < ApplicationRecord
medium: { resize_to_fill: [720, 156] },
large: { resize_to_fill: [1200, 260] },
}.freeze
WHITE_LABEL_LOGO_SIZES = {
default: { gravity: "Center", resize_to_fill: [217, 44] },
mobile: { gravity: "Center", resize_to_fill: [75, 26] },
}.freeze
VALID_INSTAGRAM_REGEX = %r{\A[a-zA-Z0-9._]{1,30}([^/-]*)\z}
searchable_attributes :sells, :is_primary_producer, :name
@@ -88,7 +84,6 @@ class Enterprise < ApplicationRecord
has_one_attached :logo
has_one_attached :promo_image
has_one_attached :terms_and_conditions
has_one_attached :white_label_logo
validates :logo,
processable_image: true,
@@ -307,14 +302,6 @@ class Enterprise < ApplicationRecord
)
end
def white_label_logo_url(name = :default)
return unless white_label_logo.variable?
Rails.application.routes.url_helpers.url_for(
white_label_logo.variant(WHITE_LABEL_LOGO_SIZES[name])
)
end
def website
strip_url self[:website]
end

View File

@@ -31,6 +31,6 @@ class ReportBlob < ActiveStorage::Blob
end
def result
@result ||= download.force_encoding(Encoding::UTF_8)
@result ||= download
end
end

View File

@@ -274,7 +274,7 @@ module Spree
# Enterprise User can access orders that are placed inside a OC they coordinate
order.order_cycle&.coordinated_by?(user)
end
can [:admin, :bulk_management, :managed, :distribution], Spree::Order do
can [:admin, :bulk_management, :managed], Spree::Order do
user.admin? || user.enterprises.any?(&:is_distributor)
end
can [:admin, :create, :show, :poll], :invoice

View File

@@ -88,6 +88,7 @@ module Spree
# Default mail headers settings
preference :mails_from, :string, default: 'ofn@example.com'
preference :mail_bcc, :string, default: 'ofn@example.com'
preference :intercept_email, :string, default: nil
# Default smtp settings
preference :mail_host, :string, default: 'localhost'

View File

@@ -97,8 +97,6 @@ module Spree
validates :email, presence: true,
format: /\A([\w.%+\-']+)@([\w\-]+\.)+(\w{2,})\z/i,
if: :require_email
validates :order_cycle, presence: true, on: :set_distribution_step
validates :distributor, presence: true, on: :set_distribution_step
make_permalink field: :number

View File

@@ -63,7 +63,7 @@ module Spree
# first unshipped that's leaving from a stock_location that stocks this variant
def determine_target_shipment(variant)
target_shipment = order.shipments.detect do |shipment|
(shipment.ready? || shipment.pending?) && shipment.contains?(variant)
(shipment.ready? || shipment.pending?) && shipment.include?(variant)
end
target_shipment || order.shipments.detect do |shipment|

View File

@@ -17,7 +17,6 @@ module Spree
validates :name, presence: true
validate :distributor_validation
validates_associated :calculator
after_initialize :init
@@ -41,8 +40,9 @@ module Spree
where(id: non_unique_matches.map(&:id))
}
scope :for_distributor, ->(distributor) {
joins(:distributors).where('enterprises.id = ?', distributor)
scope :for_distributor, lambda { |distributor|
joins(:distributors).
where('enterprises.id = ?', distributor)
}
scope :for_subscriptions, -> { where(type: Subscription::ALLOWED_PAYMENT_METHOD_TYPES) }

View File

@@ -22,8 +22,7 @@ module Spree
when :password
self[:value].to_s
when :decimal
BigDecimal(self[:value].to_s, exception: false)&.round(2, BigDecimal::ROUND_HALF_UP) ||
self[:value]
BigDecimal(self[:value].to_s).round(2, BigDecimal::ROUND_HALF_UP)
when :integer
self[:value].to_i
when :boolean

View File

@@ -117,7 +117,7 @@ module Spree
value.to_s
when :decimal
value = 0 if value.blank?
BigDecimal(value.to_s, exception: false)&.round(2, BigDecimal::ROUND_HALF_UP) || value
BigDecimal(value.to_s).round(2, BigDecimal::ROUND_HALF_UP)
when :integer
value.to_i
when :boolean

View File

@@ -246,7 +246,7 @@ module Spree
@tracking_url ||= shipping_method.build_tracking_url(tracking)
end
def contains?(variant)
def include?(variant)
inventory_units_for(variant).present?
end

View File

@@ -61,7 +61,7 @@ module Spree
# Here we allow checkout with shipping methods without zones (see issue #3928 for details)
# and also checkout with addresses outside of the zones of the selected shipping method
# This method could be used, like in Spree, to validate shipping method zones on checkout.
def delivers_to?(address)
def include?(address)
address.present?
end

View File

@@ -69,8 +69,7 @@ module Spree
return 0 unless category
address ||= Address.new(country_id: DefaultCountry.id)
rate = category.tax_rates
.detect { |tax_rate| tax_rate.zone.contains_address? address }.try(:amount)
rate = category.tax_rates.detect { |tax_rate| tax_rate.zone.include? address }.try(:amount)
rate || 0
end

View File

@@ -24,7 +24,7 @@ module Spree
# do nothing - just here to satisfy the form
end
def contains_address?(address)
def include?(address)
return false unless address
members.any? do |zone_member|
@@ -44,7 +44,7 @@ module Spree
def self.match(address)
return unless matches = includes(:zone_members).
order('zone_members_count', 'created_at').
select { |zone| zone.contains_address? address }
select { |zone| zone.include? address }
['state', 'country'].each do |zone_kind|
if match = matches.detect { |zone| zone_kind == zone.kind }

View File

@@ -1,12 +0,0 @@
# frozen_string_literal: true
module EnterpriseConcern
extend ActiveSupport::Concern
included do
before_reflex do
@enterprise = Enterprise.find_by(permalink: params[:id])
authorize! :update, @enterprise
end
end
end

View File

@@ -1,26 +0,0 @@
# frozen_string_literal: true
class WhiteLabelReflex < ApplicationReflex
include EnterpriseConcern
delegate :view_context, to: :controller
def remove_logo
@enterprise.update!(white_label_logo: nil)
# delete the white_label_logo_link attribute as well since it has no meaning without the logo
@enterprise.update!(white_label_logo_link: "")
f = ActionView::Helpers::FormBuilder.new(:enterprise, @enterprise, view_context, {})
html = with_locale {
render(partial: "admin/enterprises/form/white_label",
locals: { f: f, enterprise: @enterprise })
}
morph "#white_label_panel", html
flash[:success] = with_locale {
I18n.t("admin.enterprises.form.white_label.remove_logo_success")
}
cable_ready.dispatch_event(name: "modal:close")
morph "#flashes", render(partial: "shared/flashes", locals: { flashes: flash })
end
end

View File

@@ -14,8 +14,7 @@ module Api
:logo, :promo_image, :terms_and_conditions,
:terms_and_conditions_file_name, :terms_and_conditions_updated_at,
:preferred_invoice_order_by_supplier, :preferred_product_low_stock_display,
:visible, :hide_ofn_navigation, :white_label_logo,
:white_label_logo_link
:visible, :hide_ofn_navigation
has_one :owner, serializer: Api::Admin::UserSerializer
has_many :users, serializer: Api::Admin::UserSerializer
@@ -30,10 +29,6 @@ module Api
attachment_urls(object.promo_image, Enterprise::PROMO_IMAGE_SIZES)
end
def white_label_logo
attachment_urls(object.white_label_logo, Enterprise::WHITE_LABEL_LOGO_SIZES)
end
def terms_and_conditions
return unless object.terms_and_conditions.attached?

View File

@@ -10,7 +10,7 @@ module Api
:phone, :whatsapp_phone, :whatsapp_url, :visible, :email_address, :hash, :logo,
:promo_image, :path, :category, :active, :producers, :orders_close_at, :hubs,
:taxons, :supplied_taxons, :pickup, :delivery, :preferred_product_low_stock_display,
:hide_ofn_navigation, :white_label_logo, :white_label_logo_link
:hide_ofn_navigation
has_one :address, serializer: Api::AddressSerializer
has_many :supplied_properties, serializer: Api::PropertySerializer
@@ -49,10 +49,6 @@ module Api
enterprise.promo_image_url(:large)
end
def white_label_logo
enterprise.white_label_logo_url
end
def path
enterprise_shop_path(enterprise)
end

View File

@@ -22,6 +22,7 @@ class MailConfiguration
secure_connection_type: ENV.fetch('MAIL_SECURE_CONNECTION', 'None'),
mails_from: ENV.fetch('MAILS_FROM', "no-reply@#{ENV.fetch('MAIL_DOMAIN')}"),
mail_bcc: ENV.fetch('MAIL_BCC', ''),
intercept_email: ''
}
end

View File

@@ -35,7 +35,7 @@ module PermittedAttributes
:show_customer_names_to_suppliers, :preferred_shopfront_product_sorting_method,
:preferred_invoice_order_by_supplier,
:preferred_product_low_stock_display,
:hide_ofn_navigation, :white_label_logo, :white_label_logo_link
:hide_ofn_navigation
]
end
end

View File

@@ -8,6 +8,6 @@
- @preference_sections.each do |preference_section|
= render 'fieldset', name: preference_section[:name], preferences: preference_section[:preferences]
.form-buttons.filter-actions.actions
.form-buttons.filter-actions.actions{"data-hook" => "buttons"}
= button t(:update), 'icon-refresh'
= link_to_with_icon 'icon-remove', t(:cancel), main_app.edit_admin_contents_path, class: 'button'

View File

@@ -10,7 +10,7 @@
%col{style: "width: 18%;"}/
%col{style: "width: 25%;"}/
%thead
%tr
%tr{"data-hook" => "enterprises_header"}
%th= t('.name')
%th= t('.role')
- if spree_current_user.admin?
@@ -32,7 +32,7 @@
%td= enterprise_form.check_box :visible, {}, 'public', 'hidden'
- if spree_current_user.admin?
%td= enterprise_form.select :owner_id, enterprise.users.map{ |e| [ e.email, e.id ] }, {}, class: "select2 fullwidth"
%td
%td{"data-hook" => "admin_users_index_row_actions"}
= render 'actions', enterprise: enterprise
- if @enterprises.empty?
%tr

View File

@@ -1,21 +1,22 @@
%form#add_manager_modal{ 'data-reflex': 'submit->InviteManager#invite', 'data-reflex-serialize-form': true }
.margin-bottom-30.text-center
.text-big
= t('js.admin.modals.invite_title')
%div#add_manager_modal
%form{ "data-reflex": "submit->InviteManager#invite", "data-reflex-serialize-form": true }
.margin-bottom-30.text-center
.text-big
= t('js.admin.modals.invite_title')
- if success
%p.alert-box.ok= t('user_invited', email: email)
- if error
%p.alert-box.error= error
= text_field_tag :email, nil, class: 'fullwidth margin-bottom-20'
= hidden_field_tag :enterprise_id, @enterprise&.id || enterprise.id
.modal-actions
- if success
%input{ class: "button icon-plus secondary", type: 'button', value: t('js.admin.modals.close'), "data-action": "click->help-modal#close" }
- else
%input{ class: "button icon-plus secondary", type: 'button', value: t('js.admin.modals.cancel'), "data-action": "click->help-modal#close" }
= submit_tag "#{t('js.admin.modals.invite')}"
%p.alert-box.ok= t('user_invited', email: email)
- if error
%p.alert-box.error= error
= text_field_tag :email, nil, class: 'fullwidth margin-bottom-20'
= hidden_field_tag :enterprise_id, @enterprise&.id || enterprise.id
.modal-actions
- if success
%input{ class: "button icon-plus secondary", type: 'button', value: t('js.admin.modals.close'), "data-action": "click->help-modal#close" }
- else
%input{ class: "button icon-plus secondary", type: 'button', value: t('js.admin.modals.cancel'), "data-action": "click->help-modal#close" }
= submit_tag "#{t('js.admin.modals.invite')}"

View File

@@ -1,31 +1,6 @@
- @object ||= enterprise
.row
.three.columns.alpha
= f.label :hide_ofn_navigation, t('.hide_ofn_navigation')
.three.columns
= f.check_box :hide_ofn_navigation, { "data-controller": "checkbox-display", "data-checkbox-display-target-id-value": "white_label_logo" }
= f.check_box :hide_ofn_navigation
%div{id: "white_label_logo"}
.row
.three.columns.alpha
= f.label :white_label_logo, t('.upload_logo')
.three.columns
= image_tag @object.white_label_logo_url if @object.white_label_logo.present?
= f.file_field :white_label_logo, accept: "image/*"
- if @object.white_label_logo.present?
%button.button.small{ type: "button", "data-controller": "modal-link", "data-action": "click->modal-link#open", "data-modal-link-target-value": "remove_logo" }
= t('.remove_logo')
- if @object.white_label_logo.present?
.row
.three.columns.alpha
= f.label :white_label_logo_link, t('.white_label_logo_link_label')
.three.columns
= f.text_field :white_label_logo_link
- if @object.white_label_logo.present?
= render ConfirmModalComponent.new(id: "remove_logo", confirm_reflexes: "click->WhiteLabel#remove_logo" ) do
.margin-bottom-30
= t('.remove_logo_confirm')

View File

@@ -20,5 +20,5 @@
= check_box_tag 'preferences[enterprise_number_required_on_invoices?]', '1', Spree::Config[:enterprise_number_required_on_invoices?]
= label_tag nil, t('.enterprise_number_required_on_invoices?')
.form-buttons
.form-buttons{"data-hook" => "buttons"}
= button t(:update), 'icon-refresh'

View File

@@ -23,5 +23,5 @@
= preference_field_tag("preferences[#{:matomo_tag_manager_url}]", Spree::Config[:matomo_tag_manager_url], type: Spree::Config.preference_type(:matomo_tag_manager_url))
.warning.note= t('.config_instructions_tag_manager_html')
.form-buttons
.form-buttons{"data-hook" => "buttons"}
= button t(:update), 'icon-refresh'

View File

@@ -1,12 +1,12 @@
%fieldset.no-border-top
.add_producer_properties
.add_producer_properties{"data-hook" => "add_producer_properties"}
= image_pack_tag 'spinner.gif', :plugin => 'spree', :style => 'display:none;', :id => 'busy_indicator'
%table.index.sortable{"data-sortable-link" => main_app.update_positions_admin_enterprise_producer_properties_url(@enterprise)}
%table.index.sortable{"data-hook" => "", "data-sortable-link" => main_app.update_positions_admin_enterprise_producer_properties_url(@enterprise)}
%thead
%tr
%tr{"data-hook" => "producer_properties_header"}
%th{colspan: "2"}= t('admin.products.properties.property_name')
%th= t('admin.description')
%th.actions
%tbody#producer_properties
%tbody#producer_properties{"data-hook" => ""}
= f.fields_for :producer_properties do |pp_form|
= render 'admin/producer_properties/producer_property_fields', f: pp_form

View File

@@ -1,5 +1,5 @@
-# admin/admin.js.erb in spree requires id to start with "spree_" for sortable tables
%tr.product_property.fields{id: "spree_#{dom_id(f.object)}"}
%tr.product_property.fields{"data-hook" => "producer_property", id: "spree_#{dom_id(f.object)}"}
%td.no-border
%span.handle
= f.hidden_field :id

View File

@@ -1,5 +1,5 @@
- content_for :sub_menu do
%ul#sub_nav.inline-menu
%ul#sub_nav.inline-menu{"data-hook" => "admin_enterprise_sub_tabs"}
= tab :enterprises, url: main_app.admin_enterprises_path
= tab :enterprise_relationships, url: main_app.admin_enterprise_relationships_path
- if ENV["OPENID_APP_ID"].present? && ENV["OPENID_APP_SECRET"].present?

View File

@@ -1,4 +1,4 @@
- content_for :sub_menu do
%ul#sub_nav.inline-menu
%ul#sub_nav.inline-menu{"data-hook" => "admin_user_sub_tabs"}
= tab :users, url: spree.admin_users_path
= tab :roles, url: main_app.admin_enterprise_roles_path, match_path: '/enterprise_roles'

View File

@@ -14,7 +14,7 @@
= f.label :stripe_connect_enabled, t('.stripe_connect_enabled')
= f.check_box :stripe_connect_enabled, disabled: disabled
.row
.twelve.columns.alpha.omega.form-buttons
.twelve.columns.alpha.omega.form-buttons{"data-hook" => "buttons"}
= button t(:update), 'icon-refresh', value: "update"
%fieldset.no-border-bottom

View File

@@ -77,7 +77,7 @@
%td.price.align-center {{ item.price_estimate | localizeCurrency }}
%td.quantity {{ item.quantity }}
%td.total.align-center {{ (item.price_estimate * item.quantity) | localizeCurrency }}
%tbody#subtotal.no-border-top
%tbody#subtotal.no-border-top{"data-hook" => "admin_order_form_subtotal"}
%tr#subtotal-row
%td{:colspan => "3"}
%b
@@ -85,7 +85,7 @@
\:
%td.total.align-center
%span {{ subscription.estimatedSubtotal() | localizeCurrency }}
%tbody#order-total.grand-total.no-border-top
%tbody#order-total.grand-total.no-border-top{"data-hook" => "admin_order_form_total"}
%tr
%td{:colspan => "3"}
%b

View File

@@ -25,7 +25,7 @@
%td.total.align-center {{ (item.price_estimate * item.quantity) | localizeCurrency }}
%td.actions
%a.delete-item.icon-trash.no-text{ ng: { click: 'removeSubscriptionLineItem(item)'}, :href => "javascript:void(0)" }
%tbody#subtotal.no-border-top
%tbody#subtotal.no-border-top{"data-hook" => "admin_order_form_subtotal"}
%tr#subtotal-row
%td{:colspan => "3"}
%b
@@ -43,7 +43,7 @@
%td.total.align-center
%span#order_fees {{ subscription.estimatedFees() | localizeCurrency }}
%td.actions
%tbody#order-total.grand-total.no-border-top
%tbody#order-total.grand-total.no-border-top{"data-hook" => "admin_order_form_total"}
%tr
%td{:colspan => "3"}
%b

View File

@@ -2,11 +2,8 @@
%section.top-bar-section
%ul.nav-logo
%li.ofn-logo
%a{href: main_logo_link(@white_label_distributor)}
- if @white_label_logo&.variable?
= image_tag @white_label_distributor.white_label_logo_url(:default)
- else
%img{src: ContentConfig.url_for(:logo)}
%a{href: main_app.root_path}
%img{src: ContentConfig.url_for(:logo)}
%li.powered-by
%img{src: '/favicon.ico'}
%span

View File

@@ -6,10 +6,7 @@
%section.left
.ofn-logo
%a{href: main_app.root_path}
- if @white_label_logo&.variable?
= image_tag @white_label_distributor.white_label_logo_url(:mobile)
- else
%img{src: ContentConfig.url_for(:logo_mobile), srcset: ContentConfig.url_for(:logo_mobile_svg), width: "75", height: "26"}
%img{src: ContentConfig.url_for(:logo_mobile), srcset: ContentConfig.url_for(:logo_mobile_svg), width: "75", height: "26"}
%section.right{"ng-cloak" => true}
%span.cart-span{"ng-class" => "{ dirty: Cart.dirty || Cart.empty(), 'pure-dirty': Cart.dirty }"}

View File

@@ -5,42 +5,42 @@
%span.margin-top.hub-name-listing{"ng-bind" => "::hub.name | truncate:40"}
.columns.small-4.medium-2.large-2
%span.margin-top.ellipsed{"ng-bind" => "::hub.address.city"}
.columns.small-3.medium-2.large-2
%span.margin-top.ellipsed{"ng-bind" => "::hub.address.state_name"}
%span.margin-top{"ng-bind" => "::hub.address.city"}
.columns.small-2.medium-1.large-1
%span.margin-top{"ng-bind" => "::hub.address.state_name"}
%span.margin-top{"ng-if" => "hub.distance != null && hub.distance > 0"} ({{ hub.distance / 1000 | number:0 }} km)
.columns.small-5.medium-3.large-3.text-right.no-wrap.flex.flex-align-center.flex-justify-end{"ng-if" => "::hub.active"}
%a.hub.open_closed.flex.flex-align-center{"ng-href" => "{{::hub.path}}", "ng-attr-target" => "{{ embedded_layout ? '_blank' : undefined}}", "ng-class" => "{primary: hub.active, secondary: !hub.active}", "ofn-change-hub" => "hub"}
%span{ ng: { if: "::current()" } }
%em= t :hubs_shopping_here
%span{ ng: { if: "::!current()" } }
%span{"ng-bind" => "::hub.orders_close_at | sensible_timeframe"}
.columns.small-5.medium-3.large-3.text-right{"ng-if" => "::hub.active"}
%a.hub.open_closed{"ng-href" => "{{::hub.path}}", "ng-attr-target" => "{{ embedded_layout ? '_blank' : undefined}}", "ng-class" => "{primary: hub.active, secondary: !hub.active}", "ofn-change-hub" => "hub"}
%i.ofn-i_068-shop-reversed.show-for-medium-up
%span{style: "margin-left: 0.5rem;"}
%i{"ng-class" => "{'ofn-i_005-caret-down' : !open(), 'ofn-i_006-caret-up' : open()}"}
.columns.small-5.medium-3.large-3.text-right.no-wrap.flex.flex-align-center.flex-justify-end{"ng-if" => "::!hub.active"}
%a.hub.open_closed.flex{"ng-href" => "{{::hub.path}}", "ng-attr-target" => "{{ embedded_layout ? '_blank' : undefined}}", "ng-class" => "{primary: hub.active, secondary: !hub.active}", "ofn-change-hub" => "hub"}
%span{ ng: { if: "::current()" } }
%span.margin-top{ ng: { if: "::current()" } }
%em= t :hubs_shopping_here
%span{ ng: { if: "::!current()" } }
%span.margin-top{ ng: { if: "::!current()" } }
%span{"ng-bind" => "::hub.orders_close_at | sensible_timeframe"}
.columns.small-5.medium-3.large-3.text-right{"ng-if" => "::!hub.active"}
%a.hub.open_closed{"ng-href" => "{{::hub.path}}", "ng-attr-target" => "{{ embedded_layout ? '_blank' : undefined}}", "ng-class" => "{primary: hub.active, secondary: !hub.active}", "ofn-change-hub" => "hub"}
%span.margin-top{ ng: { if: "::current()" } }
%em= t :hubs_shopping_here
%span.margin-top{ ng: { if: "::!current()" } }
= t :hubs_orders_closed
%i.ofn-i_068-shop-reversed.show-for-medium-up
%span{style: "margin-left: 0.5rem;"}
.columns.small-1.medium-1.large-1.text-right
%span.margin-top
%i{"ng-class" => "{'ofn-i_005-caret-down' : !open(), 'ofn-i_006-caret-up' : open()}"}
.row.active_table_row{"ng-if" => "!hub.is_distributor", "ng-class" => "closed"}
.columns.small-12.medium-6.large-5.skinny-head
%a.hub{"ng-click" => "openModal(hub)", "ng-class" => "{primary: hub.active, secondary: !hub.active}"}
%i{ng: {class: "hub.icon_font"}}
%span.hub-name-listing{"ng-bind" => "::hub.name | truncate:40"}
%span.margin-top.hub-name-listing{"ng-bind" => "::hub.name | truncate:40"}
.columns.small-4.medium-2.large-2
%span.ellipsed{"ng-bind" => "::hub.address.city"}
%span.margin-top{"ng-bind" => "::hub.address.city"}
.columns.small-2.medium-1.large-1
%span.ellipsed{"ng-bind" => "::hub.address.state_name"}
%span.margin-top{"ng-bind" => "::hub.address.state_name"}
.columns.small-6.medium-3.large-4.text-right.no-wrap.flex.flex-align-center.flex-justify-end
%span{ ng: { if: "::!current()" } }
.columns.small-6.medium-3.large-4.text-right
%span.margin-top{ ng: { if: "::!current()" } }
%em= t :hubs_profile_only

View File

@@ -1,5 +1,5 @@
%table.index
%thead
%table.index{"data-hook" => "adjustments"}
%thead{"data-hook" => "adjustmment_head"}
%tr
%th= "#{t('spree.date')}/#{t('spree.time')}"
%th= t(:description)
@@ -15,7 +15,7 @@
- taxable = adjustment.adjustable_type == "Spree::Shipment" ? adjustment.adjustable : adjustment
- tr_class = cycle('odd', 'even')
- tr_id = spree_dom_id(adjustment)
%tr{:class => tr_class, :id => tr_id}
%tr{:class => tr_class, "data-hook" => "adjustment_row", :id => tr_id}
%td.align-center.created_at
= pretty_time(adjustment.created_at)
%td.align-center.label

View File

@@ -1,4 +1,4 @@
.row
.row{"data-hook" => "admin_adjustment_form_fields"}
- if @adjustment.new_record?
= render 'new_form', f: f
- else

View File

@@ -14,6 +14,6 @@
= form_for @adjustment, :url => admin_order_adjustment_path(@order, @adjustment), :method => :put do |f|
%fieldset.no-border-top
= render :partial => 'form', :locals => { :f => f }
.filter-actions.actions
.filter-actions.actions{"data-hook" => "buttons"}
= button Spree.t(:continue), 'icon-arrow-right'
= link_to_with_icon 'icon-remove', Spree.t('actions.cancel'), admin_order_adjustments_url(@order), :class => 'button'

View File

@@ -13,6 +13,6 @@
= form_for @adjustment, :url => admin_order_adjustments_path do |f|
%fieldset.no-border-top
= render :partial => 'form', :locals => { :f => f }
.filter-actions.actions
.filter-actions.actions{"data-hook" => "buttons"}
= button Spree.t(:continue), 'icon-arrow-right'
= button_link_to Spree.t('actions.cancel'), admin_order_adjustments_url(@order), :icon => 'icon-remove'

View File

@@ -5,7 +5,7 @@
= Spree.t(:general_settings)
= form_tag admin_general_settings_path, :method => :put do
#preferences
#preferences{"data-hook" => ""}
%fieldset.general.no-border-top
- @preferences_general.each do |key|
@@ -85,6 +85,6 @@
= preference_field_tag("available_units[#{unit}]", selected, { type: :boolean, selected: selected })
= label_tag(unit, unit.downcase) + tag(:br)
.form-buttons.filter-actions.actions
.form-buttons.filter-actions.actions{"data-hook" => "buttons"}
= button Spree.t('actions.update'), 'icon-refresh'
= link_to_with_icon 'icon-remove', Spree.t('actions.cancel'), edit_admin_general_settings_url, :class => 'button'

View File

@@ -18,3 +18,10 @@
%br/
%span.info
= t("spree.smtp_send_copy_to_this_addresses")
.field
= label_tag :intercept_email, t("spree.intercept_email_address")
%br/
= text_field_tag :intercept_email, Spree::Config[:intercept_email], disabled: true, class: 'fullwidth'
%br/
%span.info
= t("spree.intercept_email_instructions")

View File

@@ -1,13 +1,13 @@
= render :partial => "spree/admin/variants/autocomplete", :formats => :js
#add-line-item
#add-line-item{"data-hook" => ""}
%fieldset.no-border-bottom
%legend{:align => "center"}= Spree.t(:add_product)
- if @order.canceled?
= t(".cannot_add_item_to_canceled_order")
- else
.field.nine.columns.alpha
.field.nine.columns.alpha{"data-hook" => "add_product_name"}
= label_tag :add_variant_id, Spree.t(:name_or_sku)
= hidden_field_tag :add_variant_id, "", :class => "variant_autocomplete fullwidth"
.five.columns.omega

View File

@@ -1,4 +1,4 @@
%div.admin-orders-index-search
%div{"data-hook" => "admin_orders_index_search"}
= form_tag spree.admin_orders_url, {name: "orders_form", "ng-submit" => "fetchResults()"} do
.field-block.alpha.four.columns
.date-range-filter.field

View File

@@ -1,4 +1,4 @@
%div.admin-order-form-fields
%div{"data-hook" => "admin_order_form_fields"}
- if @line_item.try(:errors).present?
= render :partial => 'spree/shared/error_messages', :locals => { :target => @line_item }
@@ -13,7 +13,7 @@
= render :partial => "spree/admin/orders/_form/adjustments", :locals => { :adjustments => order_adjustments_for_display(@order), :title => t(".order_adjustments")}
- if order.line_items.exists?
%fieldset#order-total.no-border-bottom.order-details-total
%fieldset#order-total.no-border-bottom{"data-hook" => "order_details_total"}
%legend{ align: 'center' }= t(".order_total")
%span.order-total= order.display_total

View File

@@ -1,6 +1,6 @@
%div{ :id => "shipment_#{shipment.id}" }
%fieldset.no-border-bottom
%legend.stock-location{ :align => "center" }
%legend.stock-location{ :align => "center", "data-hook" => "stock-location" }
%span.shipment-number
= shipment.number
= "-"
@@ -10,7 +10,7 @@
= "-"
= link_to t(:ship), '#', :class => 'ship button icon-arrow-right', :data => { 'shipment-number' => shipment.number }
%table.stock-contents.index
%table.stock-contents.index{ "data-hook" => "stock-contents" }
%colgroup
%col{ :style => "width: 10%;" }
%col{ :style => "width: 30%;" }
@@ -28,7 +28,7 @@
= Spree.t(:quantity)
%th.force-rounded-right
= Spree.t(:total)
%th.orders-actions.actions
%th.orders-actions.actions{ "data-hook" => "admin_order_form_line_items_header_actions" }
%tbody{ "data-shipment-number" => "#{shipment.number}", "data-order-number" => "#{order.number}" }
= render 'spree/admin/orders/shipment_manifest', order: order, shipment: shipment

View File

@@ -17,7 +17,7 @@
%td.item-total.align-center
= line_item_shipment_price(line_item, item.quantity)
%td.cart-item-delete.actions
%td.cart-item-delete.actions{ "data-hook" => "cart_item_delete" }
- if shipment.can_modify? && can?(:update, shipment)
.flex
= link_to '', '#', :class => 'save-item icon_link icon-ok no-text with-tip', :data => {'shipment-number' => shipment.number, 'variant-id' => item.variant.id, :action => 'save'}, :title => t('actions.save'), :style => 'display: none'

View File

@@ -1,19 +1,19 @@
%fieldset.no-border-top
%fieldset.index.no-border-bottom
%fieldset.no-border-top{"data-hook" => "admin_customer_detail_form_fields"}
%fieldset.index.no-border-bottom{"data-hook" => "customer_guest"}
%legend{:align => "center"}= Spree.t(:account)
.row
.row{"data-hook" => "customer_fields"}
.alpha.eight.columns.fullwidth
.field
= f.label :email, Spree.t(:email) + ':'
= f.email_field :email, :class => 'fullwidth'
.alpha.eight.columns
.alpha.eight.columns{"data-hook" => "bill_address_wrapper"}
%fieldset.no-border-bottom
%legend{:align => "center"}= Spree.t(:billing_address)
= f.fields_for :bill_address do |ba_form|
= render :partial => 'address_form', :locals => { :f => ba_form, :name => Spree.t(:billing_address), :use_billing => false }
.omega.eight.columns
.omega.eight.columns{"data-hook" => "ship_address_wrapper"}
%fieldset.no-border-bottom
%legend{:align => "center"}= Spree.t(:shipping_address)
= f.fields_for :ship_address do |sa_form|
@@ -21,7 +21,7 @@
.clear
.form-buttons.filter-actions.actions
.form-buttons.filter-actions.actions{"data-hook" => "buttons"}
= button Spree.t('actions.update'), 'icon-refresh'
- content_for :head do

View File

@@ -12,7 +12,7 @@
%li= button_link_to Spree.t(:back_to_orders_list), admin_orders_path, :icon => 'icon-arrow-left'
- if @order.cart? || @order.address?
#select-customer
#select-customer{"data-hook" => ""}
%fieldset.no-border-bottom
%legend{:align => "center"}= Spree.t(:customer_search)
- content_for :main_ng_app_name do

View File

@@ -15,7 +15,7 @@
= render partial: "spree/admin/shared/order_page_title"
= render partial: "spree/admin/shared/order_tabs", locals: { current: 'Order Details' }
%div
%div{"data-hook" => "admin_order_edit_header"}
-# Suppress errors when manually creating a new order - needs to proceed to edit page
-# without having line items (which otherwise gives a validation error)
- unless params["suppress_error_msg"]
@@ -31,5 +31,5 @@
.no-objects-found
= Spree.t(:your_order_is_empty_add_product)
%div.admin-order-edit-form
%div{"data-hook" => "admin_order_edit_form"}
= render :partial => 'form', :locals => { :order => @order }

View File

@@ -17,7 +17,7 @@
= render 'spree/shared/error_messages', :target => @order
%div{"ng-app" => "admin.orders", "ng-controller" => "orderCtrl"}
= form_for @order, url: distribution_admin_order_path(@order), method: :put do |f|
= form_for @order, url: admin_order_url(@order), method: :put do |f|
= render 'spree/admin/orders/_form/distribution_fields'
-# This param passed to stop validation error in next page due to no line items in order yet:
= hidden_field_tag 'suppress_error_msg', "true"

View File

@@ -3,6 +3,6 @@
.alpha.four.columns
= label :payment_method, :type, t('.provider')
.omega.twelve.columns
= collection_select(:payment_method, :type, @providers, :to_s, :clean_name, {}, { class: 'select2 fullwidth', 'provider-prefs-for' => "#{@object.id}"})
= collection_select(:payment_method, :type, @providers, :to_s, :clean_name, (!@object.persisted? ? { :selected => "Spree::PaymentMethod::Check"} : {}), { class: 'select2 fullwidth', 'provider-prefs-for' => "#{@object.id}"})
%div{"ng-include" => "include_html" }

View File

@@ -1,4 +1,4 @@
%tr.product_property.fields{id: "spree_#{dom_id(f.object)}"}
%tr.product_property.fields{"data-hook" => "product_property", id: "spree_#{dom_id(f.object)}"}
%td.no-border
%span.handle
= f.hidden_field :id

View File

@@ -1,4 +1,4 @@
%div.admin-product-form-fields
%div{"data-hook" => "admin_product_form_fields"}
.left.twelve.columns.alpha
= f.field_container :name do
= f.label :name, raw(t(:name) + content_tag(:span, ' *', :class => 'required'))

View File

@@ -1,4 +1,4 @@
.row
.row{"data-hook" => "admin_product_meta_form"}
.alpha.eleven.columns
= f.field_container :meta_keywords do
= f.label :meta_keywords, t('admin.products.seo.product_search_keywords')

View File

@@ -2,7 +2,7 @@
= t('.title')
- content_for :page_actions do
%div{ :class => "toolbar" }
%div{ :class => "toolbar", 'data-hook' => "toolbar" }
%ul{ :class => "actions header-action-links inline-menu" }
%li#new_product_link
= button_link_to t(:new_product), new_object_url, { :icon => 'icon-plus', :id => 'admin_new_product' }

View File

@@ -42,26 +42,25 @@
%dd#date_complete
= pretty_time(@order.completed_at)
- if @order.distribution_set?
%nav.menu
%ul
- customer_details_classes = "active" if current == "Customer Details"
%li{ class: customer_details_classes }
= link_to_with_icon 'icon-user', t(:customer_details), spree.admin_order_customer_url(@order)
%nav.menu
%ul
- customer_details_classes = "active" if current == "Customer Details"
%li{ class: customer_details_classes }
= link_to_with_icon 'icon-user', t(:customer_details), spree.admin_order_customer_url(@order)
- order_details_classes = "active" if current == "Order Details"
%li{ class: order_details_classes }
= link_to_with_icon 'icon-edit', t(:order_details), spree.edit_admin_order_url(@order)
- order_details_classes = "active" if current == "Order Details"
%li{ class: order_details_classes }
= link_to_with_icon 'icon-edit', t(:order_details), spree.edit_admin_order_url(@order)
- payments_classes = "active" if current == "Payments"
%li{ class: payments_classes }
= link_to_with_icon 'icon-credit-card', t(:payments), spree.admin_order_payments_url(@order)
- payments_classes = "active" if current == "Payments"
%li{ class: payments_classes }
= link_to_with_icon 'icon-credit-card', t(:payments), spree.admin_order_payments_url(@order)
- adjustments_classes = "active" if current == "Adjustments"
%li{ class: adjustments_classes }
= link_to_with_icon 'icon-cogs', t(:adjustments), spree.admin_order_adjustments_url(@order)
- adjustments_classes = "active" if current == "Adjustments"
%li{ class: adjustments_classes }
= link_to_with_icon 'icon-cogs', t(:adjustments), spree.admin_order_adjustments_url(@order)
- if @order.completed?
- authorizations_classes = "active" if current == "Return Authorizations"
%li{ class: authorizations_classes }
= link_to_with_icon 'icon-share-alt', t(:return_authorizations), spree.admin_order_return_authorizations_url(@order)
- if @order.completed?
- authorizations_classes = "active" if current == "Return Authorizations"
%li{ class: authorizations_classes }
= link_to_with_icon 'icon-share-alt', t(:return_authorizations), spree.admin_order_return_authorizations_url(@order)

View File

@@ -1,9 +1,9 @@
%div
.field.align-center
%div{"data-hook" => "admin_shipping_category_form_fields"}
.field.align-center{"data-hook" => "name"}
= label_tag Spree.t(:name)
%br/
= f.text_field :name
.field.align-center
.field.align-center{"data-hook" => "name"}
= f.label :temperature_controlled, t(:temperature_controlled)
= f.check_box :temperature_controlled

View File

@@ -12,14 +12,14 @@
%col{:style => "width: 85%"}/
%col{:style => "width: 15%"}/
%thead
%tr
%tr{"data-hook" => "categories_header"}
%th= Spree.t(:name)
%th
= t(:temperature_controlled)
%th.actions
%tbody
- @shipping_categories.each do |shipping_category|
%tr{:class => "#{cycle('odd', 'even')}", :id => "#{spree_dom_id shipping_category}"}
%tr{:class => "#{cycle('odd', 'even')}", "data-hook" => "category_row", :id => "#{spree_dom_id shipping_category}"}
%td{:style => "width:350px;"}= shipping_category.name
%td.align-center
= shipping_category.temperature_controlled ? t(:yes) : t(:no)

View File

@@ -15,7 +15,7 @@
%col{style: "width: 15%"}/
%col{style: "width: 15%"}/
%thead
%tr
%tr{"data-hook" => "tax_header"}
%th= t("spree.name")
%th= t("spree.description")
%th= t("spree.default")

View File

@@ -5,10 +5,10 @@
= form_tag admin_tax_settings_path, :method => :put do
.field.align-center
.field.align-center{ "data-hook" => "products_require_tax_category" }
= hidden_field_tag 'preferences[products_require_tax_category]', '0'
= check_box_tag 'preferences[products_require_tax_category]', '1', Spree::Config[:products_require_tax_category]
= label_tag nil, t(:products_require_tax_category)
.form-buttons
.form-buttons{"data-hook" => "buttons"}
= button t(:update), 'icon-refresh'

View File

@@ -3,15 +3,15 @@
- content_for :page_actions do
%li
= button_link_to t(".back_to_users_list"), spree.admin_users_path, icon: "icon-arrow-left"
%fieldset.alpha.ten.columns
%fieldset.alpha.ten.columns{"data-hook" => "admin_user_edit_general_settings"}
%legend= t(".general_settings")
%div
%div{"data-hook" => "admin_user_edit_form_header"}
= render partial: "spree/shared/error_messages", locals: { target: @user }
%div
%div{"data-hook" => "admin_user_edit_form"}
= form_for [:admin, @user] do |f|
= render "email_confirmation" unless @user.confirmed?
= render partial: "form", locals: { f: f }
%div
%div{"data-hook" => "admin_user_edit_form_button"}
= render partial: "spree/admin/shared/edit_resource_links"
= render partial: 'spree/admin/users/api_fields'

View File

@@ -29,7 +29,7 @@
<script type='text/template' id='variant_autocomplete_stock_template'>
<fieldset>
<legend align="center"><%= Spree.t(:select_stock) %></legend>
<table class="stock-levels">
<table class="stock-levels" data-hook="stock-levels">
<colgroup>
<col style="width: 60%;" />
<col style="width: 30%;" />

View File

@@ -11,8 +11,8 @@
.field
= label_tag :unit_value_human, "#{t('admin.'+@product.variant_unit)} ({{unitName(#{@product.variant_unit_scale}, '#{@product.variant_unit}')}})"
= hidden_field_tag 'product_variant_unit_scale', @product.variant_unit_scale
= number_field_tag :unit_value_human, nil, {class: "fullwidth", step: 0.01, 'ng-model' => 'unit_value_human', 'ng-change' => 'updateValue()'}
= f.number_field :unit_value, {hidden: true, 'ng-value' => 'unit_value'}
= text_field_tag :unit_value_human, nil, {class: "fullwidth", 'ng-model' => 'unit_value_human', 'ng-change' => 'updateValue()'}
= f.text_field :unit_value, {hidden: true, 'ng-value' => 'unit_value'}
.field
= f.label :unit_description, t(:spree_admin_unit_description)
@@ -65,8 +65,8 @@
- if @product.variant_unit != 'weight'
.field
= f.label 'weight', t(:weight)+' (kg)'
- value = number_with_precision(@variant.weight, precision: 3)
= f.number_field 'weight', value: value, class: 'fullwidth', step: 0.001
- value = number_with_precision(@variant.weight, precision: 2)
= f.number_field 'weight', value: value, class: 'fullwidth', step: 0.01
- [:height, :width, :depth].each do |field|
.field
@@ -74,4 +74,4 @@
- value = number_with_precision(@variant.send(field), precision: 2)
= f.number_field field, value: value, class: 'fullwidth', step: 0.01
.clear
.clear

View File

@@ -3,7 +3,7 @@
= admin_inject_available_units
= form_for [:admin, @product, @variant], :url => admin_product_variants_path(@product, @url_filters) do |f|
%fieldset
%fieldset{'data-hook' => "admin_variant_new_form"}
%legend{align: "center"}= t('.new_variant')
= render partial: 'form', locals: { f: f }

View File

@@ -2,7 +2,7 @@
= render "layouts/i18n_script"
= yield :stripe_js
#wrapper
#wrapper{ data: { hook: '' } }
.flash-container
- if flash[:error]
.flash.error= flash[:error]
@@ -15,27 +15,27 @@
= render partial: "spree/layouts/admin/progress_spinner"
%header#header
%header#header{"data-hook" => ""}
.container
%figure.columns.five
%figure.columns.five{"data-hook" => "logo-wrapper"}
= link_to image_tag(Spree::Config[:admin_interface_logo], :id => 'logo'), spree.admin_dashboard_path
%nav.columns.eleven.admin-login-navigation-bar
%nav.columns.eleven{"data-hook" => "admin_login_navigation_bar"}
= render :partial => 'spree/layouts/admin/login_nav'
%nav#admin-menu
%nav#admin-menu{ data: { hook: '' }}
.container.no-gutter
.sixteen.columns.main-menu-wrapper
%ul.inline-menu
%ul.inline-menu{"data-hook" => "admin_tabs"}
= render :partial => 'spree/admin/shared/tabs'
- if content_for?(:sub_menu)
%nav#sub-menu
%nav#sub-menu{ data: { hook: ''} }
.container
.sixteen.columns
= yield :sub_menu
- if content_for?(:page_title) || content_for?(:page_actions)
.js-admin-section-header.admin__section-header
.js-admin-section-header.admin__section-header{ data: { hook: '' } }
.container
.sixteen.columns
.admin__section-header__content
@@ -44,16 +44,16 @@
%h1.js-admin-page-title= yield :page_title
- if content_for?(:page_actions)
%ul.admin__section-header__actions
%ul.admin__section-header__actions{ data: { hook: 'toolbar' } }
= yield :page_actions
.container
.row
- content_class = content_for?(:sidebar) ? "with-sidebar" : ""
#content{:class => content_class}
#content{:class => content_class, "data-hook" => ""}
- if content_for?(:table_filter)
- table_filter_class = content_for?(:sidebar) ? 'twelve columns' : 'sixteen columns'
#table-filter{:class => table_filter_class}
#table-filter{:class => table_filter_class, "data-hook" => ""}
%fieldset
%legend{:align => "center"}= yield :table_filter_title
= yield :table_filter
@@ -61,12 +61,14 @@
%div{:class => div_class}
= yield
- if content_for?(:sidebar)
%aside#sidebar.four.columns
%aside#sidebar.four.columns{"data-hook" => ""}
- if content_for?(:sidebar_title)
%h5.sidebar-title
%span= yield :sidebar_title
= yield :sidebar
%div{"data-hook" => "admin_footer_scripts"}
%script
= raw "Spree.api_key = \"#{spree_current_user.try(:spree_api_key).to_s}\";"

View File

@@ -1,6 +1,6 @@
!!!
%html{:lang => "en", "ng-csp": "no-unsafe-eval" }
%head
%head{"data-hook" => "admin_inside_head"}
= render :partial => 'spree/admin/shared/head'
%body.admin{ "class": ("admin-v2" if feature?(:admin_style_v2, spree_current_user)) }

View File

@@ -1,14 +1,14 @@
- if spree_current_user
%ul#login-nav.inline-menu
%li.user-logged-in-as
%li{"data-hook" => "user-logged-in-as"}
= t(:logged_in_as)
\: #{spree_current_user.email}
%li
%li{"data-hook" => "user-account-link"}
%i.icon-user
= link_to t(:account), account_path
%li
%li{"data-hook" => "user-logout-link"}
%i.icon-signout
= link_to t(:logout), logout_path
%li
%li{"data-hook" => "store-frontend-link"}
%i.icon-external-link
= link_to t(".header.store"), main_app.root_path, target: "_blank"

View File

@@ -1,7 +1,7 @@
%html{ lang: "en", "ng-csp": "no-unsafe-eval" }
%head= render :partial => 'spree/admin/shared/head'
%head{"data-hook" => "admin_inside_head"}= render :partial => 'spree/admin/shared/head'
%body.admin{"data-ajax-root-path" => main_app.root_path}
#wrapper
#wrapper{"data-hook" => ""}
- if flash[:error]
.flash.error= flash[:error]
- if notice
@@ -10,16 +10,16 @@
.flash.success= flash[:success]
= render partial: "spree/layouts/admin/progress_spinner"
%header#header
%header#header{"data-hook" => ""}
.container
%figure.columns.five
%figure.columns.five{"data-hook" => "logo-wrapper"}
= link_to image_tag(Spree::Config[:admin_interface_logo], id: 'logo'), spree.admin_dashboard_path
%nav.columns.eleven.admin-login-navigation-bar
%nav.columns.eleven{"data-hook" => "admin_login_navigation_bar"}
= render partial: "spree/layouts/admin/login_nav"
.container
.row
#content
#content{"data-hook" => ""}
%div{:class => "sixteen columns"}
= yield
%div
%div{"data-hook" => "admin_footer_scripts"}

View File

@@ -2,21 +2,21 @@
.row
.columns.large-12
%table#cart-detail
%table#cart-detail{"data-hook" => ""}
%col{halign: "left", valign: "middle", width: "60%"}/
%col{halign: "left", valign: "middle", width: "15%"}/
%col{halign: "center", valign: "middle", width: "10%"}/
%col{halign: "center", valign: "middle", width: "10%"}/
%col{halign: "center", valign: "middle", width: "5%"}/
%thead
%tr
%tr{"data-hook" => "cart_items_headers"}
%th.cart-item-description-header= t(:item)
%th.cart-item-price-header.text-right= t(:price)
%th.text-center.cart-item-quantity-header= t(:qty)
%th.cart-item-total-header.text-right= t(:total)
%th.cart-item-delete-header
%tbody#line_items
%tbody#line_items{"data-hook" => ""}
= render partial: 'line_item', collection: order_form.object.line_items, locals: {order_form: order_form}
= render 'bought' if show_bought_items? && !@order.complete?

View File

@@ -1,9 +1,9 @@
- variant = line_item.variant
= order_form.fields_for :line_items, line_item do |item_form|
%tr.line-item{class: "variant-#{variant.id}"}
%td.cart-item-description
%td.cart-item-description{'data-hook' => "cart_item_description"}
%div.item-thumb-image
%div.item-thumb-image{"data-hook" => "cart_item_image"}
= render 'spree/shared/variant_thumbnail', variant: variant
= render 'spree/shared/line_item_name', line_item: line_item
@@ -18,21 +18,21 @@
= t(".unavailable_item")
%br/
%td.text-right.cart-item-price
%td.text-right.cart-item-price{"data-hook" => "cart_item_price"}
= line_item.single_display_amount_with_adjustments.to_html
%br
%span.unit-price
= line_item.unit_price_price_and_unit
%td.text-center.cart-item-quantity
%td.text-center.cart-item-quantity{"data-hook" => "cart_item_quantity"}
- finalized_quantity = @order.completed? ? line_item.quantity : 0
= item_form.number_field :quantity,
:min => 0, "ofn-on-hand" => "#{variant.on_demand && 9999 || variant.on_hand}",
"finalizedquantity" => finalized_quantity, :class => "line_item_quantity", :size => 5,
"ng-model" => "line_item_#{line_item.id}",
"validate-stock-quantity" => true
%td.cart-item-total.text-right
%td.cart-item-total.text-right{"data-hook" => "cart_item_total"}
= line_item.display_amount_with_adjustments.to_html unless line_item.quantity.nil?
%td.cart-item-delete.text-center
%td.cart-item-delete.text-center{"data-hook" => "cart_item_delete"}
%a.delete{href: "#", id: "delete_#{dom_id(line_item)}"}
%i.delete.ofn-i_026-trash

View File

@@ -1,30 +1,31 @@
- display_footer = true if display_footer.nil?
%table#line-items
%table#line-items{"data-hook" => "order_details"}
%col{valign: "middle"}/
%col{halign: "center", valign: "middle", width: "5%"}/
%col{halign: "center", valign: "middle", width: "5%"}/
%col{halign: "center", valign: "middle", width: "5%"}/
%thead
%tr
%thead{"data-hook" => ""}
%tr{"data-hook" => "order_details_line_items_headers"}
%th= t(:item)
%th.price= t(:price)
%th.text-center.qty= t(:qty)
%th.text-right.total
%span= t(:total)
%tbody
%tbody{"data-hook" => ""}
- order.line_items.sorted_by_name_and_unit_value.each do |item|
%tr.line_item{ class: "variant-#{item.variant.id}" }
%td
%div.item-thumb-image
%tr.line_item{"data-hook" => "order_details_line_item_row", class: "variant-#{item.variant.id}" }
%td(data-hook = "order_item_description")
%div.item-thumb-image{"data-hook" => "order_item_image"}
= render 'spree/shared/variant_thumbnail', variant: item.variant
= render 'spree/shared/line_item_name', line_item: item
%td.text-right.price
%td.text-right.price{"data-hook" => "order_item_price"}
%span= item.single_display_amount_with_adjustments.to_html
%td.text-center= item.quantity
%td.text-right.total
%td.text-center{"data-hook" => "order_item_qty"}= item.quantity
%td.text-right.total{"data-hook" => "order_item_total"}
%span= item.display_amount_with_adjustments.to_html
= render partial: "spree/orders/totals_footer", locals: { order: order } if display_footer

View File

@@ -1,5 +1,5 @@
%tfoot
#subtotal
#subtotal{"data-hook" => "order_details_subtotal"}
%tr#subtotal-row.total
%td.text-right{colspan: "3"}
%strong
@@ -7,7 +7,7 @@
%td.text-right.total
%span= display_checkout_subtotal(order)
#order-charges
#order-charges{"data-hook" => "order_details_adjustments"}
- checkout_adjustments_for(order, exclude: [:line_item]).reverse_each do |adjustment|
%tr.total
%td.text-right{:colspan => "3"}
@@ -16,7 +16,7 @@
%td.text-right.total
%span= adjustment.display_amount.to_html
#order-total.order-details-total
#order-total{"data-hook" => "order_details_total"}
%tr.total
%td.text-right{colspan: "3"}
%h5
@@ -25,7 +25,7 @@
%h5#order_total= order.display_total.to_html
- if order.total_tax > 0
#tax
#tax{"data-hook" => "order_details_tax"}
%tr#tax-row.total
%td.text-right{colspan: "3"}
= t :order_includes_tax

View File

@@ -27,16 +27,16 @@
#cart-container
- if @order.line_items.empty?
%div.row
%div.row{"data-hook" => "empty_cart"}
%p= t(:your_cart_is_empty)
%p= link_to t(:continue_shopping), current_shop_products_path, :class => 'button continue'
- else
%div
%div{"data-hook" => "outside_cart_form"}
= form_for @order, :url => main_app.update_cart_path,
:html => {id: 'update-cart', name: "form", "ng-controller"=> 'CartFormCtrl'} do |order_form|
%div
%div
%div{"data-hook" => "inside_cart_form"}
%div{"data-hook" => "cart_items"}
.row
= render :partial => 'form', :locals => { :order_form => order_form }

View File

@@ -6,5 +6,5 @@
= t(:orders_form_update_cart)
%td
%td#empty-cart.text-center
%span#clear_cart_link
%span#clear_cart_link{"data-hook" => ""}
= link_to t(:orders_form_empty_cart), main_app.empty_cart_path, method: :put, :class => 'not-bold small'

View File

@@ -1,4 +1,4 @@
.row.links
.row.links{'data-hook' => "cart_buttons"}
%a.continue-shopping.button.secondary{href: current_shop_products_path, "ng-disabled" => "#{@insufficient_stock_lines.any?}", "disable-dynamically" => true}
= t :orders_edit_continue
%a#checkout-link.button.primary.right{href: main_app.checkout_path, "ng-disabled" => "#{@insufficient_stock_lines.any?}", "disable-dynamically" => true}

View File

@@ -7,7 +7,7 @@
.darkswarm
= render "shopping_shared/header" if current_distributor.present?
%fieldset#order_summary.footer-pad
%fieldset#order_summary.footer-pad{"data-hook" => ""}
.row
.columns.large-12.text-center
%h2
@@ -21,7 +21,7 @@
= t(:orders_show_confirmed)
%i.ofn-i_051-check-big
#order
#order{"data-hook" => ""}
- if params.has_key? :checkout_complete
%h1= t(:thank_you_for_your_order)

View File

@@ -13,7 +13,7 @@
.small-12.columns.pad-top
%h2
= accurate_title
%span.account-summary
%span.account-summary{"data-hook" => "account_summary"}
= @user.email
= render 'orders'

Some files were not shown because too many files have changed in this diff Show More