shopifydev 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +17 -0
- data/.pryrc +3 -0
- data/.root.shopifydev.yaml.sample +21 -0
- data/.ruby-version +1 -0
- data/.shopifydev.yaml.sample +7 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/NEXTSTEPS.md +33 -0
- data/README.md +78 -0
- data/Rakefile +1 -0
- data/bin/shopify_console +15 -0
- data/bin/shopifydev +100 -0
- data/lib/rails/generators/shopifydev/shops_generator.rb +11 -0
- data/lib/rails/generators/shopifydev/templates/shops.rake +5 -0
- data/lib/rails/tasks/shops.rake +7 -0
- data/lib/shopifydev/asset.rb +58 -0
- data/lib/shopifydev/commands.rb +83 -0
- data/lib/shopifydev/config.rb +9 -0
- data/lib/shopifydev/generators/shop.rb +29 -0
- data/lib/shopifydev/generators/templates/Gemfile +10 -0
- data/lib/shopifydev/generators/templates/gitignore +1 -0
- data/lib/shopifydev/generators/templates/rvmrc +1 -0
- data/lib/shopifydev/generators/templates/shopify-tmbundle +21 -0
- data/lib/shopifydev/pry/commands.rb +194 -0
- data/lib/shopifydev/railtie.rb +11 -0
- data/lib/shopifydev/shop.rb +38 -0
- data/lib/shopifydev/template.rb +73 -0
- data/lib/shopifydev/version.rb +3 -0
- data/lib/shopifydev.rb +10 -0
- data/shopifydev.gemspec +35 -0
- data/spec/shopifydev/config_spec.rb +5 -0
- data/spec/shopifydev/generators/shopifydev/shopifydev_generator_spec.rb +5 -0
- data/spec/shopifydev/pry/commands_spec.rb +5 -0
- data/spec/shopifydev/railtie_spec.rb +5 -0
- data/templates/customers/order.liquid +109 -0
- data/templates/customers/register.liquid +42 -0
- data/templates/page.support.liquid +78 -0
- data/templates/page.verbose.liquid +18 -0
- data/templates/product.liquid +284 -0
- data/templates/search.liquid +63 -0
- data/test_driver.rb +31 -0
- metadata +275 -0
| @@ -0,0 +1,194 @@ | |
| 1 | 
            +
            require 'term/ansicolor'
         | 
| 2 | 
            +
            require 'oj'
         | 
| 3 | 
            +
            class Color
         | 
| 4 | 
            +
              if Pry.config.color
         | 
| 5 | 
            +
                extend Term::ANSIColor
         | 
| 6 | 
            +
              else
         | 
| 7 | 
            +
                class << self
         | 
| 8 | 
            +
                  def method_missing
         | 
| 9 | 
            +
                    ''
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
            end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            class LocalShopifyApp
         | 
| 16 | 
            +
              attr_accessor :path
         | 
| 17 | 
            +
              def initialize(path)
         | 
| 18 | 
            +
                @path = path
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              def shops
         | 
| 22 | 
            +
                json = `/bin/bash -l -c "unset BUNDLE_GEMFILE; cd #{path}; bundle exec rake shops 2>/dev/null"`
         | 
| 23 | 
            +
                json = json.split("----snip----\n").last
         | 
| 24 | 
            +
                Oj.load json
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            class ConfigMenu
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              attr_accessor :cfg
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              def initialize(cfg)
         | 
| 34 | 
            +
                @cfg = cfg
         | 
| 35 | 
            +
                @menu_choices = [:do_nothing]
         | 
| 36 | 
            +
                @menu_display = []
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
              def build
         | 
| 39 | 
            +
                header("Test Shops")
         | 
| 40 | 
            +
                cfg[:test_shops].keys.each do |k|
         | 
| 41 | 
            +
                  choice([:test_shops, k], k)
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
                
         | 
| 44 | 
            +
                header("Local Apps")
         | 
| 45 | 
            +
                cfg[:apps][:development].each do |k, path|
         | 
| 46 | 
            +
                  choice([:apps, :development, k], path)
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                header("Heroku Apps")
         | 
| 50 | 
            +
                cfg[:apps][:heroku].each do |k, name|
         | 
| 51 | 
            +
                  choice([:apps, :heroku, k], name)
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                self
         | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              def print(output)
         | 
| 58 | 
            +
                output.puts @menu_display.join("\n")
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
              def header(label)
         | 
| 62 | 
            +
                @menu_display << ''
         | 
