workarea 3.4.12

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 (571) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +326 -0
  3. data/CHANGELOG.md +20501 -0
  4. data/README.md +163 -0
  5. data/docker-compose.yml +27 -0
  6. data/docs/Gemfile +8 -0
  7. data/docs/bin/middleman +29 -0
  8. data/docs/config.rb +87 -0
  9. data/docs/config.ru +7 -0
  10. data/docs/data/articles.yml +157 -0
  11. data/docs/package.json +15 -0
  12. data/docs/source/404.html.erb +13 -0
  13. data/docs/source/articles/access-routes-in-javascript.html.md +33 -0
  14. data/docs/source/articles/add-a-content-area.html.md +169 -0
  15. data/docs/source/articles/add-a-content-block-type.html.md +334 -0
  16. data/docs/source/articles/add-a-report.html.md +202 -0
  17. data/docs/source/articles/add-css-through-the-admin-ui.html.md +30 -0
  18. data/docs/source/articles/add-javascript-through-a-manifest.html.md +367 -0
  19. data/docs/source/articles/add-javascript-through-a-view.html.md +80 -0
  20. data/docs/source/articles/add-javascript-through-the-admin-ui.html.md +30 -0
  21. data/docs/source/articles/add-metrics.html.md +58 -0
  22. data/docs/source/articles/add-or-replace-a-pricing-calculator.html.md +150 -0
  23. data/docs/source/articles/add-remove-or-change-a-mongoid-validation.html.md +147 -0
  24. data/docs/source/articles/add-remove-or-change-a-product-template.html.md +142 -0
  25. data/docs/source/articles/add-remove-sort-and-group-storefront-search-filters.html.md +483 -0
  26. data/docs/source/articles/add-stylesheets-through-a-manifest.html.md +276 -0
  27. data/docs/source/articles/add-system-content.html.md +138 -0
  28. data/docs/source/articles/analytics-overview.html.md +51 -0
  29. data/docs/source/articles/analyze-storefront-search-results.html.md +261 -0
  30. data/docs/source/articles/api-overview.html.md +35 -0
  31. data/docs/source/articles/appending.html.md +506 -0
  32. data/docs/source/articles/application-document.html.md +88 -0
  33. data/docs/source/articles/automated-javascript-testing.html.md +162 -0
  34. data/docs/source/articles/b2b-overview.html.md +64 -0
  35. data/docs/source/articles/browser-and-device-support.html.md +47 -0
  36. data/docs/source/articles/change-product-placeholder-image.html.md +39 -0
  37. data/docs/source/articles/change-storefront-search-results.html.md +283 -0
  38. data/docs/source/articles/change-the-storefront-product-pricing-ui.html.md +348 -0
  39. data/docs/source/articles/change-the-storefront-search-filters-ui.html.md +103 -0
  40. data/docs/source/articles/checkout.html.md +479 -0
  41. data/docs/source/articles/commerce-model.html.md +164 -0
  42. data/docs/source/articles/configuration-for-hosting.html.md +106 -0
  43. data/docs/source/articles/configuration.html.md +406 -0
  44. data/docs/source/articles/configure-a-payment-gateway.html.md +58 -0
  45. data/docs/source/articles/configure-asset-storage.html.md +29 -0
  46. data/docs/source/articles/configure-asset-types.html.md +18 -0
  47. data/docs/source/articles/configure-contact-form-subjects-list.html.md +24 -0
  48. data/docs/source/articles/configure-imageoptim.html.md +23 -0
  49. data/docs/source/articles/configure-locales.html.md +45 -0
  50. data/docs/source/articles/configure-logins-and-authentication.html.md +42 -0
  51. data/docs/source/articles/configure-low-inventory-threshold.html.md +26 -0
  52. data/docs/source/articles/configure-product-image-sizes-and-processing.html.md +28 -0
  53. data/docs/source/articles/content.html.md +554 -0
  54. data/docs/source/articles/contentable.html.md +41 -0
  55. data/docs/source/articles/contribute-code.html.md +69 -0
  56. data/docs/source/articles/contribute-documentation.html.md +60 -0
  57. data/docs/source/articles/create-a-custom-discount.html.md +234 -0
  58. data/docs/source/articles/create-a-new-app.html.md +131 -0
  59. data/docs/source/articles/create-a-plugin.html.md +19 -0
  60. data/docs/source/articles/create-a-style-guide.html.md +71 -0
  61. data/docs/source/articles/create-a-theme.html.md +134 -0
  62. data/docs/source/articles/css-architectural-overview.html.md +89 -0
  63. data/docs/source/articles/customize-a-helper.html.md +91 -0
  64. data/docs/source/articles/decoration.html.md +415 -0
  65. data/docs/source/articles/define-and-configure-inventory-policies.html.md +107 -0
  66. data/docs/source/articles/documentation-style-guide.html.md +48 -0
  67. data/docs/source/articles/documentation.html.md +54 -0
  68. data/docs/source/articles/domain-modeling.html.md +82 -0
  69. data/docs/source/articles/error-pages.html.md.erb +95 -0
  70. data/docs/source/articles/extension-overview.html.md +152 -0
  71. data/docs/source/articles/favicon-support.html.md +112 -0
  72. data/docs/source/articles/feature-spec-helper-stylesheet.html.md +25 -0
  73. data/docs/source/articles/featurejs-and-feature-spec-helper.html.md +20 -0
  74. data/docs/source/articles/help-and-support.html.md +34 -0
  75. data/docs/source/articles/html-fragment-caching.html.md +46 -0
  76. data/docs/source/articles/http-caching.html.md +43 -0
  77. data/docs/source/articles/i18n.html.md +35 -0
  78. data/docs/source/articles/images-flow.html.md +10 -0
  79. data/docs/source/articles/index-storefront-search-documents.html.md +104 -0
  80. data/docs/source/articles/infrastructure.html.md +46 -0
  81. data/docs/source/articles/installing.html.md +61 -0
  82. data/docs/source/articles/integrate-a-payment-gateway.html.md +124 -0
  83. data/docs/source/articles/integrate-a-web-analytics-provider.html.md +35 -0
  84. data/docs/source/articles/integrate-an-inventory-management-system.html.md +88 -0
  85. data/docs/source/articles/integrating-with-other-software.html.md +59 -0
  86. data/docs/source/articles/inventory.html.md +352 -0
  87. data/docs/source/articles/javascript-coding-standards.html.md +30 -0
  88. data/docs/source/articles/javascript-modules.html.md +174 -0
  89. data/docs/source/articles/javascript-overview.html.md +62 -0
  90. data/docs/source/articles/javascript-reference-documentation.html.md +51 -0
  91. data/docs/source/articles/javascript-templates.html.md +52 -0
  92. data/docs/source/articles/low-level-caching.html.md +25 -0
  93. data/docs/source/articles/maintain-a-plugin.html.md +12 -0
  94. data/docs/source/articles/maintenance-policy.html.md +79 -0
  95. data/docs/source/articles/navigable.html.md +51 -0
  96. data/docs/source/articles/navigating-the-code.html.md +149 -0
  97. data/docs/source/articles/navigation.html.md +386 -0
  98. data/docs/source/articles/order-life-cycle.html.md +546 -0
  99. data/docs/source/articles/order-pricing.html.md +389 -0
  100. data/docs/source/articles/orders-and-items.html.md +210 -0
  101. data/docs/source/articles/orders.html.md +66 -0
  102. data/docs/source/articles/overriding.html.md +155 -0
  103. data/docs/source/articles/overview.html.md +43 -0
  104. data/docs/source/articles/plugins-overview.html.md +12 -0
  105. data/docs/source/articles/prerequisites-and-dependencies.html.md +202 -0
  106. data/docs/source/articles/products.html.md.erb +1270 -0
  107. data/docs/source/articles/progressive-web-application-support.html.md +148 -0
  108. data/docs/source/articles/rails-asset-manifests.html.md +33 -0
  109. data/docs/source/articles/rails-asset-view-helpers.html.md +25 -0
  110. data/docs/source/articles/reading-data.html.md +10 -0
  111. data/docs/source/articles/releasable.html.md +37 -0
  112. data/docs/source/articles/report-a-bug.html.md +75 -0
  113. data/docs/source/articles/ruby-coding-standards.html.md +10 -0
  114. data/docs/source/articles/run-sidekiq-in-a-local-environment.html.md +40 -0
  115. data/docs/source/articles/searching.html.md +1005 -0
  116. data/docs/source/articles/security-policy.html.md +42 -0
  117. data/docs/source/articles/seeds.html.md +345 -0
  118. data/docs/source/articles/shipping.html.md +756 -0
  119. data/docs/source/articles/sort-and-exclude-product-options.html.md +47 -0
  120. data/docs/source/articles/storefront-search-features.html.md +568 -0
  121. data/docs/source/articles/storefront-searches.html.md +126 -0
  122. data/docs/source/articles/style-guides.html.md +21 -0
  123. data/docs/source/articles/stylesheet-coding-standards.html.md +24 -0
  124. data/docs/source/articles/stylesheets-overview.html.md +67 -0
  125. data/docs/source/articles/swappable-list-data-structure.html.md +81 -0
  126. data/docs/source/articles/system-emails.html.md +102 -0
  127. data/docs/source/articles/taggable.html.md +8 -0
  128. data/docs/source/articles/test-a-credit-card-transaction.html.md +16 -0
  129. data/docs/source/articles/test-if-a-plugin-is-installed.html.md +34 -0
  130. data/docs/source/articles/testing.html.md +914 -0
  131. data/docs/source/articles/themes-overview.html.md +155 -0
  132. data/docs/source/articles/translate-administrable-content.html.md +14 -0
  133. data/docs/source/articles/translate-javascript-content.html.md +16 -0
  134. data/docs/source/articles/translate-or-customize-message-content.html.md +29 -0
  135. data/docs/source/articles/translate-or-customize-static-content.html.md +30 -0
  136. data/docs/source/articles/use-an-existing-workarea-app.html.md +108 -0
  137. data/docs/source/articles/view-models.html.md +509 -0
  138. data/docs/source/articles/views.html.md +14 -0
  139. data/docs/source/articles/workers.html.md +613 -0
  140. data/docs/source/articles/writing-data.html.md +10 -0
  141. data/docs/source/cli.html.md +163 -0
  142. data/docs/source/favicon.ico +0 -0
  143. data/docs/source/images/3-variants-1-option.png +0 -0
  144. data/docs/source/images/3-variants-3-options.png +0 -0
  145. data/docs/source/images/3-years-primary-image.png +0 -0
  146. data/docs/source/images/404-storefront-error-page.png +0 -0
  147. data/docs/source/images/404-system-content-admin.png +0 -0
  148. data/docs/source/images/404.jpg +0 -0
  149. data/docs/source/images/5-years-primary-image.png +0 -0
  150. data/docs/source/images/activity-dashboard.png +0 -0
  151. data/docs/source/images/activity-for-object.png +0 -0
  152. data/docs/source/images/activity-ui.png +0 -0
  153. data/docs/source/images/adding-captioned-image-block-custom-icon.png +0 -0
  154. data/docs/source/images/adding-captioned-image-block-default-icon.png +0 -0
  155. data/docs/source/images/admin-alerts-ui.png +0 -0
  156. data/docs/source/images/admin-category-range-filters.png +0 -0
  157. data/docs/source/images/admin-for-3-column-hero.png +0 -0
  158. data/docs/source/images/admin-help-index.png +0 -0
  159. data/docs/source/images/admin-help-ui.png +0 -0
  160. data/docs/source/images/admin-javascript.png +0 -0
  161. data/docs/source/images/admin-notification-for-deactivated-discount.png +0 -0
  162. data/docs/source/images/admin-notifications-ui.png +0 -0
  163. data/docs/source/images/admin-product-show-page.png +0 -0
  164. data/docs/source/images/admin-products-index-page.png +0 -0
  165. data/docs/source/images/admin-range-filters.png +0 -0
  166. data/docs/source/images/admin-style-guides-navigation.png +0 -0
  167. data/docs/source/images/after-re-seeding.png +0 -0
  168. data/docs/source/images/after-seeding-localhost-3000.png +0 -0
  169. data/docs/source/images/after-seeding.png +0 -0
  170. data/docs/source/images/arrow.svg +1 -0
  171. data/docs/source/images/arrow_white.svg +1 -0
  172. data/docs/source/images/aws-resource-map.png +0 -0
  173. data/docs/source/images/backordered-until-output-on-inventory-sku-card.png +0 -0
  174. data/docs/source/images/before-seeding-localhost-3000.png +0 -0
  175. data/docs/source/images/before-seeding.png +0 -0
  176. data/docs/source/images/browsing-workarea-versions-on-the-web.png +0 -0
  177. data/docs/source/images/bulk-asset-upload-on-assets-index-page.png +0 -0
  178. data/docs/source/images/bulk-asset-upload-while-editing-content.png +0 -0
  179. data/docs/source/images/bundle-show-workarea-core.png +0 -0
  180. data/docs/source/images/bundle-show-workarea.png +0 -0
  181. data/docs/source/images/calendar-for-backordered-until-field.png +0 -0
  182. data/docs/source/images/captioned-image-block-in-storefront.png +0 -0
  183. data/docs/source/images/captioned-image-content-block-storefront-component-style-guide.png +0 -0
  184. data/docs/source/images/cart-system-content-in-admin.png +0 -0
  185. data/docs/source/images/cart-system-content-in-storefront.png +0 -0
  186. data/docs/source/images/checkout-addresses-guest.png +0 -0
  187. data/docs/source/images/checkout-addresses-user.png +0 -0
  188. data/docs/source/images/checkout-confirmation.png +0 -0
  189. data/docs/source/images/checkout-flow-0.png +0 -0
  190. data/docs/source/images/checkout-flow-1.png +0 -0
  191. data/docs/source/images/checkout-flow-2.png +0 -0
  192. data/docs/source/images/checkout-flow-3.png +0 -0
  193. data/docs/source/images/checkout-flow-4.png +0 -0
  194. data/docs/source/images/checkout-payment-guest.png +0 -0
  195. data/docs/source/images/checkout-payment-user.png +0 -0
  196. data/docs/source/images/checkout-shipping.png +0 -0
  197. data/docs/source/images/color-picker-component-admin-style-guide.png +0 -0
  198. data/docs/source/images/color-picker-component-on-content-editing-screen.png +0 -0
  199. data/docs/source/images/commerce-model-carts-orders.png +0 -0
  200. data/docs/source/images/commerce-model-order-pricing.png +0 -0
  201. data/docs/source/images/commerce-model.png +0 -0
  202. data/docs/source/images/configuring-an-index-pattern-in-kibana.png +0 -0
  203. data/docs/source/images/content-block-presets.png +0 -0
  204. data/docs/source/images/content-search-customization.png +0 -0
  205. data/docs/source/images/country-with-region-data-in-address-form.png +0 -0
  206. data/docs/source/images/country-without-region-data-in-address-form.png +0 -0
  207. data/docs/source/images/create-content-block-preset-ui.png +0 -0
  208. data/docs/source/images/credit-card-icons.png +0 -0
  209. data/docs/source/images/css-added-through-admin.png +0 -0
  210. data/docs/source/images/css-admin-ui.png +0 -0
  211. data/docs/source/images/current-configuration-shown-in-admin-settings.png +0 -0
  212. data/docs/source/images/customer-impersonation-in-admin.png +0 -0
  213. data/docs/source/images/customer-impersonation-in-store-front.png +0 -0
  214. data/docs/source/images/date-filter-same-day.png +0 -0
  215. data/docs/source/images/developer-toolbar-in-store-front.png +0 -0
  216. data/docs/source/images/discounts-sorted-by-most-redeemed.png +0 -0
  217. data/docs/source/images/edit-help-article.png +0 -0
  218. data/docs/source/images/editing-content-for-search-customization.png +0 -0
  219. data/docs/source/images/editing-dynamic-captioned-image-block.png +0 -0
  220. data/docs/source/images/editing-product-fields-in-the-admin.png +0 -0
  221. data/docs/source/images/editing-search-system-content.png +0 -0
  222. data/docs/source/images/editing-static-captioned-image-block-custom-icon.png +0 -0
  223. data/docs/source/images/editing-static-captioned-image-block-default-icon.png +0 -0
  224. data/docs/source/images/external.svg +1 -0
  225. data/docs/source/images/favicon_16.png +0 -0
  226. data/docs/source/images/favicon_180.png +0 -0
  227. data/docs/source/images/favicon_32.png +0 -0
  228. data/docs/source/images/filters-all.png +0 -0
  229. data/docs/source/images/filters-control.png +0 -0
  230. data/docs/source/images/filters-custom.png +0 -0
  231. data/docs/source/images/filters-groups.png +0 -0
  232. data/docs/source/images/filters-material.png +0 -0
  233. data/docs/source/images/filters-omitted.png +0 -0
  234. data/docs/source/images/filters-pinned.png +0 -0
  235. data/docs/source/images/filters-range.png +0 -0
  236. data/docs/source/images/filters-sorted.png +0 -0
  237. data/docs/source/images/filters-wrapping-to-second-line-in-admin.png +0 -0
  238. data/docs/source/images/generic-product-template-images-no-options-selected.png +0 -0
  239. data/docs/source/images/generic-product-template-images-options-selected.png +0 -0
  240. data/docs/source/images/generic-template.png +0 -0
  241. data/docs/source/images/hosting.svg +1 -0
  242. data/docs/source/images/image-group-content-block-in-storefront.png +0 -0
  243. data/docs/source/images/images.svg +1 -0
  244. data/docs/source/images/import-export-screenshot.png +0 -0
  245. data/docs/source/images/invalid-display.png +0 -0
  246. data/docs/source/images/itcss.png +0 -0
  247. data/docs/source/images/kibana-dev-tools-console.png +0 -0
  248. data/docs/source/images/layout-content-admin-with-2-areas.png +0 -0
  249. data/docs/source/images/layout-content-admin-with-3-areas.png +0 -0
  250. data/docs/source/images/link-to-search-system-content.png +0 -0
  251. data/docs/source/images/logo.svg +1 -0
  252. data/docs/source/images/menu.svg +2 -0
  253. data/docs/source/images/mongo-replica-set.svg +1 -0
  254. data/docs/source/images/multi-column-hero-blocks.png +0 -0
  255. data/docs/source/images/option-selects-product-template-images-options-selected.png +0 -0
  256. data/docs/source/images/option-selects-template.png +0 -0
  257. data/docs/source/images/option-thumbnails-template.png +0 -0
  258. data/docs/source/images/order-item-total-price-diagram.png +0 -0
  259. data/docs/source/images/order-pricing-cart-example.png +0 -0
  260. data/docs/source/images/order-pricing-example-adjustments.png +0 -0
  261. data/docs/source/images/order-pricing-example-totals.png +0 -0
  262. data/docs/source/images/order-pricing-placed-order-example.png +0 -0
  263. data/docs/source/images/order-shipping-total-diagram.png +0 -0
  264. data/docs/source/images/order-show-with-multiple-tenders.png +0 -0
  265. data/docs/source/images/order-subtotal-price-diagram.png +0 -0
  266. data/docs/source/images/order-tax-total-diagram.png +0 -0
  267. data/docs/source/images/order-total-price-diagram.png +0 -0
  268. data/docs/source/images/order-total-value-diagram.png +0 -0
  269. data/docs/source/images/orders-dashboard-links.png +0 -0
  270. data/docs/source/images/oval.svg +1 -0
  271. data/docs/source/images/payment-icon-storefront-style-guide.png +0 -0
  272. data/docs/source/images/people-dashboard-links.png +0 -0
  273. data/docs/source/images/price-adjustments-diagram.png +0 -0
  274. data/docs/source/images/price-display-no-options.png +0 -0
  275. data/docs/source/images/price-display-options-selected.png +0 -0
  276. data/docs/source/images/pricing-calculators-diagram.png +0 -0
  277. data/docs/source/images/product-list-content-block-admin.png +0 -0
  278. data/docs/source/images/product-list-content-block-in-store-front.png +0 -0
  279. data/docs/source/images/promo-products-excluded-autocomplete-results-after.png +0 -0
  280. data/docs/source/images/promo-products-excluded-featured-category-results-after.png +0 -0
  281. data/docs/source/images/promo-products-excluded-recommendations-results-after.png +0 -0
  282. data/docs/source/images/promo-products-excluded-search-category-results-after.png +0 -0
  283. data/docs/source/images/promo-products-excluded-search-results-after.png +0 -0
  284. data/docs/source/images/promo-products-included-autocomplete-results-before.png +0 -0
  285. data/docs/source/images/promo-products-included-featured-category-results-before.png +0 -0
  286. data/docs/source/images/promo-products-included-recommendations-results-before.png +0 -0
  287. data/docs/source/images/promo-products-included-search-category-results-before.png +0 -0
  288. data/docs/source/images/promo-products-included-search-results-before.png +0 -0
  289. data/docs/source/images/rails-version-constraint.png +0 -0
  290. data/docs/source/images/re-enable-discount.png +0 -0
  291. data/docs/source/images/reading-data.svg +1 -0
  292. data/docs/source/images/readme-hero.png +0 -0
  293. data/docs/source/images/redesigned-customized-sort-for-search-results.png +0 -0
  294. data/docs/source/images/reviews-summary-above-share-buttons.png +0 -0
  295. data/docs/source/images/reviews-summary-below-product-name.png +0 -0
  296. data/docs/source/images/reviews-summary-below-share-buttons.png +0 -0
  297. data/docs/source/images/reviews-summary-removed.png +0 -0
  298. data/docs/source/images/rsa-fingerprint-for-stash.png +0 -0
  299. data/docs/source/images/ruby-version-constraint.png +0 -0
  300. data/docs/source/images/script-tag-added-through-admin.png +0 -0
  301. data/docs/source/images/search-analysis-admin-alternate-rendering.png +0 -0
  302. data/docs/source/images/search-analysis-admin.png +0 -0
  303. data/docs/source/images/search-quality-report.png +0 -0
  304. data/docs/source/images/search.svg +1 -0
  305. data/docs/source/images/searching-for-cart-system-content-in-admin.png +0 -0
  306. data/docs/source/images/searching-for-layout-system-content-in-admin.png +0 -0
  307. data/docs/source/images/seeded-admin.png +0 -0
  308. data/docs/source/images/seeds-from-plugins.png +0 -0
  309. data/docs/source/images/seo-metadata-automation-ui.png +0 -0
  310. data/docs/source/images/show-password-button.png +0 -0
  311. data/docs/source/images/storefront-autocomplete.png +0 -0
  312. data/docs/source/images/storefront-category-summary-content-block.png +0 -0
  313. data/docs/source/images/storefront-category.png +0 -0
  314. data/docs/source/images/storefront-product-after-overriding.png +0 -0
  315. data/docs/source/images/storefront-product-before-overriding.png +0 -0
  316. data/docs/source/images/storefront-product-browse-page.png +0 -0
  317. data/docs/source/images/storefront-product-recommendations.png +0 -0
  318. data/docs/source/images/storefront-product-show-page.png +0 -0
  319. data/docs/source/images/storefront-requests-and-search-requests.png +0 -0
  320. data/docs/source/images/storefront-search-request-handling.png +0 -0
  321. data/docs/source/images/storefront-search-response-creation.png +0 -0
  322. data/docs/source/images/storefront-search.png +0 -0
  323. data/docs/source/images/storefront-style-guides-navigation.png +0 -0
  324. data/docs/source/images/styles.css +3 -0
  325. data/docs/source/images/tax-categories-ui.png +0 -0
  326. data/docs/source/images/tax-rates-ui.png +0 -0
  327. data/docs/source/images/unpurchasable-product.png +0 -0
  328. data/docs/source/images/url-redirects-filtering.png +0 -0
  329. data/docs/source/images/utility-nav-area-in-admin.png +0 -0
  330. data/docs/source/images/utility-nav-area-in-storefront.png +0 -0
  331. data/docs/source/images/validation-message-in-storefront.png +0 -0
  332. data/docs/source/images/view-model-interface.png +0 -0
  333. data/docs/source/images/viewing-workarea-version-in-source.png +0 -0
  334. data/docs/source/images/workarea.svg +1 -0
  335. data/docs/source/images/worst-performing-searches-on-results-customization-page.png +0 -0
  336. data/docs/source/images/writing-data.svg +1 -0
  337. data/docs/source/index.html.erb +167 -0
  338. data/docs/source/javascripts/jquery.js +2 -0
  339. data/docs/source/javascripts/lunr.js +7 -0
  340. data/docs/source/javascripts/site.js +299 -0
  341. data/docs/source/javascripts/vendor/highlight.pack.js +2 -0
  342. data/docs/source/layouts/article.erb +106 -0
  343. data/docs/source/layouts/bare.erb +46 -0
  344. data/docs/source/layouts/layout.erb +43 -0
  345. data/docs/source/release-notes.html.md +258 -0
  346. data/docs/source/release-notes/workarea-3-0-0.html.md +146 -0
  347. data/docs/source/release-notes/workarea-3-0-1.html.md +161 -0
  348. data/docs/source/release-notes/workarea-3-0-10.html.md +39 -0
  349. data/docs/source/release-notes/workarea-3-0-11.html.md +277 -0
  350. data/docs/source/release-notes/workarea-3-0-12.html.md +14 -0
  351. data/docs/source/release-notes/workarea-3-0-13.html.md +153 -0
  352. data/docs/source/release-notes/workarea-3-0-14.html.md +93 -0
  353. data/docs/source/release-notes/workarea-3-0-15.html.md +107 -0
  354. data/docs/source/release-notes/workarea-3-0-16.html.md +36 -0
  355. data/docs/source/release-notes/workarea-3-0-17.html.md +141 -0
  356. data/docs/source/release-notes/workarea-3-0-18.html.md +123 -0
  357. data/docs/source/release-notes/workarea-3-0-19.html.md +160 -0
  358. data/docs/source/release-notes/workarea-3-0-2.html.md +222 -0
  359. data/docs/source/release-notes/workarea-3-0-20.html.md +95 -0
  360. data/docs/source/release-notes/workarea-3-0-21.html.md +168 -0
  361. data/docs/source/release-notes/workarea-3-0-22.html.md +268 -0
  362. data/docs/source/release-notes/workarea-3-0-23.html.md +173 -0
  363. data/docs/source/release-notes/workarea-3-0-24.html.md +19 -0
  364. data/docs/source/release-notes/workarea-3-0-25.html.md +26 -0
  365. data/docs/source/release-notes/workarea-3-0-26.html.md +199 -0
  366. data/docs/source/release-notes/workarea-3-0-27.html.md +113 -0
  367. data/docs/source/release-notes/workarea-3-0-28.html.md +39 -0
  368. data/docs/source/release-notes/workarea-3-0-29.html.md +73 -0
  369. data/docs/source/release-notes/workarea-3-0-3.html.md +35 -0
  370. data/docs/source/release-notes/workarea-3-0-30.html.md +186 -0
  371. data/docs/source/release-notes/workarea-3-0-31.html.md +125 -0
  372. data/docs/source/release-notes/workarea-3-0-32.html.md +73 -0
  373. data/docs/source/release-notes/workarea-3-0-33.html.md +137 -0
  374. data/docs/source/release-notes/workarea-3-0-34.html.md +203 -0
  375. data/docs/source/release-notes/workarea-3-0-35.html.md +205 -0
  376. data/docs/source/release-notes/workarea-3-0-36.html.md +105 -0
  377. data/docs/source/release-notes/workarea-3-0-37.html.md +144 -0
  378. data/docs/source/release-notes/workarea-3-0-38.html.md +73 -0
  379. data/docs/source/release-notes/workarea-3-0-39.html.md +77 -0
  380. data/docs/source/release-notes/workarea-3-0-4.html.md +14 -0
  381. data/docs/source/release-notes/workarea-3-0-40.html.md +130 -0
  382. data/docs/source/release-notes/workarea-3-0-41.html.md +70 -0
  383. data/docs/source/release-notes/workarea-3-0-42.html.md +52 -0
  384. data/docs/source/release-notes/workarea-3-0-43.html.md +72 -0
  385. data/docs/source/release-notes/workarea-3-0-44.html.md +93 -0
  386. data/docs/source/release-notes/workarea-3-0-45.html.md +61 -0
  387. data/docs/source/release-notes/workarea-3-0-46.html.md +171 -0
  388. data/docs/source/release-notes/workarea-3-0-47.html.md +130 -0
  389. data/docs/source/release-notes/workarea-3-0-48.html.md +160 -0
  390. data/docs/source/release-notes/workarea-3-0-49.html.md +28 -0
  391. data/docs/source/release-notes/workarea-3-0-5.html.md +225 -0
  392. data/docs/source/release-notes/workarea-3-0-50.html.md +74 -0
  393. data/docs/source/release-notes/workarea-3-0-51.html.md +61 -0
  394. data/docs/source/release-notes/workarea-3-0-52.html.md +76 -0
  395. data/docs/source/release-notes/workarea-3-0-53.html.md +126 -0
  396. data/docs/source/release-notes/workarea-3-0-54.html.md +112 -0
  397. data/docs/source/release-notes/workarea-3-0-55.html.md +105 -0
  398. data/docs/source/release-notes/workarea-3-0-56.html.md +56 -0
  399. data/docs/source/release-notes/workarea-3-0-57.html.md +82 -0
  400. data/docs/source/release-notes/workarea-3-0-58.html.md +153 -0
  401. data/docs/source/release-notes/workarea-3-0-59.html.md +78 -0
  402. data/docs/source/release-notes/workarea-3-0-6.html.md +165 -0
  403. data/docs/source/release-notes/workarea-3-0-60.html.md +43 -0
  404. data/docs/source/release-notes/workarea-3-0-61.html.md +46 -0
  405. data/docs/source/release-notes/workarea-3-0-62.html.md +23 -0
  406. data/docs/source/release-notes/workarea-3-0-63.html.md +25 -0
  407. data/docs/source/release-notes/workarea-3-0-64.html.md +25 -0
  408. data/docs/source/release-notes/workarea-3-0-65.html.md +37 -0
  409. data/docs/source/release-notes/workarea-3-0-7.html.md +207 -0
  410. data/docs/source/release-notes/workarea-3-0-8.html.md +337 -0
  411. data/docs/source/release-notes/workarea-3-0-9.html.md +196 -0
  412. data/docs/source/release-notes/workarea-3-1-0.html.md +414 -0
  413. data/docs/source/release-notes/workarea-3-1-1.html.md +139 -0
  414. data/docs/source/release-notes/workarea-3-1-10.html.md +19 -0
  415. data/docs/source/release-notes/workarea-3-1-11.html.md +27 -0
  416. data/docs/source/release-notes/workarea-3-1-12.html.md +216 -0
  417. data/docs/source/release-notes/workarea-3-1-13.html.md +113 -0
  418. data/docs/source/release-notes/workarea-3-1-14.html.md +39 -0
  419. data/docs/source/release-notes/workarea-3-1-15.html.md +107 -0
  420. data/docs/source/release-notes/workarea-3-1-16.html.md +188 -0
  421. data/docs/source/release-notes/workarea-3-1-17.html.md +141 -0
  422. data/docs/source/release-notes/workarea-3-1-18.html.md +73 -0
  423. data/docs/source/release-notes/workarea-3-1-19.html.md +137 -0
  424. data/docs/source/release-notes/workarea-3-1-2.html.md +55 -0
  425. data/docs/source/release-notes/workarea-3-1-20.html.md +203 -0
  426. data/docs/source/release-notes/workarea-3-1-21.html.md +205 -0
  427. data/docs/source/release-notes/workarea-3-1-22.html.md +121 -0
  428. data/docs/source/release-notes/workarea-3-1-23.html.md +144 -0
  429. data/docs/source/release-notes/workarea-3-1-24.html.md +94 -0
  430. data/docs/source/release-notes/workarea-3-1-25.html.md +77 -0
  431. data/docs/source/release-notes/workarea-3-1-26.html.md +130 -0
  432. data/docs/source/release-notes/workarea-3-1-27.html.md +70 -0
  433. data/docs/source/release-notes/workarea-3-1-28.html.md +52 -0
  434. data/docs/source/release-notes/workarea-3-1-29.html.md +44 -0
  435. data/docs/source/release-notes/workarea-3-1-3.html.md +185 -0
  436. data/docs/source/release-notes/workarea-3-1-30.html.md +72 -0
  437. data/docs/source/release-notes/workarea-3-1-31.html.md +93 -0
  438. data/docs/source/release-notes/workarea-3-1-32.html.md +61 -0
  439. data/docs/source/release-notes/workarea-3-1-33.html.md +171 -0
  440. data/docs/source/release-notes/workarea-3-1-34.html.md +130 -0
  441. data/docs/source/release-notes/workarea-3-1-35.html.md +179 -0
  442. data/docs/source/release-notes/workarea-3-1-36.html.md +28 -0
  443. data/docs/source/release-notes/workarea-3-1-37.html.md +74 -0
  444. data/docs/source/release-notes/workarea-3-1-38.html.md +61 -0
  445. data/docs/source/release-notes/workarea-3-1-39.html.md +96 -0
  446. data/docs/source/release-notes/workarea-3-1-4.html.md +148 -0
  447. data/docs/source/release-notes/workarea-3-1-40.html.md +126 -0
  448. data/docs/source/release-notes/workarea-3-1-41.html.md +128 -0
  449. data/docs/source/release-notes/workarea-3-1-42.html.md +105 -0
  450. data/docs/source/release-notes/workarea-3-1-43.html.md +37 -0
  451. data/docs/source/release-notes/workarea-3-1-44.html.md +82 -0
  452. data/docs/source/release-notes/workarea-3-1-45.html.md +153 -0
  453. data/docs/source/release-notes/workarea-3-1-46.html.md +91 -0
  454. data/docs/source/release-notes/workarea-3-1-47.html.md +65 -0
  455. data/docs/source/release-notes/workarea-3-1-48.html.md +46 -0
  456. data/docs/source/release-notes/workarea-3-1-49.html.md +23 -0
  457. data/docs/source/release-notes/workarea-3-1-5.html.md +169 -0
  458. data/docs/source/release-notes/workarea-3-1-50.html.md +42 -0
  459. data/docs/source/release-notes/workarea-3-1-51.html.md +25 -0
  460. data/docs/source/release-notes/workarea-3-1-52.html.md +57 -0
  461. data/docs/source/release-notes/workarea-3-1-6.html.md +117 -0
  462. data/docs/source/release-notes/workarea-3-1-7.html.md +176 -0
  463. data/docs/source/release-notes/workarea-3-1-8.html.md +283 -0
  464. data/docs/source/release-notes/workarea-3-1-9.html.md +212 -0
  465. data/docs/source/release-notes/workarea-3-2-0.html.md +1705 -0
  466. data/docs/source/release-notes/workarea-3-2-1.html.md +216 -0
  467. data/docs/source/release-notes/workarea-3-2-10.html.md +237 -0
  468. data/docs/source/release-notes/workarea-3-2-11.html.md +121 -0
  469. data/docs/source/release-notes/workarea-3-2-12.html.md +145 -0
  470. data/docs/source/release-notes/workarea-3-2-13.html.md +138 -0
  471. data/docs/source/release-notes/workarea-3-2-14.html.md +77 -0
  472. data/docs/source/release-notes/workarea-3-2-15.html.md +130 -0
  473. data/docs/source/release-notes/workarea-3-2-16.html.md +111 -0
  474. data/docs/source/release-notes/workarea-3-2-17.html.md +52 -0
  475. data/docs/source/release-notes/workarea-3-2-18.html.md +44 -0
  476. data/docs/source/release-notes/workarea-3-2-19.html.md +72 -0
  477. data/docs/source/release-notes/workarea-3-2-2.html.md +145 -0
  478. data/docs/source/release-notes/workarea-3-2-20.html.md +93 -0
  479. data/docs/source/release-notes/workarea-3-2-21.html.md +61 -0
  480. data/docs/source/release-notes/workarea-3-2-22.html.md +154 -0
  481. data/docs/source/release-notes/workarea-3-2-23.html.md +130 -0
  482. data/docs/source/release-notes/workarea-3-2-24.html.md +200 -0
  483. data/docs/source/release-notes/workarea-3-2-25.html.md +28 -0
  484. data/docs/source/release-notes/workarea-3-2-26.html.md +94 -0
  485. data/docs/source/release-notes/workarea-3-2-27.html.md +61 -0
  486. data/docs/source/release-notes/workarea-3-2-28.html.md +96 -0
  487. data/docs/source/release-notes/workarea-3-2-29.html.md +126 -0
  488. data/docs/source/release-notes/workarea-3-2-30.html.md +112 -0
  489. data/docs/source/release-notes/workarea-3-2-31.html.md +105 -0
  490. data/docs/source/release-notes/workarea-3-2-32.html.md +56 -0
  491. data/docs/source/release-notes/workarea-3-2-33.html.md +82 -0
  492. data/docs/source/release-notes/workarea-3-2-34.html.md +153 -0
  493. data/docs/source/release-notes/workarea-3-2-35.html.md +91 -0
  494. data/docs/source/release-notes/workarea-3-2-36.html.md +118 -0
  495. data/docs/source/release-notes/workarea-3-2-37.html.md +46 -0
  496. data/docs/source/release-notes/workarea-3-2-38.html.md +23 -0
  497. data/docs/source/release-notes/workarea-3-2-39.html.md +42 -0
  498. data/docs/source/release-notes/workarea-3-2-4.html.md +109 -0
  499. data/docs/source/release-notes/workarea-3-2-40.html.md +25 -0
  500. data/docs/source/release-notes/workarea-3-2-41.html.md +90 -0
  501. data/docs/source/release-notes/workarea-3-2-5.html.md +186 -0
  502. data/docs/source/release-notes/workarea-3-2-6.html.md +173 -0
  503. data/docs/source/release-notes/workarea-3-2-7.html.md +89 -0
  504. data/docs/source/release-notes/workarea-3-2-8.html.md +137 -0
  505. data/docs/source/release-notes/workarea-3-2-9.html.md +219 -0
  506. data/docs/source/release-notes/workarea-3-3-0.html.md +1272 -0
  507. data/docs/source/release-notes/workarea-3-3-1.html.md +324 -0
  508. data/docs/source/release-notes/workarea-3-3-10.html.md +69 -0
  509. data/docs/source/release-notes/workarea-3-3-11.html.md +72 -0
  510. data/docs/source/release-notes/workarea-3-3-12.html.md +136 -0
  511. data/docs/source/release-notes/workarea-3-3-13.html.md +61 -0
  512. data/docs/source/release-notes/workarea-3-3-14.html.md +196 -0
  513. data/docs/source/release-notes/workarea-3-3-15.html.md +167 -0
  514. data/docs/source/release-notes/workarea-3-3-16.html.md +234 -0
  515. data/docs/source/release-notes/workarea-3-3-17.html.md +82 -0
  516. data/docs/source/release-notes/workarea-3-3-18.html.md +165 -0
  517. data/docs/source/release-notes/workarea-3-3-19.html.md +106 -0
  518. data/docs/source/release-notes/workarea-3-3-2.html.md +72 -0
  519. data/docs/source/release-notes/workarea-3-3-20.html.md +116 -0
  520. data/docs/source/release-notes/workarea-3-3-21.html.md +228 -0
  521. data/docs/source/release-notes/workarea-3-3-22.html.md +125 -0
  522. data/docs/source/release-notes/workarea-3-3-23.html.md +154 -0
  523. data/docs/source/release-notes/workarea-3-3-24.html.md +70 -0
  524. data/docs/source/release-notes/workarea-3-3-25.html.md +114 -0
  525. data/docs/source/release-notes/workarea-3-3-26.html.md +260 -0
  526. data/docs/source/release-notes/workarea-3-3-27.html.md +138 -0
  527. data/docs/source/release-notes/workarea-3-3-28.html.md +147 -0
  528. data/docs/source/release-notes/workarea-3-3-29.html.md +63 -0
  529. data/docs/source/release-notes/workarea-3-3-3.html.md +153 -0
  530. data/docs/source/release-notes/workarea-3-3-30.html.md +102 -0
  531. data/docs/source/release-notes/workarea-3-3-31.html.md +57 -0
  532. data/docs/source/release-notes/workarea-3-3-32.html.md +44 -0
  533. data/docs/source/release-notes/workarea-3-3-33.html.md +114 -0
  534. data/docs/source/release-notes/workarea-3-3-4.html.md +332 -0
  535. data/docs/source/release-notes/workarea-3-3-5.html.md +242 -0
  536. data/docs/source/release-notes/workarea-3-3-6.html.md +100 -0
  537. data/docs/source/release-notes/workarea-3-3-7.html.md +148 -0
  538. data/docs/source/release-notes/workarea-3-3-8.html.md +163 -0
  539. data/docs/source/release-notes/workarea-3-3-9.html.md +93 -0
  540. data/docs/source/release-notes/workarea-3-4-0.html.md +580 -0
  541. data/docs/source/release-notes/workarea-3-4-1.html.md +150 -0
  542. data/docs/source/release-notes/workarea-3-4-10.html.md +72 -0
  543. data/docs/source/release-notes/workarea-3-4-11.html.md +60 -0
  544. data/docs/source/release-notes/workarea-3-4-12.html.md +155 -0
  545. data/docs/source/release-notes/workarea-3-4-2.html.md +188 -0
  546. data/docs/source/release-notes/workarea-3-4-3.html.md +136 -0
  547. data/docs/source/release-notes/workarea-3-4-4.html.md +114 -0
  548. data/docs/source/release-notes/workarea-3-4-5.html.md +275 -0
  549. data/docs/source/release-notes/workarea-3-4-6.html.md +169 -0
  550. data/docs/source/release-notes/workarea-3-4-7.html.md +162 -0
  551. data/docs/source/release-notes/workarea-3-4-8.html.md +95 -0
  552. data/docs/source/release-notes/workarea-3-4-9.html.md +135 -0
  553. data/docs/source/search.html.erb +34 -0
  554. data/docs/source/shared/_header.erb +61 -0
  555. data/docs/source/shared/_svgs.erb +17 -0
  556. data/docs/source/style_guide/index.html.erb +382 -0
  557. data/docs/source/stylesheets/_base.scss +125 -0
  558. data/docs/source/stylesheets/_components.scss +669 -0
  559. data/docs/source/stylesheets/_helpers.scss +10 -0
  560. data/docs/source/stylesheets/_opinions.scss +42 -0
  561. data/docs/source/stylesheets/_settings.scss +56 -0
  562. data/docs/source/stylesheets/_typography.scss +119 -0
  563. data/docs/source/stylesheets/site.css.scss +14 -0
  564. data/docs/source/stylesheets/vendor/_avalanche.scss +328 -0
  565. data/docs/source/stylesheets/vendor/_normalize.scss +341 -0
  566. data/docs/source/stylesheets/vendor/highlight/_tomorrow_night_blue.scss +75 -0
  567. data/docs/source/upgrade-guides.html.md +18 -0
  568. data/docs/source/upgrade-guides/workarea-3-4-0.html.md +152 -0
  569. data/docs/workarea_renderer.rb +8 -0
  570. data/docs/yarn.lock +2522 -0
  571. metadata +669 -0
