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.
- checksums.yaml +7 -0
- data/.rubocop.yml +326 -0
- data/CHANGELOG.md +20501 -0
- data/README.md +163 -0
- data/docker-compose.yml +27 -0
- data/docs/Gemfile +8 -0
- data/docs/bin/middleman +29 -0
- data/docs/config.rb +87 -0
- data/docs/config.ru +7 -0
- data/docs/data/articles.yml +157 -0
- data/docs/package.json +15 -0
- data/docs/source/404.html.erb +13 -0
- data/docs/source/articles/access-routes-in-javascript.html.md +33 -0
- data/docs/source/articles/add-a-content-area.html.md +169 -0
- data/docs/source/articles/add-a-content-block-type.html.md +334 -0
- data/docs/source/articles/add-a-report.html.md +202 -0
- data/docs/source/articles/add-css-through-the-admin-ui.html.md +30 -0
- data/docs/source/articles/add-javascript-through-a-manifest.html.md +367 -0
- data/docs/source/articles/add-javascript-through-a-view.html.md +80 -0
- data/docs/source/articles/add-javascript-through-the-admin-ui.html.md +30 -0
- data/docs/source/articles/add-metrics.html.md +58 -0
- data/docs/source/articles/add-or-replace-a-pricing-calculator.html.md +150 -0
- data/docs/source/articles/add-remove-or-change-a-mongoid-validation.html.md +147 -0
- data/docs/source/articles/add-remove-or-change-a-product-template.html.md +142 -0
- data/docs/source/articles/add-remove-sort-and-group-storefront-search-filters.html.md +483 -0
- data/docs/source/articles/add-stylesheets-through-a-manifest.html.md +276 -0
- data/docs/source/articles/add-system-content.html.md +138 -0
- data/docs/source/articles/analytics-overview.html.md +51 -0
- data/docs/source/articles/analyze-storefront-search-results.html.md +261 -0
- data/docs/source/articles/api-overview.html.md +35 -0
- data/docs/source/articles/appending.html.md +506 -0
- data/docs/source/articles/application-document.html.md +88 -0
- data/docs/source/articles/automated-javascript-testing.html.md +162 -0
- data/docs/source/articles/b2b-overview.html.md +64 -0
- data/docs/source/articles/browser-and-device-support.html.md +47 -0
- data/docs/source/articles/change-product-placeholder-image.html.md +39 -0
- data/docs/source/articles/change-storefront-search-results.html.md +283 -0
- data/docs/source/articles/change-the-storefront-product-pricing-ui.html.md +348 -0
- data/docs/source/articles/change-the-storefront-search-filters-ui.html.md +103 -0
- data/docs/source/articles/checkout.html.md +479 -0
- data/docs/source/articles/commerce-model.html.md +164 -0
- data/docs/source/articles/configuration-for-hosting.html.md +106 -0
- data/docs/source/articles/configuration.html.md +406 -0
- data/docs/source/articles/configure-a-payment-gateway.html.md +58 -0
- data/docs/source/articles/configure-asset-storage.html.md +29 -0
- data/docs/source/articles/configure-asset-types.html.md +18 -0
- data/docs/source/articles/configure-contact-form-subjects-list.html.md +24 -0
- data/docs/source/articles/configure-imageoptim.html.md +23 -0
- data/docs/source/articles/configure-locales.html.md +45 -0
- data/docs/source/articles/configure-logins-and-authentication.html.md +42 -0
- data/docs/source/articles/configure-low-inventory-threshold.html.md +26 -0
- data/docs/source/articles/configure-product-image-sizes-and-processing.html.md +28 -0
- data/docs/source/articles/content.html.md +554 -0
- data/docs/source/articles/contentable.html.md +41 -0
- data/docs/source/articles/contribute-code.html.md +69 -0
- data/docs/source/articles/contribute-documentation.html.md +60 -0
- data/docs/source/articles/create-a-custom-discount.html.md +234 -0
- data/docs/source/articles/create-a-new-app.html.md +131 -0
- data/docs/source/articles/create-a-plugin.html.md +19 -0
- data/docs/source/articles/create-a-style-guide.html.md +71 -0
- data/docs/source/articles/create-a-theme.html.md +134 -0
- data/docs/source/articles/css-architectural-overview.html.md +89 -0
- data/docs/source/articles/customize-a-helper.html.md +91 -0
- data/docs/source/articles/decoration.html.md +415 -0
- data/docs/source/articles/define-and-configure-inventory-policies.html.md +107 -0
- data/docs/source/articles/documentation-style-guide.html.md +48 -0
- data/docs/source/articles/documentation.html.md +54 -0
- data/docs/source/articles/domain-modeling.html.md +82 -0
- data/docs/source/articles/error-pages.html.md.erb +95 -0
- data/docs/source/articles/extension-overview.html.md +152 -0
- data/docs/source/articles/favicon-support.html.md +112 -0
- data/docs/source/articles/feature-spec-helper-stylesheet.html.md +25 -0
- data/docs/source/articles/featurejs-and-feature-spec-helper.html.md +20 -0
- data/docs/source/articles/help-and-support.html.md +34 -0
- data/docs/source/articles/html-fragment-caching.html.md +46 -0
- data/docs/source/articles/http-caching.html.md +43 -0
- data/docs/source/articles/i18n.html.md +35 -0
- data/docs/source/articles/images-flow.html.md +10 -0
- data/docs/source/articles/index-storefront-search-documents.html.md +104 -0
- data/docs/source/articles/infrastructure.html.md +46 -0
- data/docs/source/articles/installing.html.md +61 -0
- data/docs/source/articles/integrate-a-payment-gateway.html.md +124 -0
- data/docs/source/articles/integrate-a-web-analytics-provider.html.md +35 -0
- data/docs/source/articles/integrate-an-inventory-management-system.html.md +88 -0
- data/docs/source/articles/integrating-with-other-software.html.md +59 -0
- data/docs/source/articles/inventory.html.md +352 -0
- data/docs/source/articles/javascript-coding-standards.html.md +30 -0
- data/docs/source/articles/javascript-modules.html.md +174 -0
- data/docs/source/articles/javascript-overview.html.md +62 -0
- data/docs/source/articles/javascript-reference-documentation.html.md +51 -0
- data/docs/source/articles/javascript-templates.html.md +52 -0
- data/docs/source/articles/low-level-caching.html.md +25 -0
- data/docs/source/articles/maintain-a-plugin.html.md +12 -0
- data/docs/source/articles/maintenance-policy.html.md +79 -0
- data/docs/source/articles/navigable.html.md +51 -0
- data/docs/source/articles/navigating-the-code.html.md +149 -0
- data/docs/source/articles/navigation.html.md +386 -0
- data/docs/source/articles/order-life-cycle.html.md +546 -0
- data/docs/source/articles/order-pricing.html.md +389 -0
- data/docs/source/articles/orders-and-items.html.md +210 -0
- data/docs/source/articles/orders.html.md +66 -0
- data/docs/source/articles/overriding.html.md +155 -0
- data/docs/source/articles/overview.html.md +43 -0
- data/docs/source/articles/plugins-overview.html.md +12 -0
- data/docs/source/articles/prerequisites-and-dependencies.html.md +202 -0
- data/docs/source/articles/products.html.md.erb +1270 -0
- data/docs/source/articles/progressive-web-application-support.html.md +148 -0
- data/docs/source/articles/rails-asset-manifests.html.md +33 -0
- data/docs/source/articles/rails-asset-view-helpers.html.md +25 -0
- data/docs/source/articles/reading-data.html.md +10 -0
- data/docs/source/articles/releasable.html.md +37 -0
- data/docs/source/articles/report-a-bug.html.md +75 -0
- data/docs/source/articles/ruby-coding-standards.html.md +10 -0
- data/docs/source/articles/run-sidekiq-in-a-local-environment.html.md +40 -0
- data/docs/source/articles/searching.html.md +1005 -0
- data/docs/source/articles/security-policy.html.md +42 -0
- data/docs/source/articles/seeds.html.md +345 -0
- data/docs/source/articles/shipping.html.md +756 -0
- data/docs/source/articles/sort-and-exclude-product-options.html.md +47 -0
- data/docs/source/articles/storefront-search-features.html.md +568 -0
- data/docs/source/articles/storefront-searches.html.md +126 -0
- data/docs/source/articles/style-guides.html.md +21 -0
- data/docs/source/articles/stylesheet-coding-standards.html.md +24 -0
- data/docs/source/articles/stylesheets-overview.html.md +67 -0
- data/docs/source/articles/swappable-list-data-structure.html.md +81 -0
- data/docs/source/articles/system-emails.html.md +102 -0
- data/docs/source/articles/taggable.html.md +8 -0
- data/docs/source/articles/test-a-credit-card-transaction.html.md +16 -0
- data/docs/source/articles/test-if-a-plugin-is-installed.html.md +34 -0
- data/docs/source/articles/testing.html.md +914 -0
- data/docs/source/articles/themes-overview.html.md +155 -0
- data/docs/source/articles/translate-administrable-content.html.md +14 -0
- data/docs/source/articles/translate-javascript-content.html.md +16 -0
- data/docs/source/articles/translate-or-customize-message-content.html.md +29 -0
- data/docs/source/articles/translate-or-customize-static-content.html.md +30 -0
- data/docs/source/articles/use-an-existing-workarea-app.html.md +108 -0
- data/docs/source/articles/view-models.html.md +509 -0
- data/docs/source/articles/views.html.md +14 -0
- data/docs/source/articles/workers.html.md +613 -0
- data/docs/source/articles/writing-data.html.md +10 -0
- data/docs/source/cli.html.md +163 -0
- data/docs/source/favicon.ico +0 -0
- data/docs/source/images/3-variants-1-option.png +0 -0
- data/docs/source/images/3-variants-3-options.png +0 -0
- data/docs/source/images/3-years-primary-image.png +0 -0
- data/docs/source/images/404-storefront-error-page.png +0 -0
- data/docs/source/images/404-system-content-admin.png +0 -0
- data/docs/source/images/404.jpg +0 -0
- data/docs/source/images/5-years-primary-image.png +0 -0
- data/docs/source/images/activity-dashboard.png +0 -0
- data/docs/source/images/activity-for-object.png +0 -0
- data/docs/source/images/activity-ui.png +0 -0
- data/docs/source/images/adding-captioned-image-block-custom-icon.png +0 -0
- data/docs/source/images/adding-captioned-image-block-default-icon.png +0 -0
- data/docs/source/images/admin-alerts-ui.png +0 -0
- data/docs/source/images/admin-category-range-filters.png +0 -0
- data/docs/source/images/admin-for-3-column-hero.png +0 -0
- data/docs/source/images/admin-help-index.png +0 -0
- data/docs/source/images/admin-help-ui.png +0 -0
- data/docs/source/images/admin-javascript.png +0 -0
- data/docs/source/images/admin-notification-for-deactivated-discount.png +0 -0
- data/docs/source/images/admin-notifications-ui.png +0 -0
- data/docs/source/images/admin-product-show-page.png +0 -0
- data/docs/source/images/admin-products-index-page.png +0 -0
- data/docs/source/images/admin-range-filters.png +0 -0
- data/docs/source/images/admin-style-guides-navigation.png +0 -0
- data/docs/source/images/after-re-seeding.png +0 -0
- data/docs/source/images/after-seeding-localhost-3000.png +0 -0
- data/docs/source/images/after-seeding.png +0 -0
- data/docs/source/images/arrow.svg +1 -0
- data/docs/source/images/arrow_white.svg +1 -0
- data/docs/source/images/aws-resource-map.png +0 -0
- data/docs/source/images/backordered-until-output-on-inventory-sku-card.png +0 -0
- data/docs/source/images/before-seeding-localhost-3000.png +0 -0
- data/docs/source/images/before-seeding.png +0 -0
- data/docs/source/images/browsing-workarea-versions-on-the-web.png +0 -0
- data/docs/source/images/bulk-asset-upload-on-assets-index-page.png +0 -0
- data/docs/source/images/bulk-asset-upload-while-editing-content.png +0 -0
- data/docs/source/images/bundle-show-workarea-core.png +0 -0
- data/docs/source/images/bundle-show-workarea.png +0 -0
- data/docs/source/images/calendar-for-backordered-until-field.png +0 -0
- data/docs/source/images/captioned-image-block-in-storefront.png +0 -0
- data/docs/source/images/captioned-image-content-block-storefront-component-style-guide.png +0 -0
- data/docs/source/images/cart-system-content-in-admin.png +0 -0
- data/docs/source/images/cart-system-content-in-storefront.png +0 -0
- data/docs/source/images/checkout-addresses-guest.png +0 -0
- data/docs/source/images/checkout-addresses-user.png +0 -0
- data/docs/source/images/checkout-confirmation.png +0 -0
- data/docs/source/images/checkout-flow-0.png +0 -0
- data/docs/source/images/checkout-flow-1.png +0 -0
- data/docs/source/images/checkout-flow-2.png +0 -0
- data/docs/source/images/checkout-flow-3.png +0 -0
- data/docs/source/images/checkout-flow-4.png +0 -0
- data/docs/source/images/checkout-payment-guest.png +0 -0
- data/docs/source/images/checkout-payment-user.png +0 -0
- data/docs/source/images/checkout-shipping.png +0 -0
- data/docs/source/images/color-picker-component-admin-style-guide.png +0 -0
- data/docs/source/images/color-picker-component-on-content-editing-screen.png +0 -0
- data/docs/source/images/commerce-model-carts-orders.png +0 -0
- data/docs/source/images/commerce-model-order-pricing.png +0 -0
- data/docs/source/images/commerce-model.png +0 -0
- data/docs/source/images/configuring-an-index-pattern-in-kibana.png +0 -0
- data/docs/source/images/content-block-presets.png +0 -0
- data/docs/source/images/content-search-customization.png +0 -0
- data/docs/source/images/country-with-region-data-in-address-form.png +0 -0
- data/docs/source/images/country-without-region-data-in-address-form.png +0 -0
- data/docs/source/images/create-content-block-preset-ui.png +0 -0
- data/docs/source/images/credit-card-icons.png +0 -0
- data/docs/source/images/css-added-through-admin.png +0 -0
- data/docs/source/images/css-admin-ui.png +0 -0
- data/docs/source/images/current-configuration-shown-in-admin-settings.png +0 -0
- data/docs/source/images/customer-impersonation-in-admin.png +0 -0
- data/docs/source/images/customer-impersonation-in-store-front.png +0 -0
- data/docs/source/images/date-filter-same-day.png +0 -0
- data/docs/source/images/developer-toolbar-in-store-front.png +0 -0
- data/docs/source/images/discounts-sorted-by-most-redeemed.png +0 -0
- data/docs/source/images/edit-help-article.png +0 -0
- data/docs/source/images/editing-content-for-search-customization.png +0 -0
- data/docs/source/images/editing-dynamic-captioned-image-block.png +0 -0
- data/docs/source/images/editing-product-fields-in-the-admin.png +0 -0
- data/docs/source/images/editing-search-system-content.png +0 -0
- data/docs/source/images/editing-static-captioned-image-block-custom-icon.png +0 -0
- data/docs/source/images/editing-static-captioned-image-block-default-icon.png +0 -0
- data/docs/source/images/external.svg +1 -0
- data/docs/source/images/favicon_16.png +0 -0
- data/docs/source/images/favicon_180.png +0 -0
- data/docs/source/images/favicon_32.png +0 -0
- data/docs/source/images/filters-all.png +0 -0
- data/docs/source/images/filters-control.png +0 -0
- data/docs/source/images/filters-custom.png +0 -0
- data/docs/source/images/filters-groups.png +0 -0
- data/docs/source/images/filters-material.png +0 -0
- data/docs/source/images/filters-omitted.png +0 -0
- data/docs/source/images/filters-pinned.png +0 -0
- data/docs/source/images/filters-range.png +0 -0
- data/docs/source/images/filters-sorted.png +0 -0
- data/docs/source/images/filters-wrapping-to-second-line-in-admin.png +0 -0
- data/docs/source/images/generic-product-template-images-no-options-selected.png +0 -0
- data/docs/source/images/generic-product-template-images-options-selected.png +0 -0
- data/docs/source/images/generic-template.png +0 -0
- data/docs/source/images/hosting.svg +1 -0
- data/docs/source/images/image-group-content-block-in-storefront.png +0 -0
- data/docs/source/images/images.svg +1 -0
- data/docs/source/images/import-export-screenshot.png +0 -0
- data/docs/source/images/invalid-display.png +0 -0
- data/docs/source/images/itcss.png +0 -0
- data/docs/source/images/kibana-dev-tools-console.png +0 -0
- data/docs/source/images/layout-content-admin-with-2-areas.png +0 -0
- data/docs/source/images/layout-content-admin-with-3-areas.png +0 -0
- data/docs/source/images/link-to-search-system-content.png +0 -0
- data/docs/source/images/logo.svg +1 -0
- data/docs/source/images/menu.svg +2 -0
- data/docs/source/images/mongo-replica-set.svg +1 -0
- data/docs/source/images/multi-column-hero-blocks.png +0 -0
- data/docs/source/images/option-selects-product-template-images-options-selected.png +0 -0
- data/docs/source/images/option-selects-template.png +0 -0
- data/docs/source/images/option-thumbnails-template.png +0 -0
- data/docs/source/images/order-item-total-price-diagram.png +0 -0
- data/docs/source/images/order-pricing-cart-example.png +0 -0
- data/docs/source/images/order-pricing-example-adjustments.png +0 -0
- data/docs/source/images/order-pricing-example-totals.png +0 -0
- data/docs/source/images/order-pricing-placed-order-example.png +0 -0
- data/docs/source/images/order-shipping-total-diagram.png +0 -0
- data/docs/source/images/order-show-with-multiple-tenders.png +0 -0
- data/docs/source/images/order-subtotal-price-diagram.png +0 -0
- data/docs/source/images/order-tax-total-diagram.png +0 -0
- data/docs/source/images/order-total-price-diagram.png +0 -0
- data/docs/source/images/order-total-value-diagram.png +0 -0
- data/docs/source/images/orders-dashboard-links.png +0 -0
- data/docs/source/images/oval.svg +1 -0
- data/docs/source/images/payment-icon-storefront-style-guide.png +0 -0
- data/docs/source/images/people-dashboard-links.png +0 -0
- data/docs/source/images/price-adjustments-diagram.png +0 -0
- data/docs/source/images/price-display-no-options.png +0 -0
- data/docs/source/images/price-display-options-selected.png +0 -0
- data/docs/source/images/pricing-calculators-diagram.png +0 -0
- data/docs/source/images/product-list-content-block-admin.png +0 -0
- data/docs/source/images/product-list-content-block-in-store-front.png +0 -0
- data/docs/source/images/promo-products-excluded-autocomplete-results-after.png +0 -0
- data/docs/source/images/promo-products-excluded-featured-category-results-after.png +0 -0
- data/docs/source/images/promo-products-excluded-recommendations-results-after.png +0 -0
- data/docs/source/images/promo-products-excluded-search-category-results-after.png +0 -0
- data/docs/source/images/promo-products-excluded-search-results-after.png +0 -0
- data/docs/source/images/promo-products-included-autocomplete-results-before.png +0 -0
- data/docs/source/images/promo-products-included-featured-category-results-before.png +0 -0
- data/docs/source/images/promo-products-included-recommendations-results-before.png +0 -0
- data/docs/source/images/promo-products-included-search-category-results-before.png +0 -0
- data/docs/source/images/promo-products-included-search-results-before.png +0 -0
- data/docs/source/images/rails-version-constraint.png +0 -0
- data/docs/source/images/re-enable-discount.png +0 -0
- data/docs/source/images/reading-data.svg +1 -0
- data/docs/source/images/readme-hero.png +0 -0
- data/docs/source/images/redesigned-customized-sort-for-search-results.png +0 -0
- data/docs/source/images/reviews-summary-above-share-buttons.png +0 -0
- data/docs/source/images/reviews-summary-below-product-name.png +0 -0
- data/docs/source/images/reviews-summary-below-share-buttons.png +0 -0
- data/docs/source/images/reviews-summary-removed.png +0 -0
- data/docs/source/images/rsa-fingerprint-for-stash.png +0 -0
- data/docs/source/images/ruby-version-constraint.png +0 -0
- data/docs/source/images/script-tag-added-through-admin.png +0 -0
- data/docs/source/images/search-analysis-admin-alternate-rendering.png +0 -0
- data/docs/source/images/search-analysis-admin.png +0 -0
- data/docs/source/images/search-quality-report.png +0 -0
- data/docs/source/images/search.svg +1 -0
- data/docs/source/images/searching-for-cart-system-content-in-admin.png +0 -0
- data/docs/source/images/searching-for-layout-system-content-in-admin.png +0 -0
- data/docs/source/images/seeded-admin.png +0 -0
- data/docs/source/images/seeds-from-plugins.png +0 -0
- data/docs/source/images/seo-metadata-automation-ui.png +0 -0
- data/docs/source/images/show-password-button.png +0 -0
- data/docs/source/images/storefront-autocomplete.png +0 -0
- data/docs/source/images/storefront-category-summary-content-block.png +0 -0
- data/docs/source/images/storefront-category.png +0 -0
- data/docs/source/images/storefront-product-after-overriding.png +0 -0
- data/docs/source/images/storefront-product-before-overriding.png +0 -0
- data/docs/source/images/storefront-product-browse-page.png +0 -0
- data/docs/source/images/storefront-product-recommendations.png +0 -0
- data/docs/source/images/storefront-product-show-page.png +0 -0
- data/docs/source/images/storefront-requests-and-search-requests.png +0 -0
- data/docs/source/images/storefront-search-request-handling.png +0 -0
- data/docs/source/images/storefront-search-response-creation.png +0 -0
- data/docs/source/images/storefront-search.png +0 -0
- data/docs/source/images/storefront-style-guides-navigation.png +0 -0
- data/docs/source/images/styles.css +3 -0
- data/docs/source/images/tax-categories-ui.png +0 -0
- data/docs/source/images/tax-rates-ui.png +0 -0
- data/docs/source/images/unpurchasable-product.png +0 -0
- data/docs/source/images/url-redirects-filtering.png +0 -0
- data/docs/source/images/utility-nav-area-in-admin.png +0 -0
- data/docs/source/images/utility-nav-area-in-storefront.png +0 -0
- data/docs/source/images/validation-message-in-storefront.png +0 -0
- data/docs/source/images/view-model-interface.png +0 -0
- data/docs/source/images/viewing-workarea-version-in-source.png +0 -0
- data/docs/source/images/workarea.svg +1 -0
- data/docs/source/images/worst-performing-searches-on-results-customization-page.png +0 -0
- data/docs/source/images/writing-data.svg +1 -0
- data/docs/source/index.html.erb +167 -0
- data/docs/source/javascripts/jquery.js +2 -0
- data/docs/source/javascripts/lunr.js +7 -0
- data/docs/source/javascripts/site.js +299 -0
- data/docs/source/javascripts/vendor/highlight.pack.js +2 -0
- data/docs/source/layouts/article.erb +106 -0
- data/docs/source/layouts/bare.erb +46 -0
- data/docs/source/layouts/layout.erb +43 -0
- data/docs/source/release-notes.html.md +258 -0
- data/docs/source/release-notes/workarea-3-0-0.html.md +146 -0
- data/docs/source/release-notes/workarea-3-0-1.html.md +161 -0
- data/docs/source/release-notes/workarea-3-0-10.html.md +39 -0
- data/docs/source/release-notes/workarea-3-0-11.html.md +277 -0
- data/docs/source/release-notes/workarea-3-0-12.html.md +14 -0
- data/docs/source/release-notes/workarea-3-0-13.html.md +153 -0
- data/docs/source/release-notes/workarea-3-0-14.html.md +93 -0
- data/docs/source/release-notes/workarea-3-0-15.html.md +107 -0
- data/docs/source/release-notes/workarea-3-0-16.html.md +36 -0
- data/docs/source/release-notes/workarea-3-0-17.html.md +141 -0
- data/docs/source/release-notes/workarea-3-0-18.html.md +123 -0
- data/docs/source/release-notes/workarea-3-0-19.html.md +160 -0
- data/docs/source/release-notes/workarea-3-0-2.html.md +222 -0
- data/docs/source/release-notes/workarea-3-0-20.html.md +95 -0
- data/docs/source/release-notes/workarea-3-0-21.html.md +168 -0
- data/docs/source/release-notes/workarea-3-0-22.html.md +268 -0
- data/docs/source/release-notes/workarea-3-0-23.html.md +173 -0
- data/docs/source/release-notes/workarea-3-0-24.html.md +19 -0
- data/docs/source/release-notes/workarea-3-0-25.html.md +26 -0
- data/docs/source/release-notes/workarea-3-0-26.html.md +199 -0
- data/docs/source/release-notes/workarea-3-0-27.html.md +113 -0
- data/docs/source/release-notes/workarea-3-0-28.html.md +39 -0
- data/docs/source/release-notes/workarea-3-0-29.html.md +73 -0
- data/docs/source/release-notes/workarea-3-0-3.html.md +35 -0
- data/docs/source/release-notes/workarea-3-0-30.html.md +186 -0
- data/docs/source/release-notes/workarea-3-0-31.html.md +125 -0
- data/docs/source/release-notes/workarea-3-0-32.html.md +73 -0
- data/docs/source/release-notes/workarea-3-0-33.html.md +137 -0
- data/docs/source/release-notes/workarea-3-0-34.html.md +203 -0
- data/docs/source/release-notes/workarea-3-0-35.html.md +205 -0
- data/docs/source/release-notes/workarea-3-0-36.html.md +105 -0
- data/docs/source/release-notes/workarea-3-0-37.html.md +144 -0
- data/docs/source/release-notes/workarea-3-0-38.html.md +73 -0
- data/docs/source/release-notes/workarea-3-0-39.html.md +77 -0
- data/docs/source/release-notes/workarea-3-0-4.html.md +14 -0
- data/docs/source/release-notes/workarea-3-0-40.html.md +130 -0
- data/docs/source/release-notes/workarea-3-0-41.html.md +70 -0
- data/docs/source/release-notes/workarea-3-0-42.html.md +52 -0
- data/docs/source/release-notes/workarea-3-0-43.html.md +72 -0
- data/docs/source/release-notes/workarea-3-0-44.html.md +93 -0
- data/docs/source/release-notes/workarea-3-0-45.html.md +61 -0
- data/docs/source/release-notes/workarea-3-0-46.html.md +171 -0
- data/docs/source/release-notes/workarea-3-0-47.html.md +130 -0
- data/docs/source/release-notes/workarea-3-0-48.html.md +160 -0
- data/docs/source/release-notes/workarea-3-0-49.html.md +28 -0
- data/docs/source/release-notes/workarea-3-0-5.html.md +225 -0
- data/docs/source/release-notes/workarea-3-0-50.html.md +74 -0
- data/docs/source/release-notes/workarea-3-0-51.html.md +61 -0
- data/docs/source/release-notes/workarea-3-0-52.html.md +76 -0
- data/docs/source/release-notes/workarea-3-0-53.html.md +126 -0
- data/docs/source/release-notes/workarea-3-0-54.html.md +112 -0
- data/docs/source/release-notes/workarea-3-0-55.html.md +105 -0
- data/docs/source/release-notes/workarea-3-0-56.html.md +56 -0
- data/docs/source/release-notes/workarea-3-0-57.html.md +82 -0
- data/docs/source/release-notes/workarea-3-0-58.html.md +153 -0
- data/docs/source/release-notes/workarea-3-0-59.html.md +78 -0
- data/docs/source/release-notes/workarea-3-0-6.html.md +165 -0
- data/docs/source/release-notes/workarea-3-0-60.html.md +43 -0
- data/docs/source/release-notes/workarea-3-0-61.html.md +46 -0
- data/docs/source/release-notes/workarea-3-0-62.html.md +23 -0
- data/docs/source/release-notes/workarea-3-0-63.html.md +25 -0
- data/docs/source/release-notes/workarea-3-0-64.html.md +25 -0
- data/docs/source/release-notes/workarea-3-0-65.html.md +37 -0
- data/docs/source/release-notes/workarea-3-0-7.html.md +207 -0
- data/docs/source/release-notes/workarea-3-0-8.html.md +337 -0
- data/docs/source/release-notes/workarea-3-0-9.html.md +196 -0
- data/docs/source/release-notes/workarea-3-1-0.html.md +414 -0
- data/docs/source/release-notes/workarea-3-1-1.html.md +139 -0
- data/docs/source/release-notes/workarea-3-1-10.html.md +19 -0
- data/docs/source/release-notes/workarea-3-1-11.html.md +27 -0
- data/docs/source/release-notes/workarea-3-1-12.html.md +216 -0
- data/docs/source/release-notes/workarea-3-1-13.html.md +113 -0
- data/docs/source/release-notes/workarea-3-1-14.html.md +39 -0
- data/docs/source/release-notes/workarea-3-1-15.html.md +107 -0
- data/docs/source/release-notes/workarea-3-1-16.html.md +188 -0
- data/docs/source/release-notes/workarea-3-1-17.html.md +141 -0
- data/docs/source/release-notes/workarea-3-1-18.html.md +73 -0
- data/docs/source/release-notes/workarea-3-1-19.html.md +137 -0
- data/docs/source/release-notes/workarea-3-1-2.html.md +55 -0
- data/docs/source/release-notes/workarea-3-1-20.html.md +203 -0
- data/docs/source/release-notes/workarea-3-1-21.html.md +205 -0
- data/docs/source/release-notes/workarea-3-1-22.html.md +121 -0
- data/docs/source/release-notes/workarea-3-1-23.html.md +144 -0
- data/docs/source/release-notes/workarea-3-1-24.html.md +94 -0
- data/docs/source/release-notes/workarea-3-1-25.html.md +77 -0
- data/docs/source/release-notes/workarea-3-1-26.html.md +130 -0
- data/docs/source/release-notes/workarea-3-1-27.html.md +70 -0
- data/docs/source/release-notes/workarea-3-1-28.html.md +52 -0
- data/docs/source/release-notes/workarea-3-1-29.html.md +44 -0
- data/docs/source/release-notes/workarea-3-1-3.html.md +185 -0
- data/docs/source/release-notes/workarea-3-1-30.html.md +72 -0
- data/docs/source/release-notes/workarea-3-1-31.html.md +93 -0
- data/docs/source/release-notes/workarea-3-1-32.html.md +61 -0
- data/docs/source/release-notes/workarea-3-1-33.html.md +171 -0
- data/docs/source/release-notes/workarea-3-1-34.html.md +130 -0
- data/docs/source/release-notes/workarea-3-1-35.html.md +179 -0
- data/docs/source/release-notes/workarea-3-1-36.html.md +28 -0
- data/docs/source/release-notes/workarea-3-1-37.html.md +74 -0
- data/docs/source/release-notes/workarea-3-1-38.html.md +61 -0
- data/docs/source/release-notes/workarea-3-1-39.html.md +96 -0
- data/docs/source/release-notes/workarea-3-1-4.html.md +148 -0
- data/docs/source/release-notes/workarea-3-1-40.html.md +126 -0
- data/docs/source/release-notes/workarea-3-1-41.html.md +128 -0
- data/docs/source/release-notes/workarea-3-1-42.html.md +105 -0
- data/docs/source/release-notes/workarea-3-1-43.html.md +37 -0
- data/docs/source/release-notes/workarea-3-1-44.html.md +82 -0
- data/docs/source/release-notes/workarea-3-1-45.html.md +153 -0
- data/docs/source/release-notes/workarea-3-1-46.html.md +91 -0
- data/docs/source/release-notes/workarea-3-1-47.html.md +65 -0
- data/docs/source/release-notes/workarea-3-1-48.html.md +46 -0
- data/docs/source/release-notes/workarea-3-1-49.html.md +23 -0
- data/docs/source/release-notes/workarea-3-1-5.html.md +169 -0
- data/docs/source/release-notes/workarea-3-1-50.html.md +42 -0
- data/docs/source/release-notes/workarea-3-1-51.html.md +25 -0
- data/docs/source/release-notes/workarea-3-1-52.html.md +57 -0
- data/docs/source/release-notes/workarea-3-1-6.html.md +117 -0
- data/docs/source/release-notes/workarea-3-1-7.html.md +176 -0
- data/docs/source/release-notes/workarea-3-1-8.html.md +283 -0
- data/docs/source/release-notes/workarea-3-1-9.html.md +212 -0
- data/docs/source/release-notes/workarea-3-2-0.html.md +1705 -0
- data/docs/source/release-notes/workarea-3-2-1.html.md +216 -0
- data/docs/source/release-notes/workarea-3-2-10.html.md +237 -0
- data/docs/source/release-notes/workarea-3-2-11.html.md +121 -0
- data/docs/source/release-notes/workarea-3-2-12.html.md +145 -0
- data/docs/source/release-notes/workarea-3-2-13.html.md +138 -0
- data/docs/source/release-notes/workarea-3-2-14.html.md +77 -0
- data/docs/source/release-notes/workarea-3-2-15.html.md +130 -0
- data/docs/source/release-notes/workarea-3-2-16.html.md +111 -0
- data/docs/source/release-notes/workarea-3-2-17.html.md +52 -0
- data/docs/source/release-notes/workarea-3-2-18.html.md +44 -0
- data/docs/source/release-notes/workarea-3-2-19.html.md +72 -0
- data/docs/source/release-notes/workarea-3-2-2.html.md +145 -0
- data/docs/source/release-notes/workarea-3-2-20.html.md +93 -0
- data/docs/source/release-notes/workarea-3-2-21.html.md +61 -0
- data/docs/source/release-notes/workarea-3-2-22.html.md +154 -0
- data/docs/source/release-notes/workarea-3-2-23.html.md +130 -0
- data/docs/source/release-notes/workarea-3-2-24.html.md +200 -0
- data/docs/source/release-notes/workarea-3-2-25.html.md +28 -0
- data/docs/source/release-notes/workarea-3-2-26.html.md +94 -0
- data/docs/source/release-notes/workarea-3-2-27.html.md +61 -0
- data/docs/source/release-notes/workarea-3-2-28.html.md +96 -0
- data/docs/source/release-notes/workarea-3-2-29.html.md +126 -0
- data/docs/source/release-notes/workarea-3-2-30.html.md +112 -0
- data/docs/source/release-notes/workarea-3-2-31.html.md +105 -0
- data/docs/source/release-notes/workarea-3-2-32.html.md +56 -0
- data/docs/source/release-notes/workarea-3-2-33.html.md +82 -0
- data/docs/source/release-notes/workarea-3-2-34.html.md +153 -0
- data/docs/source/release-notes/workarea-3-2-35.html.md +91 -0
- data/docs/source/release-notes/workarea-3-2-36.html.md +118 -0
- data/docs/source/release-notes/workarea-3-2-37.html.md +46 -0
- data/docs/source/release-notes/workarea-3-2-38.html.md +23 -0
- data/docs/source/release-notes/workarea-3-2-39.html.md +42 -0
- data/docs/source/release-notes/workarea-3-2-4.html.md +109 -0
- data/docs/source/release-notes/workarea-3-2-40.html.md +25 -0
- data/docs/source/release-notes/workarea-3-2-41.html.md +90 -0
- data/docs/source/release-notes/workarea-3-2-5.html.md +186 -0
- data/docs/source/release-notes/workarea-3-2-6.html.md +173 -0
- data/docs/source/release-notes/workarea-3-2-7.html.md +89 -0
- data/docs/source/release-notes/workarea-3-2-8.html.md +137 -0
- data/docs/source/release-notes/workarea-3-2-9.html.md +219 -0
- data/docs/source/release-notes/workarea-3-3-0.html.md +1272 -0
- data/docs/source/release-notes/workarea-3-3-1.html.md +324 -0
- data/docs/source/release-notes/workarea-3-3-10.html.md +69 -0
- data/docs/source/release-notes/workarea-3-3-11.html.md +72 -0
- data/docs/source/release-notes/workarea-3-3-12.html.md +136 -0
- data/docs/source/release-notes/workarea-3-3-13.html.md +61 -0
- data/docs/source/release-notes/workarea-3-3-14.html.md +196 -0
- data/docs/source/release-notes/workarea-3-3-15.html.md +167 -0
- data/docs/source/release-notes/workarea-3-3-16.html.md +234 -0
- data/docs/source/release-notes/workarea-3-3-17.html.md +82 -0
- data/docs/source/release-notes/workarea-3-3-18.html.md +165 -0
- data/docs/source/release-notes/workarea-3-3-19.html.md +106 -0
- data/docs/source/release-notes/workarea-3-3-2.html.md +72 -0
- data/docs/source/release-notes/workarea-3-3-20.html.md +116 -0
- data/docs/source/release-notes/workarea-3-3-21.html.md +228 -0
- data/docs/source/release-notes/workarea-3-3-22.html.md +125 -0
- data/docs/source/release-notes/workarea-3-3-23.html.md +154 -0
- data/docs/source/release-notes/workarea-3-3-24.html.md +70 -0
- data/docs/source/release-notes/workarea-3-3-25.html.md +114 -0
- data/docs/source/release-notes/workarea-3-3-26.html.md +260 -0
- data/docs/source/release-notes/workarea-3-3-27.html.md +138 -0
- data/docs/source/release-notes/workarea-3-3-28.html.md +147 -0
- data/docs/source/release-notes/workarea-3-3-29.html.md +63 -0
- data/docs/source/release-notes/workarea-3-3-3.html.md +153 -0
- data/docs/source/release-notes/workarea-3-3-30.html.md +102 -0
- data/docs/source/release-notes/workarea-3-3-31.html.md +57 -0
- data/docs/source/release-notes/workarea-3-3-32.html.md +44 -0
- data/docs/source/release-notes/workarea-3-3-33.html.md +114 -0
- data/docs/source/release-notes/workarea-3-3-4.html.md +332 -0
- data/docs/source/release-notes/workarea-3-3-5.html.md +242 -0
- data/docs/source/release-notes/workarea-3-3-6.html.md +100 -0
- data/docs/source/release-notes/workarea-3-3-7.html.md +148 -0
- data/docs/source/release-notes/workarea-3-3-8.html.md +163 -0
- data/docs/source/release-notes/workarea-3-3-9.html.md +93 -0
- data/docs/source/release-notes/workarea-3-4-0.html.md +580 -0
- data/docs/source/release-notes/workarea-3-4-1.html.md +150 -0
- data/docs/source/release-notes/workarea-3-4-10.html.md +72 -0
- data/docs/source/release-notes/workarea-3-4-11.html.md +60 -0
- data/docs/source/release-notes/workarea-3-4-12.html.md +155 -0
- data/docs/source/release-notes/workarea-3-4-2.html.md +188 -0
- data/docs/source/release-notes/workarea-3-4-3.html.md +136 -0
- data/docs/source/release-notes/workarea-3-4-4.html.md +114 -0
- data/docs/source/release-notes/workarea-3-4-5.html.md +275 -0
- data/docs/source/release-notes/workarea-3-4-6.html.md +169 -0
- data/docs/source/release-notes/workarea-3-4-7.html.md +162 -0
- data/docs/source/release-notes/workarea-3-4-8.html.md +95 -0
- data/docs/source/release-notes/workarea-3-4-9.html.md +135 -0
- data/docs/source/search.html.erb +34 -0
- data/docs/source/shared/_header.erb +61 -0
- data/docs/source/shared/_svgs.erb +17 -0
- data/docs/source/style_guide/index.html.erb +382 -0
- data/docs/source/stylesheets/_base.scss +125 -0
- data/docs/source/stylesheets/_components.scss +669 -0
- data/docs/source/stylesheets/_helpers.scss +10 -0
- data/docs/source/stylesheets/_opinions.scss +42 -0
- data/docs/source/stylesheets/_settings.scss +56 -0
- data/docs/source/stylesheets/_typography.scss +119 -0
- data/docs/source/stylesheets/site.css.scss +14 -0
- data/docs/source/stylesheets/vendor/_avalanche.scss +328 -0
- data/docs/source/stylesheets/vendor/_normalize.scss +341 -0
- data/docs/source/stylesheets/vendor/highlight/_tomorrow_night_blue.scss +75 -0
- data/docs/source/upgrade-guides.html.md +18 -0
- data/docs/source/upgrade-guides/workarea-3-4-0.html.md +152 -0
- data/docs/workarea_renderer.rb +8 -0
- data/docs/yarn.lock +2522 -0
- metadata +669 -0
@@ -0,0 +1,80 @@
|
|
1
|
+
---
|
2
|
+
title: Add JavaScript through a View
|
3
|
+
excerpt: 'Note: First of all, are you sure?! Assets added to views are not optimized in any way for production environments like assets added through manifests. Peppering your views with JavaScript also makes your application more difficult to debug and maintai'
|
4
|
+
---
|
5
|
+
|
6
|
+
# Add JavaScript through a View
|
7
|
+
|
8
|
+
**Note:** **First of all, are you sure?!** Assets added to views are not optimized in any way for production environments like [assets added through manifests](add-javascript-through-a-manifest.html). Peppering your views with JavaScript also makes your application more difficult to debug and maintain. However, there are legitimate reasons to add JavaScripts in this way, so read on!
|
9
|
+
|
10
|
+
## JavaScript Haml Filter
|
11
|
+
|
12
|
+
To include JavaScript directly in a Haml view, use the nifty `:javascript` filter. Haml sees the contents as JavaScript and wraps them in a `script` tag when rendered as HTML.
|
13
|
+
|
14
|
+
```
|
15
|
+
:javascript
|
16
|
+
alert('foo');
|
17
|
+
```
|
18
|
+
|
19
|
+
The script tag will be output exactly where you put it in the view.
|
20
|
+
|
21
|
+
Libraries like jQuery, which are included at the bottom of the layout in the application manifest, aren't defined yet. Your inline script can't use them, which may be undesirable. To output the script tag below the application manifest, use `content_for(:javascript)`.
|
22
|
+
|
23
|
+
## content\_for(:javascript)
|
24
|
+
|
25
|
+
By wrapping your JavaScript in content\_for(:javascript), it will be output wherever `yield :javascript` appears in the layout. By default, this is output directly after the application.js manifest in each Workarea layout. Note that the `:javascript` identifier in this case is just a way of matching up `content_for` with `yield`, as described in the [Layouts & Rendering Rails guide](http://guides.rubyonrails.org/layouts_and_rendering.html). The example below combines `content_for(:javascript)` with the `:javascript` Haml filter.
|
26
|
+
|
27
|
+
```
|
28
|
+
- content_for :javascript do
|
29
|
+
:javascript
|
30
|
+
alert('foo');
|
31
|
+
```
|
32
|
+
|
33
|
+
No matter where you include that in the view, the rendered `script` element will be output at the bottom of the page, underneath the application manifest, providing access to all the scripts it contains.
|
34
|
+
|
35
|
+
## add\_javascript Helper
|
36
|
+
|
37
|
+
The `add_javascript` view helper, a Workarea feature, is esentially a shorthand for the above example. It takes a string of JavaScript code as its only argument. It calls `.html_safe` on the string to escape it, and wraps the string with an HTML script tag before outputting it into the layout at the location of `yield :javascript`. Therefore, the following code examples provide the same result.
|
38
|
+
|
39
|
+
```
|
40
|
+
- content_for :javascript do
|
41
|
+
:javascript
|
42
|
+
alert('foo');
|
43
|
+
```
|
44
|
+
|
45
|
+
```
|
46
|
+
- add_javascript "alert('foo');"
|
47
|
+
```
|
48
|
+
|
49
|
+
This helper is used primarily for internal use, as a macro at the top of several views to declaratively [include JavaScript entered through the Admin UI](add-javascript-through-the-admin-ui.html).
|
50
|
+
|
51
|
+
For example, this appears near the top of the home page view, to add to the page any JavaScript entered through the Admin that's stored in MongoDB.
|
52
|
+
|
53
|
+
```
|
54
|
+
- add_javascript(@page.javascript)
|
55
|
+
```
|
56
|
+
|
57
|
+
## Partials from Plugins
|
58
|
+
|
59
|
+
The last technique I'll mention is `append_partials`, which each Workarea layout calls twice—once in the head and once in the body.
|
60
|
+
|
61
|
+
workarea-storefront/app/views/layouts/workarea/storefront/application.html.haml:
|
62
|
+
|
63
|
+
```
|
64
|
+
%head
|
65
|
+
/...
|
66
|
+
/ directly before the head manifest
|
67
|
+
= append_partials('storefront.document_head')
|
68
|
+
/...
|
69
|
+
%body
|
70
|
+
/...
|
71
|
+
/ directly after the application manifest and yield :javascript
|
72
|
+
= append_partials('storefront.javascript')
|
73
|
+
/...
|
74
|
+
```
|
75
|
+
|
76
|
+
These append points allow [plugins to append their partials](appending.html) to the layout. The partials may contain JavaScript using any of the techniques above.
|
77
|
+
|
78
|
+
The Google Analytics plugin, for example, uses the head append point to insert a view which includes nothing but the Google Analytics embed code.
|
79
|
+
|
80
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
---
|
2
|
+
title: Add JavaScript through the Admin UI
|
3
|
+
excerpt: JavaScript can be added on a page by page basis through the Admin UI. To do so, visit a content edit page in the Admin, such as the home page edit screen.
|
4
|
+
---
|
5
|
+
|
6
|
+
# Add JavaScript through the Admin UI
|
7
|
+
|
8
|
+
JavaScript can be added on a page by page basis through the Admin UI. To do so, visit a content edit page in the Admin, such as the home page edit screen.
|
9
|
+
|
10
|
+
<!-- TODO: add image of home page edit screen -->
|
11
|
+
|
12
|
+
Hover over the Content card and click the "Manage Content" button.
|
13
|
+
|
14
|
+
<!-- TODO: add image of hover interaction -->
|
15
|
+
|
16
|
+
Click the "Advanced" link at the top of the Content Editor UI.
|
17
|
+
|
18
|
+
<!-- TODO: add image of Content Editing UI, "Advanced" link highlighted -->
|
19
|
+
|
20
|
+
Type JavaScript into the "JavaScript" field and save.
|
21
|
+
|
22
|
+
<!-- TODO: update image
|
23
|
+
<p><%= image_tag "images/js-admin-ui.png", alt: "CSS field in Admin" %></p>
|
24
|
+
-->
|
25
|
+
|
26
|
+
Visit the home page in the Storefront and behold! JavaScript!
|
27
|
+
|
28
|
+
<!-- TODO: update image
|
29
|
+
<p><%= image_tag "images/js-added-through-admin.png", alt: "CSS added through Admin" %></p>
|
30
|
+
-->
|
@@ -0,0 +1,58 @@
|
|
1
|
+
---
|
2
|
+
title: Add Metrics
|
3
|
+
excerpt: This page will guide you through a step-by-step process of adding new metrics data for insights and reports.
|
4
|
+
---
|
5
|
+
|
6
|
+
# Add Metrics
|
7
|
+
|
8
|
+
Workarea tracks activity of the site through a mechanism called Metrics. Information like catalog activity and sales, discount usage, search data, and more are aggregated on a daily basis and sometimes further aggregated weekly. This data collection allows for the creation of most of the reports and insights within the Workarea admin.
|
9
|
+
|
10
|
+
While Workarea provides metrics on critical data points within the system, it is possible a more specialized metric might become desirable in order to provide retailers with insights or reports unique to their business.
|
11
|
+
|
12
|
+
Metrics consist of a Mongoid model and are populated through any number mechanism including analytics adapters and data saved after an order is placed. This guide will walk through the creation of the Metric model, and show a short code example of how you could integrate tracking of the data.
|
13
|
+
|
14
|
+
# Create a Metric model
|
15
|
+
|
16
|
+
The first step is establishing the model that will represent the collection within the database where the data is stored. In this scenario, a retailer may have downloadable files on their site and want to track how often they are downloaded.
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
# app/models/workarea/metrics/downloads_by_day.rb
|
20
|
+
module Workarea
|
21
|
+
module Metrics
|
22
|
+
class DownloadsByDay
|
23
|
+
include ByDay
|
24
|
+
|
25
|
+
field :file_id, type: String
|
26
|
+
field :clicks, type: Integer, default: 0
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
```
|
31
|
+
|
32
|
+
A Metric intended for daily data collecting should `include ByDay`, which is module that provides common fields and methods that all daily tracked metrics require to function as the system expects. The most important aspects are the `reporting_on` field which is used to track which day the day represents, and the `#inc` method which is the mechanism by which data for a specific day can easily be added to the document.
|
33
|
+
|
34
|
+
## Integrate tracking
|
35
|
+
|
36
|
+
For the purpose of this scenario, let's assume there is an analytics event setup to fire when a user clicks a download link and an analytics adapter that makes a XHR request to the server with the ID of the file being downloaded. [See the analytics overview](analytics-overview.html) for information on how analytics are integration into Workarea.
|
37
|
+
|
38
|
+
In this example, a controller action can be setup to increment the `clicks` field on the appropriate document in the `Workarea::Metrics::DownloadsByDay` collection.
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
# app/controllers/workarea/storefront/download_analytics_controller.rb
|
42
|
+
module Workarea
|
43
|
+
module Storefront
|
44
|
+
class DownloadAnalyticsController < ApplicationController
|
45
|
+
def click
|
46
|
+
Metrics::DownloadsByDay.inc(
|
47
|
+
key: { file_id: params[:file_id] },
|
48
|
+
clicks: 1
|
49
|
+
)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
```
|
55
|
+
|
56
|
+
## Using metrics data
|
57
|
+
|
58
|
+
Once the model has been created, and the mechanism by which it is populated is integrated into the site, that data can be aggregated and analyzed for insights and for [new reports](add-a-report.html) offered within the Workarea admin.
|
@@ -0,0 +1,150 @@
|
|
1
|
+
---
|
2
|
+
title: Add or Replace a Pricing Calculator
|
3
|
+
excerpt: Learn how to manipulate pricing calculators to affect how products and orders are priced on your Workarea application.
|
4
|
+
---
|
5
|
+
|
6
|
+
# Add or Replace a Pricing Calculator
|
7
|
+
|
8
|
+
In this article, you'll learn how to extend the pricing logic in Workarea to fit the needs of your application, by [generating](#generating-pricing-calculators_1) and [configuring](#configuring-pricing-calculators_2) its pricing calculators. Workarea's pricing system is constructed in such a way that it is possible to replace, rather than decorate, the way by which pricing is calculated on items and products. This includes adding pricing calculators for adjusting price, removing pricing calculators to omit certain price adjustments, and replacing out-of-box pricing calculators with your additional functionality.
|
9
|
+
|
10
|
+
But before diving into creating your own pricing calculators, let's have a look at the calculators Workarea provides for you out-of-the-box...
|
11
|
+
|
12
|
+
Four pricing calculators are included in Workarea, each addressing a different portion of the price which are added together to formulate the final grand total. They are as follows, and perform their pricing adjustments in the following order:
|
13
|
+
|
14
|
+
1. **Workarea::Pricing::Calculators::ItemCalculator** sets the base unit price of the item. Override this to change the base item price, such as when working within segmentation.
|
15
|
+
2. **Workarea::Pricing::Calculators::CustomizationsCalculator** adjusts the price based on whether any customizations to the item were set.
|
16
|
+
3. **Workarea::Pricing::Calculators::DiscountCalculator** uses the [discounts subsystem](create-a-custom-discount.html) to apply discounts to the order. This should typically not be overridden or replaced. Instead, admins can create discounts that surpass the functionality of a simple pricing calculator.
|
17
|
+
3. **Workarea::Pricing::Calculators::TaxCalculator** applies tax to the order using the built-in tax tables that are available in the database. These tax tables can be imported by the user in Avalara format, or created manually through the admin. This also does not typically need to be changed, since the default functionality is to not charge tax when there are no tax tables present for your locale.
|
18
|
+
|
19
|
+
## Generating Pricing Calculators
|
20
|
+
|
21
|
+
To extend the functionality of pricing, new pricing calculators can be created in your Workarea application that are either entirely new, or replace an existing calculator to apply additional functionality. It's always recommended to add a new calculator somewhere in the chain, creating an additional `PriceAdjustment`, and thus creating a "paper trail" of price changes for each item in the order. This helps when debugging why items are priced in certain ways within the order, as well as when you need additional data from the pricing system for integrations (such as to an OMS).
|
22
|
+
|
23
|
+
To create a new calculator, use the `workarea:pricing_calculator` generator:
|
24
|
+
|
25
|
+
```bash
|
26
|
+
$ rails generate workarea:pricing_calculator Tariff
|
27
|
+
```
|
28
|
+
|
29
|
+
This will create a file in your application at **app/models/workarea/pricing/calculators/tariff_calculator.rb**:
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
module Workarea
|
33
|
+
module Pricing
|
34
|
+
module Calculators
|
35
|
+
class TariffCalculator
|
36
|
+
include Calculator
|
37
|
+
|
38
|
+
def adjust
|
39
|
+
# TODO implement me
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
```
|
46
|
+
|
47
|
+
The generator will also create a corresponding test class in **test/models/workarea/pricing/calculators/tariff_calculator_test.rb**:
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
require 'test_helper'
|
51
|
+
|
52
|
+
module Workarea
|
53
|
+
module Pricing
|
54
|
+
module Calculators
|
55
|
+
class TariffCalculatorTest < TestCase
|
56
|
+
def test_adjust
|
57
|
+
# TODO assert that the calculator adds price adjustments
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
```
|
64
|
+
|
65
|
+
In this test class, you can use `TariffCalculator.test_adjust(order, shipping)` to simulate a pricing adjustment on the order without necessarily having to perform a `Pricing::Request`. Create a `Workarea::Order` (and optionally a `Workarea::Shipping`) that will have tariffs charged on it, as well as one that shouldn't have tariffs charged, in order to ensure your new functionality works. Here's an example of how you might do that:
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
require 'test_helper'
|
69
|
+
|
70
|
+
module Workarea
|
71
|
+
module Pricing
|
72
|
+
module Calculators
|
73
|
+
class TariffCalculatorTest < TestCase
|
74
|
+
def test_adjust
|
75
|
+
order = create_order
|
76
|
+
order.add_item(product_id: 'PRODUCT', sku: 'SKU', quantity: 1)
|
77
|
+
|
78
|
+
TariffCalculator.test_adjust(order)
|
79
|
+
|
80
|
+
adjustment = order.items.first.price_adjustments.last
|
81
|
+
|
82
|
+
refute_nil(adjustment)
|
83
|
+
assert_equal('item', adjustment.price)
|
84
|
+
assert_equal(10.to_m, adjustment.amount)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
```
|
91
|
+
|
92
|
+
To make this example test pass, implement the `#adjust` method on your calculator:
|
93
|
+
|
94
|
+
```ruby
|
95
|
+
def adjust
|
96
|
+
order.items.each do |item|
|
97
|
+
next unless shipping.charges_tariff?
|
98
|
+
|
99
|
+
item.adjust_pricing(
|
100
|
+
price: 'tax',
|
101
|
+
amount: shipping.address.tariff.amount,
|
102
|
+
quantity: item.quantity,
|
103
|
+
calculator: self.class.name,
|
104
|
+
description: 'A Very Draconian Tariff',
|
105
|
+
data: { 'tariff_id' => shipping.address.tariff.id }
|
106
|
+
)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
```
|
110
|
+
|
111
|
+
## Configuring Pricing Calculators
|
112
|
+
|
113
|
+
Now that you made a new pricing calculator, it must be added to your application's `pricing_calculators` configuration in order to take effect. This configuration setting is a `Workarea::SwappableList`.
|
114
|
+
|
115
|
+
In most cases, it's best to add your calculator somewhere in the list, typically after the default calculator for the price type. In the case of the previously-generated `TariffCalculator`, which makes a **tax** price adjustment, here's an example of adding the calculator *before* tax is calculated on the item:
|
116
|
+
|
117
|
+
```ruby
|
118
|
+
Workarea.configure do |config|
|
119
|
+
# Charge tariff in addition to tax on some orders
|
120
|
+
config.pricing_calculators.insert_before(
|
121
|
+
'Workarea::Pricing::Calculators::TaxCalculator',
|
122
|
+
'Workarea::Pricing::Calculators::TariffCalculator'
|
123
|
+
)
|
124
|
+
end
|
125
|
+
```
|
126
|
+
|
127
|
+
Situations may also arise where you need pricing to be calculated in a special way *adjacent* to the existing pricing infrastructure. For this scenario, **add** your new calculator to the end of the list:
|
128
|
+
|
129
|
+
```ruby
|
130
|
+
Workarea.configure do |config|
|
131
|
+
# Charge tariff after shipping/tax/customizations
|
132
|
+
config.pricing_calculators.push('Workarea::Pricing::Calculators::TariffCalculator')
|
133
|
+
end
|
134
|
+
```
|
135
|
+
|
136
|
+
In rare cases, you may need to wholly replace the existing calculator. This is generally not necessary, and can cause compatibility issues if other plugins leveraging the pricing system are expecting the out-of-box calculator to work a certain way. However, if you want to replace a calculator in the chain, use the `#swap` method like so:
|
137
|
+
|
138
|
+
```ruby
|
139
|
+
Workarea.configure do |config|
|
140
|
+
# Calculate interest on the order if necessary
|
141
|
+
config.pricing_calculators.swap(
|
142
|
+
'Workarea::Pricing::Calculators::TaxCalculator',
|
143
|
+
'Workarea::Pricing::Calculators::TariffCalculator'
|
144
|
+
)
|
145
|
+
end
|
146
|
+
```
|
147
|
+
|
148
|
+
Make sure you restart your server to see changes take effect.
|
149
|
+
|
150
|
+
**NOTE:** It's also possible to **remove** calculators from the config, but it is not advisable as doing so will cause issues in testing.
|
@@ -0,0 +1,147 @@
|
|
1
|
+
---
|
2
|
+
title: Add, Remove, or Change a Mongoid Validation
|
3
|
+
excerpt: Sometimes with validations, less is more. Learn how to manipulate the out-of-box validations that don't jive with your application's data.
|
4
|
+
---
|
5
|
+
|
6
|
+
# Add, Remove, or Change a Mongoid Validation
|
7
|
+
|
8
|
+
In the Workarea codebase, you may encounter **model validations** in
|
9
|
+
Mongoid model classes, since they are responsible for persisting data
|
10
|
+
that can be handled by the application into the database. Validations
|
11
|
+
are commonly used to clean user-generated data (for example, data that
|
12
|
+
is entered on a website, such as a user's email address or password),
|
13
|
+
and ensure that the kind of data that's going into the database is valid
|
14
|
+
and can be "handled" by the application at a later date. To accomplish
|
15
|
+
this, Workarea uses `ActiveModel::Validations`, which is the same engine
|
16
|
+
powering [ActiveRecord Validations][], and indeed most of Workarea's
|
17
|
+
validation logic works exactly like its out-of-box Rails counterpart.
|
18
|
+
|
19
|
+
Validations are typically used for data entered by the user on a public
|
20
|
+
interface. For example, an `Order::Item` has validations on the quantity
|
21
|
+
and SKU of the item, but `Fulfillment::Item` will not, because `Fulfillment`
|
22
|
+
records are typically created automatically in the backend when an Order
|
23
|
+
is being sent over to the OMS or Fulfillment system. As a result, you may
|
24
|
+
see less validations in a Workarea application than you would in a
|
25
|
+
conventional Rails application. This is intentional, as the Workarea platform
|
26
|
+
(and, by proxy, the web application running Workarea) is designed to handle
|
27
|
+
missing or invalid/incorrect data at the UI level, meaning that less-than-perfect
|
28
|
+
data can be inserted into MongoDB, and the application won't throw fatal
|
29
|
+
errors when attempting to render or deal with that data. For this reason, when adding
|
30
|
+
new fields to Workarea models, it's best to [configure default values][]
|
31
|
+
instead of validating data and producing an error when it's not valid. You
|
32
|
+
should only validate data if it's meant for storefront-facing user input,
|
33
|
+
and even then, your code should be written defensively to deal with the data
|
34
|
+
when it's not 100% valid.
|
35
|
+
|
36
|
+
## Change an Existing Validation
|
37
|
+
|
38
|
+
The most common case is to change (or override) an existing validation based on a
|
39
|
+
special case wherein your data doesn't necessarily match up with the
|
40
|
+
validation rules imposed by base.
|
41
|
+
|
42
|
+
Validations are loaded from dependencies first, then read from
|
43
|
+
top-to-bottom in the class definition. What this means for you is that
|
44
|
+
a validation defined in the core platform can be modified by adding a
|
45
|
+
decorator with a new `validates` or `validate` entry in the `decorated
|
46
|
+
{ }` block, since this will be processed after the validations on the
|
47
|
+
base class have been defined. For example, if you want to prevent
|
48
|
+
validating a user's password if they are signed in with OAuth, you
|
49
|
+
might decorate the `User` model like so:
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
module Workarea
|
53
|
+
decorate User do
|
54
|
+
decorated do
|
55
|
+
validates :password, password: { strength: :required_password_strength }, unless: :is_omniauthed?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
```
|
60
|
+
|
61
|
+
When decorating validations, always remember to copy the whole
|
62
|
+
validation line from Workarea (or one of its plugins), as `validates` /
|
63
|
+
`validate` lines for the same key will completely overwrite the original
|
64
|
+
validation. This is evidenced by the fact that the line...
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
validates :password, unless: :is_omniauthed?
|
68
|
+
```
|
69
|
+
|
70
|
+
...will not do anything, the condition must be expressed as part of the
|
71
|
+
rewritten validation.
|
72
|
+
|
73
|
+
## Add a New Validation
|
74
|
+
|
75
|
+
Adding new validations is rare for model data. As described above, validating
|
76
|
+
data and producing an error for the user to deal with is a less desirable
|
77
|
+
experience than allowing any user data to be entered, and cleaning said data
|
78
|
+
in the background, without the need for involvement by a customer or admin.
|
79
|
+
|
80
|
+
That said, Mongoid already includes the `ActiveModel::Validations` module, which
|
81
|
+
means you have the same capabilities as you would have access to in Rails'
|
82
|
+
out-of-box [ActiveRecord Validations][]. If you're looking for detailed
|
83
|
+
information on the various out-of-box validations you might need, check out the
|
84
|
+
aforementioned Rails guide.
|
85
|
+
|
86
|
+
For example, if your payment provider requires phone numbers on the billing
|
87
|
+
address, you might write a decoration to add a validation for `:phone_number`
|
88
|
+
on the `Payment::Address` model:
|
89
|
+
|
90
|
+
```ruby
|
91
|
+
module Workarea
|
92
|
+
decorate Payment::Address do
|
93
|
+
decorated do
|
94
|
+
validates :phone_number, presence: true
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
```
|
99
|
+
|
100
|
+
## Remove an Existing Validation
|
101
|
+
|
102
|
+
Removing validations is a bit trickier. You essentially have to remove
|
103
|
+
_all_ validations, then add back the ones that you need in the object.
|
104
|
+
Fortunately, Workarea makes that a lot easier for you with our
|
105
|
+
handy-dandy [ActiveModel::Unvalidate][] gem!
|
106
|
+
|
107
|
+
This library can be added into your project in Gemfile:
|
108
|
+
|
109
|
+
```ruby
|
110
|
+
gem 'active_model-unvalidates'
|
111
|
+
```
|
112
|
+
|
113
|
+
After running `bundle` to install it, you can use the `unvalidates` and
|
114
|
+
`unvalidate` macro methods in the models for which you wish to remove
|
115
|
+
validations. For example, if you no longer want to validate the existence
|
116
|
+
of a `:country` because you don't sell to other countries, you could
|
117
|
+
decorate `Workarea::Address` like so:
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
module Workarea
|
121
|
+
decorate Payment::Address do
|
122
|
+
decorated do
|
123
|
+
unvalidates :country, :presence
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
```
|
128
|
+
|
129
|
+
The `unvalidates` macro takes two arguments, the name of the field being
|
130
|
+
unvalidated, and the "type" of validation(s) to remove validation for
|
131
|
+
(in this case, `:presence`). Use `unvalidates` for removing validations
|
132
|
+
created with the Rails macro `validates`. For custom method-based validations
|
133
|
+
that are configured using `validate`, use the `unvalidate` macro, like so:
|
134
|
+
|
135
|
+
```ruby
|
136
|
+
module Workarea
|
137
|
+
decorate Payment::Address do
|
138
|
+
decorated do
|
139
|
+
unvalidate :postal_code_presence
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
```
|
144
|
+
|
145
|
+
[ActiveRecord Validations]: https://guides.rubyonrails.org/active_record_validations.html
|
146
|
+
[ActiveModel::Unvalidate]: https://github.com/weblinc/active_model-unvalidate
|
147
|
+
[configure default values]: https://docs.mongodb.com/mongoid/master/tutorials/mongoid-documents/#defaults
|