| 63 | 
            +
                @menu_display << Color.blue { label }
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
              def choice(path, value)
         | 
| 67 | 
            +
                ix = @menu_choices.length
         | 
| 68 | 
            +
                @menu_display << Color.yellow{ ix.to_s } + '. ' + value.to_s
         | 
| 69 | 
            +
                @menu_choices[ix] = path
         | 
| 70 | 
            +
              end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              def pick(ix)
         | 
| 73 | 
            +
                if ix >= @menu_choices.length
         | 
| 74 | 
            +
                  nil
         | 
| 75 | 
            +
                else
         | 
| 76 | 
            +
                  @menu_choices[ix]
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
              end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
              def pick_config(ix)
         | 
| 81 | 
            +
                path = pick(ix)
         | 
| 82 | 
            +
                return :no_such_config if path.nil?
         | 
| 83 | 
            +
                result = cfg
         | 
| 84 | 
            +
                path.each do |x|
         | 
| 85 | 
            +
                  result = result[x]
         | 
| 86 | 
            +
                end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                [path, result]
         | 
| 89 | 
            +
              end
         | 
| 90 | 
            +
            end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
            shopifydev_command_set = Pry::CommandSet.new do
         | 
| 93 | 
            +
              create_command "switch" do
         | 
| 94 | 
            +
                description "switch shops"
         | 
| 95 | 
            +
             | 
| 96 | 
            +
             | 
| 97 | 
            +
                # opt is a Slop object, see https://github.com/injekt/slop/blob/master/README.md
         | 
| 98 | 
            +
                def options(opt)
         | 
| 99 | 
            +
                end
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                def process
         | 
| 102 | 
            +
                  print_current_shop
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                  config_menu = ConfigMenu.new(Shopifydev::Config.config).build
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                  
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                  case true
         | 
| 109 | 
            +
                  when args.empty?
         | 
| 110 | 
            +
                    config_menu.print(output)
         | 
| 111 | 
            +
                  when (args.length == 1)
         | 
| 112 | 
            +
                    ix = args.first.to_i
         | 
| 113 | 
            +
                    path, cfg = config_menu.pick_config(ix)
         | 
| 114 | 
            +
                    if path == :no_such_config
         | 
| 115 | 
            +
                      output.puts Color.red{ "I don't know about #{ix}" }
         | 
| 116 | 
            +
                      config_menu.print(output)
         | 
| 117 | 
            +
                    else
         | 
| 118 | 
            +
                      handle_choice(path, cfg)
         | 
| 119 | 
            +
                    end
         | 
| 120 | 
            +
                  end
         | 
| 121 | 
            +
                end
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                def print_current_shop
         | 
| 124 | 
            +
                  current_shop = ShopifyAPI::Base.site || 'none'
         | 
| 125 | 
            +
                  output.puts Color.green{ "current shop:"} + " #{current_shop}"
         | 
| 126 | 
            +
                end
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                def handle_choice(path, cfg)
         | 
| 129 | 
            +
                  case path.first.to_sym
         | 
| 130 | 
            +
                  when :test_shops
         | 
| 131 | 
            +
                    url = "https://#{cfg[:api_key]}:#{cfg[:password]}@#{cfg[:myshopify_domain]}/admin/"
         | 
| 132 | 
            +
                    ShopifyAPI::Base.site = url
         | 
| 133 | 
            +
                    print_current_shop
         | 
| 134 | 
            +
                  when :apps
         | 
| 135 | 
            +
                    case path[1].to_sym
         | 
| 136 | 
            +
                    when :development
         | 
| 137 | 
            +
                      output.puts "you picked #{path.join('.')}"
         | 
| 138 | 
            +
                      output.puts cfg.inspect
         | 
| 139 | 
            +
                      app = LocalShopifyApp.new(cfg)
         | 
| 140 | 
            +
                      output.puts Color.yellow{ app.shops.inspect }          
         | 
| 141 | 
            +
                    when :heroku
         | 
| 142 | 
            +
                      output.puts "you picked #{path.join('.')}"
         | 
| 143 | 
            +
                      output.puts cfg.inspect
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                      output.puts Color.yellow{ "but it's not ready yet!"}          
         | 
| 146 | 
            +
                    else
         | 
| 147 | 
            +
                      output.puts "you picked #{path.join('.')}"
         | 
| 148 | 
            +
                      output.puts cfg.inspect
         | 
