shopifydev 0.0.1 → 0.0.2

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/.pryrc CHANGED
@@ -1,3 +1,3 @@
1
1
  require 'bundler/setup'
2
2
  require 'shopifydev'
3
- require 'shopifydev/pry/commands'
3
+ require 'shopifydev/console'
data/NEXTSTEPS.md CHANGED
@@ -20,10 +20,66 @@ apps (heroku):
20
20
  1. metafieldseditor
21
21
  2. shipping
22
22
 
23
+ _pry_.switch
24
+ Switch is a class, and every instance of Pry has an instance of Switch. This way we can
25
+ access _pry_.switch. In the global scope there will be an object called 'switch' that will
26
+ be an alias to _pry_.switch so that we can call its public methods. There will also be a
27
+ command 'switch' that will be a wrapper for the _pry_.switch methods for displaying and
28
+ handling a menu.
23
29
 
30
+ So we can do
24
31
 
25
- when you choose
32
+ `[1] pry(main)> switch`
26
33
 
34
+ to present a menu of options and then
35
+
36
+ `[1] pry(main)> switch 3`
37
+
38
+ to choose one of them. This command just refers to methods on Pry.Switch in its process definition
39
+
40
+ Or we can use tab completion to present the menu by invoking switch as a global object.
41
+
42
+ ````
43
+ [1] pry(main)> switch.m[TAB]
44
+ switch.metafieldseditor switch.morfars-metafields
45
+ [2] pry(main)> switch.mo[TAB]rfars-metafields
46
+ ````
47
+
48
+ to accomplish the same.
49
+
50
+ - When you use switch by itself, with no args, then _pry_.switch gets reset to the first menu
51
+ - each time you make a choice, this advances _pry_.switch to the next menu
52
+
53
+ So in a deep menu we might see:
54
+
55
+ ````
56
+ [1] pry(main)> switch
57
+ current shop: none
58
+
59
+ Heroku Apps
60
+ 1. right app
61
+ 2. wrong app
62
+ [1] pry(main)> switch 2
63
+ current shop: none
64
+
65
+ Wrong App
66
+ 1. not ok
67
+ 2. something
68
+ [1] pry(main)> switch
69
+ current shop: none
70
+
71
+ Heroku Apps
72
+ 1. right app
73
+ 2. wrong app
74
+ [1] pry(main)> switch 1
75
+ current shop: none
76
+
77
+ Wrong App
78
+ 1. another thing
79
+ 2. the thing you wanted
80
+ [1] pry(main)> switch 2
81
+ current shop: none switching to "the thing you wanted"...
82
+ ````
27
83
 
28
84
  # To check out
29
85
 
@@ -31,3 +87,21 @@ https://github.com/pry/pry-coolline
31
87
  https://github.com/cldwalker/bond
32
88
 
33
89
 
90
+ # Menu of Shops in local apps
91
+ - [x] run rake shops in chosen local app
92
+ - [ ] display result of rake shops in a menu
93
+ - how do we handle this? do we use letters? or does switch command remember state (which menu was displayed last)? ie, what does ```switch 1``` mean?
94
+ - [ ] memoize results of rake shops in a hash with same keys as the apps have in config (I would put this in config). This is because running rake shops is slow enough to be annoying.
95
+ - [ ] add -r,--refresh option to switch command to tell it to get fresh data
96
+ - [ ] deploy apps with shopify_dev gem
97
+ - [ ] metafieldseditor richard@webifytechnology.com
98
+ - [ ] morfars-metafields richard@webifytechnology.com
99
+ - [ ] red-pepper-shipping richard@webifytechnology.com
100
+ - [ ] shipping-lifemap-bioreagents richard@webifytechnology.com
101
+ - [ ] shipping-staging richard@webifytechnology.com
102
+
103
+
104
+ # Using pry features
105
+ https://github.com/ConradIrwin/pry-rescue
106
+ -- we **really** want to be using this in test/development environments in rails apps.
107
+ https://github.com/envygeeks/pry-vterm_aliases
data/README.md CHANGED
@@ -69,6 +69,37 @@ you won't upload a file twice unless it gets changed twice in the same commit)
69
69
 
