Merge laura_and_will into icon_font

This commit is contained in:
summerscope
2014-05-30 17:01:49 +10:00
37 changed files with 218 additions and 77 deletions

View File

@@ -0,0 +1,2 @@
Darkswarm.controller "CartCtrl", ($scope, CurrentOrder) ->
$scope.CurrentOrder = CurrentOrder

View File

@@ -1,10 +1,11 @@
Darkswarm.directive "ofnEmptiesCart", (CurrentHub, Navigation) ->
Darkswarm.directive "ofnEmptiesCart", (CurrentHub, CurrentOrder, Navigation) ->
restrict: "A"
scope:
hub: '=ofnEmptiesCart'
template: "{{action}} <strong>{{hub.name}}</strong>"
link: (scope, elm, attr)->
if CurrentHub.id and CurrentHub.id isnt scope.hub.id
# A hub is selected, we're changing to a different hub, and the cart isn't empty
if CurrentHub.id and CurrentHub.id isnt scope.hub.id and not CurrentOrder.empty()
scope.action = attr.change
elm.bind 'click', (ev)->
ev.preventDefault()
@@ -12,5 +13,3 @@ Darkswarm.directive "ofnEmptiesCart", (CurrentHub, Navigation) ->
Navigation.go scope.hub.path
else
scope.action = attr.shop

View File

@@ -0,0 +1,7 @@
Darkswarm.factory 'CurrentOrder', (currentOrder) ->
new class CurrentOrder
constructor: ->
@[k] = v for k, v of currentOrder
empty: =>
@line_items.length == 0

View File

@@ -15,6 +15,3 @@ footer
&:hover, &:active, &:focus
color: $clr-brick-bright
@include textsoftpress
span.email
direction: rtl
unicode-bidi: bidi-override

View File

@@ -17,6 +17,7 @@
.producer-hero-img
background-color: #999
width: 100%
min-height: 160px
height: inherit
max-height: 260px
overflow: hidden

View File

@@ -4,4 +4,4 @@
.producers
@include fullwidthbg
background-image: url("/assets/producers/producers-pg-bg.jpg")
background-repeat: no-repeat
background-repeat: no-repeat

View File

@@ -71,3 +71,7 @@ table tr th, table tr td
color: #333333
table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td
color: #333333
span.email
direction: rtl
unicode-bidi: bidi-override

View File

@@ -15,11 +15,12 @@ class Enterprise < ActiveRecord::Base
has_and_belongs_to_many :payment_methods, join_table: 'distributors_payment_methods', class_name: 'Spree::PaymentMethod', foreign_key: 'distributor_id'
has_and_belongs_to_many :shipping_methods, join_table: 'distributors_shipping_methods', class_name: 'Spree::ShippingMethod', foreign_key: 'distributor_id'
delegate :latitude, :longitude, :city, :state_name, :to => :address
accepts_nested_attributes_for :address
has_attached_file :logo, :styles => { :medium => "300x300>", :thumb => "100x100>" }
has_attached_file :promo_image, :styles => { :large => "260x1200#", :thumb => "100x100>" }
has_attached_file :promo_image, :styles => { :large => "1200x260#", :thumb => "100x100>" }
validates_presence_of :name
validates_presence_of :address

View File

@@ -9,7 +9,7 @@ class EnterpriseGroup < ActiveRecord::Base
attr_accessible :name, :description, :long_description, :on_front_page, :enterprise_ids
attr_accessible :promo_image
has_attached_file :promo_image, styles: {large: "260x1200#"}
has_attached_file :promo_image, styles: {large: "1200x260#"}
validates_attachment_content_type :promo_image, :content_type => /\Aimage\/.*\Z/
attr_accessible :logo

View File

@@ -0,0 +1,10 @@
Spree::Classification.class_eval do
before_destroy :dont_destroy_if_primary_taxon
def dont_destroy_if_primary_taxon
if product.primary_taxon == taxon
errors.add :base, "Taxon #{taxon.name} is the primary taxon of #{product.name} and cannot be deleted"
return false
end
end
end

