/backend/app/assets/javascripts/spree/backend/stock_transfer.js.coffee

https://github.com/chienyuan/spree · CoffeeScript · 179 lines · 136 code · 37 blank · 6 comment · 15 complexity · a9478be89529581c45f8b55e30d68f69 MD5 · raw file

  1. $ ->
  2. # Base Model for transfer line items
  3. class TransferVariant
  4. constructor: (@variant) ->
  5. @id = @variant.id
  6. @name = "#{@variant.name} - #{@variant.sku}"
  7. @quantity = 0
  8. add: (quantity) ->
  9. @quantity += quantity
  10. # Model for stock items which validate quantity with count on hand
  11. class TransferStockItem extends TransferVariant
  12. constructor: (@stock_item) ->
  13. super(@stock_item.variant)
  14. @count_on_hand = @stock_item.count_on_hand
  15. @name = "#{@variant.name} - #{@variant.sku} (#{@count_on_hand})"
  16. add: (quantity) ->
  17. @quantity += quantity
  18. @quantity = @count_on_hand if @quantity > @count_on_hand
  19. # Manages source and destination selections
  20. class TransferLocations
  21. constructor: ->
  22. @source = $('#transfer_source_location_id')
  23. @destination = $('#transfer_destination_location_id')
  24. @source.change => @populate_destination()
  25. $('#transfer_receive_stock').change (event) => @receive_stock_change(event)
  26. $.getJSON Spree.url(Spree.routes.stock_locations_api), (data) =>
  27. @locations = (location for location in data.stock_locations)
  28. @force_receive_stock() if @locations.length < 2
  29. @populate_source()
  30. @populate_destination()
  31. force_receive_stock: ->
  32. $('#receive_stock_field').hide()
  33. $('#transfer_receive_stock').prop('checked', true)
  34. @toggle_source_location true
  35. is_source_location_hidden: ->
  36. $('#transfer_source_location_id_field').css('visibility') == 'hidden'
  37. toggle_source_location: (hide=false) ->
  38. @source.trigger('change')
  39. if @is_source_location_hidden() and not hide
  40. $('#transfer_source_location_id_field').css('visibility', 'visible')
  41. else
  42. $('#transfer_source_location_id_field').css('visibility', 'hidden')
  43. receive_stock_change: (event) ->
  44. @toggle_source_location event.target.checked
  45. @populate_destination(!event.target.checked)
  46. populate_source: ->
  47. @populate_select @source
  48. @source.trigger('change')
  49. populate_destination: (except_source=true) ->
  50. if @is_source_location_hidden()
  51. @populate_select @destination
  52. else
  53. @populate_select @destination, parseInt(@source.val())
  54. populate_select: (select, except=0) ->
  55. select.children('option').remove()
  56. for location in @locations when location.id isnt except
  57. select.append $('<option></option>')
  58. .text(location.name)
  59. .prop('value', location.id)
  60. select.select2()
  61. # Populates variants drop down
  62. class TransferVariants
  63. constructor: ->
  64. $('#transfer_source_location_id').change => @refresh_variants()
  65. receiving_stock: ->
  66. $( "#transfer_receive_stock:checked" ).length > 0
  67. refresh_variants: ->
  68. if @receiving_stock()
  69. @_refresh_transfer_variants()
  70. else
  71. @_refresh_transfer_stock_items()
  72. _refresh_transfer_variants: ->
  73. if @cached_variants?
  74. @populate_select @cached_variants
  75. else
  76. $.getJSON Spree.url(Spree.routes.variants_api), (data) =>
  77. @cached_variants = _.map(data.variants, (variant) -> new TransferVariant(variant))
  78. @populate_select @cached_variants
  79. _refresh_transfer_stock_items: ->
  80. stock_location_id = $('#transfer_source_location_id').val()
  81. $.getJSON Spree.url(Spree.routes.stock_locations_api + "/#{stock_location_id}/stock_items"), (data) =>
  82. @populate_select _.map(data.stock_items, (stock_item) -> new TransferStockItem(stock_item))
  83. populate_select: (variants) ->
  84. $('#transfer_variant').children('option').remove()
  85. for variant in variants
  86. $('#transfer_variant').append($('<option></option>')
  87. .text(variant.name)
  88. .prop('value', variant.id)
  89. .data('variant', variant))
  90. $('#transfer_variant').select2()
  91. # Add/Remove variant line items
  92. class TransferAddVariants
  93. constructor: ->
  94. @variants = []
  95. @template = Handlebars.compile $('#transfer_variant_template').html()
  96. $('#transfer_source_location_id').change (event) => @clear_variants()
  97. $('button.transfer_add_variant').click (event) =>
  98. event.preventDefault()
  99. @add_variant()
  100. $('#transfer-variants-table').on 'click', '.transfer_remove_variant', (event) =>
  101. event.preventDefault()
  102. @remove_variant $(event.target)
  103. $('button.transfer_transfer').click =>
  104. unless @variants.length > 0
  105. alert('no variants to transfer')
  106. false
  107. add_variant: ->
  108. variant = $('#transfer_variant option:selected').data('variant')
  109. quantity = parseInt $('#transfer_variant_quantity').val()
  110. variant = @find_or_add(variant)
  111. variant.add(quantity)
  112. @render()
  113. find_or_add: (variant) ->
  114. if existing = _.find(@variants, (v) -> v.id == variant.id)
  115. return existing
  116. else
  117. variant = $.extend({}, variant)
  118. @variants.push variant
  119. return variant
  120. remove_variant: (target) ->
  121. variant_id = parseInt(target.data('variantId'))
  122. @variants = (v for v in @variants when v.id isnt variant_id)
  123. @render()
  124. clear_variants: ->
  125. @variants = []
  126. @render()
  127. contains: (id) ->
  128. _.contains(_.pluck(@variants, 'id'), id)
  129. render: ->
  130. if @variants.length is 0
  131. $('#transfer-variants-table').hide()
  132. $('.no-objects-found').show()
  133. else
  134. $('#transfer-variants-table').show()
  135. $('.no-objects-found').hide()
  136. rendered = @template { variants: @variants }
  137. $('#transfer_variants_tbody').html(rendered)
  138. # Main
  139. if $('#transfer_source_location_id').length > 0
  140. transfer_locations = new TransferLocations
  141. transfer_variants = new TransferVariants
  142. transfer_add_variants = new TransferAddVariants