70
70
  One final tip: `alias upify='shopifydev upload'`
71
71
 
72
+ # Caches
73
+
74
+ Caches are defined on ```ShopifyAPI```.
75
+ Assuming you ```cd ShopifyAPI```:
76
+
77
+ products
78
+ => lazily fetched cached products
79
+
80
+ products.r
81
+ => reload products cache
82
+
83
+ products(product_type: 'xxxx')
84
+ => reload products cache with params {product_type: 'xxxx'}
85
+
86
+ products.params
87
+ => shows params the caches were fetched with
88
+
89
+ products.since
90
+ => shows when the products cache was last fetched
91
+
92
+ caches
93
+ => lists status of all the caches & when they were last
94
+ reloaded. Will show an ! next to records that were fetched
95
+ with params.
96
+
97
+ caches true
98
+ => shows params the caches were loaded with
99
+
100
+
101
+
102
+
72
103
  ## Contributing
73
104
 
74
105
  1. Fork it
data/bin/shopify_console CHANGED
@@ -1,15 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'pry'
3
3
  require 'shopifydev'
4
- require 'shopifydev/pry/commands'
4
+ require 'shopifydev/console'
5
5
 
6
-
7
- MY_OBJ = []
8
-
9
- def bob
10
- "yo, bob here"
11
- end
12
- # start a REPL session
13
- binding.pry
6
+ Pry.start
14
7
 
15
8
  puts "Thank you for using Shopify Console. Enjoy your day."
@@ -0,0 +1,15 @@
1
+ require 'shopifydev/pry/commands'
2
+ require 'shopifydev/shopify_api/caches'
3
+
4
+ require 'term/ansicolor'
5
+ class Color
6
+ if Pry.config.color
7
+ extend Term::ANSIColor
8
+ else
9
+ class << self
10
+ def method_missing
11
+ ''
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,16 +1,4 @@
1
- require 'term/ansicolor'
2
1
  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
2
 
15
3
  class LocalShopifyApp
16
4
  attr_accessor :path
@@ -19,15 +7,14 @@ class LocalShopifyApp
19
7
  end
20
8
 
21
9
  def shops
22
- json = `/bin/bash -l -c "unset BUNDLE_GEMFILE; cd #{path}; bundle exec rake shops 2>/dev/null"`
10
+ json = `/bin/bash -l -c "unset BUNDLE_GEMFILE; cd #{path} 2> /dev/null; bundle exec rake shops 2>/dev/null"`
23
11
  json = json.split("----snip----\n").last
12
+ json = json.split("\n").last
24
13
  Oj.load json
25
14
  end
26
-
27
15
  end
28
16
 
29
17
  class ConfigMenu
30
-
31
18
  attr_accessor :cfg
32
19
 
33
20
  def initialize(cfg)
@@ -35,6 +22,7 @@ class ConfigMenu
35
22
  @menu_choices = [:do_nothing]
36
23
  @menu_display = []
37
24
  end
25
+
38
26
  def build
39
27
  header("Test Shops")
40
28
  cfg[:test_shops].keys.each do |k|
@@ -103,8 +91,6 @@ shopifydev_command_set = Pry::CommandSet.new do
103
91
 
104
92
  config_menu = ConfigMenu.new(Shopifydev::Config.config).build
105
93
 
106
-
107
-
108
94
  case true
109
95
  when args.empty?
110
96
  config_menu.print(output)
@@ -137,7 +123,7 @@ shopifydev_command_set = Pry::CommandSet.new do
137
123
  output.puts "you picked #{path.join('.')}"
138
124
  output.puts cfg.inspect
139
125
  app = LocalShopifyApp.new(cfg)
140
- output.puts Color.yellow{ app.shops.inspect }
126
+ output.puts Color.yellow{ app.shops.inspect }
141
127
  when :heroku
142
128
  output.puts "you picked #{path.join('.')}"
143
129
  output.puts cfg.inspect
@@ -188,7 +174,6 @@ shopifydev_command_set = Pry::CommandSet.new do
188
174
  ix += output_menu_choices(cfg[:apps][:heroku].keys.sort, ix)
