spree_drop_ship 3.1.0.1

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 (96) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/Gemfile +9 -0
  4. data/LICENSE +21 -0
  5. data/README.md +116 -0
  6. data/Rakefile +15 -0
  7. data/Versionfile +6 -0
  8. data/app/assets/javascripts/spree/backend/spree_drop_ship.js +2 -0
  9. data/app/assets/javascripts/spree/frontend/spree_drop_ship.js +1 -0
  10. data/app/assets/stylesheets/spree/backend/spree_drop_ship.scss +22 -0
  11. data/app/assets/stylesheets/spree/frontend/spree_drop_ship.css +3 -0
  12. data/app/controllers/ckeditor/attachment_files_controller_decorator.rb +20 -0
  13. data/app/controllers/ckeditor/pictures_controller_decorator.rb +17 -0
  14. data/app/controllers/spree/admin/drop_ship_settings_controller.rb +19 -0
  15. data/app/controllers/spree/admin/products_controller_decorator.rb +19 -0
  16. data/app/controllers/spree/admin/shipments_controller.rb +47 -0
  17. data/app/controllers/spree/admin/stock_locations_controller_decorator.rb +14 -0
  18. data/app/controllers/spree/admin/suppliers_controller.rb +32 -0
  19. data/app/controllers/spree/api/v1/stock_locations_controller_decorator.rb +18 -0
  20. data/app/controllers/spree/base_controller_decorator.rb +23 -0
  21. data/app/mailers/spree/drop_ship_order_mailer.rb +13 -0
  22. data/app/mailers/spree/supplier_mailer.rb +12 -0
  23. data/app/models/ckeditor/asset_decorator.rb +5 -0
  24. data/app/models/spree/drop_ship_configuration.rb +17 -0
  25. data/app/models/spree/order_decorator.rb +27 -0
  26. data/app/models/spree/payment_decorator.rb +7 -0
  27. data/app/models/spree/product_decorator.rb +32 -0
  28. data/app/models/spree/shipment_decorator.rb +39 -0
  29. data/app/models/spree/stock/splitter/drop_ship.rb +42 -0
  30. data/app/models/spree/stock_location_decorator.rb +18 -0
  31. data/app/models/spree/supplier.rb +117 -0
  32. data/app/models/spree/supplier_ability.rb +28 -0
  33. data/app/models/spree/supplier_variant.rb +6 -0
  34. data/app/models/spree/user_decorator.rb +11 -0
  35. data/app/models/spree/variant_decorator.rb +24 -0
  36. data/app/models/spree.rb +5 -0
  37. data/app/overrides/spree/admin/products/_form/converted_admin_product_form_right.html.erb.deface +5 -0
  38. data/app/overrides/spree/admin/products/index/override_rows.html.erb.deface +22 -0
  39. data/app/overrides/spree/admin/shared/sub_menu/_configuration/add_drop_ship_settings.html.erb.deface +3 -0
  40. data/app/overrides/spree/admin/stock_locations/_form/add_supplier.html.erb.deface +12 -0
  41. data/app/overrides/spree/admin/stock_movements/_form/fix_bootstrap_form.html.erb.deface +11 -0
  42. data/app/overrides/spree/layouts/admin/add_profile_admin_tabs.html.erb.deface +8 -0
  43. data/app/overrides/spree/layouts/admin/converted_admin_tabs.html.erb.deface +18 -0
  44. data/app/views/spree/admin/drop_ship_settings/edit.html.erb +21 -0
  45. data/app/views/spree/admin/shared/_header.html.erb +24 -0
  46. data/app/views/spree/admin/shipments/edit.html.erb +24 -0
  47. data/app/views/spree/admin/shipments/index.html.erb +95 -0
  48. data/app/views/spree/admin/suppliers/_form.html.erb +69 -0
  49. data/app/views/spree/admin/suppliers/edit.html.erb +22 -0
  50. data/app/views/spree/admin/suppliers/index.html.erb +71 -0
  51. data/app/views/spree/admin/suppliers/new.html.erb +17 -0
  52. data/app/views/spree/drop_ship_order_mailer/supplier_order.html.erb +119 -0
  53. data/app/views/spree/shared/unauthorized.erb +1 -0
  54. data/app/views/spree/supplier_mailer/welcome.html.erb +53 -0
  55. data/config/locales/en.yml +89 -0
  56. data/config/locales/es.yml +133 -0
  57. data/config/routes.rb +9 -0
  58. data/db/migrate/20121006073854_create_suppliers.rb +20 -0
  59. data/db/migrate/20130216070944_product_belongs_to_supplier.rb +6 -0
  60. data/db/migrate/20130405005502_stock_locations_belongs_to_supplier.rb +6 -0
  61. data/db/migrate/20130405011127_user_belongs_to_supplier.rb +6 -0
  62. data/db/migrate/20130428063053_add_balanced_token_to_suppliers.rb +7 -0
  63. data/db/migrate/20130510181443_add_supplier_id_to_ckeditor_assets.rb +8 -0
  64. data/db/migrate/20130606220913_add_permalink_to_suppliers.rb +6 -0
  65. data/db/migrate/20140323170638_add_supplier_commission_to_shipments.rb +5 -0
  66. data/db/migrate/20140416184616_migrate_payment_and_commission.rb +7 -0
  67. data/db/migrate/20140529041325_create_spree_supplier_variants.rb +15 -0
  68. data/lib/generators/spree_drop_ship/install/install_generator.rb +30 -0
  69. data/lib/spree_drop_ship/engine.rb +31 -0
  70. data/lib/spree_drop_ship/factories.rb +93 -0
  71. data/lib/spree_drop_ship.rb +6 -0
  72. data/lib/tasks/spree_sample.rake +72 -0
  73. data/script/rails +7 -0
  74. data/spec/features/admin/orders_spec.rb +12 -0
  75. data/spec/features/admin/products_spec.rb +25 -0
  76. data/spec/features/admin/return_authorizations_spec.rb +7 -0
  77. data/spec/features/admin/settings_spec.rb +33 -0
  78. data/spec/features/admin/shipments_spec.rb +80 -0
  79. data/spec/features/admin/stock_management_spec.rb +153 -0
  80. data/spec/features/admin/stock_spec.rb +98 -0
  81. data/spec/features/admin/suppliers_spec.rb +126 -0
  82. data/spec/models/spree/order_decorator_spec.rb +54 -0
  83. data/spec/models/spree/payment_decorator_spec.rb +7 -0
  84. data/spec/models/spree/product_decorator_spec.rb +13 -0
  85. data/spec/models/spree/shipment_decorator_spec.rb +47 -0
  86. data/spec/models/spree/stock/splitter/drop_ship_spec.rb +62 -0
  87. data/spec/models/spree/stock_location_decorator_spec.rb +33 -0
  88. data/spec/models/spree/supplier_ability_spec.rb +172 -0
  89. data/spec/models/spree/supplier_spec.rb +123 -0
  90. data/spec/models/spree/supplier_variant_spec.rb +5 -0
  91. data/spec/models/spree/user_decorator_spec.rb +17 -0
  92. data/spec/models/spree/variant_decorator_spec.rb +7 -0
  93. data/spec/spec_helper.rb +79 -0
  94. data/spec/support/integration_helpers.rb +15 -0
  95. data/spree_drop_ship.gemspec +42 -0
  96. metadata +411 -0