| 149 | 
            +
                      output.puts Color.red{ "AND I DON'T EVEN KNOW!"}          
         | 
| 150 | 
            +
                    end
         | 
| 151 | 
            +
                  else
         | 
| 152 | 
            +
                    output.puts "you picked #{path.join('.')}"
         | 
| 153 | 
            +
                    output.puts cfg.inspect
         | 
| 154 | 
            +
                    output.puts Color.red{ "AND I DON'T EVEN KNOW!"}          
         | 
| 155 | 
            +
                  end
         | 
| 156 | 
            +
                end
         | 
| 157 | 
            +
             | 
| 158 | 
            +
             | 
| 159 | 
            +
                def output_menu_choices(arr, ix=1)
         | 
| 160 | 
            +
                  my_ix = 0
         | 
| 161 | 
            +
                  arr.each do |item|
         | 
| 162 | 
            +
                    output.puts menu_choice(ix+my_ix, item.to_s)
         | 
| 163 | 
            +
                    my_ix +=1
         | 
| 164 | 
            +
                  end
         | 
| 165 | 
            +
                  my_ix
         | 
| 166 | 
            +
                end
         | 
| 167 | 
            +
             | 
| 168 | 
            +
                def menu_choice(ix, s)
         | 
| 169 | 
            +
                  Color.yellow{ ix.to_s } + '. ' + s.to_s
         | 
| 170 | 
            +
                end
         | 
| 171 | 
            +
             | 
| 172 | 
            +
                def menu_header(s)
         | 
| 173 | 
            +
                  Color.blue { s }
         | 
| 174 | 
            +
                end
         | 
| 175 | 
            +
             | 
| 176 | 
            +
                def write_menu(cfg) 
         | 
| 177 | 
            +
                  ix = 1
         | 
| 178 | 
            +
                  # output.puts "Test Shops"
         | 
| 179 | 
            +
                  output.puts menu_header("Test Shops")
         | 
| 180 | 
            +
                  ix += output_menu_choices(cfg[:test_shops].keys.sort, ix)
         | 
| 181 | 
            +
             | 
| 182 | 
            +
                  output.puts
         | 
| 183 | 
            +
                  output.puts menu_header("Local Apps")
         | 
| 184 | 
            +
                  ix += output_menu_choices(cfg[:apps][:development].keys.sort, ix)
         | 
| 185 | 
            +
             | 
| 186 | 
            +
                  output.puts
         | 
| 187 | 
            +
                  output.puts menu_header("Heroku Apps")
         | 
| 188 | 
            +
                  ix += output_menu_choices(cfg[:apps][:heroku].keys.sort, ix)
         | 
| 189 | 
            +
                end
         | 
| 190 | 
            +
              end
         | 
| 191 | 
            +
             | 
| 192 | 
            +
            end
         | 
| 193 | 
            +
             | 
| 194 | 
            +
            Pry::Commands.import shopifydev_command_set
         | 
| @@ -0,0 +1,38 @@ | |
| 1 | 
            +
            require "logger"
         | 
| 2 | 
            +
            require "shopify_api"
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Shopifydev
         | 
| 5 | 
            +
              class Shop
         | 
| 6 | 
            +
                attr_accessor :credentials, :logger, :project_root
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def initialize(credentials)
         | 
| 9 | 
            +
                  @credentials = credentials
         | 
| 10 | 
            +
                  @logger = Logger.new(STDOUT)
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  ShopifyAPI::Base.site = "https://" + 
         | 
| 13 | 
            +
                    credentials['api_key'] + ':' + 
         | 
| 14 | 
            +
                    credentials['password'] + '@' + 
         | 
| 15 | 
            +
                    credentials['url'] + '/admin' 
         | 
| 16 | 
            +
                  logger.debug("set shopify site to #{ShopifyAPI::Base.site}")
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                def project_root
         | 
| 20 | 
            +
                  @project_root ||= ENV['PATCHIFY_ROOT'] || begin
         | 
| 21 | 
            +
                                      if credentials['project_root_variable']
         | 
| 22 | 
            +
                                          ENV[credentials['project_root_variable']] || credentials['project_root']
         | 
| 23 | 
            +
                                      else
         | 
| 24 | 
            +
                                        credentials['project_root']
         | 
| 25 | 
            +
                                      end
         | 
| 26 | 
            +
                                    end
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                def template
         | 
| 30 | 
            +
                  @template ||= Template.new(self, project_root)
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                def asset(path)
         | 
| 34 | 
            +
                  Asset.new(self, path, project_root)
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
            end
         | 
