SortMenu.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <template>
  2. <menu-tooltip v-model='menuOpen' width='10rem'>
  3. <div
  4. slot='button'
  5. class='sort_menu__button'
  6. :class='{ "sort_menu__button--selected": menuOpen }'
  7. @click='menuOpen = true'
  8. >
  9. {{column}}
  10. <span class='fa fa-fw' :class='iconName'></span>
  11. </div>
  12. <template slot='menu'>
  13. <div
  14. v-for='sort in ["ascending", "descending"]'
  15. class='sort_menu__item'
  16. :class='{
  17. "sort_menu__item--selected": sort == value.sort && value.column == column
  18. }'
  19. @click='setSelected(sort)'
  20. >
  21. {{sort}}
  22. </div>
  23. </template>
  24. </menu-tooltip>
  25. </template>
  26. <script>
  27. import MenuTooltip from './MenuTooltip';
  28. export default {
  29. name: 'SortMenu',
  30. props: ['value', 'column'],
  31. components: { MenuTooltip },
  32. data () {
  33. return {
  34. menuOpen: false
  35. }
  36. },
  37. computed: {
  38. iconName () {
  39. if(this.value.column !== this.column) {
  40. return 'fa-chevron-down';
  41. } else if(this.value.sort === 'ascending') {
  42. return 'fa-sort-amount-up';
  43. } else if(this.value.sort === 'descending') {
  44. return 'fa-sort-amount-down';
  45. }
  46. }
  47. },
  48. methods: {
  49. setSelected (val) {
  50. this.$emit('input', {
  51. column: this.column,
  52. sort: val
  53. })
  54. this.menuOpen = false;
  55. }
  56. }
  57. }
  58. </script>
  59. <style lang='scss' scoped>
  60. @import '../assets/scss/variables.scss';
  61. .sort_menu {
  62. @at-root #{&}__button {
  63. cursor: pointer;
  64. text-transform: capitalize;
  65. .fa {
  66. font-size: 0.8rem;
  67. }
  68. @at-root #{&}--selected {
  69. color: $color__blue--darker;
  70. }
  71. }
  72. @at-root #{&}__item {
  73. background-color: #fff;
  74. border-radius: 0.25rem;
  75. cursor: default;
  76. font-size: 0.9rem;
  77. font-weight: normal;
  78. margin: 0.125rem 0;
  79. padding: 0.125rem 0.25rem;
  80. user-select: none;
  81. transition: background-color 0.2s;
  82. @at-root #{&}--selected {
  83. background-color: $color__lightgray--darker;
  84. }
  85. &:hover {
  86. background-color: $color__lightgray--darker;
  87. }
  88. }
  89. }
  90. </style>