diff --git a/app/assets/images/icn-close.png b/app/assets/images/icn-close.png
new file mode 100644
index 0000000000..6ef99bffec
Binary files /dev/null and b/app/assets/images/icn-close.png differ
diff --git a/app/assets/images/icn-search-grey.png b/app/assets/images/icn-search-grey.png
new file mode 100644
index 0000000000..15af5ed712
Binary files /dev/null and b/app/assets/images/icn-search-grey.png differ
diff --git a/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee b/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee
index 217118ee82..bc72b597c2 100644
--- a/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee
+++ b/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee
@@ -1,4 +1,4 @@
-Darkswarm.controller "ProductsCtrl", ($scope, $filter, $rootScope, Products, OrderCycle, OrderCycleResource, FilterSelectorsService, Cart, Dereferencer, Taxons, Properties, currentHub, $timeout) ->
+Darkswarm.controller "ProductsCtrl", ($scope, $sce, $filter, $rootScope, Products, OrderCycle, OrderCycleResource, FilterSelectorsService, Cart, Dereferencer, Taxons, Properties, currentHub, $timeout) ->
$scope.Products = Products
$scope.Cart = Cart
$scope.query = ""
@@ -10,6 +10,7 @@ Darkswarm.controller "ProductsCtrl", ($scope, $filter, $rootScope, Products, Ord
$scope.order_cycle = OrderCycle.order_cycle
$scope.supplied_taxons = null
$scope.supplied_properties = null
+ $scope.showFilterSidebar = false
$rootScope.$on "orderCycleSelected", ->
$scope.update_filters()
@@ -75,15 +76,24 @@ Darkswarm.controller "ProductsCtrl", ($scope, $filter, $rootScope, Products, Ord
$scope.appliedTaxonsList = ->
$scope.activeTaxons.map( (taxon_id) ->
Taxons.taxons_by_id[taxon_id].name
- ).join(" #{t('products_or')} ") if $scope.activeTaxons?
+ ).join($scope.filtersJoinWord()) if $scope.activeTaxons?
$scope.appliedPropertiesList = ->
$scope.activeProperties.map( (property_id) ->
Properties.properties_by_id[property_id].name
- ).join(" #{t('products_or')} ") if $scope.activeProperties?
+ ).join($scope.filtersJoinWord()) if $scope.activeProperties?
+
+ $scope.filtersJoinWord = ->
+ $sce.trustAsHtml(" #{t('products_or')} ")
$scope.clearAll = ->
+ $scope.clearQuery()
+ $scope.clearFilters()
+
+ $scope.clearQuery = ->
$scope.query = ""
+
+ $scope.clearFilters = ->
$scope.taxonSelectors.clearAll()
$scope.propertySelectors.clearAll()
@@ -94,3 +104,9 @@ Darkswarm.controller "ProductsCtrl", ($scope, $filter, $rootScope, Products, Ord
$scope.Products.products = []
$scope.update_filters()
$scope.loadProducts()
+
+ $scope.filtersCount = () ->
+ $scope.taxonSelectors.totalActive() + $scope.propertySelectors.totalActive()
+
+ $scope.toggleFilterSidebar = ->
+ $scope.showFilterSidebar = !$scope.showFilterSidebar
diff --git a/app/assets/javascripts/darkswarm/directives/focus_search.coffee b/app/assets/javascripts/darkswarm/directives/focus_search.coffee
new file mode 100644
index 0000000000..076c310351
--- /dev/null
+++ b/app/assets/javascripts/darkswarm/directives/focus_search.coffee
@@ -0,0 +1,6 @@
+Darkswarm.directive "focusSearch", ->
+ restrict: 'A'
+ link: (scope, element, attr)->
+ element.bind 'click', (event) ->
+ # Focus seach field, ready for typing
+ $(element).siblings('#search').focus()
diff --git a/app/assets/javascripts/templates/filter_selector.html.haml b/app/assets/javascripts/templates/filter_selector.html.haml
index cd4135ebee..742ace2a0e 100644
--- a/app/assets/javascripts/templates/filter_selector.html.haml
+++ b/app/assets/javascripts/templates/filter_selector.html.haml
@@ -1,4 +1,3 @@
%ul
%active-selector{ ng: { repeat: "selector in allSelectors", show: "ifDefined(selector.fits, true)" } }
- %render-svg{path: "{{selector.object.icon}}", ng: { if: "selector.object.icon"} }
%span{"ng-bind" => "::selector.object.name"}
diff --git a/app/assets/javascripts/templates/price_breakdown_button.html.haml b/app/assets/javascripts/templates/price_breakdown_button.html.haml
index 5eff1ef237..1aa104eaca 100644
--- a/app/assets/javascripts/templates/price_breakdown_button.html.haml
+++ b/app/assets/javascripts/templates/price_breakdown_button.html.haml
@@ -1,2 +1,2 @@
-%button.graph-button{"ng-class" => "{open: tt_isOpen}"}
+%button.graph-button{"ng-class" => "{open: tt_isOpen}", type: 'button'}
/ %i.ofn-i_058-graph
diff --git a/app/assets/stylesheets/darkswarm/_shop-filters.css.scss b/app/assets/stylesheets/darkswarm/_shop-filters.css.scss
index 16bca77cbc..5bb8b5e381 100644
--- a/app/assets/stylesheets/darkswarm/_shop-filters.css.scss
+++ b/app/assets/stylesheets/darkswarm/_shop-filters.css.scss
@@ -2,6 +2,7 @@
@import "branding";
@import "big-input";
@import "animations";
+@import "variables";
@mixin filter-selector($base-clr, $border-clr, $hover-clr) {
&.inline-block, ul.inline-block {
@@ -14,7 +15,7 @@
@include border-radius(0);
padding: 0;
- margin: 0 0 0.25rem 0.25rem;
+ margin: 0 0.5rem 0.5rem 0;
&:hover, &:focus {
background: transparent;
@@ -107,26 +108,63 @@
// Alert when search, taxon, filter is triggered
.alert-box.search-alert {
- background-color: $clr-yellow-light;
- border-color: $clr-yellow-light;
+ background-color: $white;
color: #777;
- font-size: 0.75rem;
- padding: 0.5rem 0.75rem;
+ font-size: 1em;
+ padding: 0.35em 0 0;
+ border: 0;
+ margin: 0;
- span.applied-properties {
- color: #333;
+ .clear-all {
+ color: $grey-500;
+ margin-left: 1.5em;
+
+ &:hover {
+ color: $grey-600;
+ }
}
- span.applied-taxons {
- color: $clr-blue;
+ .no-results-bar {
+ @include breakpoint(desktop) {
+ text-align: center;
+ }
}
- span.applied-search {
- color: $clr-brick;
+ .no-results {
+ color: $grey-800;
+ font-style: italic;
+ font-size: 1.25em;
}
- span.filter-label {
- opacity: 0.75;
+ .clear-search {
+ background-color: transparent;
+ padding: 0;
+ margin: 0;
+ color: $orange-500;
+ font-size: 1.25em;
+
+ &:hover {
+ color: $orange-400;
+ }
+ }
+
+ span {
+ color: $grey-800;
+ font-style: italic;
+
+ &.applied-taxons, &.applied-properties {
+ color: $clr-blue;
+ font-weight: bold;
+
+ .join-word {
+ font-weight: normal;
+ }
+ }
+
+ &.applied-search {
+ font-weight: bold;
+ color: $teal-500;
+ }
}
}
@@ -140,25 +178,6 @@
.filter-shopfront {
&.taxon-selectors, &.property-selectors {
background: transparent;
-
- single-line-selectors {
- overflow-x: hidden;
- white-space: nowrap;
-
- .f-dropdown {
- overflow-x: auto;
- white-space: normal;
- }
- }
-
- ul {
- margin: 0;
- display: inline-block;
- }
-
- ul, ul li {
- list-style: none;
- }
}
// Shopfront taxons
@@ -170,4 +189,8 @@
&.property-selectors {
@include filter-selector(#666, #ccc, #777);
}
+
+ ul {
+ margin: 0;
+ }
}
diff --git a/app/assets/stylesheets/darkswarm/_shop-inputs.css.scss b/app/assets/stylesheets/darkswarm/_shop-inputs.css.scss
index 3cf5d6e497..59a3bd0c67 100644
--- a/app/assets/stylesheets/darkswarm/_shop-inputs.css.scss
+++ b/app/assets/stylesheets/darkswarm/_shop-inputs.css.scss
@@ -7,13 +7,6 @@
// #search
@include placeholder(rgba(0, 0, 0, 0.4), #777);
- input#search {
- @include medium-input(rgba(0, 0, 0, 0.3), #777, $clr-brick);
-
- // avoid zoom on iphone, see issue #4535
- font-size: 1rem;
- }
-
// ordering
product {
input {
@@ -30,22 +23,22 @@
border-color: #b3b3b3;
text-align: right;
- @media all and (max-width: 1024px) {
+ @include breakpoint(desktop) {
width: 8rem;
}
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
width: 7rem;
}
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
float: left !important;
font-size: 0.75rem;
padding-left: 0.25rem;
padding-right: 0.25rem;
}
- @media all and (max-width: 480px) {
+ @include breakpoint(mobile) {
width: 5.8rem;
}
@@ -69,15 +62,15 @@
input.bulk {
width: 5rem;
- @media all and (max-width: 1024px) {
+ @include breakpoint(desktop) {
width: 4rem;
}
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
width: 3.5rem;
}
- @media all and (max-width: 480px) {
+ @include breakpoint(mobile) {
width: 2.8rem;
}
}
@@ -93,7 +86,7 @@
.bulk-input-container {
float: right;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
float: left !important;
}
diff --git a/app/assets/stylesheets/darkswarm/_shop-navigation.css.scss b/app/assets/stylesheets/darkswarm/_shop-navigation.css.scss
index 12bf494949..95bd6b1059 100644
--- a/app/assets/stylesheets/darkswarm/_shop-navigation.css.scss
+++ b/app/assets/stylesheets/darkswarm/_shop-navigation.css.scss
@@ -1,11 +1,13 @@
+@import "mixins";
@import "typography";
+@import "variables";
ordercycle {
float: right;
background: $grey-050;
color: $grey-800;
width: 100%;
- border-radius: 0.5em 0.5em 0 0;
+ border-radius: $radius-medium $radius-medium 0 0;
margin-top: 1em;
padding: 1em 1.25em 0;
@@ -17,7 +19,7 @@ ordercycle {
margin-right: 0.3rem;
}
- @media all and (max-width: 1024px) {
+ @include breakpoint(desktop) {
float: none;
padding: 0.5em 1em;
width: 100%;
@@ -33,7 +35,7 @@ ordercycle {
}
}
- @media all and (max-width: 480px) {
+ @include breakpoint(mobile) {
padding: 0.5em 1em 0.75em;
}
@@ -41,12 +43,12 @@ ordercycle {
border: 1px solid $teal-300;
display: inline-block;
font-size: 1em;
- border-radius: 0.25em;
+ border-radius: $radius-small;
.select-label {
background-color: rgba($teal-300, 0.5);
display: inline-block;
- border-radius: 0.25em 0 0 0.25em;
+ border-radius: $radius-small 0 0 $radius-small;
float: left;
font-size: 1em;
line-height: 1.3em;
@@ -80,11 +82,12 @@ ordercycle {
padding: 0.5em 1.25em 0.5em 0.75em;
height: 2.35em;
background-size: 30px auto;
- border-radius: 0 0.25em 0.25em 0;
+ border-radius: 0 $radius-small $radius-small 0;
min-width: 13em;
- @media all and (max-width: 480px) {
+ @include breakpoint(mobile) {
width: 100%;
+ min-width: 0;
}
}
@@ -92,16 +95,17 @@ ordercycle {
color: $grey-700;
}
- @media all and (max-width: 1024px) {
+ @include breakpoint(desktop) {
float: none;
margin-right: 1em;
}
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
float: none;
+ margin-right: 0;
}
- @media all and (max-width: 480px) {
+ @include breakpoint(mobile) {
display: flex;
}
}
@@ -114,7 +118,7 @@ ordercycle {
padding: 0.5em 0;
span {
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
font-size: 0.875em;
}
}
@@ -148,7 +152,7 @@ shop ordercycle {
color: $white;
padding: 0 0 12px;
- @media all and (max-width: 1024px) {
+ @include breakpoint(desktop) {
float: none;
display: inline-block;
padding: 0.2em 0 0;
@@ -156,7 +160,7 @@ shop ordercycle {
margin-right: 1em;
}
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
float: none;
padding: 0 0 10px;
}
diff --git a/app/assets/stylesheets/darkswarm/_shop-popovers.css.scss b/app/assets/stylesheets/darkswarm/_shop-popovers.css.scss
index d233284767..dd5aa5a177 100644
--- a/app/assets/stylesheets/darkswarm/_shop-popovers.css.scss
+++ b/app/assets/stylesheets/darkswarm/_shop-popovers.css.scss
@@ -114,7 +114,7 @@ button.graph-button {
}
}
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
// Hide for small
display: none;
}
diff --git a/app/assets/stylesheets/darkswarm/_shop-product-rows.css.scss b/app/assets/stylesheets/darkswarm/_shop-product-rows.css.scss
index d98457cd73..b0ea1faf39 100644
--- a/app/assets/stylesheets/darkswarm/_shop-product-rows.css.scss
+++ b/app/assets/stylesheets/darkswarm/_shop-product-rows.css.scss
@@ -1,3 +1,4 @@
+@import "mixins";
@import "branding";
@import "animations";
@@ -14,11 +15,11 @@
// outline: 1px solid red
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
font-size: 0.875rem;
}
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
font-size: 0.75rem;
}
}
@@ -56,13 +57,13 @@
.variant-name {
padding-left: 7.9375rem;
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
padding-left: 4.9375rem;
}
}
.variant-name {
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
background: #333;
color: white;
padding-left: 0.9375rem;
@@ -82,7 +83,7 @@
font-size: 0.875rem;
overflow: hidden;
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
font-size: 0.75rem;
}
}
@@ -92,7 +93,7 @@
padding-left: 0.25rem;
padding-right: 0.25rem;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
text-align: right;
}
}
@@ -106,7 +107,7 @@
color: $med-drk-grey;
}
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
background: #777;
color: $disabled-med;
@@ -132,7 +133,7 @@
padding-bottom: 1em;
line-height: 1;
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
padding-top: 0.65rem;
padding-bottom: 0.65rem;
}
@@ -141,11 +142,11 @@
.summary-header {
padding-left: 7.9375rem;
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
padding-left: 4.9375rem;
}
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
padding-left: 0.9375rem;
}
diff --git a/app/assets/stylesheets/darkswarm/_shop-product-thumb.css.scss b/app/assets/stylesheets/darkswarm/_shop-product-thumb.css.scss
index 8a75467c9c..c9f8794295 100644
--- a/app/assets/stylesheets/darkswarm/_shop-product-thumb.css.scss
+++ b/app/assets/stylesheets/darkswarm/_shop-product-thumb.css.scss
@@ -1,3 +1,4 @@
+@import "mixins";
@import "branding";
@import "animations";
@@ -56,7 +57,7 @@
}
}
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
top: 2px;
width: 4rem;
height: 4rem;
@@ -70,7 +71,7 @@
}
}
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
display: none;
width: 0rem;
height: 0rem;
diff --git a/app/assets/stylesheets/darkswarm/_shop-taxon-flag.css.scss b/app/assets/stylesheets/darkswarm/_shop-taxon-flag.css.scss
index 6a2c993600..e1b0d8ccbe 100644
--- a/app/assets/stylesheets/darkswarm/_shop-taxon-flag.css.scss
+++ b/app/assets/stylesheets/darkswarm/_shop-taxon-flag.css.scss
@@ -1,3 +1,5 @@
+@import "mixins";
+
.darkswarm {
products {
product {
@@ -10,7 +12,7 @@
padding-top: 0.25rem;
z-index: 999999;
- @media all and (max-width: 480px) {
+ @include breakpoint(mobile) {
background-size: 28px 32px;
min-height: 32px;
width: 28px;
@@ -27,11 +29,11 @@
}
}
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
margin-top: -0.85rem;
}
- @media all and (max-width: 480px) {
+ @include breakpoint(mobile) {
render-svg {
svg {
width: 18px;
diff --git a/app/assets/stylesheets/darkswarm/account.css.scss b/app/assets/stylesheets/darkswarm/account.css.scss
index 44d93b4cd1..bb6701f15d 100644
--- a/app/assets/stylesheets/darkswarm/account.css.scss
+++ b/app/assets/stylesheets/darkswarm/account.css.scss
@@ -1,5 +1,6 @@
@import "branding";
@import "mixins";
+@import "variables";
.account-summary {
color: #4a4a4a;
@@ -99,7 +100,7 @@
table {
width: 100%;
- border-radius: 0.5em 0.5em 0 0;
+ border-radius: $radius-medium $radius-medium 0 0;
tr:nth-of-type(even) {
background: transparent;
diff --git a/app/assets/stylesheets/darkswarm/active_table.css.scss b/app/assets/stylesheets/darkswarm/active_table.css.scss
index 66dca7743b..395ad7c876 100644
--- a/app/assets/stylesheets/darkswarm/active_table.css.scss
+++ b/app/assets/stylesheets/darkswarm/active_table.css.scss
@@ -26,7 +26,7 @@
display: block;
border: 0;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
margin-bottom: 1rem;
}
@@ -45,7 +45,7 @@
}
// Generic text resize
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
&, & * {
font-size: 0.875rem;
}
@@ -114,7 +114,7 @@
.fat > div {
border-top: 1px solid #aaa;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
margin-top: 1em;
}
diff --git a/app/assets/stylesheets/darkswarm/active_table_search.css.scss b/app/assets/stylesheets/darkswarm/active_table_search.css.scss
index b934116cdc..1c26fcb74f 100644
--- a/app/assets/stylesheets/darkswarm/active_table_search.css.scss
+++ b/app/assets/stylesheets/darkswarm/active_table_search.css.scss
@@ -16,7 +16,7 @@
margin-top: 2px;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
margin-bottom: 1em;
}
}
diff --git a/app/assets/stylesheets/darkswarm/big-input.scss b/app/assets/stylesheets/darkswarm/big-input.scss
index 7b9ecdac8d..10336e30c6 100644
--- a/app/assets/stylesheets/darkswarm/big-input.scss
+++ b/app/assets/stylesheets/darkswarm/big-input.scss
@@ -23,7 +23,7 @@
box-shadow: none;
color: $inputactv;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
font-size: 1.25rem;
}
diff --git a/app/assets/stylesheets/darkswarm/branding.css.scss b/app/assets/stylesheets/darkswarm/branding.css.scss
index 8c34da12d4..de705bbfa3 100644
--- a/app/assets/stylesheets/darkswarm/branding.css.scss
+++ b/app/assets/stylesheets/darkswarm/branding.css.scss
@@ -43,6 +43,9 @@ $black: #000;
$white: #fff;
$grey-050: #f7f7f7;
+$grey-100: #e6e6e6;
+$grey-200: #ddd;
+$grey-300: #ccc;
$grey-400: #bbb;
$grey-500: #999;
$grey-600: #777;
diff --git a/app/assets/stylesheets/darkswarm/checkout.css.scss b/app/assets/stylesheets/darkswarm/checkout.css.scss
index 2e1a2a528c..df51d9de34 100644
--- a/app/assets/stylesheets/darkswarm/checkout.css.scss
+++ b/app/assets/stylesheets/darkswarm/checkout.css.scss
@@ -13,7 +13,7 @@
checkout {
display: block;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
&.row .row {
margin-left: 0;
margin-right: 0;
@@ -24,7 +24,7 @@ checkout {
.button, table {
width: 100%;
}
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
form.edit_order {
border: 1px solid $disabled-bright;
margin-bottom: 2rem;
diff --git a/app/assets/stylesheets/darkswarm/distributor_header.css.scss b/app/assets/stylesheets/darkswarm/distributor_header.css.scss
index 8e3fdc2a9b..8e9ebf769b 100644
--- a/app/assets/stylesheets/darkswarm/distributor_header.css.scss
+++ b/app/assets/stylesheets/darkswarm/distributor_header.css.scss
@@ -1,3 +1,4 @@
+@import "mixins";
@import 'typography';
section {
@@ -34,7 +35,7 @@ section {
@include headingFont;
}
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
location, location + small {
display: block;
}
@@ -44,7 +45,7 @@ section {
margin-top: 0;
padding-top: 0.45em;
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
margin-bottom: 8px;
}
}
diff --git a/app/assets/stylesheets/darkswarm/embedded_shopfront.css.scss b/app/assets/stylesheets/darkswarm/embedded_shopfront.css.scss
index c1206ecc5e..210825a008 100644
--- a/app/assets/stylesheets/darkswarm/embedded_shopfront.css.scss
+++ b/app/assets/stylesheets/darkswarm/embedded_shopfront.css.scss
@@ -1,3 +1,4 @@
+@import "mixins";
@import "typography";
$large-menu-height: 4.6875rem;
@@ -97,7 +98,7 @@ body.embedded {
display: none;
}
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
nav.top-bar {
height: 3.4rem;
padding: 0.2rem $gutter-width;
@@ -141,7 +142,7 @@ body.embedded {
}
}
- @media all and (max-width: 480px) {
+ @include breakpoint(mobile) {
ul.left li.powered-by span {
display: none;
}
diff --git a/app/assets/stylesheets/darkswarm/home_panes.css.scss b/app/assets/stylesheets/darkswarm/home_panes.css.scss
index 92053189e2..60f881462d 100644
--- a/app/assets/stylesheets/darkswarm/home_panes.css.scss
+++ b/app/assets/stylesheets/darkswarm/home_panes.css.scss
@@ -66,7 +66,7 @@
font-weight: 300;
}
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
h2 {
font-size: 52px;
}
@@ -87,7 +87,7 @@
padding-bottom: 0;
}
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
.row .row {
padding: 0;
}
@@ -139,7 +139,7 @@
font-weight: 300;
color: $brand-colour;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
font-size: 45px;
}
}
diff --git a/app/assets/stylesheets/darkswarm/hub_node.css.scss b/app/assets/stylesheets/darkswarm/hub_node.css.scss
index cf0ae9ca46..f7e1ac5686 100644
--- a/app/assets/stylesheets/darkswarm/hub_node.css.scss
+++ b/app/assets/stylesheets/darkswarm/hub_node.css.scss
@@ -45,7 +45,7 @@
}
//Hub Link
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
a.hub {
display: block;
}
@@ -67,7 +67,7 @@
.active_table_row {
border: 1px solid transparent;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
border-color: $clr-brick-light;
}
@@ -85,7 +85,7 @@
}
&.open, &.closed {
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
.active_table_row:first-child .skinny-head {
background-color: $clr-brick-light;
@@ -164,7 +164,7 @@
}
}
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
.active_table_row:first-child .skinny-head {
background-color: rgba(255, 255, 255, 0.85);
}
@@ -218,7 +218,7 @@
}
// Small devices
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
.active_table_row:first-child .skinny-head {
background-color: $disabled-bright;
}
@@ -226,7 +226,7 @@
}
// Small devices
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
.active_table_row, .active_table_row:first-child, .active_table_row:last-child {
border-color: $disabled-bright;
background-color: transparent;
@@ -253,7 +253,7 @@
cursor: auto;
}
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
border-color: transparent;
}
}
diff --git a/app/assets/stylesheets/darkswarm/images.css.scss b/app/assets/stylesheets/darkswarm/images.css.scss
index 2a9f931f6e..cd939e3b42 100644
--- a/app/assets/stylesheets/darkswarm/images.css.scss
+++ b/app/assets/stylesheets/darkswarm/images.css.scss
@@ -13,7 +13,7 @@
&.placeholder {
opacity: 0.35;
- @media all and (max-width: 1024px) {
+ @include breakpoint(desktop) {
display: none;
}
}
@@ -31,7 +31,7 @@
max-height: 260px;
overflow: hidden;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
min-height: 68px;
}
}
diff --git a/app/assets/stylesheets/darkswarm/map.css.scss b/app/assets/stylesheets/darkswarm/map.css.scss
index d880b3025b..b0df5b66da 100644
--- a/app/assets/stylesheets/darkswarm/map.css.scss
+++ b/app/assets/stylesheets/darkswarm/map.css.scss
@@ -1,6 +1,7 @@
// Place all the styles related to the map controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
+@import "mixins";
@import "big-input";
.map-container {
@@ -29,7 +30,7 @@
margin-top: 1.2rem;
margin-left: 1rem;
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
width: 80%;
}
diff --git a/app/assets/stylesheets/darkswarm/menu.css.scss b/app/assets/stylesheets/darkswarm/menu.css.scss
index 23c2c8ae68..abefec7a23 100644
--- a/app/assets/stylesheets/darkswarm/menu.css.scss
+++ b/app/assets/stylesheets/darkswarm/menu.css.scss
@@ -171,7 +171,7 @@ nav.top-bar {
.tab-bar {
background-color: white;
border-bottom: 1px solid $light-grey-transparency;
- height: 2.8em;
+ height: $mobile-nav-height;
position: fixed;
width: 100%;
z-index: 1;
@@ -210,6 +210,10 @@ nav.top-bar {
}
}
+.off-canvas-wrap {
+ overflow: inherit;
+}
+
.off-canvas-list li.language-switcher ul li {
list-style-type: none;
padding-left: 0.5em;
diff --git a/app/assets/stylesheets/darkswarm/mixins.scss b/app/assets/stylesheets/darkswarm/mixins.scss
index 0643294c0c..2b38d89dea 100644
--- a/app/assets/stylesheets/darkswarm/mixins.scss
+++ b/app/assets/stylesheets/darkswarm/mixins.scss
@@ -16,7 +16,7 @@
padding-top: 100px;
padding-bottom: 100px;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
padding-top: 25px;
}
}
@@ -255,3 +255,18 @@
background-repeat: no-repeat;
background-size: 922px 922px;
}
+
+@mixin breakpoint($point) {
+ @if $point == desktop {
+ @media all and (max-width: 1024px) { @content; }
+ }
+ @else if $point == tablet {
+ @media all and (max-width: 768px) { @content; }
+ }
+ @else if $point == phablet {
+ @media all and (max-width: 640px) { @content; }
+ }
+ @else if $point == mobile {
+ @media all and (max-width: 480px) { @content; }
+ }
+}
diff --git a/app/assets/stylesheets/darkswarm/modal-enterprises.css.scss b/app/assets/stylesheets/darkswarm/modal-enterprises.css.scss
index 5d356028f8..0f52ab8b79 100644
--- a/app/assets/stylesheets/darkswarm/modal-enterprises.css.scss
+++ b/app/assets/stylesheets/darkswarm/modal-enterprises.css.scss
@@ -57,7 +57,7 @@
p {
line-height: 2.4;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
line-height: 1.4;
}
}
@@ -193,7 +193,7 @@
display: inline-block;
border-bottom: 1px solid transparent;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
display: none;
}
}
diff --git a/app/assets/stylesheets/darkswarm/page_alert.css.scss b/app/assets/stylesheets/darkswarm/page_alert.css.scss
index 59ccf327d0..4be82c8c2e 100644
--- a/app/assets/stylesheets/darkswarm/page_alert.css.scss
+++ b/app/assets/stylesheets/darkswarm/page_alert.css.scss
@@ -1,3 +1,4 @@
+@import "mixins";
@import "branding";
@import "animations";
@import "compass/css3/transition";
@@ -19,7 +20,7 @@ $page-alert-height: 55px;
margin: 0;
h6 {
- @media all and (max-width: 480px) {
+ @include breakpoint(mobile) {
font-size: 10px;
line-height: 24px;
}
diff --git a/app/assets/stylesheets/darkswarm/producer_node.css.scss b/app/assets/stylesheets/darkswarm/producer_node.css.scss
index 770a76564f..707c5d903b 100644
--- a/app/assets/stylesheets/darkswarm/producer_node.css.scss
+++ b/app/assets/stylesheets/darkswarm/producer_node.css.scss
@@ -4,7 +4,7 @@
.producers {
.active_table .active_table_node {
// Header row
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
.skinny-head {
background-color: $clr-turquoise-light;
@@ -137,7 +137,7 @@
.active_table_row.closed {
border: 1px solid transparent;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
border-color: $clr-turquoise-light;
}
diff --git a/app/assets/stylesheets/darkswarm/shop.css.scss b/app/assets/stylesheets/darkswarm/shop.css.scss
index cb7f86e216..6c477acb48 100644
--- a/app/assets/stylesheets/darkswarm/shop.css.scss
+++ b/app/assets/stylesheets/darkswarm/shop.css.scss
@@ -11,18 +11,98 @@
@import "shop-taxon-flag";
@import "shop-popovers";
+$sidebar-small-width: 75%;
+$sidebar-medium-width: 65%;
+$sidebar-large-width: 45%;
+$sidebar-footer-height: 5em;
+
.darkswarm {
+ .shop-filters-sidebar {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+
+ .background {
+ position: fixed;
+ top: 0;
+ right: 0;
+ z-index: 200;
+ height: 100%;
+ width: 100%;
+ background-color: $shop-sidebar-overlay;
+ opacity: 0;
+ transition: opacity $transition-sidebar;
+ }
+
+ &.shown {
+ .background {
+ opacity: 1;
+ }
+
+ .sidebar, .sidebar-footer {
+ margin-right: 0;
+ }
+ }
+
+ .sidebar {
+ position: fixed;
+ top: 0;
+ right: 0;
+ z-index: 210;
+ height: 100%;
+ width: $sidebar-large-width;
+ margin-right: -$sidebar-large-width;
+ background-color: rgba($white, 0.95);
+ padding: 1em;
+ transition: margin $transition-sidebar;
+ overflow-y: scroll;
+
+ .property-selectors {
+ margin-bottom: $sidebar-footer-height + 2em;
+ }
+ }
+
+ .sidebar-footer {
+ background-color: $grey-800;
+ width: $sidebar-large-width;
+ margin-right: -$sidebar-large-width;
+ height: $sidebar-footer-height;
+ position: fixed;
+ bottom: 0;
+ right: 0;
+ transition: margin $transition-sidebar;
+ padding: 1em;
+
+ button {
+ width: 48%;
+ }
+ }
+
+ @include breakpoint(tablet) {
+ .sidebar, .sidebar-footer {
+ width: $sidebar-medium-width;
+ margin-right: -$sidebar-medium-width;
+ }
+ }
+
+ @include breakpoint(mobile) {
+ .sidebar, .sidebar-footer {
+ width: $sidebar-small-width;
+ margin-right: -$sidebar-small-width;
+ }
+ }
+ }
+
products {
display: block;
- padding-top: 20px;
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
input.button.right {
float: left;
}
}
- @media all and (max-width: 480px) {
+ @include breakpoint(mobile) {
.add_to_cart {
margin-top: 2rem;
}
@@ -69,7 +149,7 @@
.bulk-buy {
font-size: 0.875rem;
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
font-size: 0.75rem;
}
}
@@ -92,7 +172,7 @@
font-size: 0.75em;
padding-right: 0.9375rem;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
padding-right: 0.25rem;
}
}
diff --git a/app/assets/stylesheets/darkswarm/shop_search.css.scss b/app/assets/stylesheets/darkswarm/shop_search.css.scss
new file mode 100644
index 0000000000..cbe0bf6bd4
--- /dev/null
+++ b/app/assets/stylesheets/darkswarm/shop_search.css.scss
@@ -0,0 +1,75 @@
+@import "mixins";
+@import "branding";
+@import "variables";
+
+.shop-searchbar {
+ background-color: $grey-100;
+ height: 5em;
+ padding: 1em 0;
+ margin-bottom: 1em;
+ position: relative;
+ z-index: 5;
+
+ .search-wrap {
+ position: relative;
+ width: 100%;
+ display: inline-flex;
+
+ .clear {
+ height: 1em;
+ width: 1em;
+ margin-top: 1em;
+ position: absolute;
+ right: 1em;
+ }
+ }
+
+ input#search {
+ height: 3em;
+ border-radius: $radius-small;
+ border: solid 1px $grey-300;
+ margin: 0;
+ padding: 0 2.25em 0 2.75em;
+ width: 100%;
+ min-width: 0;
+ background: $white url("/assets/icn-search-grey.png") 1em center no-repeat;
+ font-size: 1rem; // avoid zoom on iphone, see issue #4535
+
+ &::placeholder {
+ font-style: italic;
+ }
+
+ // Remove conflicting "clear search" buttons added by Chrome
+ &::-webkit-search-decoration,
+ &::-webkit-search-cancel-button,
+ &::-webkit-search-results-button,
+ &::-webkit-search-results-decoration {
+ display: none;
+ }
+ }
+
+ button {
+ background-color: $grey-600;
+ margin-left: 1em;
+ height: 3em;
+ width: 7em;
+ padding: 0;
+ font-size: 1em;
+ border-radius: $radius-small;
+ transition: none;
+
+ &:hover {
+ background-color: $grey-700;
+ }
+
+ @include breakpoint(mobile) {
+ margin-left: 0.75em;
+ }
+ }
+
+ @include breakpoint(desktop) {
+ position: -webkit-sticky;
+ position: sticky;
+ top: $mobile-nav-height;
+ }
+}
diff --git a/app/assets/stylesheets/darkswarm/shop_tabs.css.scss b/app/assets/stylesheets/darkswarm/shop_tabs.css.scss
index dce28ddde6..66bbb8998e 100644
--- a/app/assets/stylesheets/darkswarm/shop_tabs.css.scss
+++ b/app/assets/stylesheets/darkswarm/shop_tabs.css.scss
@@ -8,16 +8,18 @@
.tab-buttons {
color: $dark-grey;
box-shadow: $distributor-header-shadow;
+ position: relative;
+ z-index: 10;
.columns {
display: flex;
- @media all and (max-width: 1024px) {
+ @include breakpoint(desktop) {
display: table;
width: 100%;
}
- @media all and (max-width: 480px) {
+ @include breakpoint(mobile) {
padding: 0;
}
}
@@ -54,7 +56,7 @@
background: none;
}
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
padding: 0.35em 0 0.65em 0;
}
}
@@ -67,7 +69,7 @@
}
}
- @media all and (max-width: 1024px) {
+ @include breakpoint(desktop) {
display: table-cell;
width: auto;
}
@@ -104,7 +106,7 @@
p {
max-width: 100%;
- @media all and (max-width: 768px) {
+ @include breakpoint(tablet) {
height: auto !important;
}
}
diff --git a/app/assets/stylesheets/darkswarm/tabset.css.scss b/app/assets/stylesheets/darkswarm/tabset.css.scss
index c100bff672..4f4ab3c7b9 100644
--- a/app/assets/stylesheets/darkswarm/tabset.css.scss
+++ b/app/assets/stylesheets/darkswarm/tabset.css.scss
@@ -10,7 +10,7 @@
.tab {
text-align: center;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
text-align: left;
}
@@ -24,7 +24,7 @@
padding: 1em;
border: none;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
padding: 0.35em 0 0.65em 0;
text-shadow: none;
}
@@ -37,7 +37,7 @@
border-bottom: 4px solid $clr-brick-bright;
cursor: pointer;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
transition: none;
color: white;
background-color: $clr-brick-bright;
@@ -46,7 +46,7 @@
a {
color: $clr-brick-bright;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
color: #ffffff;
}
}
@@ -55,14 +55,14 @@
&.selected {
border-bottom: 4px solid $clr-brick;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
background-color: $clr-brick;
}
a {
color: $clr-brick;
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
color: #ffffff;
}
}
diff --git a/app/assets/stylesheets/darkswarm/taxons.css.scss b/app/assets/stylesheets/darkswarm/taxons.css.scss
index a5db89b324..006e15de58 100644
--- a/app/assets/stylesheets/darkswarm/taxons.css.scss
+++ b/app/assets/stylesheets/darkswarm/taxons.css.scss
@@ -57,7 +57,7 @@
}
}
- @media all and (max-width: 640px) {
+ @include breakpoint(phablet) {
render-svg {
svg {
width: 24px;
diff --git a/app/assets/stylesheets/darkswarm/ui.css.scss b/app/assets/stylesheets/darkswarm/ui.css.scss
index 4a50c4a1a0..66d72d6511 100644
--- a/app/assets/stylesheets/darkswarm/ui.css.scss
+++ b/app/assets/stylesheets/darkswarm/ui.css.scss
@@ -2,6 +2,7 @@
@import "branding";
@import "mixins";
@import "typography";
+@import "variables";
// Button class extensions
@@ -123,9 +124,37 @@ button.success, .button.success {
}
}
+button.large {
+ height: 3em;
+ font-size: 1em;
+ color: $white;
+ border-radius: $radius-medium;
+ margin: 0;
+ padding: 0;
+
+ &.dark {
+ background-color: $grey-800;
+ border: 1px solid $grey-600;
+ }
+
+ &.bright {
+ background-color: $orange-500;
+ border: none;
+ }
+}
+
// Responsive
@media screen and (min-width: 768px) {
[role="main"] {
padding: 0;
}
}
+
+.flex {
+ display: flex;
+}
+
+.no-gutter {
+ padding-right: 0;
+ padding-left: 0;
+}
diff --git a/app/assets/stylesheets/darkswarm/variables.css.scss b/app/assets/stylesheets/darkswarm/variables.css.scss
index 0b8104cea1..115212fc76 100644
--- a/app/assets/stylesheets/darkswarm/variables.css.scss
+++ b/app/assets/stylesheets/darkswarm/variables.css.scss
@@ -30,3 +30,11 @@ $topbar-dropdown-link-color: $black;
$topbar-dropdown-bg: $white;
$topbar-dropdown-link-bg: $white;
$topbar-dropdown-link-bg-hover: $white;
+
+$mobile-nav-height: 2.8em;
+
+$radius-small: 0.25em;
+$radius-medium: 0.5em;
+
+$shop-sidebar-overlay: rgba(0, 0, 0, 0.5);
+$transition-sidebar: 250ms ease-in-out 0s;
diff --git a/app/views/shared/menu/_joyride.html.haml b/app/views/shared/menu/_joyride.html.haml
index 6d732e0294..eb1875f383 100644
--- a/app/views/shared/menu/_joyride.html.haml
+++ b/app/views/shared/menu/_joyride.html.haml
@@ -1,4 +1,4 @@
-.joyride-tip-guide{"ng-class" => "{ in: open }", "ng-show" => "open"}
+.cart-dropdown.joyride-tip-guide{"ng-class" => "{ in: open }", "ng-show" => "open"}
%span.joyride-nub.top
.joyride-content-wrapper
%h5
diff --git a/app/views/shop/products/_applied_filters_feedback.haml b/app/views/shop/products/_applied_filters_feedback.haml
new file mode 100644
index 0000000000..45730f39cf
--- /dev/null
+++ b/app/views/shop/products/_applied_filters_feedback.haml
@@ -0,0 +1,9 @@
+%span{ "ng-show" => "query && ( appliedPropertiesList() || appliedTaxonsList() )" }
+ = t :products_filters_in
+
+%span.applied-properties{'ng-bind-html' => 'appliedPropertiesList()'}
+
+%span{ "ng-show" => "appliedPropertiesList() && appliedTaxonsList()" }
+ = t :products_and
+
+%span.applied-taxons{'ng-bind-html' => 'appliedTaxonsList()'}
diff --git a/app/views/shop/products/_filters.html.haml b/app/views/shop/products/_filters.html.haml
index 100ccecc0a..f0e69d1985 100644
--- a/app/views/shop/products/_filters.html.haml
+++ b/app/views/shop/products/_filters.html.haml
@@ -1,5 +1,5 @@
-.filter-shopfront.taxon-selectors.text-right{ng: {show: 'supplied_taxons != null'}}
- %single-line-selectors{ selectors: "taxonSelectors", objects: "supplied_taxons", "active-selectors" => "activeTaxons"}
+.filter-shopfront.taxon-selectors{ng: {show: 'supplied_taxons != null'}}
+ %filter-selector{ 'selector-set' => "taxonSelectors", objects: "supplied_taxons", "active-selectors" => "activeTaxons"}
-.filter-shopfront.property-selectors.text-right{ng: {show: 'supplied_properties != null'}}
- %single-line-selectors{ selectors: "propertySelectors", objects: "supplied_properties", "active-selectors" => "activeProperties"}
+.filter-shopfront.property-selectors{ng: {show: 'supplied_properties != null'}}
+ %filter-selector{ 'selector-set' => "propertySelectors", objects: "supplied_properties", "active-selectors" => "activeProperties"}
diff --git a/app/views/shop/products/_form.html.haml b/app/views/shop/products/_form.html.haml
index 5e45c44fa1..c4e6ea6908 100644
--- a/app/views/shop/products/_form.html.haml
+++ b/app/views/shop/products/_form.html.haml
@@ -1,54 +1,48 @@
-.footer-pad.small-12.columns
+%form{action: main_app.cart_path}
%products{"ng-controller" => "ProductsCtrl", "ng-init" => "refreshStaleData()", "ng-show" => "order_cycle.order_cycle_id != null", "ng-cloak" => true }
- // TODO: Needs an ng-show to slide content down
- .row.animate-slide{ "ng-show" => "query || appliedPropertiesList() || appliedTaxonsList()" }
+ = render partial: "shop/products/searchbar"
+
+ .row
.small-12.columns
- .alert-box.search-alert.ng-scope
- %a.right{"ng-click" => "clearAll()"}
- = t :products_clear_all
- %i.ofn-i_009-close
- %span.filter-label
- = t :products_showing
- %span.applied-properties
- {{ appliedPropertiesList() }}
- %span.applied-taxons
- {{ appliedTaxonsList() }}
- %span{ ng: { hide: "!query"} }
- %span{ "ng-show" => "appliedPropertiesList() || appliedTaxonsList()" }
- = t :products_with
- %span.applied-search "{{ query }}"
- .row
- .small-12.medium-6.large-5.columns
- %input#search.text{"ng-model" => "query",
- placeholder: t(:products_search),
- "ng-debounce" => "200",
- "ofn-disable-enter" => true}
-
- .small-12.medium-6.large-6.large-offset-1.columns
- = render partial: "shop/products/filters"
-
- .row
- %div.pad-top{ "infinite-scroll" => "loadMore()", "infinite-scroll-distance" => "1", "infinite-scroll-disabled" => 'Products.loading' }
- %product.animate-repeat{"ng-controller" => "ProductNodeCtrl", "ng-repeat" => "product in Products.products track by product.id", "id" => "product-{{ product.id }}"}
- = render "shop/products/summary"
- %shop-variant{variant: 'variant', "ng-repeat" => "variant in product.variants | orderBy: ['name_to_display','unit_value'] track by variant.id", "id" => "variant-{{ variant.id }}", "ng-class" => "{'out-of-stock': !variant.on_demand && variant.on_hand == 0}"}
-
- %product{"ng-show" => "Products.loading"}
- .row.summary
- .small-12.columns.text-center
- = t :products_loading
+ .footer-pad.small-12.columns.no-gutter
.row
- .small-12.columns.text-center
- %img.spinner{ src: "/assets/spinning-circles.svg" }
+ .medium-12.large-10.columns
+ = render partial: "shop/products/search_feedback"
- %div{"ng-show" => "Products.products.length == 0 && !Products.loading"}
- .row.summary
- .small-12.columns
- %p.no-results
- = t :search_no_results_html, query: "{{query}}".html_safe
- .row
- .small-12.columns
- %form{action: main_app.cart_path}
- %i.ofn-i_011-spinner.cart-spinner{"ng-show" => "Cart.dirty"}
- %input.small.button.primary.right.add_to_cart{type: :submit, value: "{{ Cart.dirty ? '#{t(:products_updating_cart)}' : (Cart.empty() ? '#{t(:products_cart_empty)}' : '#{t(:products_edit_cart)}' ) }}", "ng-disabled" => "Cart.dirty || Cart.empty()", "ng-class" => "{ dirty: Cart.dirty }" }
+ %div.pad-top{ "infinite-scroll" => "loadMore()", "infinite-scroll-distance" => "1", "infinite-scroll-disabled" => 'Products.loading' }
+ %product.animate-repeat{"ng-controller" => "ProductNodeCtrl", "ng-repeat" => "product in Products.products track by product.id", "id" => "product-{{ product.id }}"}
+ = render "shop/products/summary"
+ %shop-variant{variant: 'variant', "ng-repeat" => "variant in product.variants | orderBy: ['name_to_display','unit_value'] track by variant.id", "id" => "variant-{{ variant.id }}", "ng-class" => "{'out-of-stock': !variant.on_demand && variant.on_hand == 0}"}
+
+ %product{"ng-show" => "Products.loading"}
+ .row.summary
+ .small-12.columns.text-center
+ = t :products_loading
+ .row
+ .small-12.columns.text-center
+ %img.spinner{ src: "/assets/spinning-circles.svg" }
+
+ .hide-for-medium-down.large-2.columns
+ %h5
+ = t(:products_filter_by)
+ %span{ng: {show: 'filtersCount()' }}
+ = "({{ filtersCount() }} #{t(:products_filter_selected)})"
+
+ = render partial: "shop/products/filters"
+
+ .shop-filters-sidebar.hide-for-large-up{ng: {show: 'showFilterSidebar', class: "{'shown': showFilterSidebar}"}}
+ .background{ng: {click: 'toggleFilterSidebar()'}}
+ .sidebar
+ %h5
+ = t(:products_filter_by)
+ %span{ng: {show: 'filtersCount()' }}
+ = "({{ filtersCount() }} #{t(:products_filter_selected)})"
+
+ = render partial: "shop/products/filters"
+
+ .sidebar-footer
+ %button.large.dark.left{type: 'button', ng: {click: 'clearFilters()'}}
+ = t(:products_filter_clear)
+ %button.large.bright.right{type: 'button', ng: {click: 'toggleFilterSidebar()'}}
+ = t(:products_filter_done)
diff --git a/app/views/shop/products/_search_feedback.haml b/app/views/shop/products/_search_feedback.haml
new file mode 100644
index 0000000000..ea6b0c7f22
--- /dev/null
+++ b/app/views/shop/products/_search_feedback.haml
@@ -0,0 +1,24 @@
+.row.animate-slide{ "ng-show" => "query || appliedPropertiesList() || appliedTaxonsList()" }
+ .small-12.columns
+ .alert-box.search-alert.ng-scope
+ %div{"ng-show" => "Products.products.length > 0"}
+
+ %a.clear-all.right{"ng-click" => "clearAll()"}
+ = t :products_clear
+ %i.ofn-i_009-close
+
+ %span.filter-label
+ = t :products_results_for
+ %span{ ng: { hide: "!query"} }
+ %span.applied-search
+ {{ query }}
+ = render partial: 'shop/products/applied_filters_feedback'
+
+ %div.no-results-bar{"ng-show" => "Products.products.length == 0 && !Products.loading"}
+ .row.summary
+ .small-12.columns
+ %p.no-results
+ = t :products_no_results_html, query: "{{query}}".html_safe
+ = render partial: 'shop/products/applied_filters_feedback'
+ %button.clear-search{type: 'button', ng: {click: 'clearAll()'}}
+ = t :products_clear_search
diff --git a/app/views/shop/products/_searchbar.haml b/app/views/shop/products/_searchbar.haml
new file mode 100644
index 0000000000..fa9fb962a4
--- /dev/null
+++ b/app/views/shop/products/_searchbar.haml
@@ -0,0 +1,17 @@
+.shop-searchbar
+ .row
+ .small-12.large-5.columns.flex
+ %div.search-wrap
+ %input#search.text{"ng-model" => "query",
+ type: 'search',
+ placeholder: t(:products_search),
+ "ng-debounce" => "200",
+ "ofn-disable-enter" => true}
+ %a.clear{type: 'button', ng: {show: 'query', click: 'clearQuery()'}, 'focus-search' => true}
+ %img{ src: "/assets/icn-close.png" }
+
+ .hide-for-large-up
+ %button{type: 'button', ng: {click: 'toggleFilterSidebar()'}}
+ = t(:products_filter_heading)
+ %span{ng: {show: 'filtersCount()' }}
+ ({{ filtersCount() }})
diff --git a/app/views/shopping_shared/tabs/_shop.html.haml b/app/views/shopping_shared/tabs/_shop.html.haml
index 8628b91178..2c23b4e8c1 100644
--- a/app/views/shopping_shared/tabs/_shop.html.haml
+++ b/app/views/shopping_shared/tabs/_shop.html.haml
@@ -6,7 +6,5 @@
= render partial: "shop/messages/closed_shop"
- else
- .row
- .small-12.columns
- = render partial: "shop/messages/select_oc"
- = render partial: "shop/products/form"
+ = render partial: "shop/messages/select_oc"
+ = render partial: "shop/products/form"
diff --git a/config/locales/en.yml b/config/locales/en.yml
index fa92cb72a1..01ba7cebd2 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1648,11 +1648,19 @@ See the %{link} to find out more about %{sitename}'s features and to start using
other: You have %{count} orders with %{shop} currently open for review. You can make changes until %{oc_close}.
orders_changeable_orders_alert_html: This order has been confirmed, but you can make changes until %{oc_close}.
- products_clear_all: Clear all
+ products_clear: Clear
products_showing: "Showing:"
- products_or: "OR"
+ products_results_for: "Results for"
+ products_or: "or"
+ products_and: "and"
+ products_filters_in: "in"
products_with: with
- products_search: "Search by product or producer"
+ products_search: "Search..."
+ products_filter_by: "Filter by"
+ products_filter_selected: "selected"
+ products_filter_heading: "Filters"
+ products_filter_clear: "Clear"
+ products_filter_done: "Done"
products_loading: "Loading products..."
products_updating_cart: "Updating cart..."
products_cart_empty: "Cart empty"
@@ -1663,6 +1671,8 @@ See the %{link} to find out more about %{sitename}'s features and to start using
products_update_error_msg: "Saving failed."
products_update_error_data: "Save failed due to invalid data:"
products_changes_saved: "Changes saved."
+ products_no_results_html: "Sorry, no results found for %{query}"
+ products_clear_search: "Clear search"
search_no_results_html: "Sorry, no results found for %{query}. Try another search?"
diff --git a/spec/features/consumer/shopping/cart_spec.rb b/spec/features/consumer/shopping/cart_spec.rb
index ace11e775a..6a02206e1d 100644
--- a/spec/features/consumer/shopping/cart_spec.rb
+++ b/spec/features/consumer/shopping/cart_spec.rb
@@ -34,7 +34,7 @@ feature "full-page cart", js: true do
click_link "Continue shopping"
expect(page).to have_no_link "Continue shopping"
- expect(page).to have_button "Edit your cart"
+ expect(page).to have_link "Shop"
expect(page).to have_no_content distributor.preferred_shopfront_message
end
end
diff --git a/spec/features/consumer/shopping/embedded_shopfronts_spec.rb b/spec/features/consumer/shopping/embedded_shopfronts_spec.rb
index 290c6af516..20c7bfccb8 100644
--- a/spec/features/consumer/shopping/embedded_shopfronts_spec.rb
+++ b/spec/features/consumer/shopping/embedded_shopfronts_spec.rb
@@ -46,9 +46,8 @@ feature "Using embedded shopfront functionality", js: true do
it "allows shopping and checkout" do
on_embedded_page do
fill_in "variants[#{variant.id}]", with: 1
- wait_until_enabled 'input.add_to_cart'
- first("input.add_to_cart:not([disabled='disabled'])").click
+ edit_cart
expect(page).to have_text 'Your shopping cart'
find('a#checkout-link').click
@@ -91,11 +90,11 @@ feature "Using embedded shopfront functionality", js: true do
it "redirects to embedded hub on logout when embedded" do
on_embedded_page do
- wait_for_shop_loaded
+ wait_for_cart
find('ul.right li#login-link a').click
login_with_modal
- wait_for_shop_loaded
+ wait_for_cart
wait_until { page.find('ul.right li.user-menu.has-dropdown').value.present? }
logout_via_navigation
@@ -106,14 +105,6 @@ feature "Using embedded shopfront functionality", js: true do
private
- # When you have pending changes and try to navigate away from a page, it asks you "Are you sure?".
- # When we click the "Update" button to save changes, we need to wait
- # until it is actually saved and "loading" disappears before doing anything else.
- def wait_for_shop_loaded
- page.has_no_content? "Loading"
- page.has_no_css? "input[value='Updating cart...']"
- end
-
def login_with_modal
page.has_selector? 'div.login-modal', visible: true
diff --git a/spec/features/consumer/shopping/variant_overrides_spec.rb b/spec/features/consumer/shopping/variant_overrides_spec.rb
index 8b37f5d22e..a4279786da 100644
--- a/spec/features/consumer/shopping/variant_overrides_spec.rb
+++ b/spec/features/consumer/shopping/variant_overrides_spec.rb
@@ -86,7 +86,7 @@ feature "shopping with variant overrides defined", js: true do
it "shows the correct prices in the shopping cart" do
fill_in "variants[#{product1_variant1.id}]", with: "2"
- add_to_cart
+ edit_cart
expect(page).to have_selector "tr.line-item.variant-#{product1_variant1.id} .cart-item-price", text: with_currency(61.11)
expect(page).to have_field "order[line_items_attributes][0][quantity]", with: '2'
diff --git a/spec/support/request/shop_workflow.rb b/spec/support/request/shop_workflow.rb
index ff5909f267..cde1437b04 100644
--- a/spec/support/request/shop_workflow.rb
+++ b/spec/support/request/shop_workflow.rb
@@ -1,7 +1,17 @@
module ShopWorkflow
- def add_to_cart
- wait_until_enabled 'input.add_to_cart'
- first("input.add_to_cart:not([disabled='disabled'])").click
+ def wait_for_cart
+ first("#cart").click
+ within '.cart-dropdown' do
+ expect(page).to_not have_link "Updating cart..."
+ end
+ end
+
+ def edit_cart
+ wait_for_cart
+ within '.cart-dropdown' do
+ expect(page).to have_link "Edit your cart"
+ end
+ first("a.add_to_cart").click
end
def have_price(price)