diff --git a/app/assets/javascripts/darkswarm/all.js.coffee b/app/assets/javascripts/darkswarm/all.js.coffee index 4727f7282a..a19bd1294f 100644 --- a/app/assets/javascripts/darkswarm/all.js.coffee +++ b/app/assets/javascripts/darkswarm/all.js.coffee @@ -8,6 +8,7 @@ #= require angular-sanitize #= require angular-resource #= require lodash.underscore.js +#= require angular-scroll.min.js #= require angular-google-maps.min.js #= require ../shared/mm-foundation-tpls-0.2.0-SNAPSHOT #= require ../shared/bindonce.min.js diff --git a/app/assets/javascripts/darkswarm/darkswarm.js.coffee b/app/assets/javascripts/darkswarm/darkswarm.js.coffee index 2f07a327cb..b04487b330 100644 --- a/app/assets/javascripts/darkswarm/darkswarm.js.coffee +++ b/app/assets/javascripts/darkswarm/darkswarm.js.coffee @@ -7,6 +7,7 @@ window.Darkswarm = angular.module("Darkswarm", ["ngResource", 'templates', 'ngSanitize', 'google-maps', + 'duScroll', 'backstretch']).config ($httpProvider, $tooltipProvider, $locationProvider, $anchorScrollProvider) -> $httpProvider.defaults.headers.post['X-CSRF-Token'] = $('meta[name="csrf-token"]').attr('content') $httpProvider.defaults.headers.put['X-CSRF-Token'] = $('meta[name="csrf-token"]').attr('content') diff --git a/app/assets/javascripts/darkswarm/directives/scroll_after_load.js.coffee b/app/assets/javascripts/darkswarm/directives/scroll_after_load.js.coffee new file mode 100644 index 0000000000..b8f83d3b9f --- /dev/null +++ b/app/assets/javascripts/darkswarm/directives/scroll_after_load.js.coffee @@ -0,0 +1,8 @@ +Darkswarm.directive 'scrollAfterLoad', ($timeout, $location, $document)-> + restrict: "A" + link: (scope, element, attr) -> + if scope.$last is true + $(window).load -> + $timeout -> + $document.scrollTo $("##{$location.hash()}"), 100, 200, (x)-> + x * (2 - x) diff --git a/app/views/json/_producer.rabl b/app/views/json/_producer.rabl index 1f4a99cdfc..5c76befec1 100644 --- a/app/views/json/_producer.rabl +++ b/app/views/json/_producer.rabl @@ -1,5 +1,16 @@ attributes :id, :name, :description, :long_description, :website, :instagram, :facebook, :linkedin, :twitter node :promo_image do |producer| - producer.promo_image.url + producer.promo_image(:large) +end +node :logo do |producer| + producer.logo(:medium) +end + +node :path do |producer| + producer_path(producer) +end + +node :hash do |producer| + producer.to_param end diff --git a/app/views/modals/_producer.html.haml b/app/views/modals/_producer.html.haml index e9808b09d7..51dc79ed72 100644 --- a/app/views/modals/_producer.html.haml +++ b/app/views/modals/_producer.html.haml @@ -9,41 +9,35 @@ .row .small-12.large-6.columns %p{"ng-bind-html" => "producer.long_description"} - .small-12.large-6.columns + .small-8.large-4.columns + %a{"ng-href" => '/producers##{{producer.hash}}'} + Find my products %img.producer-logo{"ng-src" => "{{producer.logo}}", "ng-if" => "producer.logo"} - %h5 Stay in touch with {{ producer.name }} - + .small-4.large-2.columns %ul.small-block-grid-1{bindonce: true} - %li{"ng-if" => "producer.website"} %a{"ng-href" => "http://{{producer.website | stripUrl}}", target: "_blank" } %i.ofn-i_049-web - {{ producer.website | stripUrl }} %li{"ng-if" => "producer.email"} %a{"ng-href" => "mailto:{{producer.email | stripUrl}}", target: "_blank" } %i.ofn-i_050-mail-circle - {{ producer.email | stripUrl }} %li{"ng-if" => "producer.twitter"} %a{"ng-href" => "http://twitter.com/{{producer.twitter}}", target: "_blank"} %i.ofn-i_041-twitter - {{ producer.twitter }} %li{"ng-if" => "producer.facebook"} %a{"ng-href" => "http://{{producer.facebook | stripUrl}}", target: "_blank"} %i.ofn-i_044-facebook - {{ producer.facebook | stripUrl }} %li{"ng-if" => "producer.linkedin"} %a{"ng-href" => "http://{{producer.linkedin | stripUrl}}", target: "_blank"} %i.ofn-i_042-linkedin - {{ producer.linkedin | stripUrl }} %li{"ng-if" => "producer.instagram"} %a{"ng-href" => "http://instagram.com/{{producer.instagram}}", target: "_blank"} %i.ofn-i_043-instagram - {{ producer.instagram }} %a.close-reveal-modal{"ng-click" => "$close()"} %i.ofn-i_009-close diff --git a/app/views/producers/index.haml b/app/views/producers/index.haml index a5b1601ce3..7c4b6a5b62 100644 --- a/app/views/producers/index.haml +++ b/app/views/producers/index.haml @@ -26,6 +26,7 @@ .small-12.columns .active_table %producer.active_table_node.row{id: "{{producer.path}}", + "scroll-after-load" => true, "ng-repeat" => "producer in filteredProducers = (Producers.producers | filterProducers:query)", "ng-controller" => "ProducerNodeCtrl", "ng-class" => "{'closed' : !open(), 'open' : open(), 'inactive' : !producer.active}", diff --git a/app/views/shop/products/_summary.html.haml b/app/views/shop/products/_summary.html.haml index 144a41f640..c48a40fde8 100644 --- a/app/views/shop/products/_summary.html.haml +++ b/app/views/shop/products/_summary.html.haml @@ -3,7 +3,7 @@ %img{"bo-src" => "product.master.images[0].small_url"} .small-4.columns.summary-header - %object.taxon{"data" => "{{taxon.icon}}", type: "image/svg+xml", + %object.taxon{"data" => "{{primary_taxon.icon}}", type: "image/svg+xml", "ng-click" => "ordering.order = 'primary_taxon.name'"} {{taxon.name}} = render partial: "modals/product" diff --git a/vendor/assets/javascripts/angular-scroll.min.js b/vendor/assets/javascripts/angular-scroll.min.js new file mode 100644 index 0000000000..d979dfe0ee --- /dev/null +++ b/vendor/assets/javascripts/angular-scroll.min.js @@ -0,0 +1 @@ +var duScrollDefaultEasing=function(e){return.5>e?Math.pow(2*e,2)/2:1-Math.pow(2*(1-e),2)/2};angular.module("duScroll",["duScroll.scrollspy","duScroll.requestAnimation","duScroll.smoothScroll","duScroll.scrollContainer","duScroll.scrollHelpers"]).value("duScrollDuration",350).value("duScrollGreedy",!1).value("duScrollEasing",duScrollDefaultEasing),angular.module("duScroll.scrollHelpers",[]).run(["$window","$q","cancelAnimation","requestAnimation","duScrollEasing",function(e,t,n,r,o){var l=angular.element.prototype;this.$get=function(){return l};var i=function(e){return"undefined"!=typeof HTMLDocument&&e instanceof HTMLDocument||e.nodeType&&e.nodeType===e.DOCUMENT_NODE},u=function(e){return"undefined"!=typeof HTMLElement&&e instanceof HTMLElement||e.nodeType&&e.nodeType===e.ELEMENT_NODE},c=function(e){return u(e)||i(e)?e:e[0]};l.scrollTo=function(t,n,r){var o;if(angular.isElement(t)?o=this.scrollToElement:r&&(o=this.scrollToAnimated),o)return o.apply(this,arguments);var l=c(this);return i(l)?e.scrollTo(t,n):(l.scrollLeft=t,void(l.scrollTop=n))};var a,s;l.scrollToAnimated=function(e,l,i,u){i&&!u&&(u=o);var c=this.scrollLeft(),d=this.scrollTop(),f=Math.round(e-c),p=Math.round(l-d),m=null;a&&(n(a),s.reject());var g=this;if(s=t.defer(),!f&&!p)return s.resolve(),s.promise;var v=function(e){null===m&&(m=e);var t=e-m,n=t>=i?1:u(t/i);g.scrollTo(c+Math.ceil(f*n),d+Math.ceil(p*n)),1>n?a=r(v):(a=null,s.resolve())};return g.scrollTo(c,d),a=r(v),s.promise},l.scrollToElement=function(e,t,n,r){var o=c(this),l=this.scrollTop()+c(e).getBoundingClientRect().top-t;return u(o)&&(l-=o.getBoundingClientRect().top),this.scrollTo(0,l,n,r)};var d={scrollLeft:function(t,n,r){if(angular.isNumber(t))return this.scrollTo(t,this.scrollTop(),n,r);var o=c(this);return i(o)?e.scrollX||document.documentElement.scrollLeft||document.body.scrollLeft:o.scrollLeft},scrollTop:function(t,n,r){if(angular.isNumber(t))return this.scrollTo(this.scrollTop(),t,n,r);var o=c(this);return i(o)?e.scrollY||document.documentElement.scrollTop||document.body.scrollTop:o.scrollTop}},f=function(e,t){return function(n,r){return r?t.apply(this,arguments):e.apply(this,arguments)}};for(var p in d)l[p]=l[p]?f(l[p],d[p]):d[p]}]),angular.module("duScroll.polyfill",[]).factory("polyfill",["$window",function(e){var t=["webkit","moz","o","ms"];return function(n,r){if(e[n])return e[n];for(var o,l=n.substr(0,1).toUpperCase()+n.substr(1),i=0;i