189
175
  end
190
176
  end
191
-
192
177
  end
193
178
 
194
179
  Pry::Commands.import shopifydev_command_set
@@ -0,0 +1,176 @@
1
+ puts "yo, included"
2
+
3
+ module Shopifydev
4
+ module ShopifyAPI
5
+ module DirtyCache
6
+ def dirty!
7
+ ShopifyAPI.dirty!
8
+ end
9
+
10
+ def site=(uri)
11
+ ShopifyAPI.dirty!
12
+ super uri
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ module ShopifyAPI
19
+ class Base
20
+ include Shopifydev::ShopifyAPI::DirtyCache
21
+ end
22
+ end
23
+
24
+ module ShopifyAPI
25
+ class << self
26
+
27
+ def cache_status(cache, show_opts=false)
28
+ dirty?
29
+ subset = ''
30
+ opts = ''
31
+ length = Color.black{'unloaded'}
32
+ since = ''
33
+ unless cache.nil?
34
+ if !show_opts && (cache.params.keys.to_set != Set[:limit])
35
+ subset = Color.red('!')
36
+ end
37
+ if show_opts
38
+ opts = cache.params.map{|k, v| Color.magenta{k.to_s} + Color.black{':'} + Color.green{v.to_s}}.join(Color.black{', '})
39
+ opts = "\n #{opts}"
40
+ end
41
+ length = (cache.length > 0) ? "#{cache.length.to_s}#{subset} #{Color.black{cache.label}}" : 'empty'
42
+ since = "#{Color.black{'on:'}}#{cache.since.strftime("%a %H:%M:%S")}"
43
+ end
44
+ "#{length.ljust(18)} #{since}#{opts}"
45
+ end
46
+
47
+ def caches(show_opts=false)
48
+ return if warn_site
49
+ dirty?
50
+ puts <<-EOF
51
+ #{Color.blue{'products'}}: #{cache_status(@@products, show_opts)}
52
+ #{Color.blue{'variants'}}: #{cache_status(@@variants, show_opts)}
53
+ #{Color.blue{'metafields'}}: #{cache_status(@@metafields, show_opts)}
54
+ #{Color.blue{'orders'}}: #{cache_status(@@orders, show_opts)}
55
+ #{Color.blue{'customers'}}: #{cache_status(@@customers, show_opts)}
56
+ #{Color.blue{'custom_collections'}}: #{cache_status(@@custom_collections, show_opts)}
57
+ #{Color.blue{'smart_collections'}}: #{cache_status(@@smart_collections, show_opts)}
58
+ EOF
59
+ end
60
+
61
+ def dirty?
62
+ @@products ||= nil
63
+ @@variants ||= nil
64
+ @@metafields ||= nil
65
+ @@orders ||= nil
66
+ @@customers ||= nil
67
+ @@custom_collections ||= nil
68
+ @@smart_collections ||= nil
69
+ end
70
+
71
+ def dirty!
72
+ @@products = nil
73
+ @@variants = nil
74
+ @@metafields = nil
75
+ @@orders = nil
76
+ @@customers = nil
77
+ @@custom_collections = nil
78
+ @@smart_collections = nil
79
+ end
80
+
81
+ def add_cache_methods(obj, opts, entity)
82
+ obj.singleton_class.class_eval{define_method(:label){entity.collection_name}}
83
+ obj.singleton_class.class_eval{define_method(:since=){|t| @since = t }}
84
+ obj.singleton_class.class_eval{define_method(:since){ @since }}
85
+ obj.singleton_class.class_eval{attr_accessor :params}
86
+ obj.since = Time.now
87
+ obj.singleton_class.class_eval{define_method(:r) { |msg = 'reloading'|
88
+ puts "#{msg}..."
89
+ self.replace(entity.find(:all, params: self.params))
90
+ self.since = Time.now
91
+ puts "#{self.length} records."
92
+ nil
93
+ }}
94
+ end
95
+
96
+ def warn_site
97
+ if ::ShopifyAPI::Base.site.nil? || ::ShopifyAPI::Base.site.blank?
98
+ puts "No active Shopify session"
99
+ true
100
+ else
101
+ false
102
+ end
103
+ end
104
+
105
+ def fetch_cache(entity, opts, obj)
106
+ msg = nil
107
+ refresh = opts.delete(:r)
108
+ if obj.nil? || refresh
109
+ obj = []
110
+ add_cache_methods(obj, opts, entity)
111
+ obj.params = opts
112
+ msg = refresh ? "reloading #{entity.collection_name}" : "loading #{entity.collection_name}"
113
+ obj.r(msg)
114
+ elsif (obj.params != opts)
115
+ msg = "reloading #{entity.collection_name} with new params..."
116
+ obj.params = opts
117
+ obj.r(msg)
118
+ end
119
+ obj
120
+ end
121
+
122
+ def products(opts={limit: 250})
123
+ return if warn_site
124
+ @@products ||= nil
125
+ @@products = fetch_cache(ShopifyAPI::Product, opts, @@products)
126
+ @@products
127
+ end
128
+
129
+ def variants(opts={limit: 250})
130
+ return if warn_site
131
+ @@variants ||= nil
132
+ @@variants = fetch_cache(ShopifyAPI::Variant, opts, @@variants)
133
+ @@variants
134
+
135
+ end
136
+
137
+ def orders(opts={limit: 250})
138
+ return if warn_site
139
+ @@orders ||= nil
140
+ @@orders = fetch_cache(ShopifyAPI::Order, opts, @@orders)
141
+ @@orders
142
+ end
143
+
144
+ def customers(opts={limit: 250})
145
+ return if warn_site
146
+ @@customers ||= nil
147
+ @@customers = fetch_cache(ShopifyAPI::Customer, opts, @@customers)
148
+ @@customers
149
+ end
150
+
151
+ def metafields(opts={limit: 250})
152
+ return if warn_site
153
+ @@metafields ||= nil
154
+ @@metafields = fetch_cache(ShopifyAPI::Metafield, opts, @@metafields)
155
+ @@metafields
156
+ end
157
+
158
+ def custom_collections(opts={limit: 250})
159
+ return if warn_site
160
+ @@custom_collections ||= nil
161
+ @@custom_collections = fetch_cache(ShopifyAPI::CustomCollection, opts, @@custom_collections)
162
+ @@custom_collections
163
+ end
164
+
165
+ def smart_collections(opts={limit: 250})
166
+ return if warn_site
167
+ @@smart_collections ||= nil
168
+ @@smart_collections = fetch_cache(ShopifyAPI::SmartCollection, opts, @@smart_collections)
169
+ @@smart_collections
170
+ end
171
+
172
+
173
+
174
+
175
+ end
176
+ end
@@ -1,3 +1,3 @@
1
1
  module Shopifydev
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Console" do
4
+ it "needs to have tests written"
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Caches" do
4
+ it "needs to have tests written"
5
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shopifydev
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-06 00:00:00.000000000 Z
12
+ date: 2013-06-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: shopify_api
@@ -215,6 +215,7 @@ files:
215
215
  - lib/shopifydev/asset.rb
