From cad8f8a7a8e67ab4efc321f24892d53e8b7d0c52 Mon Sep 17 00:00:00 2001 From: summerscope Date: Fri, 13 Jun 2014 14:20:10 +1000 Subject: [PATCH 01/32] New stylesheet to style taxon SVG icons --- .../stylesheets/darkswarm/taxons.css.sass | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 app/assets/stylesheets/darkswarm/taxons.css.sass diff --git a/app/assets/stylesheets/darkswarm/taxons.css.sass b/app/assets/stylesheets/darkswarm/taxons.css.sass new file mode 100644 index 0000000000..57ae6e6b70 --- /dev/null +++ b/app/assets/stylesheets/darkswarm/taxons.css.sass @@ -0,0 +1,33 @@ +@import branding +@import mixins + +.fat-taxons + @include csstrans + display: inline-block + line-height: 1 + margin-right: 0.5rem + margin-bottom: 0.2rem + text-transform: uppercase + font-size: 1rem + // border: 1px solid $disabled-bright + padding: 0.25rem 0.5rem 0.25rem 0.35rem + render-svg + svg + width: 16px + height: 16px + path + fill: $dark-grey + &, &* + display: inline-block + color: $dark-grey + // &:hover, &.hover, &:active + // background: rgba(255,255,255,0.5) + +.summary-header + @include csstrans + render-svg + svg + width: 18px + height: 18px + path + fill: $clr-brick \ No newline at end of file From 3f72c8601b19f130702a7fcf2b63a903ed64a05c Mon Sep 17 00:00:00 2001 From: summerscope Date: Fri, 13 Jun 2014 14:20:31 +1000 Subject: [PATCH 02/32] Remove SVG styling from this scss - now in taxons.css.sass --- app/assets/stylesheets/darkswarm/shop.css.sass | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/assets/stylesheets/darkswarm/shop.css.sass b/app/assets/stylesheets/darkswarm/shop.css.sass index b37c985884..312efb2188 100644 --- a/app/assets/stylesheets/darkswarm/shop.css.sass +++ b/app/assets/stylesheets/darkswarm/shop.css.sass @@ -124,9 +124,6 @@ .summary-header @include csstrans font-size: 1.15rem - - object.taxon - height: 18px &, & * @include avenir From f1497c9c5a3fe3938e475c134d26b759330001d6 Mon Sep 17 00:00:00 2001 From: summerscope Date: Fri, 13 Jun 2014 14:20:47 +1000 Subject: [PATCH 03/32] Remove SVG styling from this scss - now in taxons.css.sass --- .../stylesheets/darkswarm/hub_node.css.sass | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/app/assets/stylesheets/darkswarm/hub_node.css.sass b/app/assets/stylesheets/darkswarm/hub_node.css.sass index 7dd6686d09..d13831661b 100644 --- a/app/assets/stylesheets/darkswarm/hub_node.css.sass +++ b/app/assets/stylesheets/darkswarm/hub_node.css.sass @@ -36,22 +36,6 @@ //Open row &.open - .fat-taxons - @include csstrans - margin-right: 0.5rem - text-transform: uppercase - font-size: 1rem - line-height: 1 - color: $dark-grey - // border: 1px solid $disabled-bright - display: inline-block - padding: 0.2rem 0.5rem 0.35rem 0.35rem - - object.taxon - height: 20px - // &:hover, &.hover, &:active - // background: rgba(255,255,255,0.5) - .active_table_row:first-child border-top: 1px solid $clr-brick border-left: 1px solid $clr-brick From b0693114753c0e4b175c8052cda488694d511db1 Mon Sep 17 00:00:00 2001 From: summerscope Date: Fri, 13 Jun 2014 14:20:58 +1000 Subject: [PATCH 04/32] New animation mixin --- app/assets/stylesheets/darkswarm/mixins.sass | 27 ++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/app/assets/stylesheets/darkswarm/mixins.sass b/app/assets/stylesheets/darkswarm/mixins.sass index a9894a5b10..6cadb271c2 100644 --- a/app/assets/stylesheets/darkswarm/mixins.sass +++ b/app/assets/stylesheets/darkswarm/mixins.sass @@ -32,6 +32,33 @@ transition: all 100ms ease-in-out -webkit-transform-style: preserve-3d +@mixin animate-in + -webkit-animation: cssAnimation 100ms 1 ease-in + -moz-animation: cssAnimation 100ms 1 ease-in + -o-animation: cssAnimation 100ms 1 ease-in + + @-webkit-keyframes cssAnimation + from + -webkit-transform: rotate(180deg) scale(0.25) skew(0deg) translate(0px) + to + -webkit-transform: rotate(0deg) scale(1) skew(0deg) translate(0px) + + + @-moz-keyframes cssAnimation + from + -moz-transform: rotate(180deg) scale(0.25) skew(0deg) translate(0px) + to + -moz-transform: rotate(0deg) scale(1) skew(0deg) translate(0px) + + + @-o-keyframes cssAnimation + from + -o-transform: rotate(180deg) scale(0.25) skew(0deg) translate(0px) + to + -o-transform: rotate(0deg) scale(1) skew(0deg) translate(0px) + + + @mixin box-shadow($box-shadow) -moz-box-shadow: $box-shadow -webkit-box-shadow: $box-shadow From 17682dbc580926438b8d9a0f9d30fdda1c520581 Mon Sep 17 00:00:00 2001 From: Will Marshall Date: Fri, 13 Jun 2014 14:31:55 +1000 Subject: [PATCH 05/32] fixing issue 750 --- .../checkout/payment_controller.js.coffee | 16 +++++++++++++++- .../spree/checkout/payment/_gateway.html.haml | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/darkswarm/controllers/checkout/payment_controller.js.coffee b/app/assets/javascripts/darkswarm/controllers/checkout/payment_controller.js.coffee index 33a06e5d1f..9ae7c14b90 100644 --- a/app/assets/javascripts/darkswarm/controllers/checkout/payment_controller.js.coffee +++ b/app/assets/javascripts/darkswarm/controllers/checkout/payment_controller.js.coffee @@ -2,7 +2,21 @@ Darkswarm.controller "PaymentCtrl", ($scope, $timeout) -> angular.extend(this, new FieldsetMixin($scope)) $scope.name = "payment" - $scope.months = {1: "January", 2: "February", 3: "March", 4: "April", 5: "May", 6: "June", 7: "July", 8: "August", 9: "September", 10: "October", 11: "November", 12: "December"} + $scope.months = [ + {key: "January", value: "1"}, + {key: "February", value: "2"}, + {key: "March", value: "3"}, + {key: "April", value: "4"}, + {key: "May", value: "5"}, + {key: "June", value: "6"}, + {key: "July", value: "7"}, + {key: "August", value: "8"}, + {key: "September", value: "9"}, + {key: "October", value: "10"}, + {key: "November", value: "11"}, + {key: "December", value: "12"}, + ] + $scope.years = [moment().year()..(moment().year()+15)] $scope.secrets.card_month = "1" $scope.secrets.card_year = moment().year() diff --git a/app/views/spree/checkout/payment/_gateway.html.haml b/app/views/spree/checkout/payment/_gateway.html.haml index 66b189f39b..0b801cb420 100644 --- a/app/views/spree/checkout/payment/_gateway.html.haml +++ b/app/views/spree/checkout/payment/_gateway.html.haml @@ -20,6 +20,6 @@ .row .small-6.columns - %select{"ng-model" => "secrets.card_month", "ng-options" => "number as name for (number, name) in months", name: "secrets.card_month", required: true} + %select{"ng-model" => "secrets.card_month", "ng-options" => "currMonth.value as currMonth.key for currMonth in months", name: "secrets.card_month", required: true} .small-6.columns %select{"ng-model" => "secrets.card_year", "ng-options" => "year for year in years", name: "secrets.card_year", required: true} From 5f155df42ae5cd84dbe42c00b8e8a9156a1e4137 Mon Sep 17 00:00:00 2001 From: summerscope Date: Fri, 13 Jun 2014 14:32:06 +1000 Subject: [PATCH 06/32] Making input label in shopfront small to distinguish from variant name and price --- app/views/shop/products/_master.html.haml | 2 +- app/views/shop/products/_variants.html.haml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/shop/products/_master.html.haml b/app/views/shop/products/_master.html.haml index 59c0911cfd..c06acb5cb1 100644 --- a/app/views/shop/products/_master.html.haml +++ b/app/views/shop/products/_master.html.haml @@ -15,7 +15,7 @@ name: "variants[{{product.master.id}}]", id: "variants_{{product.master.id}}", "ng-model" => "product.quantity"} - {{ product.master.unit_to_display }} + %small {{ product.master.unit_to_display }} -# WITH GROUP BUY .small-2.columns{"bo-if" => "product.group_buy"} diff --git a/app/views/shop/products/_variants.html.haml b/app/views/shop/products/_variants.html.haml index 1863bf7c1c..9faaa5e8b1 100644 --- a/app/views/shop/products/_variants.html.haml +++ b/app/views/shop/products/_variants.html.haml @@ -18,7 +18,7 @@ max: "{{variant.on_demand && 9999 || variant.count_on_hand }}", name: "variants[{{variant.id}}]", id: "variants_{{variant.id}}", "bo-model" => "variant.quantity"} - {{ variant.unit_to_display }} + %small {{ variant.unit_to_display }} -# WITH GROUP BUY .small-2.columns{"bo-if" => "product.group_buy"} @@ -39,7 +39,7 @@ max: "{{variant.on_demand && 9999 || variant.count_on_hand }}", name: "variant_attributes[{{variant.id}}][max_quantity]", "ng-model" => "variant.max_quantity"} - {{ variant.unit_to_display }} + %small {{ variant.unit_to_display }} .small-2.columns.text-right.price {{ variant.price | currency }} From 923a615dfaffc2d4c9e5c4f3566fa653d9bb5bcf Mon Sep 17 00:00:00 2001 From: summerscope Date: Sat, 14 Jun 2014 21:00:32 +1000 Subject: [PATCH 07/32] Site tagline constrain width on large screens to improve text flow --- app/assets/stylesheets/darkswarm/home_tagline.css.sass | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/assets/stylesheets/darkswarm/home_tagline.css.sass b/app/assets/stylesheets/darkswarm/home_tagline.css.sass index 2c3d01661d..3d00cb7a96 100644 --- a/app/assets/stylesheets/darkswarm/home_tagline.css.sass +++ b/app/assets/stylesheets/darkswarm/home_tagline.css.sass @@ -15,6 +15,9 @@ margin-bottom: 1em h2 font-size: 1.6875rem + max-width: 610px + margin: 0 auto + a color: $clr-brick-bright &:hover, &:active, &:focus From 80f26c74574467765361fadb28a66500cd1953a4 Mon Sep 17 00:00:00 2001 From: summerscope Date: Tue, 17 Jun 2014 10:50:47 +1000 Subject: [PATCH 08/32] Tweak label until shipping methods are available --- app/views/shop/show.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/shop/show.html.haml b/app/views/shop/show.html.haml index ad0080edae..8b1d08d08f 100644 --- a/app/views/shop/show.html.haml +++ b/app/views/shop/show.html.haml @@ -6,9 +6,9 @@ Next order closing %strong {{ OrderCycle.orders_close_at() | date_in_words }} - %span Ready for pickup + %span Ready for - / Will this label should be a variable to reflect pickup or delivery as appropriate + / Will this label should be a variable to reflect 'Ready for pickup / delivery' as appropriate %select.avenir#order_cycle_id{"ng-model" => "order_cycle.order_cycle_id", "ng-change" => "changeOrderCycle()", From 9bbfc0a39339daf00c33abaaf6ea4ef0daebe179 Mon Sep 17 00:00:00 2001 From: Will Marshall Date: Tue, 17 Jun 2014 12:35:03 +1000 Subject: [PATCH 09/32] Starting a set of small functional changes --- .../darkswarm/services/map_modal.js.coffee | 5 +- .../templates/map_modal_hub.html.haml | 49 +++++++++++++++++++ ...html.haml => map_modal_producer.html.haml} | 0 .../stylesheets/darkswarm/ie_warning.sass | 9 ++++ app/controllers/map_controller.rb | 1 + app/views/home/_fat.html.haml | 14 +++++- app/views/json/_enterprises_for_map.rabl | 7 ++- app/views/layouts/darkswarm.html.haml | 7 +++ 8 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 app/assets/javascripts/templates/map_modal_hub.html.haml rename app/assets/javascripts/templates/{map_modal.html.haml => map_modal_producer.html.haml} (100%) create mode 100644 app/assets/stylesheets/darkswarm/ie_warning.sass diff --git a/app/assets/javascripts/darkswarm/services/map_modal.js.coffee b/app/assets/javascripts/darkswarm/services/map_modal.js.coffee index e6631a92f4..d26384cc48 100644 --- a/app/assets/javascripts/darkswarm/services/map_modal.js.coffee +++ b/app/assets/javascripts/darkswarm/services/map_modal.js.coffee @@ -3,4 +3,7 @@ Darkswarm.factory "MapModal", ($modal, $rootScope)-> open: (enterprise)-> scope = $rootScope.$new(true) # Spawn an isolate to contain the enterprise scope.enterprise = enterprise - $modal.open(templateUrl: "map_modal.html", scope: scope) + if enterprise['is_primary_producer?'] + $modal.open(templateUrl: "map_modal_producer.html", scope: scope) + else + $modal.open(templateUrl: "map_modal_hub.html", scope: scope) diff --git a/app/assets/javascripts/templates/map_modal_hub.html.haml b/app/assets/javascripts/templates/map_modal_hub.html.haml new file mode 100644 index 0000000000..4b5fab15fb --- /dev/null +++ b/app/assets/javascripts/templates/map_modal_hub.html.haml @@ -0,0 +1,49 @@ +.row + .small-12.columns.producer-hero + %h3.producer-name + %i.ofn-i_040-hub + {{ enterprise.name }} + {{ enterprise.id }} + %img.producer-hero-img{"ng-src" => "{{enterprise.promo_image}}"} + +.row + .small-12.large-6.columns + %p{"ng-bind-html" => "enterprise.long_description"} + .small-12.large-6.columns + %img.producer-logo{"ng-src" => "{{enterprise.logo}}", "ng-if" => "enterprise.logo"} + %h5 Stay in touch with {{ enterprise.name }} + + %ul.small-block-grid-1{bindonce: true} + + %li{"ng-if" => "enterprise.website"} + %a{"ng-href" => "http://{{enterprise.website | stripUrl}}", target: "_blank" } + %i.ofn-i_049-web + {{ enterprise.website | stripUrl }} + + %li{"ng-if" => "enterprise.email"} + %a{"ng-href" => "mailto:{{enterprise.email | stripUrl}}", target: "_blank" } + %i.ofn-i_050-mail-circle + {{ enterprise.email | stripUrl }} + + %li{"ng-if" => "enterprise.twitter"} + %a{"ng-href" => "http://twitter.com/{{enterprise.twitter}}", target: "_blank"} + %i.ofn-i_041-twitter + {{ enterprise.twitter }} + + %li{"ng-if" => "enterprise.facebook"} + %a{"ng-href" => "http://{{enterprise.facebook | stripUrl}}", target: "_blank"} + %i.ofn-i_044-facebook + {{ enterprise.facebook | stripUrl }} + + %li{"ng-if" => "enterprise.linkedin"} + %a{"ng-href" => "http://{{enterprise.linkedin | stripUrl}}", target: "_blank"} + %i.ofn-i_042-linkedin + {{ enterprise.linkedin | stripUrl }} + + %li{"ng-if" => "enterprise.instagram"} + %a{"ng-href" => "http://instagram.com/{{enterprise.instagram}}", target: "_blank"} + %i.ofn-i_043-instagram + {{ enterprise.instagram }} + + %a.close-reveal-modal{"ng-click" => "$close()"} + %i.ofn-i_009-close diff --git a/app/assets/javascripts/templates/map_modal.html.haml b/app/assets/javascripts/templates/map_modal_producer.html.haml similarity index 100% rename from app/assets/javascripts/templates/map_modal.html.haml rename to app/assets/javascripts/templates/map_modal_producer.html.haml diff --git a/app/assets/stylesheets/darkswarm/ie_warning.sass b/app/assets/stylesheets/darkswarm/ie_warning.sass new file mode 100644 index 0000000000..f0fc9099ee --- /dev/null +++ b/app/assets/stylesheets/darkswarm/ie_warning.sass @@ -0,0 +1,9 @@ +#ie-warning + background: white + position: fixed + top: 0 + z-index: 200 + left: 0 + width: 100% + font-size: 1.2em + padding: 20px diff --git a/app/controllers/map_controller.rb b/app/controllers/map_controller.rb index e4c4627f5f..b5c9ceba83 100644 --- a/app/controllers/map_controller.rb +++ b/app/controllers/map_controller.rb @@ -1,6 +1,7 @@ class MapController < BaseController layout 'darkswarm' def index + @active_distributors ||= Enterprise.distributors_with_active_order_cycles @enterprises = Enterprise.visible end end diff --git a/app/views/home/_fat.html.haml b/app/views/home/_fat.html.haml index 25c48006e8..11af6e2454 100644 --- a/app/views/home/_fat.html.haml +++ b/app/views/home/_fat.html.haml @@ -24,7 +24,7 @@ %li{"ng-repeat" => "producer in hub.producers"} = render partial: "modals/producer" -.row.active_table_row.link{"ng-show" => "open()", "ng-if" => "hub.active"} +.row.active_table_row.link{"ng-show" => "open()", "bo-if" => "hub.active"} .columns.small-11 %a{"bo-href" => "hub.path", "ofn-empties-cart" => "hub", change: "Change hub to", shop: "Shop at"} @@ -32,3 +32,15 @@ .columns.small-1.text-right %a{"bo-href" => "hub.path"} %i.ofn-i_007-caret-right + +.row.active_table_row.link{"ng-show" => "open()", "bo-if" => "!hub.active"} + .columns.small-11 + %a{"bo-href" => "hub.path", "ofn-empties-cart" => "hub", + change: "Change hub to (disabled)", shop: "Shop at (disabled)"} + + .columns.small-1.text-right + + %a{"bo-href" => "hub.path"} + %i.ofn-i_007-caret-right + + diff --git a/app/views/json/_enterprises_for_map.rabl b/app/views/json/_enterprises_for_map.rabl index 006f2e3cca..4da6309abc 100644 --- a/app/views/json/_enterprises_for_map.rabl +++ b/app/views/json/_enterprises_for_map.rabl @@ -1,14 +1,19 @@ collection @enterprises extends 'json/enterprises' -attributes :latitude, :longitude, :long_description, :website, :instagram, :linkedin, :twitter, :facebook +attributes :latitude, :longitude, :long_description, :website, :instagram, :linkedin, :twitter, :facebook, :is_primary_producer?, :is_distributor? node :logo do |enterprise| enterprise.logo(:medium) if enterprise.logo.exists? end + node :promo_image do |enterprise| enterprise.promo_image(:large) if enterprise.promo_image.exists? end +node :active do |enterprise| + @active_distributors.include?(enterprise) +end + node :icon do |e| if e.is_primary_producer? and e.is_distributor? image_path "map-icon-both.svg" diff --git a/app/views/layouts/darkswarm.html.haml b/app/views/layouts/darkswarm.html.haml index da314d514c..5208c3d5ef 100644 --- a/app/views/layouts/darkswarm.html.haml +++ b/app/views/layouts/darkswarm.html.haml @@ -18,6 +18,13 @@ = csrf_meta_tags %body.off-canvas{"ng-app" => "Darkswarm"} + /[if lte IE 8] + #ie-warning + Your browser is very old! To use our site, you'll need to upgrade to + something a bit more modern, such as + %a{href: "https://www.google.com/intl/en_au/chrome/browser/"} Google Chrome + + = inject_json "currentHub", "current_hub" = inject_json "currentOrder", "current_order" = inject_json "user", "current_user" From 57c5c2d411357334afcdaf4068468dca1a79d111 Mon Sep 17 00:00:00 2001 From: Will Marshall Date: Tue, 17 Jun 2014 14:34:38 +1000 Subject: [PATCH 10/32] Changing icon markup --- app/views/modals/_product.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/modals/_product.html.haml b/app/views/modals/_product.html.haml index b2281d64ca..7c45a6ccab 100644 --- a/app/views/modals/_product.html.haml +++ b/app/views/modals/_product.html.haml @@ -4,7 +4,7 @@ %img.product-img{"ng-src" => "{{product.master.images[0].large_url}}", "ng-if" => "product.master.images[0]"} .columns.small-12.large-6 %h2 - %img{"ng-src" => "{{product.primary_taxon.icon}}"} + %render-svg{path: "{{product.primary_taxon.icon}}"} {{product.name}} %p {{product.description}} %a.close-reveal-modal{"ng-click" => "$close()"} From 37fee5c316cad34c1ab89c76a9bd72b76c45e83f Mon Sep 17 00:00:00 2001 From: Will Marshall Date: Tue, 17 Jun 2014 16:33:31 +1000 Subject: [PATCH 11/32] Reworking the empties cart and active table link stuff --- .../directives/active_table_hub_link.js.coffee | 12 ++++++++++++ .../darkswarm/directives/empties_cart.js.coffee | 9 ++------- app/views/home/_fat.html.haml | 6 ++++-- 3 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 app/assets/javascripts/darkswarm/directives/active_table_hub_link.js.coffee diff --git a/app/assets/javascripts/darkswarm/directives/active_table_hub_link.js.coffee b/app/assets/javascripts/darkswarm/directives/active_table_hub_link.js.coffee new file mode 100644 index 0000000000..ee658796b0 --- /dev/null +++ b/app/assets/javascripts/darkswarm/directives/active_table_hub_link.js.coffee @@ -0,0 +1,12 @@ +Darkswarm.directive "activeTableHubLink", (CurrentHub, CurrentOrder) -> + restrict: "A" + scope: + hub: '=activeTableHubLink' + template: "{{action}} {{hub.name}}" + link: (scope, elm, attr)-> + # Swap out the text of the hub link depending on whether it'll change current hub + # To be used with ofnEmptiesCart + if CurrentHub.id and CurrentHub.id isnt scope.hub.id + scope.action = attr.change + else + scope.action = attr.shop diff --git a/app/assets/javascripts/darkswarm/directives/empties_cart.js.coffee b/app/assets/javascripts/darkswarm/directives/empties_cart.js.coffee index 4691d9b830..4ee4c9ce25 100644 --- a/app/assets/javascripts/darkswarm/directives/empties_cart.js.coffee +++ b/app/assets/javascripts/darkswarm/directives/empties_cart.js.coffee @@ -1,17 +1,12 @@ Darkswarm.directive "ofnEmptiesCart", (CurrentHub, CurrentOrder, Navigation, storage) -> restrict: "A" - scope: - hub: '=ofnEmptiesCart' - template: "{{action}} {{hub.name}}" link: (scope, elm, attr)-> + hub = scope.$eval(attr.ofnEmptiesCart) # A hub is selected, we're changing to a different hub, and the cart isn't empty - if CurrentHub.id and CurrentHub.id isnt scope.hub.id - scope.action = attr.change + if CurrentHub.id and CurrentHub.id isnt hub.id unless CurrentOrder.empty() elm.bind 'click', (ev)-> ev.preventDefault() if confirm "Are you sure? This will change your selected Hub and remove any items in you shopping cart." storage.clearAll() # One day this will have to be moar GRANULAR Navigation.go scope.hub.path - else - scope.action = attr.shop diff --git a/app/views/home/_fat.html.haml b/app/views/home/_fat.html.haml index 11af6e2454..488547a651 100644 --- a/app/views/home/_fat.html.haml +++ b/app/views/home/_fat.html.haml @@ -26,7 +26,8 @@ .row.active_table_row.link{"ng-show" => "open()", "bo-if" => "hub.active"} .columns.small-11 - %a{"bo-href" => "hub.path", "ofn-empties-cart" => "hub", + %a{"bo-href" => "hub.path", "ofn-empties-cart" => "hub", + "active-table-hub-link" => "hub", change: "Change hub to", shop: "Shop at"} .columns.small-1.text-right @@ -35,7 +36,8 @@ .row.active_table_row.link{"ng-show" => "open()", "bo-if" => "!hub.active"} .columns.small-11 - %a{"bo-href" => "hub.path", "ofn-empties-cart" => "hub", + %a{"bo-href" => "hub.path", "ofn-empties-cart" => "hub", + "active-table-hub-link" => "hub", change: "Change hub to (disabled)", shop: "Shop at (disabled)"} .columns.small-1.text-right From f54834da01a98de8c0ef7643ba941f473b359fb2 Mon Sep 17 00:00:00 2001 From: Will Marshall Date: Tue, 17 Jun 2014 16:33:43 +1000 Subject: [PATCH 12/32] Changing our composition of producers and hubs --- .../darkswarm/services/map_modal.js.coffee | 3 +- .../darkswarm/services/producers.js.coffee | 8 +++ .../templates/authentication.html.haml | 2 +- .../templates/map_modal_producer.html.haml | 66 +++++++------------ .../templates/partials/contact.html.haml | 16 +++++ .../templates/partials/follow.html.haml | 20 ++++++ app/views/json/_enterprises.rabl | 4 ++ app/views/json/_enterprises_for_map.rabl | 8 +++ app/views/json/partials/_address.rabl | 2 +- 9 files changed, 84 insertions(+), 45 deletions(-) create mode 100644 app/assets/javascripts/templates/partials/contact.html.haml create mode 100644 app/assets/javascripts/templates/partials/follow.html.haml diff --git a/app/assets/javascripts/darkswarm/services/map_modal.js.coffee b/app/assets/javascripts/darkswarm/services/map_modal.js.coffee index d26384cc48..f5c8d3d065 100644 --- a/app/assets/javascripts/darkswarm/services/map_modal.js.coffee +++ b/app/assets/javascripts/darkswarm/services/map_modal.js.coffee @@ -2,8 +2,9 @@ Darkswarm.factory "MapModal", ($modal, $rootScope)-> new class MapModal open: (enterprise)-> scope = $rootScope.$new(true) # Spawn an isolate to contain the enterprise - scope.enterprise = enterprise if enterprise['is_primary_producer?'] + scope.producer = enterprise $modal.open(templateUrl: "map_modal_producer.html", scope: scope) else + scope.hub = enterprise $modal.open(templateUrl: "map_modal_hub.html", scope: scope) diff --git a/app/assets/javascripts/darkswarm/services/producers.js.coffee b/app/assets/javascripts/darkswarm/services/producers.js.coffee index 62a5087642..6c393660de 100644 --- a/app/assets/javascripts/darkswarm/services/producers.js.coffee +++ b/app/assets/javascripts/darkswarm/services/producers.js.coffee @@ -2,3 +2,11 @@ Darkswarm.factory 'Producers', (producers) -> new class Producers constructor: -> @producers = producers + + # TODO: start adding functionality to producers like so + #@producers = (@extend(producer) for producer in producers) + + #extend: (producer)-> + #new class Producer + #constructor: -> + #@[k] = v for k, v of Producer diff --git a/app/assets/javascripts/templates/authentication.html.haml b/app/assets/javascripts/templates/authentication.html.haml index 3f219240e6..db1b5ecd7d 100644 --- a/app/assets/javascripts/templates/authentication.html.haml +++ b/app/assets/javascripts/templates/authentication.html.haml @@ -4,4 +4,4 @@ %ng-include{src: "'signup.html'"} %ng-include{src: "'forgot.html'"} %a.close-reveal-modal{"ng-click" => "$close()"} - %i.ofn-i_009-close \ No newline at end of file + %i.ofn-i_009-close diff --git a/app/assets/javascripts/templates/map_modal_producer.html.haml b/app/assets/javascripts/templates/map_modal_producer.html.haml index 54c834253a..d09eb3e7f6 100644 --- a/app/assets/javascripts/templates/map_modal_producer.html.haml +++ b/app/assets/javascripts/templates/map_modal_producer.html.haml @@ -2,48 +2,30 @@ .small-12.columns.producer-hero %h3.producer-name %i.ofn-i_036-producers - {{ enterprise.name }} - {{ enterprise.id }} - %img.producer-hero-img{"ng-src" => "{{enterprise.promo_image}}"} + {{ producer.name }} + %img.producer-hero-img{"ng-src" => "{{producer.promo_image}}"} -.row +.row{bindonce: true} .small-12.large-6.columns - %p{"ng-bind-html" => "enterprise.long_description"} - .small-12.large-6.columns - %img.producer-logo{"ng-src" => "{{enterprise.logo}}", "ng-if" => "enterprise.logo"} - %h5 Stay in touch with {{ enterprise.name }} - - %ul.small-block-grid-1{bindonce: true} - - %li{"ng-if" => "enterprise.website"} - %a{"ng-href" => "http://{{enterprise.website | stripUrl}}", target: "_blank" } - %i.ofn-i_049-web - {{ enterprise.website | stripUrl }} - - %li{"ng-if" => "enterprise.email"} - %a{"ng-href" => "mailto:{{enterprise.email | stripUrl}}", target: "_blank" } - %i.ofn-i_050-mail-circle - {{ enterprise.email | stripUrl }} - - %li{"ng-if" => "enterprise.twitter"} - %a{"ng-href" => "http://twitter.com/{{enterprise.twitter}}", target: "_blank"} - %i.ofn-i_041-twitter - {{ enterprise.twitter }} - - %li{"ng-if" => "enterprise.facebook"} - %a{"ng-href" => "http://{{enterprise.facebook | stripUrl}}", target: "_blank"} - %i.ofn-i_044-facebook - {{ enterprise.facebook | stripUrl }} - - %li{"ng-if" => "enterprise.linkedin"} - %a{"ng-href" => "http://{{enterprise.linkedin | stripUrl}}", target: "_blank"} - %i.ofn-i_042-linkedin - {{ enterprise.linkedin | stripUrl }} - - %li{"ng-if" => "enterprise.instagram"} - %a{"ng-href" => "http://instagram.com/{{enterprise.instagram}}", target: "_blank"} - %i.ofn-i_043-instagram - {{ enterprise.instagram }} + %img.producer-logo{"bo-src" => "producer.logo", "bo-if" => "producer.logo"} + %p{"ng-bind-html" => "producer.long_description"} - %a.close-reveal-modal{"ng-click" => "$close()"} - %i.ofn-i_009-close + .small-12.large-6.columns + + %ng-include{src: "'partials/contact.html'"} + %ng-include{src: "'partials/follow.html'"} + +.row{bindonce: true} + .hubs + %h4 Shop for {{producer.name}} products at: + %a.hub{"ng-repeat" => "hub in producer.hubs", + "bo-href" => "hub.path", + "bo-class" => "{active: hub.active, inactive: !hub.active}", + "ofn-empties-cart" => "hub"} + %i.ofn-i_033-open-sign{"bo-if" => "hub.active"} + %i.ofn-i_032-closed-sign{"bo-if" => "!hub.active"} + {{hub.name}} + ( {{ hub.address.city }} , {{hub.address.state}} ) + +%a.close-reveal-modal{"ng-click" => "$close()"} + %i.ofn-i_009-close diff --git a/app/assets/javascripts/templates/partials/contact.html.haml b/app/assets/javascripts/templates/partials/contact.html.haml new file mode 100644 index 0000000000..3dc3dd028c --- /dev/null +++ b/app/assets/javascripts/templates/partials/contact.html.haml @@ -0,0 +1,16 @@ +%div{"bo-if" => "producer.email || producer.website || producer.address.phone"} + %h3 Contact + + %p{"bo-if" => "producer.email"} + %a{"ng-href" => "mailto:{{producer.email | stripUrl}}", target: "_blank" } + %i.ofn-i_050-mail-circle + {{ producer.email | stripUrl }} + + %p{"ng-if" => "producer.address.phone"} + WE NEED A PHONE ICON + {{ producer.address.phone }} + + %p{"ng-if" => "producer.website"} + %a{"ng-href" => "http://{{producer.website | stripUrl}}", target: "_blank" } + %i.ofn-i_049-web + {{ producer.website | stripUrl }} diff --git a/app/assets/javascripts/templates/partials/follow.html.haml b/app/assets/javascripts/templates/partials/follow.html.haml new file mode 100644 index 0000000000..41a91022a9 --- /dev/null +++ b/app/assets/javascripts/templates/partials/follow.html.haml @@ -0,0 +1,20 @@ +%div{"bo-if" => "producer.twitter || producer.facebook || producer.linkedin || producer.instagram"} + %h3 Follow + + %ul.small-block-grid-1{bindonce: true} + %li{"ng-if" => "producer.twitter"} + %a{"ng-href" => "http://twitter.com/{{producer.twitter}}", target: "_blank"} + %i.ofn-i_041-twitter + + %li{"ng-if" => "producer.facebook"} + %a{"ng-href" => "http://{{producer.facebook | stripUrl}}", target: "_blank"} + %i.ofn-i_044-facebook + + %li{"ng-if" => "producer.linkedin"} + %a{"ng-href" => "http://{{producer.linkedin | stripUrl}}", target: "_blank"} + %i.ofn-i_042-linkedin + + %li{"ng-if" => "producer.instagram"} + %a{"ng-href" => "http://instagram.com/{{producer.instagram}}", target: "_blank"} + %i.ofn-i_043-instagram + diff --git a/app/views/json/_enterprises.rabl b/app/views/json/_enterprises.rabl index 2f2f82c944..733bf79e19 100644 --- a/app/views/json/_enterprises.rabl +++ b/app/views/json/_enterprises.rabl @@ -1,6 +1,10 @@ # DON'T USE DIRECTLY - for inheritance attributes :name, :id, :description +node :email do |enterprise| + enterprise.email.to_s.reverse +end + child :address do extends "json/partials/address" end diff --git a/app/views/json/_enterprises_for_map.rabl b/app/views/json/_enterprises_for_map.rabl index 4da6309abc..a2c6eb06ac 100644 --- a/app/views/json/_enterprises_for_map.rabl +++ b/app/views/json/_enterprises_for_map.rabl @@ -14,6 +14,14 @@ node :active do |enterprise| @active_distributors.include?(enterprise) end +child distributors: :hubs do + extends 'json/enterprises' + node :active do |hub| + @active_distributors.include?(hub) + end +end + + node :icon do |e| if e.is_primary_producer? and e.is_distributor? image_path "map-icon-both.svg" diff --git a/app/views/json/partials/_address.rabl b/app/views/json/partials/_address.rabl index b40bbc790b..04cc456a29 100644 --- a/app/views/json/partials/_address.rabl +++ b/app/views/json/partials/_address.rabl @@ -1,4 +1,4 @@ -attributes :city, :zipcode +attributes :city, :zipcode, :phone node :state do |address| address.state.abbr end From e200b192d49e56b9977692fe4d6f04d5a3a631df Mon Sep 17 00:00:00 2001 From: summerscope Date: Wed, 18 Jun 2014 12:37:11 +1000 Subject: [PATCH 13/32] Tweak styling and add animation-in function for Loading text message --- app/assets/stylesheets/darkswarm/loading.sass | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/darkswarm/loading.sass b/app/assets/stylesheets/darkswarm/loading.sass index cebb7edfd3..d2950f07fd 100644 --- a/app/assets/stylesheets/darkswarm/loading.sass +++ b/app/assets/stylesheets/darkswarm/loading.sass @@ -16,7 +16,9 @@ right: 0 @include user-select(none) h1 + -webkit-animation: blurFadeIn 0.8s ease-in-out 0s color: white + font-size: 1.15rem position: fixed text-align: center left: 0 @@ -24,7 +26,6 @@ margin: 0 auto top: 55% width: 100% - height: 400px overflow: visible .loader @@ -55,6 +56,20 @@ li:nth-child(3) -webkit-animation: loadbars 0.6s ease-in-out infinite -0.4s +@-webkit-keyframes blurFadeIn + 0% + opacity: 0 + text-shadow: 0px 0px 10px #fff + -webkit-transform: scale(1.3) + 50% + opacity: 0.5 + text-shadow: 0px 0px 5px #fff + -webkit-transform: scale(1.1) + 100% + opacity: 1 + text-shadow: 0px 0px 0px #fff + -webkit-transform: scale(1) + @-webkit-keyframes 'loadbars' 0% height: 10px From e7c301da83ecbca91506b263e018c3025d991ad7 Mon Sep 17 00:00:00 2001 From: Will Marshall Date: Wed, 18 Jun 2014 13:05:44 +1000 Subject: [PATCH 14/32] Reworking the RABL templates for simplicity AND fixing up all the tests --- .../{hub.js.coffee => current_hub.js.coffee} | 0 .../darkswarm/services/enterprises.js.coffee | 5 ++ .../darkswarm/services/hubs.js.coffee | 2 +- .../darkswarm/services/producers.js.coffee | 7 -- app/views/json/_enterprises.rabl | 21 ++---- app/views/json/_hubs.rabl | 26 +------ app/views/json/_producers.rabl | 22 +----- .../_enterprise.rabl} | 28 ++++---- app/views/json/partials/_hub.rabl | 21 ++++++ app/views/json/partials/_producer.rabl | 9 +++ app/views/layouts/darkswarm.html.haml | 1 + spec/javascripts/application_spec.js | 3 + spec/javascripts/mock_google_maps.js.coffee | 68 +++++++++++++++++++ .../accordion_controller_spec.js.coffee | 5 ++ .../darkswarm/services/order_spec.js.coffee | 15 +++- 15 files changed, 146 insertions(+), 87 deletions(-) rename app/assets/javascripts/darkswarm/services/{hub.js.coffee => current_hub.js.coffee} (100%) create mode 100644 app/assets/javascripts/darkswarm/services/enterprises.js.coffee rename app/views/json/{_enterprises_for_map.rabl => partials/_enterprise.rabl} (51%) create mode 100644 app/views/json/partials/_hub.rabl create mode 100644 app/views/json/partials/_producer.rabl create mode 100644 spec/javascripts/mock_google_maps.js.coffee diff --git a/app/assets/javascripts/darkswarm/services/hub.js.coffee b/app/assets/javascripts/darkswarm/services/current_hub.js.coffee similarity index 100% rename from app/assets/javascripts/darkswarm/services/hub.js.coffee rename to app/assets/javascripts/darkswarm/services/current_hub.js.coffee diff --git a/app/assets/javascripts/darkswarm/services/enterprises.js.coffee b/app/assets/javascripts/darkswarm/services/enterprises.js.coffee new file mode 100644 index 0000000000..b967bdd18c --- /dev/null +++ b/app/assets/javascripts/darkswarm/services/enterprises.js.coffee @@ -0,0 +1,5 @@ +Darkswarm.factory 'Enterprises', (enterprises)-> + new class Enterprises + constructor: -> + @enterprises = enterprises + @dereference() diff --git a/app/assets/javascripts/darkswarm/services/hubs.js.coffee b/app/assets/javascripts/darkswarm/services/hubs.js.coffee index a3f2b03f23..275ce45cec 100644 --- a/app/assets/javascripts/darkswarm/services/hubs.js.coffee +++ b/app/assets/javascripts/darkswarm/services/hubs.js.coffee @@ -1,4 +1,4 @@ -Darkswarm.factory 'Hubs', ($location, hubs, $filter, CurrentHub) -> +Darkswarm.factory 'Hubs', (hubs, $filter) -> new class Hubs constructor: -> @hubs = $filter('orderBy')(hubs, ['-active', '+orders_close_at']) diff --git a/app/assets/javascripts/darkswarm/services/producers.js.coffee b/app/assets/javascripts/darkswarm/services/producers.js.coffee index 6c393660de..65e33599af 100644 --- a/app/assets/javascripts/darkswarm/services/producers.js.coffee +++ b/app/assets/javascripts/darkswarm/services/producers.js.coffee @@ -2,11 +2,4 @@ Darkswarm.factory 'Producers', (producers) -> new class Producers constructor: -> @producers = producers - - # TODO: start adding functionality to producers like so - #@producers = (@extend(producer) for producer in producers) - #extend: (producer)-> - #new class Producer - #constructor: -> - #@[k] = v for k, v of Producer diff --git a/app/views/json/_enterprises.rabl b/app/views/json/_enterprises.rabl index 733bf79e19..40065ff03f 100644 --- a/app/views/json/_enterprises.rabl +++ b/app/views/json/_enterprises.rabl @@ -1,18 +1,5 @@ -# DON'T USE DIRECTLY - for inheritance +collection Enterprise.visible attributes :name, :id, :description - -node :email do |enterprise| - enterprise.email.to_s.reverse -end - -child :address do - extends "json/partials/address" -end - -node :path do |enterprise| - shop_enterprise_path(enterprise) -end - -node :hash do |enterprise| - enterprise.to_param -end +extends 'json/partials/enterprise' +extends 'json/partials/producer' +extends 'json/partials/hub' diff --git a/app/views/json/_hubs.rabl b/app/views/json/_hubs.rabl index c118b4504f..8e8e36d213 100644 --- a/app/views/json/_hubs.rabl +++ b/app/views/json/_hubs.rabl @@ -1,26 +1,4 @@ collection Enterprise.visible.is_distributor -extends 'json/enterprises' +extends 'json/partials/enterprise' +extends 'json/partials/hub' -child distributed_taxons: :taxons do - extends "json/taxon" -end - -child suppliers: :producers do - extends "json/producer" -end - -node :pickup do |hub| - not hub.shipping_methods.where(:require_ship_address => false).empty? -end - -node :delivery do |hub| - not hub.shipping_methods.where(:require_ship_address => true).empty? -end - -node :active do |hub| - @active_distributors.include?(hub) -end - -node :orders_close_at do |hub| - OrderCycle.first_closing_for(hub).andand.orders_close_at -end diff --git a/app/views/json/_producers.rabl b/app/views/json/_producers.rabl index 95a133a182..89839c51ea 100644 --- a/app/views/json/_producers.rabl +++ b/app/views/json/_producers.rabl @@ -1,21 +1,3 @@ collection @producers -extends 'json/enterprises' - -child supplied_taxons: :taxons do - extends 'json/taxon' -end - -child distributors: :distributors do - attributes :name, :id - node :path do |distributor| - shop_enterprise_path(distributor) - end -end - -node :path do |producer| - producer_path(producer) -end - -node :hash do |producer| - producer.to_param -end +extends 'json/partials/enterprise' +extends 'json/partials/producer' diff --git a/app/views/json/_enterprises_for_map.rabl b/app/views/json/partials/_enterprise.rabl similarity index 51% rename from app/views/json/_enterprises_for_map.rabl rename to app/views/json/partials/_enterprise.rabl index a2c6eb06ac..4ebf5f7a78 100644 --- a/app/views/json/_enterprises_for_map.rabl +++ b/app/views/json/partials/_enterprise.rabl @@ -1,6 +1,16 @@ -collection @enterprises -extends 'json/enterprises' -attributes :latitude, :longitude, :long_description, :website, :instagram, :linkedin, :twitter, :facebook, :is_primary_producer?, :is_distributor? +attributes :name, :id, :description, :latitude, :longitude, :long_description, :website, :instagram, :linkedin, :twitter, :facebook, :is_primary_producer?, :is_distributor? + +node :email do |enterprise| + enterprise.email.to_s.reverse +end + +child :address do + extends "json/partials/address" +end + +node :hash do |enterprise| + enterprise.to_param +end node :logo do |enterprise| enterprise.logo(:medium) if enterprise.logo.exists? @@ -10,18 +20,6 @@ node :promo_image do |enterprise| enterprise.promo_image(:large) if enterprise.promo_image.exists? end -node :active do |enterprise| - @active_distributors.include?(enterprise) -end - -child distributors: :hubs do - extends 'json/enterprises' - node :active do |hub| - @active_distributors.include?(hub) - end -end - - node :icon do |e| if e.is_primary_producer? and e.is_distributor? image_path "map-icon-both.svg" diff --git a/app/views/json/partials/_hub.rabl b/app/views/json/partials/_hub.rabl new file mode 100644 index 0000000000..c1f7879268 --- /dev/null +++ b/app/views/json/partials/_hub.rabl @@ -0,0 +1,21 @@ +child distributed_taxons: :taxons do + extends "json/taxon" +end +child suppliers: :producers do + attributes :id +end +node :path do |enterprise| + shop_enterprise_path(enterprise) +end +node :pickup do |hub| + not hub.shipping_methods.where(:require_ship_address => false).empty? +end +node :delivery do |hub| + not hub.shipping_methods.where(:require_ship_address => true).empty? +end +node :active do |hub| + @active_distributors.include?(hub) +end +node :orders_close_at do |hub| + OrderCycle.first_closing_for(hub).andand.orders_close_at +end diff --git a/app/views/json/partials/_producer.rabl b/app/views/json/partials/_producer.rabl new file mode 100644 index 0000000000..a3f7975b40 --- /dev/null +++ b/app/views/json/partials/_producer.rabl @@ -0,0 +1,9 @@ +child supplied_taxons: :taxons do + extends 'json/taxon' +end +child distributors: :hubs do + attributes :id +end +node :path do |producer| + producer_path(producer) +end diff --git a/app/views/layouts/darkswarm.html.haml b/app/views/layouts/darkswarm.html.haml index 5208c3d5ef..f399756efc 100644 --- a/app/views/layouts/darkswarm.html.haml +++ b/app/views/layouts/darkswarm.html.haml @@ -26,6 +26,7 @@ = inject_json "currentHub", "current_hub" + = inject_json "enterprises", "enterprises" = inject_json "currentOrder", "current_order" = inject_json "user", "current_user" = inject_json "railsFlash", "flash" diff --git a/spec/javascripts/application_spec.js b/spec/javascripts/application_spec.js index df629c1c81..4eacb45036 100644 --- a/spec/javascripts/application_spec.js +++ b/spec/javascripts/application_spec.js @@ -5,7 +5,10 @@ //= require angular-mocks //= require angular-cookies //= require angular-backstretch.js +//= require lodash.underscore.js //= require angular-flash.min.js //= require moment angular.module('templates', []) +angular.module('google-maps', []); +angular.module('duScroll', []); diff --git a/spec/javascripts/mock_google_maps.js.coffee b/spec/javascripts/mock_google_maps.js.coffee new file mode 100644 index 0000000000..02ef0aa81f --- /dev/null +++ b/spec/javascripts/mock_google_maps.js.coffee @@ -0,0 +1,68 @@ +@google = + maps: + event: + addDomListener: -> + addDomListenerOnce: -> + addListener: -> + addListenerOnce: -> + bind: -> + clearInstanceListeners: -> + clearListeners: -> + forward: -> + removeListener: -> + trigger: -> + vf: -> + +class google.maps.LatLng + constructor: (lat, lng) -> + @latitude = parseFloat(lat) + @longitude = parseFloat(lng) + + lat: -> @latitude + lng: -> @longitude + +class google.maps.LatLngBounds + constructor: (@ne, @sw) -> + + getSouthWest: -> @sw + getNorthEast: -> @ne + +class google.maps.OverlayView + +class google.maps.Marker + getAnimation: -> + getClickable: -> + getCursor: -> + getDraggable: -> + getFlat: -> + getIcon: -> + getPosition: -> + getShadow: -> + getShape: -> + getTitle: -> + getVisible: -> + getZIndex: -> + setAnimation: -> + setClickable: -> + setCursor: -> + setDraggable: -> + setFlat: -> + setIcon: -> + setPosition: -> + setShadow: -> + setShape: -> + setTitle: -> + setVisible: -> + setZIndex: -> + setMap: -> + getMap: -> + +class google.maps.MarkerImage + +class google.maps.Map + +class google.maps.Point + +class google.maps.Size + +class google.maps.InfoWindow diff --git a/spec/javascripts/unit/darkswarm/controllers/checkout/accordion_controller_spec.js.coffee b/spec/javascripts/unit/darkswarm/controllers/checkout/accordion_controller_spec.js.coffee index 8e59248806..9c2545b851 100644 --- a/spec/javascripts/unit/darkswarm/controllers/checkout/accordion_controller_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/controllers/checkout/accordion_controller_spec.js.coffee @@ -1,9 +1,14 @@ describe "AccordionCtrl", -> ctrl = null scope = null + CurrentHubMock = + id: 1 beforeEach -> module "Darkswarm" + module ($provide)-> + $provide.value "CurrentHub", CurrentHubMock + null localStorage.clear() describe "loading incomplete form", -> diff --git a/spec/javascripts/unit/darkswarm/services/order_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/order_spec.js.coffee index f6a4112eef..58b2838ac4 100644 --- a/spec/javascripts/unit/darkswarm/services/order_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/services/order_spec.js.coffee @@ -6,6 +6,10 @@ describe 'Order service', -> flash = null storage = null scope = null + CurrentHubMock = + id: 1 + FlashLoaderMock = + loadFlash: (arg)-> beforeEach -> orderData = @@ -36,6 +40,10 @@ describe 'Order service', -> angular.module('Darkswarm').value('order', orderData) module 'Darkswarm' + module ($provide)-> + $provide.value "CurrentHub", CurrentHubMock + $provide.value "RailsFlashLoader", FlashLoaderMock + null inject ($injector, _$httpBackend_, _storage_, $rootScope)-> $httpBackend = _$httpBackend_ @@ -58,13 +66,13 @@ describe 'Order service', -> spyOn(storage, "bind") Order.fieldsToBind = ["testy"] Order.bindFieldsToLocalStorage({}) - prefix = "order_#{Order.order.id}#{Order.order.user_id}" + prefix = "order_#{Order.order.id}#{Order.order.user_id}#{CurrentHubMock.id}" expect(storage.bind).toHaveBeenCalledWith({}, "Order.order.testy", {storeName: "#{prefix}_testy"}) expect(storage.bind).toHaveBeenCalledWith({}, "Order.ship_address_same_as_billing", {storeName: "#{prefix}_sameasbilling", defaultValue: true}) it "binds order to local storage", -> Order.bindFieldsToLocalStorage(scope) - prefix = "order_#{Order.order.id}#{Order.order.user_id}" + prefix = "order_#{Order.order.id}#{Order.order.user_id}#{CurrentHubMock.id}" expect(localStorage.getItem("#{prefix}_email")).toMatch "test@test.com" it "does not store secrets in local storage", -> @@ -100,10 +108,11 @@ describe 'Order service', -> $httpBackend.flush() it "sends flash messages to the flash service", -> + spyOn(FlashLoaderMock, "loadFlash") # Stubbing out writes to window.location $httpBackend.expectPUT("/checkout").respond 400, {flash: {error: "frogs"}} Order.submit() $httpBackend.flush() - expect(flash.error).toEqual "frogs" + expect(FlashLoaderMock.loadFlash).toHaveBeenCalledWith {error: "frogs"} it "puts errors into the scope", -> $httpBackend.expectPUT("/checkout").respond 400, {errors: {error: "frogs"}} From deb6c8a05aa1ceef33c527129024670601a23a51 Mon Sep 17 00:00:00 2001 From: Will Marshall Date: Wed, 18 Jun 2014 15:40:02 +1000 Subject: [PATCH 15/32] Refactoring the RABL injection and the Hubs/Producers/Enterprises services --- .../darkswarm/services/enterprises.js.coffee | 4 +- .../darkswarm/services/hubs.js.coffee | 9 ++++- .../darkswarm/services/producers.js.coffee | 5 ++- app/controllers/home_controller.rb | 1 + app/views/home/_hubs.html.haml | 3 +- app/views/json/_hubs.rabl | 2 +- app/views/json/_producers.rabl | 2 +- app/views/json/partials/_enterprise.rabl | 8 ++++ app/views/layouts/darkswarm.html.haml | 1 - app/views/map/index.html.haml | 2 +- app/views/producers/index.haml | 5 +-- .../services/enterprise_spec.js.coffee | 22 +++++++++++ .../darkswarm/services/hubs_spec.js.coffee | 39 +++++++++++++++++++ .../services/producers_spec.js.coffee | 15 +++++++ 14 files changed, 103 insertions(+), 15 deletions(-) create mode 100644 spec/javascripts/unit/darkswarm/services/enterprise_spec.js.coffee create mode 100644 spec/javascripts/unit/darkswarm/services/hubs_spec.js.coffee create mode 100644 spec/javascripts/unit/darkswarm/services/producers_spec.js.coffee diff --git a/app/assets/javascripts/darkswarm/services/enterprises.js.coffee b/app/assets/javascripts/darkswarm/services/enterprises.js.coffee index b967bdd18c..04042a2d4b 100644 --- a/app/assets/javascripts/darkswarm/services/enterprises.js.coffee +++ b/app/assets/javascripts/darkswarm/services/enterprises.js.coffee @@ -1,5 +1,7 @@ Darkswarm.factory 'Enterprises', (enterprises)-> new class Enterprises + enterprises_by_id: {} # id/object pairs for lookup constructor: -> @enterprises = enterprises - @dereference() + for enterprise in enterprises + @enterprises_by_id[enterprise.id] = enterprise diff --git a/app/assets/javascripts/darkswarm/services/hubs.js.coffee b/app/assets/javascripts/darkswarm/services/hubs.js.coffee index 275ce45cec..402b5a0603 100644 --- a/app/assets/javascripts/darkswarm/services/hubs.js.coffee +++ b/app/assets/javascripts/darkswarm/services/hubs.js.coffee @@ -1,4 +1,9 @@ -Darkswarm.factory 'Hubs', (hubs, $filter) -> +Darkswarm.factory 'Hubs', ($filter, Enterprises) -> new class Hubs constructor: -> - @hubs = $filter('orderBy')(hubs, ['-active', '+orders_close_at']) + @hubs = @filter Enterprises.enterprises.filter (hub)-> + hub.type == "hub" + + + filter: (hubs)-> + $filter('orderBy')(hubs, ['-active', '+orders_close_at']) diff --git a/app/assets/javascripts/darkswarm/services/producers.js.coffee b/app/assets/javascripts/darkswarm/services/producers.js.coffee index 65e33599af..8ca9752d28 100644 --- a/app/assets/javascripts/darkswarm/services/producers.js.coffee +++ b/app/assets/javascripts/darkswarm/services/producers.js.coffee @@ -1,5 +1,6 @@ -Darkswarm.factory 'Producers', (producers) -> +Darkswarm.factory 'Producers', (Enterprises) -> new class Producers constructor: -> - @producers = producers + @producers = Enterprises.enterprises.filter (enterprise)-> + enterprise.type == "producer" diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 592388c243..54c200beff 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -3,6 +3,7 @@ class HomeController < BaseController def index @active_distributors ||= Enterprise.distributors_with_active_order_cycles + @enterprises = Enterprise.visible end def about_us diff --git a/app/views/home/_hubs.html.haml b/app/views/home/_hubs.html.haml index c96ec6698c..17a4cc13a5 100644 --- a/app/views/home/_hubs.html.haml +++ b/app/views/home/_hubs.html.haml @@ -1,6 +1,5 @@ #hubs.hubs{"ng-controller" => "HubsCtrl"} - :javascript - angular.module('Darkswarm').value('hubs', #{render "json/hubs"}) + = inject_json "enterprises" , "enterprises", collection: @enterprises .row .small-12.columns.text-center diff --git a/app/views/json/_hubs.rabl b/app/views/json/_hubs.rabl index 8e8e36d213..7f8c4ac7b4 100644 --- a/app/views/json/_hubs.rabl +++ b/app/views/json/_hubs.rabl @@ -1,4 +1,4 @@ -collection Enterprise.visible.is_distributor +collection Enterprise.is_distributor.visible extends 'json/partials/enterprise' extends 'json/partials/hub' diff --git a/app/views/json/_producers.rabl b/app/views/json/_producers.rabl index 89839c51ea..cad5b29062 100644 --- a/app/views/json/_producers.rabl +++ b/app/views/json/_producers.rabl @@ -1,3 +1,3 @@ -collection @producers +collection Enterprise.is_primary_producer.visible extends 'json/partials/enterprise' extends 'json/partials/producer' diff --git a/app/views/json/partials/_enterprise.rabl b/app/views/json/partials/_enterprise.rabl index 4ebf5f7a78..32c2ccf4ab 100644 --- a/app/views/json/partials/_enterprise.rabl +++ b/app/views/json/partials/_enterprise.rabl @@ -1,5 +1,13 @@ attributes :name, :id, :description, :latitude, :longitude, :long_description, :website, :instagram, :linkedin, :twitter, :facebook, :is_primary_producer?, :is_distributor? +node :type do |enterprise| + if enterprise.is_primary_producer? + "producer" + elsif enterprise.is_distributor? + "hub" + end +end + node :email do |enterprise| enterprise.email.to_s.reverse end diff --git a/app/views/layouts/darkswarm.html.haml b/app/views/layouts/darkswarm.html.haml index f399756efc..5208c3d5ef 100644 --- a/app/views/layouts/darkswarm.html.haml +++ b/app/views/layouts/darkswarm.html.haml @@ -26,7 +26,6 @@ = inject_json "currentHub", "current_hub" - = inject_json "enterprises", "enterprises" = inject_json "currentOrder", "current_order" = inject_json "user", "current_user" = inject_json "railsFlash", "flash" diff --git a/app/views/map/index.html.haml b/app/views/map/index.html.haml index 277178bfdc..2c49deb4d4 100644 --- a/app/views/map/index.html.haml +++ b/app/views/map/index.html.haml @@ -1,4 +1,4 @@ -= inject_json "enterprisesForMap" , "enterprises_for_map", collection: @enterprises += inject_json "enterprisesForMap" , "enterprises", collection: @enterprises .map-container{"fill-vertical" => true} %map{"ng-controller" => "MapCtrl"} diff --git a/app/views/producers/index.haml b/app/views/producers/index.haml index 7c4b6a5b62..e30475fdd8 100644 --- a/app/views/producers/index.haml +++ b/app/views/producers/index.haml @@ -1,8 +1,5 @@ .producers{"ng-controller" => "ProducersCtrl"} - :javascript - angular.module('Darkswarm').value('producers', #{render partial: "json/producers", object: @producers}) - -#%pre - -#{{ Producers.producers | json }} + = inject_json "producers" , "producers", collection: @producers .row .small-12.columns.text-center.pad-top diff --git a/spec/javascripts/unit/darkswarm/services/enterprise_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/enterprise_spec.js.coffee new file mode 100644 index 0000000000..a2c18e879c --- /dev/null +++ b/spec/javascripts/unit/darkswarm/services/enterprise_spec.js.coffee @@ -0,0 +1,22 @@ +describe "Enterprises service", -> + Enterprises = null + enterprises = [ + {id: 1, type: "hub"}, + {id: 2, type: "producer"} + ] + beforeEach -> + module 'Darkswarm' + angular.module('Darkswarm').value('enterprises', enterprises) + + inject ($injector)-> + Enterprises = $injector.get("Enterprises") + + it "stores enterprises as id/object pairs", -> + expect(Enterprises.enterprises_by_id["1"]).toBe enterprises[0] + expect(Enterprises.enterprises_by_id["2"]).toBe enterprises[1] + + it "stores enterprises as an array", -> + expect(Enterprises.enterprises).toBe enterprises + + it "puts the same objects in enterprises and enterprises_by_id", -> + expect(Enterprises.enterprises[0]).toBe Enterprises.enterprises_by_id["1"] diff --git a/spec/javascripts/unit/darkswarm/services/hubs_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/hubs_spec.js.coffee new file mode 100644 index 0000000000..6247c7a713 --- /dev/null +++ b/spec/javascripts/unit/darkswarm/services/hubs_spec.js.coffee @@ -0,0 +1,39 @@ +describe "Hubs service", -> + Hubs = null + Enterprises = null + hubs = [ + { + id: 2 + active: false + orders_close_at: new Date() + type: "hub" + } + { + id: 3 + active: false + orders_close_at: new Date() + type: "hub" + } + { + id: 1 + active: true + orders_close_at: new Date() + type: "hub" + } + ] + + + beforeEach -> + module 'Darkswarm' + angular.module('Darkswarm').value('enterprises', hubs) + inject ($injector)-> + Enterprises = $injector.get("Enterprises") + Hubs = $injector.get("Hubs") + + it "filters Enterprise.hubs into a new array", -> + expect(Hubs.hubs[0]).toBe Enterprises.enterprises[2] + # Because the $filter is a new sorted array + # We check to see the objects in both arrays are still the same + Enterprises.enterprises[2].active = false + expect(Hubs.hubs[0].active).toBe false + diff --git a/spec/javascripts/unit/darkswarm/services/producers_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/producers_spec.js.coffee new file mode 100644 index 0000000000..ab2cc04cac --- /dev/null +++ b/spec/javascripts/unit/darkswarm/services/producers_spec.js.coffee @@ -0,0 +1,15 @@ +describe "Producers service", -> + Producers = null + Enterprises = null + enterprises = [ + {type: "producer"} + ] + + beforeEach -> + module 'Darkswarm' + angular.module('Darkswarm').value('enterprises', enterprises) + inject ($injector)-> + Producers = $injector.get("Producers") + + it "delegates producers array to Enterprises", -> + expect(Producers.producers[0]).toBe enterprises[0] From 45404f1475a12aa331b5f041c647ee5141182ca2 Mon Sep 17 00:00:00 2001 From: Will Marshall Date: Wed, 18 Jun 2014 15:48:24 +1000 Subject: [PATCH 16/32] Adding dereferencing on construct to Enterprises service - this is MAGIC --- .../darkswarm/services/enterprises.js.coffee | 11 +++++++++++ .../unit/darkswarm/services/enterprise_spec.js.coffee | 9 +++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/darkswarm/services/enterprises.js.coffee b/app/assets/javascripts/darkswarm/services/enterprises.js.coffee index 04042a2d4b..0c73d0db1e 100644 --- a/app/assets/javascripts/darkswarm/services/enterprises.js.coffee +++ b/app/assets/javascripts/darkswarm/services/enterprises.js.coffee @@ -5,3 +5,14 @@ Darkswarm.factory 'Enterprises', (enterprises)-> @enterprises = enterprises for enterprise in enterprises @enterprises_by_id[enterprise.id] = enterprise + @dereference() + + dereference: -> + for enterprise in @enterprises + if enterprise.hubs + for hub, i in enterprise.hubs + enterprise.hubs[i] = @enterprises_by_id[hub.id] + + if enterprise.producers + for producer, i in enterprise.producers + enterprise.producers[i] = @enterprises_by_id[producer.id] diff --git a/spec/javascripts/unit/darkswarm/services/enterprise_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/enterprise_spec.js.coffee index a2c18e879c..ec0475b93b 100644 --- a/spec/javascripts/unit/darkswarm/services/enterprise_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/services/enterprise_spec.js.coffee @@ -1,8 +1,9 @@ describe "Enterprises service", -> Enterprises = null enterprises = [ - {id: 1, type: "hub"}, - {id: 2, type: "producer"} + {id: 1, type: "hub", producers: [{id: 2}]}, + {id: 2, type: "producer", hubs: [{id: 1}]}, + {id: 3, type: "producer", hubs: [{id: 1}]} ] beforeEach -> module 'Darkswarm' @@ -20,3 +21,7 @@ describe "Enterprises service", -> it "puts the same objects in enterprises and enterprises_by_id", -> expect(Enterprises.enterprises[0]).toBe Enterprises.enterprises_by_id["1"] + + it "dereferences references to other enterprises", -> + expect(Enterprises.enterprises_by_id["1"].producers[0]).toBe enterprises[1] + expect(Enterprises.enterprises_by_id["3"].hubs[0]).toBe enterprises[0] From 224a70c11f57e3e7859be03c9ad3513acd6785b5 Mon Sep 17 00:00:00 2001 From: Will Marshall Date: Wed, 18 Jun 2014 16:43:57 +1000 Subject: [PATCH 17/32] Refactoring JSON injection a bit further --- .../darkswarm/services/hubs.js.coffee | 1 - .../darkswarm/services/map.js.coffee | 1 + app/controllers/base_controller.rb | 8 ++++++++ app/controllers/home_controller.rb | 5 +++-- app/controllers/map_controller.rb | 5 +++-- app/controllers/producers_controller.rb | 3 ++- app/helpers/shared_helper.rb | 3 +++ app/views/home/_hubs.html.haml | 2 +- app/views/json/_enterprises_for_map.rabl | 2 ++ app/views/map/index.html.haml | 2 +- app/views/producers/index.haml | 2 +- spec/controllers/base_controller_spec.rb | 10 ++++++++++ spec/controllers/home_controller_spec.rb | 6 ++++++ spec/controllers/map_controller_spec.rb | 5 +++++ spec/controllers/producers_controller_spec.rb | 17 ++++++++++++++--- .../darkswarm/services/map_spec.js.coffee | 19 +++++++++++++++++++ 16 files changed, 79 insertions(+), 12 deletions(-) create mode 100644 app/views/json/_enterprises_for_map.rabl create mode 100644 spec/javascripts/unit/darkswarm/services/map_spec.js.coffee diff --git a/app/assets/javascripts/darkswarm/services/hubs.js.coffee b/app/assets/javascripts/darkswarm/services/hubs.js.coffee index 402b5a0603..65940c5708 100644 --- a/app/assets/javascripts/darkswarm/services/hubs.js.coffee +++ b/app/assets/javascripts/darkswarm/services/hubs.js.coffee @@ -3,7 +3,6 @@ Darkswarm.factory 'Hubs', ($filter, Enterprises) -> constructor: -> @hubs = @filter Enterprises.enterprises.filter (hub)-> hub.type == "hub" - filter: (hubs)-> $filter('orderBy')(hubs, ['-active', '+orders_close_at']) diff --git a/app/assets/javascripts/darkswarm/services/map.js.coffee b/app/assets/javascripts/darkswarm/services/map.js.coffee index eb1a195490..f2050a6f25 100644 --- a/app/assets/javascripts/darkswarm/services/map.js.coffee +++ b/app/assets/javascripts/darkswarm/services/map.js.coffee @@ -2,6 +2,7 @@ Darkswarm.factory "OfnMap", (enterprisesForMap, MapModal)-> new class OfnMap constructor: -> @enterprises = (@extend(enterprise) for enterprise in enterprisesForMap) + console.log @enterprises # Adding methods to each enterprise extend: (enterprise)-> diff --git a/app/controllers/base_controller.rb b/app/controllers/base_controller.rb index ba53ff4a0f..1a4c0aac8d 100644 --- a/app/controllers/base_controller.rb +++ b/app/controllers/base_controller.rb @@ -11,4 +11,12 @@ class BaseController < ApplicationController include Spree::ProductsHelper before_filter :check_order_cycle_expiry + + def load_active_distributors + @active_distributors ||= Enterprise.distributors_with_active_order_cycles + end + + def load_visible_enterprises + @enterprises = Enterprise.visible + end end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 54c200beff..97b386157d 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -1,11 +1,12 @@ class HomeController < BaseController layout 'darkswarm' + before_filter :load_active_distributors + before_filter :load_visible_enterprises def index - @active_distributors ||= Enterprise.distributors_with_active_order_cycles - @enterprises = Enterprise.visible end def about_us end end + diff --git a/app/controllers/map_controller.rb b/app/controllers/map_controller.rb index b5c9ceba83..d63d7f86a9 100644 --- a/app/controllers/map_controller.rb +++ b/app/controllers/map_controller.rb @@ -1,7 +1,8 @@ class MapController < BaseController layout 'darkswarm' + before_filter :load_active_distributors + before_filter :load_visible_enterprises + def index - @active_distributors ||= Enterprise.distributors_with_active_order_cycles - @enterprises = Enterprise.visible end end diff --git a/app/controllers/producers_controller.rb b/app/controllers/producers_controller.rb index c5a133a798..d7d665de90 100644 --- a/app/controllers/producers_controller.rb +++ b/app/controllers/producers_controller.rb @@ -1,7 +1,8 @@ class ProducersController < BaseController layout 'darkswarm' + before_filter :load_active_distributors + before_filter :load_visible_enterprises def index - @producers = Enterprise.is_primary_producer.visible end end diff --git a/app/helpers/shared_helper.rb b/app/helpers/shared_helper.rb index 3dee7eefbf..f421107994 100644 --- a/app/helpers/shared_helper.rb +++ b/app/helpers/shared_helper.rb @@ -1,4 +1,7 @@ module SharedHelper + def inject_enterprises + inject_json "enterprises" , "enterprises", collection: @enterprises + end def inject_json(name, partial, opts = {}) render "json/injection", {name: name, partial: partial}.merge(opts) diff --git a/app/views/home/_hubs.html.haml b/app/views/home/_hubs.html.haml index 17a4cc13a5..55b8cc29ca 100644 --- a/app/views/home/_hubs.html.haml +++ b/app/views/home/_hubs.html.haml @@ -1,5 +1,5 @@ #hubs.hubs{"ng-controller" => "HubsCtrl"} - = inject_json "enterprises" , "enterprises", collection: @enterprises + = inject_enterprises .row .small-12.columns.text-center diff --git a/app/views/json/_enterprises_for_map.rabl b/app/views/json/_enterprises_for_map.rabl new file mode 100644 index 0000000000..641cb34a82 --- /dev/null +++ b/app/views/json/_enterprises_for_map.rabl @@ -0,0 +1,2 @@ +collection @enterprises +extends 'json/partials/enterprise' diff --git a/app/views/map/index.html.haml b/app/views/map/index.html.haml index 2c49deb4d4..277178bfdc 100644 --- a/app/views/map/index.html.haml +++ b/app/views/map/index.html.haml @@ -1,4 +1,4 @@ -= inject_json "enterprisesForMap" , "enterprises", collection: @enterprises += inject_json "enterprisesForMap" , "enterprises_for_map", collection: @enterprises .map-container{"fill-vertical" => true} %map{"ng-controller" => "MapCtrl"} diff --git a/app/views/producers/index.haml b/app/views/producers/index.haml index e30475fdd8..2c3253a141 100644 --- a/app/views/producers/index.haml +++ b/app/views/producers/index.haml @@ -1,5 +1,5 @@ .producers{"ng-controller" => "ProducersCtrl"} - = inject_json "producers" , "producers", collection: @producers + = inject_enterprises .row .small-12.columns.text-center.pad-top diff --git a/spec/controllers/base_controller_spec.rb b/spec/controllers/base_controller_spec.rb index 8269c9374d..85afcbc7ff 100644 --- a/spec/controllers/base_controller_spec.rb +++ b/spec/controllers/base_controller_spec.rb @@ -18,4 +18,14 @@ describe BaseController do response.should redirect_to root_url flash[:info].should == "The order cycle you've selected has just closed. Please try again!" end + + it "loads active_distributors" do + Enterprise.should_receive(:distributors_with_active_order_cycles) + controller.load_active_distributors + end + + it "loads visible enterprises" do + Enterprise.should_receive(:visible) + controller.load_visible_enterprises + end end diff --git a/spec/controllers/home_controller_spec.rb b/spec/controllers/home_controller_spec.rb index babb1c84e6..54b6611438 100644 --- a/spec/controllers/home_controller_spec.rb +++ b/spec/controllers/home_controller_spec.rb @@ -7,6 +7,7 @@ describe HomeController do before do Enterprise.stub(:distributors_with_active_order_cycles).and_return [distributor] + Enterprise.stub(:visible).and_return [distributor] end it "sets active distributors" do @@ -14,6 +15,11 @@ describe HomeController do assigns[:active_distributors].should == [distributor] end + it "loads visible enterprises" do + get :index + assigns[:enterprises].should == [distributor] + end + it "does not show invisible hubs" do get :index response.body.should_not have_content invisible_distributor.name diff --git a/spec/controllers/map_controller_spec.rb b/spec/controllers/map_controller_spec.rb index dedb534b1b..455420380d 100644 --- a/spec/controllers/map_controller_spec.rb +++ b/spec/controllers/map_controller_spec.rb @@ -5,4 +5,9 @@ describe MapController do Enterprise.should_receive(:visible) get :index end + + it "loads active distributors" do + Enterprise.should_receive(:distributors_with_active_order_cycles) + get :index + end end diff --git a/spec/controllers/producers_controller_spec.rb b/spec/controllers/producers_controller_spec.rb index 885b3981a1..7b399df209 100644 --- a/spec/controllers/producers_controller_spec.rb +++ b/spec/controllers/producers_controller_spec.rb @@ -1,9 +1,20 @@ require 'spec_helper' describe ProducersController do - it "gets all active producers" do - Enterprise.stub_chain(:is_primary_producer, :visible) - Enterprise.should_receive(:is_primary_producer) + let!(:distributor) { create(:distributor_enterprise) } + + before do + Enterprise.stub(:distributors_with_active_order_cycles).and_return [distributor] + Enterprise.stub(:visible).and_return [distributor] + end + + it "sets active distributors" do get :index + assigns[:active_distributors].should == [distributor] + end + + it "loads visible enterprises" do + get :index + assigns[:enterprises].should == [distributor] end end diff --git a/spec/javascripts/unit/darkswarm/services/map_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/map_spec.js.coffee new file mode 100644 index 0000000000..19ee666e19 --- /dev/null +++ b/spec/javascripts/unit/darkswarm/services/map_spec.js.coffee @@ -0,0 +1,19 @@ +describe "Hubs service", -> + OfnMap = null + enterprises = [ + { + id: 2 + active: false + orders_close_at: new Date() + type: "hub" + } + ] + + beforeEach -> + module 'Darkswarm' + angular.module('Darkswarm').value('enterprises', enterprises) + inject ($injector)-> + OfnMap = $injector.get("OfnMap") + + it "builds MapMarkers from enterprises", -> + expect(OfnMap.enterprises[0].enterprise).toBe enterprises[0] From 2acf3bf382500240980030779b4314b2284856e0 Mon Sep 17 00:00:00 2001 From: summerscope Date: Wed, 18 Jun 2014 17:10:47 +1000 Subject: [PATCH 18/32] Styling for old IE upgrade / warning message --- .../stylesheets/darkswarm/ie_warning.sass | 94 +++++++++++++++++-- 1 file changed, 86 insertions(+), 8 deletions(-) diff --git a/app/assets/stylesheets/darkswarm/ie_warning.sass b/app/assets/stylesheets/darkswarm/ie_warning.sass index f0fc9099ee..3c999864d3 100644 --- a/app/assets/stylesheets/darkswarm/ie_warning.sass +++ b/app/assets/stylesheets/darkswarm/ie_warning.sass @@ -1,9 +1,87 @@ #ie-warning - background: white - position: fixed - top: 0 - z-index: 200 - left: 0 - width: 100% - font-size: 1.2em - padding: 20px + margin-bottom: 0 + padding-bottom: 2rem + .ie-msg + background: rgba(255,255,255,0.15) + padding: 0.5rem + margin-bottom: 1rem + .browserbtn + text-align: center + a + color: white + font-size: 1rem + &:hover, &:active, &:focus + color: black + a.browserlogo + display: block + width: 100% + // background: rgba(255,255,255,0.5) + i.rotateIn.animated + font-size: 5rem + color: white + text-align: center + display: block + +@-webkit-keyframes rotateIn + 0% + -webkit-transform-origin: center center + transform-origin: center center + -webkit-transform: rotate(-200deg) + transform: rotate(-200deg) + opacity: 0 + 100% + -webkit-transform-origin: center center + transform-origin: center center + -webkit-transform: rotate(0) + transform: rotate(0) + opacity: 1 + + +@keyframes rotateIn + 0% + -webkit-transform-origin: center center + -ms-transform-origin: center center + transform-origin: center center + -webkit-transform: rotate(-200deg) + -ms-transform: rotate(-200deg) + transform: rotate(-200deg) + opacity: 0 + 100% + -webkit-transform-origin: center center + -ms-transform-origin: center center + transform-origin: center center + -webkit-transform: rotate(0) + -ms-transform: rotate(0) + transform: rotate(0) + opacity: 1 + + +.rotateIn + -webkit-animation-name: rotateIn + animation-name: rotateIn + animation-delay: 0.5s + -webkit-animation-delay: 0.5s + +.delay1 + animation-delay: 0.75s + -webkit-animation-delay: 0.755s +.delay2 + animation-delay: 1s + -webkit-animation-delay: 1s +.delay3 + animation-delay: 1.25s + -webkit-animation-delay: 1.25s + +.animated + -webkit-animation-duration: 0.8s + animation-duration: 0.8s + -webkit-animation-fill-mode: both + animation-fill-mode: both + animation-timing-function: ease-in-out + -webkit-animation-timing-function: ease-in-out + + + + + + From 4d6a92dfe40121d84d807a0535c846d0289a6e45 Mon Sep 17 00:00:00 2001 From: summerscope Date: Wed, 18 Jun 2014 17:11:08 +1000 Subject: [PATCH 19/32] Update markup to include links to modern browsers for upgrade --- app/views/layouts/darkswarm.html.haml | 28 +++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/app/views/layouts/darkswarm.html.haml b/app/views/layouts/darkswarm.html.haml index 5208c3d5ef..f480329bba 100644 --- a/app/views/layouts/darkswarm.html.haml +++ b/app/views/layouts/darkswarm.html.haml @@ -1,4 +1,3 @@ -!!! %html %head %meta{charset: 'utf-8'}/ @@ -18,11 +17,28 @@ = csrf_meta_tags %body.off-canvas{"ng-app" => "Darkswarm"} - /[if lte IE 8] - #ie-warning - Your browser is very old! To use our site, you'll need to upgrade to - something a bit more modern, such as - %a{href: "https://www.google.com/intl/en_au/chrome/browser/"} Google Chrome + / [if lte IE 9] + .alert-box.alert#ie-warning{"data-alert" => ""} + .row.ie-msg + .small-4.large-2.columns + %i.ofn-i_012-warning.rotateIn.animated + .small-8.large-10.columns + %h3 Your browser is out of date! + %p For the best Open Food Network experience, we strongly recommend upgrading your browser: + .row + .small-4.columns.browserbtn + %a.browserlogo{href: "https://www.google.com/intl/en_au/chrome/browser/", target: "_blank"} + %img.rotateIn.animated.delay1{src: "assets/browser-logos/chrome.png"} + %a{href: "https://www.google.com/intl/en_au/chrome/browser/", target: "_blank"} Google Chrome + .small-4.columns.browserbtn + %a.browserlogo{href: "http://www.mozilla.org/en-US/firefox/new/", target: "_blank"} + %img.rotateIn.animated.delay2{src: "assets/browser-logos/firefox.png"} + %a{href: "http://www.mozilla.org/en-US/firefox/new/", target: "_blank"} Firefox + .small-4.columns.browserbtn + %a.browserlogo{href: "http://windows.microsoft.com/en-AU/internet-explorer/download-ie", target: "_blank"} + %img.rotateIn.animated.delay3{src: "assets/browser-logos/internet-explorer.png"} + %a{href: "http://windows.microsoft.com/en-AU/internet-explorer/download-ie", target: "_blank"} Internet Explorer + %a.close{href: "#"} × = inject_json "currentHub", "current_hub" From 83e7225ef874ba8821349b4eb7d79821aa225395 Mon Sep 17 00:00:00 2001 From: summerscope Date: Wed, 18 Jun 2014 17:11:57 +1000 Subject: [PATCH 20/32] Add browser logos for IE message --- app/assets/images/browser-logos/chrome.png | Bin 0 -> 9441 bytes app/assets/images/browser-logos/firefox.png | Bin 0 -> 16323 bytes .../images/browser-logos/internet-explorer.png | Bin 0 -> 11431 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/assets/images/browser-logos/chrome.png create mode 100644 app/assets/images/browser-logos/firefox.png create mode 100644 app/assets/images/browser-logos/internet-explorer.png diff --git a/app/assets/images/browser-logos/chrome.png b/app/assets/images/browser-logos/chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..79a0b8e064ec88f44d84f26f633257b67af6e577 GIT binary patch literal 9441 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