View File

@@ -6,6 +6,7 @@ Spree::Product.class_eval do
belongs_to :supplier, :class_name => 'Enterprise'
belongs_to :primary_taxon, class_name: 'Spree::Taxon'
has_many :product_distributions, :dependent => :destroy
has_many :distributors, :through => :product_distributions
@@ -13,9 +14,10 @@ Spree::Product.class_eval do
accepts_nested_attributes_for :product_distributions, :allow_destroy => true
delegate_belongs_to :master, :unit_value, :unit_description
attr_accessible :supplier_id, :distributor_ids, :product_distributions_attributes, :group_buy, :group_buy_unit_size, :variant_unit, :variant_unit_scale, :variant_unit_name, :unit_value, :unit_description, :notes
attr_accessible :supplier_id, :primary_taxon_id, :distributor_ids, :product_distributions_attributes, :group_buy, :group_buy_unit_size, :variant_unit, :variant_unit_scale, :variant_unit_name, :unit_value, :unit_description, :notes
validates_presence_of :supplier
validates_presence_of :primary_taxon
validates_presence_of :variant_unit, if: :has_variants?
validates_presence_of :variant_unit_scale,
@@ -25,6 +27,7 @@ Spree::Product.class_eval do
after_initialize :set_available_on_to_now, :if => :new_record?
after_save :update_units
before_save :add_primary_taxon_to_taxons
# -- Joins
@@ -124,10 +127,6 @@ Spree::Product.class_eval do
order_cycle.variants_distributed_by(distributor).where(product_id: self)
end
def primary_taxon
self.taxons.order.first
end
# Build a product distribution for each distributor
def build_product_distributions_for_user user
Enterprise.is_distributor.managed_by(user).each do |distributor|
@@ -163,6 +162,10 @@ Spree::Product.class_eval do
end
end
def add_primary_taxon_to_taxons
taxons << primary_taxon unless taxons.find_by_id(primary_taxon)
end
def self.all_variant_unit_option_types
Spree::OptionType.where('name LIKE ?', 'unit_%%')
end

View File

@@ -0,0 +1,4 @@
Deface::Override.new(:virtual_path => "spree/admin/products/_form",
:insert_top => "[data-hook='admin_product_form_right']",
:partial => "spree/admin/products/primary_taxon_form",
:name => "add_primary_taxon_to_admin_product")

View File

@@ -0,0 +1,4 @@
Deface::Override.new(:virtual_path => "spree/admin/products/new",
:insert_before => "[data-hook='new_product_attrs']",
:partial => "spree/admin/products/primary_taxon_form",
:name => "add_primary_taxon_to_admin_product_new")

View File

@@ -4,4 +4,3 @@
= f.label :notes, t(:notes)
= f.text_area :notes, { :class => 'fullwidth', rows: 5 }
= f.error_message_on :notes

View File

@@ -168,7 +168,7 @@
%br
100 x 100 pixels
.omega.eight.columns
= image_tag @object.logo.url if @object.logo.present?
= image_tag @object.logo(:medium) if @object.logo.present?
= f.file_field :logo
.row
.alpha.three.columns
@@ -177,5 +177,5 @@
%a What's this?
.omega.eight.columns
= image_tag @object.promo_image.url if @object.promo_image.present?
= image_tag @object.promo_image(:large) if @object.promo_image.present?
= f.file_field :promo_image

View File

@@ -0,0 +1,13 @@
object current_order
attributes :id, :item_total
if current_order
child line_items: :line_items do
attributes :id, :variant_id, :quantity, :price
end
node :cart_count do
cart_count
end
end

View File

@@ -16,6 +16,7 @@
%body.off-canvas{"ng-app" => "Darkswarm"}
= inject_json "currentHub", "current_hub"
= inject_json "currentOrder", "current_order"
= inject_json "user", "current_user"
.off-canvas-wrap{offcanvas: true}

View File