@@ -0,0 +1,51 @@
1
+ ---
2
+ title: Navigable
3
+ excerpt: A navigable is an application document that includes the Workarea::Navigable module, and thereby has a slug attribute and a 1:1 relationship with a taxon.
4
+ ---
5
+
6
+ # Navigable
7
+
8
+ A <dfn>navigable</dfn> is an [application document](application-document.html) that includes the `Workarea::Navigable` module, and thereby has a `slug` attribute and a 1:1 relationship with a [taxon](navigation.html#taxon).
9
+
10
+ ## Slug
11
+
12
+ A navigable has a `slug` attribute, which is a unique, human- and URL-friendly string used to identify the model, particularly when requesting the model via a URL.
13
+
14
+ For example, in the Storefront, the path _/pages/foo_ is routed to `Storefront::PagesController#show`, which looks up the requested page by slug:
15
+
16
+ ```
17
+ Content::Page.find_by(slug: params[:id])
18
+ ```
19
+
20
+ Calling `to_param` on a navigable returns the navigable's slug, allowing idiomatic use of Rail's routing helpers, while maintaining "pretty" URLs.
21
+
22
+ ```
23
+ = page_path(@page)
24
+ / evaluates to "/pages/foo"
25
+ ```
26
+
27
+ A navigable must have a slug, but one will be generated if not provided explicitly. A generated slug is derived from the navigable's name, including an incrementing suffix if needed to ensure uniqueness.
28
+
29
+ ```
30
+ Workarea::Catalog::Category.create!(name: 'Foo').slug
31
+ # => "foo"
32
+
33
+ Workarea::Catalog::Category.create!(name: 'Foo').slug
34
+ # => "foo-1"
35
+ ```
36
+
37
+ ## Taxon
38
+
39
+ A navigable has a 1:1 relationship with a [taxon](navigation.html#taxon), which represents the navigable's position within the site's taxonomy tree.
40
+
41
+ ```
42
+ navigable = Workarea::Catalog::Product.create!(name: 'Foo')
43
+ taxon = Workarea::Navigation::Taxon.create!(navigable: navigable)
44
+
45
+ navigable.taxon.class
46
+ # => Workarea::Navigation::Taxon
47
+
48
+ navigable.taxon.name
49
+ # => "Foo"
50
+ ```
51
+
@@ -0,0 +1,149 @@
1
+ ---
2
+ title: Navigating the Code
3
+ created_at: 2019/06/01
4
+ excerpt: A look into the structure of the workarea gem, and guidance on where to look when delving into the source code.
5
+ ---
6
+
7
+ # Navigating the Code
8
+
9
+ It is not uncommon to face scenarios where you need to dig into the source code of Workarea to find answers to questions – whether you are looking to gain a better understanding of how something works, looking for the cause of a problem, or looking to expand functionality. This guide serves as an overview of how Workarea is constructed and the ways in which you can traverse its codebase to find what you're looking for.
10
+
11
+ ## The Workarea gem
12
+
13
+ Workarea is a meta-gem much like the framework it is built-on, Ruby on Rails. It is composed of four gems that represent the major pieces of any ecommerce application. Each of these gems is a [Rails engine](https://guides.rubyonrails.org/engines.html), which are self-contained Rails applications that can be added to your application, providing everything that is needed to get an ecommerce project off the ground.
14
+
15
+ ### workarea-core
16
+
17
+ Just as it sounds, `workarea-core` is the center of the Workarea platform. It is responsible for handling the data layer and all critical business logic that all the other pieces are built from. `workarea-core` is where you find the following:
18
+
19
+ - Models
20
+ - Queries
21
+ - Workers
22
+ - Configuration
23
+ - and more
24
+
25
+ If there is logic within an application that is not specific to any other part of part of the platform, you will find it in `workarea-core`.
26
+
27
+ ### workarea-admin
28
+
29
+ Workarea comes with an admin UI out of the box that enables retailers to manage everything within their ecommerce site from an easily searchable, user-friendly interface. `workarea-admin` contains all the routing, controllers, views, and front-end assets required to power the administrative pages. The easiest way to tell if you're on an admin page is to look for the `/admin/` segment of a page's URL. If you see it, then you're in the admin!
30
+
31
+ ### workarea-storefront
32
+
33
+ Customer-facing functionality is quite important for an ecommerce business. Luckily, Workarea provides an easily customizable storefront that provides functionality for a seamless checkout flow, powerful search, easily organized categories, handcrafted content pages and navigation, and user account management. The `workarea-storefront` gem provides the routes, controllers, views, and front-end assets for delivering a great user experience to retail customers.
34
+
35
+ This gem is the first place to look when looking for the behavior of search, categories, product pages, content, or checkout flow. By digging into the routes and controllers, you can more easily build an understand of how data is composed and displayed.
36
+
37
+ ### workarea-testing
38
+
39
+ Every developer's favorite thing – tests. Workarea provides a robust testing configuration to allow developers to write tests without worrying about complex setup.
40
+
41
+ `workarea-testing` is where to look when you need a better understanding of how tests are setup, what is being done for each test, and what tools are provided to make writing tests easier.
42
+
43
+ ## Finding the source
44
+
45
+ As mentioned before, Workarea is a meta-gem, and as a result finding what you're looking for can be a bit tricky. With a Ruby application, you can utilize `bundler` to find where the source code of any bundled gem is on our machine, open up that gem and dig in. This holds true for Workarea. In your application you can run `bundle show GEM_NAME` to get the path to the installed gem. Lets do that with `workarea`:
46
+
47
+ ```bash
48
+ $ bundle show workarea
49
+ /Users/lincy/.rbenv/versions/2.4.4/lib/Ruby/gems/2.4.0/gems/workarea-3.4.5
50
+ ```
51
+
52
+ This is where it can get tricky. Open the directory that your application provides the path to and you'll see this:
53
+
54
+ ![Bundled workarea gem](../images/bundle-show-workarea.png)
55
+
56
+ Not quite what you were hoping to see, right? Well, because Workarea is a meta-gem, the `workarea` gem itself doesn't contain any of the source code (except this documentation). Instead what you need to do is determine which of the meta-gems is needed to find the code you're looking for. Use the breakdown above for each gem to get an idea.
57
+
58
+ For example, you are looking to figure out what fields are on a particular model, you would want to look at `workarea-core` – the data layer of Workarea.
59
+
60
+ ```bash
61
+ $ bundle show workarea-core
62
+ /Users/mduffy/.rbenv/versions/2.4.4/lib/Ruby/gems/2.4.0/gems/workarea-core-3.4.5
63
+ ```
64
+
65
+ Open the path in your editor, and you'll see:
66
+
67
+ ![Bundled workarea-core gem](../images/bundle-show-workarea-core.png)
68
+
69
+ That's more like it! From there you can follow normal Rails conventions and look at `app/models/workarea/` to find the model you're looking for.
70
+
71
+ This same process can be followed to look at source of any other gem within `workarea` - whether it's looking at `workarea-storefront` to see the controller actions for checkout, or `workarea-admin` to determine how a workflow is constructed.
72
+
73
+ ### Just git it
74
+
75
+ Instead of digging through the gem source itself, you can always browse the tagged version of the [Workarea repo on GitHub](https://github.com/workarea-commerce/workarea), and browse across the entire codebase at once.
76
+
77
+ For easier browsing, you can pull the codebase locally and checkout the tagged version you want to work with.
78
+
79
+ ```bash
80
+ $ git clone git@github.com:workarea-commerce/workarea.git
81
+ # ...
82
+
83
+ $ cd workarea
84
+ $ git checkout v3.4.5
85
+ ```
86
+
87
+ ## Working from the outside-in
88
+
89
+ Now that you better understand where to find things, it can still be hard determining where to look to solve your problem. There are many layers to an application and finding root of a problem is always the hardest part.
90
+
91
+ ### Controllers
92
+
93
+ With Workarea, you can start troubleshooting most problems by looking at the corresponding controller. The controller will provide insight into the views used, the models loaded, and any queries that may be used for a particular requests. From a controller, you can begin to branch into the other parts of the application to gain a better understanding of how the application handles a request.
94
+
95
+ Like most Rails applications, you can reliably determine a controller by the URL. For product pages in Workarea, the URLs are structures like `/products/PRODUCT_SLUG`. Under Rails conventions we can assume this URL is handled by the `ProductsController`, located at `app/controllers/products_controller.rb`. This is almost correct. In `workarea-storefront`, the controller is located in `app/controllers/workarea/storefront/products_controller.rb` with a class name matching the path - 'Workarea::Storefront::ProductsController'.
96
+
97
+ Similarly in the admin, controllers for Workarea are found in `app/controllers/workarea/admin/`.
98
+
99
+ There are a few exceptions to the rule of using the URL, but if something is not clear, you can always look to the corresponding gem's `config/routes.rb` to better determine the controller handling a particular request.
100
+
101
+ ### Views
102
+
103
+ Once you've found the controller, you can branch out and look to the view, located in the matching path of `app/views/workarea/storefront/products/show.html.haml`. Conventionally, any partials used in a view will be fully qualified paths, making it easier to determine the partial's location.
104
+
105
+ ### View Models
106
+
107
+ When looking at a controller or a view, it's common to need to understand the implementation of a method being called on the model or query. With Workarea, it is best to first look at the view model. Most models and queries in Workarea are wrapped in a view model, a specialized Ruby class used to combine data from multiple sources and provide methods based on that data in a format appropriate for displaying to a user.
108
+
109
+ View models are located at `app/view_models/` in both the admin and storefront gems. You can determine view models being used by going back to the controller and look for code that looks like the following:
110
+
111
+ ```Ruby
112
+ model = Catalog::Product.find(params[:id])
113
+ @product = Storefront::ProductViewModel.wrap(model, view_model_options)
114
+ ```
115
+
116
+ Here a product is found from the database, then wrapped in a storefront view model. It is not uncommon for a view model to then query for other data, like pricing and inventory, and also wrap those models in their own view models.
117
+
118
+ View models use a [decorator pattern](https://github.com/infinum/rails-handbook/blob/master/Design%20Patterns/Decorators.md). If a method being called on a view model cannot be found on the view model itself you can look to the original model passed to the view model. View models use `method_missing` to automatically delegate unknown methods to the model.
119
+
120
+ ### Models & Queries
121
+
122
+ Beyond view models, an exploration into the problem will require jumping to `workarea-core`, where models and queries are defined. They provide the logic around what the data looks like and how it is requested from the databases. All models within Workarea can be found in `workarea-core` at `app/models/workarea`, and queries can be found in `app/queries`.
123
+
124
+ ### Services
125
+
126
+ Some controllers will use service classes for handling logic too complex for a simple controller action. They primarily exist to encapsulate writing operations much like queries do for reads. Like models and queries, all services for Workarea are in `workarea-core` at `app/services`. They are typically named with a verb and will look similar to the following:
127
+
128
+ ```Ruby
129
+ CancelOrder.new(order).perform
130
+ ```
131
+
132
+ ### Workers
133
+
134
+ Workers are used to perform tasks outside the normal request/response flow of the application. To gain a full understanding of how data flows through a Workarea application you can look at workers, located in `workarea-core` at `app/workers`. Many workers are triggered by model callbacks, like saving a product. Those workers will have options like the following:
135
+
136
+ ```Ruby
137
+ sidekiq_options(enqueue_on: { Catalog::Product => :save })
138
+ ```
139
+
140
+ Other workers are scheduled and are not triggered by any other factors outside of their schedule. The timing for scheduled workers is configured in `workarea-core` in `config/initializers/05_scheduled_jobs.rb`, looking something like the following:
141
+
142
+ ```Ruby
143
+ Sidekiq::Cron::Job.create(
144
+ name: 'Workarea::CleanOrders',
145
+ klass: 'Workarea::CleanOrders',
146
+ cron: "0 6 * * * #{Time.zone.tzinfo.identifier}",
147
+ queue: 'low'
148
+ )
149
+ ```
@@ -0,0 +1,386 @@
1
+ ---
2
+ title: Navigation
3
+ excerpt: Within a Workarea application, navigables and other nodes are organized into a tree of taxons, which is then used to build tree-based navigation, such as breadcrumbs, and content-based navigation, such as menus.
4
+ ---
5
+
6
+ # Navigation
7
+
8
+ Within a Workarea application, [navigables](navigable.html) and other nodes are organized into a tree of taxons, which is then used to build tree-based navigation, such as breadcrumbs, and content-based navigation, such as menus.
9
+
10
+ ## Taxon
11
+
12
+ A <dfn>navigation taxon</dfn> (`Workarea::Navigation::Taxon`) is an [application document](application-document.html) that represents a node of the site's taxonomy tree.
13
+
14
+ ### Tree Structure
15
+
16
+ A taxon includes the following interfaces for manipulating a tree structure:
17
+
18
+ - `Mongoid::Tree` ([docs](http://www.rubydoc.info/github/benedikt/mongoid-tree/Mongoid/Tree))
19
+ - `Mongoid::Tree::Ordering` ([docs](http://www.rubydoc.info/github/benedikt/mongoid-tree/Mongoid/Tree/Ordering))
20
+ - `Mongoid::Tree::Traversal` ([docs](http://www.rubydoc.info/github/benedikt/mongoid-tree/Mongoid/Tree/Traversal))
21
+
22
+ #### Root
23
+
24
+ `Taxon.root` returns the root taxon, which represents the site's home page.
25
+
26
+ ```
27
+ root_taxon = Workarea::Navigation::Taxon.root
28
+
29
+ root_taxon.name
30
+ # => "Home"
31
+
32
+ root_taxon.url
33
+ # => "/"
34
+ ```
35
+
36
+ #### Parent
37
+
38
+ With the exception of the root taxon, each taxon has a parent.
39
+
40
+ ```
41
+ root_taxon.parent
42
+ # => nil
43
+
44
+ clothing_taxon = root_taxon.children.create!(name: 'Clothing')
45
+
46
+ clothing_taxon.parent.name
47
+ # => "Home"
48
+
49
+ mens_clothing_taxon = clothing_taxon.children.create!(name: 'Men')
50
+
51
+ mens_clothing_taxon.name
52
+ # => "Men"
53
+
54
+ mens_clothing_taxon.parent.name
55
+ # => "Clothing"
56
+ ```
57
+
58
+ Taxons created without an explicit parent node are created as children of the root node.
59
+
60
+ ```
61
+ sporting_goods_taxon = Workarea::Navigation::Taxon.create!(
62
+ name: 'Sporting Goods'
63
+ )
64
+ sporting_goods_taxon.parent.name
65
+ # => "Home"
66
+ ```
67
+
68
+ ### URL
69
+
70
+ A taxon may act as a pointer to an arbitrary URL or path.
71
+
72
+ ```
73
+ blog_taxon = Workarea::Navigation::Taxon.create!(
74
+ name: 'Blog',
75
+ url: 'http://blog.example.com'
76
+ )
77
+
78
+ blog_taxon.name
79
+ # => "Blog"
80
+
81
+ blog_taxon.url
82
+ # => "http://blog.example.com"
83
+
84
+ blog_taxon.url?
85
+ # => true
86
+
87
+ blog_taxon.resource_name
88
+ # => "url"
89
+
90
+ blog_taxon.resource_name.url?
91
+ # => true
92
+ ```
93
+
94
+ The root taxon points to the root path of the site.
95
+
96
+ ```
97
+ Workarea::Navigation::Taxon.root.url
98
+ # => "/"
99
+ ```
100
+
101
+ A taxon is not [releasable](releasable.html) and does not have an `active` attribute. However, a taxon will respond to the `active?` method. A taxon with a URL is always considered active and will always respond `true`.
102
+
103
+ ```
104
+ blog_taxon.active?
105
+ # => true
106
+ ```
107
+
108
+ ### Navigable
109
+
110
+ Instead of referencing an arbitrary URL or path, a taxon may reference a [navigable](navigable.html). If not given an explicit name, the taxon will copy the name of the navigable. Taxon navigables are validated for uniqueness, so no two taxons may reference the same navigable.
111
+
112
+ ```
113
+ fit_guide_page = Workarea::Content::Page.create!(name: 'Fit Guide')
114
+ fit_guide_page_taxon = Workarea::Navigation::Taxon.create!(
115
+ navigable: fit_guide_page
116
+ )
117
+
118
+ fit_guide_page_taxon.name
119
+ # => "Fit Guide"
120
+
121
+ fit_guide_page_taxon.navigable.class
122
+ # => Workarea::Content::Page
123
+
124
+ fit_guide_page.taxon.navigable.name
125
+ # => "Fit Guide"
126
+
127
+ fit_guide_page.taxon.navigable_slug
128
+ # => "fit-guide"
129
+
130
+ fit_guide_page_taxon_2 = Workarea::Navigation::Taxon.create!(
131
+ navigable: fit_guide_page
132
+ )
133
+ # Mongoid::Errors::Validations:
134
+ # message:
135
+ # Validation of Workarea::Navigation::Taxon failed.
136
+ # summary:
137
+ # The following errors were found: Navigable is already taken
138
+
139
+ fit_guide_page_taxon.url?
140
+ # => false
141
+
142
+ fit_guide_page_taxon.navigable?
143
+ # => true
144
+
145
+ fit_guide_page_taxon.resource_name
146
+ # => "page"
147
+
148
+ fit_guide_page_taxon.resource_name.page?
149
+ # => true
150
+ ```
151
+
152
+ A taxon with a navigable delegates its `active` status to the navigable.
153
+
154
+ ```
155
+ fit_guide_page_taxon.active?
156
+ # => true
157
+
158
+ fit_guide_page.active = false
159
+ fit_guide_page.active?
160
+ # => false
161
+
162
+ fit_guide_page_taxon.active?
163
+ # => false
164
+ ```
165
+
166
+ ### Placeholder
167
+
168
+ A taxon may be created without a URL and a navigable as long as it is given a name. This type of taxon is called a placeholder and may be used to group other taxons (its children) under a text only "heading".
169
+
170
+ ```
171
+ sporting_goods_taxon.name
172
+ # => "Sporting Goods"
173
+
174
+ sporting_goods_taxon.url?
175
+ # => false
176
+
177
+ sporting_goods_taxon.navigable?
178
+ # => false
179
+
180
+ sporting_goods_taxon.placeholder?
181
+ # => true
182
+
183
+ sporting_goods_taxon.resource_name
184
+ # => "placeholder"
185
+
186
+ sporting_goods_taxon.resource_name.placeholder?
187
+ # => true
188
+ ```
189
+
190
+ A placeholder taxon does not have an `active` attribute and does not have a navigable to which it can delegate its active status. Therefore it is always considered active.
191
+
192
+ ```
193
+ sporting_goods_taxon.active?
194
+ # => true
195
+ ```
196
+
197
+ ### Menu
198
+
199
+ `Taxon#menu` returns the first navigation menu that belongs to the taxon. In practice, a taxon and a menu have a 1:1 relationship. `Taxon#in_menu?` returns `true` if a menu belongs to the taxon.
200
+
201
+ ```
202
+ clothing_category = Workarea::Catalog::Category.create!(name: 'Clothing')
203
+ clothing_category_taxon = Workarea::Navigation::Taxon.create!(
204
+ navigable: clothing_category
205
+ )
206
+ clothing_menu = Workarea::Navigation::Menu.create!(
207
+ taxon: clothing_category_taxon
208
+ )
209
+
210
+ clothing_category_taxon.menu.class
211
+ # => Workarea::Navigation::Menu
212
+
213
+ clothing_category_taxon.menu.name
214
+ # => "Clothing"
215
+
216
+ clothing_category_taxon.in_menu?
217
+ # => true
218
+ ```
219
+
220
+ ## Breadcrumbs
221
+
222
+ A <dfn>breadcrumbs</dfn> (`Workarea::Navigation::Breadcrumbs`) is an enumerable representing a collection of taxons. A breadcrumbs instance is initialized with a [navigable](navigable.html) and represents the breadcrumb nodes for that navigable.
223
+
224
+ ```
225
+ clothing_category = Workarea::Catalog::Category.create!(name: 'Clothing')
226
+ clothing_category_taxon = Workarea::Navigation::Taxon.root.children.create!(
227
+ navigable: clothing_category
228
+ )
229
+ mens_clothing_category = Workarea::Catalog::Category.create!(name: 'Men')
230
+ mens_clothing_category_taxon = clothing_category_taxon.children.create!(
231
+ navigable: mens_clothing_category
232
+ )
233
+ mens_clothing_category_breadcrumbs = Workarea::Navigation::Breadcrumbs.new(
234
+ mens_clothing_category
235
+ )
236
+
237
+ mens_clothing_category_breadcrumbs.count
238
+ # => 3
239
+
240
+ mens_clothing_category_breadcrumbs.map(&:class)
241
+ # => [
242
+ # Workarea::Navigation::Taxon,
243
+ # Workarea::Navigation::Taxon,
244
+ # Workarea::Navigation::Taxon
245
+ # ]
246
+
247
+ mens_clothing_category_breadcrumbs.map(&:name)
248
+ # => ["Home", "Clothing", "Men"]
249
+
250
+ mens_clothing_category_breadcrumbs.join(' > ')
251
+ # => "Home > Clothing > Men"
252
+ ```
253
+
254
+ ### Last
255
+
256
+ A `last` may be provided to add a final taxon to the collection. This is useful when the navigable is not directly in the taxonomy, like a product that belongs to a category that is within the taxonomy, rather than being in the taxonomy directly.
257
+
258
+ ```
259
+ sweatpants_product = Workarea::Catalog::Product.create!(name: 'Sweatpants')
260
+ mens_clothing_category.update_attributes!(product_ids: [sweatpants_product.id])
261
+ sweatpants_product_breadcrumbs = Workarea::Navigation::Breadcrumbs.new(
262
+ mens_clothing_category,
263
+ last: sweatpants_product.name
264
+ )
265
+
266
+ sweatpants_product_breadcrumbs.count
267
+ # => 4
268
+
269
+ sweatpants_product_breadcrumbs.join(' > ')
270
+ # => "Home > Clothing > Men > Sweatpants"
271
+ ```
272
+
273
+ ### Global ID
274
+
275
+ A breadcrumbs collection may also be initialized using the global ID of the navigable, and can return the global ID of the navigable.
276
+
277
+ ```
278
+ mens_clothing_category_breadcrumbs.join(' > ')
279
+ # => "Home > Clothing > Men"
280
+
281
+ mens_clothing_category_global_id =
282
+ mens_clothing_category_breadcrumbs.to_global_id
283
+ # => "Z2lkOi8vbGVhcm4tdjMvV2VibGluYzo6Q2F0YWxvZzo6Q2F0ZWdvcnkvNThiY2I2M2JlZWZiZmU5YTY0MWEyZGNk"
284
+
285
+ Workarea::Navigation::Breadcrumbs
286
+ .from_global_id(mens_clothing_category_global_id)
287
+ .join(' > ')
288
+ # => "Home > Clothing > Men"
289
+ ```
290
+
291
+ ## Menu
292
+
293
+ A <dfn>navigation menu</dfn> (`Workarea::Navigation::Menu`) is a [contentable](contentable.html) and [releasable](releasable.html) [application document](application-document.html) that represents a menu within a navigation.
294
+
295
+ ### Taxon
296
+
297
+ A menu has a 1:1 relationship with a taxon and generally delegates its name to the taxon.
298
+
299
+ ```
300
+ clothing_category = Workarea::Catalog::Category.create!(name: 'Clothing')
301
+ clothing_category_taxon = Workarea::Navigation::Taxon.create!(
302
+ navigable: clothing_category
303
+ )
304
+ clothing_menu = Workarea::Navigation::Menu.create!(
305
+ taxon: clothing_category_taxon
306
+ )
307
+
308
+ clothing_menu.taxon.class
309
+ # => Workarea::Navigation::Taxon
310
+
311
+ clothing_menu.taxon.name
312
+ # => "Clothing"
313
+
314
+ clothing_menu.name
315
+ # => "Clothing"
316
+ ```
317
+
318
+ ### Active
319
+
320
+ A menu's `active?` status (see [Releasable](releasable.html)) also depends on the taxon. For a menu to be active, both the menu and the corresponding taxon must be active. Note that a taxon with a navigable delegates its active status to its navigable.
321
+
322
+ ```
323
+ clothing_category = Workarea::Catalog::Category.create!(
324
+ name: 'Clothing',
325
+ active: false
326
+ )
327
+ clothing_category_taxon = Workarea::Navigation::Taxon.create!(
328
+ navigable: clothing_category
329
+ )
330
+ clothing_menu = Workarea::Navigation::Menu.create!(
331
+ taxon: clothing_category_taxon,
332
+ active: false
333
+ )
334
+
335
+ clothing_category.active?
336
+ # => false
337
+
338
+ clothing_menu.active?
339
+ # => false
340
+
341
+ clothing_menu.active = true
342
+
343
+ clothing_menu.active?
344
+ # => false
345
+
346
+ clothing_category.active = true
347
+ # => true
348
+
349
+ clothing_menu.active?
350
+ # => true
351
+ ```
352
+
353
+ ### Position
354
+
355
+ Each menu has a `position` attribute, and menus are returned sorted by position ascending.
356
+
357
+ ```
358
+ foo = Workarea::Navigation::Taxon.create!(name: 'Foo')
359
+ bar = Workarea::Navigation::Taxon.create!(name: 'Bar')
360
+ baz = Workarea::Navigation::Taxon.create!(name: 'Baz')
361
+
362
+ Workarea::Navigation::Menu.create!(taxon: foo, position: 2)
363
+ Workarea::Navigation::Menu.create!(taxon: bar, position: 0)
364
+ Workarea::Navigation::Menu.create!(taxon: baz, position: 1)
365
+
366
+ Workarea::Navigation::Menu.all.map(&:name)
367
+ # => ["Bar", "Baz", "Foo"]
368
+ ```
369
+
370
+ ## Storefront Navigation
371
+
372
+ The Storefront's application layout outputs a _mobile navigation_, used by most applications for small screens only, and a _primary navigation_, used by most applications for wide screens only.
373
+
374
+ The mobile navigation uses `Storefront::MenusController#index` and `Storefront::MenusController#show` to display the list of all active menus and the content for a specific menu, respectively.
375
+
376
+ The primary navigation uses `Storefront::NavigationHelper#navigation_menus` to output all active menus, and the `WORKAREA.primaryNavContent` JavaScript module is responsible for requesting and displaying the content for menus when they are hovered.
377
+
378
+ ### Taxonomy Content Blocks
379
+
380
+ Taxonomy [content blocks](content.html#block) allow admins to display a subset of the site's taxonomy tree within a content, such as the content of a navigation menu. Storefront navigation is often implemented as a list of menus, each of which has content that is displayed as a drop down and includes lists of links that are "plucked" from the taxonomy.
381
+
382
+ Taxonomy content blocks make use of a taxonomy [field](content.html#field) (`Content::Fields::Taxonomy`), which allows admins to provide the starting position within the taxonomy and output a list of links from that starting position. For example, if the taxon selected as the starting position has children, those children will be output as a list within the content block. Some taxonomy blocks include multiple taxonomy fields to allow for multiple lists of links that can be displayed in columns or another arrangement.
383
+
384
+ The starting taxon is stored in the block's [data](content.html#data) as the string id of the taxon, and the view model for the particular [block type](content.html#block-type) looks up the correct taxon for display.
385
+
386
+