CartItem.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <template lang="pug">
  2. li.cart-item(:class="{'cart-item-invalid': !isValid()}")
  3. h3.item-name {{ item.displayName }}
  4. input.item-quantity(type='number' min='1' :value='item.quantity' readonly)
  5. span.item-x x
  6. span.item-price {{ item.price | currency(...options) }}
  7. span.item-equals =
  8. span.item-subtotal {{ (item.price * (item.quantity || 1)) | currency(...options) }}
  9. .cart-item-options-wrapper
  10. .cart-item-options
  11. .cart-item-option(class='fa fa-plus' @click='onClickIncrement')
  12. .cart-item-option(class='fa fa-minus' @click='onClickDecrement')
  13. .cart-item-option(class='fa fa-money' @click='onClickMoney')
  14. .cart-item-option(class='fa fa-undo' @click='onClickUndo')
  15. .cart-item-option(class='fa fa-trash' @click='onClickDelete')
  16. </template>
  17. <script>
  18. export default {
  19. props: {
  20. index: {
  21. type: Number,
  22. default: -1,
  23. required: true
  24. },
  25. item: {
  26. type: Object,
  27. default: null
  28. },
  29. options: {
  30. type: Object,
  31. default: {
  32. symbol: '$',
  33. position: 'before',
  34. thousandsSeparator: '.',
  35. decimalPlaces: 2,
  36. decimalSeparator: ','
  37. }
  38. }
  39. },
  40. watch: {
  41. item: {
  42. handler(value) {
  43. this.onChange(value)
  44. },
  45. deep: true,
  46. immediate: true
  47. }
  48. },
  49. methods: {
  50. onChange(item) {
  51. this.$emit('onChange', item)
  52. },
  53. onClickIncrement() {
  54. this.$emit('onClickIncrement', this.item)
  55. },
  56. onClickDecrement() {
  57. this.$emit('onClickDecrement', this.item)
  58. },
  59. onClickMoney() {
  60. this.$emit('onClickMoney', this.item)
  61. },
  62. onClickUndo() {
  63. this.$emit('onClickUndo', this.item)
  64. },
  65. onClickDelete() {
  66. this.$emit('onClickDelete', this.item)
  67. },
  68. isValid() {
  69. return this.item.price > 0
  70. }
  71. }
  72. }
  73. </script>
  74. <style lang="sass">
  75. @import '../../assets/variables'
  76. .cart-item
  77. width: 100%
  78. height: 90px
  79. list-style: none outside none
  80. border-bottom: 1px solid $app-border-color
  81. box-sizing: border-box
  82. position: relative
  83. &.cart-item-invalid
  84. border-bottom: 2px solid $app-error-color
  85. &:nth-child(1)
  86. border-top: 1px solid $app-border-color
  87. &:hover
  88. transition-duration: 1000ms
  89. border-bottom: 2px solid $app-main-color
  90. .item-name
  91. width: 100%
  92. height: 20px
  93. margin: 10px 0 5px 0
  94. float: left
  95. font-size: 8pt
  96. display: inline-block
  97. .item-quantity
  98. width: 50px
  99. height: 28px
  100. margin-top: 6px
  101. text-align: right
  102. float: left
  103. display: inline-block
  104. .item-x
  105. width: 20px
  106. height: 20px
  107. margin-top: 12px
  108. text-align: right
  109. float: left
  110. display: inline-block
  111. .item-price
  112. width: 80px
  113. height: 20px
  114. margin-top: 12px
  115. text-align: right
  116. float: left
  117. display: inline-block
  118. .item-equals
  119. width: 20px
  120. height: 20px
  121. margin-top: 12px
  122. text-align: center
  123. float: left
  124. display: inline-block
  125. .item-subtotal
  126. width: 100px
  127. height: 20px
  128. margin-top: 12px
  129. text-align: right
  130. font-weight: bold
  131. display: inline-block
  132. .cart-item-options-wrapper
  133. width: 100%
  134. height: 20px
  135. position: absolute
  136. bottom: 0
  137. display: flex
  138. justify-content: center
  139. .cart-item-options
  140. width: 120px
  141. height: 20px
  142. border: 1px solid #d3d3d3
  143. border-bottom: none
  144. display: flex
  145. justify-content: center
  146. .cart-item-option
  147. width: 18px
  148. height: 18px
  149. margin: 0 5px
  150. color: #666
  151. &:hover
  152. cursor: pointer
  153. &.fa
  154. padding-left: 2px
  155. line-height: 20px
  156. &.fa-plus:hover
  157. color: #2196f3
  158. &.fa-minus:hover
  159. color: #ffc107
  160. &.fa-money:hover
  161. color: #4caf50
  162. &.fa-trash:hover
  163. color: #f44336
  164. </style>