mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-27 21:06:49 +00:00
171 lines
6.6 KiB
CoffeeScript
171 lines
6.6 KiB
CoffeeScript
orderManagementModule = angular.module("ofn.bulk_order_management", ["ofn.shared_services"])
|
|
|
|
orderManagementModule.config [
|
|
"$httpProvider"
|
|
(provider) ->
|
|
provider.defaults.headers.common["X-CSRF-Token"] = $("meta[name=csrf-token]").attr("content")
|
|
]
|
|
|
|
orderManagementModule.value "blankEnterprise", ->
|
|
{ id: "", name: "All" }
|
|
|
|
orderManagementModule.directive "ofnLineItemUpdAttr", [
|
|
"switchClass", "pendingChanges"
|
|
(switchClass, pendingChanges) ->
|
|
require: "ngModel"
|
|
link: (scope, element, attrs, ngModel) ->
|
|
attrName = attrs.ofnLineItemUpdAttr
|
|
element.dbValue = scope.$eval(attrs.ngModel)
|
|
scope.$watch ->
|
|
scope.$eval(attrs.ngModel)
|
|
, (value) ->
|
|
if ngModel.$dirty
|
|
if value == element.dbValue
|
|
pendingChanges.remove(scope.line_item.id, attrName)
|
|
switchClass( element, "", ["update-pending", "update-error", "update-success"], false )
|
|
else
|
|
changeObj =
|
|
lineItem: scope.line_item
|
|
element: element
|
|
attrName: attrName
|
|
url: "/api/orders/#{scope.line_item.order.number}/line_items/#{scope.line_item.id}?line_item[#{attrName}]=#{value}"
|
|
pendingChanges.add(scope.line_item.id, attrName, changeObj)
|
|
switchClass( element, "update-pending", ["update-error", "update-success"], false )
|
|
]
|
|
|
|
orderManagementModule.factory "pendingChanges",[
|
|
"dataSubmitter"
|
|
(dataSubmitter) ->
|
|
pendingChanges: {}
|
|
|
|
add: (id, attrName, changeObj) ->
|
|
this.pendingChanges["#{id}"] = {} unless this.pendingChanges.hasOwnProperty("#{id}")
|
|
this.pendingChanges["#{id}"]["#{attrName}"] = changeObj
|
|
|
|
remove: (id, attrName) ->
|
|
if this.pendingChanges.hasOwnProperty("#{id}")
|
|
delete this.pendingChanges["#{id}"]["#{attrName}"]
|
|
delete this.pendingChanges["#{id}"] if this.changeCount( this.pendingChanges["#{id}"] ) < 1
|
|
|
|
submitAll: ->
|
|
for id,lineItem of this.pendingChanges
|
|
for attrName,changeObj of lineItem
|
|
this.submit id, attrName, changeObj
|
|
|
|
submit: (id, attrName, change) ->
|
|
factory = this
|
|
dataSubmitter(change).then (data) ->
|
|
factory.remove id, attrName
|
|
change.element.dbValue = data["#{attrName}"]
|
|
|
|
changeCount: (lineItem) ->
|
|
Object.keys(lineItem).length
|
|
]
|
|
|
|
|
|
orderManagementModule.controller "AdminOrderMgmtCtrl", [
|
|
"$scope", "$http", "dataFetcher", "blankEnterprise", "pendingChanges"
|
|
($scope, $http, dataFetcher, blankEnterprise, pendingChanges) ->
|
|
|
|
$scope.lineItems = []
|
|
$scope.confirmDelete = true
|
|
$scope.pendingChanges = pendingChanges
|
|
|
|
$scope.initialise = (spree_api_key) ->
|
|
authorise_api_reponse = ""
|
|
dataFetcher("/api/users/authorise_api?token=" + spree_api_key).then (data) ->
|
|
authorise_api_reponse = data
|
|
$scope.spree_api_key_ok = data.hasOwnProperty("success") and data["success"] == "Use of API Authorised"
|
|
if $scope.spree_api_key_ok
|
|
$http.defaults.headers.common["X-Spree-Token"] = spree_api_key
|
|
dataFetcher("/api/enterprises/managed?template=bulk_index&q[is_primary_producer_eq]=true").then (data) ->
|
|
$scope.suppliers = data
|
|
$scope.suppliers.unshift blankEnterprise()
|
|
$scope.supplierFilter = $scope.suppliers[0]
|
|
dataFetcher("/api/enterprises/managed?template=bulk_index&q[is_distributor_eq]=true").then (data) ->
|
|
$scope.distributors = data
|
|
$scope.distributors.unshift blankEnterprise()
|
|
$scope.distributorFilter = $scope.distributors[0]
|
|
$scope.fetchOrders()
|
|
else if authorise_api_reponse.hasOwnProperty("error")
|
|
$scope.api_error_msg = authorise_api_reponse("error")
|
|
else
|
|
api_error_msg = "You don't have an API key yet. An attempt was made to generate one, but you are currently not authorised, please contact your site administrator for access."
|
|
|
|
$scope.fetchOrders = ->
|
|
dataFetcher("/api/orders?template=bulk_index").then (data) ->
|
|
$scope.resetOrders data
|
|
|
|
$scope.resetOrders = (data) ->
|
|
$scope.orders = data
|
|
$scope.resetLineItems()
|
|
$scope.matchDistributor order for order in $scope.orders
|
|
|
|
$scope.resetLineItems = ->
|
|
$scope.lineItems = $scope.orders.reduce (lineItems,order) ->
|
|
for i,line_item of order.line_items
|
|
$scope.matchSupplier line_item
|
|
line_item.order = order
|
|
lineItems.concat order.line_items
|
|
, []
|
|
|
|
$scope.matchSupplier = (line_item) ->
|
|
for i, supplier of $scope.suppliers
|
|
if angular.equals(supplier, line_item.supplier)
|
|
line_item.supplier = supplier
|
|
break
|
|
|
|
$scope.matchDistributor = (order) ->
|
|
for i, distributor of $scope.distributors
|
|
if angular.equals(distributor, order.distributor)
|
|
order.distributor = distributor
|
|
break
|
|
|
|
$scope.deleteLineItem = (lineItem) ->
|
|
if ($scope.confirmDelete && confirm("Are you sure?")) || !$scope.confirmDelete
|
|
$http(
|
|
method: "DELETE"
|
|
url: "/api/orders/" + lineItem.order.number + "/line_items/" + lineItem.id
|
|
).success (data) ->
|
|
$scope.lineItems.splice $scope.lineItems.indexOf(lineItem), 1
|
|
lineItem.order.line_items.splice lineItem.order.line_items.indexOf(lineItem), 1
|
|
]
|
|
|
|
orderManagementModule.filter "selectFilter", [
|
|
"blankEnterprise"
|
|
(blankEnterprise) ->
|
|
return (lineItems,selectedSupplier,selectedDistributor) ->
|
|
filtered = []
|
|
filtered.push line_item for line_item in lineItems when (angular.equals(selectedSupplier,blankEnterprise()) || line_item.supplier == selectedSupplier) &&
|
|
(angular.equals(selectedDistributor,blankEnterprise()) || line_item.order.distributor == selectedDistributor)
|
|
filtered
|
|
]
|
|
|
|
orderManagementModule.factory "dataSubmitter", [
|
|
"$http", "$q", "switchClass"
|
|
($http, $q, switchClass) ->
|
|
return (changeObj) ->
|
|
deferred = $q.defer()
|
|
$http.put(changeObj.url).success((data) ->
|
|
switchClass changeObj.element, "update-success", ["update-pending", "update-error"], 3000
|
|
deferred.resolve data
|
|
).error ->
|
|
switchClass changeObj.element, "update-error", ["update-pending", "update-success"], false
|
|
deferred.reject()
|
|
deferred.promise
|
|
]
|
|
|
|
orderManagementModule.factory "switchClass", [
|
|
"$timeout"
|
|
($timeout) ->
|
|
return (element,classToAdd,removeClasses,timeout) ->
|
|
$timeout.cancel element.timeout if element.timeout
|
|
element.removeClass className for className in removeClasses
|
|
element.addClass classToAdd
|
|
intRegex = /^\d+$/
|
|
if timeout && intRegex.test(timeout)
|
|
element.timeout = $timeout(->
|
|
element.removeClass classToAdd
|
|
, timeout, true)
|
|
]
|