SearchResults.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <template>
  2. <div class="container">
  3. <div v-if="loading" class="pt-5 text-center">
  4. <div class="spinner-border" role="status">
  5. <span class="sr-only">Loading...</span>
  6. </div>
  7. </div>
  8. <div v-if="networkError" class="pt-5 text-center">
  9. <p class="lead font-weight-lighter">An error occured, results could not be loaded.<br> Please try again later.</p>
  10. </div>
  11. <div v-if="!loading && !networkError" class="mt-5 row">
  12. <div class="col-12 col-md-3">
  13. <div>
  14. <p class="font-weight-bold">Filters</p>
  15. <div class="custom-control custom-checkbox">
  16. <input type="checkbox" class="custom-control-input" id="filter1" v-model="filters.hashtags">
  17. <label class="custom-control-label text-muted" for="filter1">Show Hashtags</label>
  18. </div>
  19. <div class="custom-control custom-checkbox">
  20. <input type="checkbox" class="custom-control-input" id="filter2" v-model="filters.profiles">
  21. <label class="custom-control-label text-muted" for="filter2">Show Profiles</label>
  22. </div>
  23. <div class="custom-control custom-checkbox">
  24. <input type="checkbox" class="custom-control-input" id="filter3" v-model="filters.statuses">
  25. <label class="custom-control-label text-muted" for="filter3">Show Statuses</label>
  26. </div>
  27. </div>
  28. </div>
  29. <div class="col-12 col-md-9">
  30. <p class="h3 font-weight-lighter">Showing results for <i>{{query}}</i></p>
  31. <hr>
  32. <div v-if="filters.hashtags && results.hashtags.length" class="row mb-4">
  33. <p class="col-12 font-weight-bold text-muted">Hashtags</p>
  34. <a v-for="(hashtag, index) in results.hashtags" class="col-12 col-md-4" style="text-decoration: none;" :href="hashtag.url">
  35. <div class="card card-body text-center">
  36. <p class="lead mb-0 text-truncate text-dark">
  37. #{{hashtag.value}}
  38. </p>
  39. <p class="lead mb-0 small font-weight-bold text-dark">
  40. {{hashtag.count}} posts
  41. </p>
  42. </div>
  43. </a>
  44. </div>
  45. <div v-if="filters.profiles && results.profiles.length" class="row mb-4">
  46. <p class="col-12 font-weight-bold text-muted">Profiles</p>
  47. <a v-for="(profile, index) in results.profiles" class="col-12 col-md-4" style="text-decoration: none;" :href="profile.url">
  48. <div class="card card-body text-center border-left-primary">
  49. <p class="lead mb-0 text-truncate text-dark">
  50. {{profile.value}}
  51. </p>
  52. </div>
  53. </a>
  54. </div>
  55. <div v-if="filters.statuses && results.statuses.length" class="row mb-4">
  56. <p class="col-12 font-weight-bold text-muted">Statuses</p>
  57. <a v-for="(status, index) in results.statuses" class="col-12 col-md-4" style="text-decoration: none;" :href="status.url">
  58. <div class="card card-body text-center border-left-primary">
  59. <p class="lead mb-0 text-truncate text-dark">
  60. {{status.value}}
  61. </p>
  62. </div>
  63. </a>
  64. </div>
  65. </div>
  66. </div>
  67. </div>
  68. </template>
  69. <style type="text/css" scoped>
  70. </style>
  71. <script type="text/javascript">
  72. export default {
  73. props: ['query'],
  74. data() {
  75. return {
  76. loading: true,
  77. networkError: false,
  78. results: {
  79. hashtags: [],
  80. profiles: [],
  81. statuses: []
  82. },
  83. filters: {
  84. hashtags: true,
  85. profiles: true,
  86. statuses: true
  87. }
  88. }
  89. },
  90. beforeMount() {
  91. this.fetchSearchResults();
  92. },
  93. mounted() {
  94. $('.search-form input').val(this.query);
  95. },
  96. updated() {
  97. },
  98. methods: {
  99. fetchSearchResults() {
  100. axios.get('/api/search/' + this.query)
  101. .then(res => {
  102. let results = res.data;
  103. this.results.hashtags = results.filter(i => {
  104. return i.type == 'hashtag';
  105. });
  106. this.results.profiles = results.filter(i => {
  107. return i.type == 'profile';
  108. });
  109. this.results.statuses = results.filter(i => {
  110. return i.type == 'status';
  111. });
  112. this.loading = false;
  113. }).catch(err => {
  114. this.loading = false;
  115. this.networkError = true;
  116. })
  117. },
  118. }
  119. }
  120. </script>