From 5c09ebf138ba28a0967d1c840752036caf216c63 Mon Sep 17 00:00:00 2001 From: Rob Harrington Date: Wed, 11 Feb 2015 14:03:04 +1100 Subject: [PATCH] Adding manager managment to enterprise edit form --- .../enterprise_controller.js.coffee | 16 +++++++ ...mplete.js.coffee => user_select.js.coffee} | 9 +++- .../api/admin/enterprise_serializer.rb | 6 ++- .../admin/enterprises/_new_form.html.haml | 4 +- .../admin/enterprises/form/_users.html.haml | 29 ++++++++++- .../enterprise_controller_spec.js.coffee | 48 +++++++++++++++++++ 6 files changed, 106 insertions(+), 6 deletions(-) rename app/assets/javascripts/admin/users/directives/{user_autocomplete.js.coffee => user_select.js.coffee} (64%) diff --git a/app/assets/javascripts/admin/enterprises/controllers/enterprise_controller.js.coffee b/app/assets/javascripts/admin/enterprises/controllers/enterprise_controller.js.coffee index c96c0cc2a6..03cd7d4943 100644 --- a/app/assets/javascripts/admin/enterprises/controllers/enterprise_controller.js.coffee +++ b/app/assets/javascripts/admin/enterprises/controllers/enterprise_controller.js.coffee @@ -6,6 +6,7 @@ angular.module("admin.enterprises") $scope.navClear = NavigationCheck.clear $scope.pristineEmail = $scope.Enterprise.email $scope.menu = SideMenu + $scope.newManager = { id: '', email: 'Add a manager...' } # Provide a callback for generating warning messages displayed before leaving the page. This is passed in # from a directive "nav-check" in the page - if we pass it here it will be called in the test suite, @@ -16,3 +17,18 @@ angular.module("admin.enterprises") # Register the NavigationCheck callback NavigationCheck.register(enterpriseNavCallback) + + $scope.removeManager = (manager) -> + if manager.id? + for i, user of $scope.Enterprise.users when user.id == manager.id + $scope.Enterprise.users.splice i, 1 + + $scope.addManager = (manager) -> + if manager.id? and manager.email? + manager = + id: manager.id + email: manager.email + if (user for user in $scope.Enterprise.users when user.id == manager.id).length == 0 + $scope.Enterprise.users.push manager + else + alert "#{manager.email} is already a manager!" diff --git a/app/assets/javascripts/admin/users/directives/user_autocomplete.js.coffee b/app/assets/javascripts/admin/users/directives/user_select.js.coffee similarity index 64% rename from app/assets/javascripts/admin/users/directives/user_autocomplete.js.coffee rename to app/assets/javascripts/admin/users/directives/user_select.js.coffee index 2c2f2a12fd..94df1894d9 100644 --- a/app/assets/javascripts/admin/users/directives/user_autocomplete.js.coffee +++ b/app/assets/javascripts/admin/users/directives/user_select.js.coffee @@ -1,10 +1,13 @@ -angular.module("admin.users").directive "ofnUserAutocomplete", ($http) -> +angular.module("admin.users").directive "userSelect", -> + scope: + user: '&userSelect' + model: '=ngModel' link: (scope,element,attrs) -> setTimeout -> element.select2 multiple: false initSelection: (element, callback) -> - callback { id: element.val(), email: attrs.email } + callback {id: scope.user().id, email: scope.user().email} ajax: url: '/admin/search/known_users' datatype: 'json' @@ -15,4 +18,6 @@ angular.module("admin.users").directive "ofnUserAutocomplete", ($http) -> formatResult: (user) -> user.email formatSelection: (user) -> + scope.$apply -> + scope.model = user if scope.model? user.email diff --git a/app/serializers/api/admin/enterprise_serializer.rb b/app/serializers/api/admin/enterprise_serializer.rb index d8b3a54bc2..c686aa9f69 100644 --- a/app/serializers/api/admin/enterprise_serializer.rb +++ b/app/serializers/api/admin/enterprise_serializer.rb @@ -2,4 +2,8 @@ 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, :permalink attributes :preferred_shopfront_message, :preferred_shopfront_closed_message, :preferred_shopfront_taxon_order -end \ No newline at end of file + attributes :owner, :users + + has_one :owner, serializer: Api::Admin::UserSerializer + has_many :users, serializer: Api::Admin::UserSerializer +end diff --git a/app/views/admin/enterprises/_new_form.html.haml b/app/views/admin/enterprises/_new_form.html.haml index bb43a421fb..a76c8ec31c 100644 --- a/app/views/admin/enterprises/_new_form.html.haml +++ b/app/views/admin/enterprises/_new_form.html.haml @@ -12,7 +12,7 @@ %a What's this? .nine.columns.omega - owner_email = @enterprise.andand.owner.andand.email || "" - = f.hidden_field :owner_id, class: "select2 fullwidth", 'ofn-user-autocomplete' => true, email: owner_email + = f.hidden_field :owner_id, class: "select2 fullwidth", 'user-select' => 'Enterprise.owner' .row .three.columns.alpha %label Primary Producer? @@ -102,4 +102,4 @@   .row .twelve.columns.alpha - = render partial: "spree/admin/shared/new_resource_links" \ No newline at end of file + = render partial: "spree/admin/shared/new_resource_links" diff --git a/app/views/admin/enterprises/form/_users.html.haml b/app/views/admin/enterprises/form/_users.html.haml index 92ad0c1a90..d13723795d 100644 --- a/app/views/admin/enterprises/form/_users.html.haml +++ b/app/views/admin/enterprises/form/_users.html.haml @@ -10,6 +10,33 @@ %a What's this? .eight.columns.omega - if full_permissions - = f.hidden_field :owner_id, class: "select2 fullwidth", 'ofn-user-autocomplete' => true, email: owner_email + = f.hidden_field :owner_id, class: "select2 fullwidth", 'user-select' => 'Enterprise.owner' - else = owner_email + +.row + .three.columns.alpha + =f.label :user_ids, 'Managers' + - if full_permissions + %span.required * + .with-tip{'data-powertip' => "The other users with permission to manage this enterprise."} + %a What's this? + .eight.columns.omega + - if full_permissions + %table + %tr + %td + - # Ignore this input in the submit + = hidden_field_tag :ignored, :new_manager, class: "select2 fullwidth", 'user-select' => 'newManager', 'ng-model' => 'newManager' + %td.actions + %a{ 'ng-click' => 'addManager(newManager)', :class => "icon-plus no-text" } + %tr.animate-repeat{ ng: { repeat: 'manager in Enterprise.users' }} + %td + = hidden_field_tag "enterprise[user_ids][]", nil, multiple: true, 'ng-value' => 'manager.id' + {{ manager.email }} + %td.actions + %a{ 'ng-click' => 'removeManager(manager)', :class => "icon-trash no-text" } + - else + - @enterprise.users.each do |manager| + = manager.email + %br diff --git a/spec/javascripts/unit/admin/enterprises/controllers/enterprise_controller_spec.js.coffee b/spec/javascripts/unit/admin/enterprises/controllers/enterprise_controller_spec.js.coffee index 19fc22cb65..71e4c37aee 100644 --- a/spec/javascripts/unit/admin/enterprises/controllers/enterprise_controller_spec.js.coffee +++ b/spec/javascripts/unit/admin/enterprises/controllers/enterprise_controller_spec.js.coffee @@ -29,3 +29,51 @@ describe "enterpriseCtrl", -> it "stores shipping methods", -> expect(scope.ShippingMethods).toBe ShippingMethods.shippingMethods + + describe "adding managers", -> + u1 = u2 = u3 = null + beforeEach -> + u1 = { id: 1, email: 'name1@email.com' } + u2 = { id: 2, email: 'name2@email.com' } + u3 = { id: 3, email: 'name3@email.com' } + Enterprise.enterprise.users = [u1, u2 ,u3] + + it "adds a user to the list", -> + u4 = { id: 4, email: "name4@email.com" } + scope.addManager u4 + expect(Enterprise.enterprise.users).toContain u4 + + it "ignores object without an id", -> + u4 = { not_id: 4, email: "name4@email.com" } + scope.addManager u4 + expect(Enterprise.enterprise.users).not.toContain u4 + + it "it ignores objects without an email", -> + u4 = { id: 4, not_email: "name4@email.com" } + scope.addManager u4 + expect(Enterprise.enterprise.users).not.toContain u4 + + it "ignores objects that are already in the list, and alerts the user", -> + spyOn(window, "alert").andCallThrough() + u4 = { id: 3, email: "email-doesn't-matter.com" } + scope.addManager u4 + expect(Enterprise.enterprise.users).not.toContain u4 + expect(window.alert).toHaveBeenCalledWith "email-doesn't-matter.com is already a manager!" + + + describe "removing managers", -> + u1 = u2 = u3 = null + beforeEach -> + u1 = { id: 1, email: 'name1@email.com' } + u2 = { id: 2, email: 'name2@email.com' } + u3 = { id: 3, email: 'name3@email.com' } + Enterprise.enterprise.users = [u1, u2 ,u3] + + + it "removes a user with the given id", -> + scope.removeManager {id: 2} + expect(Enterprise.enterprise.users).not.toContain u2 + + it "does nothing when given object has no id attribute", -> + scope.removeManager {not_id: 2} + expect(Enterprise.enterprise.users).toEqual [u1,u2,u3]