diff --git a/app/assets/javascripts/admin/enterprises/controllers/permalink_controller.js.coffee b/app/assets/javascripts/admin/enterprises/controllers/permalink_controller.js.coffee new file mode 100644 index 0000000000..68d4424ece --- /dev/null +++ b/app/assets/javascripts/admin/enterprises/controllers/permalink_controller.js.coffee @@ -0,0 +1,17 @@ +angular.module("admin.enterprises") + .controller "permalinkCtrl", ($scope, Enterprise, PermalinkChecker) -> + $scope.pristinePermalink = Enterprise.permalink + $scope.availablility = "" + $scope.checking = false + + $scope.$watch "Enterprise.permalink", (newValue, oldValue) -> + if newValue == $scope.pristinePermalink + $scope.availability = "" + else + $scope.checking = true + PermalinkChecker.check(newValue).then (data) -> + $scope.availability = 'Available' + $scope.checking = false + , (data) -> + $scope.availability = 'Unavailable' + $scope.checking = false \ No newline at end of file diff --git a/app/assets/javascripts/admin/enterprises/services/permalink_checker.js.coffee b/app/assets/javascripts/admin/enterprises/services/permalink_checker.js.coffee new file mode 100644 index 0000000000..b67856b91e --- /dev/null +++ b/app/assets/javascripts/admin/enterprises/services/permalink_checker.js.coffee @@ -0,0 +1,11 @@ +angular.module("admin.enterprises").factory 'PermalinkChecker', ($q, $http) -> + new class PermalinkChecker + check: (permalink) -> + deferred = $q.defer() + $http.get("/enterprises/check_permalink?permalink=#{permalink}", { headers: { 'Accept': 'application/javascript' } } ) + .success( (data) -> + deferred.resolve data + ).error (data) -> + deferred.reject(data) + + deferred.promise diff --git a/app/assets/stylesheets/admin/enterprise_console.css.scss b/app/assets/stylesheets/admin/enterprise_console.css.scss new file mode 100644 index 0000000000..afca3d9261 --- /dev/null +++ b/app/assets/stylesheets/admin/enterprise_console.css.scss @@ -0,0 +1,14 @@ +span.unavailable, span.available { + font-weight: bold; + i { + font-size: 150%; + } +} + +span.available { + color: #9fc820; +} + +span.unavailable { + color: #DA5354; +} \ No newline at end of file diff --git a/app/controllers/enterprises_controller.rb b/app/controllers/enterprises_controller.rb index 4414dd4ece..8b42ee3743 100644 --- a/app/controllers/enterprises_controller.rb +++ b/app/controllers/enterprises_controller.rb @@ -75,11 +75,11 @@ class EnterprisesController < BaseController path = Rails.application.routes.recognize_path( "/#{ params[:permalink].to_s }" ) if path && path[:controller] == "cms_content" respond_to do |format| - format.js { render nothing: true, status: 200 } + format.js { render text: params[:permalink], status: 200 } end else respond_to do |format| - format.js { render nothing: true, status: 409 } + format.js { render text: params[:permalink], status: 409 } end end end diff --git a/app/serializers/api/admin/enterprise_serializer.rb b/app/serializers/api/admin/enterprise_serializer.rb index 14fdd5c8b6..d8b3a54bc2 100644 --- a/app/serializers/api/admin/enterprise_serializer.rb +++ b/app/serializers/api/admin/enterprise_serializer.rb @@ -1,5 +1,5 @@ class Api::Admin::EnterpriseSerializer < ActiveModel::Serializer attributes :name, :id, :is_primary_producer, :is_distributor, :sells, :category, :payment_method_ids, :shipping_method_ids - attributes :producer_profile_only, :email, :long_description + attributes :producer_profile_only, :email, :long_description, :permalink attributes :preferred_shopfront_message, :preferred_shopfront_closed_message, :preferred_shopfront_taxon_order end \ No newline at end of file diff --git a/app/views/admin/enterprises/form/_primary_details.html.haml b/app/views/admin/enterprises/form/_primary_details.html.haml index e42e7038e2..243f6076fb 100644 --- a/app/views/admin/enterprises/form/_primary_details.html.haml +++ b/app/views/admin/enterprises/form/_primary_details.html.haml @@ -66,10 +66,24 @@ = f.radio_button :visible, false   = f.label :visible, "Not Visible", :value => "false" -.row{ ng: { show: "Enterprise.sells == 'own' || Enterprise.sells == 'any'" } } - .three.columns.alpha - %label Link to shop front - .with-tip{'data-powertip' => "A direct link to your shopfront on the Open Food Network."} - %a What's this? - .eight.columns.omega - = main_app.enterprise_shop_url(@enterprise) \ No newline at end of file +.permalink{ ng: { controller: "permalinkCtrl" } } + .row{ ng: { show: "Enterprise.sells == 'own' || Enterprise.sells == 'any'" } } + .three.columns.alpha + = f.label :permalink, 'Permalink (no spaces)' + .with-tip{'data-powertip' => "This permalink is used to create the url to your shop: #{spree.root_url}your-shop-name/shop"} + %a What's this? + .six.columns + = f.text_field :permalink, { 'ng-model' => "Enterprise.permalink", placeholder: "eg. your-shop-name", 'ng-model-options' => "{ updateOn: 'default blur', debounce: {'default': 300, 'blur': 0} }" } + .two.columns.omega + %img.spinner{ src: "/assets/loading.gif", width: "30px", ng: { show: "checking" } } + %span{ ng: { class: 'availability.toLowerCase()', hide: "checking" } } + {{ availability }} + %i{ ng: { class: "{'icon-ok-sign': availability == 'Available', 'icon-remove-sign': availability == 'Unavailable'}" } } + .row{ ng: { show: "Enterprise.sells == 'own' || Enterprise.sells == 'any'" } } + .three.columns.alpha + %label Link to shop front + .with-tip{'data-powertip' => "A direct link to your shopfront on the Open Food Network."} + %a What's this? + .eight.columns.omega + = surround spree.root_url, "/shop" do + {{Enterprise.permalink}} \ No newline at end of file diff --git a/spec/javascripts/unit/admin/enterprises/controllers/permalink_controller_spec.js.coffee b/spec/javascripts/unit/admin/enterprises/controllers/permalink_controller_spec.js.coffee new file mode 100644 index 0000000000..d95d36327d --- /dev/null +++ b/spec/javascripts/unit/admin/enterprises/controllers/permalink_controller_spec.js.coffee @@ -0,0 +1,47 @@ +describe "permalinkCtrl", -> + ctrl = null + $scope = null + Enterprise = null + PermalinkChecker = null + $httpBackend = null + $q = null + + + beforeEach -> + module('admin.enterprises') + Enterprise = { + permalink: "something" + } + + inject ($rootScope, $controller, _$q_, _PermalinkChecker_) -> + $scope = $rootScope + $q = _$q_ + PermalinkChecker = _PermalinkChecker_ + $ctrl = $controller 'permalinkCtrl', {$scope: $scope, Enterprise: Enterprise, PermalinkChecker: PermalinkChecker} + + describe "checking permalink", -> + deferred = null + beforeEach -> + # Build a deferred object + deferred = $q.defer() + + it "sends a request to PermalinkChecker when permalink is changed", -> + deferred.resolve("") + promise = deferred.promise + spyOn(PermalinkChecker, "check").andReturn promise + $scope.$apply Enterprise.permalink = "somethingelse" # Change the permalink + expect(PermalinkChecker.check).toHaveBeenCalled() + + it "sets available to 'Available' when PermalinkChecker resolves", -> + deferred.resolve("") + promise = deferred.promise + spyOn(PermalinkChecker, "check").andReturn promise + $scope.$apply Enterprise.permalink = "somethingelse" # Change the permalink + expect($scope.availability).toEqual "Available" + + it "sets available to 'Unavailable' when PermalinkChecker rejects", -> + deferred.reject() + promise = deferred.promise + spyOn(PermalinkChecker, "check").andReturn promise + $scope.$apply Enterprise.permalink = "somethingelse" # Change the permalink + expect($scope.availability).toEqual "Unavailable" diff --git a/spec/javascripts/unit/admin/enterprises/services/permalink_checker_spec.js.coffee b/spec/javascripts/unit/admin/enterprises/services/permalink_checker_spec.js.coffee new file mode 100644 index 0000000000..6eef847858 --- /dev/null +++ b/spec/javascripts/unit/admin/enterprises/services/permalink_checker_spec.js.coffee @@ -0,0 +1,14 @@ +describe "Permalink Checker service", -> + PermalinkChecker = null + $httpBackend = null + beforeEach -> + module 'admin.enterprises' + + inject ($injector, _$httpBackend_) -> + $httpBackend = _$httpBackend_ + PermalinkChecker = $injector.get("PermalinkChecker") + + it "sends an http request to check the permalink", -> + permalink = "this-is-a-permalink" + $httpBackend.expectGET "/enterprises/check_permalink?permalink=#{permalink}" + PermalinkChecker.check(permalink) \ No newline at end of file