| @@ -0,0 +1,73 @@ | |
| 1 | 
            +
            require 'pathname'
         | 
| 2 | 
            +
            require 'fileutils'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Shopifydev
         | 
| 5 | 
            +
              class Template
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                attr_accessor :shop, :project_root
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                def initialize(shop, project_root)
         | 
| 10 | 
            +
                  @shop = shop
         | 
| 11 | 
            +
                  @project_root = project_root
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                def download(root=nil)
         | 
| 15 | 
            +
                  root ||= FileUtils.pwd
         | 
| 16 | 
            +
                  shop.logger.info("Downloading all pages from #{shop.credentials['url']}")
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  begin
         | 
| 19 | 
            +
                    response = ShopifyAPI::Asset.find(:all) # get all them assets
         | 
| 20 | 
            +
                    get_list_of_assets(response).each {| key, file | write_local_copy(file) }
         | 
| 21 | 
            +
                  rescue SocketError => e
         | 
| 22 | 
            +
                    puts e.message
         | 
| 23 | 
            +
                    puts "Maybe check your internet connection?"
         | 
| 24 | 
            +
                  rescue NoMethodError => e
         | 
| 25 | 
            +
                    puts e.message
         | 
| 26 | 
            +
                  rescue ActiveResource::UnauthorizedAccess => e
         | 
| 27 | 
            +
                    puts e.message
         | 
| 28 | 
            +
                    puts "Make sure you have the right password set in .shopifydev.yaml"
         | 
| 29 | 
            +
                  rescue Exception => e
         | 
| 30 | 
            +
                    puts e.message
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                def write_local_copy(file)
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  directory_path = Pathname.new(@project_root +
         | 
| 37 | 
            +
                                             File::Separator +
         | 
| 38 | 
            +
                                             file.dirname.to_path)
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  directory_path.mkpath unless (directory_path.exist?)
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  begin
         | 
| 43 | 
            +
                    puts "downloading #{file.basename}"
         | 
| 44 | 
            +
                    asset = get_asset(file.to_path)
         | 
| 45 | 
            +
                  rescue SocketError => e
         | 
| 46 | 
            +
                    puts e.message
         | 
| 47 | 
            +
                    puts "The connection was interupted while downloading #{file.to_path}."
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  # TODO maybe this should compare timestamps?
         | 
| 51 | 
            +
                  File.open((directory_path.realdirpath + file.basename).to_path, 'w') do |f|
         | 
| 52 | 
            +
                    puts "writing #{directory_path.to_path + File::Separator +  file.basename.to_path}"
         | 
| 53 | 
            +
                    f.write(asset.value)
         | 
| 54 | 
            +
                    puts "---"
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                def get_list_of_assets(response)
         | 
| 59 | 
            +
                  response.reverse.inject({}) do | list, asset_info | 
         | 
| 60 | 
            +
                    pathname = Pathname.new(asset_info.attributes["key"])
         | 
| 61 | 
            +
                  path = pathname.to_path
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                  list[path] = pathname unless list.keys.include?(path + '.liquid')
         | 
| 64 | 
            +
                  list
         | 
| 65 | 
            +
                  end
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                def get_asset(key)
         | 
| 69 | 
            +
                  ShopifyAPI::Asset.find(key)
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              end
         | 
| 73 | 
            +
            end
         | 
    
        data/lib/shopifydev.rb
    ADDED
    
    | @@ -0,0 +1,10 @@ | |
| 1 | 
            +
            require_relative "shopifydev/version"
         | 
| 2 | 
            +
            require_relative "shopifydev/config"
         | 
| 3 | 
            +
            require_relative "shopifydev/shop"
         | 
| 4 | 
            +
            require_relative "shopifydev/template"
         | 
| 5 | 
            +
            require_relative "shopifydev/asset"
         | 
| 6 | 
            +
            require_relative "shopifydev/commands"
         | 
| 7 | 
            +
            require_relative "shopifydev/railtie" if defined?(Rails)
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            module Shopifydev
         | 
| 10 | 
            +
            end
         | 
    
        data/shopifydev.gemspec
    ADDED
    
    | @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            # -*- encoding: utf-8 -*-
         | 
| 2 | 
            +
            lib = File.expand_path('../lib', __FILE__)
         | 
| 3 | 
            +
            $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
         | 
| 4 | 
            +
            require 'shopifydev/version'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            Gem::Specification.new do |gem|
         | 
