Merge remote-tracking branch 'origin/master' into HEAD

This commit is contained in:
Continuous Integration
2017-01-18 17:22:21 +11:00
60 changed files with 861 additions and 305 deletions

View File

@@ -50,7 +50,7 @@ gem 'gmaps4rails'
gem 'spinjs-rails'
gem 'rack-ssl', :require => 'rack/ssl'
gem 'custom_error_message', :github => 'jeremydurham/custom-err-msg'
gem 'angularjs-file-upload-rails', '~> 1.1.0'
gem 'angularjs-file-upload-rails', '~> 1.1.6'
gem 'roadie-rails', '~> 1.0.3'
gem 'figaro'
gem 'blockenspiel'

View File

@@ -154,7 +154,7 @@ GEM
railties (>= 3.1)
sprockets (~> 2)
tilt
angularjs-file-upload-rails (1.1.0)
angularjs-file-upload-rails (1.1.6)
angularjs-rails (1.5.5)
ansi (1.4.2)
arel (3.0.3)
@@ -649,7 +649,7 @@ DEPENDENCIES
acts-as-taggable-on (~> 3.4)
andand
angular-rails-templates (~> 0.2.0)
angularjs-file-upload-rails (~> 1.1.0)
angularjs-file-upload-rails (~> 1.1.6)
angularjs-rails (= 1.5.5)
atomic
awesome_print
@@ -737,4 +737,4 @@ RUBY VERSION
ruby 2.1.5p273
BUNDLED WITH
1.12.5
1.13.6

View File

@@ -6,7 +6,6 @@ angular.module("admin.enterprises")
$scope.menu.setItems [
{ name: 'primary_details', label: t('primary_details'), icon_class: "icon-home" }
{ name: 'users', label: t('users'), icon_class: "icon-user" }
{ name: 'address', label: t('address'), icon_class: "icon-map-marker" }
{ name: 'contact', label: t('contact'), icon_class: "icon-phone" }
{ name: 'social', label: t('social'), icon_class: "icon-twitter" }
@@ -20,11 +19,11 @@ angular.module("admin.enterprises")
{ name: 'inventory_settings', label: t('inventory_settings'), icon_class: "icon-list-ol", show: "enterpriseIsShop()" }
{ name: 'tag_rules', label: t('tag_rules'), icon_class: "icon-random", show: "enterpriseIsShop()" }
{ name: 'shop_preferences', label: t('shop_preferences'), icon_class: "icon-shopping-cart", show: "enterpriseIsShop()" }
{ name: 'users', label: t('users'), icon_class: "icon-user" }
]
$scope.select(0)
$scope.showItem = (item) ->
if item.show?
$parse(item.show)($scope)

View File

@@ -0,0 +1,11 @@
class SitemapController < ApplicationController
layout nil
def index
headers['Content-Type'] = 'application/xml'
@page_urls = [shops_url, map_url, producers_url, groups_url]
@enterprises = Enterprise.is_hub
@groups = EnterpriseGroup.all
respond_to :xml
end
end

View File