@@ -2,6 +2,6 @@
%i.ofn-i_040-hub>
Food Hubs
%h5 Our food hubs are the point of contact between you and the people who make your food!
%p You can search for a convenient hub by location or name. Some hubs have multiple points where you can pick-up your purchases, and some will also provide delivery options. Each food hub is a sales point with independent business operations and logisitics - so variations between hubs are to be expected.
%p You can only shop one food hub at a time.
%p You can search for a convenient hub by location or name. Some hubs have multiple points where you can pick-up your purchases, and some will also provide delivery options. Each food hub is a sales point with independent business operations and logistics - so variations between hubs are to be expected.
%p You can only shop at one food hub at a time.
%a.close-reveal-modal{"ng-click" => "$close()"} &#215;

View File

@@ -1,44 +1,46 @@
%ofn-modal{title: "{{producer.name}}"}
.row
.columns.small-12.producer-hero
%img.producer-hero-img{"ng-src" => "{{producer.promo_image}}"}
/ Will - scale large images down to 1200px wide, crop in to img aspect ratio 60W:13H
.small-12.columns.producer-hero
%h3.producer-name {{ producer.name }}
%img.producer-hero-img{"ng-src" => "{{producer.promo_image}}"}
.row
.columns.small-12.large-6{"ng-bind-html" => "producer.long_description"}
.columns.small-12.large-6
.small-12.large-6.columns
%p{"ng-bind-html" => "producer.long_description"}
.small-12.large-6.columns
%img.producer-logo{"ng-src" => "{{producer.logo}}", "ng-if" => "producer.logo"}
%h4 Stay in touch with {{ producer.name }}
%h5 Stay in touch with {{ producer.name }}
%ul.small-block-grid-1{bindonce: true}
%li{"ng-if" => "producer.website"}
%a{"ng-href" => "http://{{producer.website | stripUrl}}", target: "_blank" }
%i.ofn-i_049-web
{{ producer.website | stripUrl }}
%li{"ng-if" => "producer.email"}
%a{"ng-href" => "mailto:{{producer.email | stripUrl}}", target: "_blank" }
%i.ofn-i_050-mail-circle
{{ producer.email | stripUrl }}
%li{"ng-if" => "producer.twitter"}
%a{"ng-href" => "http://twitter.com/{{producer.twitter}}", target: "_blank"}
%i.ofn-i_041-twitter
{{ producer.twitter }}
%li{"ng-if" => "producer.facebook"}
%a{"ng-href" => "http://{{producer.facebook | stripUrl}}", target: "_blank"}
%i.ofn-i_044-facebook
{{ producer.facebook | stripUrl }}
%li{"ng-if" => "producer.linkedin"}
%a{"ng-href" => "http://{{producer.linkedin | stripUrl}}", target: "_blank"}
%i.ofn-i_042-linkedin
{{ producer.linkedin | stripUrl }}
%li{"ng-if" => "producer.instagram"}
%a{"ng-href" => "http://instagram.com/{{producer.instagram}}", target: "_blank"}
%i.ofn-i_043-instagram
{{ producer.instagram }}
%a.close-reveal-modal{"ng-click" => "$close()"} &#215;

View File

@@ -0,0 +1,5 @@
%a.icon{href: cart_url, "ng-controller" => "CartCtrl"}
%i.fi-shopping-cart.nav-branded
%span
{{ CurrentOrder.cart_count }}
items

View File

@@ -43,8 +43,4 @@
%span.nav-primary.nav-branded {{ CurrentHub.name }}
%li.divider
%li.cart
%a.icon{href: cart_url}
%i.ofn-i_027-shopping-cart.nav-branded
%span
= cart_count
items
= render partial: "shared/menu/cart"

View File

@@ -3,11 +3,7 @@
%a.left-off-canvas-toggle.menu-icon
%span
%section.right
%a.nav-branded.icon{href: cart_url}
%i.ofn-i_027-shopping-cart
%span
= cart_count
items
= render partial: "shared/menu/cart"
%a{href: main_app.shop_path}
{{ CurrentHub.name }}