216
216
  - lib/shopifydev/commands.rb
217
217
  - lib/shopifydev/config.rb
218
+ - lib/shopifydev/console.rb
218
219
  - lib/shopifydev/generators/shop.rb
219
220
  - lib/shopifydev/generators/templates/Gemfile
220
221
  - lib/shopifydev/generators/templates/gitignore
@@ -223,19 +224,16 @@ files:
223
224
  - lib/shopifydev/pry/commands.rb
224
225
  - lib/shopifydev/railtie.rb
225
226
  - lib/shopifydev/shop.rb
227
+ - lib/shopifydev/shopify_api/caches.rb
226
228
  - lib/shopifydev/template.rb
227
229
  - lib/shopifydev/version.rb
228
230
  - shopifydev.gemspec
229
231
  - spec/shopifydev/config_spec.rb
232
+ - spec/shopifydev/console_spec.rb
230
233
  - spec/shopifydev/generators/shopifydev/shopifydev_generator_spec.rb
231
234
  - spec/shopifydev/pry/commands_spec.rb
232
235
  - spec/shopifydev/railtie_spec.rb
233
- - templates/customers/order.liquid
234
- - templates/customers/register.liquid
235
- - templates/page.support.liquid
236
- - templates/page.verbose.liquid
237
- - templates/product.liquid
238
- - templates/search.liquid
236
+ - spec/shopifydev/shopifyapi/caches_spec.rb
239
237
  - test_driver.rb