@@ -163,10 +163,18 @@ class Enterprise < ActiveRecord::Base
}
scope :distributing_products, lambda { |products|
with_distributed_products_outer.with_order_cycles_and_exchange_variants_outer.
where('product_distributions.product_id IN (?) OR spree_variants.product_id IN (?)', products, products).
select('DISTINCT enterprises.*')
# TODO: remove this when we pull out product distributions
pds = joins("INNER JOIN product_distributions ON product_distributions.distributor_id = enterprises.id").
where("product_distributions.product_id IN (?)", products).select('DISTINCT enterprises.id')
exs = joins("INNER JOIN exchanges ON (exchanges.receiver_id = enterprises.id AND exchanges.incoming = 'f')").
joins('INNER JOIN exchange_variants ON (exchange_variants.exchange_id = exchanges.id)').
joins('INNER JOIN spree_variants ON (spree_variants.id = exchange_variants.variant_id)').
where('spree_variants.product_id IN (?)', products).select('DISTINCT enterprises.id')
where(id: pds | exs)
}
scope :managed_by, lambda { |user|
if user.has_spree_role?('admin')
scoped

View File

@@ -1,8 +1,6 @@
- content_for :page_title do
= t(:account)
- if @invoices.empty?
%h4= t(:no_invoices_to_display)

View File

@@ -9,7 +9,7 @@
%fieldset.no-border-bottom
%legend
=t :admin_settings
= t(:admin_settings)
= form_for @settings, as: :settings, url: main_app.admin_accounts_and_billing_settings_path, :method => :put do |f|
.row{ ng: { app: 'admin.accounts_and_billing_settings' } }
.twelve.columns.alpha.omega

View File

@@ -4,10 +4,10 @@
%table.index
%thead
%tr
%th Distributor
%th Order Cycle
%th Status
%th Diff
%th= t('.distributor')
%th= t('.order_cycle')
%th= t('.status')
%th= t('.diff')
%tbody
- @results.each do |result|
%tr

View File

@@ -1,8 +1,7 @@
= render 'spree/admin/shared/configuration_menu'
- content_for :page_title do
Content
= t('.title')
= form_tag main_app.admin_content_path, method: :put, multipart: true do
#preferences

View File

@@ -1,5 +1,5 @@
= content_for :page_title do
=t :Enterprise_Fees
= t('.title')
= ng_form_for @enterprise_fee_set, :url => main_app.bulk_update_admin_enterprise_fees_path, :html => {'ng-app' => 'admin.enterpriseFees', 'ng-controller' => 'enterpriseFeesCtrl'} do |enterprise_fee_set_form|
= hidden_field_tag 'enterprise_id', @enterprise.id if @enterprise
@@ -12,17 +12,17 @@
%thead
%tr
%th
=t'Enterprise'
= t('.enterprise')
%th
=t'fee_type'
= t('.fee_type')
%th
=t'name'
= t('.name')
%th
=t'tax_category'
= t('.tax_category')
%th
=t'calculator'
= t('.calculator')
%th
=t'calculator_values'
= t('.calculator_values')
%th.actions
%tbody
= enterprise_fee_set_form.ng_fields_for :collection do |f|

View File

@@ -3,7 +3,7 @@
- if admin_user?
= content_for :page_actions do
%li= button_link_to "New Enterprise Group", main_app.new_admin_enterprise_group_path
%li= button_link_to t('.new_button'), main_app.new_admin_enterprise_group_path
%table.index#listing_enterprise_groups
%thead

View File

@@ -1,4 +1,4 @@
= link_to_with_icon('icon-edit', 'Edit Profile', main_app.edit_admin_enterprise_path(enterprise), class: 'edit')
= link_to_with_icon('icon-edit', t('.edit_profile'), main_app.edit_admin_enterprise_path(enterprise), class: 'edit')
%br/
- if can? :destroy, enterprise
@@ -6,27 +6,27 @@
%br/
- if enterprise.is_primary_producer
= link_to_with_icon 'icon-dashboard', 'Properties', main_app.admin_enterprise_producer_properties_path(enterprise_id: enterprise)
= link_to_with_icon 'icon-dashboard', t('.properties'), main_app.admin_enterprise_producer_properties_path(enterprise_id: enterprise)
(#{enterprise.producer_properties.count})
%br/
- if enterprise.is_distributor
- if can?(:admin, Spree::PaymentMethod) && can?(:manage_payment_methods, enterprise)
= link_to_with_icon 'icon-chevron-right', 'Payment Methods', spree.admin_payment_methods_path(enterprise_id: enterprise.id)
= link_to_with_icon 'icon-chevron-right', t('.payment_methods'), spree.admin_payment_methods_path(enterprise_id: enterprise.id)
(#{enterprise.payment_methods.count})
- if enterprise.payment_methods.count == 0
%span.icon-exclamation-sign{"ofn-with-tip" => "This enterprise has no payment methods", style: "font-size: 16px;color: #DA5354"}
%span.icon-exclamation-sign{"ofn-with-tip" => t('.payment_methods_tip'), style: "font-size: 16px;color: #DA5354"}
%br/
- if can?(:admin, Spree::ShippingMethod) && can?(:manage_shipping_methods, enterprise)
= link_to_with_icon 'icon-plane', 'Shipping Methods', spree.admin_shipping_methods_path(enterprise_id: enterprise.id)
= link_to_with_icon 'icon-plane', t('.shipping_methods'), spree.admin_shipping_methods_path(enterprise_id: enterprise.id)
(#{enterprise.shipping_methods.count})
- if enterprise.shipping_methods.count == 0
%span.icon-exclamation-sign{"ofn-with-tip" => "This enterprise has shipping methods", style: "font-size: 16px;color: #DA5354"}
%span.icon-exclamation-sign{"ofn-with-tip" => t('.shipping_methods_tip'), style: "font-size: 16px;color: #DA5354"}
%br/
- if can?(:admin, EnterpriseFee) && can?(:manage_enterprise_fees, enterprise)
= link_to_with_icon 'icon-money', 'Enterprise Fees', main_app.admin_enterprise_fees_path(enterprise_id: enterprise.id)
= link_to_with_icon 'icon-money', t('.enterprise_fees'), main_app.admin_enterprise_fees_path(enterprise_id: enterprise.id)
(#{enterprise.enterprise_fees.count})
- if enterprise.enterprise_fees.count == 0
%span.icon-warning-sign{"ofn-with-tip" => "This enterprise has no fees", style: "font-size: 16px;color: orange"}
%span.icon-warning-sign{"ofn-with-tip" => t('.enterprise_fees_tip'), style: "font-size: 16px;color: orange"}

View File

@@ -15,13 +15,13 @@
%col{style: "width: 25%;"}/
%thead
%tr{"data-hook" => "enterprises_header"}
%th Name
%th Role
%th= t('.name')
%th= t('.role')
- if spree_current_user.admin?
%th Sells
%th Visible?
%th= t('.sells')
%th= t('.visible')
- if spree_current_user.admin?
%th Owner
%th= t('.owner')
%th
%tbody
= f.fields_for :collection do |enterprise_form|
@@ -30,7 +30,7 @@
%td= link_to enterprise.name, main_app.edit_admin_enterprise_path(enterprise)
%td
= enterprise_form.check_box :is_primary_producer
Producer
= t('.producer')
- if spree_current_user.admin?
%td= enterprise_form.select :sells, Enterprise::SELLS, {}, class: 'select2 fullwidth'
%td= enterprise_form.check_box :visible
@@ -41,4 +41,4 @@
- if @enterprises.empty?
%tr
%td{colspan: "4"}= t(:none)
= f.submit 'Update'
= f.submit t(:update)

View File

@@ -12,36 +12,36 @@
.basic_producer.option.one-third.column.alpha
%a.full-width.button.selector{ ng: { click: "sells='none'", class: "{selected: sells=='none'}" } }
.top
%h3 Producer Profile
%p Connect through OFN
.bottom ALWAYS FREE
%h3= t('.producer_profile')
%p= t('.connect_ofn')
.bottom= t('.always_free')
%p.description
Add your products to Open Food Network, allowing hubs to stock your products in their stores.
= t('.producer_description_text')
.producer_shop.option.one-third.column
%a.full-width.button.selector{ ng: { click: "sells='own'", class: "{selected: sells=='own'}" } }
.top
%h3 Producer Shop
%p Sell your own produce
%h3= t('.producer_shop')
%p= t('.sell_your_produce')
.bottom
%monthly-pricing-description{ joiner: "newline" }
%p.description
Sell your products directly to customers through your very own Open Food Network shopfront.
= t('.producer_description_text')
%br
%br
A Producer Shop is for your produce only, if you want to sell produce grown/produced off site, select 'Producer Hub'.
= t('.producer_description_text2')
.full_hub.option.one-third.column.omega
%a.full-width.button.selector{ ng: { click: "sells='any'", class: "{selected: sells=='any'}" } }
.top
%h3 Producer Hub
%p Sell produce from self and others
%h3= t('.producer_hub')
%p= t('.producer_hub_text')
.bottom
%monthly-pricing-description{ joiner: "newline" }
%p.description
Your enterprise is the backbone of your local food system. You can sell your own produce as well as produce aggregated from other enterprises through your shopfront on the Open Food Network.
= t('.producer_hub_description_text')
-# %p.description
-# Test out having your own shopfront with full access to all Shopfront features for 30 days.
@@ -55,38 +55,38 @@
.shop_profile.option.six.columns
%a.full-width.button.selector{ ng: { click: "sells='none'", class: "{selected: sells=='none'}" } }
.top
%h3 Profile Only
%p Get a listing
.bottom ALWAYS FREE
%h3= t('.profile')
%p= t('.get_listing')
.bottom= t('.always_free')
%p.description
People can find and contact you on the Open Food Network. Your enterprise will be visible on the map, and will be searchable in listings.
= t('.profile_description_text')
.full_hub.option.six.columns
%a.full-width.button.selector{ ng: { click: "sells='any'", class: "{selected: sells=='any'}" } }
.top
%h3 Hub Shop
%p Sell produce from others
%h3= t('.hub_shop')
%p= t('.hub_shop_text')
.bottom
%monthly-pricing-description{ joiner: "newline" }
%p.description
Your enterprise is the backbone of your local food system. You aggregate produce from other enterprises and can sell it through your shop on the Open Food Network.
= t('.hub_shop_description_text')
.two.columns.omega
&nbsp;
.row
.sixteen.columns.alpha
%span.error{ ng: { show: "(change_type.sells.$error.required || change_type.sells.$error.pattern) && submitted" } }
Please choose one of the options above.
= t('.choose_option')
- if @enterprise.sells == 'unspecified' && @enterprise.shop_trial_start_date.nil?
-if free_use?
%input.button.big{ type: 'submit', value: 'Select and continue', ng: { click: "submit(change_type)" } }
%input.button.big{ type: 'submit', value: t(:select_continue), ng: { click: "submit(change_type)" } }
- else
- trial_length = Spree::Config[:shop_trial_length_days]
%input.button.big{ type: 'submit', value: "Start #{trial_length}-Day Shop Trial", ng: { click: "submit(change_type)", show: "sells=='own' || sells=='any'" } }
%input.button.big{ type: 'submit', value: 'Select and continue', ng: { click: "submit(change_type)", hide: "sells=='own' || sells=='any'" } }
%input.button.big{ type: 'submit', value: t(:select_continue), ng: { click: "submit(change_type)", hide: "sells=='own' || sells=='any'" } }
- elsif @enterprise.sells == 'unspecified'
%input.button.big{ type: 'submit', value: 'Select and continue', ng: { click: "submit(change_type)" } }
%input.button.big{ type: 'submit', value: t(:select_continue), ng: { click: "submit(change_type)" } }
- else
%input.button.big{ type: 'submit', value: 'Change now', ng: { click: "submit(change_type)" } }
%input.button.big{ type: 'submit', value: t('.change_now'), ng: { click: "submit(change_type)" } }
%br &nbsp;
%hr

View File

@@ -2,7 +2,7 @@
.row{ 'ng-hide' => '!loaded' }
.controls{ :class => "sixteen columns alpha", :style => "margin-bottom: 15px;" }
.four.columns.alpha
%input{ :class => "fullwidth", :type => "text", :id => 'quick_search', 'ng-model' => 'quickSearch', :placeholder => 'Search By Name' }
%input{ :class => "fullwidth", :type => "text", :id => 'quick_search', 'ng-model' => 'quickSearch', :placeholder => t('.search_placeholder') }
.six.columns &nbsp;
-# = render 'admin/shared/bulk_actions_dropdown'
.three.columns &nbsp;
@@ -41,7 +41,7 @@
%i.icon-status{ ng: { class: "enterprise.status" } }
%td.manage{ ng: { show: 'columns.manage.visible' } }
%a.button.fullwidth{ ng: { href: '{{::enterprise.edit_path}}' } }
Manage
= t('.manage')
%i.icon-arrow-right
%tr.panel-row{ object: "enterprise", panels: "{producer: 'enterprise_producer', package: 'enterprise_package', status: 'enterprise_status'}" }

View File

@@ -1,98 +1,97 @@
.row
.three.columns.alpha
= f.label :name
= f.label :name, t('admin.enterprises.form.primary_details.name')
%span.required *
.nine.columns.omega
= f.text_field :name, { placeholder: "eg. Professor Plum's Biodynamic Truffles", class: "fullwidth" }
= f.text_field :name, { placeholder: t('admin.enterprises.form.primary_details.name_placeholder'), class: "fullwidth" }
- if spree_current_user.admin?
.row
.three.columns.alpha
=f.label :owner_id, 'Owner'
=f.label :owner_id, t('.owner')
%span.required *
%div{'ofn-with-tip' => "The primary user responsible for this enterprise."}
%a What's this?
%div{'ofn-with-tip' => t('.owner_tip')}
%a= t('admin.whats_this')
.nine.columns.omega
- owner_email = @enterprise.andand.owner.andand.email || ""
= f.hidden_field :owner_id, class: "select2 fullwidth", 'user-select' => 'Enterprise.owner'
.row
.three.columns.alpha
%label Primary Producer?
%div{'ofn-with-tip' => "Select 'Producer' if you are a primary producer of food."}
%a What's this?
%label= t('admin.enterprises.form.primary_details.primary_producer')
%div{'ofn-with-tip' => t('admin.enterprises.form.primary_details.primary_producer_tip')}
%a= t('admin.whats_this')
.five.columns.omega
= f.check_box :is_primary_producer, 'ng-model' => 'Enterprise.is_primary_producer'
&nbsp;
= f.label :is_primary_producer, 'I am a Producer'
= f.label :is_primary_producer, t('.i_am_producer')
- if spree_current_user.admin?
.row
.alpha.eleven.columns
.three.columns.alpha
= f.label :sells, 'Sells'
%div{'ofn-with-tip' => "None - enterprise does not sell to customers directly.<br />Own - Enterprise sells own products to customers.<br />Any - Enterprise can sell own or other enterprises products.<br />"}
= f.label :sells, t('admin.enterprises.form.primary_details.sells')
%div{'ofn-with-tip' => t('admin.enterprises.form.primary_details.sells_tip')}
%a What's this?
.two.columns
= f.radio_button :sells, "none", 'ng-model' => 'Enterprise.sells'
&nbsp;
= f.label :sells, "None", value: "none"
= f.label :sells, t('admin.enterprises.form.primary_details.none'), value: "none"
.two.columns
= f.radio_button :sells, "own", 'ng-model' => 'Enterprise.sells'
&nbsp;
= f.label :sells, "Own", value: "own"
= f.label :sells, t('admin.enterprises.form.primary_details.own'), value: "own"
.four.columns.omega
= f.radio_button :sells, "any", 'ng-model' => 'Enterprise.sells'
&nbsp;
= f.label :sells, "Any", value: "any"
= f.label :sells, t('admin.enterprises.form.primary_details.any'), value: "any"
.row
.alpha.three.columns
= f.label :contact, 'Contact Name'
= f.label :contact, t('.contact_name')
.omega.nine.columns
= f.text_field :contact, { placeholder: "eg. Gustav Plum"}
= f.text_field :contact, { placeholder: t('admin.enterprises.form.contact.name_placeholder')}
.row
.alpha.three.columns
= f.label :email_address
= f.label :email_address, t('admin.enterprises.form.contact.email_address')
.omega.nine.columns
= f.text_field :email_address, { placeholder: "eg. gustav@truffles.com", "ng-model" => "Enterprise.email_address" }
= f.text_field :email_address, { placeholder: t('admin.enterprises.form.contact.email_address_placeholder'), "ng-model" => "Enterprise.email_address" }
.row
.alpha.three.columns
= f.label :phone
= f.label :phone, t('admin.enterprises.form.contact.phone')
.omega.nine.columns
= f.text_field :phone, { placeholder: "eg. 98 7654 3210"}
= f.text_field :phone, { placeholder: t('admin.enterprises.form.contact.phone_placeholder')}
.row
.alpha.three.columns
= f.label :website
= f.label :website, t('admin.enterprises.form.contact.website')
.omega.nine.columns
= f.text_field :website, { placeholder: "eg. www.truffles.com"}
= f.text_field :website, { placeholder: t('admin.enterprises.form.contact.website_placeholder')}
= f.fields_for :address do |af|
.row
.three.columns.alpha
= af.label :address1
= af.label :address1, t(:address)
%span.required *
.nine.columns.omega
= af.text_field :address1, { placeholder: "eg. 123 High Street"}
= af.text_field :address1, { placeholder: t(:address_placeholder)}
.row
.alpha.three.columns
= af.label :address2
= af.label :address2, t(:address2)
.nine.columns.omega
= af.text_field :address2
.row
.three.columns.alpha
= af.label :city, 'Suburb'
= af.label :city, t(:city)
\/
= af.label :zipcode, 'Postcode'
= af.label :zipcode, t(:postcode)
%span.required *
.four.columns
= af.text_field :city, { placeholder: "eg. Northcote"}
= af.text_field :city, { placeholder: t(:city_placeholder)}
.five.columns.omega
= af.text_field :zipcode, { placeholder: "eg. 3070"}
= af.text_field :zipcode, { placeholder: t(:postcode_placeholder)}
.row
.three.columns.alpha
= af.label :state_id, 'State'
= af.label :state_id, t(:state)
\/
= af.label :country_id, 'Country'
= af.label :country_id, t(:country)
.four.columns
= af.collection_select :state_id, af.object.country.states, :id, :name, {}, :class => "select2 fullwidth"
.five.columns.omega

View File

@@ -8,8 +8,8 @@
} do |f|
%save-bar{ dirty: "enterprise_form.$dirty", persist: "true" }
%input.red{ type: "button", value: "Update", ng: { click: "submit()", disabled: "!enterprise_form.$dirty" } }
%input{ type: "button", ng: { value: "enterprise_form.$dirty ? 'Cancel' : 'Close'", click: "cancel('#{main_app.admin_enterprises_path}')" } }
%input.red{ type: "button", value: t(:update), ng: { click: "submit()", disabled: "!enterprise_form.$dirty" } }
%input{ type: "button", ng: { value: "enterprise_form.$dirty ? '#{t(:cancel)}' : '#{t(:close)}'", click: "cancel('#{main_app.admin_enterprises_path}')" } }

View File

@@ -1,12 +1,11 @@
= render :partial => 'spree/shared/error_messages', :locals => { :target => @enterprise }
= render partial: 'spree/shared/error_messages', locals: { target: @enterprise }
- content_for :page_title do
Editing:
= t('.editing')
= @enterprise.name
- content_for :page_actions do
%li= button_link_to "Back to enterprises list", main_app.admin_enterprises_path, icon: 'icon-arrow-left'
%li= button_link_to t('.back_link'), main_app.admin_enterprises_path, icon: 'icon-arrow-left'
= render 'admin/enterprises/form_data'

View File

@@ -1,11 +1,11 @@
.row
.alpha.three.columns
= f.label :description, 'Short Description'
= f.label :description, t('.desc_short')
.omega.eight.columns
= f.text_field :description, maxlength: 255, placeholder: 'Tell us about your enterprise in one or two sentences'
= f.text_field :description, maxlength: 255, placeholder: t('.desc_short_placeholder')
.row
.alpha.three.columns
= f.label :long_description, 'About Us'
= f.label :long_description, t('.desc_long')
.omega.eight.columns
-# textAngular toolbar options, add to the ta-toolbar array below and separate into groups with extra ],[ if needed:
-# ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'pre', 'quote'],
@@ -14,4 +14,4 @@
-# ['html', 'insertImage', 'insertLink', 'insertVideo']
%text-angular{'ng-model' => 'Enterprise.long_description', 'id' => 'enterprise_long_description', 'name' => 'enterprise[long_description]', 'class' => 'text-angular',
'ta-toolbar' => "[['h1','h2','h3','h4','p'],['bold','italics','underline','clear'],['insertLink']]",
'placeholder' => 'Tell customers about yourself. This information appears on your public profile.'}
'placeholder' => t('.desc_long_placeholder')}

View File

@@ -1,34 +1,35 @@
-# redo denoting required fields in the whole project
.row
Required fields are denoted with an asterisk (
= t(:required_fields)
(
%span.required *
)
.row
.three.columns.alpha
= af.label :address1
= af.label :address1, t(:address)
%span.required *
.eight.columns.omega
= af.text_field :address1, { placeholder: "eg. 123 High Street"}
= af.text_field :address1, { placeholder: t(:address_placeholder) }
.row
.alpha.three.columns
= af.label :address2
= af.label :address2, t(:address2)
.eight.columns.omega
= af.text_field :address2
.row
.three.columns.alpha
= af.label :city, 'Suburb'
= af.label :city, t(:city)
\/
= af.label :zipcode, 'Postcode'
= af.label :zipcode, t(:postcode)
%span.required *
.four.columns
= af.text_field :city, { placeholder: "eg. Northcote"}
= af.text_field :city, { placeholder: t(:city_placeholder) }
.four.columns.omega
= af.text_field :zipcode, { placeholder: "eg. 3070"}
= af.text_field :zipcode, { placeholder: t(:postcode_placeholder) }
.row
.three.columns.alpha
= af.label :state_id, 'State'
= af.label :state_id, t(:state)
\/
= af.label :country_id, 'Country'
= af.label :country_id, t(:country)
%span.required *
.four.columns
= af.collection_select :state_id, af.object.country.states, :id, :name, {}, :class => "select2 fullwidth"

View File

@@ -1,14 +1,14 @@
.row
.alpha.three.columns
= f.label :abn, 'ABN'
= f.label :abn, t('.abn')
.omega.eight.columns
= f.text_field :abn, { placeholder: "eg. 99 123 456 789"}
= f.text_field :abn, { placeholder: t('.abn_placeholder') }
.row
.alpha.three.columns
= f.label :acn, 'ACN'
= f.label :acn, t('.acn')
.omega.eight.columns
= f.text_field :acn, { placeholder: "eg. 123 456 789"}
= f.text_field :acn, { placeholder: t('.acn_placeholder') }
.row
.three.columns.alpha
@@ -16,8 +16,8 @@
.two.columns
= f.radio_button :charges_sales_tax, true
&nbsp;
= f.label :charges_sales_tax, "Yes", :value => "true"
= f.label :charges_sales_tax, t(:say_yes), value: 'true'
.five.columns.omega
= f.radio_button :charges_sales_tax, false
&nbsp;
= f.label :charges_sales_tax, "No", :value => "false"
= f.label :charges_sales_tax, t(:say_no), value: 'false'

View File

@@ -1,20 +1,20 @@
.row
.alpha.three.columns
= f.label :contact, 'Name'
= f.label :contact, t('.name')
.omega.eight.columns
= f.text_field :contact, { placeholder: "eg. Gustav Plum"}
= f.text_field :contact, { placeholder: t('.name_placeholder') }
.row
.alpha.three.columns
= f.label :email_address
= f.label :email_address, t('.email_address')
.omega.eight.columns
= f.text_field :email_address, { placeholder: "eg. gustav@truffles.com" }
= f.text_field :email_address, { placeholder: t('.email_address_placeholder') }
.row
.alpha.three.columns
= f.label :phone
= f.label :phone, t('.phone')
.omega.eight.columns
= f.text_field :phone, { placeholder: "eg. 98 7654 3210"}
= f.text_field :phone, { placeholder: t('.phone_placeholder') }
.row
.alpha.three.columns
= f.label :website
= f.label :website, t('.website')
.omega.eight.columns
= f.text_field :website, { placeholder: "eg. www.truffles.com"}
= f.text_field :website, { placeholder: t('.website_placeholder') }

View File

@@ -2,8 +2,8 @@
%table
%thead
%tr
%th Name
%th Fee Type
%th= t('.name')
%th= t('.fee_type')
-# %th Calculator
-# %th Calculator Values
%tbody
@@ -16,15 +16,15 @@
%br
%div
%a.button{ href: "#{main_app.admin_enterprise_fees_path}"}
Manage Enterprise Fees
= t('.manage_fees')
%i.icon-arrow-right
- else
%p.text-center
You don't have any enterprise fees yet.
= t('.no_fees_yet')
%br
.text-center
%a.button{ href: "#{main_app.admin_enterprise_fees_path}"}
Create One Now
= t('.create_button')
%i.icon-arrow-right

View File

@@ -8,11 +8,13 @@
= f.file_field :logo
.row
.alpha.three.columns
= f.label :promo_image, 'ofn-with-tip' => 'This image is displayed in "About Us"'
= f.label :promo_image, 'ofn-with-tip' => t('.promo_image_placeholder')
%br/
%span{ style: 'font-weight:bold' } PLEASE NOTE:
Any promo image uploaded here will be cropped to 1200 x 260.
The promo image is displayed at the top of an enterprise's profile page and pop-ups.
%span{ style: 'font-weight:bold' }= t('.promo_image_note1')
%br
= t('.promo_image_note2')
%br
= t('.promo_image_note3')
.omega.eight.columns
= image_tag @object.promo_image(:large) if @object.promo_image.present?

View File

@@ -3,16 +3,17 @@
-# their inventory if they so choose
.row
.alpha.eleven.columns
You may opt to manage stock levels and prices in via your
= t('.text1')
= succeed "." do
%strong
%a{href: main_app.admin_inventory_path } inventory
If you are using the inventory tool, you can select whether new products added by your suppliers need to be added to your inventory before they can be stocked. If you are not using your inventory to manage your products you should select the 'recommended' option below:
%a{href: main_app.admin_inventory_path }= t('.inventory')
%br
= t('.text2')
.row
.alpha.eleven.columns
.five.columns.alpha
= radio_button :enterprise, :preferred_product_selection_from_inventory_only, "0", { 'ng-model' => 'Enterprise.preferred_product_selection_from_inventory_only' }
= label :enterprise, :preferred_product_selection_from_inventory_only, "New products can be put into my shopfront (recommended)"
= label :enterprise, :preferred_product_selection_from_inventory_only, t('.preferred_product_selection_from_inventory_only_yes')
.six.columns.omega
= radio_button :enterprise, :preferred_product_selection_from_inventory_only, "1", { 'ng-model' => 'Enterprise.preferred_product_selection_from_inventory_only' }
= label :enterprise, :preferred_product_selection_from_inventory_only, "New products must be added to my inventory before they can be put into my shopfront"
= label :enterprise, :preferred_product_selection_from_inventory_only, t('.preferred_product_selection_from_inventory_only_no')

View File

@@ -2,32 +2,32 @@
%table
%thead
%tr
%th Name
%th Applies?
%th= t('.name')
%th= t('.applies')
%th
%tbody
- @payment_methods.each do |payment_method|
%tr{ ng: { controller: 'paymentMethodsCtrl', init: "findPaymentMethodByID(#{payment_method.id})" } }
%td= payment_method.name
%td= f.check_box :payment_method_ids, { multiple: true, 'ng-model' => 'PaymentMethod.selected' }, payment_method.id, nil
%td= link_to "Edit", edit_admin_payment_method_path(payment_method)
%td= link_to t(:edit), edit_admin_payment_method_path(payment_method)
%br
.row
.six.columns.alpha
%a.button{ href: "#{admin_payment_methods_path}"}
Manage Payment Methods
= t('.manage')
%i.icon-arrow-right
.five.columns.omega.text-right
%a.button{ href: "#{new_admin_payment_method_path}"}
Create New Payment Method
= t('.create_button')
%i.icon-plus
- else
%p.text-center
You don't have any payment methods yet.
= t('.no_method_yet')
%br
.text-center
%a.button{ href: "#{new_admin_payment_method_path}"}
Create One Now
= t('.create_one_button')
%i.icon-arrow-right

View File

@@ -1,61 +1,61 @@
.row
.alpha.eleven.columns
.three.columns.alpha
= f.label :name
= f.label :name, t('.name')
%span.required *
.eight.columns.omega
= f.text_field :name, { placeholder: "eg. Professor Plum's Biodynamic Truffles" }
= f.text_field :name, { placeholder: t('.name_placeholder') }
- if @groups.present?
.row
.alpha.eleven.columns
.three.columns.alpha
= f.label :group_ids, 'Groups'
%div{'ofn-with-tip' => "Select any groups or regions that you are a member of. This will help customers find your enterprise."}
%a What's this?
= f.label :group_ids, t('.groups')
%div{'ofn-with-tip' => t('.groups_tip')}
%a= t('admin.whats_this')
.eight.columns.omega
= f.collection_select :group_ids, @groups, :id, :name, {}, class: "select2 fullwidth", multiple: true, placeholder: "Start typing to search available groups..."
= f.collection_select :group_ids, @groups, :id, :name, {}, class: "select2 fullwidth", multiple: true, placeholder: t('.groups_placeholder')
.row
.three.columns.alpha
%label Primary Producer
%div{'ofn-with-tip' => "Select 'Producer' if you are a primary producer of food."}
%a What's this?
%label= t('.primary_producer')
%div{'ofn-with-tip' => t('.primary_producer_tip')}
%a= t('admin.whats_this')
.five.columns.omega
= f.check_box :is_primary_producer, 'ng-model' => 'Enterprise.is_primary_producer'
= f.label :is_primary_producer, 'Producer'
= f.label :is_primary_producer, t('.producer')
- if spree_current_user.admin?
.row
.alpha.eleven.columns
.three.columns.alpha
= f.label :sells, 'Sells'
%div{'ofn-with-tip' => "None - enterprise does not sell to customers directly.<br />Own - Enterprise sells own products to customers.<br />Any - Enterprise can sell own or other enterprises products.<br />"}
%a What's this?
= f.label :sells, t('.sells')
%div{'ofn-with-tip' => t('.sells_tip')}
%a= t('admin.whats_this')
.two.columns
= f.radio_button :sells, "none", 'ng-model' => 'Enterprise.sells'
= f.label :sells, "None", value: "none"
= f.label :sells, t('.none'), value: "none"
.two.columns
= f.radio_button :sells, "own", 'ng-model' => 'Enterprise.sells'
= f.label :sells, "Own", value: "own"
= f.label :sells, t('.own'), value: "own"
.four.columns.omega
= f.radio_button :sells, "any", 'ng-model' => 'Enterprise.sells'
= f.label :sells, "Any", value: "any"
= f.label :sells, t('.any'), value: "any"
.row
.three.columns.alpha
%label Visible in search?
%div{'ofn-with-tip' => "Determines whether this enterprise will be visible to customers when searching the site."}
%a What's this?
%label= t('.visible_in_search')
%div{'ofn-with-tip' => t('.visible_in_search_tip')}
%a= t('admin.whats_this')
.two.columns
= f.radio_button :visible, true
= f.label :visible, "Visible", :value => "true"
= f.label :visible, t('.visible'), value: 'true'
.five.columns.omega
= f.radio_button :visible, false
= f.label :visible, "Not Visible", :value => "false"
= f.label :visible, t('.not_visible'), value: 'false'
.permalink{ ng: { controller: "permalinkCtrl" } }
.row{ ng: { show: "Enterprise.sells == 'own' || Enterprise.sells == 'any'" } }
.three.columns.alpha
= f.label :permalink, 'Permalink (no spaces)'
%div{'ofn-with-tip' => "This permalink is used to create the url to your shop: #{spree.root_url}your-shop-name/shop"}
%a What's this?
= f.label :permalink, t('.permalink')
%div{'ofn-with-tip' => t('.permalink_tip', link: spree.root_url)}
%a= t('admin.whats_this')
.six.columns
= f.text_field :permalink, { 'ng-model' => "Enterprise.permalink", placeholder: "eg. your-shop-name", 'ng-model-options' => "{ updateOn: 'default blur', debounce: {'default': 300, 'blur': 0} }" }
.two.columns.omega
@@ -65,9 +65,9 @@
%i{ ng: { class: "{'icon-ok-sign': availability == 'Available', 'icon-remove-sign': availability == 'Unavailable'}" } }
.row{ ng: { show: "Enterprise.sells == 'own' || Enterprise.sells == 'any'" } }
.three.columns.alpha
%label Link to shop front
%div{'ofn-with-tip' => "A direct link to your shopfront on the Open Food Network."}
%a What's this?
%label= t('.link_to_front')
%div{'ofn-with-tip' => t('.link_to_front_tip')}
%a= t('admin.whats_this')
.eight.columns.omega
= surround spree.root_url, "/shop" do
{{Enterprise.permalink}}

View File

@@ -2,8 +2,8 @@
%table
%thead
%tr
%th Name
%th Applies?
%th= t('.name')
%th= t('.applies')
%th
%tbody
- @shipping_methods.each do |shipping_method|
@@ -15,19 +15,19 @@
.row
.six.columns.alpha
%a.button{ href: "#{admin_shipping_methods_path}"}
Manage Shipping Methods
= t('.manage')
%i.icon-arrow-right
.five.columns.omega.text-right
%a.button{ href: "#{new_admin_shipping_method_path}"}
Create New Shipping Method
= t('.create_button')
%i.icon-plus
- else
%p.text-center
You don't have any shipping methods yet.
= t('.no_method_yet')
%br
.text-center
%a.button{ href: "#{new_admin_shipping_method_path}"}
Create One Now
= t('.create_one_button')
%i.icon-arrow-right

View File

@@ -5,7 +5,7 @@
.eight.columns.omega
%text-angular{'ng-model' => 'Enterprise.preferred_shopfront_message', 'id' => 'enterprise_preferred_shopfront_message', 'name' => 'enterprise[preferred_shopfront_message]', 'class' => 'text-angular',
'ta-toolbar' => "[['h1','h2','h3','h4','p'],['bold','italics','underline','clear'],['insertLink']]",
'placeholder' => 'An optional explanation for customers detailing how your shopfront works, to be displayed above the product list on your shop page.'}
'placeholder' => t('.shopfront_message_placeholder')}
.row
.alpha.eleven.columns
.three.columns.alpha
@@ -13,7 +13,7 @@
.eight.columns.omega
%text-angular{'ng-model' => 'Enterprise.preferred_shopfront_closed_message', 'id' => 'enterprise_preferred_shopfront_closed_message', 'name' => 'enterprise[preferred_shopfront_closed_message]', 'class' => 'text-angular',
'ta-toolbar' => "[['h1','h2','h3','h4','p'],['bold','italics','underline','clear'],['insertLink']]",
'placeholder' => 'A message which provides a more detailed explanation about why your shop is closed and/or when customers can expect it to open again. This is displayed on your shop only when you have no active order cycles (ie. shop is closed).'}
'placeholder' => t('.shopfront_closed_message_placeholder')}
.row
.alpha.eleven.columns
.three.columns.alpha
@@ -29,10 +29,10 @@
= f.label "enterprise_preferred_shopfront_order_cycle_order", t(:sort_order_cycles_on_shopfront_by)
.three.columns
= radio_button :enterprise, :preferred_shopfront_order_cycle_order, :orders_open_at, { 'ng-model' => 'Enterprise.preferred_shopfront_order_cycle_order' }
= label :enterprise, :preferred_shopfront_order_cycle_order_orders_open_at, "Open Date"
= label :enterprise, :preferred_shopfront_order_cycle_order_orders_open_at, t('.open_date')
.five.columns.omega
= radio_button :enterprise, :preferred_shopfront_order_cycle_order, :orders_close_at, { 'ng-model' => 'Enterprise.preferred_shopfront_order_cycle_order' }
= label :enterprise, :preferred_shopfront_order_cycle_order_orders_close_at, "Close Date"
= label :enterprise, :preferred_shopfront_order_cycle_order_orders_close_at, t('.close_date')
.row
.alpha.eleven.columns
.three.columns.alpha

View File

@@ -17,4 +17,4 @@
.alpha.three.columns
= f.label :twitter
.omega.eight.columns
= f.text_field :twitter, { placeholder: "eg. @the_prof" }
= f.text_field :twitter, { placeholder: t('.twitter_placeholder') }

View File

@@ -2,7 +2,7 @@
.eleven.columns.alpha.omega
%ofn-sortable{ axis: "y", handle: ".header", items: '.customer_tag', position: "tagGroup.position", after: { sort: "updateRuleCounts()" } }
.no_tags{ ng: { show: "tagGroups.length == 0" } }
No tags apply to this enterprise yet
= t('.no_tags_yet')
= render 'admin/enterprises/form/tag_rules/default_rules'
-# = render 'customer_tags'
.customer_tag{ id: "tg_{{tagGroup.position}}", ng: { repeat: "tagGroup in tagGroups" } }
@@ -14,14 +14,14 @@
%tr
%td
%h5
For customers tagged:
= t('.for_customers_tagged')
%td
%tags-with-translation{ object: "tagGroup", max: 1, on: { tag: { added: "updateTagsRulesFor(tagGroup)", removed: "updateTagsRulesFor(tagGroup)" } } }
.no_rules{ ng: { show: "tagGroup.rules.length == 0" } }
No rules apply to this tag yet
= t('.no_rules_yet')
.tag_rule{ ng: { repeat: "rule in tagGroup.rules" } }
.add_rule.text-center
%input.button.icon-plus{ type: 'button', value: "+ Add A New Rule", "add-new-rule-to" => "addNewRuleTo", "tag-group" => "tagGroup", "new-tag-rule-dialog" => true }
%input.button.icon-plus{ type: 'button', value: t('.add_new_rule'), "add-new-rule-to" => "addNewRuleTo", "tag-group" => "tagGroup", "new-tag-rule-dialog" => true }
.add_tag
%input.button.red.icon-plus{ type: 'button', value: "+ Add A New Tag", ng: { click: 'addNewTag()' } }
%input.button.red.icon-plus{ type: 'button', value: t('.add_new_tag'), ng: { click: 'addNewTag()' } }

View File

@@ -4,19 +4,17 @@
-if @enterprise.pending_any_confirmation?
.alert-box
- email = @enterprise.confirmed? ? @enterprise.unconfirmed_email : @enterprise.email
Email confirmation is pending.
We've sent a confirmation email to
%strong= "#{email}."
= link_to('Resend', main_app.enterprise_confirmation_path(enterprise: { id: @enterprise.id, email: email } ), method: :post)
= t('.email_confirmation_notice_html', {email: "<strong>#{email}</strong>".html_safe})
= link_to(t('.resend'), main_app.enterprise_confirmation_path(enterprise: { id: @enterprise.id, email: email } ), method: :post)
%a.close{ href: "#" } ×
.row
.three.columns.alpha
=f.label :owner_id, 'Owner'
=f.label :owner_id, t('.owner')
- if full_permissions
%span.required *
%div{'ofn-with-tip' => "The primary user responsible for this enterprise."}
%a What's this?
%div{'ofn-with-tip' => t('.owner_tip')}
%a= t('admin.whats_this')
.eight.columns.omega
- if full_permissions
= f.hidden_field :owner_id, class: "select2 fullwidth", 'user-select' => 'Enterprise.owner'
@@ -25,29 +23,29 @@
.row
.three.columns.alpha
= f.label :email, 'Notifications'
= f.label :email, t('.notifications')
- if full_permissions
%span.required *
.with-tip{'data-powertip' => "Notifications about orders will be send to this email address."}
%a What's this?
.with-tip{'data-powertip' => t('.notifications_tip')}
%a= t('admin.whats_this')
.eight.columns.omega
- if full_permissions
= f.text_field :email, { placeholder: "eg. gustav@truffles.com", "ng-model" => "Enterprise.email" }
= f.text_field :email, { placeholder: t('.notifications_placeholder'), "ng-model" => "Enterprise.email" }
- else
= @enterprise.email
.row{ ng: { hide: "pristineEmail == null || pristineEmail == Enterprise.email"} }
.alpha.three.columns
&nbsp;
.omega.eight.columns
Note: A new email address may need to be confirmed prior to use
= t('.notifications_note')
.row
.three.columns.alpha
=f.label :user_ids, 'Managers'
=f.label :user_ids, t('.managers')
- if full_permissions
%span.required *
%div{'ofn-with-tip' => "The other users with permission to manage this enterprise."}
%a What's this?
%div{'ofn-with-tip' => t('.managers_tip')}
%a= t('admin.whats_this')
.eight.columns.omega
- if full_permissions
%table

View File

@@ -6,10 +6,10 @@
%tr
%td
%h5
By Default
= t('.by_default')
%i.text-big.icon-question-sign.help-modal{ template: 'admin/modals/tag_rule_help.html' }
.no_rules{ ng: { show: "defaultTagGroup.rules.length == 0" } }
No default rules apply yet
= t('.no_rules_yet')
.tag_rule{ ng: { repeat: "rule in defaultTagGroup.rules" } }
.add_rule.text-center
%input.button.icon-plus{ type: 'button', value: "+ Add A New Default Rule", "add-new-rule-to" => "addNewRuleTo", "tag-group" => "defaultTagGroup", "new-tag-rule-dialog" => true }
%input.button.icon-plus{ type: 'button', value: t('.add_new_button'), "add-new-rule-to" => "addNewRuleTo", "tag-group" => "defaultTagGroup", "new-tag-rule-dialog" => true }

View File

@@ -1,19 +1,19 @@
- content_for :page_title do
Enterprises
= t('.title')
- content_for :page_actions do
= render 'admin/shared/user_guide_link'
- if spree_current_user.can_own_more_enterprises?
%li#new_product_link
= button_link_to "New Enterprise", main_app.new_admin_enterprise_path, :icon => 'icon-plus', :id => 'admin_new_enterprise_link'
= button_link_to t('.new_enterprise'), main_app.new_admin_enterprise_path, icon: 'icon-plus', id: 'admin_new_enterprise_link'
= admin_inject_monthly_bill_description
= admin_inject_column_preferences module: 'admin.enterprises', action: "enterprises_index"
= render 'admin/shared/enterprises_sub_menu'
= render :partial => 'spree/shared/error_messages', :locals => { :target => @enterprise_set }
= render partial: 'spree/shared/error_messages', locals: { target: @enterprise_set }
- if spree_current_user.admin?
= render 'admin_index'

View File

@@ -1,10 +1,10 @@
= render :partial => 'spree/shared/error_messages', :locals => { :target => @enterprise }
= render partial: 'spree/shared/error_messages', locals: { target: @enterprise }
- content_for :page_title do
New Enterprise
= t('.title')
- content_for :page_actions do
%li= button_link_to "Back to enterprises list", main_app.admin_enterprises_path, icon: 'icon-arrow-left'
%li= button_link_to t('.back_link'), main_app.admin_enterprises_path, icon: 'icon-arrow-left'
-# Form

View File

@@ -1,13 +1,13 @@
#welcome_page.sixteen.columns.alpha
%header
%h1 Welcome to the Open Food Network!
%h1= t('.welcome_title')
%p
You have successfully created a
= t('.welcome_text')
%strong
= "#{"producer " if @enterprise.is_primary_producer}profile"
%section
%h2 Next step
%p Choose your starting point:
%h2= t('.next_step')
%p= t('.choose_starting_point')
= render partial: "change_type_form"

View File

@@ -1,22 +1,22 @@
.row
.alpha.omega.sixteen.columns
%h3 Advanced Settings
%h3= t('.title')
= form_for [main_app, :admin, @order_cycle] do |f|
.row
.six.columns.alpha
= f.label "enterprise_preferred_product_selection_from_coordinator_inventory_only", t('admin.order_cycles.edit.choose_products_from')
.with-tip{'data-powertip' => "You can opt to restrict all available products (both incoming and outgoing), to only those in #{@order_cycle.coordinator.name}'s inventory."}
%a What's this?
.with-tip{'data-powertip' => t('.choose_product_tip', inventory: @order_cycle.coordinator.name)}
%a= t('admin.whats_this')
.four.columns
= f.radio_button :preferred_product_selection_from_coordinator_inventory_only, true
= f.label :preferred_product_selection_from_coordinator_inventory_only, "Coordinator's Inventory Only"
= f.label :preferred_product_selection_from_coordinator_inventory_only, t('.preferred_product_selection_from_coordinator_inventory_only_here')
.six.columns.omega
= f.radio_button :preferred_product_selection_from_coordinator_inventory_only, false
= f.label :preferred_product_selection_from_coordinator_inventory_only, "All Available Products"
= f.label :preferred_product_selection_from_coordinator_inventory_only, t('.preferred_product_selection_from_coordinator_inventory_only_all')
.row
.sixteen.columns.alpha.omega.text-center
%input{ type: 'submit', value: 'Save and Reload Page' }
or
%a{ href: "#", onClick: "toggleSettings()" } Close
%input{ type: 'submit', value: t('.save_reload') }
= t(:or)
%a{ href: "#", onClick: "toggleSettings()" }= t(:close)

View File

@@ -1,6 +1,6 @@
%ol.coordinator-fees
%li{'ng-repeat' => 'enterprise_fee in order_cycle.coordinator_fees'}
= select_tag 'order_cycle_coordinator_fee_{{ $index }}_id', nil, {'ng-model' => 'enterprise_fee.id', 'ng-options' => 'enterprise_fee.id as enterprise_fee.name for enterprise_fee in enterpriseFeesForEnterprise(order_cycle.coordinator_id)'}
= link_to 'Remove', '#', {'id' => 'order_cycle_coordinator_fee_{{ $index }}_remove', 'ng-click' => 'removeCoordinatorFee($event, $index)'}
= link_to t(:remove), '#', {'id' => 'order_cycle_coordinator_fee_{{ $index }}_remove', 'ng-click' => 'removeCoordinatorFee($event, $index)'}
= f.submit 'Add coordinator fee', 'ng-click' => 'addCoordinatorFee($event)'
= f.submit t('.add'), 'ng-click' => 'addCoordinatorFee($event)'

View File

@@ -3,55 +3,54 @@
-if Enterprise.managed_by(spree_current_user).include? @order_cycle.coordinator
= render 'coordinator_fees', f: f
%h2 Incoming
%h2= t('.incoming')
%table.exchanges
%thead
%tr
%th Supplier
%th= t('.supplier')
%th
Products
=t('.products')
= surround '(', ')' do
%a{href: '#', 'ng-click' => "OrderCycle.toggleAllProducts('incoming')"}
%span{'ng-show' => "OrderCycle.showProducts['incoming']"} Collapse all
%span{'ng-hide' => "OrderCycle.showProducts['incoming']"} Expand all
%th Receival details
%th Fees
%span{'ng-show' => "OrderCycle.showProducts['incoming']"}= t(:collapse_all)
%span{'ng-hide' => "OrderCycle.showProducts['incoming']"}= t(:expand_all)
%th= t('.receival_details')
%th= t('.fees')
%th.actions
%tbody.panel-ctrl{ object: 'exchange', 'ng-repeat' => 'exchange in order_cycle.incoming_exchanges'}
= render 'exchange_form', :f => f, :type => 'supplier'
= render 'exchange_form', f: f, type: 'supplier'
- if Enterprise.managed_by(spree_current_user).include? @order_cycle.coordinator
= render 'add_exchange_form', f: f, type: 'supplier'
%h2 Outgoing
%h2= t('.outgoing')
%table.exchanges
%thead
%tr
%th Distributor
%th= t('.distributor')
%th
Products
= t('.products')
= surround '(', ')' do
%a{href: '#', 'ng-click' => "OrderCycle.toggleAllProducts('outgoing')"}
%span{'ng-show' => "OrderCycle.showProducts['outgoing']"} Collapse all
%span{'ng-hide' => "OrderCycle.showProducts['outgoing']"} Expand all
%th{ ng: { if: 'enterprises[exchange.enterprise_id].managed || order_cycle.viewing_as_coordinator' } } Tags
%th Pickup / Delivery details
%span{'ng-show' => "OrderCycle.showProducts['outgoing']"}= t(:collapse_all)
%span{'ng-hide' => "OrderCycle.showProducts['outgoing']"}= t(:expand_all)
%th{ ng: { if: 'enterprises[exchange.enterprise_id].managed || order_cycle.viewing_as_coordinator' } }
= t('.tags')
%th= t('.delivery_details')
%th Fees
%th.actions
%tbody.panel-ctrl{ object: 'exchange', 'ng-repeat' => 'exchange in order_cycle.outgoing_exchanges'}
= render 'exchange_form', :f => f, :type => 'distributor'
= render 'exchange_form', f: f, type: 'distributor'
- if Enterprise.managed_by(spree_current_user).include? @order_cycle.coordinator
= render 'add_exchange_form', f: f, type: 'distributor'
.actions
%span{'ng-hide' => 'loaded()'} Loading...
%span{'ng-hide' => 'loaded()'}= t(:loading)
- unless Rails.env.production?
#order-cycles-debug
%h2 Debug information
%h2= t('.debug_info')
%pre loaded = {{ loaded() | json }}
%hr/

View File

@@ -1,13 +1,13 @@
.row
.alpha.two.columns
= f.label :name
= f.label :name, t('.name')
.six.columns.omega
- if viewing_as_coordinator_of?(@order_cycle)
= f.text_field :name, 'ng-model' => 'order_cycle.name', 'required' => true, 'ng-disabled' => '!loaded()'
- else
{{ order_cycle.name }}
.two.columns
= f.label :orders_open_at, 'Orders open'
= f.label :orders_open_at, t('.orders_open')
.omega.six.columns
- if viewing_as_coordinator_of?(@order_cycle)
= f.text_field :orders_open_at, 'datetimepicker' => 'order_cycle.orders_open_at', 'ng-model' => 'order_cycle.orders_open_at', 'ng-disabled' => '!loaded()'
@@ -16,11 +16,11 @@
.row
.alpha.two.columns
= f.label :coordinator
= f.label :coordinator, t('.coordinator')
.six.columns.omega
= @order_cycle.coordinator.name
.two.columns
= f.label :orders_close_at, 'Orders close'
= f.label :orders_close, t('.orders_close')
.six.columns.omega
- if viewing_as_coordinator_of?(@order_cycle)
= f.text_field :orders_close_at, 'datetimepicker' => 'order_cycle.orders_close_at', 'ng-model' => 'order_cycle.orders_close_at', 'ng-disabled' => '!loaded()'

View File

@@ -13,7 +13,7 @@
- if suppliers.count > 3
%span{'ofn-with-tip' => supplier_list}
= suppliers.count
suppliers
= t('.suppliers')
- else
= supplier_list
%td= order_cycle.coordinator.name
@@ -23,12 +23,12 @@
- if distributors.count > 3
%span{'ofn-with-tip' => distributor_list}
= distributors.count
distributors
= t('.distributors')
- else
= distributor_list
%td.products
%span= "#{order_cycle.variants.count} variants"
%span= "#{order_cycle.variants.count} #{t('.variants')}"
%td.actions
= link_to '', main_app.edit_admin_order_cycle_path(order_cycle), class: 'edit-order-cycle icon-edit no-text'
@@ -36,4 +36,4 @@
= link_to '', main_app.clone_admin_order_cycle_path(order_cycle), class: 'clone-order-cycle icon-copy no-text'
- if can_delete?(order_cycle)
%td.actions
= link_to '', main_app.admin_order_cycle_path(order_cycle), class: 'delete-order-cycle icon-trash no-text', :method => :delete, data: { confirm: "Are you sure?" }
= link_to '', main_app.admin_order_cycle_path(order_cycle), class: 'delete-order-cycle icon-trash no-text', :method => :delete, data: { confirm: t(:are_you_sure) }

View File

@@ -2,23 +2,23 @@
.row
.alpha.two.columns
= label_tag 'Ready for'
= label_tag t('.ready_for')
.six.columns
= text_field_tag 'order_cycle_outgoing_exchange_0_pickup_time', '', 'id' => 'order_cycle_outgoing_exchange_0_pickup_time', 'placeholder' => 'Date / time', 'ng-model' => 'outgoing_exchange.pickup_time', 'size' => 30
= text_field_tag 'order_cycle_outgoing_exchange_0_pickup_time', '', 'id' => 'order_cycle_outgoing_exchange_0_pickup_time', 'placeholder' => t('.ready_for_placeholder'), 'ng-model' => 'outgoing_exchange.pickup_time', 'size' => 30
.two.columns
= label_tag 'Customer instructions'
= label_tag t('.customer_instructions')
.six.columns.omega
= text_field_tag 'order_cycle_outgoing_exchange_0_pickup_instructions', '', 'id' => 'order_cycle_outgoing_exchange_0_pickup_instructions', 'placeholder' => 'Pick-up or delivery notes', 'ng-model' => 'outgoing_exchange.pickup_instructions', 'size' => 30
= text_field_tag 'order_cycle_outgoing_exchange_0_pickup_instructions', '', 'id' => 'order_cycle_outgoing_exchange_0_pickup_instructions', 'placeholder' => t('.customer_instructions_placeholder'), 'ng-model' => 'outgoing_exchange.pickup_instructions', 'size' => 30
= label_tag 'Products'
= label_tag t('.products')
%table.exchanges
%tbody{ng: {repeat: "exchange in order_cycle.incoming_exchanges"}}
%tr.products
%td{ ng: { include: "'admin/panels/exchange_supplied_products.html'" } }
%br/
= label_tag 'Fees'
= label_tag t('.fees')
= render 'coordinator_fees', f: f
.actions
%span{'ng-hide' => 'loaded()'} Loading...
%span{'ng-hide' => 'loaded()'}= t(:loading)

View File

@@ -12,26 +12,24 @@
- if can? :notify_producers, @order_cycle
%li
= button_to "Notify producers", main_app.notify_producers_admin_order_cycle_path, :id => 'admin_notify_producers', :confirm => 'Are you sure?'
= button_to "Notify producers", main_app.notify_producers_admin_order_cycle_path, :id => 'admin_notify_producers', :confirm => t(:are_you_sure)
%li
%button#toggle_settings{ onClick: 'toggleSettings()' }
Advanced Settings
= t('.advanced_settings')
%i.icon-chevron-down
#advanced_settings{ hidden: true }
= render partial: "/admin/order_cycles/advanced_settings"
%h1
= t :edit_order_cycle
- ng_controller = order_cycles_simple_form ? 'AdminSimpleEditOrderCycleCtrl' : 'AdminEditOrderCycleCtrl'
= form_for [main_app, :admin, @order_cycle], :url => '', :html => {:class => 'ng order_cycle', 'ng-app' => 'admin.orderCycles', 'ng-controller' => ng_controller, name: 'order_cycle_form'} do |f|
%save-bar{ dirty: "order_cycle_form.$dirty", persist: "true" }
%input.red{ type: "button", value: "Update", ng: { click: "submit($event, null)", disabled: "!order_cycle_form.$dirty" } }
%input.red{ type: "button", value: "Update and Close", ng: { click: "submit($event, '#{main_app.admin_order_cycles_path}')", disabled: "!order_cycle_form.$dirty" } }
%input.red{ type: "button", value: t(:update), ng: { click: "submit($event, null)", disabled: "!order_cycle_form.$dirty" } }
%input.red{ type: "button", value: t('.update_and_close'), ng: { click: "submit($event, '#{main_app.admin_order_cycles_path}')", disabled: "!order_cycle_form.$dirty" } }
%input{ type: "button", ng: { value: "order_cycle_form.$dirty ? 'Cancel' : 'Close'", click: "cancel('#{main_app.admin_order_cycles_path}')" } }
- if order_cycles_simple_form

View File

@@ -3,7 +3,7 @@
= content_for :page_actions do
%li#new_order_cycle_link
= button_link_to t(:new_order_cycle), main_app.new_admin_order_cycle_path, :icon => 'icon-plus', :id => 'admin_new_order_cycle_link'
= button_link_to t(:new_order_cycle), main_app.new_admin_order_cycle_path, icon: 'icon-plus', id: 'admin_new_order_cycle_link'
- if @show_more
%li
= button_link_to t(:label_less), main_app.admin_order_cycles_path

View File

@@ -7,7 +7,7 @@
= form_for [main_app, :admin, @order_cycle], :url => '', :html => {:class => 'ng order_cycle', 'ng-app' => 'admin.orderCycles', 'ng-controller' => ng_controller, name: 'order_cycle_form'} do |f|
%save-bar{ dirty: "order_cycle_form.$dirty", persist: "true" }
%input.red{ type: "button", value: "Create", ng: { click: "submit($event, '#{main_app.admin_order_cycles_path}')", disabled: "!order_cycle_form.$dirty" } }
%input.red{ type: "button", value: t(:create), ng: { click: "submit($event, '#{main_app.admin_order_cycles_path}')", disabled: "!order_cycle_form.$dirty" } }
%input{ type: "button", ng: { value: "order_cycle_form.$dirty ? 'Cancel' : 'Close'", click: "cancel('#{main_app.admin_order_cycles_path}')" } }
- if order_cycles_simple_form

View File

@@ -4,8 +4,8 @@
%table.index.sortable{"data-hook" => "", "data-sortable-link" => main_app.update_positions_admin_enterprise_producer_properties_url(@enterprise)}
%thead
%tr{"data-hook" => "producer_properties_header"}
%th{colspan: "2"} Property
%th Value
%th{colspan: "2"}= t('.property')
%th= t('.value')
%th.actions
%tbody#producer_properties{"data-hook" => ""}
= f.fields_for :producer_properties do |pp_form|

View File

@@ -1,17 +1,14 @@
- content_for :page_title do
= "#{@enterprise.name}:"
Producer Properties
= t('.title')
- content_for :page_actions do
%ul.tollbar.inline-menu
%li
= link_to_add_fields t(:add_producer_property), 'tbody#producer_properties', class: 'icon-plus button'
= render 'spree/shared/error_messages', target: @enterprise
= form_for @enterprise, url: main_app.admin_enterprise_path(@enterprise), method: :put do |f|
= render 'form', f: f

View File

@@ -1 +1 @@
= button_link_to "User Guide", "http://www.openfoodnetwork.org/platform/user-guide/", :icon => 'icon-external-link', target: '_blank'
= button_link_to t('.user_guide'), "http://www.openfoodnetwork.org/platform/user-guide/", icon: 'icon-external-link', target: '_blank'

View File

@@ -1,3 +1,3 @@
%div.sixteen.columns.alpha.omega#loading{ ng: { cloak: true, if: 'hub_id && products.length == 0 && RequestMonitor.loading' } }
%img.spinner{ src: "/assets/spinning-circles.svg" }
%h1 LOADING INVENTORY
%h1= t('.loading_inventory')

View File

@@ -1,5 +1,5 @@
-# %show-more.text-center{ data: "filteredProducts", limit: "productLimit", increment: "10" }
.text-center{ ng: { show: "filteredProducts.length > productLimit" } }
%input{ type: 'button', value: 'Show More', ng: { click: 'productLimit = productLimit + 10' } }
or
%input{ type: 'button', value: "Show All ({{ filteredProducts.length - productLimit }} More)", ng: { click: 'productLimit = filteredProducts.length' } }
%input{ type: 'button', value: t(:show_more), ng: { click: 'productLimit = productLimit + 10' } }
= t(:or)
%input{ type: 'button', value: "#{t(:show_all)} ({{ filteredProducts.length - productLimit }} More)", ng: { click: 'productLimit = filteredProducts.length' } }

View File

@@ -16,7 +16,7 @@
-# TODO render this in Angular instead of server-side
-# The problem being how to render the partials
.row
.small-6.columns
.small-12.medium-12.large-6.columns
- available_payment_methods.each do |method|
.row
.small-12.columns
@@ -34,6 +34,6 @@
.row{"ng-if" => "order.payment_method_id == #{method.id}"}
.small-12.columns
= render partial: "spree/checkout/payment/#{method.method_type}", :locals => { :payment_method => method }
.small-12.columns.medium-6.columns.large-6.columns
.small-12.medium-12.large-6.columns
#distributor_address.panel{"ng-show" => "Checkout.paymentMethod().description"}
%span.pre-wrap {{ Checkout.paymentMethod().description }}

View File

@@ -13,7 +13,7 @@
"ng-class" => "{valid: shipping.$valid, open: accordion.shipping}"}
= render 'checkout/accordion_heading'
.small-12.columns.medium-6.columns.large-6.columns
.small-12.columns.medium-12.columns.large-6.columns
%label{"ng-repeat" => "method in ShippingMethods.shipping_methods"}
%input{type: :radio,
required: true,
@@ -38,7 +38,7 @@
%input{type: :checkbox, "ng-model" => "Checkout.default_ship_address"}
= t :checkout_default_ship_address
.small-12.columns.medium-6.columns.large-6.columns
.small-12.columns.medium-12.columns.large-6.columns
#distributor_address.panel{"ng-show" => "Checkout.shippingMethod().description"}
%span{ style: "white-space: pre-wrap;" }{{ Checkout.shippingMethod().description }}
%br/

View File

@@ -13,7 +13,7 @@
%link{href: "https://fonts.googleapis.com/css?family=Roboto:400,300italic,400italic,300,700,700italic|Oswald:300,400,700", rel: "stylesheet", type: "text/css"}
= yield :scripts
%script{src: "//maps.googleapis.com/maps/api/js?libraries=places,geometry"}
%script{src: "//maps.googleapis.com/maps/api/js?libraries=places,geometry#{ ENV['GOOGLE_MAPS_API_KEY'] ? '&key=' + ENV['GOOGLE_MAPS_API_KEY'] : ''} "}
= split_stylesheet_link_tag "darkswarm/all"
= javascript_include_tag "darkswarm/all"

View File

@@ -0,0 +1,17 @@
!!! XML
%urlset{xmlns: "http://www.sitemaps.org/schemas/sitemap/0.9"}
- for page_url in @page_urls
%url
%loc= page_url
%changefreq monthly
- for enterprise in @enterprises
%url
%loc= enterprise_shop_url(enterprise)
%lastmod= enterprise.updated_at.strftime('%Y-%m-%d')
%changefreq weekly
- for group in @groups
%url
%loc= group_url(group)
%changefreq monthly

View File

@@ -21,3 +21,6 @@ CURRENCY: AUD
#
# DISCOURSE_URL must be the URL of your Discourse instance.
#DISCOURSE_URL: "https://noticeboard.openfoodnetwork.org.au"
# see: https://developers.google.com/maps/documentation/javascript/get-api-key
# GOOGLE_MAPS_API_KEY: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

View File

@@ -11,7 +11,7 @@ en-GB:
Were you a guest last time? Perhaps you need to create an account or reset your password.
enterprise_confirmations:
enterprise:
confirmed: Thank you, your email address has been confirmed.
confirmed: Thankyou, your email address has been confirmed.
not_confirmed: Your email address could not be confirmed. Perhaps you have already completed this step?
confirmation_sent: "Confirmation email sent!"
confirmation_not_sent: "Could not send a confirmation email."
@@ -522,14 +522,14 @@ en-GB:
producers_title: Producers
producers_headline: Find local producers
producers_signup_title: Sign up as a producer
producers_signup_headline: Food producers, empowered.
producers_signup_motivation: Sell your food and tell your stories to diverse new markets. Save time and money on every overhead. We support innovation without the risk. We've levelled the playing field.
producers_signup_send: Join now
producers_signup_enterprise: Enterprise Accounts
producers_signup_headline: Food producers. Meet OFN.
producers_signup_motivation: Sell your food and tell your stories. Save time and money on every overhead. We support innovation without the risk. We're levelling the playing field.
producers_signup_send: Register
producers_signup_enterprise: Why the Open Food Network?
producers_signup_studies: Stories from our producers.
producers_signup_cta_headline: Join now!
producers_signup_cta_action: Join now
producers_signup_detail: Here's the detail.
producers_signup_cta_action: Register
producers_signup_detail: Got a question?
products_item: Item
products_description: Description
products_variant: Variant
@@ -537,7 +537,7 @@ en-GB:
products_available: Available?
products_producer: "Producer"
products_price: "Price"
register_title: Register
register_title: Find out more
sell_title: "Register"
sell_headline: "Get on the Open Food Network!"
sell_motivation: "Showcase your beautiful food."
@@ -875,7 +875,7 @@ en-GB:
spree_admin_single_enterprise_alert_mail_confirmation: "Please confirm the email address for"
spree_admin_single_enterprise_alert_mail_sent: "We've sent an email to"
spree_admin_overview_action_required: "Action Required"
spree_admin_overview_check_your_inbox: "Please check your inbox for further instructions. Thanks!"
spree_admin_overview_check_your_inbox: "Please check you inbox for further instructions. Thanks!"
change_package: "Change Package"
spree_admin_single_enterprise_hint: "Hint: To allow people to find you, turn on your visibility under"
your_profil_live: "Your profile live"

View File

@@ -70,9 +70,17 @@ en:
say_no: "No"
say_yes: "Yes"
then: then
sort_order_cycles_on_shopfront_by: "Sort Order Cycles On Shopfront By"
required_fields: Required fields are denoted with an asterisk
select_continue: Select and Continue
remove: Remove
or: or
collapse_all: Collapse all
expand_all: Expand all
loading: Loading...
show_more: Show more
show_all: Show all
cancel: Cancel
admin:
# Common properties / models
@@ -131,6 +139,31 @@ en:
update_address: 'Update Address'
confirm_delete: 'Sure to delete?'
cache_settings:
show:
distributor: Distributor
order_cycle: Order Cycle
status: Status
diff: Diff
contents:
edit:
title: Content
enterprise_fees:
index:
title: Entreprise Fees
enterprise: Enterprise
fee_type: Fee Type
name: Name
tax_category: Tax Category
calculator: Calculator
calculator_values: Calculator Values
enterprise_groups:
index:
new_button: New Enterprise Group
products:
bulk_edit:
unit: Unit
@@ -142,6 +175,8 @@ en:
av_on: "Av. On"
variant_overrides:
loading_flash:
loading_inventory: LOADING INVENTORY
index:
title: Inventory
description: Use this page to manage inventories for your enterprises. Any product details set here will override those set on the 'Products' page
@@ -193,11 +228,89 @@ en:
enterprises:
index:
producer?: Producer?
title: Enterprises
new_enterprise: New Enterprise
producer?: "Producer?"
package: Package
status: Status
manage: Manage
form:
about_us:
desc_short: Short Description
desc_short_placeholder: Tell us about your enterprise in one or two sentences
desc_long: About Us
desc_long_placeholder: Tell customers about yourself. This information appears on your public profile.
business_details:
abn: ABN
abn_placeholder: eg. 99 123 456 789
acn: ACN
acn_placeholder: eg. 123 456 789
contact:
name: Name
name_placeholder: eg. Gustav Plum
email_address: Email Address
email_address_placeholder: eg. gustav@truffles.com
phone: Phone
phone_placeholder: eg. 98 7654 3210
website: Website
website_placeholder: eg. www.truffles.com
enterprise_fees:
name: Name
fee_type: Fee Type
manage_fees: Manage Enterprise Fees
no_fees_yet: You don't have any enterprise fees yet.
create_button: Create One Now
images:
logo: Logo
promo_image_placeholder: 'This image is displayed in "About Us"'
promo_image_note1: 'PLEASE NOTE:'
promo_image_note2: Any promo image uploaded here will be cropped to 1200 x 260.
promo_image_note3: The promo image is displayed at the top of an enterprise's profile page and pop-ups.
inventory_settings:
text1: You may opt to manage stock levels and prices in via your
inventory: inventory
text2: "If you are using the inventory tool, you can select whether new products \
added by your suppliers need to be added to your inventory before they can be \
stocked. If you are not using your inventory to manage your products you should \
select the 'recommended' option below:"
preferred_product_selection_from_inventory_only_yes: New products can be put into my shopfront (recommended)
preferred_product_selection_from_inventory_only_no: New products must be added to my inventory before they can be put into my shopfront
payment_methods:
name: Name
applies: Applies?
manage: Manage Payment Methods
not_method_yet: You don't have any payment methods yet.
create_button: Create New Payment Method
create_one_button: Create One Now
primary_details:
name: Name
name_placeholder: eg. Professor Plum's Biodynamic Truffles
groups: Groups
groups_tip: Select any groups or regions that you are a member of. This will help customers find your enterprise.
groups_placeholder: Start typing to search available groups...
primary_producer: Primary Producer?
primary_producer_tip: Select 'Producer' if you are a primary producer of food.
producer: Producer
any: Any
none: None
own: Own
sells: Sells
sells_tip: "None - enterprise does not sell to customers directly.<br />Own - Enterprise sells own products to customers.<br />Any - Enterprise can sell own or other enterprises products.<br />"
visible_in_search: Visible in search?
visible_in_search_tip: Determines whether this enterprise will be visible to customers when searching the site.
visible: Visible
not_visible: Not visible
permalink: Permalink (no spaces)
permalink_tip: "This permalink is used to create the url to your shop: {{link}} your-shop-name/shop"
link_to_front: Link to shop front
link_to_front_tip: A direct link to your shopfront on the Open Food Network.
shipping_methods:
name: Name
applies: Applies?
manage: Manage Shipping Methods
create_button: Create New Shipping Method
create_one_button: Create One Now
no_method_yet: You don't have any shipping methods yet.
shop_preferences:
shopfront_requires_login: "Publicly visible shopfront?"
shopfront_requires_login_tip: "Choose whether customers must login to view the shopfront or if it's visible to everybody."
@@ -207,6 +320,142 @@ en:
allow_guest_orders_tip: "Allow checkout as guest or require a registered user."
allow_guest_orders_false: "Require login to order"
allow_guest_orders_true: "Allow guest checkout"
shopfront_message_placeholder: \
An optional explanation for customers detailing how your shopfront works, \
to be displayed above the product list on your shop page.
shopfront_closed_message_placeholder: \
A message which provides a more detailed explanation about why your shop is \
closed and/or when customers can expect it to open again. This is displayed \
on your shop only when you have no active order cycles (ie. shop is closed).
open_date: Open Date
close_date: Close Date
social:
twitter_placeholder: eg. @the_prof
tag_rules:
default_rules:
by_default: By Default
no_rules_yet: No default rules apply yet
add_new_button: '+ Add A New Default Rule'
no_tags_yet: No tags apply to this enterprise yet
no_rules_yet: No rules apply to this tag yet
for_customers_tagged: 'For customers tagged:'
add_new_rule: '+ Add A New Rule'
add_new_tag: '+ Add A New Tag'
users:
email_confirmation_notice_html: "Email confirmation is pending. We've sent a confirmation email to %{email}."
resend: Resend
owner: 'Owner'
owner_tip: The primary user responsible for this enterprise.
notifications: Notifications
notifications_tip: Notifications about orders will be send to this email address.
notifications_placeholder: eg. gustav@truffles.com
notifications_note: 'Note: A new email address may need to be confirmed prior to use'
managers: Managers
managers_tip: The other users with permission to manage this enterprise.
actions:
edit_profile: Edit Profile
properties: Properties
payment_methods: Payment Methods
payment_methods_tip: This enterprise has no payment methods
shipping_methods: Shipping Methods
shipping_methods_tip: This enterprise has shipping methods
enterprise_fees: Enterprise Fees
enterprise_fees_tip: This enterprise has no fees
admin_index:
name: Name
role: Role
sells: Sells
visible: Visible?
owner: Owner
producer: Producer
change_type_form:
producer_profile: Producer Profile
connect_ofn: Connect through OFN
always_free: ALWAYS FREE
producer_description_text: Add your products to Open Food Network, allowing hubs to stock your products in their stores.
producer_shop: Producer Shop
sell_your_produce: Sell your own produce
sell_description_text: Sell your products directly to customers through your very own Open Food Network shopfront.
sell_description_text2: A Producer Shop is for your produce only, if you want to sell produce grown/produced off site, select 'Producer Hub'.
producer_hub: Producer Hub
producer_hub_text: Sell produce from self and others
producer_hub_description_text: Your enterprise is the backbone of your local food system. You can sell your own produce as well as produce aggregated from other enterprises through your shopfront on the Open Food Network.
profile: Profile Only
get_listing: Get a listing
profile_description_text: People can find and contact you on the Open Food Network. Your enterprise will be visible on the map, and will be searchable in listings.
hub_shop: Hub Shop
hub_shop_text: Sell produce from others
hub_shop_description_text: Your enterprise is the backbone of your local food system. You aggregate produce from other enterprises and can sell it through your shop on the Open Food Network.
choose_option: Please choose one of the options above.
change_now: Change now
enterprise_user_index:
search_placeholder: Search By Name
manage: Manage
new_form:
owner: Owner
owner_tip: The primary user responsible for this enterprise.
i_am_producer: I am a Producer
contact_name: Contact Name
edit:
editing: 'Editing:'
back_link: Back to enterprises list
new:
title: New Enterprise
back_link: Back to enterprises list
welcome:
welcome_title: Welcome to the Open Food Network!
welcome_text: You have successfully created a
next_step: Next step
choose_starting_point: 'Choose your starting point:'
order_cycles:
advanced_settings:
title: Advanced Settings
choose_product_tip: You can opt to restrict all available products (both incoming and outgoing), to only those in {{inventory}}'s inventory.
preferred_product_selection_from_coordinator_inventory_only_here: Coordinator's Inventory Only
preferred_product_selection_from_coordinator_inventory_only_all: All Available Products
save_reload: Save and Reload Page
coordinator_fees:
add: Add coordinator fee
form:
incoming: Incoming
supplier: Supplier
products: Products
receival_details: Receival details
fees: Fees
outgoing: Outgoing
distributor: Distributor
products: Products
tags: Tags
delivery_detaisl: Pickup / Delivery details
debug_info: Debug information
name_and_timing_form:
name: Name
orders_open: Orders open at
coordinator: Coordinator
order_closes: Orders close
row:
suppliers: suppliers
distributors: distributors
variants: variants
simple_form:
ready_for: Ready for
ready_for_placeholder: Date / time
customer_instructions: Customer instructions
customer_instructions_placeholder: Pick-up or delivery notes
products: Products
fees: Fees
edit:
advanced_settings: Advanced Settings
update_and_close: Update and Close
producer_properties:
form:
property: Property
value: Value
index:
title: Producer Properties
shared:
user_guide_link:
user_guide: User Guide
home:
hubs:
@@ -256,10 +505,14 @@ en:
phone: Phone
next: Next
address: Address
address_placeholder: eg. 123 High Street
address2: Address (contd.)
city: City
city_placeholder: eg. Northcote
state: State
postcode: Postcode
postcode_placeholder: eg. 3070
state: State
country: Country
unauthorized: Unauthorized
terms_of_service: "Terms of service"
@@ -413,6 +666,8 @@ en:
order_payment_paypal_successful: Your payment via PayPal has been processed successfully.
order_hub_info: Hub Info
bom_tip: "Use this page to alter product quantities across multiple orders. Products may also be removed from orders entirely, if required."
unsaved_changes_warning: "Unsaved changes exist and will be lost if you continue."
unsaved_changes_error: "Fields with red borders contain errors."

View File

@@ -53,6 +53,17 @@ fr:
say_yes: "Oui"
then: puis
sort_order_cycles_on_shopfront_by: "Trier les cycles de vente par"
required_fields: "Les champs obligatoires sont annotés d'une astérisque"
select_continue: Sélectionner et Continuer
remove: Supprimer
or: ou
collapse_all: Réduire
expand_all: Etendre
loading: Chargement...
show_more: Voir plus
show_all: Voir tout
cancel: Annuler
admin:
date: Date
email: Email
@@ -100,6 +111,27 @@ fr:
select_country: 'Choisir le pays'
select_state: 'Choisir le département'
edit: 'Modifier'
cache_settings:
show:
distributor: Distributeur
order_cycle: Cycle de vente
status: Statut
diff: Diff
contents:
edit:
title: Contenu
enterprise_fees:
index:
title: Marges de l'entreprise
enterprise: Entreprise
fee_type: Type de marge
name: Nom
tax_category: TVA appliquée
calculator: Calculateur
calculator_values: Valeurs applicables
enterprise_groups:
index:
new_button: Nouveau groupe d'entreprise
products:
bulk_edit:
unit: Unité
@@ -110,6 +142,8 @@ fr:
available_on: Disponible sur
av_on: "Disp. sur"
variant_overrides:
loading_flash:
loading_inventory: LOADING INVENTORY
index:
title: Stock
description: Utilisez cette page pour gérer le catalogue de votre entreprise. Les détails produits saisis ici remplaceront ceux de la page "Produit" pour votre entreprise uniquement.
@@ -162,11 +196,231 @@ fr:
status: Statut
manage: Gérer
form:
about_us:
desc_short: Description courte
desc_short_placeholder: Dites nous à propos de votre entreprise en 2 lignes
desc_long: Description publique
desc_long_placeholder: Décrivez-vous à vos clients. Cette information apparaîtra sur votre profil public.
business_details:
abn: ABN
abn_placeholder: "ex: 99 123 456 789"
acn: ACN
acn_placeholder: "ex: 123 456 789"
contact:
name: Prénom/Nom
name_placeholder: "ex: Maurice Batot"
email_address: Email Address
email_address_placeholder: "ex: maurice@tomates.fr"
phone: Téléphone
phone_placeholder: "ex: 98 7654 3210"
website: Site Web
website_placeholder: "ex: www.tomates.fr"
enterprise_fees:
name: Nom
fee_type: Type de marge
manage_fees: Gérer vos marges
no_fees_yet: Vous n'avez pas encore de marges définies.
create_button: Créer une nouvelle marge
images:
logo: Logo
promo_image_placeholder: 'Cette image est affichée dans la partie "A Propos"'
promo_image_note1: 'NOTES :'
promo_image_note2: Toutes les images uploadées ici seront coupées pour 1200x260 pixels.
promo_image_note3: L'image promotionelle est affichée en haut de la page profil de l'entreprise et sur les pop-ups.
inventory_settings:
text1: Vous pouvez gérer votre stock et vos prix via votre
inventory: inventaire
text2: "If you are using the inventory tool, you can select whether new products \
added by your suppliers need to be added to your inventory before they can be \
stocked. If you are not using your inventory to manage your products you should \
select the 'recommended' option below:"
preferred_product_selection_from_inventory_only_yes: Les nouveaux produits peuvent être mis dans mon magasin (Recommendé)
preferred_product_selection_from_inventory_only_no: Les nouveaux produits doivent être ajouté dans mon magasin avant de pouvoir être ajouté dans mon magasin
payment_methods:
name: Nom
applies: Applies?
manage: Gérer les moyens de paiement
not_method_yet: Vous n'avez encore aucun moyen de paiement.
create_button: Ajouter un nouveau moyen de paiement
create_one_button: Ajouter un nouveau moyen de paiement
primary_details:
name: Nom
name_placeholder: 'ex: Les Oranges Bleues'
groups: Groupes
groups_tip: Select any groups or regions that you are a member of. This will help customers find your enterprise.
groups_placeholder: Commencer à taper dans rechercher les groupes disponibles...
primary_producer: Primary Producer
primary_producer_tip: Select 'Producer' if you are a primary producer of food.
producer: Producteur
any: Any
none: None
own: Own
sells: Sells
sells_tip: "None - enterprise does not sell to customers directly.<br />Own - Enterprise sells own products to customers.<br />Any - Enterprise can sell own or other enterprises products.<br />"
visible_in_seach: Visible dans la recherche?
visible_in_seach_tip: Determines whether this enterprise will be visible to customers when searching the site.
visible: Visible
not_visible: Pas visible
permalink: Lien (pas d'espace)
permalink_tip: "This permalink is used to create the url to your shop: {{link}} your-shop-name/shop"
link_to_front: Link to shop front
link_to_front_tip: A direct link to your shopfront on the Open Food Network.
shipping_methods:
name: Nom
applies: Applies?
manage: Gérer les moyens de livraison
create_button: Ajouter un nouveau moyen de livraison
create_one_button: Ajouter un nouveau moyen de livraison
no_method_yet: Vous n'avez encore aucun moyen de livraison défini.
shop_preferences:
shopfront_requires_login: "Cette boutique exige un login?"
shopfront_requires_login_tip: "Les acheteurs doivent-ils se connecter pour accéder à la boutique?"
shopfront_requires_login_false: "Public"
shopfront_requires_login_true: "Demander aux acheteurs de se connecter"
allow_guest_orders: "Guest orders"
allow_guest_orders_tip: "Allow checkout as guest or require a registered user."
allow_guest_orders_false: "Require login to order"
allow_guest_orders_true: "Allow guest checkout"
shopfront_message_placeholder: \
An optional explanation for customers detailing how your shopfront works, \
to be displayed above the product list on your shop page.
shopfront_closed_message_placeholder: \
A message which provides a more detailed explanation about why your shop is \
closed and/or when customers can expect it to open again. This is displayed \
on your shop only when you have no active order cycles (ie. shop is closed).
open_date: Open Date
close_date: Close Date
social:
twitter_placeholder: 'ex: @lesorangesbleues'
tag_rules:
default_rules:
by_default: Par défaut
no_rules_yet: Aucune règle encore ajoutée
add_new_button: + Ajouter une nouvelle règle
no_tags_yet: Aucun tag encore défini pour cette entreprise
no_rules_yet: Aucun régle encore définie pour ce tag
for_customers_tagged: 'For customers tagged:'
add_new_rule: '+ Ajouter une nouvelle régle'
add_new_tag: '+ Ajouter un nouveau tag'
users:
email_confirmation_text: Email confirmation is pending.<br />We've sent a confirmation email to
resend: Renvoyer
owner: Propriétaire
owner_tip: Le premier utilisateur responsable pour l'entreprise.
notifications: Notifications
notifications_tip: Notifications about orders will be send to this email address.
notifications_placeholder: 'ex: gustav@truffles.com'
notifications_note: 'Note: A new email address may need to be confirmed prior to use'
managers: Managers
managers_tip: The other users with permission to manage this enterprise.
actions:
edit_profile: Mettre à jour le profil
properties: Propriétés
payment_methods: Méthodes de paiement
payment_methods_tip: Cette entreprise n'a pas de méthode de paiement
shipping_methods: Méthodes de livraison
shipping_methods_tip: Cette entreprise n'a pas de méthode de livraisons
enterprise_fees: Enterprise Fees
enterprise_fees_tip: This enterprise has no fees
admin_index:
name: Nom
role: Role
sells: Sells
visible: Visible?
owner: Owner
producer: Producer
change_type_form:
producer_profile: Producer Profile
connect_ofn: Connect through OFN
always_free: ALWAYS FREE
producer_description_text: Add your products to Open Food Network, allowing hubs to stock your products in their stores.
producer_shop: Producer Shop
sell_your_produce: Sell your own produce
sell_description_text: Sell your products directly to customers through your very own Open Food Network shopfront.
sell_description_text2: A Producer Shop is for your produce only, if you want to sell produce grown/produced off site, select 'Producer Hub'.
producer_hub: Producer Hub
producer_hub_text: Sell produce from self and others
producer_hub_description_text: Your enterprise is the backbone of your local food system. You can sell your own produce as well as produce aggregated from other enterprises through your shopfront on the Open Food Network.
profile: Profile Only
get_listing: Get a listing
profile_description_text: People can find and contact you on the Open Food Network. Your enterprise will be visible on the map, and will be searchable in listings.
hub_shop: Hub Shop
hub_shop_text: Sell produce from others
hub_shop_description_text: Your enterprise is the backbone of your local food system. You aggregate produce from other enterprises and can sell it through your shop on the Open Food Network.
choose_option: Please choose one of the options above.
change_now: Change now
enterprise_user_index:
search_placeholder: Search By Name
manage: Manage
new_form:
owner: Owner
owner_tip: The primary user responsible for this enterprise.
i_am_producer: I am a Producer
contact_name: Nom du contact
edit:
editing: 'Editing:'
back_link: Retour à la liste d'entreprise
index:
title: Enterprises
new_enterprise: Ajouter une nouvelle entreprise
new:
title: Nouvelle entreprise
back_link: Retour à la liste d'entreprise
welcome:
welcome_title: Bienvenue chez Open Food France !
welcome_text: Vous avez bien créé une
next_step: Etape suivante
choose_starting_point: 'Choose your starting point:'
order_cycles:
advanced_settings:
title: Advanced Settings
choose_product_tip: You can opt to restrict all available products (both incoming and outgoing), to only those in {{inventory}}'s inventory.
preferred_product_selection_from_coordinator_inventory_only_here: Coordinator's Inventory Only
preferred_product_selection_from_coordinator_inventory_only_all: All Available Products
save_reload: Save and Reload Page
coordinator_fees:
add: Add coordinator fee
form:
incoming: Incoming
supplier: Supplier
products: Products
receival_details: Receival details
fees: Fees
outgoing: Outgoing
distributor: Distributor
products: Products
tags: Tags
delivery_detaisl: Pickup / Delivery details
debug_info: Debug information
name_and_timing_form:
name: Name
orders_open: Orders open
coordinator: Coordinator
order_closes: Orders close
row:
suppliers: suppliers
distributors: distributors
variants: variants
simple_form:
ready_for: Ready for
ready_for_placeholder: Date / time
customer_instructions: Customer instructions
customer_instructions_placeholder: Pick-up or delivery notes
products: Products
fees: Fees
edit:
advanced_settings: Advanced Settings
update_and_close: Update and Close
producer_properties:
form:
property: Propriété
value: Valeur
index:
title: Producer Properties
shared:
user_guide_link:
user_guide: Guide l'utilisateur
home:
hubs:
show_closed_shops: "Aficher les boutiques fermées"
@@ -211,10 +465,14 @@ fr:
phone: Téléphone
next: Suivant
address: Adresse
address_placeholder: "ex: 16, rue du Marché"
address2: Adresse (suite)
city: Ville
city_placeholder: "ex: Lille"
state: Département
postcode: Code postal
postcode_placeholder: "ex: 59000"
state: Région
country: Pays
unauthorized: Non authorisé
terms_of_service: "Conditions d'utilisation"

View File

@@ -169,6 +169,8 @@ Openfoodnetwork::Application.routes.draw do
end
end
get 'sitemap.xml', to: 'sitemap#index', defaults: { format: 'xml' }
# Mount Spree's routes
mount Spree::Core::Engine, :at => '/'

View File

@@ -0,0 +1,12 @@
require 'spec_helper'
feature 'sitemap' do
let(:enterprise) { create(:distributor_enterprise) }
let!(:group) { create(:enterprise_group, enterprises: [enterprise], on_front_page: true) }
it "renders sitemap" do
visit '/sitemap.xml'
expect(page).to have_content enterprise_shop_url(enterprise)
expect(page).to have_content group_url(group)
end
end