| 7 | 
            +
              gem.name          = "shopifydev"
         | 
| 8 | 
            +
              gem.version       = Shopifydev::VERSION
         | 
| 9 | 
            +
              gem.authors       = ["Michael Johnston"]
         | 
| 10 | 
            +
              gem.email         = ["lastobelus@mac.com"]
         | 
| 11 | 
            +
              gem.description   = %q{Tools for using SCM with shopify.}
         | 
| 12 | 
            +
              gem.summary       = %q{Abstract out and port to ruby the functionality of the shopify textmate bundle for use in other editors.}
         | 
| 13 | 
            +
              gem.homepage      = ""
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              gem.files         = `git ls-files`.split($/)
         | 
| 16 | 
            +
              gem.executables   = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
         | 
| 17 | 
            +
              gem.test_files    = gem.files.grep(%r{^(test|spec|features)/})
         | 
| 18 | 
            +
              gem.require_paths = ["lib"]
         | 
| 19 | 
            +
              
         | 
| 20 | 
            +
              gem.add_dependency "shopify_api", ">= 3.0.0"
         | 
| 21 | 
            +
              gem.add_dependency "ruby-filemagic", ">= 0.4.2"
         | 
| 22 | 
            +
              gem.add_dependency "gli", ">= 2.5.2"
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              # for console
         | 
| 25 | 
            +
              gem.add_dependency 'oj'  
         | 
| 26 | 
            +
              gem.add_dependency 'dalli'
         | 
| 27 | 
            +
              gem.add_dependency 'shydra'
         | 
| 28 | 
            +
              gem.add_dependency 'pry'
         | 
| 29 | 
            +
              gem.add_dependency 'activesupport'
         | 
| 30 | 
            +
              gem.add_dependency 'term-ansicolor'
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              # for generators
         | 
| 33 | 
            +
              gem.add_dependency 'railties'
         | 
| 34 | 
            +
              gem.add_development_dependency "rake"
         | 
| 35 | 
            +
            end
         | 
| @@ -0,0 +1,109 @@ | |
| 1 | 
            +
            {% layout settings.customer_layout %}
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            <div id="admin_header">
         | 
| 4 | 
            +
              <h2 class="title">Order {{ order.name }}</h2>
         | 
| 5 | 
            +
            </div>
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            {% if order.cancelled %}
         | 
| 8 | 
            +
            <div id="order_cancelled" class="flash notice">
         | 
| 9 | 
            +
              <h5 id="order_cancelled_title">Order Cancelled <span class="note">on {{ order.cancelled_at | date: "%B %d, %Y %I:%M%p" }}</span></h5>
         | 
| 10 | 
            +
              <span class="note">{{ order.cancel_reason }}</span>
         | 
| 11 | 
            +
            </div>
         | 
| 12 | 
            +
            {% endif %}
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            <div class="note order_date">Placed on {{ order.created_at | date: "%B %d, %Y %I:%M%p" }}</div>
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            <div id="order_address" class="group">
         | 
| 17 | 
            +
              <div id="order_payment">
         | 
| 18 | 
            +
                <h3>Billing Address</h3>
         | 
| 19 | 
            +
                <p><span class="note">Payment Status:</span> <span class="status_{{ order.financial_status }}">{{ order.financial_status }}</span></p>
         | 
| 20 | 
            +
                <div class="address note">
         | 
| 21 | 
            +
                  <p>{{ order.billing_address.name }}</p>
         | 
| 22 | 
            +
                  <p>{{ order.billing_address.company }}</p>
         | 
| 23 | 
            +
                  <p>{{ order.billing_address.street }}</p>
         | 
| 24 | 
            +
                  <p>{{ order.billing_address.city }}, {{ order.billing_address.province }}</p>
         | 
| 25 | 
            +
                  <p>{{ order.billing_address.country }} {{ order.billing_address.zip }}</p>
         | 
| 26 | 
            +
                  <p>{{ order.billing_address.phone }}</p>
         | 
| 27 | 
            +
                </div>
         | 
| 28 | 
            +
              </div>
         | 
| 29 | 
            +
              {% if order.shipping_address %}
         | 
| 30 | 
            +
                <div id="order_shipping">
         | 
| 31 | 
            +
                  <h3>Shipping Address</h3>
         | 
| 32 | 
            +
                  <p><span class="note">Fulfillment Status:</span> <span class="status_{{ order.fulfillment_status }}">{{ order.fulfillment_status }}</span></p>
         | 