RC4jKy7xnp0hiRJ_PNeV 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 L)}+eVJMRAg4tSJT literal 0 HcmV?d00001 diff --git a/app/assets/images/browser-logos/internet-explorer.png b/app/assets/images/browser-logos/internet-explorer.png new file mode 100644 index 0000000000000000000000000000000000000000..c67631a65ed5b1f24a15007c26dd63142f28eab9 GIT binary patch literal 11431 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 f{%`Ep)4|ibU~i3pZ?NOjmVlY5l}WiVCg%SE Date: Wed, 18 Jun 2014 17:14:20 +1000 Subject: [PATCH 21/32] Turn off IE message ready for logic --- app/views/layouts/darkswarm.html.haml | 42 +++++++++++++-------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/app/views/layouts/darkswarm.html.haml b/app/views/layouts/darkswarm.html.haml index f480329bba..b2d12688db 100644 --- a/app/views/layouts/darkswarm.html.haml +++ b/app/views/layouts/darkswarm.html.haml @@ -18,27 +18,27 @@ %body.off-canvas{"ng-app" => "Darkswarm"} / [if lte IE 9] - .alert-box.alert#ie-warning{"data-alert" => ""} - .row.ie-msg - .small-4.large-2.columns - %i.ofn-i_012-warning.rotateIn.animated - .small-8.large-10.columns - %h3 Your browser is out of date! - %p For the best Open Food Network experience, we strongly recommend upgrading your browser: - .row - .small-4.columns.browserbtn - %a.browserlogo{href: "https://www.google.com/intl/en_au/chrome/browser/", target: "_blank"} - %img.rotateIn.animated.delay1{src: "assets/browser-logos/chrome.png"} - %a{href: "https://www.google.com/intl/en_au/chrome/browser/", target: "_blank"} Google Chrome - .small-4.columns.browserbtn - %a.browserlogo{href: "http://www.mozilla.org/en-US/firefox/new/", target: "_blank"} - %img.rotateIn.animated.delay2{src: "assets/browser-logos/firefox.png"} - %a{href: "http://www.mozilla.org/en-US/firefox/new/", target: "_blank"} Firefox - .small-4.columns.browserbtn - %a.browserlogo{href: "http://windows.microsoft.com/en-AU/internet-explorer/download-ie", target: "_blank"} - %img.rotateIn.animated.delay3{src: "assets/browser-logos/internet-explorer.png"} - %a{href: "http://windows.microsoft.com/en-AU/internet-explorer/download-ie", target: "_blank"} Internet Explorer - %a.close{href: "#"} × + .alert-box.alert#ie-warning{"data-alert" => ""} + .row.ie-msg + .small-4.large-2.columns + %i.ofn-i_012-warning.rotateIn.animated + .small-8.large-10.columns + %h3 Your browser is out of date! + %p For the best Open Food Network experience, we strongly recommend upgrading your browser: + .row + .small-4.columns.browserbtn + %a.browserlogo{href: "https://www.google.com/intl/en_au/chrome/browser/", target: "_blank"} + %img.rotateIn.animated.delay1{src: "assets/browser-logos/chrome.png"} + %a{href: "https://www.google.com/intl/en_au/chrome/browser/", target: "_blank"} Google Chrome + .small-4.columns.browserbtn + %a.browserlogo{href: "http://www.mozilla.org/en-US/firefox/new/", target: "_blank"} + %img.rotateIn.animated.delay2{src: "assets/browser-logos/firefox.png"} + %a{href: "http://www.mozilla.org/en-US/firefox/new/", target: "_blank"} Firefox + .small-4.columns.browserbtn + %a.browserlogo{href: "http://windows.microsoft.com/en-AU/internet-explorer/download-ie", target: "_blank"} + %img.rotateIn.animated.delay3{src: "assets/browser-logos/internet-explorer.png"} + %a{href: "http://windows.microsoft.com/en-AU/internet-explorer/download-ie", target: "_blank"} Internet Explorer + %a.close{href: "#"} × = inject_json "currentHub", "current_hub" From c02c7cf7caee77f927f5e5ccf271c860e4d92dd7 Mon Sep 17 00:00:00 2001 From: Will Marshall Date: Wed, 18 Jun 2014 17:54:13 +1000 Subject: [PATCH 22/32] Further patches to the damned RABL system, patching everything up to use our new Service structure --- .../controllers/products_controller.js.coffee | 5 +++-- .../darkswarm/services/hubs.js.coffee | 6 +++--- .../javascripts/darkswarm/services/map.js.coffee | 16 ++++++++++------ .../darkswarm/services/map_modal.js.coffee | 2 +- .../darkswarm/services/producers.js.coffee | 2 +- .../darkswarm/services/product.js.coffee | 11 +++++------ app/helpers/shared_helper.rb | 4 ++-- app/views/json/_enterprises.rabl | 1 - app/views/json/_enterprises_for_map.rabl | 2 +- app/views/json/_injection.html.haml | 2 +- app/views/json/partials/_enterprise.rabl | 4 ++-- app/views/map/index.html.haml | 2 +- app/views/shop/products/_form.html.haml | 4 ++-- .../products_controller_spec.js.coffee | 4 ++-- .../unit/darkswarm/services/hubs_spec.js.coffee | 6 +++--- .../unit/darkswarm/services/map_spec.js.coffee | 2 +- .../darkswarm/services/producers_spec.js.coffee | 2 +- .../darkswarm/services/product_spec.js.coffee | 2 +- 18 files changed, 40 insertions(+), 37 deletions(-) diff --git a/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee b/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee index 323df2fc4e..3fdb58cf8e 100644 --- a/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee +++ b/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee @@ -1,11 +1,12 @@ Darkswarm.controller "ProductsCtrl", ($scope, $rootScope, Product, OrderCycle) -> - $scope.data = Product.data + $scope.products = Product.products + $scope.loading = Product.loading $scope.limit = 3 $scope.ordering = {order: "name"} $scope.order_cycle = OrderCycle.order_cycle $scope.incrementLimit = -> - if $scope.limit < $scope.data.products.length + if $scope.limit < $scope.products.length $scope.limit = $scope.limit + 1 $scope.searchKeypress = (e)-> diff --git a/app/assets/javascripts/darkswarm/services/hubs.js.coffee b/app/assets/javascripts/darkswarm/services/hubs.js.coffee index 65940c5708..70df62e888 100644 --- a/app/assets/javascripts/darkswarm/services/hubs.js.coffee +++ b/app/assets/javascripts/darkswarm/services/hubs.js.coffee @@ -1,8 +1,8 @@ Darkswarm.factory 'Hubs', ($filter, Enterprises) -> new class Hubs constructor: -> - @hubs = @filter Enterprises.enterprises.filter (hub)-> - hub.type == "hub" + @hubs = @order Enterprises.enterprises.filter (hub)-> + hub.enterprise_type == "hub" - filter: (hubs)-> + order: (hubs)-> $filter('orderBy')(hubs, ['-active', '+orders_close_at']) diff --git a/app/assets/javascripts/darkswarm/services/map.js.coffee b/app/assets/javascripts/darkswarm/services/map.js.coffee index f2050a6f25..fd76eeff91 100644 --- a/app/assets/javascripts/darkswarm/services/map.js.coffee +++ b/app/assets/javascripts/darkswarm/services/map.js.coffee @@ -1,13 +1,17 @@ -Darkswarm.factory "OfnMap", (enterprisesForMap, MapModal)-> +Darkswarm.factory "OfnMap", (Enterprises, MapModal)-> new class OfnMap constructor: -> - @enterprises = (@extend(enterprise) for enterprise in enterprisesForMap) - console.log @enterprises + @enterprises = (@extend(enterprise) for enterprise in Enterprises.enterprises) + # Adding methods to each enterprise extend: (enterprise)-> new class MapMarker - constructor: -> - @[k] = v for k, v of enterprise + # We're whitelisting attributes because Gmaps tries to crawl + # our data, and our data is recursive + latitude: enterprise.latitude + longitude: enterprise.longitude + icon: enterprise.icon + id: enterprise.id reveal: => - MapModal.open @ + MapModal.open enterprise diff --git a/app/assets/javascripts/darkswarm/services/map_modal.js.coffee b/app/assets/javascripts/darkswarm/services/map_modal.js.coffee index f5c8d3d065..2f1bd832b4 100644 --- a/app/assets/javascripts/darkswarm/services/map_modal.js.coffee +++ b/app/assets/javascripts/darkswarm/services/map_modal.js.coffee @@ -2,7 +2,7 @@ Darkswarm.factory "MapModal", ($modal, $rootScope)-> new class MapModal open: (enterprise)-> scope = $rootScope.$new(true) # Spawn an isolate to contain the enterprise - if enterprise['is_primary_producer?'] + if enterprise.enterprise_type == "producer" scope.producer = enterprise $modal.open(templateUrl: "map_modal_producer.html", scope: scope) else diff --git a/app/assets/javascripts/darkswarm/services/producers.js.coffee b/app/assets/javascripts/darkswarm/services/producers.js.coffee index 8ca9752d28..6483ef35eb 100644 --- a/app/assets/javascripts/darkswarm/services/producers.js.coffee +++ b/app/assets/javascripts/darkswarm/services/producers.js.coffee @@ -2,5 +2,5 @@ Darkswarm.factory 'Producers', (Enterprises) -> new class Producers constructor: -> @producers = Enterprises.enterprises.filter (enterprise)-> - enterprise.type == "producer" + enterprise.enterprise_type == "producer" diff --git a/app/assets/javascripts/darkswarm/services/product.js.coffee b/app/assets/javascripts/darkswarm/services/product.js.coffee index 406e122de1..5fae2314a8 100644 --- a/app/assets/javascripts/darkswarm/services/product.js.coffee +++ b/app/assets/javascripts/darkswarm/services/product.js.coffee @@ -5,11 +5,10 @@ Darkswarm.factory 'Product', ($resource) -> # TODO: don't need to scope this into object # Already on object as far as controller scope is concerned - data: - products: null - loading: true + products: null + loading: true update: => - @data.products = $resource("/shop/products").query => - @data.loading = false - @data + @products = $resource("/shop/products").query => + @loading = false + @ diff --git a/app/helpers/shared_helper.rb b/app/helpers/shared_helper.rb index f421107994..b552ccd554 100644 --- a/app/helpers/shared_helper.rb +++ b/app/helpers/shared_helper.rb @@ -1,10 +1,10 @@ module SharedHelper def inject_enterprises - inject_json "enterprises" , "enterprises", collection: @enterprises + inject_json "enterprises" , "enterprises" end def inject_json(name, partial, opts = {}) - render "json/injection", {name: name, partial: partial}.merge(opts) + render partial: "json/injection", locals: {name: name, partial: partial}.merge(opts) end def distributor_link_class(distributor) diff --git a/app/views/json/_enterprises.rabl b/app/views/json/_enterprises.rabl index 40065ff03f..9b4988b83f 100644 --- a/app/views/json/_enterprises.rabl +++ b/app/views/json/_enterprises.rabl @@ -1,5 +1,4 @@ collection Enterprise.visible -attributes :name, :id, :description extends 'json/partials/enterprise' extends 'json/partials/producer' extends 'json/partials/hub' diff --git a/app/views/json/_enterprises_for_map.rabl b/app/views/json/_enterprises_for_map.rabl index 641cb34a82..9ce100ab65 100644 --- a/app/views/json/_enterprises_for_map.rabl +++ b/app/views/json/_enterprises_for_map.rabl @@ -1,2 +1,2 @@ collection @enterprises -extends 'json/partials/enterprise' +extends "json/partials/enterprise" diff --git a/app/views/json/_injection.html.haml b/app/views/json/_injection.html.haml index 95b921406b..ca58b4a943 100644 --- a/app/views/json/_injection.html.haml +++ b/app/views/json/_injection.html.haml @@ -1,2 +1,2 @@ :javascript - angular.module('Darkswarm').value("#{name.to_s}", #{render "json/#{partial.to_s}"}) + angular.module('Darkswarm').value("#{name.to_s}", #{render partial: "json/#{partial.to_s}"}) diff --git a/app/views/json/partials/_enterprise.rabl b/app/views/json/partials/_enterprise.rabl index 32c2ccf4ab..86cd9f08aa 100644 --- a/app/views/json/partials/_enterprise.rabl +++ b/app/views/json/partials/_enterprise.rabl @@ -1,6 +1,6 @@ -attributes :name, :id, :description, :latitude, :longitude, :long_description, :website, :instagram, :linkedin, :twitter, :facebook, :is_primary_producer?, :is_distributor? +attributes :name, :id, :description, :latitude, :longitude, :long_description, :website, :instagram, :linkedin, :twitter, :facebook -node :type do |enterprise| +node :enterprise_type do |enterprise| if enterprise.is_primary_producer? "producer" elsif enterprise.is_distributor? diff --git a/app/views/map/index.html.haml b/app/views/map/index.html.haml index 277178bfdc..e7f6006ae4 100644 --- a/app/views/map/index.html.haml +++ b/app/views/map/index.html.haml @@ -1,4 +1,4 @@ -= inject_json "enterprisesForMap" , "enterprises_for_map", collection: @enterprises += inject_enterprises .map-container{"fill-vertical" => true} %map{"ng-controller" => "MapCtrl"} diff --git a/app/views/shop/products/_form.html.haml b/app/views/shop/products/_form.html.haml index 95bfdac31d..d948f18f60 100644 --- a/app/views/shop/products/_form.html.haml +++ b/app/views/shop/products/_form.html.haml @@ -14,7 +14,7 @@ %div{bindonce: true} %product{"ng-controller" => "ProductNodeCtrl", - "ng-repeat" => "product in data.products | filter:query | orderBy:ordering.order | limitTo: limit track by product.id"} + "ng-repeat" => "product in products | filter:query | orderBy:ordering.order | limitTo: limit track by product.id"} %div = render partial: "shop/products/summary" %div{"bo-if" => "hasVariants"} @@ -22,7 +22,7 @@ .variants.row{"bo-if" => "!hasVariants"} = render partial: "shop/products/master" - %product{"ng-show" => "data.loading"} + %product{"ng-show" => "loading"} .row.summary .small-12.columns.text-center Loading products diff --git a/spec/javascripts/unit/darkswarm/controllers/products_controller_spec.js.coffee b/spec/javascripts/unit/darkswarm/controllers/products_controller_spec.js.coffee index 685d495039..3a1b5fb399 100644 --- a/spec/javascripts/unit/darkswarm/controllers/products_controller_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/controllers/products_controller_spec.js.coffee @@ -9,7 +9,7 @@ describe 'ProductsCtrl', -> Product = all: -> update: -> - data: "testy mctest" + products: "testy mctest" OrderCycle = order_cycle: {} @@ -18,4 +18,4 @@ describe 'ProductsCtrl', -> ctrl = $controller 'ProductsCtrl', {$scope: scope, Product: Product, OrderCycle: OrderCycle} it 'fetches products from Product', -> - expect(scope.data).toEqual 'testy mctest' + expect(scope.products).toEqual 'testy mctest' diff --git a/spec/javascripts/unit/darkswarm/services/hubs_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/hubs_spec.js.coffee index 6247c7a713..9d4513af35 100644 --- a/spec/javascripts/unit/darkswarm/services/hubs_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/services/hubs_spec.js.coffee @@ -6,19 +6,19 @@ describe "Hubs service", -> id: 2 active: false orders_close_at: new Date() - type: "hub" + enterprise_type: "hub" } { id: 3 active: false orders_close_at: new Date() - type: "hub" + enterprise_type: "hub" } { id: 1 active: true orders_close_at: new Date() - type: "hub" + enterprise_type: "hub" } ] diff --git a/spec/javascripts/unit/darkswarm/services/map_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/map_spec.js.coffee index 19ee666e19..67acef2770 100644 --- a/spec/javascripts/unit/darkswarm/services/map_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/services/map_spec.js.coffee @@ -16,4 +16,4 @@ describe "Hubs service", -> OfnMap = $injector.get("OfnMap") it "builds MapMarkers from enterprises", -> - expect(OfnMap.enterprises[0].enterprise).toBe enterprises[0] + expect(OfnMap.enterprises[0].id).toBe enterprises[0].id diff --git a/spec/javascripts/unit/darkswarm/services/producers_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/producers_spec.js.coffee index ab2cc04cac..403bf186ba 100644 --- a/spec/javascripts/unit/darkswarm/services/producers_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/services/producers_spec.js.coffee @@ -2,7 +2,7 @@ describe "Producers service", -> Producers = null Enterprises = null enterprises = [ - {type: "producer"} + {enterprise_type: "producer"} ] beforeEach -> diff --git a/spec/javascripts/unit/darkswarm/services/product_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/product_spec.js.coffee index 260074a981..c053573565 100644 --- a/spec/javascripts/unit/darkswarm/services/product_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/services/product_spec.js.coffee @@ -11,4 +11,4 @@ describe 'Product service', -> it "Fetches products from the backend on init", -> $httpBackend.expectGET("/shop/products").respond([{test : "cats"}]) $httpBackend.flush() - expect(Product.data.products[0].test).toEqual "cats" + expect(Product.products[0].test).toEqual "cats" From e924d8d5dcdc358d724bba41be8146c266539349 Mon Sep 17 00:00:00 2001 From: summerscope Date: Wed, 18 Jun 2014 18:50:40 +1000 Subject: [PATCH 23/32] Adding stylesheet to manage modals for Hubs and Producers --- .../stylesheets/darkswarm/modals.css.sass | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 app/assets/stylesheets/darkswarm/modals.css.sass diff --git a/app/assets/stylesheets/darkswarm/modals.css.sass b/app/assets/stylesheets/darkswarm/modals.css.sass new file mode 100644 index 0000000000..de9d64645d --- /dev/null +++ b/app/assets/stylesheets/darkswarm/modals.css.sass @@ -0,0 +1,49 @@ +@import branding +@import mixins + +dialog, .reveal-modal + border: none + outline: none + +.reveal-modal-bg + background-color: rgba(0,0,0,0.65) + +.modal-centered + text-align: center + p + margin-bottom: 0 + +.modal-header + text-align: center + text-transform: uppercase + border-bottom: 1px solid black + +dialog .close-reveal-modal.outside, .reveal-modal .close-reveal-modal.outside + @include csstrans + top: -2.2rem + right: -2.2rem + font-size: 2rem + color: white + text-shadow: none + &:hover, &:active, &:focus + color: $clr-brick-light-bright + text-shadow: 0 1px 3px #333 + +.highlight + position: relative + +.highlight-row + padding: 0.75rem 0.9375rem + width: 100% + overflow: hidden + background-color: rgba(255,255,255,0.5) + position: absolute + bottom: 0 + h3, p + margin-top: 0 + margin-bottom: 0 + padding-bottom: 0 + line-height: 1 + p + line-height: 2 + From fcd0096843b63198a0524c2168a61af639a18977 Mon Sep 17 00:00:00 2001 From: summerscope Date: Wed, 18 Jun 2014 18:50:59 +1000 Subject: [PATCH 24/32] Changing markup to Hub modal (map) to reflect new design --- app/assets/javascripts/templates/map_modal_hub.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/templates/map_modal_hub.html.haml b/app/assets/javascripts/templates/map_modal_hub.html.haml index 4b5fab15fb..546f83d9b2 100644 --- a/app/assets/javascripts/templates/map_modal_hub.html.haml +++ b/app/assets/javascripts/templates/map_modal_hub.html.haml @@ -45,5 +45,5 @@ %i.ofn-i_043-instagram {{ enterprise.instagram }} - %a.close-reveal-modal{"ng-click" => "$close()"} + %a.close-reveal-modal.outside{"ng-click" => "$close()"} %i.ofn-i_009-close From 54983845c4f912f574dcc67e0de592a79e72049d Mon Sep 17 00:00:00 2001 From: summerscope Date: Wed, 18 Jun 2014 18:52:07 +1000 Subject: [PATCH 25/32] Update contact markup to reflect new design --- .../javascripts/templates/partials/contact.html.haml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/app/assets/javascripts/templates/partials/contact.html.haml b/app/assets/javascripts/templates/partials/contact.html.haml index 3dc3dd028c..2811a221a5 100644 --- a/app/assets/javascripts/templates/partials/contact.html.haml +++ b/app/assets/javascripts/templates/partials/contact.html.haml @@ -1,16 +1,12 @@ -%div{"bo-if" => "producer.email || producer.website || producer.address.phone"} - %h3 Contact +%div.modal-centered{"bo-if" => "producer.email || producer.website || producer.address.phone"} + %h5.modal-header Contact + %p{"ng-if" => "producer.address.phone"} + {{ producer.address.phone }} %p{"bo-if" => "producer.email"} %a{"ng-href" => "mailto:{{producer.email | stripUrl}}", target: "_blank" } - %i.ofn-i_050-mail-circle {{ producer.email | stripUrl }} - %p{"ng-if" => "producer.address.phone"} - WE NEED A PHONE ICON - {{ producer.address.phone }} - %p{"ng-if" => "producer.website"} %a{"ng-href" => "http://{{producer.website | stripUrl}}", target: "_blank" } - %i.ofn-i_049-web {{ producer.website | stripUrl }} From f89418c0d66015748068c9860e3bbb58aa0a2833 Mon Sep 17 00:00:00 2001 From: summerscope Date: Wed, 18 Jun 2014 18:52:29 +1000 Subject: [PATCH 26/32] Update follow markup to reflect new design WIP commit --- app/assets/javascripts/templates/partials/follow.html.haml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/templates/partials/follow.html.haml b/app/assets/javascripts/templates/partials/follow.html.haml index 41a91022a9..c4d101af7b 100644 --- a/app/assets/javascripts/templates/partials/follow.html.haml +++ b/app/assets/javascripts/templates/partials/follow.html.haml @@ -1,6 +1,5 @@ -%div{"bo-if" => "producer.twitter || producer.facebook || producer.linkedin || producer.instagram"} - %h3 Follow - +%div.modal-centered{"bo-if" => "producer.twitter || producer.facebook || producer.linkedin || producer.instagram"} + %h5.modal-header Follow %ul.small-block-grid-1{bindonce: true} %li{"ng-if" => "producer.twitter"} %a{"ng-href" => "http://twitter.com/{{producer.twitter}}", target: "_blank"} From a62ab98f537e790767b172376edfd9df9b24b3cb Mon Sep 17 00:00:00 2001 From: summerscope Date: Wed, 18 Jun 2014 18:53:02 +1000 Subject: [PATCH 27/32] Update images styling to make more generic / modular and remove styling specific to producers to make more scalable. --- app/assets/stylesheets/darkswarm/images.css.sass | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/app/assets/stylesheets/darkswarm/images.css.sass b/app/assets/stylesheets/darkswarm/images.css.sass index 90207a2239..59fde9b48d 100644 --- a/app/assets/stylesheets/darkswarm/images.css.sass +++ b/app/assets/stylesheets/darkswarm/images.css.sass @@ -15,23 +15,12 @@ padding: 0 .producer-hero-img - background-color: #999 + background-color: #333 width: 100% min-height: 160px height: inherit max-height: 260px overflow: hidden - margin-top: 2em - margin-bottom: 1em - - -h3.producer-name - background-color: rgba(255,255,255,0.65) - height: 2.5em - width: 100% - position: absolute - bottom: 0 - padding: 0.5em .producer-logo max-width: 220px From 710abf96ebd4d652cde96680514487a681828c2c Mon Sep 17 00:00:00 2001 From: summerscope Date: Wed, 18 Jun 2014 18:53:31 +1000 Subject: [PATCH 28/32] Changing Producer modal markup to reflect new design. WIP commit, --- .../templates/map_modal_producer.html.haml | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/app/assets/javascripts/templates/map_modal_producer.html.haml b/app/assets/javascripts/templates/map_modal_producer.html.haml index d09eb3e7f6..589e2f84d6 100644 --- a/app/assets/javascripts/templates/map_modal_producer.html.haml +++ b/app/assets/javascripts/templates/map_modal_producer.html.haml @@ -1,24 +1,27 @@ -.row - .small-12.columns.producer-hero - %h3.producer-name +.highlight + .highlight-row + %p.right + {{ hub.address.city }} , {{hub.address.state}} + %h3 %i.ofn-i_036-producers {{ producer.name }} - %img.producer-hero-img{"ng-src" => "{{producer.promo_image}}"} -.row{bindonce: true} + %img.producer-hero-img{"ng-src" => "{{producer.promo_image}}"} + +.row.pad-top{bindonce: true} .small-12.large-6.columns %img.producer-logo{"bo-src" => "producer.logo", "bo-if" => "producer.logo"} + %h5.modal-header About %p{"ng-bind-html" => "producer.long_description"} .small-12.large-6.columns - %ng-include{src: "'partials/contact.html'"} %ng-include{src: "'partials/follow.html'"} .row{bindonce: true} - .hubs - %h4 Shop for {{producer.name}} products at: - %a.hub{"ng-repeat" => "hub in producer.hubs", + .modal-hubs + %h5 Shop for {{producer.name}} products at: + %a.button.primary.hub{"ng-repeat" => "hub in producer.hubs", "bo-href" => "hub.path", "bo-class" => "{active: hub.active, inactive: !hub.active}", "ofn-empties-cart" => "hub"} @@ -27,5 +30,5 @@ {{hub.name}} ( {{ hub.address.city }} , {{hub.address.state}} ) -%a.close-reveal-modal{"ng-click" => "$close()"} +%a.close-reveal-modal.outside{"ng-click" => "$close()"} %i.ofn-i_009-close From b0b8e14adb9c48327e159fafc10f0b50891a45d5 Mon Sep 17 00:00:00 2001 From: summerscope Date: Thu, 19 Jun 2014 11:30:41 +1000 Subject: [PATCH 29/32] Tweak IE old warning message for stakeholder feedback --- app/views/layouts/darkswarm.html.haml | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/app/views/layouts/darkswarm.html.haml b/app/views/layouts/darkswarm.html.haml index b2d12688db..35b58a9e39 100644 --- a/app/views/layouts/darkswarm.html.haml +++ b/app/views/layouts/darkswarm.html.haml @@ -17,27 +17,31 @@ = csrf_meta_tags %body.off-canvas{"ng-app" => "Darkswarm"} - / [if lte IE 9] + / [if lte IE 8] .alert-box.alert#ie-warning{"data-alert" => ""} .row.ie-msg .small-4.large-2.columns - %i.ofn-i_012-warning.rotateIn.animated + %i.ofn-i_012-warning .small-8.large-10.columns - %h3 Your browser is out of date! + %h3 Your browser is out of date :-( %p For the best Open Food Network experience, we strongly recommend upgrading your browser: .row .small-4.columns.browserbtn %a.browserlogo{href: "https://www.google.com/intl/en_au/chrome/browser/", target: "_blank"} - %img.rotateIn.animated.delay1{src: "assets/browser-logos/chrome.png"} - %a{href: "https://www.google.com/intl/en_au/chrome/browser/", target: "_blank"} Google Chrome + %img{src: "assets/browser-logos/chrome.png"} + %a{href: "https://www.google.com/intl/en_au/chrome/browser/", target: "_blank"} Download Chrome .small-4.columns.browserbtn %a.browserlogo{href: "http://www.mozilla.org/en-US/firefox/new/", target: "_blank"} - %img.rotateIn.animated.delay2{src: "assets/browser-logos/firefox.png"} - %a{href: "http://www.mozilla.org/en-US/firefox/new/", target: "_blank"} Firefox + %img{src: "assets/browser-logos/firefox.png"} + %a{href: "http://www.mozilla.org/en-US/firefox/new/", target: "_blank"} Download Firefox .small-4.columns.browserbtn %a.browserlogo{href: "http://windows.microsoft.com/en-AU/internet-explorer/download-ie", target: "_blank"} - %img.rotateIn.animated.delay3{src: "assets/browser-logos/internet-explorer.png"} - %a{href: "http://windows.microsoft.com/en-AU/internet-explorer/download-ie", target: "_blank"} Internet Explorer + %img{src: "assets/browser-logos/internet-explorer.png"} + %a{href: "http://windows.microsoft.com/en-AU/internet-explorer/download-ie", target: "_blank"} Upgrade Internet Explorer + .row.ie-msg + .small-12.large-12.columns + .text-center + %em Can't upgrade your browser? Try Open Food Network on your smartphone :-) %a.close{href: "#"} × From 47775b13fc96a4ff908a69c3c36cfb8374ad3434 Mon Sep 17 00:00:00 2001 From: summerscope Date: Thu, 19 Jun 2014 11:32:30 +1000 Subject: [PATCH 30/32] Tweak IE old warning css to remove css anims (not supported old browsers anyway) --- .../stylesheets/darkswarm/ie_warning.sass | 71 +++---------------- 1 file changed, 8 insertions(+), 63 deletions(-) diff --git a/app/assets/stylesheets/darkswarm/ie_warning.sass b/app/assets/stylesheets/darkswarm/ie_warning.sass index 3c999864d3..ede86a3083 100644 --- a/app/assets/stylesheets/darkswarm/ie_warning.sass +++ b/app/assets/stylesheets/darkswarm/ie_warning.sass @@ -5,83 +5,28 @@ background: rgba(255,255,255,0.15) padding: 0.5rem margin-bottom: 1rem + margin-top: 1rem .browserbtn text-align: center + margin-bottom: 1rem a color: white font-size: 1rem + filter: alpha(opacity=70) + opacity: 0.7 &:hover, &:active, &:focus - color: black + filter: alpha(opacity=100) + opacity: 1 + a.browserlogo display: block width: 100% - // background: rgba(255,255,255,0.5) - i.rotateIn.animated + i font-size: 5rem color: white text-align: center display: block -@-webkit-keyframes rotateIn - 0% - -webkit-transform-origin: center center - transform-origin: center center - -webkit-transform: rotate(-200deg) - transform: rotate(-200deg) - opacity: 0 - 100% - -webkit-transform-origin: center center - transform-origin: center center - -webkit-transform: rotate(0) - transform: rotate(0) - opacity: 1 - - -@keyframes rotateIn - 0% - -webkit-transform-origin: center center - -ms-transform-origin: center center - transform-origin: center center - -webkit-transform: rotate(-200deg) - -ms-transform: rotate(-200deg) - transform: rotate(-200deg) - opacity: 0 - 100% - -webkit-transform-origin: center center - -ms-transform-origin: center center - transform-origin: center center - -webkit-transform: rotate(0) - -ms-transform: rotate(0) - transform: rotate(0) - opacity: 1 - - -.rotateIn - -webkit-animation-name: rotateIn - animation-name: rotateIn - animation-delay: 0.5s - -webkit-animation-delay: 0.5s - -.delay1 - animation-delay: 0.75s - -webkit-animation-delay: 0.755s -.delay2 - animation-delay: 1s - -webkit-animation-delay: 1s -.delay3 - animation-delay: 1.25s - -webkit-animation-delay: 1.25s - -.animated - -webkit-animation-duration: 0.8s - animation-duration: 0.8s - -webkit-animation-fill-mode: both - animation-fill-mode: both - animation-timing-function: ease-in-out - -webkit-animation-timing-function: ease-in-out - - - From b9561ecf203f4600859ad21683ed089287c6c017 Mon Sep 17 00:00:00 2001 From: Will Marshall Date: Thu, 19 Jun 2014 11:41:24 +1000 Subject: [PATCH 31/32] Minor refactoring from code review with Rohan --- .../javascripts/darkswarm/services/hubs.js.coffee | 2 +- .../javascripts/darkswarm/services/map.js.coffee | 4 ++-- .../javascripts/darkswarm/services/map_modal.js.coffee | 9 +++++---- .../javascripts/darkswarm/services/producers.js.coffee | 2 +- app/controllers/base_controller.rb | 4 ---- app/controllers/home_controller.rb | 1 - app/controllers/map_controller.rb | 1 - app/controllers/producers_controller.rb | 1 - app/views/json/_enterprises.rabl | 3 +++ app/views/json/_enterprises_for_map.rabl | 2 -- app/views/json/partials/_enterprise.rabl | 10 +--------- app/views/json/partials/_hub.rabl | 4 ++-- spec/controllers/base_controller_spec.rb | 5 ----- spec/controllers/home_controller_spec.rb | 6 ------ spec/controllers/map_controller_spec.rb | 5 ----- spec/controllers/producers_controller_spec.rb | 5 ----- .../unit/darkswarm/services/hubs_spec.js.coffee | 6 +++--- .../unit/darkswarm/services/producers_spec.js.coffee | 2 +- 18 files changed, 19 insertions(+), 53 deletions(-) delete mode 100644 app/views/json/_enterprises_for_map.rabl diff --git a/app/assets/javascripts/darkswarm/services/hubs.js.coffee b/app/assets/javascripts/darkswarm/services/hubs.js.coffee index 70df62e888..5d55fa7de9 100644 --- a/app/assets/javascripts/darkswarm/services/hubs.js.coffee +++ b/app/assets/javascripts/darkswarm/services/hubs.js.coffee @@ -2,7 +2,7 @@ Darkswarm.factory 'Hubs', ($filter, Enterprises) -> new class Hubs constructor: -> @hubs = @order Enterprises.enterprises.filter (hub)-> - hub.enterprise_type == "hub" + hub.is_distributor order: (hubs)-> $filter('orderBy')(hubs, ['-active', '+orders_close_at']) diff --git a/app/assets/javascripts/darkswarm/services/map.js.coffee b/app/assets/javascripts/darkswarm/services/map.js.coffee index fd76eeff91..ed4bc8dae4 100644 --- a/app/assets/javascripts/darkswarm/services/map.js.coffee +++ b/app/assets/javascripts/darkswarm/services/map.js.coffee @@ -7,8 +7,8 @@ Darkswarm.factory "OfnMap", (Enterprises, MapModal)-> # Adding methods to each enterprise extend: (enterprise)-> new class MapMarker - # We're whitelisting attributes because Gmaps tries to crawl - # our data, and our data is recursive + # We're whitelisting attributes because GMaps tries to crawl + # our data, and our data is recursive, so it breaks latitude: enterprise.latitude longitude: enterprise.longitude icon: enterprise.icon diff --git a/app/assets/javascripts/darkswarm/services/map_modal.js.coffee b/app/assets/javascripts/darkswarm/services/map_modal.js.coffee index 2f1bd832b4..cd82edbe98 100644 --- a/app/assets/javascripts/darkswarm/services/map_modal.js.coffee +++ b/app/assets/javascripts/darkswarm/services/map_modal.js.coffee @@ -2,9 +2,10 @@ Darkswarm.factory "MapModal", ($modal, $rootScope)-> new class MapModal open: (enterprise)-> scope = $rootScope.$new(true) # Spawn an isolate to contain the enterprise - if enterprise.enterprise_type == "producer" - scope.producer = enterprise - $modal.open(templateUrl: "map_modal_producer.html", scope: scope) - else + + if enterprise.is_distributor scope.hub = enterprise $modal.open(templateUrl: "map_modal_hub.html", scope: scope) + else + scope.producer = enterprise + $modal.open(templateUrl: "map_modal_producer.html", scope: scope) diff --git a/app/assets/javascripts/darkswarm/services/producers.js.coffee b/app/assets/javascripts/darkswarm/services/producers.js.coffee index 6483ef35eb..ac8354c101 100644 --- a/app/assets/javascripts/darkswarm/services/producers.js.coffee +++ b/app/assets/javascripts/darkswarm/services/producers.js.coffee @@ -2,5 +2,5 @@ Darkswarm.factory 'Producers', (Enterprises) -> new class Producers constructor: -> @producers = Enterprises.enterprises.filter (enterprise)-> - enterprise.enterprise_type == "producer" + enterprise.is_primary_producer diff --git a/app/controllers/base_controller.rb b/app/controllers/base_controller.rb index 1a4c0aac8d..2ac35fa3ad 100644 --- a/app/controllers/base_controller.rb +++ b/app/controllers/base_controller.rb @@ -15,8 +15,4 @@ class BaseController < ApplicationController def load_active_distributors @active_distributors ||= Enterprise.distributors_with_active_order_cycles end - - def load_visible_enterprises - @enterprises = Enterprise.visible - end end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 97b386157d..76e179ed22 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -1,7 +1,6 @@ class HomeController < BaseController layout 'darkswarm' before_filter :load_active_distributors - before_filter :load_visible_enterprises def index end diff --git a/app/controllers/map_controller.rb b/app/controllers/map_controller.rb index d63d7f86a9..a980ba8f40 100644 --- a/app/controllers/map_controller.rb +++ b/app/controllers/map_controller.rb @@ -1,7 +1,6 @@ class MapController < BaseController layout 'darkswarm' before_filter :load_active_distributors - before_filter :load_visible_enterprises def index end diff --git a/app/controllers/producers_controller.rb b/app/controllers/producers_controller.rb index d7d665de90..b101a95b7f 100644 --- a/app/controllers/producers_controller.rb +++ b/app/controllers/producers_controller.rb @@ -1,7 +1,6 @@ class ProducersController < BaseController layout 'darkswarm' before_filter :load_active_distributors - before_filter :load_visible_enterprises def index end diff --git a/app/views/json/_enterprises.rabl b/app/views/json/_enterprises.rabl index 9b4988b83f..0f01743bfc 100644 --- a/app/views/json/_enterprises.rabl +++ b/app/views/json/_enterprises.rabl @@ -1,3 +1,6 @@ +# TODO: This should be moved into the controller +# RABL is tricky to pass variables into: so we do this as a workaround for now +# I noticed some vague comments on Rabl github about this, but haven't looked into collection Enterprise.visible extends 'json/partials/enterprise' extends 'json/partials/producer' diff --git a/app/views/json/_enterprises_for_map.rabl b/app/views/json/_enterprises_for_map.rabl deleted file mode 100644 index 9ce100ab65..0000000000 --- a/app/views/json/_enterprises_for_map.rabl +++ /dev/null @@ -1,2 +0,0 @@ -collection @enterprises -extends "json/partials/enterprise" diff --git a/app/views/json/partials/_enterprise.rabl b/app/views/json/partials/_enterprise.rabl index 86cd9f08aa..20c7ff2332 100644 --- a/app/views/json/partials/_enterprise.rabl +++ b/app/views/json/partials/_enterprise.rabl @@ -1,12 +1,4 @@ -attributes :name, :id, :description, :latitude, :longitude, :long_description, :website, :instagram, :linkedin, :twitter, :facebook - -node :enterprise_type do |enterprise| - if enterprise.is_primary_producer? - "producer" - elsif enterprise.is_distributor? - "hub" - end -end +attributes :name, :id, :description, :latitude, :longitude, :long_description, :website, :instagram, :linkedin, :twitter, :facebook, :is_primary_producer, :is_distributor node :email do |enterprise| enterprise.email.to_s.reverse diff --git a/app/views/json/partials/_hub.rabl b/app/views/json/partials/_hub.rabl index c1f7879268..1c11b23005 100644 --- a/app/views/json/partials/_hub.rabl +++ b/app/views/json/partials/_hub.rabl @@ -8,10 +8,10 @@ node :path do |enterprise| shop_enterprise_path(enterprise) end node :pickup do |hub| - not hub.shipping_methods.where(:require_ship_address => false).empty? + hub.shipping_methods.where(:require_ship_address => false).present? end node :delivery do |hub| - not hub.shipping_methods.where(:require_ship_address => true).empty? + hub.shipping_methods.where(:require_ship_address => true).present? end node :active do |hub| @active_distributors.include?(hub) diff --git a/spec/controllers/base_controller_spec.rb b/spec/controllers/base_controller_spec.rb index 85afcbc7ff..e431f14e3f 100644 --- a/spec/controllers/base_controller_spec.rb +++ b/spec/controllers/base_controller_spec.rb @@ -23,9 +23,4 @@ describe BaseController do Enterprise.should_receive(:distributors_with_active_order_cycles) controller.load_active_distributors end - - it "loads visible enterprises" do - Enterprise.should_receive(:visible) - controller.load_visible_enterprises - end end diff --git a/spec/controllers/home_controller_spec.rb b/spec/controllers/home_controller_spec.rb index 54b6611438..babb1c84e6 100644 --- a/spec/controllers/home_controller_spec.rb +++ b/spec/controllers/home_controller_spec.rb @@ -7,7 +7,6 @@ describe HomeController do before do Enterprise.stub(:distributors_with_active_order_cycles).and_return [distributor] - Enterprise.stub(:visible).and_return [distributor] end it "sets active distributors" do @@ -15,11 +14,6 @@ describe HomeController do assigns[:active_distributors].should == [distributor] end - it "loads visible enterprises" do - get :index - assigns[:enterprises].should == [distributor] - end - it "does not show invisible hubs" do get :index response.body.should_not have_content invisible_distributor.name diff --git a/spec/controllers/map_controller_spec.rb b/spec/controllers/map_controller_spec.rb index 455420380d..f3d56853f9 100644 --- a/spec/controllers/map_controller_spec.rb +++ b/spec/controllers/map_controller_spec.rb @@ -1,11 +1,6 @@ require 'spec_helper' describe MapController do - it "loads all visible enterprises" do - Enterprise.should_receive(:visible) - get :index - end - it "loads active distributors" do Enterprise.should_receive(:distributors_with_active_order_cycles) get :index diff --git a/spec/controllers/producers_controller_spec.rb b/spec/controllers/producers_controller_spec.rb index 7b399df209..d5a90a77d3 100644 --- a/spec/controllers/producers_controller_spec.rb +++ b/spec/controllers/producers_controller_spec.rb @@ -12,9 +12,4 @@ describe ProducersController do get :index assigns[:active_distributors].should == [distributor] end - - it "loads visible enterprises" do - get :index - assigns[:enterprises].should == [distributor] - end end diff --git a/spec/javascripts/unit/darkswarm/services/hubs_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/hubs_spec.js.coffee index 9d4513af35..41828242a8 100644 --- a/spec/javascripts/unit/darkswarm/services/hubs_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/services/hubs_spec.js.coffee @@ -6,19 +6,19 @@ describe "Hubs service", -> id: 2 active: false orders_close_at: new Date() - enterprise_type: "hub" + is_distributor: true } { id: 3 active: false orders_close_at: new Date() - enterprise_type: "hub" + is_distributor: true } { id: 1 active: true orders_close_at: new Date() - enterprise_type: "hub" + is_distributor: true } ] diff --git a/spec/javascripts/unit/darkswarm/services/producers_spec.js.coffee b/spec/javascripts/unit/darkswarm/services/producers_spec.js.coffee index 403bf186ba..282e4725de 100644 --- a/spec/javascripts/unit/darkswarm/services/producers_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/services/producers_spec.js.coffee @@ -2,7 +2,7 @@ describe "Producers service", -> Producers = null Enterprises = null enterprises = [ - {enterprise_type: "producer"} + {is_primary_producer: true} ] beforeEach -> From 8905b453334c36239869631a9774c927369bde7a Mon Sep 17 00:00:00 2001 From: Will Marshall Date: Thu, 19 Jun 2014 12:10:05 +1000 Subject: [PATCH 32/32] Fixing a minor regression --- .../darkswarm/controllers/products_controller.js.coffee | 5 ++--- app/assets/javascripts/darkswarm/services/product.js.coffee | 1 + app/views/shop/products/_form.html.haml | 6 ++---- spec/features/consumer/shopping/shopping_spec.rb | 1 - .../controllers/products_controller_spec.js.coffee | 2 +- 5 files changed, 6 insertions(+), 9 deletions(-) diff --git a/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee b/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee index 3fdb58cf8e..3860a2d56e 100644 --- a/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee +++ b/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee @@ -1,12 +1,11 @@ Darkswarm.controller "ProductsCtrl", ($scope, $rootScope, Product, OrderCycle) -> - $scope.products = Product.products - $scope.loading = Product.loading + $scope.Product = Product $scope.limit = 3 $scope.ordering = {order: "name"} $scope.order_cycle = OrderCycle.order_cycle $scope.incrementLimit = -> - if $scope.limit < $scope.products.length + if $scope.limit < $scope.Product.products.length $scope.limit = $scope.limit + 1 $scope.searchKeypress = (e)-> diff --git a/app/assets/javascripts/darkswarm/services/product.js.coffee b/app/assets/javascripts/darkswarm/services/product.js.coffee index 5fae2314a8..21c0921e41 100644 --- a/app/assets/javascripts/darkswarm/services/product.js.coffee +++ b/app/assets/javascripts/darkswarm/services/product.js.coffee @@ -9,6 +9,7 @@ Darkswarm.factory 'Product', ($resource) -> loading: true update: => + @loading = true @products = $resource("/shop/products").query => @loading = false @ diff --git a/app/views/shop/products/_form.html.haml b/app/views/shop/products/_form.html.haml index d948f18f60..724ec7b249 100644 --- a/app/views/shop/products/_form.html.haml +++ b/app/views/shop/products/_form.html.haml @@ -14,7 +14,7 @@ %div{bindonce: true} %product{"ng-controller" => "ProductNodeCtrl", - "ng-repeat" => "product in products | filter:query | orderBy:ordering.order | limitTo: limit track by product.id"} + "ng-repeat" => "product in Product.products | filter:query | orderBy:ordering.order | limitTo: limit track by product.id"} %div = render partial: "shop/products/summary" %div{"bo-if" => "hasVariants"} @@ -22,12 +22,10 @@ .variants.row{"bo-if" => "!hasVariants"} = render partial: "shop/products/master" - %product{"ng-show" => "loading"} + %product{"ng-show" => "Product.loading"} .row.summary .small-12.columns.text-center Loading products - - .row .small-12.columns %input.button.primary.right.add_to_cart{type: :submit, value: "Add to Cart"} diff --git a/spec/features/consumer/shopping/shopping_spec.rb b/spec/features/consumer/shopping/shopping_spec.rb index 304eff7d23..e219e970a2 100644 --- a/spec/features/consumer/shopping/shopping_spec.rb +++ b/spec/features/consumer/shopping/shopping_spec.rb @@ -77,7 +77,6 @@ feature "As a consumer I want to shop with a distributor", js: true do page.should have_content "Next order closing in 2 days" Spree::Order.last.order_cycle.should == oc1 page.should have_content product.name - save_screenshot "/Users/willmarshall/Desktop/shop.png" page.should have_content product.master.display_name page.should have_content product.master.display_as end diff --git a/spec/javascripts/unit/darkswarm/controllers/products_controller_spec.js.coffee b/spec/javascripts/unit/darkswarm/controllers/products_controller_spec.js.coffee index 3a1b5fb399..47ad0ccbd4 100644 --- a/spec/javascripts/unit/darkswarm/controllers/products_controller_spec.js.coffee +++ b/spec/javascripts/unit/darkswarm/controllers/products_controller_spec.js.coffee @@ -18,4 +18,4 @@ describe 'ProductsCtrl', -> ctrl = $controller 'ProductsCtrl', {$scope: scope, Product: Product, OrderCycle: OrderCycle} it 'fetches products from Product', -> - expect(scope.products).toEqual 'testy mctest' + expect(scope.Product.products).toEqual 'testy mctest'