Files
openfoodnetwork/app/assets/javascripts/admin/resources/services/line_items.js.coffee
Pau Perez 8db1fa4e77 Move JSON line items responses to a new controller
Extracts the JSON response from the admin's line item controller which
are only used by the bulk management feature into its own controller.

This decouples spree from an OFN-only feature and allows to remove
unnecessary code. Furthermore, Admin::LineItemsController is gone in
Spree 2.4.0.beta. See: https://github.com/spree/spree/pull/5280
2017-09-08 23:55:50 +10:00

66 lines
2.0 KiB
CoffeeScript

angular.module("admin.resources").factory 'LineItems', ($q, LineItemResource) ->
new class LineItems
byID: {}
pristineByID: {}
index: (params={}, callback=null) ->
LineItemResource.index params, (data) =>
@load(data)
(callback || angular.noop)(data)
resetData: ->
@byID = {}
@pristineByID = {}
load: (lineItems) ->
@resetData()
for lineItem in lineItems
@byID[lineItem.id] = lineItem
@pristineByID[lineItem.id] = angular.copy(lineItem)
saveAll: ->
for id, lineItem of @byID
lineItem.errors = {} # removes errors when line_item has been returned to original state
@save(lineItem) if !@isSaved(lineItem)
save: (lineItem) ->
deferred = $q.defer()
lineItem.errors = {}
lineItem.$update({id: lineItem.id})
.then( (data) =>
@pristineByID[lineItem.id] = angular.copy(lineItem)
deferred.resolve(data)
).catch (response) ->
lineItem.errors = response.data.errors if response.data.errors?
deferred.reject(response)
deferred.promise
allSaved: ->
for id, lineItem of @byID
return false unless @isSaved(lineItem)
true
isSaved: (lineItem) ->
@diff(lineItem).length == 0
diff: (lineItem) ->
changed = []
for attr, value of lineItem when not angular.equals(value, @pristineByID[lineItem.id][attr])
changed.push attr if attr in ["price", "quantity", "final_weight_volume"]
changed
resetAttribute: (lineItem, attribute) ->
lineItem[attribute] = @pristineByID[lineItem.id][attribute]
delete: (lineItem, callback=null) ->
deferred = $q.defer()
lineItem.$delete({id: lineItem.id})
.then( (data) =>
delete @byID[lineItem.id]
delete @pristineByID[lineItem.id]
(callback || angular.noop)(data)
deferred.resolve(data)
).catch (response) ->
deferred.reject(response)
deferred.promise