@@ -0,0 +1,18 @@
1
+ Spree::StockLocation.class_eval do
2
+
3
+ belongs_to :supplier, class_name: 'Spree::Supplier'
4
+
5
+ scope :by_supplier, -> (supplier_id) { where(supplier_id: supplier_id) }
6
+
7
+ # Wrapper for creating a new stock item respecting the backorderable config and supplier
8
+ durably_decorate :propagate_variant, mode: 'soft', sha: 'f35b0d8a811311d4886d53024a9aa34e3aa5f8cb' do |variant|
9
+ if self.supplier_id.blank? || variant.suppliers.pluck(:id).include?(self.supplier_id)
10
+ self.stock_items.create!(variant: variant, backorderable: self.backorderable_default)
11
+ end
12
+ end
13
+
14
+ def available?(variant)
15
+ stock_item(variant).try(:available?)
16
+ end
17
+
18
+ end
@@ -0,0 +1,117 @@
1
+ class Spree::Supplier < Spree::Base
2
+ extend FriendlyId
3
+ friendly_id :name, use: :slugged
4
+
5
+ attr_accessor :password, :password_confirmation
6
+
7
+ #==========================================
8
+ # Associations
9
+
10
+ belongs_to :address, class_name: 'Spree::Address'
11
+ accepts_nested_attributes_for :address
12
+
13
+ if defined?(Ckeditor::Asset)
14
+ has_many :ckeditor_pictures
15
+ has_many :ckeditor_attachment_files
16
+ end
17
+ has_many :products, through: :variants
18
+ has_many :shipments, through: :stock_locations
19
+ has_many :stock_locations
20
+ has_many :supplier_variants
21
+ has_many :users, class_name: Spree.user_class.to_s
22
+ has_many :variants, through: :supplier_variants
23
+
24
+ #==========================================
25
+ # Validations
26
+
27
+ validates :commission_flat_rate, presence: true
28
+ validates :commission_percentage, presence: true
29
+ validates :email, presence: true, email: true, uniqueness: true
30
+ validates :name, presence: true, uniqueness: true
31
+ validates :url, format: { with: URI::regexp(%w(http https)), allow_blank: true }
32
+
33
+ #==========================================
34
+ # Callbacks
35
+
36
+ after_create :assign_user
37
+ after_create :create_stock_location
38
+ after_create :send_welcome, if: -> { SpreeDropShip::Config[:send_supplier_email] }
39
+ before_create :set_commission
40
+ before_validation :check_url
41
+
42
+ #==========================================
43
+ # Instance Methods
44
+ scope :active, -> { where(active: true) }
45
+
46
+ def deleted?
47
+ deleted_at.present?
48
+ end
49
+
50
+ def user_ids_string
51
+ user_ids.join(',')
52
+ end
53
+
54
+ def user_ids_string=(s)
55
+ self.user_ids = s.to_s.split(',').map(&:strip)
56
+ end
57
+
58
+ # Retreive the stock locations that has available
59
+ # stock items of the given variant
60
+ def stock_locations_with_available_stock_items(variant)
61
+ stock_locations.select { |sl| sl.available?(variant) }
62
+ end
63
+
64
+ #==========================================
65
+ # Protected Methods
66
+
67
+ protected
68
+
69
+ def assign_user
70
+ if self.users.empty?
71
+ if user = Spree.user_class.find_by_email(self.email)
72
+ self.users << user
73
+ self.save
74
+ end
75
+ end
76
+ end
77
+
78
+ def check_url
79
+ unless self.url.blank? or self.url =~ URI::regexp(%w(http https))
80
+ self.url = "http://#{self.url}"
81
+ end
82
+ end
83
+
84
+ def create_stock_location
85
+ if self.stock_locations.empty?
86
+ location = self.stock_locations.build(
87
+ active: true,
88
+ country_id: self.address.try(:country_id),
89
+ name: self.name,
90
+ state_id: self.address.try(:state_id)
91
+ )
92
+ # It's important location is always created. Some apps add validations that shouldn't break this.
93
+ location.save validate: false
94
+ end
95
+ end
96
+
97
+ def send_welcome
98
+ begin
99
+ Spree::SupplierMailer.welcome(self.id).deliver_later!
100
+ # Specs raise error for not being able to set default_url_options[:host]
101
+ rescue => ex #Errno::ECONNREFUSED => ex
102
+ Rails.logger.error ex.message
103
+ Rails.logger.error ex.backtrace.join("\n")
104
+ return true # always return true so that failed email doesn't crash app.
105
+ end
106
+ end
107
+
108
+ def set_commission
109
+ unless changes.has_key?(:commission_flat_rate)
110
+ self.commission_flat_rate = SpreeDropShip::Config[:default_commission_flat_rate]
111
+ end
112
+ unless changes.has_key?(:commission_percentage)
113
+ self.commission_percentage = SpreeDropShip::Config[:default_commission_percentage]
114
+ end
115
+ end
116
+
117
+ end
@@ -0,0 +1,28 @@
1
+ module Spree
2
+ class SupplierAbility
3
+ include CanCan::Ability
4
+
5
+ def initialize(user)
6
+ user ||= Spree.user_class.new
7
+
8
+ if user.supplier
9
+ # TODO: Want this to be inline like:
10
+ # can [:admin, :read, :stock], Spree::Product, suppliers: { id: user.supplier_id }
11
+ # can [:admin, :read, :stock], Spree::Product, supplier_ids: user.supplier_id
12
+ can [:admin, :read, :stock], Spree::Product do |product|
13
+ product.supplier_ids.include?(user.supplier_id)
14
+ end
15
+ can [:admin, :index, :manage, :create], Spree::Product
16
+ can [:admin, :manage, :read, :ready, :ship], Spree::Shipment, order: { state: 'complete' }, stock_location: { supplier_id: user.supplier_id }
17
+ can [:admin, :create, :update], :stock_items
18
+ can [:admin, :manage], Spree::StockItem, stock_location_id: user.supplier.stock_locations.pluck(:id)
19
+ can [:admin, :manage], Spree::StockLocation, supplier_id: user.supplier_id
20
+ can :create, Spree::StockLocation
21
+ can [:admin, :manage], Spree::StockMovement, stock_item: { stock_location_id: user.supplier.stock_locations.pluck(:id) }
22
+ can :create, Spree::StockMovement
23
+ can [:admin, :update], Spree::Supplier, id: user.supplier_id
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,6 @@
1
+ module Spree
2
+ class SupplierVariant < Spree::Base
3
+ belongs_to :supplier
4
+ belongs_to :variant
5
+ end
6
+ end
@@ -0,0 +1,11 @@
1
+ Spree.user_class.class_eval do
2
+
3
+ belongs_to :supplier, class_name: 'Spree::Supplier'
4
+
5
+ has_many :variants, through: :supplier
6
+
7
+ def supplier?
8
+ supplier.present?
9
+ end
10
+
11
+ end
@@ -0,0 +1,24 @@
1
+ module Spree
2
+ Variant.class_eval do
3
+
4
+ has_many :suppliers, through: :supplier_variants
5
+ has_many :supplier_variants
6
+
7
+ before_create :populate_for_suppliers
8
+
9
+ private
10
+
11
+ durably_decorate :create_stock_items, mode: 'soft', sha: '98704433ac5c66ba46e02699f3cf03d13d4f1281' do
12
+ StockLocation.all.each do |stock_location|
13
+ if stock_location.supplier_id.blank? || self.suppliers.pluck(:id).include?(stock_location.supplier_id)
14
+ stock_location.propagate_variant(self) if stock_location.propagate_all_variants?
15
+ end
16
+ end
17
+ end
18
+
19
+ def populate_for_suppliers
20
+ self.suppliers = self.product.suppliers
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,5 @@
1
+ module Spree
2
+ def self.table_name_prefix
3
+ 'spree_'
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ <!-- insert_bottom "[data-hook='admin_product_form_right'], #admin_product_form_right[data-hook]" -->
2
+
3
+ <% if can? :manage, Spree::Supplier %>
4
+ <!-- TODO allow assignment to variants -->
5
+ <% end %>
@@ -0,0 +1,22 @@
1
+ <!-- replace_contents '[data-hook="admin_products_index_rows"]' -->
2
+
3
+ <%# Changed classes to new like https://github.com/spree/spree/blob/master/backend/app/views/spree/admin/stock_locations/_form.html.erb %>
4
+ <td class="sku"><%= product.sku rescue '' %></td>
5
+ <td class="image"><%= mini_image product, class: "thumbnail" %></td>
6
+ <td>
7
+ <% if try_spree_current_user && try_spree_current_user.supplier? %>
8
+ <%= link_to product.try(:name), stock_admin_product_path(product)%>
9
+ <% else %>
10
+ <%= link_to product.try(:name), edit_admin_product_path(product) %>
11
+ <% end %>
12
+ </td>
13
+ <td><%= product.display_price.to_html rescue '' %></td>
14
+ <td class="actions" data-hook="admin_products_index_row_actions">
15
+ <% if try_spree_current_user && try_spree_current_user.supplier? %>
16
+ <%= link_to 'SM', stock_admin_product_path(product), title:'Stock Management', class: 'btn btn-default btn-sm with-tip without-textdecor' if can?(:stock, product) && !product.deleted? %>
17
+ <% else %>
18
+ <%= link_to_edit product, :no_text => true, :class => 'edit' if can?(:edit, product) && !product.deleted? %>
19
+ <% end %>
20
+ <%= link_to_clone product, :no_text => true, :class => 'clone' if can?(:clone, product) %>
21
+ <%= link_to_delete product, :no_text => true if can?(:delete, product) && !product.deleted? %>
22
+ </td>
@@ -0,0 +1,3 @@
1
+ <!-- insert_bottom "[data-hook='admin_configurations_sidebar_menu'], #admin_configurations_sidebar_menu[data-hook]" -->
2
+
3
+ <%= configurations_sidebar_menu_item Spree.t(:drop_ship_settings), spree.edit_admin_drop_ship_settings_path %>
@@ -0,0 +1,12 @@
1
+ <!-- insert_bottom "[data-hook=admin_stock_locations_form_fields]" -->
2
+
3
+ <%# Remove extra div and change classes %>
4
+ <% if spree_current_user.admin? %>
5
+ <div class='form-group'>
6
+ <%= f.field_container :supplier do %>
7
+ <%= f.label :supplier_id, Spree.t(:supplier) %>
8
+ <%= f.collection_select(:supplier_id, Spree::Supplier.all, :id, :name, { :include_blank => 'None' }, { :class => 'select2' }) %>
9
+ <%= f.error_message_on :supplier %>
10
+ <% end %>
11
+ </div>
12
+ <% end %>
@@ -0,0 +1,11 @@
1
+ <!-- replace_contents '[data-hook="admin_stock_movements_form_fields"]' -->
2
+
3
+ <%# Fix markup form bug %>
4
+ <%= f.field_container :quantity, class: ['form-group'] do %>
5
+ <%= f.label :quantity, Spree.t(:quantity) %>
6
+ <%= f.text_field :quantity , class: 'form-control'%>
7
+ <% end %>
8
+ <%= f.field_container :stock_item_id, class: ['form-group'] do %>
9
+ <%= f.label :stock_item_id, Spree.t(:stock_item_id) %>
10
+ <%= f.text_field 'stock_item_id', :class => 'select2', :'data-stock-location-id' => params[:stock_location_id] %>
11
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <!-- insert_top "div#main-sidebar" -->
2
+
3
+ <%# Add tab "profile to admin tabs" %>
4
+ <% if try_spree_current_user && try_spree_current_user.supplier? %>
5
+ <ul class="nav nav-sidebar">
6
+ <%= tab :profile, url: spree.edit_admin_supplier_url(spree_current_user.supplier_id), match_path: '/suppliers', icon: 'user' %>
7
+ </ul>
8
+ <% end %>
@@ -0,0 +1,18 @@
1
+ <!-- insert_bottom "div#main-sidebar" -->
2
+
3
+ <%# Add sidebar's items for supplier %>
4
+ <% if can? :index, Spree::Supplier %>
5
+ <ul class="nav nav-sidebar">
6
+ <%= tab :suppliers, label: Spree.t(:suppliers), match_path: '/suppliers', icon: 'home' %>
7
+ </ul>
8
+ <% end %>
9
+ <% if can? :index, Spree::Shipment %>
10
+ <ul class="nav nav-sidebar">
11
+ <%= tab :shipments, label: Spree.t(:shipments), match_path: '/shipments', icon: 'plane' %>
12
+ </ul>
13
+ <% end %>
14
+ <% if try_spree_current_user.try(:supplier?) and can? :index, Spree::StockLocation %>
15
+ <ul class="nav nav-sidebar">
16
+ <%= tab :stock_locations, label: Spree.t(:stock_locations), match_path: '/stock_locations', icon: 'globe' %>
17
+ </ul>
18
+ <% end %>
@@ -0,0 +1,21 @@
1
+ <% content_for :page_title do %>
2
+ <%= Spree.t("drop_ship_settings") %>
3
+ <% end %>
4
+
5
+ <%= form_tag(spree.admin_drop_ship_settings_path, :method => :put) do %>
6
+ <fieldset class="general no-border-top">
7
+ <% %w( default_commission_flat_rate default_commission_percentage automatically_deliver_orders_to_supplier send_supplier_email).each do |key|
8
+ type = SpreeDropShip::Config.preference_type(key) %>
9
+ <div class="field col-md-6">
10
+ <%= label_tag(key, Spree.t(key) + ': ') + tag(:br) if type != :boolean %>
11
+ <%= preference_field_tag(key, SpreeDropShip::Config[key], :type => type ,:class => 'form-control')%>
12
+ <%= label_tag(key, Spree.t(key)) + tag(:br) if type == :boolean %>
13
+ </div>
14
+ <% end %>
15
+ <div class="form-buttons" data-hook="buttons">
16
+ <%= button Spree.t(:update), 'update' %>
17
+ <span class="or"><%= Spree.t(:or) %></span>
18
+ <%= button_link_to Spree.t(:cancel), spree.edit_admin_drop_ship_settings_url, :icon => 'cancel' %>
19
+ </div>
20
+ </fieldset>
21
+ <% end %>
@@ -0,0 +1,24 @@
1
+ <%# Override header for supplier %>
2
+ <% admin = try_spree_current_user.try(:supplier?) || try_spree_current_user.try(:has_spree_role?, "admin") %>
3
+
4
+ <header class="header <%= admin ? "logged-in" : "logged-out" %>">
5
+
6
+ <nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
7
+ <div class="container-fluid">
8
+ <div class="navbar-header">
9
+ <%= link_to image_tag(Spree::Config[:admin_interface_logo], id: 'logo', height: '100%'), spree.admin_path, class: "logo navbar-brand" %>
10
+ </div>
11
+
12
+ <% if admin %>
13
+ <a href="#" class="navbar-btn sidebar-toggle" data-toggle="offcanvas" role="button">
14
+ <span class="sr-only">Toggle navigation</span>
15
+ <span class="icon-bar"></span>
16
+ <span class="icon-bar"></span>
17
+ <span class="icon-bar"></span>
18
+ </a>
19
+ <div class="navbar-right" data-hook="admin_login_navigation_bar"></div>
20
+ <% end %>
21
+ </div>
22
+ </nav>
23
+
24
+ </header>
@@ -0,0 +1,24 @@
1
+ <% content_for :page_actions do %>
2
+ <%= button_link_to Spree.t(:back_to_shipments_list), spree.admin_shipments_path, icon: 'arrow-left' %>
3
+ <% end %>
4
+
5
+ <% if spree_current_user.admin? && @shipment.supplier.present? %>
6
+ <div data-hook="admin_shipment_supplier" class="row">
7
+ <fieldset class="col-md-12 no-border-bottom">
8
+ <legend align="center"><%= Spree.t(:supplier_information) %></legend>
9
+ <div>
10
+ <b><%= Spree::Supplier.human_attribute_name(:name) %>:</b> <%= @shipment.supplier.name %><br/>
11
+ <b><%= Spree::Supplier.human_attribute_name(:email) %>:</b> <%= @shipment.supplier.email %><br/>
12
+ <b><%= Spree::Supplier.human_attribute_name(:url) %>:</b> <%= link_to @shipment.supplier.url, @shipment.supplier.url if @shipment.supplier.url.present? %><br/>
13
+ </div>
14
+ <div>
15
+ <b><%= Spree.t('contact_information') %>:</b>
16
+ </div>
17
+ <%= render partial: 'spree/shared/address', locals: { address: @shipment.supplier.address } %>
18
+ </fieldset>
19
+ </div>
20
+ <% end %>
21
+
22
+ <div data-hook="admin_shipment_form_fields">
23
+ <%= render partial: "spree/admin/orders/shipment", locals: { order: @shipment.order, shipment: @shipment } %>
24
+ </div>
@@ -0,0 +1,95 @@
1
+ <% content_for :page_title do %>
2
+ <%= Spree.t(:listing_shipments) %>
3
+ <% end %>
4
+
5
+ <% content_for :table_filter_title do %>
6
+ <%= Spree.t(:search) %>
7
+ <% end %>
8
+
9
+ <%# Update search form with new markup %>
10
+ <% content_for :table_filter do %>
11
+ <div data-hook="admin_shipments_index_search">
12
+ <%= search_form_for [:admin, @search] do |f| %>
13
+ <div class="row">
14
+ <div class="date-range-filter col-md-6">
15
+ <div class="form-group">
16
+ <%= label_tag :q_created_at_gt, Spree.t(:date_range) %>
17
+ <div class="row">
18
+ <div class="col-md-6">
19
+ <%= f.text_field :created_at_gt, :class => 'datepicker datepicker-from form-control', :value => params[:q][:created_at_gt], :placeholder => Spree.t(:start) %>
20
+ </div>
21
+ <div class="col-md-6">
22
+ <%= f.text_field :created_at_lt, :class => 'datepicker datepicker-to form-control', :value => params[:q][:created_at_lt], :placeholder => Spree.t(:stop) %>
23
+ </div>
24
+ </div>
25
+ </div>
26
+ </div>
27
+ </div>
28
+ <div class="row">
29
+ <div class="col-md-4">
30
+ <div class="form-group">
31
+ <%= label_tag nil, Spree.t(:shipment_number) %>
32
+ <%= f.text_field :number_cont , class: 'form-control js-quick-search-target'%>
33
+ </div>
34
+ </div>
35
+
36
+ <div class="col-md-4">
37
+ <div class="form-group">
38
+ <%= label_tag nil, Spree.t(:status) %><br/>
39
+ <%= f.select :state_eq, Spree::Shipment.state_machines[:state].states.collect {|s| [Spree.t("shipment_state.#{s.name}"), s.value]}, {:include_blank => true}, :class => 'select2' %>
40
+ </div>
41
+ </div>
42
+ </div>
43
+
44
+ <div data-hook="admin_shipments_index_search_buttons" class="form-actions">
45
+ <%= button Spree.t(:filter_results), 'search' %>
46
+ </div>
47
+ <% end %>
48
+ </div>
49
+ <% end %>
50
+
51
+ <%# This is a new paginate! %>
52
+ <%= render :partial => 'spree/admin/shared/index_table_options', :locals => { :collection => @shipments } %>
53
+
54
+ <% unless @shipments.empty? %>
55
+ <table class="table" id="listing_shipments" data-hook>
56
+ <thead>
57
+ <tr data-hook="admin_orders_index_headers">
58
+ <th><%= sort_link @search, :created_at, Spree::Shipment.human_attribute_name(:created_at) %></th>
59
+ <th><%= sort_link @search, :number, Spree::Shipment.human_attribute_name(:number) %></th>
60
+ <th><%= sort_link @search, :state, Spree::Shipment.human_attribute_name(:state) %></th>
61
+ <th><%= sort_link @search, :item_cost, Spree::Shipment.human_attribute_name(:item_cost) %></th>
62
+ <th><%= sort_link @search, :shipping_total, Spree::Shipment.human_attribute_name(:cost) %></th>
63
+ <th><%= sort_link @search, :tax_total, Spree::Shipment.human_attribute_name(:tax_total) %></th>
64
+ <th><%= sort_link @search, :total, Spree::Shipment.human_attribute_name(:final_price) %></th>
65
+ <th><%= sort_link @search, :supplier_commission, Spree::Shipment.human_attribute_name(:supplier_commission) %></th>
66
+ <th data-hook="admin_shipments_index_header_actions" class="actions"></th>
67
+ </tr>
68
+ </thead>
69
+ <tbody>
70
+ <% @shipments.each do |shipment| %>
71
+ <tr data-hook="admin_shipments_index_rows" class="state-<%= shipment.state.downcase %> <%= cycle('odd', 'even') %>">
72
+ <td><%= l shipment.created_at.to_date %></td>
73
+ <td><%= link_to shipment.number, spree.edit_admin_shipment_path(shipment) %></td>
74
+ <td><span class="state <%= shipment.state.downcase %>"><%= Spree.t("shipment_state.#{shipment.state.downcase}") %></span></td>
75
+ <td> <%= shipment.display_item_cost.to_html %></td>
76
+ <td ><%= shipment.display_cost.to_html %></td>
77
+ <td><%= Spree::Money.new(shipment.tax_total, currency: shipment.currency).to_html %></td>
78
+ <td><%= Spree::Money.new(shipment.final_price_with_items, currency: shipment.currency).to_html %></td>
79
+ <td><%= Spree::Money.new(shipment.supplier_commission, currency: shipment.currency).to_html %></td>
80
+ <td data-hook="admin_shipments_index_row_actions">
81
+ <%= link_to_edit_url spree.edit_admin_shipment_path(shipment), :title => "admin_edit_#{dom_id(shipment)}", :no_text => true %>
82
+ </td>
83
+ </tr>
84
+ <% end %>
85
+ </tbody>
86
+ </table>
87
+ <% else %>
88
+ <%# New alert 'Not Found' with i18n %>
89
+ <div class="alert alert-info no-objects-found">
90
+ <%= Spree.t(:no_resource_found, resource: Spree::Shipment.model_name.human(count: :many)) %>,
91
+ </div>
92
+ <% end %>
93
+
94
+ <%# This is a new paginate! %>
95
+ <%= render :partial => 'spree/admin/shared/index_table_options', :locals => { :collection => @shipments } %>
@@ -0,0 +1,69 @@
1
+ <div data-hook="supplier_address_wrapper" class="col-md-6">
2
+ <fieldset class="no-border-bottom">
3
+ <legend align="center"><%= Spree.t('contact_address') %></legend>
4
+ <%= form.fields_for :address do |contact_form| %>
5
+ <%= render :partial => 'spree/admin/shared/address_form', :locals => { :f => contact_form, :name => Spree.t(:contact_address), :type => "shipping" } %>
6
+ <% end %>
7
+ </fieldset>
8
+ </div>
9
+
10
+ <%# added bootstrap classes for 'field_container' and '' %>
11
+ <div data-hook="supplier_details_wrapper" class="col-md-6">
12
+ <fieldset class="no-border-bottom">
13
+ <legend align="center" ><%= Spree.t('supplier_details') %></legend>
14
+ <%= form.field_container :name, class: ['form-group'] do %>
15
+ <%= form.label :name, Spree::Supplier.human_attribute_name(:name) %>:<br />
16
+ <%= form.text_field :name, :class => 'form-control' %>
17
+ <% end %>
18
+ <%= form.field_container :email, class: ['form-group'] do %>
19
+ <%= form.label :email, Spree::Supplier.human_attribute_name(:email) %>:<br />
20
+ <%= form.email_field :email, :class => 'form-control' %>
21
+ <%# email validation %>
22
+ <%= error_message_on :user, :email %>
23
+ <% end %>
24
+ <%= form.field_container :url, class: ['form-group'] do %>
25
+ <%= form.label :url, Spree::Supplier.human_attribute_name(:url) %>:<br />
26
+ <%= form.text_field :url, :class => 'form-control' %>
27
+ <% end %>
28
+ <%= form.field_container :tax_id, class: ['form-group'] do %>
29
+ <%= form.label :tax_id, Spree::Supplier.human_attribute_name(:tax_id) %>:<br />
30
+ <%= form.text_field :tax_id, :class => 'form-control' %>
31
+ <% end %>
32
+ <% if spree_current_user.admin? %>
33
+ <%= form.field_container :commission_flat_rate, class: ['form-group'] do %>
34
+ <%= form.label :commission_flat_rate, Spree::Supplier.human_attribute_name(:commission_flat_rate) %>:<br />
35
+ <%= form.text_field :commission_flat_rate, :class => 'form-control' %>
36
+ <% end %>
37
+ <%= form.field_container :commission_percentage , class: ['form-group'] do %>
38
+ <%= form.label :commission_percentage, Spree::Supplier.human_attribute_name(:commission_percentage) %>:<br />
39
+ <%= form.text_field :commission_percentage, :class => 'form-control' %>
40
+ <% end %>
41
+ <%= form.field_container :users, class: ['form-group'] do %>
42
+ <%= form.label :users %><br/>
43
+ <%= hidden_field_tag 'supplier[user_ids_string]', form.object.user_ids.join(','), class: 'user_picker' %>
44
+ <% end %>
45
+ <%= form.field_container :active, class: ['form-group'] do %>
46
+ <div class="checkbox">
47
+ <%= label_tag :active do %>
48
+ <%= form.check_box :active %>
49
+ <%= Spree::Supplier.human_attribute_name(:active) %>
50
+ <% end %>
51
+ </div>
52
+ <% end %>
53
+ <% end %>
54
+ <%# This moved to _edit(new)_resource_links.html.erb %>
55
+ <!--<div class='center'>-->
56
+ <%# if form.object.new_record? %>
57
+ <%#= button Spree.t('create') %>
58
+ <%# else %>
59
+ <%#= button Spree.t('update') %>
60
+ <%# end %>
61
+ <%#= Spree.t('or') %>
62
+ <%# if can? :index, Spree::Supplier %>
63
+ <%#= link_to Spree.t('cancel'), collection_url %>
64
+ <%# else %>
65
+ <%#= link_to Spree.t('cancel'), spree.account_path %>
66
+ <%# end %>
67
+ <!--</div>-->
68
+ </fieldset>
69
+ </div>
@@ -0,0 +1,22 @@
1
+ <% if can? :index, Spree::Supplier %>
2
+ <% content_for :page_actions do %>
3
+ <%= button_link_to Spree.t('back_to_suppliers'), spree.admin_suppliers_path, icon: 'arrow-left' %>
4
+ <% end %>
5
+ <% end %>
6
+
7
+ <% content_for :page_title do %>
8
+ <%== Spree.t(:editing_supplier) + " &ldquo;#{@object.name}&rdquo;".html_safe %>
9
+ <% end %>
10
+
11
+ <%= render 'spree/shared/error_messages', target: @object %>
12
+
13
+ <%= form_for [:admin, @object] do |f| %>
14
+ <%= render "form", form: f %>
15
+ <div data-hook="supplier_right_column_wrapper" class="col-md-4"></div>
16
+ <%# render 'update' and 'cancel' buttons %>
17
+ <div class="col-md-8">
18
+ <%= render :partial => 'spree/admin/shared/edit_resource_links' %>
19
+ </div>
20
+ <% end %>
21
+
22
+
@@ -0,0 +1,71 @@
1
+ <%# Updated icon %>
2
+ <% content_for :page_actions do %>
3
+ <%= button_link_to Spree.t('new_supplier'), new_object_url, icon: 'add', class: 'btn-success' %>
4
+ <% end %>
5
+
6
+ <% content_for :page_title do %>
7
+ <%= Spree.t(:listing_suppliers) %>
8
+ <% end %>
9
+
10
+ <% content_for :table_filter_title do %>
11
+ <%= Spree.t(:search) %>
12
+ <% end %>
13
+
14
+ <% content_for :table_filter do %>
15
+ <div data-hook='admin_suppliers_filter'>
16
+ <%= search_form_for [:admin, @search] do |f| %>
17
+ <div class="form-group">
18
+ <%= f.label :name_cont, Spree.t(:name) %>
19
+ <%= f.text_field :name_cont, :size => 15, class: "form-control" %>
20
+ </div>
21
+ <div class="clear"></div>
22
+ <div class="form-actions" data-hook="admin_suppliers_index_search_buttons">
23
+ <%= button Spree.t(:search), 'search' %>
24
+ </div>
25
+ <% end %>
26
+ </div>
27
+ <% end %>
28
+
29
+ <%# This is a new paginate! %>
30
+ <%= render :partial => 'spree/admin/shared/index_table_options', :locals => { :collection => @collection } %>
31
+
32
+ <% if @collection.any? %>
33
+ <table class="table" id="listing_suppliers">
34
+ <thead>
35
+ <tr data-hook='admin_suppliers_index_headers'>
36
+ <th><%= sort_link @search, :name, Spree::Supplier.human_attribute_name(:name) %></th>
37
+ <th><%= sort_link @search, :email, Spree::Supplier.human_attribute_name(:email) %></th>
38
+ <th><%= Spree.t(:users) %></th>
39
+ <th><%= sort_link @search, :active, Spree::Supplier.human_attribute_name(:active) %></th>
40
+ <th data-hook="admin_suppliers_index_header_actions" class="actions"></th>
41
+ </tr>
42
+ </thead>
43
+ <tbody>
44
+ <%# Updated classes! %>
45
+ <%- @collection.each do |supplier| %>
46
+ <tr <%= "style='color: red;'" if supplier.deleted? %> id="<%= spree_dom_id supplier %>" data-hook="admin_suppliers_index_rows" class="<%= cycle('odd', 'even') %>">
47
+ <!--todo: Fix this link!-->
48
+ <td><%= link_to supplier.name, edit_object_url(supplier) %></td>
49
+ <td><%= mail_to supplier.email %></td>
50
+ <td><%= supplier.users.pluck(:email).join(', ') %></td>
51
+ <td><%= supplier.active %></td>
52
+ <td class='actions actions-3' data-hook='admin_suppliers_index_row_actions'>
53
+ <% unless supplier.deleted? %>
54
+ <%= link_to_edit supplier, :no_text => true, :class => 'edit' %>
55
+ <%= link_to_delete supplier, :no_text => true %>
56
+ <% end %>
57
+ </td>
58
+ </tr>
59
+ <% end %>
60
+ </tbody>
61
+ </table>
62
+ <% else %>
63
+ <%# New alert with link to add new supplier %>
64
+ <div class="alert alert-info no-objects-found">
65
+ <%= Spree.t(:no_resource_found, resource: Spree::Supplier.model_name.human(count: :many)) %>,
66
+ <%= link_to Spree.t(:add_one), spree.new_admin_supplier_path %>!
67
+ </div>
68
+ <% end %>
69
+
70
+ <%# This is a new paginate! %>
71
+ <%= render :partial => 'spree/admin/shared/index_table_options', :locals => { :collection => @collection } %>