index.pug 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. div(class="data-table")
  2. div(class="data-table__toolbar")
  3. div(class="data-table__search")
  4. input(
  5. type="text"
  6. v-model="searchQuery"
  7. placeholder="Поиск..."
  8. class="data-table__search-input"
  9. )
  10. div(class="data-table__actions")
  11. slot(name="toolbar")
  12. div(v-if="loading" class="data-table__loading")
  13. div(class="data-table__spinner")
  14. span Загрузка данных...
  15. div(v-else class="data-table__container")
  16. table(class="data-table__table")
  17. thead
  18. tr
  19. th(v-if="selectable" class="data-table__checkbox-column")
  20. input(
  21. type="checkbox"
  22. :checked="selectedItems.length === paginatedData.length && paginatedData.length > 0"
  23. @change="selectAll($event.target.checked)"
  24. )
  25. th(
  26. v-for="column in columns"
  27. :key="column.key"
  28. @click="sort(column.key)"
  29. :class="{ 'data-table__sortable': column.sortable !== false }"
  30. class="data-table__header"
  31. )
  32. span {{ column.title }}
  33. span(
  34. v-if="sortField === column.key"
  35. class="data-table__sort-indicator"
  36. ) {{ sortDirection === 'asc' ? '↑' : '↓' }}
  37. tbody
  38. tr(
  39. v-for="item in paginatedData"
  40. :key="item._id"
  41. class="data-table__row"
  42. )
  43. td(v-if="selectable" class="data-table__checkbox-column")
  44. input(
  45. type="checkbox"
  46. :checked="isSelected(item)"
  47. @change="selectItem(item, $event.target.checked)"
  48. )
  49. td(
  50. v-for="column in columns"
  51. :key="column.key"
  52. class="data-table__cell"
  53. )
  54. template(v-if="column.slot")
  55. slot(:name="column.slot" :item="item")
  56. template(v-else)
  57. span {{ item[column.key] }}
  58. td(v-if="$slots.actions" class="data-table__actions-cell")
  59. slot(name="actions" :item="item")
  60. div(v-if="!loading && paginatedData.length === 0" class="data-table__empty")
  61. span Нет данных для отображения
  62. div(v-if="!loading && totalPages > 1" class="data-table__pagination")
  63. button(
  64. @click="currentPage = currentPage - 1"
  65. :disabled="currentPage === 1"
  66. class="data-table__pagination-btn"
  67. ) ←
  68. span(class="data-table__pagination-info")
  69. | Страница {{ currentPage }} из {{ totalPages }}
  70. button(
  71. @click="currentPage = currentPage + 1"
  72. :disabled="currentPage === totalPages"
  73. class="data-table__pagination-btn"
  74. ) →