| 33 | 
            +
                  <div class="address note">
         | 
| 34 | 
            +
                    <p>{{ order.shipping_address.name }}</p>
         | 
| 35 | 
            +
                    <p>{{ order.shipping_address.company }}</p>
         | 
| 36 | 
            +
                    <p>{{ order.shipping_address.street }}</p>
         | 
| 37 | 
            +
                    <p>{{ order.shipping_address.city }}, {{ order.shipping_address.province }}</p>
         | 
| 38 | 
            +
                    <p>{{ order.shipping_address.country }} {{ order.shipping_address.zip }}</p>
         | 
| 39 | 
            +
                    <p>{{ order.shipping_address.phone }}</p>
         | 
| 40 | 
            +
                  </div>
         | 
| 41 | 
            +
                </div>
         | 
| 42 | 
            +
              {% endif %}
         | 
| 43 | 
            +
            </div>
         | 
| 44 | 
            +
             | 
| 45 | 
            +
            <table id="order_details">
         | 
| 46 | 
            +
              <thead>
         | 
| 47 | 
            +
                <tr id="cart-heading">
         | 
| 48 | 
            +
                  <th class="cart-header first" id="product"><h3>Product</h3></th>
         | 
| 49 | 
            +
                  <th class="cart-header first" id="sku"><h3>SKU</h3></th>
         | 
| 50 | 
            +
                  <th class="cart-header first" id="price"><h3>Price</h3></th>
         | 
| 51 | 
            +
                  <th class="cart-header first" id="quantity"><h3>Quantity</h3></th>
         | 
| 52 | 
            +
                  <th class="cart-header first" id="total"><h3>Total</h3></th>
         | 
| 53 | 
            +
                </tr>
         | 
| 54 | 
            +
              </thead>
         | 
| 55 | 
            +
              <tbody>
         | 
| 56 | 
            +
                {% for line_item in order.line_items %}
         | 
| 57 | 
            +
                <tr id="{{ line_item.id }}" class="order cart-item {% cycle 'odd', 'even' %}">
         | 
| 58 | 
            +
                  <td class="product">
         | 
| 59 | 
            +
                    {{ line_item.title | link_to: line_item.product.url }} 
         | 
| 60 | 
            +
                    {% if line_item.fulfillment %}
         | 
| 61 | 
            +
                      <div class="note">
         | 
| 62 | 
            +
                        Fulfilled {{ line_item.fulfillment.created_at | date: "%b %d" }}
         | 
| 63 | 
            +
                        {% if line_item.fulfillment.tracking_number %}
         | 
| 64 | 
            +
                          <a href="{{ line_item.fulfillment.tracking_url }}">{{ line_item.fulfillment.tracking_company }} #{{ line_item.fulfillment.tracking_number}}</a>
         | 
| 65 | 
            +
                        {% endif %}
         | 
| 66 | 
            +
                      </div>
         | 
| 67 | 
            +
                    {% endif %}
         | 
| 68 | 
            +
                  </td>
         | 
| 69 | 
            +
                  <td class="sku note">{{ line_item.sku }}</td>
         | 
| 70 | 
            +
                  <td class="money">{{ line_item.price | money }}</td>
         | 
| 71 | 
            +
                  <td class="quantity cente">{{ line_item.quantity }}</td>
         | 
| 72 | 
            +
                  <td class="total money">{{ line_item.quantity | times: line_item.price | money }}</td>
         | 
| 73 | 
            +
                </tr>
         | 
| 74 | 
            +
                {% endfor %}
         | 
| 75 | 
            +
              </tbody>  
         | 
| 76 | 
            +
              <tfoot>
         | 
| 77 | 
            +
                <tr class="order_summary note">
         | 
| 78 | 
            +
                  <td class="label" colspan="4">Subtotal:</td>
         | 
| 79 | 
            +
                  <td class="total money">{{ order.subtotal_price | money }}</td>
         | 
| 80 | 
            +
                </tr>   
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                {% for discount in order.discounts %}
         | 
| 83 | 
            +
                  <tr class="order_summary discount">
         | 
| 84 | 
            +
                    <td class="label" colspan="4">{{ discount.code }} Discount:</td>
         | 
| 85 | 
            +
                    <td class="total money">{{ discount.savings | money }}</td>
         | 
| 86 | 
            +
                  </tr>
         | 
| 87 | 
            +
                {% endfor %}
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                {% for shipping_method in order.shipping_methods %}
         | 
