mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-27 01:43:22 +00:00
Merge pull request #2475 from Matt-Yorkley/pi/landing_page
PI: landing page
This commit is contained in:
@@ -1,38 +1,3 @@
|
||||
.product-import-introduction {
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
margin: 1.5em 0 1em;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
span.category {
|
||||
display: inline-block;
|
||||
background-color: #f3f3f3;
|
||||
padding: 0.4em 0.8em;
|
||||
margin: 0 0.4em 0.5em 0;
|
||||
}
|
||||
|
||||
table {
|
||||
|
||||
&.product-import-columns tr:hover td {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
thead th {
|
||||
text-transform: none;
|
||||
font-size: 100%;
|
||||
text-align: left;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
div.panel-section {
|
||||
|
||||
.neutral {
|
||||
@@ -315,3 +280,33 @@ div.progress-bar {
|
||||
transition: width 0.5s ease-in-out;
|
||||
}
|
||||
}
|
||||
|
||||
#upload-sidebar {
|
||||
float: right;
|
||||
background-color: lighten(#eff5fc, 2.5%);
|
||||
border: 1px solid lighten(#cee1f4, 2.5%);
|
||||
width: 50%;
|
||||
padding: 0 1.5em 1.5em;
|
||||
|
||||
h4, h5, h6, p {
|
||||
margin: 1.25em 0 1em;
|
||||
}
|
||||
|
||||
a.download {
|
||||
display: block;
|
||||
font-size: 1.05em;
|
||||
margin-bottom: 0.5em;
|
||||
|
||||
i {
|
||||
margin-right: 0.25em;
|
||||
}
|
||||
}
|
||||
|
||||
span.category {
|
||||
display: inline-block;
|
||||
background-color: lighten(#5498da, 10%);
|
||||
color: white;
|
||||
padding: 0.3em 0.6em;
|
||||
margin: 0 0.4em 0.5em 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ module Admin
|
||||
class ProductImportController < Spree::Admin::BaseController
|
||||
before_filter :validate_upload_presence, except: %i[index guide validate_data]
|
||||
|
||||
def guide
|
||||
def index
|
||||
@product_categories = Spree::Taxon.order('name ASC').pluck(:name).uniq
|
||||
@tax_categories = Spree::TaxCategory.order('name ASC').pluck(:name)
|
||||
@shipping_categories = Spree::ShippingCategory.order('name ASC').pluck(:name)
|
||||
|
||||
30
app/views/admin/product_import/_upload_sidebar.html.haml
Normal file
30
app/views/admin/product_import/_upload_sidebar.html.haml
Normal file
@@ -0,0 +1,30 @@
|
||||
#upload-sidebar
|
||||
%h5= t('admin.product_import.index.csv_templates')
|
||||
|
||||
%a.download{href: '/product_list_template.csv'}
|
||||
%i.icon-external-link
|
||||
= t('admin.product_import.index.product_list_template')
|
||||
|
||||
%a.download{href: '/inventory_template.csv'}
|
||||
%i.icon-external-link
|
||||
= t('admin.product_import.index.inventory_template')
|
||||
|
||||
%h5= t('admin.product_import.index.category_values')
|
||||
|
||||
%p
|
||||
%strong= t('admin.product_import.index.product_categories')
|
||||
|
||||
- @product_categories.each do |pc|
|
||||
%span.category= pc
|
||||
|
||||
%p
|
||||
%strong= t('admin.product_import.index.tax_categories')
|
||||
|
||||
- @tax_categories.each do |tc|
|
||||
%span.category= tc
|
||||
|
||||
%p
|
||||
%strong= t('admin.product_import.index.shipping_categories')
|
||||
|
||||
- @shipping_categories.each do |sc|
|
||||
%span.category= sc
|
||||
@@ -1,69 +0,0 @@
|
||||
- content_for :page_title do
|
||||
Product Import Guide
|
||||
|
||||
- content_for :page_actions do
|
||||
%div.toolbar{ 'data-hook' => "toolbar" }
|
||||
%ul.actions.header-action-links.inline-menu
|
||||
%li
|
||||
= button_link_to 'Back to Import', main_app.admin_product_import_path
|
||||
|
||||
= render partial: 'spree/admin/shared/product_sub_menu'
|
||||
|
||||
.product-import-introduction
|
||||
|
||||
%h5 Spreadsheet Columns
|
||||
|
||||
= render 'admin/product_import/guide/columns'
|
||||
|
||||
%h5 Weight, volume, or single items
|
||||
|
||||
%p
|
||||
When creating a product you can specify a number of options. If the product is measured
|
||||
by weight, unit_value should be set to a number and unit_type should be set to either
|
||||
g for grams, Kg for kilograms, or T for tonnes.
|
||||
|
||||
%p
|
||||
For items such as liquids, the unit_type can be ml for millilitres, L for litres or
|
||||
Kl for kilolitres.
|
||||
|
||||
%p
|
||||
For other items that are sold in different units such as "a bunch of carrots", you can
|
||||
enter 1 for units, leave unit_type blank, and enter a name in the variant_unit_name
|
||||
column such as "loaf" or "bunch".
|
||||
|
||||
%h6 Example spreadsheet data:
|
||||
|
||||
= render 'admin/product_import/guide/units'
|
||||
|
||||
|
||||
%h5 Product Variants
|
||||
|
||||
%p
|
||||
Variants are distinguished by the units and display_name fields and grouped by product name.
|
||||
The example below shows a salad that comes in 500g and 750g variants, and a cake that comes in
|
||||
multiple flavours.
|
||||
|
||||
%h6 Example spreadsheet data:
|
||||
|
||||
= render 'admin/product_import/guide/variants'
|
||||
|
||||
|
||||
%h5 Category Values
|
||||
|
||||
%p
|
||||
Listed below are the available Product categories, as well as Tax and Shipping categories.
|
||||
|
||||
%h6 Product Categories
|
||||
|
||||
- @product_categories.each do |pc|
|
||||
%span.category= pc
|
||||
|
||||
%h6 Tax Categories
|
||||
|
||||
- @tax_categories.each do |tc|
|
||||
%span.category= tc
|
||||
|
||||
%h6 Shipping Categories
|
||||
|
||||
- @shipping_categories.each do |sc|
|
||||
%span.category= sc
|
||||
@@ -1,100 +0,0 @@
|
||||
%table.product-import-columns
|
||||
%thead
|
||||
%tr
|
||||
%th Column Title
|
||||
%th Required
|
||||
%th Examples
|
||||
%th Description
|
||||
%th Notes
|
||||
%tbody
|
||||
%tr
|
||||
%td
|
||||
%strong name
|
||||
%td Yes
|
||||
%td Potatoes
|
||||
%td The name of the product
|
||||
%td
|
||||
%tr
|
||||
%td
|
||||
%strong supplier
|
||||
%td Yes
|
||||
%td Pennylane Farm
|
||||
%td The name of the product's supplier
|
||||
%td
|
||||
%tr
|
||||
%td
|
||||
%strong category
|
||||
%td Yes
|
||||
%td Vegetables
|
||||
%td The product category
|
||||
%td See below for a list of available categories
|
||||
%tr
|
||||
%td
|
||||
%strong on_hand
|
||||
%td Yes
|
||||
%td 15
|
||||
%td The amount currently in stock
|
||||
%td
|
||||
%tr
|
||||
%td
|
||||
%strong price
|
||||
%td Yes
|
||||
%td 2.50
|
||||
%td The price of the product
|
||||
%td
|
||||
%tr
|
||||
%td
|
||||
%strong units
|
||||
%td Yes
|
||||
%td 750
|
||||
%td The weight or volume value.
|
||||
%td
|
||||
%tr
|
||||
%td
|
||||
%strong unit_type
|
||||
%td Yes
|
||||
%td g
|
||||
%td The unit type, i.e. g for grams, Kg for Kilograms, ml for millilitres. Can be blank (see notes).
|
||||
%td If unit_type is left blank, a variant_unit_name must be given.
|
||||
%tr
|
||||
%td
|
||||
%strong variant_unit_name
|
||||
%td Maybe
|
||||
%td bunch
|
||||
%td If the product is sold as an item such as "bunch", "loaf" or "case", that goes here.
|
||||
%td Used for products that don't use a unit_type for weight or volume.
|
||||
%tr
|
||||
%td
|
||||
%strong display_name
|
||||
%td No
|
||||
%td Orange
|
||||
%td Used to name product variants, if they have a distinct name.
|
||||
%td
|
||||
%tr
|
||||
%td
|
||||
%strong on_demand
|
||||
%td No
|
||||
%td 1
|
||||
%td Flag the product as "made on demand". The product will not use stock levels.
|
||||
%td 1 for active, 0 for disabled, or leave blank to ignore.
|
||||
%tr
|
||||
%td
|
||||
%strong tax_category
|
||||
%td No
|
||||
%td (Various, see notes)
|
||||
%td Sets the product tax category
|
||||
%td See below for a list of available categories
|
||||
%tr
|
||||
%td
|
||||
%strong shipping_category
|
||||
%td No
|
||||
%td (Various, see notes)
|
||||
%td Sets the product shipping category
|
||||
%td See below for a list of available categories
|
||||
%tr
|
||||
%td
|
||||
%strong available_on
|
||||
%td No
|
||||
%td 2018-05-21
|
||||
%td Sets the date from which the product will be available
|
||||
%td Date format is: YYYY-MM-DD
|
||||
@@ -1,54 +0,0 @@
|
||||
%table
|
||||
%thead
|
||||
%tr
|
||||
%th
|
||||
%th name
|
||||
%th category
|
||||
%th supplier
|
||||
%th on_hand
|
||||
%th price
|
||||
%th units
|
||||
%th unit_type
|
||||
%th variant_unit_name
|
||||
%tbody
|
||||
%tr
|
||||
%td 1
|
||||
%td Salad Bag
|
||||
%td Salads
|
||||
%td Sue's Salads
|
||||
%td 26
|
||||
%td 3.50
|
||||
%td 500
|
||||
%td g
|
||||
%td
|
||||
%tr
|
||||
%td 2
|
||||
%td Fruit Juice
|
||||
%td Drinks
|
||||
%td Country Juices
|
||||
%td 12
|
||||
%td 3.50
|
||||
%td 300
|
||||
%td ml
|
||||
%td
|
||||
%tr
|
||||
%td 3
|
||||
%td Potatoes
|
||||
%td Vegetables
|
||||
%td Fernwell Farm
|
||||
%td 67
|
||||
%td 4.20
|
||||
%td 1
|
||||
%td kg
|
||||
%td
|
||||
|
||||
%tr
|
||||
%td 3
|
||||
%td Wholemeal Bread
|
||||
%td Baked goods
|
||||
%td Tim's Bakery
|
||||
%td 66
|
||||
%td 3.00
|
||||
%td 1
|
||||
%td
|
||||
%td loaf
|
||||
@@ -1,54 +0,0 @@
|
||||
%table
|
||||
%thead
|
||||
%tr
|
||||
%th
|
||||
%th name
|
||||
%th category
|
||||
%th supplier
|
||||
%th on_hand
|
||||
%th price
|
||||
%th units
|
||||
%th unit_type
|
||||
%th display_name
|
||||
%tbody
|
||||
%tr
|
||||
%td 1
|
||||
%td Salad Bag
|
||||
%td Salads
|
||||
%td Sue's Salads
|
||||
%td 26
|
||||
%td 3.50
|
||||
%td 500
|
||||
%td g
|
||||
%td
|
||||
%tr
|
||||
%td 2
|
||||
%td Salad Bag
|
||||
%td Salads
|
||||
%td Sue's Salads
|
||||
%td 44
|
||||
%td 5.50
|
||||
%td 750
|
||||
%td g
|
||||
%td
|
||||
%tr
|
||||
%td 3
|
||||
%td Cake
|
||||
%td Baked goods
|
||||
%td Tim's Cakes
|
||||
%td 10
|
||||
%td 4
|
||||
%td 500
|
||||
%td g
|
||||
%td Banana and Walnut
|
||||
%tr
|
||||
%td 4
|
||||
%td Cake
|
||||
%td Baked goods
|
||||
%td Tim's Cakes
|
||||
%td 18
|
||||
%td 4
|
||||
%td 500
|
||||
%td g
|
||||
%td Carrot
|
||||
|
||||
@@ -1,12 +1,8 @@
|
||||
- content_for :page_title do
|
||||
#{t('admin.product_import.title')}
|
||||
|
||||
- content_for :page_actions do
|
||||
%div.toolbar{ 'data-hook' => "toolbar" }
|
||||
%ul.actions.header-action-links.inline-menu
|
||||
%li
|
||||
= button_link_to 'View Guide', main_app.admin_product_import_guide_path
|
||||
|
||||
= render partial: 'spree/admin/shared/product_sub_menu'
|
||||
|
||||
= render 'upload_sidebar'
|
||||
|
||||
= render 'upload_form'
|
||||
|
||||
@@ -470,6 +470,13 @@ en:
|
||||
inventories: Inventories
|
||||
import: Import
|
||||
upload: Upload
|
||||
csv_templates: CSV Templates
|
||||
product_list_template: Download Product List template
|
||||
inventory_template: Download Inventory template
|
||||
category_values: Available Category Values
|
||||
product_categories: Product Categories
|
||||
tax_categories: Tax Categories
|
||||
shipping_categories: Shipping Categories
|
||||
import:
|
||||
review: Review
|
||||
proceed: Proceed
|
||||
|
||||
@@ -133,7 +133,6 @@ Openfoodnetwork::Application.routes.draw do
|
||||
get '/inventory', to: 'variant_overrides#index'
|
||||
|
||||
get '/product_import', to: 'product_import#index'
|
||||
get '/product_import/guide', to: 'product_import#guide', as: 'product_import_guide'
|
||||
post '/product_import', to: 'product_import#import'
|
||||
post '/product_import/validate_data', to: 'product_import#validate_data', as: 'product_import_process_async'
|
||||
post '/product_import/save_data', to: 'product_import#save_data', as: 'product_import_save_async'
|
||||
|
||||
1
public/inventory_template.csv
Normal file
1
public/inventory_template.csv
Normal file
@@ -0,0 +1 @@
|
||||
producer,supplier,name,display_name,units,unit_type,price,on_hand
|
||||
|
1
public/product_list_template.csv
Normal file
1
public/product_list_template.csv
Normal file
@@ -0,0 +1 @@
|
||||
supplier,sku,name,display_name,category,units,unit_type,variant_unit_name,price,on_hand,available_on,on_demand,shipping_category,tax_category
|
||||
|
@@ -296,10 +296,10 @@ describe ProductImport::ProductImporter do
|
||||
describe "importing items into inventory" do
|
||||
before do
|
||||
csv_data = CSV.generate do |csv|
|
||||
csv << ["name", "supplier", "producer", "category", "on_hand", "price", "units"]
|
||||
csv << ["Beans", "Another Enterprise", "User Enterprise", "Vegetables", "5", "3.20", "500"]
|
||||
csv << ["Sprouts", "Another Enterprise", "User Enterprise", "Vegetables", "6", "6.50", "500"]
|
||||
csv << ["Cabbage", "Another Enterprise", "User Enterprise", "Vegetables", "2001", "1.50", "500"]
|
||||
csv << ["name", "supplier", "producer", "on_hand", "price", "units", "unit_type"]
|
||||
csv << ["Beans", "Another Enterprise", "User Enterprise", "5", "3.20", "500", "g"]
|
||||
csv << ["Sprouts", "Another Enterprise", "User Enterprise", "6", "6.50", "500", "g"]
|
||||
csv << ["Cabbage", "Another Enterprise", "User Enterprise", "2001", "1.50", "500", "g"]
|
||||
end
|
||||
File.write('/tmp/test-m.csv', csv_data)
|
||||
file = File.new('/tmp/test-m.csv')
|
||||
@@ -422,8 +422,8 @@ describe ProductImport::ProductImporter do
|
||||
|
||||
it "allows creating inventories for producers that a user's hub has permission for" do
|
||||
csv_data = CSV.generate do |csv|
|
||||
csv << ["name", "producer", "supplier", "category", "on_hand", "price", "units"]
|
||||
csv << ["Beans", "User Enterprise", "Another Enterprise", "Vegetables", "777", "3.20", "500"]
|
||||
csv << ["name", "producer", "supplier", "on_hand", "price", "units", "unit_type"]
|
||||
csv << ["Beans", "User Enterprise", "Another Enterprise", "777", "3.20", "500", "g"]
|
||||
end
|
||||
File.write('/tmp/test-m.csv', csv_data)
|
||||
file = File.new('/tmp/test-m.csv')
|
||||
@@ -449,9 +449,9 @@ describe ProductImport::ProductImporter do
|
||||
|
||||
it "does not allow creating inventories for producers that a user's hubs don't have permission for" do
|
||||
csv_data = CSV.generate do |csv|
|
||||
csv << ["name", "supplier", "category", "on_hand", "price", "units"]
|
||||
csv << ["Beans", "User Enterprise", "Vegetables", "5", "3.20", "500"]
|
||||
csv << ["Sprouts", "User Enterprise", "Vegetables", "6", "6.50", "500"]
|
||||
csv << ["name", "supplier", "on_hand", "price", "units", "unit_type"]
|
||||
csv << ["Beans", "User Enterprise", "5", "3.20", "500", "g"]
|
||||
csv << ["Sprouts", "User Enterprise", "6", "6.50", "500", "g"]
|
||||
end
|
||||
File.write('/tmp/test-m.csv', csv_data)
|
||||
file = File.new('/tmp/test-m.csv')
|
||||
@@ -515,9 +515,9 @@ describe ProductImport::ProductImporter do
|
||||
|
||||
it "can reset all inventory items for an enterprise that are not present in the uploaded file to zero stock" do
|
||||
csv_data = CSV.generate do |csv|
|
||||
csv << ["name", "supplier", "producer", "category", "on_hand", "price", "units"]
|
||||
csv << ["Beans", "Another Enterprise", "User Enterprise", "Vegetables", "6", "3.20", "500"]
|
||||
csv << ["Sprouts", "Another Enterprise", "User Enterprise", "Vegetables", "7", "6.50", "500"]
|
||||
csv << ["name", "supplier", "producer", "on_hand", "price", "units", "unit_type"]
|
||||
csv << ["Beans", "Another Enterprise", "User Enterprise", "6", "3.20", "500", "g"]
|
||||
csv << ["Sprouts", "Another Enterprise", "User Enterprise", "7", "6.50", "500", "g"]
|
||||
end
|
||||
File.write('/tmp/test-m.csv', csv_data)
|
||||
file = File.new('/tmp/test-m.csv')
|
||||
@@ -617,10 +617,10 @@ describe ProductImport::ProductImporter do
|
||||
|
||||
it "can overwrite fields with selected defaults when importing to inventory" do
|
||||
csv_data = CSV.generate do |csv|
|
||||
csv << ["name", "producer", "supplier", "category", "on_hand", "price", "units"]
|
||||
csv << ["Beans", "User Enterprise", "Another Enterprise", "Vegetables", "", "3.20", "500"]
|
||||
csv << ["Sprouts", "User Enterprise", "Another Enterprise", "Vegetables", "7", "6.50", "500"]
|
||||
csv << ["Cabbage", "User Enterprise", "Another Enterprise", "Vegetables", "", "1.50", "500"]
|
||||
csv << ["name", "producer", "supplier", "on_hand", "price", "units", "unit_type"]
|
||||
csv << ["Beans", "User Enterprise", "Another Enterprise", "", "3.20", "500", "g"]
|
||||
csv << ["Sprouts", "User Enterprise", "Another Enterprise", "7", "6.50", "500", "g"]
|
||||
csv << ["Cabbage", "User Enterprise", "Another Enterprise", "", "1.50", "500", "g"]
|
||||
end
|
||||
File.write('/tmp/test-m.csv', csv_data)
|
||||
file = File.new('/tmp/test-m.csv')
|
||||
|
||||
Reference in New Issue
Block a user