mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-13 04:00:21 +00:00
WIP: BOM Refactor, building line_item fetch and update logic with ngResource
This commit is contained in:
@@ -28,6 +28,7 @@
|
||||
//= require ./enterprises/enterprises
|
||||
//= require ./enterprise_groups/enterprise_groups
|
||||
//= require ./index_utils/index_utils
|
||||
//= require ./line_items/line_items
|
||||
//= require ./orders/orders
|
||||
//= require ./payment_methods/payment_methods
|
||||
//= require ./products/products
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
# Used with the ngChange directive to prevent updates to the relevant model unless a callback returns true
|
||||
angular.module("admin.lineItems").directive "confirmChange", ->
|
||||
restrict: "A"
|
||||
require: 'ngModel'
|
||||
scope:
|
||||
confirmChange: "&"
|
||||
link: (scope, element, attrs, ngModel) ->
|
||||
valid = null
|
||||
|
||||
ngModel.$parsers.push (val) =>
|
||||
return val if val == valid
|
||||
if scope.confirmChange()
|
||||
# ngModel is changed, triggers ngChange callback
|
||||
return valid = val
|
||||
else
|
||||
valid = ngModel.$modelValue
|
||||
ngModel.$setViewValue(valid)
|
||||
ngModel.$render()
|
||||
return valid
|
||||
@@ -0,0 +1,6 @@
|
||||
angular.module("ofn.admin").directive "ofnConfirmModelChange", (ofnConfirmHandler,$timeout) ->
|
||||
restrict: "A"
|
||||
link: (scope, element, attrs) ->
|
||||
handler = ofnConfirmHandler scope, -> scope.fetchOrders()
|
||||
scope.$watch attrs.ngModel, (oldValue,newValue) ->
|
||||
handler() unless oldValue == undefined || newValue == oldValue
|
||||
@@ -0,0 +1,7 @@
|
||||
angular.module("admin.lineItems").filter "selectFilter", (blankOption) ->
|
||||
return (lineItems,selectedSupplier,selectedDistributor,selectedOrderCycle) ->
|
||||
filtered = []
|
||||
filtered.push lineItem for lineItem in lineItems when (angular.equals(selectedSupplier,"0") || lineItem.supplier.id == selectedSupplier) &&
|
||||
(angular.equals(selectedDistributor,"0") || lineItem.order.distributor.id == selectedDistributor) &&
|
||||
(angular.equals(selectedOrderCycle,"0") || lineItem.order.order_cycle.id == selectedOrderCycle)
|
||||
filtered
|
||||
@@ -0,0 +1,6 @@
|
||||
angular.module("admin.lineItems").filter "variantFilter", ->
|
||||
return (lineItems,selectedUnitsProduct,selectedUnitsVariant,sharedResource) ->
|
||||
filtered = []
|
||||
filtered.push lineItem for lineItem in lineItems when (angular.equals(selectedUnitsProduct,{}) ||
|
||||
(lineItem.units_product.id == selectedUnitsProduct.id && (sharedResource || lineItem.units_variant.id == selectedUnitsVariant.id ) ) )
|
||||
filtered
|
||||
@@ -0,0 +1 @@
|
||||
angular.module("admin.lineItems", ["admin.indexUtils", "admin.lineItems", "admin.enterprises", "admin.order_cycles"])
|
||||
@@ -0,0 +1,12 @@
|
||||
angular.module("admin.lineItems").factory 'LineItemResource', ($resource) ->
|
||||
$resource('/admin/:orders/:order_number/line_items/:id.json', {}, {
|
||||
'index':
|
||||
method: 'GET'
|
||||
isArray: true
|
||||
'update':
|
||||
method: 'PUT'
|
||||
transformRequest: (data, headersGetter) =>
|
||||
requestData = {}
|
||||
requestData[attr] = data[attr] for attr in ["price", "quantity", "final_weight_volume"]
|
||||
angular.toJson(requestData)
|
||||
})
|
||||
@@ -0,0 +1,48 @@
|
||||
angular.module("admin.lineItems").factory 'LineItems', ($q, LineItemResource) ->
|
||||
new class LineItems
|
||||
lineItemsByID: {}
|
||||
pristineByID: {}
|
||||
|
||||
index: (params={}, callback=null) ->
|
||||
LineItemResource.index params, (data) =>
|
||||
@resetData()
|
||||
for lineItem in data
|
||||
@lineItemsByID[lineItem.id] = lineItem
|
||||
@pristineByID[lineItem.id] = angular.copy(lineItem)
|
||||
|
||||
(callback || angular.noop)(data)
|
||||
|
||||
resetData: ->
|
||||
@lineItemsByID = {}
|
||||
@pristineByID = {}
|
||||
|
||||
saveAll: ->
|
||||
for id, lineItem of @lineItemsByID when !@isSaved(lineItem)
|
||||
@save(lineItem)
|
||||
|
||||
save: (lineItem) ->
|
||||
deferred = $q.defer()
|
||||
lineItem.$update({id: lineItem.id, orders: "orders", order_number: lineItem.order.number})
|
||||
.then( (data) =>
|
||||
@pristineByID[lineItem.id] = angular.copy(lineItem)
|
||||
deferred.resolve(data)
|
||||
).catch (response) ->
|
||||
deferred.reject(response)
|
||||
deferred.promise
|
||||
|
||||
allSaved: ->
|
||||
for id, lineItem of @lineItemsByID
|
||||
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]
|
||||
Reference in New Issue
Block a user