shoplazza-cli 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.
Files changed (181) hide show
  1. package/.editorconfig +28 -0
  2. package/.prettierrc +9 -0
  3. package/LICENSE +21 -0
  4. package/README.md +208 -0
  5. package/bin/shoplazza +117 -0
  6. package/fixtures/assets/blog.scss +74 -0
  7. package/fixtures/assets/cart_modal.scss +450 -0
  8. package/fixtures/assets/collection_detail.js +234 -0
  9. package/fixtures/assets/collection_detail.scss +345 -0
  10. package/fixtures/assets/collection_list.scss +11 -0
  11. package/fixtures/assets/collection_slider.scss +169 -0
  12. package/fixtures/assets/feature_columns.scss +26 -0
  13. package/fixtures/assets/feature_product.scss +109 -0
  14. package/fixtures/assets/footer.js +58 -0
  15. package/fixtures/assets/footer.scss +337 -0
  16. package/fixtures/assets/four_images.scss +29 -0
  17. package/fixtures/assets/gallery.scss +55 -0
  18. package/fixtures/assets/header.js +178 -0
  19. package/fixtures/assets/header.scss +929 -0
  20. package/fixtures/assets/image_text.scss +72 -0
  21. package/fixtures/assets/logo_bar.scss +11 -0
  22. package/fixtures/assets/newsletter.scss +90 -0
  23. package/fixtures/assets/not_found.scss +39 -0
  24. package/fixtures/assets/page_detail.scss +16 -0
  25. package/fixtures/assets/pagination.scss +150 -0
  26. package/fixtures/assets/postcss.config.js +6 -0
  27. package/fixtures/assets/product_description.scss +88 -0
  28. package/fixtures/assets/product_detail.js +634 -0
  29. package/fixtures/assets/product_detail.scss +1106 -0
  30. package/fixtures/assets/relative_product.scss +45 -0
  31. package/fixtures/assets/reviews.scss +70 -0
  32. package/fixtures/assets/rich_text.scss +71 -0
  33. package/fixtures/assets/search.js +87 -0
  34. package/fixtures/assets/search.scss +67 -0
  35. package/fixtures/assets/slide.scss +51 -0
  36. package/fixtures/assets/slider.scss +141 -0
  37. package/fixtures/assets/theme.css +976 -0
  38. package/fixtures/assets/theme.scss +1100 -0
  39. package/fixtures/assets/three_images.scss +20 -0
  40. package/fixtures/assets/tools.scss +23 -0
  41. package/fixtures/assets/two_images.scss +24 -0
  42. package/fixtures/assets/video.scss +45 -0
  43. package/fixtures/assets/video_text.scss +63 -0
  44. package/fixtures/config/settings_data.json +107 -0
  45. package/fixtures/config/settings_schema.json +690 -0
  46. package/fixtures/layout/theme.liquid +76 -0
  47. package/fixtures/locales/ar-SA.json +212 -0
  48. package/fixtures/locales/de-DE.json +290 -0
  49. package/fixtures/locales/en-US.json +290 -0
  50. package/fixtures/locales/es-ES.json +290 -0
  51. package/fixtures/locales/fr-FR.json +290 -0
  52. package/fixtures/locales/id-ID.json +212 -0
  53. package/fixtures/locales/it-IT.json +212 -0
  54. package/fixtures/locales/ja-JP.json +289 -0
  55. package/fixtures/locales/ko-KR.json +290 -0
  56. package/fixtures/locales/nl-NL.json +290 -0
  57. package/fixtures/locales/pl-PL.json +290 -0
  58. package/fixtures/locales/pt-PT.json +212 -0
  59. package/fixtures/locales/ru-RU.json +212 -0
  60. package/fixtures/locales/th-TH.json +212 -0
  61. package/fixtures/locales/zh-CN.json +290 -0
  62. package/fixtures/locales/zh-TW.json +290 -0
  63. package/fixtures/sections/apps.liquid +47 -0
  64. package/fixtures/sections/blog.liquid +137 -0
  65. package/fixtures/sections/collection_desc.liquid +34 -0
  66. package/fixtures/sections/collection_detail.liquid +436 -0
  67. package/fixtures/sections/collection_image.liquid +104 -0
  68. package/fixtures/sections/collection_list.liquid +161 -0
  69. package/fixtures/sections/collection_name.liquid +34 -0
  70. package/fixtures/sections/collection_slider.liquid +330 -0
  71. package/fixtures/sections/feature_columns.liquid +275 -0
  72. package/fixtures/sections/feature_product.liquid +227 -0
  73. package/fixtures/sections/footer.liquid +488 -0
  74. package/fixtures/sections/four_images.liquid +160 -0
  75. package/fixtures/sections/gallery.liquid +258 -0
  76. package/fixtures/sections/header.liquid +1157 -0
  77. package/fixtures/sections/html.liquid +40 -0
  78. package/fixtures/sections/image_text.liquid +350 -0
  79. package/fixtures/sections/instagram_plus.liquid +393 -0
  80. package/fixtures/sections/logo_bar.liquid +183 -0
  81. package/fixtures/sections/newsletter.liquid +225 -0
  82. package/fixtures/sections/not_found.liquid +39 -0
  83. package/fixtures/sections/overlay_image.liquid +648 -0
  84. package/fixtures/sections/page_detail.liquid +39 -0
  85. package/fixtures/sections/photo_collection.liquid +433 -0
  86. package/fixtures/sections/product_description.liquid +208 -0
  87. package/fixtures/sections/product_detail.liquid +611 -0
  88. package/fixtures/sections/products.liquid +216 -0
  89. package/fixtures/sections/relative_product.liquid +121 -0
  90. package/fixtures/sections/reviews.liquid +115 -0
  91. package/fixtures/sections/rich_text.liquid +157 -0
  92. package/fixtures/sections/search.liquid +163 -0
  93. package/fixtures/sections/slide.liquid +719 -0
  94. package/fixtures/sections/three_images.liquid +157 -0
  95. package/fixtures/sections/two_images.liquid +125 -0
  96. package/fixtures/sections/video.liquid +95 -0
  97. package/fixtures/sections/video_text.liquid +128 -0
  98. package/fixtures/snippets/bgset.liquid +21 -0
  99. package/fixtures/snippets/card_title.liquid +8 -0
  100. package/fixtures/snippets/cart_modal.liquid +74 -0
  101. package/fixtures/snippets/collection.liquid +77 -0
  102. package/fixtures/snippets/collection_filter_modal.liquid +56 -0
  103. package/fixtures/snippets/default_image_4.liquid +14 -0
  104. package/fixtures/snippets/default_image_6.liquid +18 -0
  105. package/fixtures/snippets/default_image_8.liquid +23 -0
  106. package/fixtures/snippets/four_images_item.liquid +8 -0
  107. package/fixtures/snippets/header_ads.liquid +95 -0
  108. package/fixtures/snippets/hero_image.liquid +94 -0
  109. package/fixtures/snippets/icon_video_play_large.liquid +1 -0
  110. package/fixtures/snippets/icon_video_play_medium.liquid +4 -0
  111. package/fixtures/snippets/icon_video_play_small.liquid +4 -0
  112. package/fixtures/snippets/lazyimg.liquid +22 -0
  113. package/fixtures/snippets/lazyimg_art.liquid +36 -0
  114. package/fixtures/snippets/lazysizes.liquid +41 -0
  115. package/fixtures/snippets/link.liquid +2 -0
  116. package/fixtures/snippets/pagination.liquid +48 -0
  117. package/fixtures/snippets/product.liquid +126 -0
  118. package/fixtures/snippets/product_art_tpl.liquid +152 -0
  119. package/fixtures/snippets/product_info_body.liquid +337 -0
  120. package/fixtures/snippets/product_info_tpl.liquid +423 -0
  121. package/fixtures/snippets/product_label.liquid +46 -0
  122. package/fixtures/snippets/settings.liquid +295 -0
  123. package/fixtures/snippets/social-meta-tags.liquid +106 -0
  124. package/fixtures/snippets/video_html.liquid +11 -0
  125. package/fixtures/snippets/video_source.liquid +98 -0
  126. package/fixtures/snippets/video_thumb_icon.liquid +2 -0
  127. package/fixtures/templates/404.liquid +1 -0
  128. package/fixtures/templates/collection.liquid +92 -0
  129. package/fixtures/templates/index.liquid +206 -0
  130. package/fixtures/templates/page.liquid +1 -0
  131. package/fixtures/templates/product.liquid +99 -0
  132. package/fixtures/templates/search.liquid +1 -0
  133. package/jest.config.js +192 -0
  134. package/lib/__tests__/log.test.js +15 -0
  135. package/lib/__tests__/utils.test.js +69 -0
  136. package/lib/auth/__mocks__/getCode.js +7 -0
  137. package/lib/auth/__mocks__/index.js +0 -0
  138. package/lib/auth/child.js +23 -0
  139. package/lib/auth/getCode.js +35 -0
  140. package/lib/auth/index.js +91 -0
  141. package/lib/commands/__tests__/login.test.js +77 -0
  142. package/lib/commands/__tests__/logout.test.js +29 -0
  143. package/lib/commands/__tests__/store.test.js +44 -0
  144. package/lib/commands/__tests__/switch.test.js +45 -0
  145. package/lib/commands/login.js +99 -0
  146. package/lib/commands/logout.js +14 -0
  147. package/lib/commands/store.js +14 -0
  148. package/lib/commands/switch.js +52 -0
  149. package/lib/commands/theme/__tests__/delete.test.js +49 -0
  150. package/lib/commands/theme/__tests__/init.test.js +21 -0
  151. package/lib/commands/theme/__tests__/list.test.js +80 -0
  152. package/lib/commands/theme/__tests__/package.test.js +17 -0
  153. package/lib/commands/theme/__tests__/publish.test.js +61 -0
  154. package/lib/commands/theme/__tests__/pull.test.js +69 -0
  155. package/lib/commands/theme/__tests__/push.test.js +63 -0
  156. package/lib/commands/theme/__tests__/serve.test.js +107 -0
  157. package/lib/commands/theme/delete.js +64 -0
  158. package/lib/commands/theme/init.js +51 -0
  159. package/lib/commands/theme/list.js +28 -0
  160. package/lib/commands/theme/package.js +37 -0
  161. package/lib/commands/theme/publish.js +56 -0
  162. package/lib/commands/theme/pull.js +62 -0
  163. package/lib/commands/theme/push.js +106 -0
  164. package/lib/commands/theme/serve.js +153 -0
  165. package/lib/commands/theme/share.js +20 -0
  166. package/lib/commands/version.js +6 -0
  167. package/lib/config.js +5 -0
  168. package/lib/db/__mocks__/index.js +9 -0
  169. package/lib/db/__tests__/analytics.test.js +19 -0
  170. package/lib/db/__tests__/user.test.js +20 -0
  171. package/lib/db/analytics.js +48 -0
  172. package/lib/db/index.js +9 -0
  173. package/lib/db/user.js +68 -0
  174. package/lib/log.js +13 -0
  175. package/lib/openAPI/__mocks__/index.js +20 -0
  176. package/lib/openAPI/api.js +76 -0
  177. package/lib/openAPI/index.js +46 -0
  178. package/lib/report.js +37 -0
  179. package/lib/tracing.js +50 -0
  180. package/lib/utils.js +48 -0
  181. package/package.json +54 -0