View File

@@ -1,3 +1,7 @@
.content#about
%img.about.right{src: current_distributor.promo_image.url(:large)}
%p= current_distributor.long_description.andand.html_safe
.row
.small-12.large-9.columns
%p= current_distributor.long_description.andand.html_safe
.small-12.large-3.columns
%img.about.right{src: current_distributor.promo_image.url(:large)}

View File

@@ -1,15 +1,55 @@
/ Will for all the things: please add logic to include this /only/ if data is available
.content#contact
.panel
%p
%strong E
%a{href: "mailto:#{current_distributor.email}"}= current_distributor.email
- unless current_distributor.website.blank?
%br
%strong W
%a{href: current_distributor.website}= current_distributor.website
%br
= [current_distributor.address.address1, current_distributor.address.address2].join ", "
%br
= current_distributor.address.city
= current_distributor.address.state
= current_distributor.address.zipcode
.row
.small-12.large-4.columns
%h4=current_distributor.name
%p
= current_distributor.address.address1
- unless current_distributor.address.address2.blank?
%br
= current_distributor.address.address2
%br
= current_distributor.address.city
= current_distributor.address.state
= current_distributor.address.zipcode
.small-12.large-8.columns
%ul.small-block-grid-1.large-block-grid-2{bindonce: true}
- unless current_distributor.website.blank?
%li
%a{href: current_distributor.website, target: "_blank" }
%i.fi-web
= current_distributor.website
- unless current_distributor.email.blank?
%li
%a{href: current_distributor.email.reverse, mailto: true }
%i.fi-mail
%span.email
= current_distributor.email.reverse
- unless current_distributor.twitter.blank?
%li
%a{href: current_distributor.twitter, target: "_blank" }
%i.fi-social-twitter
= current_distributor.twitter
- unless current_distributor.facebook.blank?
%li
%a{href: current_distributor.facebook, target: "_blank" }
%i.fi-social-facebook
= current_distributor.facebook
- unless current_distributor.linkedin.blank?
%li
%a{href: current_distributor.linkedin, target: "_blank" }
%i.fi-social-linkedin
= current_distributor.linkedin
- unless current_distributor.instagram.blank?
%li
%a{href: current_distributor.instagram, target: "_blank" }
%i.fi-social-instagram
= current_distributor.instagram

View File

@@ -1,5 +1,10 @@
.content
%ul
- for group in current_distributor.groups
%li
%a{href: main_app.groups_path(anchor: "#/#group#{group.id}")}= group.name
.row
.small-12.columns
%h5
=current_distributor.name
belongs to:
%ul.ofn-list
- for group in current_distributor.groups
%li
%a{href: main_app.groups_path(anchor: "#/#group#{group.id}")}= group.name

View File

@@ -1,4 +1,8 @@
.content#producers{"ng-controller" => "ProducersTabCtrl"}
%ul
%li{"ng-repeat" => "producer in CurrentHub.producers"}
= render partial: "modals/producer"
.row
.small-12.columns
%h5
= "#{current_distributor.name}'s producers:"
%ul.ofn-list
%li{"ng-repeat" => "producer in CurrentHub.producers"}
= render partial: "modals/producer"

View File

