VariantModal.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <template lang="pug">
  2. modal(
  3. name='variant-selector'
  4. transition='nice-modal-fade'
  5. height='500'
  6. :classes="['v--modal', 'variant-modal']"
  7. @closed='handleClosed'
  8. )
  9. searcher(:items='getItems()' :keys="['name']" @onSearch='filterVariants')
  10. .product-variants
  11. .product-variant(v-for='item in getItems()' :key='item.id' @click='selectProduct(item)')
  12. img.variant-image(:src="'data:image/png;base64,' + (item.image || 'iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAAAAACPAi4CAAAACXZwQWcAAABAAAAAQADq8/hgAAAEWklEQVRYw9WX6XKjRhCAef8HiySQvGt5vfZuEselOUAcEpe4GdI9MAgQOjb5k3SVyzY1801PX9OtNf9StP80QJR5miRpXtb/AFCnvmMySgmhlJn2Mal+BSBSj1NCGeNSGAMOd0/iQYCI95TAXnm+FCr/I2ZYPwJILEJhPaGm7flBFIW+Z5sUvwEivguovG7pMR0cV2e+BbYArF3cBqQclKfEvryvSB2KaHa6BYhgDSP7ZN7gmUNQCf86wCdgcBaKq04/cTzAuwbA/czKb8VdZYMSI8IAEOJ+XjTiFkF4SDjOARIIHLiBK+4E/xHOIdEloMSAAwZx7hEOBKIquwA4lFPbR/3uEhzCqSUmgBiwrGgeIlQm5b0zO0CN3yKw34QgQC4JKZqrGAFC0MpWvuwJ3V6hWD3BI5wchoDaBAumzYQgmsrd7ewZx5bosHIAAAtQp4+nXUuA+2yXy9Xyi4OsIorjauBLZQWtd0Gqrt3EvCXQlb4BMZYfsPP7cr0gvS4FaNw6Qus0ovtez8DZcYyHt8Wmk9XWdF+Mjf570Ke4q46UgAgUCtX55mKl/wSbsD83hrEE0VGJ1RrEWHz2aaXuIAEe7b3SNG/601oSzL/W20/T2r2uDNACARvjWelZQTTaCiCg2vSR1bzrsFgSQMk8SbPi8FWX+0GFbX2OXMarDoAmOGfo+wpXt7cwj4Hv+1n+rSMYW3HOfS4TAgHZIDIVYG38wNzchyB+kj4ZUwB4npw6ABokmgA2qz9kfbIkoWDLzQSQ0tbw2gA20kA/nmyqCHG8nmqQd2prbSKQZAIwnk5B5PSE/EWfACCUZGFSgHQKeE6DsCcExfc5wKEDRLMaJHBwTwA/zFzhOLBBPGODoCfEyYUb0XVBB1AGHXvho/SVDsSjF15QrtMG1xlpsDbCrCewj7UxAWAJSjsAlJOuHI0AX9Mi8IMgsJnMC2MMOJA2f7RhXI8AG/2LVxZZVlQWmKElnAFiT5nMH62L67Mb3lTmbIzVK3Uc9r6GvJAEyMa6d0KXP1oXliqbRPPzN0NvBcrBAmSpr37wlrB8GeRS6zkJECZVNRKeuLfty1C+wc/zp7TD9jVQN7DUDq2vkUEzfAymIl9uZ5iL1B0U1Rw7surmc4SE/sUBE3KaDB8Wd1QS7hJQga4Kayow2aAsXiV0L458HE/jx9UbPi33CIf+ITwDSnxM/IcIcAGIrHzaH+BX8Ky4awdq41nBZYsjG4/kEQLjg9Q5A9A1jJ7u3CJEa1OzmuvSKgubwPA24IT7WT7fJ5YmEtwbASWO2AkP94871WpPOCc8vmYHaORhv5lf75VrV3bD+9nZIrUJamhXN9v9kMlu3wonYVlGe9msU1/cGTgKpx0YmO2fsrKq66rMk8Bh7dd99sDIk+xxxsE5icqhqfsLflkz1pkbukSCBzI5bqG0EGrPGvfK2FeGDseRi1I5eVFuB8WvDp51FvsH13Fcz4+y6n86Oz8kfwPMD02INEiadQAAAABJRU5ErkJggg==')")
  13. .variant-details
  14. h2.variant-name {{ item.name }}
  15. </template>
  16. <script>
  17. import { mapGetters, mapActions } from 'vuex'
  18. import { Searcher } from '@@/common'
  19. import { SELECT_PRODUCT } from '@/constants/actionTypes'
  20. export default {
  21. components: {
  22. Searcher
  23. },
  24. computed: mapGetters([
  25. 'productWithVariant'
  26. ]),
  27. methods: {
  28. getItems() {
  29. return this.filteredItems.length === 0 && !!this.productWithVariant ? this.productWithVariant.variants : this.filteredItems
  30. },
  31. filterVariants(values) {
  32. this.filteredItems = values
  33. },
  34. handleClosed() {
  35. this.selectProduct(null)
  36. },
  37. ...mapActions([
  38. SELECT_PRODUCT
  39. ])
  40. },
  41. watch: {
  42. productWithVariant(value) {
  43. if (value) {
  44. this.$modal.show('variant-selector')
  45. return
  46. }
  47. this.$modal.hide('variant-selector')
  48. }
  49. },
  50. data() {
  51. return {
  52. filteredItems: []
  53. }
  54. }
  55. }
  56. </script>
  57. <style lang="sass">
  58. .variant-modal
  59. padding: 15px !important
  60. .product-variants
  61. width: 100%;
  62. height: calc(100% - 70px)
  63. overflow-y: auto
  64. .product-variant
  65. width: calc(100% - 20px)
  66. height: 84px
  67. margin: 5px 10px
  68. display: flex
  69. &:hover
  70. cursor: pointer
  71. .variant-details
  72. transition-duration: 0.5s
  73. border-bottom: 2px solid #7c7bad
  74. .variant-image
  75. width: 80px
  76. height: 80px
  77. margin: 0
  78. border: none
  79. .variant-details
  80. flex-grow: 1
  81. border-bottom: 1px solid #d3d3d3
  82. .variant-name
  83. font-size: 10pt
  84. margin-left: 10px
  85. </style>