WIP: BOM Refactor, adding for_line_items action to enterprises controller

This commit is contained in:
Rob Harrington
2015-11-04 15:02:29 +11:00
parent 625e0888ea
commit ae7e744644
14 changed files with 79 additions and 64 deletions

View File

@@ -1,9 +1,9 @@
angular.module("admin.enterprises").controller 'enterprisesCtrl', ($scope, Enterprises, Columns) ->
Enterprises.loaded = false
$scope.allEnterprises = Enterprises.index()
angular.module("admin.enterprises").controller 'enterprisesCtrl', ($scope, $q, Enterprises, Columns) ->
requests = []
requests.push ($scope.allEnterprises = Enterprises.index(ams_suffix: "index")).$promise
$scope.loaded = ->
Enterprises.loaded
$q.all(requests).then ->
$scope.loaded = true
$scope.columns = Columns.setColumns
name: { name: "Name", visible: true }

View File

@@ -1,5 +1,5 @@
angular.module("admin.enterprises").factory 'EnterpriseResource', ($resource) ->
$resource('/admin/enterprises/:id.json', {}, {
$resource('/admin/enterprises/:id/:action.json', {}, {
'index':
method: 'GET'
isArray: true

View File

@@ -1,26 +1,21 @@
angular.module("admin.enterprises").factory 'Enterprises', ($q, EnterpriseResource) ->
new class Enterprises
enterprises: []
enterprises_by_id: {}
pristine_by_id: {}
loaded: false
enterprisesByID: {}
pristineByID: {}
index: (params={}, callback=null) ->
EnterpriseResource.index params, (data) =>
for enterprise in data
@enterprises.push enterprise
@pristine_by_id[enterprise.id] = angular.copy(enterprise)
@enterprisesByID[enterprise.id] = enterprise
@pristineByID[enterprise.id] = angular.copy(enterprise)
@loaded = true
(callback || angular.noop)(@enterprises)
@enterprises
(callback || angular.noop)(data)
save: (enterprise) ->
deferred = $q.defer()
enterprise.$update({id: enterprise.permalink})
.then( (data) =>
@pristine_by_id[enterprise.id] = angular.copy(enterprise)
@pristineByID[enterprise.id] = angular.copy(enterprise)
deferred.resolve(data)
).catch (response) ->
deferred.reject(response)
@@ -31,9 +26,9 @@ angular.module("admin.enterprises").factory 'Enterprises', ($q, EnterpriseResour
diff: (enterprise) ->
changed = []
for attr, value of enterprise when not angular.equals(value, @pristine_by_id[enterprise.id][attr])
for attr, value of enterprise when not angular.equals(value, @pristineByID[enterprise.id][attr])
changed.push attr unless attr is "$$hashKey"
changed
resetAttribute: (enterprise, attribute) ->
enterprise[attribute] = @pristine_by_id[enterprise.id][attribute]
enterprise[attribute] = @pristineByID[enterprise.id][attribute]

View File

@@ -25,9 +25,7 @@ module Admin
def index
respond_to do |format|
format.html
format.json do
render json: @collection, each_serializer: Api::Admin::IndexEnterpriseSerializer, spree_current_user: spree_current_user
end
format.json { render_as_json @collection, ams_prefix: params[:ams_prefix], spree_current_user: spree_current_user }
end
end
@@ -35,7 +33,6 @@ module Admin
render layout: "spree/layouts/bare_admin"
end
def update
invoke_callbacks(:update, :before)
if @object.update_attributes(params[object_name])
@@ -44,7 +41,7 @@ module Admin
respond_with(@object) do |format|
format.html { redirect_to location_after_save }
format.js { render :layout => false }
format.json { render json: @object, serializer: Api::Admin::IndexEnterpriseSerializer, spree_current_user: spree_current_user }
format.json { render json: @object, ams_prefix: 'index', spree_current_user: spree_current_user }
end
else
invoke_callbacks(:update, :fails)
@@ -99,9 +96,15 @@ module Admin
def for_order_cycle
respond_to do |format|
format.json do
render json: ActiveModel::ArraySerializer.new( @collection,
each_serializer: Api::Admin::ForOrderCycle::EnterpriseSerializer, spree_current_user: spree_current_user
).to_json
render json: @collection, each_serializer: Api::Admin::ForOrderCycle::EnterpriseSerializer, spree_current_user: spree_current_user
end
end
end
def for_line_items
respond_to do |format|
format.json do
render_as_json @collection, ams_prefix: 'basic', spree_current_user: spree_current_user
end
end
end
@@ -145,10 +148,12 @@ module Admin
editable_enterprises.
order('is_primary_producer ASC, name')
elsif json_request?
OpenFoodNetwork::Permissions.new(spree_current_user).editable_enterprises
OpenFoodNetwork::Permissions.new(spree_current_user).editable_enterprises.ransack(params[:q]).result
else
Enterprise.where("1=0") unless json_request?
Enterprise.where("1=0")
end
when :for_line_items
OpenFoodNetwork::Permissions.new(spree_current_user).visible_enterprises.ransack(params[:q]).result
else
# TODO was ordered with is_distributor DESC as well, not sure why or how we want to sort this now
OpenFoodNetwork::Permissions.new(spree_current_user).
@@ -158,7 +163,7 @@ module Admin
end
def collection_actions
[:index, :for_order_cycle, :bulk_update]
[:index, :for_order_cycle, :for_line_items, :bulk_update]
end
def load_methods_and_fees
@@ -248,5 +253,9 @@ module Admin
main_app.edit_admin_enterprise_path(@enterprise)
end
end
def ams_prefix_whitelist
[:index, :basic]
end
end
end

View File

@@ -12,12 +12,6 @@ module Api
render params[:template] || :bulk_index
end
def accessible
permitted = OpenFoodNetwork::Permissions.new(current_api_user).order_cycle_enterprises
@enterprises = permitted.ransack(params[:q]).result
render params[:template] || :bulk_index
end
def create
authorize! :create, Enterprise

View File

@@ -77,7 +77,7 @@ Spree::Admin::BaseController.class_eval do
end
def serializer(ams_prefix)
if ams_prefix_whitelist.include?(ams_prefix) || ams_prefix.nil?
if ams_prefix.nil? || ams_prefix_whitelist.include?(ams_prefix.to_sym)
prefix = ams_prefix.andand.classify || ""
name = controller_name.classify
"Api::Admin::#{prefix}#{name}Serializer".constantize

View File

@@ -148,7 +148,7 @@ class AbilityDecorator
order.distributor.nil? || user.enterprises.include?(order.distributor)
end
can [:admin, :bulk_management, :managed], Spree::Order if user.admin? || user.enterprises.any?(&:is_distributor)
can [:admin, :create], Spree::LineItem
can [:admin , :for_line_items], Enterprise
can [:destroy], Spree::LineItem do |item|
user.admin? || user.enterprises.include?(order.distributor) || user == order.order_cycle.manager
end

View File

@@ -1,5 +1,5 @@
%div{ ng: { app: 'admin.enterprises', controller: 'enterprisesCtrl' } }
.row{ 'ng-hide' => '!loaded()' }
.row{ 'ng-hide' => '!loaded' }
.controls{ :class => "sixteen columns alpha", :style => "margin-bottom: 15px;" }
.four.columns.alpha
%input{ :class => "fullwidth", :type => "text", :id => 'quick_search', 'ng-model' => 'quickSearch', :placeholder => 'Search By Name' }
@@ -19,15 +19,15 @@
%div.menu_item{ :class => "three columns alpha", 'ng-repeat' => "column in columns", 'ofn-toggle-column' => true }
%span{ :class => 'one column alpha', :style => 'text-align: center'} {{ column.visible && "✓" || !column.visible && " " }}
%span{ :class => 'two columns omega' } {{column.name }}
.row{ 'ng-if' => '!loaded()' }
.row{ 'ng-if' => '!loaded' }
.sixteen.columns.alpha#loading
%img.spinner{ src: "/assets/spinning-circles.svg" }
%h1 LOADING ENTERPRISES
.row{ :class => "sixteen columns alpha", 'ng-show' => 'loaded() && filteredEnterprises.length == 0'}
.row{ :class => "sixteen columns alpha", 'ng-show' => 'loaded && filteredEnterprises.length == 0'}
%h1#no_results No enterprises found.
.row{ ng: { show: "loaded() && filteredEnterprises.length > 0" }, bindonce: true }
.row{ ng: { show: "loaded && filteredEnterprises.length > 0" }, bindonce: true }
%table.index#enterprises
%col.name{ width: "28%", ng: { show: 'columns.name.visible' } }
%col.producer{ width: "18%", ng: { show: 'columns.producer.visible' }}