@@ -0,0 +1,423 @@
1
+ {% include 'lazyimg_art' %}
2
+ <script id="product-info-qty-tpl" type="text/html">
3
+ <div class="qty-title product-info__qty_title">{{ 'i18n.product.product_detail.qty' | t }}
4
+ <% if ( {{ settings.is_stock_show | default: true }} ) { %>
5
+ <span class="product-info__qty_stock">
6
+ <% if (product.inventory_quantity > 0 && product.inventory_tracking) { %>
7
+ (<%= $imports.getI18n("{{ 'i18n.product.product_detail.in_stock' | t }}", {
8
+ '{% raw %}{{ count }}{% endraw %}': product.inventory_quantity
9
+ }) %>)
10
+ <% } %>
11
+ </span>
12
+ <% } %>
13
+
14
+ </div>
15
+ <div class="product-info__qty {% if settings.variant_type == 'dropdown' %}product-info__qty-dropdown{% endif %}">
16
+ <button type="button" class="btn product-info__qty_btn product-info__qty_decr"
17
+ data-click="decrease"
18
+ <% if (qty === 1
19
+ || (product.available === false)
20
+ || (!product.published && product.published !== undefined)) { %> disabled <% } %>
21
+ >
22
+ -
23
+ </button>
24
+ <input id="product_quantity_<%= product.id %>" class="form-control product-info__qty_num"
25
+ <% if ((product.available === false)
26
+ || (!product.published && product.published !== undefined)) { %> disabled <% } %>
27
+ type="text" value="<%= qty %>" name="quantity" >
28
+ <button type="button" class="btn product-info__qty_btn product-info__qty_incr"
29
+ data-click="increase" <% if ((product
30
+ && qty === product.available_quantity)
31
+ || (product.available === false)
32
+ || (!product.published && product.published !== undefined) ) { %> disabled <% } %>
33
+ >
34
+ +
35
+ </button>
36
+ </div>
37
+ </script>
38
+ <script id="product-info-price-wrapper" type="text/html">
39
+ <div class="product-info__header_price-wrapper-left">
40
+ <span class="product-info__header_price dj_skin_product_detail_price money">
41
+ <% if (product.price_min !== undefined) { %>
42
+ <%= $imports.finance_money_with_symbol(product.price_min) %>
43
+ <% if (product.price_max > product.price_min) { %>
44
+ - <%= $imports.finance_money_with_symbol(product.price_max) %>
45
+ <% } %>
46
+ <% } else { %>
47
+ <%= $imports.finance_money_with_symbol(product.price) %>
48
+ <% } %>
49
+ </span>
50
+ <% if (product.compare_at_price - product.price > 0) { %>
51
+ <span class="product-info__header_compare-at-price dj_skin_product_compare_at_price money ">
52
+ <%= $imports.finance_money_with_symbol(product.compare_at_price) %>
53
+ </span>
54
+ <% } %>
55
+ </div>
56
+ <span class="product-info__header_sales ">
57
+ <%= $imports.getI18n("{{ 'i18n.product.product_detail.sold' | t }}", {
58
+ '{% raw %}{{ count }}{% endraw %}': product.sales
59
+ }) %>
60
+ </span>
61
+ </script>
62
+ <script id="product-select-wrapper" type="text/html">
63
+ <div class="modal fade" id="product-select-modal" tabindex="-1" role="dialog" aria-labelledby="" aria-hidden="true" >
64
+ <div class="modal-dialog modal-lg modal-dialog-centered" role="document">
65
+ <div class="modal-content product__select_modal">
66
+ <div class="sep-font sep-font-close close modal__close" data-dismiss="modal" aria-label="Close">
67
+ </div>
68
+ <div class="modal-body product-select-modal">
69
+ <div class='container-gap product-detail'
70
+ id="product_detail_<%= product.id %>"
71
+ data-track="product"
72
+ data-track-id="<%= product.id %>"
73
+ data-track-price="<%= product.price %>"
74
+ data-track-name="<%= product.title %>"
75
+ data-track-type="<%= product.type %>" data-life-style="true">
76
+
77
+ <div class="row">
78
+ {% assign commonImg = 'oss/operation/1e6f85988d86fcd8bf0debdec2d41eda.png' | img_url %}
79
+ <div class="product-image col-12 col-md-6">
80
+ <div class="position-relative">
81
+ <div class="support-slick">
82
+ <% if (product.images.length > 0) { %>
83
+ <% for (var i = 0; i < product.images.length; i++) { %>
84
+ <% var item = product.images[i]; %>
85
+ <div class="swiper-slide">
86
+ <% var media = $imports.media_parse(item.src); %>
87
+ <% var classList = 'w-100' %>
88
+ <% if (initialSlide != i) { %>
89
+ <% classList = classList + ' d-none' %>
90
+ <% } %>
91
+ <% if (media.mp4 || media.hls) { %>
92
+ <% include ('video_html_tpl', {
93
+ media: media,
94
+ padding_bottom: $imports.image_padding_bottom(item.width, item.height,'unlimit'),
95
+ class_name: classList
96
+ }) %>
97
+ <% } else { %>
98
+ <div style="padding-bottom:<%= $imports.image_padding_bottom(item.width, item.height,'unlimit') %>;" class="position-relative w-100 zoom <% if (initialSlide != i) { %> d-none <% } %>">
99
+ <img
100
+ data-lazy="<%= $imports.reset_image(item.src, '1080x') %>"
101
+ src="{{shop.default_img}}"
102
+ class="product-image__swiper_img imglazy loading_bg"
103
+ data-zoom-src="<%= $imports.reset_image(item.src, '1080x') %>"
104
+ data-zoom-width="<% if (item.width < 1080) { %><%= item.width %><% } else { %>1080<% } %>"
105
+ data-zoom-height="<% if (item.width < 1080) { %><%= item.height %><% } else { %><%= (1080/item.aspect_ratio).toFixed() %><% } %>"
106
+ alt="<%= item.alt || product.title %>" >
107
+ </div>
108
+ <% } %>
109
+ </div>
110
+ <% } %>
111
+ <% } else { %>
112
+ <div class="swiper-slide">
113
+ <div style="padding-bottom:100%">
114
+ {% include 'lazyimg', src: commonImg %}
115
+ </div>
116
+ </div>
117
+ <% } %>
118
+ </div>
119
+ <% if (product.images.length > 1) { %>
120
+ <a href="javascript:;" class="sep-loaded-slider__button sep-loaded-slider__button-prev d-none d-md-block"><i class="sep-font sep-font-angle-left"></i></a>
121
+ <a href="javascript:;" class="sep-loaded-slider__button sep-loaded-slider__button-next d-none d-md-block"><i class="sep-font sep-font-angle-right"></i></a>
122
+ <% } %>
123
+ </div>
124
+ <div class="product-image__swiper_bullets"><%= initialSlide + 1 %> / <%= product.images.length %></div>
125
+ {% comment %} 缩略图 {% endcomment %}
126
+ <% if (product.images.length > 1) { %>
127
+ <div class="product-image__thumbs">
128
+ <div class="product-image__thumbs-content">
129
+ <% var thumbWidth = 80; %>
130
+ <% var marginLeft = 0; %>
131
+ <% var size = product.images.length; %>
132
+ <% var maxIdx = product.images.length - 6; %>
133
+ <% if (initialSlide < 6) { %>
134
+ <% marginLeft = 0; %>
135
+ <% } else if (initialSlide >= maxIdx && size > 6 ) { %>
136
+ <% marginLeft = maxIdx * thumbWidth; %>
137
+ <% } else { %>
138
+ <% marginLeft = initialSlide * thumbWidth; %>
139
+ <% } %>
140
+
141
+ <% for (var i = 0; i < product.images.length; i++) { %>
142
+ <% var item = product.images[i]; %>
143
+ <% var inView = 0; %>
144
+ <% var offsetLeft = i * thumbWidth - marginLeft; %>
145
+ <% if (offsetLeft >= 0 && offsetLeft < 480) { %>
146
+ <% inView = 1; %>
147
+ <% } %>
148
+ <div class="product-image__thumbs-item position-relative <% if (initialSlide == i) { %>slick-slide slick-current<% } %>" style="margin-left:<% if (i == 0) { %>-<%= marginLeft %><% } %>px" data-thumb-idx="<%= i %>" >
149
+ <img class="<% if (inView == 0) { %>lazy-<% } %>lazyload" src="{{shop.default_img}}" data-src="<%= $imports.reset_image(item.src, '100x') %>" alt="<%= item.alt || product.title %>">
150
+ <% var media = $imports.media_parse(item.src); %>
151
+ <% if (media.mp4 || media.hls) { %>
152
+ {% include 'video_thumb_icon' %}
153
+ <% } %>
154
+ </div>
155
+ <% } %>
156
+ </div>
157
+ <div class="swiper-button-prev product-image__thumbs_button-prev-ajax product-image__thumbs_btn sep-font sep-font-angle-left"></div>
158
+ <div class="swiper-button-next product-image__thumbs_button-next-ajax product-image__thumbs_btn sep-font sep-font-angle-right"></div>
159
+ </div>
160
+ <% } %>
161
+
162
+ {% comment %} 商品标签 {% endcomment %}
163
+ <% var selected = selectedVariant || product; %>
164
+ <% var priceMinus = selected.compare_at_price - selected.price; %>
165
+ <% var save_label = false; %>
166
+ <% var discount_label = false; %>
167
+
168
+ <% if (product.available && {{settings.product_save_amount | default: false}}) { %>
169
+ <% save_label = true; %>
170
+ <% } %>
171
+ <% if (product.available && {{settings.is_discount_show | default: false}}) { %>
172
+ <% discount_label = true; %>
173
+ <% } %>
174
+
175
+ <% if (save_label == true || discount_label == true) { %>
176
+ <div class="product-info__label product-info__label-{{settings.label_style | default: 'triangle'}}"
177
+ style="<% if (selected.off_ratio <= 0 && selected.compare_at_price <= selected.price) { %> opacity: 0 <% } %>">
178
+ {% comment %} 折扣 {% endcomment %}
179
+ <% if (discount_label) { %>
180
+ <div class="product-info__discount-label product-info__header_tag">
181
+ <%- "{{ 'i18n.product.product_detail.off' | t }}".replace(/\{\{\s*count\s*\}\}/, (selected.off_ratio)) %>
182
+ </div>
183
+ <% } %>
184
+ {% comment %} 优惠金额 {% endcomment %}
185
+ <% if (save_label == true) { %>
186
+ <div class="product-info__save-label">
187
+ <% var saved_amount = $imports.finance_money_with_symbol((selected.compare_at_price - selected.price).toFixed(2)); %>
188
+ <%- "{{ 'i18n.product.product_detail.save_html' | t }}".replace(/\{\{\s*saved_amount\s*\}\}/, saved_amount) %>
189
+ </div>
190
+ <% } %>
191
+ </div>
192
+ <% } %>
193
+
194
+ </div>
195
+
196
+ <form class="product-info product-info-<%= product.id %> col-12 col-md-6 properties">
197
+ <div class="product-info__header">
198
+ <div class="product-info__vendor dj_skin_product_list_title"><%= product.vendor %></div>
199
+ <h1 class="product-info__header_title dj_skin_product_title"><%= product.title %></h1>
200
+ <% if (product.brief) { %>
201
+ <p class="product-info__header_brief"><%= product.brief %></p>
202
+ <% } %>
203
+ {% if settings.is_sku_show %}
204
+ <p class="product-info__header-sku"><% if (selectedVariant) { %> <%= selectedVariant.sku %> <% } %></p>
205
+ {% endif %}
206
+ <div class="product-info__header_price-wrapper">
207
+ <div class="product-info__header_price-wrapper-left">
208
+ <% var current = selectedVariant || product; %>
209
+
210
+ <span class="product-info__header_price dj_skin_product_detail_price money">
211
+ <% if (selectedVariant) { %>
212
+ <%= $imports.finance_money_with_symbol((selectedVariant.price)) %>
213
+ <% } else { %>
214
+ <% if (priceMax > priceMin) { %>
215
+ <%= $imports.finance_money_with_symbol((priceMin)) %> - <%= $imports.finance_money_with_symbol((priceMax)) %>
216
+ <% } else { %>
217
+ <%= $imports.finance_money_with_symbol((priceMin)) %>
218
+ <% } %>
219
+ <% } %>
220
+ </span>
221
+
222
+ <% var price_minus = current.compare_at_price - current.price; %>
223
+ <% if (price_minus > 0) { %>
224
+ <span class="product-info__header_compare-at-price dj_skin_product_compare_at_price money">
225
+ <%= $imports.finance_money_with_symbol((current.compare_at_price)) %>
226
+ </span>
227
+ <% } %>
228
+ </div>
229
+ <span class="product-info__header_sales ">
230
+ <%- "{{ 'i18n.product.product_detail.sold' | t }}".replace(/\{\{\s*count\s*\}\}/, (product.sales)) %>
231
+ </span>
232
+ </div>
233
+ </div>
234
+
235
+ <input type="hidden" name="product_id" value="<%= product.id %>" />
236
+ <input type="hidden" name="variant_id" id="selected_variant_id_<%= product.id %>" value="<% if (selectedVariantId && selectedVariant.available_quantity > 0 ) { %><%= selectedVariantId %><% } %>" />
237
+
238
+ <div class="product-info__body">
239
+ <% var variant_type = "{{settings.variant_type | default: 'button'}}"; %>
240
+ <div class="product-info__variants ">
241
+ <% for (var i = 0; i < product.options.length; i++) { %>
242
+ <% var opt = product.options[i]; %>
243
+ <% var optIdx = 'option' + (i + 1); %>
244
+ <% var optname = opt.name.toLowerCase(); %>
245
+ <% var selectedOptValue = ""; %>
246
+ <% if (selectedVariant) { %>
247
+ <% selectedOptValue = selectedVariant[optIdx]; %>
248
+ <% } %>
249
+ <% var is_color = false; %>
250
+ {% if settings.product_color_swatches %}
251
+ <% if (optname.includes('color') || optname.includes('colour') ) { %>
252
+ <% is_color = true; %>
253
+ <% } %>
254
+ {% endif %}
255
+
256
+ <% var variantDisabledArray = []; %>
257
+ <% for (var j = 0; j < opt.values.length; j++) { %>
258
+ <% var value = opt.values[j]; %>
259
+ <% if (selectedVariant) { %>
260
+ <% var variantDisabled = 1; %>
261
+ <% var option1Value = selectedVariant.option1 || ''; %>
262
+ <% if (optIdx.includes('option1')) { %>
263
+ <% var option1Value = value || ''; %>
264
+ <% } %>
265
+ <% var option2Value = selectedVariant.option2 || ''; %>
266
+ <% if (optIdx.includes('option2')) { %>
267
+ <% var option2Value = value || ''; %>
268
+ <% } %>
269
+ <% var option3Value = selectedVariant.option3 || ''; %>
270
+ <% if (optIdx.includes('option3')) { %>
271
+ <% var option3Value = value || ''; %>
272
+ <% } %>
273
+
274
+ <% for (var m = 0; m < product.variants.length; m++) { %>
275
+ <% var variant = product.variants[m]; %>
276
+ <% var v1 = variant.option1 || ''; %>
277
+ <% var v2 = variant.option2 || ''; %>
278
+ <% var v3 = variant.option3 || ''; %>
279
+ <% if ( variant.available && option1Value == v1 && option2Value == v2 && option3Value == v3) { %>
280
+ <% variantDisabled = 0; %>
281
+ <% } %>
282
+ <% } %>
283
+ <% } else { %>
284
+ {% comment %}没有选中子商品需要检查该属性值是否有对应的子商品,没有需要禁用{% endcomment %}
285
+ <% var variantExists = 0; %>
286
+ <% if (optIdx.includes('option1') && variantExists == 0) { %>
287
+ <% for (var n = 0; n < product.variants.length; n++) { %>
288
+ <% var variant = product.variants[n]; %>
289
+ <% if (value == variant.option1 && variant.available_quantity > 0) { %>
290
+ <% variantExists = 1; %>
291
+ <% } %>
292
+ <% } %>
293
+ <% } %>
294
+ <% if (optIdx.includes('option2') && variantExists == 0) { %>
295
+ <% for (var n = 0; n < product.variants.length; n++) { %>
296
+ <% var variant = product.variants[n]; %>
297
+ <% if (value == variant.option2 && variant.available_quantity > 0) { %>
298
+ <% variantExists = 1; %>
299
+ <% } %>
300
+ <% } %>
301
+ <% } %>
302
+ <% if (optIdx.includes('option3') && variantExists == 0) { %>
303
+ <% for (var n = 0; n < product.variants.length; n++) { %>
304
+ <% var variant = product.variants[n]; %>
305
+ <% if (value == variant.option3 && variant.available_quantity > 0) { %>
306
+ <% variantExists = 1; %>
307
+ <% } %>
308
+ <% } %>
309
+ <% } %>
310
+
311
+ <% if (variantExists == 0) { %>
312
+ <% variantDisabled = 1; %>
313
+ <% } %>
314
+ <% } %>
315
+ <% if (!(product.available || product.published)) { %>
316
+ <% variantDisabled = 1; %>
317
+ <% } %>
318
+
319
+ <% variantDisabledArray.push(variantDisabled); %>
320
+ <% } %>
321
+
322
+ <% if (is_color || variant_type == 'button') { %>
323
+ <div class="product-info__variants_items">
324
+ <div class="product-info__variants_title">
325
+ <%= opt.name %>
326
+ <% if (is_color) { %>
327
+ <span id="variant_color-label"><% if (selectedOptValue) { %> - <%= selectedOptValue %><% } %></span>
328
+ <% } %>
329
+ </div>
330
+ <div class="product-info__variants_value-wrapper">
331
+ <% for (var j = 0; j < opt.values.length; j++) { %>
332
+ <% var value = opt.values[j]; %>
333
+ <% var isDisabled = +variantDisabledArray[j]; %>
334
+ <span class="btn product-info__variants_value <% if (is_color) { %>product-info__variants_value_color<% } %>">
335
+ <input type="radio" class="d-none product-info__variants_radio" name="<%= optIdx + '-' + product.id %>" id="<%= optIdx + '-' + j + '-' + product.id %>" <% if (isDisabled == 1) { %> disabled <% } else if (value == selectedOptValue) { %> checked <% } %> value="<%= value %>" />
336
+ <% if (is_color) { %>
337
+ <label data-iscolor style="background-color: <%= value %>;" for="<%= optIdx + '-' + j + '-' + product.id %>" data-variants-value="<%= value %>" class="mb-0" data-options-order="<%= i %>" data-click="select"></label>
338
+ <% } else { %>
339
+ <label for="<%= optIdx + '-' + j + '-' + product.id %>" data-variants-value="<%= value %>" class="mb-0" data-options-order="<%= i %>" data-click="select">
340
+ <%= value %>
341
+ </label>
342
+ <% } %>
343
+ </span>
344
+ <% } %>
345
+ </div>
346
+ </div>
347
+ <% } else { %>
348
+ <div class="product-info__variants_items d-inline-block w-100">
349
+ <div class="dj_skin_title_font product-info__variants_title"><%= opt.name %></div>
350
+ <% var is_select_default_variants = {{settings.is_select_default_variants | default: false}}; %>
351
+ <% var showDefault = false; %>
352
+ <% if (!(selectedVariantId || is_select_default_variants)) { %>
353
+ <% showDefault = true; %>
354
+ <% } %>
355
+ <select <% if (showDefault) { %>class="tw-text-black tw-opacity-50"<% } %>>
356
+ <% if (showDefault) { %>
357
+ <option disabled selected>{{'i18n.product.product_detail.please_select' | t}}</option>
358
+ <% } %>
359
+ <% for (var j = 0; j < opt.values.length; j++) { %>
360
+ <% var value = opt.values[j]; %>
361
+ <% var isDisabled = +variantDisabledArray[j]; %>
362
+ <option data-soldout="{{ 'i18n.product.product_detail.sold_out' | t }}" <% if (isDisabled == 1) { %>disabled<% } %> name="<%= optIdx + '-' + product.id %>" id="<%= optIdx + '-' + j + '-' + product.id %>" class="text-center d-inline-block product-info__variants_value" value="<%= value %>" <% if (value == selectedOptValue) { %>selected<% } %>>
363
+ <%= value %>
364
+ <% if (isDisabled == 1) { %>({{ 'i18n.product.product_detail.sold_out' | t }})<% } %>
365
+ </option>
366
+ <% } %>
367
+ </select>
368
+ </div>
369
+ <% } %>
370
+ <% } %>
371
+ </div>
372
+ <div class="product-info__qty_container">
373
+ <div class="qty-title product-info__qty_title">
374
+ {{ 'i18n.product.product_detail.qty' | t }}
375
+ <% if (selectedVariant) { %>
376
+ <span class="product-info__qty_stock">
377
+ <% if (selectedVariant.inventory_quantity > 0 && product.inventory_tracking) { %>
378
+ <%- "{{ 'i18n.product.product_detail.in_stock' | t }}".replace(/\{\{\s*count\s*\}\}/, (selectedVariant.inventory_quantity)) %>
379
+ <% } %>
380
+ </span>
381
+ <% } %>
382
+ </div>
383
+ <div class="product-info__qty <% if (variant_type == 'dropdown') { %> product-info__qty-dropdown <% } %>">
384
+ <button type="button" class="btn product-info__qty_btn product-info__qty_decr" data-click="decrease" disabled="">-</button>
385
+ <input class="form-control product-info__qty_num" id="product_quantity_<%= product.id %>" name="quantity" type="text" value="1">
386
+ <button type="button" class="btn product-info__qty_btn product-info__qty_incr" data-click="increase">+</button>
387
+ </div>
388
+ </div>
389
+ </div>
390
+
391
+ {% assign btns = 0 %}
392
+ {% if settings.is_add_to_cart_show %}
393
+ {% assign btns = btns | plus: 1 %}
394
+ {% endif %}
395
+ {% if settings.is_payment_btn_show %}
396
+ {% assign btns = btns | plus: 1 %}
397
+ {% endif %}
398
+ <div class="product-info__btn product-info__btn_{{btns}}">
399
+ <% if (product.published && product.available) { %>
400
+ {% if settings.is_add_to_cart_show %}
401
+ <button type="button" {% unless settings.is_payment_btn_show %} class="btn btn-primary" {% else %} class="btn btn-secondary" {% endunless %} data-click="addToCart" data-track="click" data-track-content="{% if settings.add_to_cart_process == "to_checkout" %}checkout{% else %}add_to_cart{% endif %}" data-track-source="quick_shop">
402
+ {{ 'i18n.product.product_detail.add_to_cart' | t }}
403
+ </button>
404
+ {% endif %}
405
+ <button type="button" class="btn btn-primary {% unless settings.is_payment_btn_show %}d-none{% endunless %} " data-click="submit" data-track="click" data-track-content="checkout" data-track-source="quick_shop">{{ 'i18n.product.product_detail.buy_now' | t }}</button>
406
+ <% } else { %>
407
+ <button type="button" class="btn btn-primary" style="width: 100%;" disabled>{{ 'i18n.product.product_detail.sold_out' | t }}</button>
408
+ <% } %>
409
+ </div>
410
+ <div class="product-info__url">
411
+ <a href="<%= product.url %>">{{ 'i18n.product.product_detail.view_product_detail' | t }}</a>
412
+ </div>
413
+ </form>
414
+ </div>
415
+ </div>
416
+ </div>
417
+ </div>
418
+ </div>
419
+ </div>
420
+ </script>
421
+
422
+
423
+
@@ -0,0 +1,46 @@
1
+ {% comment %}
2
+ 商品标签
3
+ product: 大商品;
4
+ is_opacity: true则保留product-info__label的dom;
5
+ product_selected: 需要切换子款式的时候填子款式;
6
+ {% endcomment %}
7
+
8
+ {% assign opacity = is_opacity | default : false %}
9
+ {% assign selected = product_selected | default: product %}
10
+
11
+ {% assign save_label = false %}
12
+ {% assign discount_label = false %}
13
+
14
+ {% if opacity == true %}
15
+ {% if product.available and settings.product_save_amount %}
16
+ {% assign save_label = true %}
17
+ {% endif %}
18
+ {% if product.available and settings.is_discount_show %}
19
+ {% assign discount_label = true %}
20
+ {% endif %}
21
+ {% else %}
22
+ {% if product.available and product.compare_at_price > product.price and settings.product_save_amount %}
23
+ {% assign save_label = true %}
24
+ {% endif %}
25
+ {% if product.available and product.off_ratio > 0 and settings.is_discount_show %}
26
+ {% assign discount_label = true %}
27
+ {% endif %}
28
+ {% endif %}
29
+ {% if save_label == true or discount_label == true %}
30
+ <div class="product-info__label product-info__label-{{settings.label_style | default: 'triangle'}}"
31
+ style="{% if opacity == true and selected.off_ratio <= 0 and selected.compare_at_price <= selected.price %}opacity: 0{% endif %}">
32
+ {% comment %} 折扣 {% endcomment %}
33
+ {% if discount_label == true %}
34
+ <div class="product-info__discount-label product-info__header_tag">
35
+ {{ 'i18n.product.product_detail.off' | t: count: selected.off_ratio }}
36
+ </div>
37
+ {% endif %}
38
+ {% comment %} 优惠金额 {% endcomment %}
39
+ {% if save_label == true %}
40
+ <div class="product-info__save-label">
41
+ {% capture saved_amount %}{{ selected.compare_at_price | minus: selected.price | money_with_symbol }}{% endcapture %}
42
+ {{ 'i18n.product.product_detail.save_html' | t: saved_amount: saved_amount }}
43
+ </div>
44
+ {% endif %}
45
+ </div>
46
+ {% endif %}