| 90 | 
            +
                <tr class="order_summary note">
         | 
| 91 | 
            +
                  <td class="label" colspan="4">Shipping ({{ shipping_method.title }}):</td>
         | 
| 92 | 
            +
                  <td class="total money">{{ shipping_method.price | money }}</td>
         | 
| 93 | 
            +
                </tr>
         | 
| 94 | 
            +
                {% endfor %}
         | 
| 95 | 
            +
                
         | 
| 96 | 
            +
                {% for tax_line in order.tax_lines %}
         | 
| 97 | 
            +
                  <tr class="order_summary note">
         | 
| 98 | 
            +
                    <td class="label" colspan="4">Tax ({{ tax_line.title }} {{ tax_line.rate | times: 100 }}%):</td>
         | 
| 99 | 
            +
                    <td class="total money">{{ tax_line.price | money }}</td>
         | 
| 100 | 
            +
                  </tr>
         | 
| 101 | 
            +
                {% endfor %}    
         | 
| 102 | 
            +
                        
         | 
| 103 | 
            +
                <tr class="order_summary order_total">
         | 
| 104 | 
            +
                  <td class="label" colspan="4">Total:</td>
         | 
| 105 | 
            +
                  <td class="total money">{{ order.total_price | money }} {{ order.currency }}</td>
         | 
| 106 | 
            +
                </tr>   
         | 
| 107 | 
            +
              </tfoot>  
         | 
| 108 | 
            +
            </table>
         | 
| 109 | 
            +
             | 
| @@ -0,0 +1,42 @@ | |
| 1 | 
            +
            {% layout settings.customer_layout %}
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            <div id="template">
         | 
| 4 | 
            +
              <div id="customer">
         | 
| 5 | 
            +
            	  <!-- Create Customer -->
         | 
| 6 | 
            +
            	  <div id="create-customer">
         | 
| 7 | 
            +
            	    <div class="template_header">
         | 
| 8 | 
            +
            	      <h2 class="title">Create Account</h2>
         | 
| 9 | 
            +
            	    </div>
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            	    {% form 'create_customer' %}
         | 
| 12 | 
            +
            	      {{ form.errors | default_errors }}
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            	      <div id="first_name" class="clearfix large_form">
         | 
| 15 | 
            +
            	        <label for="first_name" class="login">First Name</label>
         | 
| 16 | 
            +
            	        <input type="text" value="" name="customer[first_name]" id="first_name" class="large" size="30" />
         | 
| 17 | 
            +
            	      </div>
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            	      <div id="last_name" class="clearfix large_form">
         | 
| 20 | 
            +
            	        <label for="last_name" class="login">Last Name</label>
         | 
| 21 | 
            +
            	        <input type="text" value="" name="customer[last_name]" id="last_name" class="large" size="30" />
         | 
| 22 | 
            +
            	      </div>
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            	      <div id="email" class="clearfix large_form">
         | 
| 25 | 
            +
            	        <label for="email" class="login">Email Address</label>
         | 
| 26 | 
            +
            	        <input type="email" value="" name="customer[email]" id="email" class="large" size="30" />
         | 
| 27 | 
            +
            	      </div>
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            	      <div id="password" class="clearfix large_form">
         | 
| 30 | 
            +
            	        <label for="password" class="login">Password</label>
         | 
| 31 | 
            +
            	        <input type="password" value="" name="customer[password]" id="password" class="large password" size="30" />
         | 
| 32 | 
            +
            	      </div>
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            	      <div class="action_bottom">
         | 
| 35 | 
            +
            	        <input class="btn" type="submit" value="Create" />
         | 
| 36 | 
            +
            	        <span class="note"> {{ 'Login' | customer_login_link }}</span>
         | 
| 37 | 
            +
            	        <span class="note">or <a href="{{ shop.url }}">Return to Store</a></span>
         | 
| 38 | 
            +
            	      </div>	      
         | 
| 39 | 
            +
            	    {% endform %}
         | 
| 40 | 
            +
            	  </div><!-- /#create-customer -->
         | 
| 41 | 
            +
              </div>
         | 
| 42 | 
            +
            </div>
         | 
| @@ -0,0 +1,78 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
             | 
| 3 | 
            +
             | 
| 4 | 
            +
             | 
| 5 | 
            +
            <div id="page" class="clearfix">
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              <div id="header">
         | 
| 8 | 
            +
                <div class="wrapper">
         | 
| 9 | 
            +
                  <p><h1>{{ page.title }}</h1></p>
         | 