@@ -1,7 +1,7 @@
#tabs{"ng-controller" => "TabsCtrl"}
.row
%tabset
- for name, heading in { about: "About Us",
%tabset.small-12.columns
- for name, heading in { about: "About #{current_distributor.name}",
producers: "Producers",
groups: "Groups",
contact: "Contact"}

View File

@@ -1,3 +1,3 @@
Paperclip::Attachment.default_options[:convert_options] = {
Paperclip::Attachment.default_options[:source_file_options] = {
all: "-auto-orient"
}

View File

@@ -1,7 +1,15 @@
class AddPrimaryTaxonToProducts < ActiveRecord::Migration
def change
add_column :spree_products, :primary_taxon_id, :integer
<<<<<<< HEAD
<<<<<<< HEAD
add_index :spree_products, :primary_taxon_id
add_foreign_key :spree_products, :spree_taxons, column: :primary_taxon_id
=======
>>>>>>> fd1e7eb... Adding primary taxon field to product
=======
add_index :spree_products, :primary_taxon_id
add_foreign_key :spree_products, :spree_taxons, column: :primary_taxon_id
>>>>>>> 110a6f2... Adding primary taxon to admin forms
end
end

View File

@@ -11,7 +11,7 @@
#
# It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 20140522015012) do
ActiveRecord::Schema.define(:version => 20140522044009) do
create_table "adjustment_metadata", :force => true do |t|
t.integer "adjustment_id"
@@ -681,6 +681,7 @@ ActiveRecord::Schema.define(:version => 20140522015012) do
t.float "variant_unit_scale"
t.string "variant_unit_name"
t.text "notes"
t.integer "primary_taxon_id"
end
add_index "spree_products", ["available_on"], :name => "index_products_on_available_on"
@@ -688,6 +689,7 @@ ActiveRecord::Schema.define(:version => 20140522015012) do
add_index "spree_products", ["name"], :name => "index_products_on_name"
add_index "spree_products", ["permalink"], :name => "index_products_on_permalink"
add_index "spree_products", ["permalink"], :name => "permalink_idx_unique", :unique => true
add_index "spree_products", ["primary_taxon_id"], :name => "index_spree_products_on_primary_taxon_id"
create_table "spree_products_promotion_rules", :id => false, :force => true do |t|
t.integer "product_id"
@@ -1092,6 +1094,7 @@ ActiveRecord::Schema.define(:version => 20140522015012) do
add_foreign_key "spree_products", "enterprises", name: "spree_products_supplier_id_fk", column: "supplier_id"
add_foreign_key "spree_products", "spree_shipping_categories", name: "spree_products_shipping_category_id_fk", column: "shipping_category_id"
add_foreign_key "spree_products", "spree_tax_categories", name: "spree_products_tax_category_id_fk", column: "tax_category_id"
add_foreign_key "spree_products", "spree_taxons", name: "spree_products_primary_taxon_id_fk", column: "primary_taxon_id"
add_foreign_key "spree_products_promotion_rules", "spree_products", name: "spree_products_promotion_rules_product_id_fk", column: "product_id"
add_foreign_key "spree_products_promotion_rules", "spree_promotion_rules", name: "spree_products_promotion_rules_promotion_rule_id_fk", column: "promotion_rule_id"

View File

@@ -10,6 +10,6 @@ describe Spree::Admin::BaseController do
it "redirects to Angular login" do
get :index
response.should redirect_to root_path(anchor: "login?after_login=#{spree.admin_path}")
response.should redirect_to root_path(anchor: "login?after_login=/anonymous")
end
end

View File

@@ -2,6 +2,9 @@ require 'ffaker'
require 'spree/core/testing_support/factories'
FactoryGirl.define do
factory :classification, class: Spree::Classification do
end
factory :order_cycle, :parent => :simple_order_cycle do
coordinator_fees { [create(:enterprise_fee, enterprise: coordinator)] }
@@ -150,6 +153,9 @@ end
FactoryGirl.modify do
factory :product do
primary_taxon { Spree::Taxon.first || FactoryGirl.create(:taxon) }
end
factory :simple_product do
# Fix product factory name sequence with Kernel.rand so it is not interpreted as a Spree::Product method
# Pull request: https://github.com/spree/spree/pull/1964
@@ -157,6 +163,7 @@ FactoryGirl.modify do
sequence(:name) { |n| "Product ##{n} - #{Kernel.rand(9999)}" }
supplier { Enterprise.is_primary_producer.first || FactoryGirl.create(:supplier_enterprise) }
primary_taxon { Spree::Taxon.first || FactoryGirl.create(:taxon) }
on_hand 3
variant_unit 'weight'

View File

@@ -223,20 +223,19 @@ feature %q{
scenario "creating a new product" do
s = FactoryGirl.create(:supplier_enterprise)
d = FactoryGirl.create(:distributor_enterprise)
taxon = create(:taxon)
login_to_admin_section
visit '/admin/products/bulk_edit'
#save_screenshot "/Users/willmarshall/Desktop/foo.png"
#save_and_open_page
find("a", text: "NEW PRODUCT").click
page.should have_content 'NEW PRODUCT'
fill_in 'product_name', :with => 'Big Bag Of Apples'
select(s.name, :from => 'product_supplier_id')
fill_in 'product_price', :with => '10.00'
select taxon.name, from: 'product_primary_taxon_id'
click_button 'Create'
URI.parse(current_url).path.should == '/admin/products/bulk_edit'

View File

@@ -6,6 +6,7 @@ feature %q{
} do
include AuthenticationWorkflow
include WebHelper
let!(:taxon) { create(:taxon) }
background do
@supplier = create(:supplier_enterprise, :name => 'New supplier')
@@ -22,6 +23,7 @@ feature %q{
fill_in 'product_name', with: 'A new product !!!'
fill_in 'product_price', with: '19.99'
select taxon.name, from: "product_primary_taxon_id"
select 'New supplier', from: 'product_supplier_id'
click_button 'Create'
@@ -43,6 +45,8 @@ feature %q{
product.reload
product.distributors.sort.should == [@distributors[0], @distributors[2]].sort
product.product_distributions.map { |pd| pd.enterprise_fee }.sort.should == [@enterprise_fees[0], @enterprise_fees[2]].sort
end
@@ -96,6 +100,7 @@ feature %q{
page.should have_selector('#product_supplier_id')
select 'Another Supplier', :from => 'product_supplier_id'
select taxon.name, from: "product_primary_taxon_id"
# Should only have suppliers listed which the user can manage
within "#product_supplier_id" do

View File

@@ -432,8 +432,8 @@ describe Enterprise do
let(:supplier) { create(:supplier_enterprise) }
let(:taxon1) { create(:taxon) }
let(:taxon2) { create(:taxon) }
let(:product1) { create(:simple_product, taxons: [taxon1]) }
let(:product2) { create(:simple_product, taxons: [taxon1, taxon2]) }
let(:product1) { create(:simple_product, primary_taxon: taxon1, taxons: [taxon1]) }
let(:product2) { create(:simple_product, primary_taxon: taxon1, taxons: [taxon1, taxon2]) }
it "gets all taxons of all distributed products" do
Spree::Product.stub(:in_distributor).and_return [product1, product2]

View File

@@ -0,0 +1,15 @@
require 'spec_helper'
module Spree
describe Classification do
let(:product) { create(:simple_product) }
let(:taxon) { create(:taxon) }
let(:classification) { create(:classification, taxon: taxon, product: product) }
it "won't destroy if classification is the primary taxon" do
product.primary_taxon = taxon
classification.destroy.should be_false
classification.errors.messages[:base].should == ["Taxon #{taxon.name} is the primary taxon of #{product.name} and cannot be deleted"]
end
end
end

View File

@@ -5,6 +5,7 @@ module Spree
describe "associations" do
it { should belong_to(:supplier) }
it { should belong_to(:primary_taxon) }
it { should have_many(:product_distributions) }
end
@@ -13,6 +14,12 @@ module Spree
create(:product).should be_valid
end
it "requires a primary taxon" do
product = create(:simple_product)
product.primary_taxon = nil
product.should_not be_valid
end
it "requires a supplier" do
product = create(:simple_product)
product.supplier = nil
@@ -565,10 +572,10 @@ module Spree
describe "Taxons" do
let(:taxon1) { create(:taxon) }
let(:taxon2) { create(:taxon) }
let(:product) { create(:simple_product, taxons: [taxon1, taxon2]) }
let(:product) { create(:simple_product) }
it "returns the first taxon as the primary taxon" do
product.primary_taxon.should == taxon1
product.taxons.should == [product.primary_taxon]
end
end
end