index.pug 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. div(class="import-page")
  2. h1 Импорт товаров
  3. div(class="import-steps")
  4. div(class="import-step" :class="{'import-step--active': currentStep === 1}")
  5. span(class="import-step__number") 1
  6. span Загрузка файла
  7. div(class="import-step" :class="{'import-step--active': currentStep === 2}")
  8. span(class="import-step__number") 2
  9. span Настройка полей
  10. div(class="import-step" :class="{'import-step--active': currentStep === 3}")
  11. span(class="import-step__number") 3
  12. span Предпросмотр
  13. div(class="import-step" :class="{'import-step--active': currentStep === 4}")
  14. span(class="import-step__number") 4
  15. span Импорт
  16. div(class="import-content")
  17. //- Шаг 1: Загрузка файла
  18. div(v-if="currentStep === 1" class="import-step-content")
  19. file-upload(
  20. accept=".csv,.xlsx"
  21. :multiple="false"
  22. @select="onFileSelect"
  23. @upload="startProcessing"
  24. )
  25. div(v-if="selectedFile" class="file-info")
  26. h3 Выбранный файл: {{ selectedFile.name }}
  27. p Размер: {{ (selectedFile.size / 1024 / 1024).toFixed(2) }} MB
  28. ui-button(@click="nextStep" type="primary") Далее
  29. //- Шаг 2: Настройка полей
  30. div(v-if="currentStep === 2" class="import-step-content")
  31. h3 Настройка соответствия полей
  32. div(class="field-mapping")
  33. div(
  34. v-for="(csvField, index) in csvFields"
  35. :key="index"
  36. class="field-mapping__row"
  37. )
  38. span(class="field-mapping__csv-field") {{ csvField }}
  39. select(v-model="fieldMapping[csvField]" class="field-mapping__select")
  40. option(value="") Не импортировать
  41. option(value="name") Название товара
  42. option(value="sku") Артикул
  43. option(value="price") Цена
  44. option(value="oldPrice") Цена до скидки
  45. option(value="brand") Бренд
  46. option(value="category") Категория
  47. option(value="description") Описание
  48. option(value="weight") Вес
  49. option(value="volume") Объем
  50. div(class="import-actions")
  51. ui-button(@click="prevStep" type="outline") Назад
  52. ui-button(@click="validateMapping" type="primary") Далее
  53. //- Шаг 3: Предпросмотр
  54. div(v-if="currentStep === 3" class="import-step-content")
  55. h3 Предпросмотр данных
  56. div(class="preview-info")
  57. p Найдено товаров: {{ previewData.length }}
  58. p Будут созданы категории: {{ newCategories.length }}
  59. data-table(
  60. :data="previewData.slice(0, 10)"
  61. :columns="previewColumns"
  62. :loading="previewLoading"
  63. )
  64. div(class="import-actions")
  65. ui-button(@click="prevStep" type="outline") Назад
  66. ui-button(@click="startImport" type="primary") Начать импорт
  67. //- Шаг 4: Импорт
  68. div(v-if="currentStep === 4" class="import-step-content")
  69. h3 Процесс импорта
  70. div(class="import-progress")
  71. div(class="import-progress__bar")
  72. div(
  73. class="import-progress__fill"
  74. :style="{ width: importProgress + '%' }"
  75. )
  76. div(class="import-progress__text")
  77. | {{ importProgress }}% ({{ processedItems }} из {{ totalItems }})
  78. div(v-if="importStats" class="import-stats")
  79. div(class="import-stat")
  80. span Успешно:
  81. strong {{ importStats.success }}
  82. div(class="import-stat")
  83. span С ошибками:
  84. strong {{ importStats.errors }}
  85. div(class="import-stat")
  86. span Новые категории:
  87. strong {{ importStats.newCategories }}
  88. div(v-if="importErrors.length > 0" class="import-errors")
  89. h4 Ошибки импорта:
  90. div(
  91. v-for="(error, index) in importErrors"
  92. :key="index"
  93. class="import-error"
  94. )
  95. strong Строка {{ error.row }}:
  96. span {{ error.message }}
  97. div(class="import-actions")
  98. ui-button(
  99. v-if="importComplete"
  100. @click="resetImport"
  101. type="primary"
  102. ) Новый импорт
  103. ui-button(
  104. v-else
  105. @click="cancelImport"
  106. type="danger"
  107. :disabled="importing"
  108. ) Отменить