240
238
  homepage: ''
241
239
  licenses: []
@@ -251,7 +249,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
251
249
  version: '0'
252
250
  segments:
253
251
  - 0
254
- hash: -1632061386653175643
252
+ hash: -20439056481340104
255
253
  required_rubygems_version: !ruby/object:Gem::Requirement
256
254
  none: false
257
255
  requirements:
@@ -260,7 +258,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
260
258
  version: '0'
261
259
  segments:
262
260
  - 0
263
- hash: -1632061386653175643
261
+ hash: -20439056481340104
264
262
  requirements: []
265
263
  rubyforge_project:
266
264
  rubygems_version: 1.8.25
@@ -270,6 +268,8 @@ summary: Abstract out and port to ruby the functionality of the shopify textmate
270
268
  for use in other editors.
271
269
  test_files:
272
270
  - spec/shopifydev/config_spec.rb
271
+ - spec/shopifydev/console_spec.rb
273
272
  - spec/shopifydev/generators/shopifydev/shopifydev_generator_spec.rb
274
273
  - spec/shopifydev/pry/commands_spec.rb
275
274
  - spec/shopifydev/railtie_spec.rb
275
+ - spec/shopifydev/shopifyapi/caches_spec.rb
@@ -1,109 +0,0 @@
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
-
@@ -1,42 +0,0 @@
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>
@@ -1,78 +0,0 @@
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">&nbsp;*</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 -->
@@ -1,18 +0,0 @@
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 -->
@@ -1,284 +0,0 @@
1
- {% include 'breadcrumbs' %}
2
-
3
- <div id="product" class="content {{ product.handle }}{% if product.images.size == 1 %} one_image{% endif %} clearfix">
4
-
5
- <div class="wrapper">
6
- <div id="product-image">
7
- {% if product.images.size > 1 %}
8
- <div id="product-image-icons">
9
- {% for image in product.images %}
10
- <!-- CC attribution
11
- magnifying-glass.ico
12
- http://www.wpzoom.com
13
- Designed by David Ferreira.
14
- -->
15
- <div class="image">
16
- <a href="{{ image.src | product_img_url: 'original' }}" class="cloud-zoom-gallery" rel="useZoom: 'placeholder', smallImage: '{{ image.src | product_img_url: 'grande' }}', tint: '#ffffff'">
17
- <img src="{{ image.src | product_img_url: 'small' }}" alt="{{ image.alt | escape }}" />
18
- </a>
19
- </div>
20
- {% endfor %}
21
- </div><!-- /.thumbs -->
22
- {% endif %}
23
- <div id="product-image-large">
24
- <div class="image">
25
- <a href="{{ product.featured_image.src | product_img_url: 'original' }}" class="cloud-zoom" rel="position: 'inside', showTitle: 'false'" id="placeholder">
26
- <img src="{{ product.featured_image.src | product_img_url: 'grande' }}" alt="{{ product.featured_image.alt | escape }}" />
27
- </a>
28
- </div>
29
-
30
- </div> <!-- /.featured -->
31
- <div id="product-image-zoom">Hover over image to zoom</div>
32
- </div> <!-- /.images -->
33
-
34
- <div id="product-content">
35
- {% if collection %}
36
- <div class="more-info clearfix">
37
- {% if collection.previous_product %}
38
- <div class="fl">
39
- <a href="{{ collection.previous_product }}" class="previous_product"><span class="upper">Previous</span> <span class="lower">Product</span></a>
40
- </div>
41
- {% endif %}
42
- {% if collection.next_product %}
43
- <div class="fr">
44
- <a href="{{ collection.next_product }}" class="next_product"><span class="upper">Next</span> <span class="lower">Product</span></a>
45
- </div>
46
- {% endif %}
47
- </div>
48
- {% endif %}
49
-
50
- <div id="product-full-description">
51
- <div id="product-category">{{ collection.title | split: ' -- ' | last }}</div>
52
- <h2 class="title">{{ product.title }}</h2>
53
- {% if product.price_min < product.compare_at_price_min %}
54
- <div id="product-price">{{ product.price_min | money }}</div>
55
- <div id="product-price-old"><strike>{{ product.compare_at_price_min | money }}</strike></div>
56
- {% else %}
57
- <div id="product-price">{{ product.price_min | money }}</div>
58
- {% endif %}
59
-
60
- {% if settings.product_description_position == "top" %}
61
-
62
- {% include 'shipping-and-return-tabs' %}
63
-
64
- {% endif %}
65
-
66
- <form id="add-item-form" action="/cart/add" method="post" class="variants clearfix">
67
- {% if product.options.size > 1 %}
68
- <div class="select clearfix">
69
-
70
- <div id="product-color">
71
- <div id="variant_details"></div>
72
- <h4 style="color:#333">Please choose a color:</h4>
73
- {% include 'swatches' %}
74
- </div>
75
-
76
- <div id="product-size" class="product-info">
77
- <select id="product-select" name='id'>
78
- {% for variant in product.variants %}
79
- <option value="{{ variant.id }}">{{ variant.title }} - {{ variant.price | money }}</option>
80
- {% endfor %}
81
- </select>
82
- </div>
83
- </div>
84
- {% elsif product.options.size == 1 and product.variants.size > 1 %}
85
- <div class="select clearfix">
86
- <label>{{ product.options[0] }}</label>
87
- <select id="product-select" name='id'>
88
- {% for variant in product.variants %}
89
- <option value="{{ variant.id }}">{{ variant.title }} - {{ variant.price | money }}</option>
90
- {% endfor %}
91
- </select>
92
- </div>
93
- {% else %}
94
- <input type="hidden" name="id" value="{{ product.variants.first.id }}" />
95
- {% endif %}
96
-
97
- <div id="product-quantity">
98
- <label for="quantity"><h5 style="float:left">Quantity:</h5></label>
99
- <input min="1" type="number" id="quantity" name="quantity" value="1" />
100
- </div>
101
-
102
-
103
- {% if product.available %}
104
- <div class="purchase clearfix">
105
- <span><input type="image" src="{{ 'cart.png' | asset_url }}" name="add" id="add-to-cart" value="Add to Cart" class="cart cufon" /></span>
106
- </div>
107
- {% else %}
108
- <div class="purchase clearfix">
109
- <span><input type="submit" name="add" id="add-to-cart" value="Sold Out" class="cart cufon disabled" disabled="disabled" /></span>
110
- </div>
111
- {% endif %}
112
-
113
- </form>
114
-
115
- <hr />
116
-
117
- {% if settings.product_description_position == "bottom" %}
118
-
119
- {% include 'shipping-and-return-tabs' %}
120
-
121
- <div id="social-media">
122
- {% include 'pinterest' %}
123
- {% include 'like' %}
124
- {% include 'amazon-wish-list' %}
125
- </div>
126
- {% endif %}
127
-
128
- </div>
129
- </div>
130
-
131
- {% comment %} Related Products {% endcomment %}
132
- {% include 'related-products' %}
133
-
134
- </div>
135
-
136
- </div> <!-- /#product -->
137
-
138
- <script type="text/javascript">
139
-
140
- // <![CDATA[
141
- var selectCallback = function(variant, selector) {
142
-
143
- // #variant_details is in snippets/shipping-and-return-tabs
144
- var description = jQuery('#variant_details')
145
-
146
- // if we have product variants with details
147
- {% if product.metafields.variants.variant_details %}
148
-
149
- // make an array of the details
150
- var metafields = {{ product.metafields.variants.variant_details | json }}.split(':')
151
-
152
- // match the details against the selected variant
153
- var match = true
154
- for (i = 0; i < variant.options.length; i++) {
155
-
156
- if (variant.options[i].toLowerCase().trim() === metafields[i].trim()) {
157
- // NOP
158
- } else {
159
- match = false;
160
- }
161
- } // post: if a metafield matched the current variant exactly, match is true
162
-
163
- // if it was a complete match, then post the last detail
164
- if (match === true) {
165
- description.text(metafields.pop().trim())
166
- description.addClass('active')
167
- } else {
168
- description.text('')
169
- description.removeClass('active')
170
- }
171
- {% endif %}
172
-
173
- if (variant && variant.available == true) {
174
- // selected a valid variant
175
- jQuery('#add-to-cart').removeClass('disabled').removeAttr('disabled').val('Add to Cart'); // remove unavailable class from add-to-cart button, and re-enable button
176
- if(variant.price < variant.compare_at_price){
177
- jQuery('#price-preview').html('<span class="money">'
178
- + Shopify.formatMoney(variant.price, "{{ shop.money_format }}")
179
- + '</span>'
180
- + ' was <span class="money">'
181
- + Shopify.formatMoney(variant.compare_at_price, "{{ shop.money_format }}")
182
- + "</span>");
183
- } else {
184
- jQuery('#price-preview').html('<span class="money">' + Shopify.formatMoney(variant.price, "{{ shop.money_format }}") + '</span>');
185
- }
186
-
187
- } else {
188
- // variant doesn't exist
189
- var message = variant ? "Sold Out" : "Unavailable";
190
- jQuery('#add-to-cart').addClass('disabled').attr('disabled', 'disabled').val('Sold Out'); // set add-to-cart button to unavailable class and disable button
191
- jQuery('#product .variants .price').text(message); // update price-field message
192
- }
193
- };
194
-
195
- function remove(s, t) {
196
- /*
197
- ** Remove all occurrences of a token in a string
198
- ** s string to be processed
199
- ** t token to be removed
200
- ** returns new string
201
- */
202
- i = s.indexOf(t);
203
- r = "";
204
- if (i == -1) return s;
205
- r += s.substring(0,i) + remove(s.substring(i + t.length), t);
206
- return r;
207
- }
208
-
209
- // initialize multi selector for product
210
- jQuery(function() {
211
- /* NOTE we are not using recently-viewed, so I am removing the related code
212
- if(jQuery.cookie("viewed-products") != null){ // if cookie exists...
213
- var products = jQuery.cookie("viewed-products");
214
- var productHandles = products.split(" ");
215
- var matches = 0;
216
- var limit = 4;
217
- for(var i = (productHandles.length - 1); i >= 0; i--) {
218
- if(productHandles[i] != "{{ product.handle }}" && productHandles[i] != "" && (matches < limit)){
219
- Shopify.getProduct(productHandles[i]);
220
- matches++;
221
- }
222
- }
223
-
224
- if(products.indexOf("{{ product.handle }}") == -1){ // add current product to list if it isn't already there
225
- products += " {{ product.handle }}";
226
- jQuery.cookie("viewed-products", products, {path: "/"});
227
- } else { // if it is already there, push it to the end of the string
228
- var newstring = remove(products, '{{ product.handle }}');
229
- newstring += " {{ product.handle }}";
230
- jQuery.cookie("viewed-products", newstring.replace(/ /g,' '), {path: "/"});
231
- }
232
- } else { // create cookie if it doesn't already exist
233
- jQuery.cookie("viewed-products", "{{ product.handle }}", {path: "/"});
234
- } */
235
-
236
- // create the multi-selector
237
- {% if product.variants.size > 1 or product.options.size > 1 %}
238
- new Shopify.OptionSelectors("product-select", { product: {{ product | json }}, onVariantSelected: selectCallback });
239
-
240
- // wrap the labels for Cufon styling
241
- var labels = jQuery('#product-size .selector-wrapper label')
242
- labels.wrapInner('<h4 class="selector-label" />')
243
-
244
- // add classes to each option for chaining
245
- {% for variant in product.variants %}
246
-
247
- var colour = '{{ variant.option1 }}'
248
- var size = '{{ variant.option2 }}'
249
-
250
- jQuery('#product-select-option-1'
251
- + ' option[value="' + size + '"]').addClass(colour)
252
-
253
- {% endfor %}
254
-
255
- // choose a default value for each selector in the cluster
256
- {% assign found_one_in_stock = false %}
257
- {% for variant in product.variants %}
258
- {% if variant.available and found_one_in_stock == false %}
259
-
260
- // for the first variant that is in stock
261
- {% assign found_one_in_stock = true %}
262
- {% for option in product.options %}
263
- jQuery('#product-select-option-' + {{ forloop.index0 }}).val({{ variant.options[forloop.index0] | json }}).trigger('change');
264
-
265
- {% endfor %}
266
- {% endif %}
267
- {% endfor %}
268
-
269
- {% endif %}
270
-
271
- $("#product-select-option-1").chained("#product-select-option-0"); /* or $("#series").chainedTo("#mark"); */
272
-
273
- });
274
-
275
- /* NOTE we are not using recently-viewed so I am removing the related code
276
- Shopify.onProduct = function(product) {
277
- jQuery("#recently-viewed").css('display', 'block');
278
- jQuery("#recently-viewed .products").append('<div class="product"><div class="image"><a href="' + product.url + '"><img src="' + Shopify.resizeImage(product.featured_image, 'large') + '" alt="' + product.title + '" /></a></div><div class="details clearfix"><a href="' + product.url + '"><span class="title">' + product.title + '</span></a></div></div>');
279
- jQuery("#recently-viewed .products .product:nth-child(4)").addClass("last");
280
- jQuery("#content-slide .product .details, #content-table .product .details").css({opacity:0.0});
281
- }; */
282
- // ]]>
283
- </script>
284
-
@@ -1,63 +0,0 @@
1
- <div id="search" class="clearfix">
2
- {% if search.performed %}
3
- <div class="main">
4
- {% paginate search.results by settings.pagination_limit %}
5
- <div class="more-info clearfix">
6
- <div class="fl">
7
- <span class="upper">Search Results</span>
8
- <span class="lower">{{ search.results_count }} {{ search.results_count | pluralize: 'Match', 'Matches' }} </span>
9
- </div>
10
- <div class="fr">
11
- <span class="upper">&nbsp;</span>
12
- <span class="lower">{% include 'pagination' %}</span>
13
- </div>
14
- </div>
15
- {% if search.terms == "" %}
16
- <p>Your search query was empty.</p>
17
- {% else %}
18
- {% if search.results == empty %}
19
- <div class="empty">
20
- Your search for "{{search.terms | escape}}" did not yield any results
21
- </div>
22
- {% else %}
23
-
24
- <div class="results">
25
- {% for item in search.results %}
26
- <div class="item clearfix">
27
- <div class="thumbnail">
28
- <a href="{{ item.url }}">{{ item.featured_image.src | product_img_url: 'thumb' | img_tag: item.featured_image.alt }}</a>
29
- </div>
30
- <div class="content">
31
- <h4>{{ item.title | link_to: item.url }}</h4>
32
- {{ item.content | strip_html | truncatewords: 40 | highlight: search.terms }}
33
- </div>
34
- </div> <!-- /.item -->
35
- {% endfor %}
36
- </div> <!-- /.results -->
37
-
38
- {% endif %}
39
- {% endif %}
40
-
41
- <div class="more-info clearfix">
42
- <div class="fr">
43
- <span class="upper">&nbsp;</span>
44
- <span class="lower">{% include 'pagination' %}</span>
45
- </div>
46
- </div>
47
-
48
- {% endpaginate %}
49
- </div> <!-- /.main -->
50
- {% include "sidebar" %}
51
-
52
- {% else %}
53
-
54
- <div id="not_found">
55
- <h2>Search our shop</h2>
56
- <form id="search_form" class="searchform" name="search" action="/search">
57
- <input type="text" class="replace" name="q" value="Search..." />
58
- </form>
59
- </div> <!-- /#not_found -->
60
-
61
- {% endif %}
62
- </div> <!-- /#search -->
63
- {% include 'featured-products' %}