index.pug 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. div(class="admin-products")
  2. div(class="admin-products__header")
  3. h1(class="admin-products__title") Управление товарами
  4. div(class="admin-products__actions")
  5. button(
  6. @click="showProductModal = true"
  7. class="admin-products__btn admin-products__btn--primary"
  8. ) Добавить товар
  9. button(
  10. @click="showImportModal = true"
  11. class="admin-products__btn admin-products__btn--secondary"
  12. ) Импорт из CSV
  13. div(class="admin-products__content")
  14. div(class="admin-products__filters")
  15. div(class="admin-products__filter-group")
  16. label(class="admin-products__label") Поиск
  17. input(
  18. v-model="searchQuery"
  19. type="text"
  20. class="admin-products__input"
  21. placeholder="Название или артикул..."
  22. )
  23. div(class="admin-products__filter-group")
  24. label(class="admin-products__label") Категория
  25. select(v-model="selectedCategory" class="admin-products__select")
  26. option(value="") Все категории
  27. option(
  28. v-for="category in categories"
  29. :key="category._id"
  30. :value="category._id"
  31. ) {{ category.name }}
  32. div(class="admin-products__filter-group")
  33. label(class="admin-products__label") Статус
  34. select(v-model="selectedStatus" class="admin-products__select")
  35. option(value="") Все
  36. option(value="active") Активные
  37. option(value="inactive") Неактивные
  38. div(class="admin-products__list")
  39. div(class="admin-products__table-container")
  40. table(class="admin-products__table")
  41. thead
  42. tr
  43. th(class="admin-products__th") Изобр.
  44. th(class="admin-products__th") Название
  45. th(class="admin-products__th") Артикул
  46. th(class="admin-products__th") Цена
  47. th(class="admin-products__th") Категория
  48. th(class="admin-products__th") Статус
  49. th(class="admin-products__th") Действия
  50. tbody
  51. tr(
  52. v-for="product in filteredProducts"
  53. :key="product._id"
  54. class="admin-products__tr"
  55. )
  56. td(class="admin-products__td")
  57. img(
  58. v-if="product.image"
  59. :src="product.image"
  60. :alt="product.name"
  61. class="admin-products__image"
  62. )
  63. div(v-else class="admin-products__no-image") Нет
  64. td(class="admin-products__td")
  65. div(class="admin-products__name") {{ product.name }}
  66. td(class="admin-products__td") {{ product.sku }}
  67. td(class="admin-products__td")
  68. div(class="admin-products__price") {{ formatPrice(product.price) }}
  69. div(
  70. v-if="product.oldPrice"
  71. class="admin-products__old-price"
  72. ) {{ formatPrice(product.oldPrice) }}
  73. td(class="admin-products__td") {{ getCategoryName(product.category) }}
  74. td(class="admin-products__td")
  75. span(
  76. :class="getStatusClass(product.active)"
  77. ) {{ product.active ? 'Активен' : 'Неактивен' }}
  78. td(class="admin-products__td")
  79. div(class="admin-products__action-buttons")
  80. button(
  81. @click="editProduct(product)"
  82. class="admin-products__action-btn admin-products__action-btn--edit"
  83. ) Редакт.
  84. button(
  85. @click="toggleProductStatus(product)"
  86. class="admin-products__action-btn admin-products__action-btn--toggle"
  87. ) {{ product.active ? 'Выкл.' : 'Вкл.' }}
  88. button(
  89. @click="deleteProduct(product._id)"
  90. class="admin-products__action-btn admin-products__action-btn--delete"
  91. ) Удалить
  92. // Модальное окно товара
  93. div(v-if="showProductModal" class="admin-products__modal")
  94. div(class="admin-products__modal-content")
  95. h3(class="admin-products__modal-title") {{ editingProduct ? 'Редактирование' : 'Добавление' }} товара
  96. // Форма будет реализована в следующем шаге
  97. // Модальное окно импорта
  98. div(v-if="showImportModal" class="admin-products__modal")
  99. div(class="admin-products__modal-content")
  100. h3(class="admin-products__modal-title") Импорт товаров из CSV
  101. div(class="admin-products__import-form")
  102. div(class="admin-products__form-group")
  103. label(class="admin-products__label") Выберите CSV файл
  104. input(
  105. type="file"
  106. @change="onFileSelect"
  107. accept=".csv"
  108. class="admin-products__file-input"
  109. )
  110. div(v-if="selectedFile" class="admin-products__file-info")
  111. p Выбран файл: {{ selectedFile.name }}
  112. button(
  113. @click="importProducts"
  114. :disabled="importing"
  115. class="admin-products__btn admin-products__btn--primary"
  116. ) {{ importing ? 'Импорт...' : 'Начать импорт' }}
  117. div(v-if="importResults" class="admin-products__import-results")
  118. h4(v-if="importResults.success" class="admin-products__success") Импорт успешно завершен!
  119. h4(v-else class="admin-products__error") Ошибка импорта
  120. p Обработано товаров: {{ importResults.processed }}
  121. p(v-if="importResults.error") Ошибка: {{ importResults.error }}
  122. div(class="admin-products__modal-actions")
  123. button(
  124. @click="showImportModal = false"
  125. class="admin-products__btn admin-products__btn--secondary"
  126. ) Закрыть