blog-vue.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. Vue.component('latest-posts', {
  2. props: ['posts'],
  3. template: `
  4. <div class="recent-post">
  5. <!-- start single post -->
  6. <div class="recent-single-post">
  7. <div class="post-img">
  8. <a @click.prevent="$root.verNoticia(posts.id)">
  9. <img :src="posts.imagenPreview" alt="">
  10. </a>
  11. </a>
  12. </div>
  13. <div class="pst-content">
  14. <p><a href="#" @click.prevent="$root.verNoticia(posts.id)"
  15. > {{ posts.titulo }} </a></p>
  16. </div>
  17. </div>
  18. </div>
  19. `
  20. });
  21. Vue.component('latest-posts-index', {
  22. props: ['posts'],
  23. template: `
  24. <div class="col-md-4 col-sm-4 col-xs-12">
  25. <div class="single-blog">
  26. <div class="single-blog-img">
  27. <a href="#">
  28. <img :src="posts.imagenPreview" :alt="posts.titulo">
  29. </a>
  30. </div>
  31. <div class="blog-meta">
  32. <span class="date-type">
  33. <i class="fa fa-calendar"></i> {{ posts.fecha }}
  34. </span>
  35. </div>
  36. <div class="blog-text">
  37. <h4>
  38. <a href="#">{{ posts.titulo }} </a>
  39. </h4>
  40. <p>
  41. {{ posts.preview }}
  42. </p>
  43. </div>
  44. <span>
  45. <a href="blog" class="ready-btn">Leer más</a>
  46. </span>
  47. </div>
  48. </div>
  49. `
  50. });
  51. Vue.component('post-details', {
  52. props: ['details'],
  53. template: `
  54. <article class="blog-post-wrapper">
  55. <a @click="$root.verDetalles = false" class="btn btn-primary"><i class="glyphicon glyphicon-arrow-left" aria-hidden="true"></i></a><br><br>
  56. <!-- Carousel container -->
  57. <div id="my-pics" class="carousel slide" data-ride="carousel">
  58. <!-- Indicators -->
  59. <ol class="carousel-indicators">
  60. <li data-target="#my-pics" v-for="(imagen,index) in details.imagenes" :key="index" :class="[index === 0 ? 'active':'']" :data-slide-to="index"></li>
  61. </ol>
  62. <!-- Content -->
  63. <div class="carousel-inner" role="listbox">
  64. <div class="item" v-for="(imagen,index) in details.imagenes" :key="index" :class="[index === 1 ? 'active':'']">
  65. <img :src="imagen.path" alt="Rob Roy Glacier" style="height:450px; width:650px">
  66. </div>
  67. </div>
  68. <!-- Previous/Next controls -->
  69. <a class="left carousel-control" href="#my-pics" role="button" data-slide="prev">
  70. <span class="icon-prev" aria-hidden="true"></span>
  71. <span class="sr-only">Previous</span>
  72. </a>
  73. <a class="right carousel-control" href="#my-pics" role="button" data-slide="next">
  74. <span class="icon-next" aria-hidden="true"></span>
  75. <span class="sr-only">Next</span>
  76. </a>
  77. </div>
  78. <div class="post-information">
  79. <h2> {{ details.titulo }} </h2>
  80. <div class="entry-meta">
  81. <span><i class="fa fa-calendar"></i> {{ details.fecha }} </span>
  82. <span class="tag-meta"></span>
  83. </div>
  84. <div v-html="details.contenido" class="entry-content">
  85. </div>
  86. </div>
  87. </article>`
  88. });
  89. Vue.component('posts', {
  90. props: ['publish'],
  91. template: `
  92. <div class="col-md-12 col-sm-12 col-xs-12">
  93. <div class="single-blog">
  94. <div class="single-blog-img">
  95. <a href='#'>
  96. <img :src='publish.imagenPreview' alt="Imagen">
  97. </a>
  98. </div>
  99. <div class="blog-meta">
  100. <span class="date-type">
  101. <i class="fa fa-calendar"></i> {{ publish.fecha }}
  102. </span>
  103. </div>
  104. <div class="blog-text">
  105. <h4>
  106. {{ publish.titulo }}
  107. </h4>
  108. <p>
  109. {{ publish.preview }}
  110. </p>
  111. </div>
  112. <span>
  113. <a href="blog-details" @click.prevent="$root.verNoticia(publish.id)" class="ready-btn">Leer más</a>
  114. </span>
  115. </div>
  116. </div>
  117. `
  118. });
  119. var blog = new Vue({
  120. el: '#publicaciones',
  121. data: {
  122. publicaciones: [],
  123. post: [],
  124. verDetalles: false,
  125. search: '',
  126. perPage: 3,
  127. currentPage: 1,
  128. totalRows: 2,
  129. verPaginador: true
  130. },
  131. created() {
  132. this.getData();
  133. },
  134. computed: {
  135. filtroBusqueda: function() {
  136. if (this.search.length != 0) {
  137. this.verPaginador = false;
  138. return arrFilter = this.publicaciones.filter((pub) => {
  139. return pub.titulo.toLowerCase().match(this.search.toLowerCase())
  140. });
  141. } else {
  142. // Implementar páginador
  143. this.verPaginador = true;
  144. return this.paginador();
  145. }
  146. },
  147. filtrolatestPub: function() {
  148. // Calculamos los 3 últimos
  149. var publiTotal = parseInt(this.publicaciones.length) - 3;
  150. return arrFilter = this.publicaciones.filter((pub) => {
  151. return pub.id > publiTotal
  152. });
  153. },
  154. rows() {
  155. return this.publicaciones.length
  156. }
  157. },
  158. methods: {
  159. verNoticia: function(id) {
  160. this.verDetalles = true;
  161. this.post = this.publicaciones.filter(function(pub) {
  162. return pub.id == id
  163. });
  164. },
  165. paginador() {
  166. // Calcular páginador
  167. const indiceInicio = (this.currentPage - 1) * this.perPage;
  168. const indiceFinal = indiceInicio + this.perPage > this.publicaciones.length ?
  169. this.publicaciones.length :
  170. indiceInicio + this.perPage;
  171. return this.publicaciones.slice(indiceInicio, indiceFinal);
  172. },
  173. getData() {
  174. axios.get("./shared/data/publicaciones.json")
  175. .then(response => { this.publicaciones = response.data });
  176. }
  177. }
  178. });