| 10 | 
            +
                </div>
         | 
| 11 | 
            +
              </div>
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              <div class="content">
         | 
| 14 | 
            +
                <div class="wrapper">
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  <div id="contact-menu">
         | 
| 17 | 
            +
                    {% for link in linklists['footer-support'].links %}
         | 
| 18 | 
            +
                    {% if link.title == page.title %}
         | 
| 19 | 
            +
                    <p><a href="{{ link.url }}" id="active"><h4>{{ link.title }}</h4></a></p>
         | 
| 20 | 
            +
                    {% else %}
         | 
| 21 | 
            +
                    <p><a href="{{ link.url }}"><h4>{{ link.title }}</h4></a></p>
         | 
| 22 | 
            +
                    {% endif %}
         | 
| 23 | 
            +
                    {% endfor %}
         | 
| 24 | 
            +
                  </div>
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  <div id="contact-form">
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    {% if page.title == "Contact" %}
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                      {% form 'contact' %}
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                      {% if form.posted_successfully? %}
         | 
| 33 | 
            +
                      Thanks for contacting us! We'll get back to you as soon as possible.
         | 
| 34 | 
            +
                      {% endif %}
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                      {% if form.errors %}
         | 
| 37 | 
            +
                      {% for field in form.errors %}
         | 
| 38 | 
            +
                      <div>
         | 
| 39 | 
            +
                        <p id="error_message">{{ field }} - {{ form.errors.messages[field] }}</p>
         | 
| 40 | 
            +
                      </div>
         | 
| 41 | 
            +
                      {% endfor %}
         | 
| 42 | 
            +
                      {% endif %}
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                      <div id="getintouch" style="float:left">
         | 
| 45 | 
            +
                        <h3>Get In Touch</h3>
         | 
| 46 | 
            +
                        <hr>
         | 
| 47 | 
            +
                        <small>* indicates a required field</small><br>
         | 
| 48 | 
            +
                        <input type="text" value="Full Name" name="contact[name]"> <br>
         | 
| 49 | 
            +
                        <input type="text" value="Email Address" name="contact[email]"> <span class="required"> *</span> <br>
         | 
| 50 | 
            +
                        <textarea cols="38" rows="5" type="text" name="contact[message]">your message</textarea>
         | 
| 51 | 
            +
                        <input type="image" src="{{ 'getintouch.png' | asset_url }}" class="submit">
         | 
| 52 | 
            +
                      </div>
         | 
| 53 | 
            +
                      {% endform %}
         | 
| 54 | 
            +
             | 
| 55 | 
            +
             | 
| 56 | 
            +
                      <div id="contact-info">
         | 
| 57 | 
            +
                        <h3>Visit Our Store</h3>
         | 
| 58 | 
            +
                        <hr>
         | 
| 59 | 
            +
                        <p>Suite A - 123 Something Street <br>
         | 
| 60 | 
            +
                        Vancouver, BC Postal Code <br>
         | 
| 61 | 
            +
                        Canada</p>
         | 
| 62 | 
            +
                      </div>
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                      <div id="contact-info">
         | 
| 65 | 
            +
                        <h3>Customer Support</h3>
         | 
| 66 | 
            +
                        <hr>
         | 
| 67 | 
            +
                        <p>(800)123-1234 <br>
         | 
| 68 | 
            +
                        support@elroy.com</p>
         | 
| 69 | 
            +
                      </div>
         | 
| 70 | 
            +
                    {% else %}
         | 
| 71 | 
            +
                      {{ page.content }}
         | 
| 72 | 
            +
                    {% endif %}
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                  </div>
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                </div>
         | 
| 77 | 
            +
              </div>
         | 
| 78 | 
            +
            </div> <!-- /#page -->
         | 
| @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            <div id="page" class="clearfix">
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              <div id="header">
         | 
| 4 | 
            +
                <div class="wrapper">
         | 
| 5 | 
            +
                  <p><h1>{{ page.title }}</h1></p>
         | 
| 6 | 
            +
                </div>
         | 
| 7 | 
            +
              </div>
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              <div class="content">
         | 
| 10 | 
            +
                <div class="wrapper">
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  <div id="contact-form">
         | 
| 13 | 
            +
                      {{ page.content }}
         | 
| 14 | 
            +
                  </div>
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                </div>
         | 
| 17 | 
            +
              </div>
         | 
| 18 | 
            +
            </div> <!-- /#page -->
         |