Kaynağa Gözat

add product

Gogs 4 hafta önce
ebeveyn
işleme
4a0a522d4f

Dosya farkı çok büyük olduğundan ihmal edildi
+ 227 - 4
README.md


Dosya farkı çok büyük olduğundan ihmal edildi
+ 690 - 227
app/pages/Admin/Products/index.coffee


+ 463 - 651
app/pages/Admin/Products/index.pug

@@ -3,717 +3,529 @@ div(class="admin-products")
     h1(class="admin-products__title") Управление товарами
     div(class="admin-products__actions")
       button(
-        @click="showProductModal = true"
-        class="admin-products__btn admin-products__btn--primary"
+        @click="createProduct"
+        class="admin-products__button admin-products__button--primary"
       ) Добавить товар
       button(
         @click="showImportModal = true"
-        class="admin-products__btn admin-products__btn--secondary"
+        class="admin-products__button admin-products__button--secondary"
       ) Импорт из CSV
       button(
-        @click="showCategoriesModal = true"
-        class="admin-products__btn admin-products__btn--secondary"
+        @click="showCategoriesManager"
+        class="admin-products__button admin-products__button--secondary"
       ) Управление категориями
       button(
+        v-if="selectedProducts.length > 0"
         @click="showMassActionsModal = true"
-        class="admin-products__btn admin-products__btn--primary"
-      ) Массовые действия
+        class="admin-products__button admin-products__button--warning"
+      ) Массовые действия ({{ selectedProducts.length }})
+
+  div(class="admin-products__filters")
+    div(class="admin-products__search")
+      input(
+        type="text"
+        v-model="searchQuery"
+        placeholder="Поиск по названию или артикулу..."
+        class="admin-products__search-input"
+      )
+    div(class="admin-products__filter-group")
+      select(v-model="selectedCategory" class="admin-products__select")
+        option(value="") Все категории
+        option(
+          v-for="category in categories"
+          :value="category._id"
+        ) {{ category.name }} ({{ getCategoryProductCount(category._id) }})
+      select(v-model="selectedStatus" class="admin-products__select")
+        option(value="") Все статусы
+        option(value="active") Активные
+        option(value="inactive") Неактивные
 
   div(class="admin-products__content")
-    div(class="admin-products__filters")
-      div(class="admin-products__filter-group")
-        label(class="admin-products__label") Поиск
-        input(
-          v-model="searchQuery"
-          type="text"
-          class="admin-products__input"
-          placeholder="Название или артикул..."
-        )
-      
-      div(class="admin-products__filter-group")
-        label(class="admin-products__label") Категория
-        select(v-model="selectedCategory" class="admin-products__select")
-          option(value="") Все категории
-          option(
-            v-for="category in categories"
-            :key="category._id"
-            :value="category._id"
-          ) {{ category.name }}
-      
-      div(class="admin-products__filter-group")
-        label(class="admin-products__label") Статус
-        select(v-model="selectedStatus" class="admin-products__select")
-          option(value="") Все
-          option(value="active") Активные
-          option(value="inactive") Неактивные
-    
-    div(class="admin-products__mass-actions")
-      div(class="admin-products__mass-header")
-        div(class="admin-products__selection-info")
-          span Выбрано товаров: {{ selectedProducts.length }}
-          button(
-            v-if="selectedProducts.length > 0"
-            @click="clearSelection"
-            class="admin-products__btn admin-products__btn--secondary"
-          ) Сбросить
-        div(class="admin-products__mass-buttons")
-          button(
-            @click="activateSelected"
-            :disabled="selectedProducts.length === 0"
-            class="admin-products__btn admin-products__btn--secondary"
-          ) Активировать
-          button(
-            @click="deactivateSelected"
-            :disabled="selectedProducts.length === 0"
-            class="admin-products__btn admin-products__btn--secondary"
-          ) Деактивировать
-          button(
-            @click="deleteSelected"
-            :disabled="selectedProducts.length === 0"
-            class="admin-products__btn admin-products__btn--danger"
-          ) Удалить
-          button(
-            @click="showCategoryAssignModal = true"
-            :disabled="selectedProducts.length === 0"
-            class="admin-products__btn admin-products__btn--primary"
-          ) Назначить категорию
+    div(class="admin-products__table-container")
+      table(class="admin-products__table")
+        thead
+          tr
+            th(class="admin-products__th admin-products__th--checkbox")
+              input(
+                type="checkbox"
+                v-model="selectAll"
+                @change="toggleSelectAll"
+                class="admin-products__checkbox"
+              )
+            th(class="admin-products__th") Артикул
+            th(class="admin-products__th") Название
+            th(class="admin-products__th") Категория
+            th(class="admin-products__th") Цена
+            th(class="admin-products__th") Статус
+            th(class="admin-products__th") Действия
+        tbody
+          tr(
+            v-for="product in filteredProducts"
+            :key="product._id"
+            :class="['admin-products__tr', { 'admin-products__tr--inactive': !product.active }]"
+          )
+            td(class="admin-products__td admin-products__td--checkbox")
+              input(
+                type="checkbox"
+                :checked="isProductSelected(product._id)"
+                @change="toggleProductSelection(product._id)"
+                class="admin-products__checkbox"
+              )
+            td(class="admin-products__td admin-products__td--sku") {{ product.sku }}
+            td(class="admin-products__td admin-products__td--name") {{ product.name }}
+            td(class="admin-products__td") {{ getCategoryName(product.category) }}
+            td(class="admin-products__td admin-products__td--price")
+              span(v-if="product.oldPrice" class="admin-products__old-price") {{ product.oldPrice }} ₽
+              span(class="admin-products__current-price") {{ product.price }} ₽
+            td(class="admin-products__td")
+              span(
+                :class="['admin-products__status', product.active ? 'admin-products__status--active' : 'admin-products__status--inactive']"
+              ) {{ product.active ? 'Активен' : 'Неактивен' }}
+            td(class="admin-products__td admin-products__td--actions")
+              button(
+                @click="editProduct(product)"
+                class="admin-products__action-button admin-products__action-button--edit"
+              ) Редактировать
+              button(
+                @click="toggleProductStatus(product)"
+                :class="['admin-products__action-button', product.active ? 'admin-products__action-button--deactivate' : 'admin-products__action-button--activate']"
+              ) {{ product.active ? 'Деактивировать' : 'Активировать' }}
+
+    div(v-if="filteredProducts.length === 0" class="admin-products__empty")
+      p(class="admin-products__empty-text") Товары не найдены
 
-    div(class="admin-products__list")
-      div(class="admin-products__table-container")
-        table(class="admin-products__table")
-          thead
-            tr
-              th(class="admin-products__th admin-products__th--checkbox")
+  //- Модальное окно редактирования/создания товара
+  div(
+    v-if="showProductModal"
+    class="admin-products__modal"
+  )
+    div(class="admin-products__modal-content admin-products__modal-content--large")
+      div(class="admin-products__modal-header")
+        h2(class="admin-products__modal-title") {{ isEditing ? 'Редактирование товара' : 'Создание товара' }}
+        button(
+          @click="showProductModal = false"
+          class="admin-products__modal-close"
+        ) ×
+      
+      div(class="admin-products__modal-body")
+        div(class="admin-products__form")
+          div(class="admin-products__form-row")
+            div(class="admin-products__form-group")
+              label(class="admin-products__label") Название товара *
+              input(
+                type="text"
+                v-model="productForm.name"
+                class="admin-products__input"
+                placeholder="Введите название товара"
+              )
+            div(class="admin-products__form-group")
+              label(class="admin-products__label") Артикул *
+              input(
+                type="text"
+                v-model="productForm.sku"
+                class="admin-products__input"
+                placeholder="Введите артикул"
+              )
+          
+          div(class="admin-products__form-row")
+            div(class="admin-products__form-group")
+              label(class="admin-products__label") Категория
+              select(v-model="productForm.category" class="admin-products__select")
+                option(value="") Без категории
+                option(
+                  v-for="category in categories"
+                  :value="category._id"
+                ) {{ category.name }}
+            div(class="admin-products__form-group")
+              label(class="admin-products__label") Бренд
+              input(
+                type="text"
+                v-model="productForm.brand"
+                class="admin-products__input"
+                placeholder="Введите бренд"
+              )
+          
+          div(class="admin-products__form-row")
+            div(class="admin-products__form-group")
+              label(class="admin-products__label") Цена *
+              input(
+                type="number"
+                v-model="productForm.price"
+                class="admin-products__input"
+                placeholder="0.00"
+                step="0.01"
+                min="0"
+              )
+            div(class="admin-products__form-group")
+              label(class="admin-products__label") Старая цена
+              input(
+                type="number"
+                v-model="productForm.oldPrice"
+                class="admin-products__input"
+                placeholder="0.00"
+                step="0.01"
+                min="0"
+              )
+          
+          div(class="admin-products__form-group")
+            label(class="admin-products__label") Описание
+            textarea(
+              v-model="productForm.description"
+              class="admin-products__textarea"
+              placeholder="Введите описание товара"
+              rows="4"
+            )
+          
+          //- Управление атрибутами
+          div(class="admin-products__form-group")
+            label(class="admin-products__label") Атрибуты
+            div(class="admin-products__attributes")
+              div(
+                v-for="attr in attributesList"
+                :key="attr.key"
+                class="admin-products__attribute"
+              )
+                div(class="admin-products__attribute-key") {{ attr.key }}
                 input(
-                  type="checkbox"
-                  v-model="selectAll"
-                  @change="toggleSelectAll"
-                  class="admin-products__checkbox"
+                  type="text"
+                  :value="attr.value"
+                  @input="updateAttribute(attr.key, $event.target.value)"
+                  class="admin-products__input admin-products__input--small"
+                  placeholder="Значение"
                 )
-              th(class="admin-products__th") Изобр.
-              th(class="admin-products__th") Название
-              th(class="admin-products__th") Артикул
-              th(class="admin-products__th") Цена
-              th(class="admin-products__th") Категория
-              th(class="admin-products__th") Статус
-              th(class="admin-products__th") Действия
-          tbody
-            tr(
-              v-for="product in filteredProducts"
-              :key="product._id"
-              class="admin-products__tr"
-              :class="{'admin-products__tr--selected': isProductSelected(product._id)}"
-            )
-              td(class="admin-products__td admin-products__td--checkbox")
+                button(
+                  @click="removeAttribute(attr.key)"
+                  class="admin-products__attribute-remove"
+                ) ×
+            
+            div(class="admin-products__attribute-add")
+              input(
+                type="text"
+                v-model="newAttributeKey"
+                class="admin-products__input admin-products__input--small"
+                placeholder="Название атрибута"
+                @keyup.enter="addAttribute"
+              )
+              input(
+                type="text"
+                v-model="newAttributeValue"
+                class="admin-products__input admin-products__input--small"
+                placeholder="Значение"
+                @keyup.enter="addAttribute"
+              )
+              button(
+                @click="addAttribute"
+                class="admin-products__button admin-products__button--secondary"
+              ) Добавить
+          
+          //- Управление тегами
+          div(class="admin-products__form-group")
+            label(class="admin-products__label") Теги
+            div(class="admin-products__tags")
+              span(
+                v-for="(tag, index) in productForm.tags"
+                :key="index"
+                class="admin-products__tag"
+              )
+                | {{ tag }}
+                button(
+                  @click="removeTag(index)"
+                  class="admin-products__tag-remove"
+                ) ×
+            
+            div(class="admin-products__tag-add")
+              input(
+                type="text"
+                v-model="newTag"
+                class="admin-products__input admin-products__input--small"
+                placeholder="Новый тег"
+                @keyup.enter="addTag"
+              )
+              button(
+                @click="addTag"
+                class="admin-products__button admin-products__button--secondary"
+              ) Добавить
+          
+          //- Загрузка основного изображения
+          div(class="admin-products__form-group")
+            label(class="admin-products__label") Основное изображение
+            div(class="admin-products__image-upload")
+              div(v-if="productForm.image" class="admin-products__image-preview")
+                img(:src="productForm.image" class="admin-products__preview-img")
+                div(class="admin-products__image-info") Основное изображение
+              div(class="admin-products__upload-controls")
+                input(
+                  type="text"
+                  v-model="newImageUrl"
+                  class="admin-products__input"
+                  placeholder="Введите URL изображения"
+                )
+                button(
+                  @click="uploadMainImage"
+                  :disabled="uploadingImages || !newImageUrl"
+                  class="admin-products__button admin-products__button--secondary"
+                ) {{ uploadingImages ? 'Загрузка...' : 'Загрузить' }}
+          
+          //- Загрузка дополнительных изображений
+          div(class="admin-products__form-group")
+            label(class="admin-products__label") Дополнительные изображения
+            div(class="admin-products__additional-images")
+              div(
+                v-for="(image, index) in productForm.additionalImages"
+                :key="index"
+                class="admin-products__additional-image"
+              )
+                img(:src="image" class="admin-products__preview-img")
+                button(
+                  @click="removeAdditionalImage(index)"
+                  class="admin-products__image-remove"
+                ) ×
+            
+            div(class="admin-products__upload-controls")
+              input(
+                type="text"
+                v-model="newAdditionalImageUrl"
+                class="admin-products__input"
+                placeholder="Введите URL дополнительного изображения"
+              )
+              button(
+                @click="uploadAdditionalImage"
+                :disabled="uploadingImages || !newAdditionalImageUrl"
+                class="admin-products__button admin-products__button--secondary"
+              ) {{ uploadingImages ? 'Загрузка...' : 'Добавить' }}
+          
+          div(class="admin-products__form-row")
+            div(class="admin-products__form-group")
+              label(class="admin-products__label admin-products__label--checkbox")
                 input(
                   type="checkbox"
-                  :value="product._id"
-                  v-model="selectedProducts"
+                  v-model="productForm.active"
                   class="admin-products__checkbox"
                 )
-              td(class="admin-products__td")
-                img(
-                  v-if="product.image"
-                  :src="product.image"
-                  :alt="product.name"
-                  class="admin-products__image"
-                )
-                div(v-else class="admin-products__no-image") Нет
-              td(class="admin-products__td")
-                div(class="admin-products__name") {{ product.name }}
-              td(class="admin-products__td") {{ product.sku }}
-              td(class="admin-products__td")
-                div(class="admin-products__price") {{ formatPrice(product.price) }}
-                div(
-                  v-if="product.oldPrice"
-                  class="admin-products__old-price"
-                ) {{ formatPrice(product.oldPrice) }}
-              td(class="admin-products__td") {{ getCategoryName(product.category) }}
-              td(class="admin-products__td")
-                span(
-                  :class="getStatusClass(product.active)"
-                ) {{ product.active ? 'Активен' : 'Неактивен' }}
-              td(class="admin-products__td")
-                div(class="admin-products__action-buttons")
-                  button(
-                    @click="editProduct(product)"
-                    class="admin-products__action-btn admin-products__action-btn--edit"
-                  ) Редакт.
-                  button(
-                    @click="toggleProductStatus(product)"
-                    class="admin-products__action-btn admin-products__action-btn--toggle"
-                  ) {{ product.active ? 'Выкл.' : 'Вкл.' }}
-                  button(
-                    @click="deleteProduct(product._id)"
-                    class="admin-products__action-btn admin-products__action-btn--delete"
-                  ) Удалить
-
-  // Модальное окно массового назначения категории
-  div(v-if="showCategoryAssignModal" class="admin-products__modal")
-    div(class="admin-products__modal-content")
-      h3(class="admin-products__modal-title") Назначить категорию для {{ selectedProducts.length }} товаров
+                span Активный товар
       
-      div(class="admin-products__modal-form")
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Категория
-          select(v-model="massCategory" class="admin-products__select")
-            option(value="") Без категории
-            option(
-              v-for="category in categories"
-              :key="category._id"
-              :value="category._id"
-            ) {{ category.name }}
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__checkbox-label")
-            input(
-              v-model="removeExistingCategories"
-              type="checkbox"
-              class="admin-products__checkbox"
-            )
-            span Удалить существующие категории
-      
-      div(class="admin-products__modal-actions")
+      div(class="admin-products__modal-footer")
         button(
-          @click="assignCategoryToSelected"
-          :disabled="!massCategory"
-          class="admin-products__btn admin-products__btn--primary"
-        ) Назначить
+          @click="saveProduct"
+          :disabled="!productForm.name || !productForm.sku || !productForm.price"
+          class="admin-products__button admin-products__button--primary"
+        ) {{ isEditing ? 'Обновить' : 'Создать' }}
         button(
-          @click="showCategoryAssignModal = false"
-          class="admin-products__btn admin-products__btn--secondary"
+          @click="showProductModal = false"
+          class="admin-products__button admin-products__button--secondary"
         ) Отмена
 
-  // Модальное окно массовых действий
-  div(v-if="showMassActionsModal" class="admin-products__modal")
-    div(class="admin-products__modal-content")
-      h3(class="admin-products__modal-title") Массовые действия с товарами
-      
-      div(class="admin-products__mass-actions-grid")
-        div(class="admin-products__mass-action")
-          h4(class="admin-products__mass-action-title") Изменение статуса
-          div(class="admin-products__mass-action-buttons")
-            button(
-              @click="massChangeStatus(true)"
-              class="admin-products__btn admin-products__btn--secondary"
-            ) Активировать все товары
-            button(
-              @click="massChangeStatus(false)"
-              class="admin-products__btn admin-products__btn--secondary"
-            ) Деактивировать все товары
-        
-        div(class="admin-products__mass-action")
-          h4(class="admin-products__mass-action-title") Управление категориями
-          div(class="admin-products__mass-action-buttons")
-            button(
-              @click="showMassCategoryAssign = true"
-              class="admin-products__btn admin-products__btn--secondary"
-            ) Назначить категорию всем
-            button(
-              @click="massRemoveCategories"
-              class="admin-products__btn admin-products__btn--danger"
-            ) Удалить все категории
-        
-        div(class="admin-products__mass-action")
-          h4(class="admin-products__mass-action-title") Цены
-          div(class="admin-products__mass-action-buttons")
-            button(
-              @click="showMassPriceModal = true"
-              class="admin-products__btn admin-products__btn--secondary"
-            ) Массовое изменение цен
-        
-        div(class="admin-products__mass-action")
-          h4(class="admin-products__mass-action-title") Экспорт
-          div(class="admin-products__mass-action-buttons")
-            button(
-              @click="exportProducts"
-              class="admin-products__btn admin-products__btn--primary"
-            ) Экспорт в CSV
-            button(
-              @click="exportSelectedProducts"
-              :disabled="selectedProducts.length === 0"
-              class="admin-products__btn admin-products__btn--primary"
-            ) Экспорт выбранных
-
-      div(class="admin-products__modal-actions")
-        button(
-          @click="showMassActionsModal = false"
-          class="admin-products__btn admin-products__btn--secondary"
-        ) Закрыть
-
-  // Модальное окно массового назначения категории всем товарам
-  div(v-if="showMassCategoryAssign" class="admin-products__modal")
-    div(class="admin-products__modal-content")
-      h3(class="admin-products__modal-title") Назначить категорию всем товарам
-      
-      div(class="admin-products__modal-form")
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Категория
-          select(v-model="massAllCategory" class="admin-products__select")
-            option(value="") Без категории
-            option(
-              v-for="category in categories"
-              :key="category._id"
-              :value="category._id"
-            ) {{ category.name }}
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__checkbox-label")
-            input(
-              v-model="massRemoveAllCategories"
-              type="checkbox"
-              class="admin-products__checkbox"
-            )
-            span Удалить существующие категории у всех товаров
-      
-      div(class="admin-products__modal-actions")
-        button(
-          @click="assignCategoryToAll"
-          :disabled="!massAllCategory"
-          class="admin-products__btn admin-products__btn--primary"
-        ) Назначить всем
+  //- Модальное окно управления категориями
+  div(
+    v-if="showCategoriesModal"
+    class="admin-products__modal"
+  )
+    div(class="admin-products__modal-content admin-products__modal-content--large")
+      div(class="admin-products__modal-header")
+        h2(class="admin-products__modal-title") Управление категориями
         button(
-          @click="showMassCategoryAssign = false"
-          class="admin-products__btn admin-products__btn--secondary"
-        ) Отмена
-
-  // Модальное окно массового изменения цен
-  div(v-if="showMassPriceModal" class="admin-products__modal")
-    div(class="admin-products__modal-content")
-      h3(class="admin-products__modal-title") Массовое изменение цен
+          @click="showCategoriesModal = false"
+          class="admin-products__modal-close"
+        ) ×
       
-      div(class="admin-products__modal-form")
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Тип изменения
-          select(v-model="priceChangeType" class="admin-products__select")
-            option(value="fixed") Фиксированная цена
-            option(value="percent") Изменить на процент
-            option(value="increase") Увеличить на сумму
-            option(value="decrease") Уменьшить на сумму
+      div(class="admin-products__modal-body")
+        div(class="admin-products__categories-header")
+          button(
+            @click="createCategory"
+            class="admin-products__button admin-products__button--primary"
+          ) Создать категорию
         
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Значение
-          input(
-            v-model="priceChangeValue"
-            type="number"
-            class="admin-products__input"
-            placeholder="Введите значение"
-            step="0.01"
+        div(class="admin-products__categories-list")
+          div(
+            v-for="category in categories"
+            :key="category._id"
+            class="admin-products__category-item"
           )
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__checkbox-label")
-            input(
-              v-model="applyToOldPrice"
-              type="checkbox"
-              class="admin-products__checkbox"
-            )
-            span Применить к старой цене
-      
-      div(class="admin-products__modal-actions")
-        button(
-          @click="applyMassPriceChange"
-          :disabled="!priceChangeValue"
-          class="admin-products__btn admin-products__btn--primary"
-        ) Применить
-        button(
-          @click="showMassPriceModal = false"
-          class="admin-products__btn admin-products__btn--secondary"
-        ) Отмена
-
+            div(class="admin-products__category-info")
+              div(class="admin-products__category-name") {{ category.name }}
+              div(class="admin-products__category-meta")
+                span Товаров: {{ getCategoryProductCount(category._id) }}
+                span(v-if="category.slug") Slug: {{ category.slug }}
+            div(class="admin-products__category-actions")
+              button(
+                @click="editCategory(category)"
+                class="admin-products__action-button admin-products__action-button--edit"
+              ) Редактировать
+              button(
+                @click="deleteCategory(category)"
+                class="admin-products__action-button admin-products__action-button--danger"
+              ) Удалить
 
-  // Модальное окно редактирования товара
-  div(v-if="showProductModal" class="admin-products__modal")
+  //- Модальное окно редактирования/создания категории
+  div(
+    v-if="showCategoryModal"
+    class="admin-products__modal"
+  )
     div(class="admin-products__modal-content")
-      h3(class="admin-products__modal-title") {{ editingProduct ? 'Редактирование' : 'Добавление' }} товара
+      div(class="admin-products__modal-header")
+        h2(class="admin-products__modal-title") {{ editingCategory ? 'Редактирование категории' : 'Создание категории' }}
+        button(
+          @click="showCategoryModal = false"
+          class="admin-products__modal-close"
+        ) ×
       
-      div(class="admin-products__modal-form")
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Название товара *
-          input(
-            v-model="productForm.name"
-            type="text"
-            class="admin-products__input"
-            placeholder="Введите название товара"
-            required
-          )
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Артикул *
-          input(
-            v-model="productForm.sku"
-            type="text"
-            class="admin-products__input"
-            placeholder="Артикул товара"
-            required
-          )
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Категория
-          select(v-model="productForm.category" class="admin-products__select")
-            option(value="") Выберите категорию
-            option(
-              v-for="category in categories"
-              :key="category._id"
-              :value="category._id"
-            ) {{ category.name }}
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Цена *
-          input(
-            v-model="productForm.price"
-            type="number"
-            class="admin-products__input"
-            placeholder="0.00"
-            min="0"
-            step="0.01"
-            required
-          )
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Старая цена
-          input(
-            v-model="productForm.oldPrice"
-            type="number"
-            class="admin-products__input"
-            placeholder="0.00"
-            min="0"
-            step="0.01"
-          )
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Бренд
-          input(
-            v-model="productForm.brand"
-            type="text"
-            class="admin-products__input"
-            placeholder="Бренд производителя"
-          )
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Описание
-          textarea(
-            v-model="productForm.description"
-            class="admin-products__textarea"
-            placeholder="Описание товара"
-            rows="4"
-          )
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Изображение товара
-          div(class="admin-products__image-upload")
-            div(v-if="productForm.image" class="admin-products__image-preview")
-              img(:src="productForm.image" :alt="productForm.name" class="admin-products__preview-image")
-              button(
-                @click="removeProductImage"
-                class="admin-products__btn admin-products__btn--danger"
-              ) Удалить
-            div(v-else class="admin-products__image-placeholder") Изображение не загружено
-            
+      div(class="admin-products__modal-body")
+        div(class="admin-products__form")
+          div(class="admin-products__form-group")
+            label(class="admin-products__label") Название категории *
             input(
-              type="file"
-              ref="productImageInput"
-              @change="onProductImageUpload"
-              accept="image/*"
-              class="admin-products__file-input"
-              id="product-image-upload"
+              type="text"
+              v-model="categoryForm.name"
+              class="admin-products__input"
+              placeholder="Введите название категории"
             )
-            label(for="product-image-upload" class="admin-products__btn admin-products__btn--secondary") Выбрать изображение
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__checkbox-label")
+          
+          div(class="admin-products__form-group")
+            label(class="admin-products__label") Slug
             input(
-              v-model="productForm.active"
-              type="checkbox"
-              class="admin-products__checkbox"
+              type="text"
+              v-model="categoryForm.slug"
+              class="admin-products__input"
+              placeholder="Автоматически сгенерируется из названия"
             )
-            span Активный товар
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Домены
-          div(class="admin-products__domains-list")
-            label(
-              v-for="domain in availableDomains"
-              :key="domain._id"
-              class="admin-products__domain-label"
+          
+          div(class="admin-products__form-group")
+            label(class="admin-products__label") Описание
+            textarea(
+              v-model="categoryForm.description"
+              class="admin-products__textarea"
+              placeholder="Введите описание категории"
+              rows="3"
             )
+          
+          div(class="admin-products__form-row")
+            div(class="admin-products__form-group")
+              label(class="admin-products__label") Родительская категория
+              select(v-model="categoryForm.parentCategory" class="admin-products__select")
+                option(value="") Нет
+                option(
+                  v-for="category in categories"
+                  :value="category._id"
+                  v-if="category._id != editingCategory?._id"
+                ) {{ category.name }}
+            
+            div(class="admin-products__form-group")
+              label(class="admin-products__label") Порядок сортировки
+              input(
+                type="number"
+                v-model="categoryForm.sortOrder"
+                class="admin-products__input"
+                placeholder="0"
+              )
+          
+          div(class="admin-products__form-group")
+            label(class="admin-products__label admin-products__label--checkbox")
               input(
                 type="checkbox"
-                :value="domain.domain"
-                v-model="productForm.domains"
-                class="admin-products__domain-checkbox"
+                v-model="categoryForm.active"
+                class="admin-products__checkbox"
               )
-              span {{ domain.domain }}
+              span Активная категория
       
-      div(class="admin-products__modal-actions")
+      div(class="admin-products__modal-footer")
         button(
-          @click="saveProduct"
-          class="admin-products__btn admin-products__btn--primary"
-        ) {{ editingProduct ? 'Обновить' : 'Создать' }}
+          @click="saveCategory"
+          :disabled="!categoryForm.name"
+          class="admin-products__button admin-products__button--primary"
+        ) {{ editingCategory ? 'Обновить' : 'Создать' }}
         button(
-          @click="showProductModal = false"
-          class="admin-products__btn admin-products__btn--secondary"
+          @click="showCategoryModal = false"
+          class="admin-products__button admin-products__button--secondary"
         ) Отмена
 
-  // Модальное окно импорта
-  div(v-if="showImportModal" class="admin-products__modal")
+  //- Модальное окно импорта
+  div(
+    v-if="showImportModal"
+    class="admin-products__modal"
+  )
     div(class="admin-products__modal-content")
-      h3(class="admin-products__modal-title") Импорт товаров из CSV
+      div(class="admin-products__modal-header")
+        h2(class="admin-products__modal-title") Импорт товаров из CSV
+        button(
+          @click="showImportModal = false"
+          class="admin-products__modal-close"
+        ) ×
       
-      div(class="admin-products__import-form")
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Выберите CSV файл
+      div(class="admin-products__modal-body")
+        div(v-if="importing" class="admin-products__import-progress")
+          div(class="admin-products__progress-bar")
+            div(
+              :style="{ width: importProgress + '%' }"
+              class="admin-products__progress-fill"
+            )
+          p(class="admin-products__progress-text") Обработано: {{ processedCount }} из {{ totalCount }} ({{ importProgress }}%)
+        
+        div(v-else class="admin-products__import-form")
           input(
             type="file"
             @change="onFileSelect"
             accept=".csv"
             class="admin-products__file-input"
           )
-          p(class="admin-products__help-text") Поддерживается формат CSV с разделителем ; и кодировкой UTF-8
-        
-        div(v-if="selectedFile" class="admin-products__file-info")
-          p Выбран файл: {{ selectedFile.name }}
-          button(
-            @click="importProducts"
-            :disabled="importing"
-            class="admin-products__btn admin-products__btn--primary"
-          ) {{ importing ? 'Импорт...' : 'Начать импорт' }}
+          p(class="admin-products__help-text") Поддерживается формат CSV с разделителем ";" и кодировкой UTF-8
         
         div(v-if="importResults" class="admin-products__import-results")
-          h4(v-if="importResults.success" class="admin-products__success") Импорт успешно завершен!
-          h4(v-else class="admin-products__error") Ошибка импорта
-          p Обработано товаров: {{ importResults.processed }}
-          p(v-if="importResults.errors && importResults.errors.length")
-            strong Ошибки:
-            ul
-              li(v-for="error in importResults.errors" :key="error") {{ error }}
-          p(v-if="importResults.error") Ошибка: {{ importResults.error }}
+          div(
+            v-if="importResults.success"
+            class="admin-products__result admin-products__result--success"
+          )
+            h3 Успешно импортировано!
+            p Обработано товаров: {{ importResults.processed }} из {{ importResults.total }}
+            ul(v-if="importResults.errors.length > 0")
+              li(v-for="error in importResults.errors") {{ error }}
+          div(
+            v-else
+            class="admin-products__result admin-products__result--error"
+          )
+            h3 Ошибка импорта!
+            p {{ importResults.error }}
       
-      div(class="admin-products__modal-actions")
+      div(class="admin-products__modal-footer")
+        button(
+          @click="importProducts"
+          :disabled="!selectedFile || importing"
+          class="admin-products__button admin-products__button--primary"
+        ) {{ importing ? 'Импорт...' : 'Начать импорт' }}
         button(
           @click="showImportModal = false"
-          class="admin-products__btn admin-products__btn--secondary"
-        ) Закрыть
+          class="admin-products__button admin-products__button--secondary"
+        ) Отмена
 
-  // Модальное окно управления категориями
-  div(v-if="showCategoriesModal" class="admin-products__modal")
-    div(class="admin-products__modal-content admin-products__modal-content--large")
-      h3(class="admin-products__modal-title") Управление категориями
-      
-      div(class="admin-products__categories-tabs")
-        button(
-          @click="categoriesActiveTab = 'list'"
-          :class="getCategoriesTabClass('list')"
-        ) Список категорий
+  //- Модальное окно массовых действий
+  div(
+    v-if="showMassActionsModal"
+    class="admin-products__modal"
+  )
+    div(class="admin-products__modal-content")
+      div(class="admin-products__modal-header")
+        h2(class="admin-products__modal-title") Массовые действия ({{ selectedProducts.length }} товаров)
         button(
-          @click="categoriesActiveTab = 'import'"
-          :class="getCategoriesTabClass('import')"
-        ) Импорт категорий
+          @click="showMassActionsModal = false"
+          class="admin-products__modal-close"
+        ) ×
       
-      // Список категорий
-      div(v-if="categoriesActiveTab === 'list'" class="admin-products__categories-list")
-        div(class="admin-products__categories-header")
+      div(class="admin-products__modal-body")
+        div(class="admin-products__mass-actions")
           button(
-            @click="showCategoryModal = true"
-            class="admin-products__btn admin-products__btn--primary"
-          ) Добавить категорию
-        
-        div(class="admin-products__categories-grid")
-          div(
-            v-for="category in categories"
-            :key="category._id"
-            class="admin-products__category-item"
-          )
-            div(class="admin-products__category-preview")
-              img(
-                v-if="category.image"
-                :src="category.image"
-                :alt="category.name"
-                class="admin-products__category-image"
-              )
-              div(v-else class="admin-products__category-no-image") Нет изображения
-              div(class="admin-products__category-info")
-                h4(class="admin-products__category-name") {{ category.name }}
-                p(class="admin-products__category-description") {{ category.description || 'Без описания' }}
-                div(class="admin-products__category-meta")
-                  span(class="admin-products__category-products") Товаров: {{ getCategoryProductCount(category._id) }}
-                  span(
-                    :class="getStatusClass(category.active)"
-                  ) {{ category.active ? 'Активна' : 'Неактивна' }}
-            
-            div(class="admin-products__category-actions")
-              button(
-                @click="editCategory(category)"
-                class="admin-products__btn admin-products__btn--edit"
-              ) Редактировать
-              button(
-                @click="deleteCategory(category._id)"
-                class="admin-products__btn admin-products__btn--delete"
-              ) Удалить
-      
-      // Импорт категорий
-      div(v-if="categoriesActiveTab === 'import'" class="admin-products__categories-import")
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Выберите CSV файл категорий
-          input(
-            type="file"
-            @change="onCategoriesFileSelect"
-            accept=".csv"
-            class="admin-products__file-input"
-          )
-          p(class="admin-products__help-text") Формат CSV с полями: name, slug, description, parentCategory, sortOrder, active
-        
-        div(v-if="selectedCategoriesFile" class="admin-products__file-info")
-          p Выбран файл: {{ selectedCategoriesFile.name }}
+            @click="activateSelected"
+            class="admin-products__button admin-products__button--success"
+          ) Активировать
           button(
-            @click="importCategories"
-            :disabled="importingCategories"
-            class="admin-products__btn admin-products__btn--primary"
-          ) {{ importingCategories ? 'Импорт...' : 'Импорт категорий' }}
-        
-        div(v-if="categoriesImportResults" class="admin-products__import-results")
-          h4(v-if="categoriesImportResults.success" class="admin-products__success") Импорт категорий завершен!
-          h4(v-else class="admin-products__error") Ошибка импорта категорий
-          p Обработано категорий: {{ categoriesImportResults.processed }}
-          p(v-if="categoriesImportResults.errors && categoriesImportResults.errors.length")
-            strong Ошибки:
-            ul
-              li(v-for="error in categoriesImportResults.errors" :key="error") {{ error }}
+            @click="deactivateSelected"
+            class="admin-products__button admin-products__button--warning"
+          ) Деактивировать
+          button(
+            @click="deleteSelected"
+            class="admin-products__button admin-products__button--danger"
+          ) Удалить
       
-      div(class="admin-products__modal-actions")
+      div(class="admin-products__modal-footer")
         button(
-          @click="showCategoriesModal = false"
-          class="admin-products__btn admin-products__btn--secondary"
+          @click="showMassActionsModal = false"
+          class="admin-products__button admin-products__button--secondary"
         ) Закрыть
-
-  // Модальное окно редактирования категории
-  div(v-if="showCategoryModal" class="admin-products__modal")
-    div(class="admin-products__modal-content")
-      h3(class="admin-products__modal-title") {{ editingCategory ? 'Редактирование' : 'Добавление' }} категории
-      
-      div(class="admin-products__modal-form")
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Название категории *
-          input(
-            v-model="categoryForm.name"
-            type="text"
-            class="admin-products__input"
-            placeholder="Введите название категории"
-            required
-          )
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") URL slug *
-          input(
-            v-model="categoryForm.slug"
-            type="text"
-            class="admin-products__input"
-            placeholder="url-slug"
-            required
-          )
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Описание
-          textarea(
-            v-model="categoryForm.description"
-            class="admin-products__textarea"
-            placeholder="Описание категории"
-            rows="3"
-          )
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Родительская категория
-          select(v-model="categoryForm.parentCategory" class="admin-products__select")
-            option(value="") Без родительской категории
-            option(
-              v-for="cat in categories.filter(c => c._id !== editingCategory?._id)"
-              :key="cat._id"
-              :value="cat._id"
-            ) {{ cat.name }}
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Порядок сортировки
-          input(
-            v-model="categoryForm.sortOrder"
-            type="number"
-            class="admin-products__input"
-            placeholder="0"
-            min="0"
-          )
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Изображение категории
-          div(class="admin-products__image-upload")
-            div(v-if="categoryForm.image" class="admin-products__image-preview")
-              img(:src="categoryForm.image" :alt="categoryForm.name" class="admin-products__preview-image")
-              button(
-                @click="removeCategoryImage"
-                class="admin-products__btn admin-products__btn--danger"
-              ) Удалить
-            div(v-else class="admin-products__image-placeholder") Изображение не загружено
-            
-            input(
-              type="file"
-              ref="categoryImageInput"
-              @change="onCategoryImageUpload"
-              accept="image/*"
-              class="admin-products__file-input"
-              id="category-image-upload"
-            )
-            label(for="category-image-upload" class="admin-products__btn admin-products__btn--secondary") Выбрать изображение
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Иконка для меню
-          div(class="admin-products__image-upload")
-            div(v-if="categoryForm.icon" class="admin-products__image-preview admin-products__image-preview--small")
-              img(:src="categoryForm.icon" :alt="categoryForm.name" class="admin-products__preview-image")
-              button(
-                @click="removeCategoryIcon"
-                class="admin-products__btn admin-products__btn--danger"
-              ) Удалить
-            div(v-else class="admin-products__image-placeholder") Иконка не загружена
-            
-            input(
-              type="file"
-              ref="categoryIconInput"
-              @change="onCategoryIconUpload"
-              accept="image/*"
-              class="admin-products__file-input"
-              id="category-icon-upload"
-            )
-            label(for="category-icon-upload" class="admin-products__btn admin-products__btn--secondary") Выбрать иконку
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__checkbox-label")
-            input(
-              v-model="categoryForm.active"
-              type="checkbox"
-              class="admin-products__checkbox"
-            )
-            span Активная категория
-        
-        div(class="admin-products__form-group")
-          label(class="admin-products__label") Домены
-          div(class="admin-products__domains-list")
-            label(
-              v-for="domain in availableDomains"
-              :key="domain._id"
-              class="admin-products__domain-label"
-            )
-              input(
-                type="checkbox"
-                :value="domain.domain"
-                v-model="categoryForm.domains"
-                class="admin-products__domain-checkbox"
-              )
-              span {{ domain.domain }}
-      
-      div(class="admin-products__modal-actions")
-        button(
-          @click="saveCategory"
-          class="admin-products__btn admin-products__btn--primary"
-        ) {{ editingCategory ? 'Обновить' : 'Создать' }}
-        button(
-          @click="showCategoryModal = false"
-          class="admin-products__btn admin-products__btn--secondary"
-        ) Отмена

+ 641 - 746
app/pages/Admin/Products/index.styl

@@ -1,785 +1,680 @@
-// Admin Products styles
 .admin-products
-  display: flex
-  flex-direction: column
-  gap: 1.5rem
-
-.admin-products__header
-  display: flex
-  justify-content: space-between
-  align-items: center
-  border-bottom: 1px solid var(--color-gray-200)
-  padding-bottom: 1.5rem
-
-  .dark &
-    border-bottom-color: var(--color-gray-700)
-
-.admin-products__title
-  font-size: 1.875rem
-  font-weight: bold
-  color: var(--color-gray-900)
-
-  .dark &
-    color: var(--color-white)
-
-.admin-products__actions
-  display: flex
-  gap: 0.75rem
-
-// Button styles
-.admin-products__btn
-  padding: 0.5rem 1rem
-  border-radius: 0.5rem
-  font-weight: 500
-  font-size: 0.875rem
-  transition: all 0.2s ease-in-out
-  border: none
-  cursor: pointer
-  text-decoration: none
-  display: inline-flex
-  align-items: center
-  justify-content: center
-
-  &:focus
-    outline: none
-    box-shadow: 0 0 0 2px var(--color-primary-500-a20)
-
-.admin-products__btn--primary
-  background-color: var(--color-primary-600)
-  color: var(--color-white)
-
-  &:hover
-    background-color: var(--color-primary-700)
-
-.admin-products__btn--secondary
-  background-color: var(--color-gray-200)
-  color: var(--color-gray-700)
-
-  &:hover
-    background-color: var(--color-gray-300)
-
-  .dark &
-    background-color: var(--color-gray-700)
-    color: var(--color-gray-300)
+  padding: 20px
+  background: #f8f9fa
+  min-height: 100vh
+
+  &__header
+    display: flex
+    justify-content: space-between
+    align-items: center
+    margin-bottom: 24px
+    padding: 24px
+    background: white
+    border-radius: 8px
+    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1)
+
+  &__title
+    font-size: 24px
+    font-weight: 600
+    color: #1f2937
+    margin: 0
+
+  &__actions
+    display: flex
+    gap: 12px
+
+  &__button
+    padding: 10px 16px
+    border: none
+    border-radius: 6px
+    font-size: 14px
+    font-weight: 500
+    cursor: pointer
+    transition: all 0.2s ease
+    text-decoration: none
+    display: inline-flex
+    align-items: center
+    gap: 8px
+
+    &--primary
+      background: #3b82f6
+      color: white
+
+      &:hover
+        background: #2563eb
+
+    &--secondary
+      background: #6b7280
+      color: white
+
+      &:hover
+        background: #4b5563
+
+    &--success
+      background: #10b981
+      color: white
+
+      &:hover
+        background: #059669
+
+    &--warning
+      background: #f59e0b
+      color: white
+
+      &:hover
+        background: #d97706
+
+    &--danger
+      background: #ef4444
+      color: white
+
+      &:hover
+        background: #dc2626
+
+    &:disabled
+      opacity: 0.6
+      cursor: not-allowed
+
+  &__filters
+    display: flex
+    gap: 16px
+    margin-bottom: 24px
+    padding: 20px
+    background: white
+    border-radius: 8px
+    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1)
+
+  &__search
+    flex: 1
+
+    &-input
+      width: 100%
+      padding: 10px 12px
+      border: 1px solid #d1d5db
+      border-radius: 6px
+      font-size: 14px
+      transition: border-color 0.2s ease
+
+      &:focus
+        outline: none
+        border-color: #3b82f6
+        box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1)
+
+  &__filter-group
+    display: flex
+    gap: 12px
+
+  &__select
+    padding: 10px 12px
+    border: 1px solid #d1d5db
+    border-radius: 6px
+    font-size: 14px
+    background: white
+    cursor: pointer
+    transition: border-color 0.2s ease
 
-    &:hover
-      background-color: var(--color-gray-600)
+    &:focus
+      outline: none
+      border-color: #3b82f6
+      box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1)
 
-.admin-products__btn--danger
-  background-color: #dc2626
-  color: var(--color-white)
+  &__content
+    background: white
+    border-radius: 8px
+    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1)
+    overflow: hidden
 
-  &:hover
-    background-color: #b91c1c
+  &__table-container
+    overflow-x: auto
+
+  &__table
+    width: 100%
+    border-collapse: collapse
 
-.admin-products__btn--edit
-  background-color: #dbeafe
-  color: #1e40af
+  &__th
+    padding: 16px
+    text-align: left
+    font-weight: 600
+    color: #374151
+    border-bottom: 1px solid #e5e7eb
+    background: #f9fafb
 
-  &:hover
-    background-color: #bfdbfe
+    &--checkbox
+      width: 40px
 
-  .dark &
-    background-color: #1e3a8a
-    color: #93c5fd
+  &__tr
+    border-bottom: 1px solid #e5e7eb
+    transition: background-color 0.2s ease
 
     &:hover
-      background-color: #1e40af
-
-// Content area
-.admin-products__content
-  background-color: var(--color-white)
-  border-radius: 0.5rem
-  box-shadow: 0 1px 3px 0 var(--color-shadow-light)
-  padding: 1.5rem
-
-  .dark &
-    background-color: var(--color-gray-800)
-
-// Filters
-.admin-products__filters
-  display: grid
-  grid-template-columns: 1fr
-  gap: 1rem
-  margin-bottom: 1.5rem
-
-  @media (min-width: 768px)
-    grid-template-columns: repeat(3, 1fr)
-
-.admin-products__filter-group
-  display: flex
-  flex-direction: column
-  gap: 0.5rem
-
-.admin-products__label
-  display: block
-  font-size: 0.875rem
-  font-weight: 500
-  color: var(--color-gray-700)
-
-  .dark &
-    color: var(--color-gray-300)
-
-.admin-products__input
-  width: 100%
-  padding: 0.5rem 0.75rem
-  border: 1px solid var(--color-gray-300)
-  border-radius: 0.5rem
-  background-color: var(--color-white)
-  color: var(--color-gray-900)
-  font-size: 0.875rem
-  transition: all 0.2s ease-in-out
-
-  &:focus
-    outline: none
-    border-color: var(--color-primary-500)
-    box-shadow: 0 0 0 2px var(--color-primary-500-a20)
-
-  .dark &
-    background-color: var(--color-gray-700)
-    color: var(--color-white)
-    border-color: var(--color-gray-600)
+      background: #f9fafb
+
+    &--inactive
+      opacity: 0.6
+
+  &__td
+    padding: 16px
+    border-bottom: 1px solid #e5e7eb
+
+    &--checkbox
+      width: 40px
+
+    &--sku
+      font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace
+      font-size: 12px
+      color: #6b7280
+
+    &--name
+      font-weight: 500
+      color: #1f2937
+
+    &--price
+      text-align: right
+
+    &--actions
+      display: flex
+      gap: 8px
+
+  &__checkbox
+    width: 16px
+    height: 16px
+    cursor: pointer
+
+  &__old-price
+    text-decoration: line-through
+    color: #6b7280
+    font-size: 12px
+    margin-right: 8px
+
+  &__current-price
+    font-weight: 600
+    color: #1f2937
+
+  &__status
+    padding: 4px 8px
+    border-radius: 12px
+    font-size: 12px
+    font-weight: 500
+
+    &--active
+      background: #d1fae5
+      color: #065f46
+
+    &--inactive
+      background: #fee2e2
+      color: #991b1b
+
+  &__action-button
+    padding: 6px 12px
+    border: none
+    border-radius: 4px
+    font-size: 12px
+    font-weight: 500
+    cursor: pointer
+    transition: all 0.2s ease
+
+    &--edit
+      background: #dbeafe
+      color: #1e40af
+
+      &:hover
+        background: #bfdbfe
+
+    &--activate
+      background: #d1fae5
+      color: #065f46
+
+      &:hover
+        background: #a7f3d0
+
+    &--deactivate
+      background: #fef3c7
+      color: #92400e
+
+      &:hover
+        background: #fde68a
+
+  &__empty
+    padding: 60px 20px
+    text-align: center
 
-    &:focus
-      border-color: var(--color-primary-500)
-
-.admin-products__select
-  @extend .admin-products__input
-
-.admin-products__textarea
-  @extend .admin-products__input
-  resize: vertical
-  min-height: 5rem
-
-// Table styles
-.admin-products__table-container
-  overflow-x: auto
-
-.admin-products__table
-  width: 100%
-  border-collapse: collapse
-  background-color: var(--color-white)
-
-  .dark &
-    background-color: var(--color-gray-800)
-
-.admin-products__th
-  background-color: var(--color-gray-50)
-  padding: 0.75rem 1rem
-  text-align: left
-  font-size: 0.75rem
-  font-weight: 500
-  color: var(--color-gray-500)
-  text-transform: uppercase
-  letter-spacing: 0.05em
-  border-bottom: 1px solid var(--color-gray-200)
-
-  .dark &
-    background-color: var(--color-gray-700)
-    color: var(--color-gray-300)
-    border-bottom-color: var(--color-gray-600)
-
-.admin-products__tr
-  &:hover
-    background-color: var(--color-background-hover)
-
-    .dark &
-      background-color: var(--color-dark-background-hover)
-
-.admin-products__td
-  padding: 0.75rem 1rem
-  border-bottom: 1px solid var(--color-gray-200)
-  font-size: 0.875rem
-
-  .dark &
-    border-bottom-color: var(--color-gray-600)
-
-.admin-products__image
-  width: 2.5rem
-  height: 2.5rem
-  object-fit: cover
-  border-radius: 0.25rem
-
-.admin-products__no-image
-  width: 2.5rem
-  height: 2.5rem
-  background-color: var(--color-gray-200)
-  border-radius: 0.25rem
-  display: flex
-  align-items: center
-  justify-content: center
-  font-size: 0.75rem
-  color: var(--color-gray-500)
-
-  .dark &
-    background-color: var(--color-gray-600)
-    color: var(--color-gray-400)
-
-.admin-products__name
-  font-weight: 500
-  color: var(--color-gray-900)
-
-  .dark &
-    color: var(--color-white)
-
-.admin-products__price
-  font-weight: 500
-  color: #16a34a
-
-  .dark &
-    color: #4ade80
-
-.admin-products__old-price
-  font-size: 0.75rem
-  color: var(--color-gray-500)
-  text-decoration: line-through
-
-  .dark &
-    color: var(--color-gray-400)
-
-.admin-products__status
-  padding: 0.25rem 0.5rem
-  border-radius: 0.25rem
-  font-size: 0.75rem
-  font-weight: 500
-
-.admin-products__status--active
-  background-color: var(--color-primary-500-a10)
-  color: #16a34a
-
-  .dark &
-    background-color: #14532d
-    color: #4ade80
-
-.admin-products__status--inactive
-  background-color: var(--color-primary-500-a10)
-  color: #dc2626
-
-  .dark &
-    background-color: #7f1d1d
-    color: #fca5a5
-
-.admin-products__action-buttons
-  display: flex
-  gap: 0.5rem
-
-.admin-products__action-btn
-  padding: 0.25rem 0.5rem
-  border-radius: 0.25rem
-  font-size: 0.75rem
-  font-weight: 500
-  transition: all 0.2s ease-in-out
-  border: none
-  cursor: pointer
-
-.admin-products__action-btn--edit
-  background-color: var(--color-accent-500-a20)
-  color: #1e40af
-
-  &:hover
-    background-color: var(--color-accent-500-a30)
-
-  .dark &
-    background-color: #1e3a8a
-    color: #93c5fd
+    &-text
+      color: #6b7280
+      font-size: 16px
+      margin: 0
+
+  &__modal
+    position: fixed
+    top: 0
+    left: 0
+    right: 0
+    bottom: 0
+    background: rgba(0, 0, 0, 0.5)
+    display: flex
+    align-items: center
+    justify-content: center
+    z-index: 1000
+
+  &__modal-content
+    background: white
+    border-radius: 8px
+    width: 90%
+    max-width: 600px
+    max-height: 90vh
+    overflow-y: auto
+
+  &__modal-header
+    display: flex
+    justify-content: space-between
+    align-items: center
+    padding: 24px
+    border-bottom: 1px solid #e5e7eb
+
+  &__modal-title
+    font-size: 20px
+    font-weight: 600
+    color: #1f2937
+    margin: 0
+
+  &__modal-close
+    background: none
+    border: none
+    font-size: 24px
+    cursor: pointer
+    color: #6b7280
+    padding: 0
+    width: 30px
+    height: 30px
+    display: flex
+    align-items: center
+    justify-content: center
 
     &:hover
-      background-color: #1e40af
+      color: #374151
 
-.admin-products__action-btn--toggle
-  background-color: var(--color-gray-100)
-  color: var(--color-gray-700)
+  &__modal-body
+    padding: 24px
 
-  &:hover
-    background-color: var(--color-gray-200)
+  &__modal-footer
+    display: flex
+    justify-content: flex-end
+    gap: 12px
+    padding: 24px
+    border-top: 1px solid #e5e7eb
 
-  .dark &
-    background-color: var(--color-gray-600)
-    color: var(--color-gray-300)
+  &__import-progress
+    text-align: center
 
-    &:hover
-      background-color: var(--color-gray-500)
+  &__progress-bar
+    width: 100%
+    height: 8px
+    background: #e5e7eb
+    border-radius: 4px
+    overflow: hidden
+    margin-bottom: 12px
+
+  &__progress-fill
+    height: 100%
+    background: #3b82f6
+    transition: width 0.3s ease
+
+  &__progress-text
+    color: #6b7280
+    font-size: 14px
+    margin: 0
+
+  &__import-form
+    text-align: center
 
-.admin-products__action-btn--delete
-  background-color: var(--color-primary-500-a10)
-  color: #dc2626
+  &__file-input
+    width: 100%
+    padding: 12px
+    border: 2px dashed #d1d5db
+    border-radius: 6px
+    margin-bottom: 12px
 
-  &:hover
-    background-color: var(--color-primary-500-a20)
+    &:focus
+      outline: none
+      border-color: #3b82f6
 
-  .dark &
-    background-color: #7f1d1d
-    color: #fca5a5
+  &__help-text
+    color: #6b7280
+    font-size: 14px
+    margin: 0
 
-    &:hover
-      background-color: #991b1b
-
-// Modal styles
-.admin-products__modal
-  position: fixed
-  inset: 0
-  background-color: var(--color-background-overlay)
-  display: flex
-  align-items: center
-  justify-content: center
-  z-index: 50
-
-.admin-products__modal-content
-  background-color: var(--color-white)
-  border-radius: 0.5rem
-  padding: 1.5rem
-  max-width: 48rem
-  width: 100%
-  margin: 0 1rem
-  max-height: 90vh
-  overflow-y: auto
-
-  .dark &
-    background-color: var(--color-gray-800)
-
-  &.admin-products__modal-content--large
-    max-width: 64rem
-
-.admin-products__modal-title
-  font-size: 1.125rem
-  font-weight: 500
-  color: var(--color-gray-900)
-  margin-bottom: 1rem
-
-  .dark &
-    color: var(--color-white)
-
-.admin-products__modal-form
-  display: flex
-  flex-direction: column
-  gap: 1rem
-  margin-bottom: 1.5rem
-
-.admin-products__form-group
-  display: flex
-  flex-direction: column
-  gap: 0.5rem
-
-// Image upload styles
-.admin-products__image-upload
-  display: flex
-  flex-direction: column
-  gap: 0.75rem
-
-.admin-products__image-preview
-  position: relative
-  width: 100%
-  max-width: 200px
-  border: 1px solid var(--color-gray-300)
-  border-radius: 0.5rem
-  overflow: hidden
-
-  &.admin-products__image-preview--small
-    max-width: 100px
-
-  .dark &
-    border-color: var(--color-gray-600)
-
-.admin-products__preview-image
-  width: 100%
-  height: auto
-  display: block
-
-.admin-products__image-placeholder
-  padding: 2rem
-  background-color: var(--color-gray-100)
-  border: 1px dashed var(--color-gray-300)
-  border-radius: 0.5rem
-  text-align: center
-  color: var(--color-gray-500)
-  font-size: 0.875rem
-
-  .dark &
-    background-color: var(--color-gray-700)
-    border-color: var(--color-gray-600)
-    color: var(--color-gray-400)
-
-.admin-products__file-input
-  display: none
-
-// Checkbox and domain styles
-.admin-products__checkbox-label
-  display: flex
-  align-items: center
-  gap: 0.5rem
-  color: var(--color-gray-700)
-  font-size: 0.875rem
-
-  .dark &
-    color: var(--color-gray-300)
-
-.admin-products__checkbox
-  border-radius: 0.25rem
-  border: 1px solid var(--color-gray-300)
-  background-color: var(--color-white)
-  color: var(--color-primary-600)
-
-  &:focus
-    border-color: var(--color-primary-500)
-    box-shadow: 0 0 0 2px var(--color-primary-500-a20)
-
-  .dark &
-    background-color: var(--color-gray-700)
-    border-color: var(--color-gray-600)
-
-.admin-products__domains-list
-  display: grid
-  grid-template-columns: repeat(2, 1fr)
-  gap: 0.5rem
-
-.admin-products__domain-label
-  display: flex
-  align-items: center
-  gap: 0.5rem
-  font-size: 0.875rem
-  color: var(--color-gray-700)
-
-  .dark &
-    color: var(--color-gray-300)
-
-.admin-products__domain-checkbox
-  border-radius: 0.25rem
-  border: 1px solid var(--color-gray-300)
-  background-color: var(--color-white)
-  color: var(--color-primary-600)
-
-  &:focus
-    border-color: var(--color-primary-500)
-    box-shadow: 0 0 0 2px var(--color-primary-500-a20)
-
-  .dark &
-    background-color: var(--color-gray-700)
-    border-color: var(--color-gray-600)
-
-.admin-products__modal-actions
-  display: flex
-  gap: 0.75rem
-  justify-content: flex-end
-
-// Import form styles
-.admin-products__import-form
-  display: flex
-  flex-direction: column
-  gap: 1rem
-  margin-bottom: 1.5rem
-
-.admin-products__help-text
-  font-size: 0.75rem
-  color: var(--color-gray-500)
-  margin-top: 0.25rem
-
-  .dark &
-    color: var(--color-gray-400)
-
-.admin-products__file-info
-  padding: 1rem
-  background-color: var(--color-gray-50)
-  border-radius: 0.5rem
-
-  .dark &
-    background-color: var(--color-gray-700)
-
-.admin-products__import-results
-  padding: 1rem
-  border-radius: 0.5rem
-
-.admin-products__success
-  color: #16a34a
-  font-weight: 500
-  margin-bottom: 0.5rem
-
-  .dark &
-    color: #4ade80
-
-.admin-products__error
-  color: #dc2626
-  font-weight: 500
-  margin-bottom: 0.5rem
-
-  .dark &
-    color: #fca5a5
-
-// Categories management styles
-.admin-products__categories-tabs
-  display: flex
-  gap: 0
-  border-bottom: 1px solid var(--color-gray-200)
-  margin-bottom: 1.5rem
-
-  .dark &
-    border-bottom-color: var(--color-gray-700)
-
-.admin-products__categories-tab
-  padding: 0.75rem 1.5rem
-  background: none
-  border: none
-  border-bottom: 2px solid transparent
-  color: var(--color-gray-600)
-  font-weight: 500
-  cursor: pointer
-  transition: all 0.2s ease-in-out
-
-  &:hover
-    color: var(--color-gray-900)
-
-  .dark &
-    color: var(--color-gray-400)
+  &__import-results
+    margin-top: 20px
 
-    &:hover
-      color: var(--color-white)
-
-  &.admin-products__categories-tab--active
-    color: var(--color-primary-600)
-    border-bottom-color: var(--color-primary-600)
-
-    .dark &
-      color: var(--color-primary-400)
-      border-bottom-color: var(--color-primary-400)
-
-.admin-products__categories-header
-  display: flex
-  justify-content: space-between
-  align-items: center
-  margin-bottom: 1.5rem
-
-.admin-products__categories-grid
-  display: grid
-  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr))
-  gap: 1rem
-
-.admin-products__category-item
-  background-color: var(--color-gray-50)
-  border: 1px solid var(--color-gray-200)
-  border-radius: 0.5rem
-  overflow: hidden
-
-  .dark &
-    background-color: var(--color-gray-700)
-    border-color: var(--color-gray-600)
-
-.admin-products__category-preview
-  padding: 1rem
-
-.admin-products__category-image
-  width: 100%
-  height: 120px
-  object-fit: cover
-  border-radius: 0.375rem
-  margin-bottom: 0.75rem
-
-.admin-products__category-no-image
-  width: 100%
-  height: 120px
-  background-color: var(--color-gray-200)
-  border-radius: 0.375rem
-  display: flex
-  align-items: center
-  justify-content: center
-  color: var(--color-gray-500)
-  font-size: 0.875rem
-  margin-bottom: 0.75rem
-
-  .dark &
-    background-color: var(--color-gray-600)
-    color: var(--color-gray-400)
-
-.admin-products__category-info
-  text-align: center
-
-.admin-products__category-name
-  font-weight: 600
-  color: var(--color-gray-900)
-  margin-bottom: 0.5rem
-
-  .dark &
-    color: var(--color-white)
-
-.admin-products__category-description
-  color: var(--color-gray-600)
-  font-size: 0.875rem
-  margin-bottom: 0.75rem
-  line-height: 1.4
-
-  .dark &
-    color: var(--color-gray-400)
-
-.admin-products__category-meta
-  display: flex
-  justify-content: space-between
-  align-items: center
-  font-size: 0.75rem
-
-.admin-products__category-products
-  color: var(--color-gray-500)
-
-  .dark &
-    color: var(--color-gray-400)
-
-.admin-products__category-actions
-  display: flex
-  gap: 0.5rem
-  padding: 0.75rem
-  border-top: 1px solid var(--color-gray-200)
-  background-color: var(--color-white)
-
-  .dark &
-    border-top-color: var(--color-gray-600)
-    background-color: var(--color-gray-800)
-// Mass actions styles
-.admin-products__mass-actions
-  background-color: var(--color-gray-50)
-  border: 1px solid var(--color-gray-200)
-  border-radius: 0.5rem
-  padding: 1rem
-  margin-bottom: 1.5rem
-
-  .dark &
-    background-color: var(--color-gray-700)
-    border-color: var(--color-gray-600)
-
-.admin-products__mass-header
-  display: flex
-  justify-content: space-between
-  align-items: center
-  flex-wrap: wrap
-  gap: 1rem
-
-.admin-products__selection-info
-  display: flex
-  align-items: center
-  gap: 1rem
-  font-weight: 500
-  color: var(--color-gray-700)
-
-  .dark &
-    color: var(--color-gray-300)
-
-.admin-products__mass-buttons
-  display: flex
-  gap: 0.5rem
-  flex-wrap: wrap
-
-// Table selection styles
-.admin-products__th--checkbox
-  width: 3rem
-  text-align: center
-
-.admin-products__td--checkbox
-  width: 3rem
-  text-align: center
-
-.admin-products__checkbox
-  width: 1rem
-  height: 1rem
-  border-radius: 0.25rem
-  border: 1px solid var(--color-gray-300)
-  background-color: var(--color-white)
-  cursor: pointer
-
-  .dark &
-    background-color: var(--color-gray-700)
-    border-color: var(--color-gray-600)
-
-  &:checked
-    background-color: var(--color-primary-500)
-    border-color: var(--color-primary-500)
-
-.admin-products__tr--selected
-  background-color: var(--color-primary-50) !important
-
-  .dark &
-    background-color: var(--color-primary-900) !important
-
-// Mass actions grid
-.admin-products__mass-actions-grid
-  display: grid
-  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr))
-  gap: 1.5rem
-  margin-bottom: 1.5rem
-
-.admin-products__mass-action
-  background-color: var(--color-gray-50)
-  border: 1px solid var(--color-gray-200)
-  border-radius: 0.5rem
-  padding: 1rem
-
-  .dark &
-    background-color: var(--color-gray-700)
-    border-color: var(--color-gray-600)
-
-.admin-products__mass-action-title
-  font-size: 1rem
-  font-weight: 600
-  color: var(--color-gray-900)
-  margin-bottom: 0.75rem
-
-  .dark &
-    color: var(--color-white)
-
-.admin-products__mass-action-buttons
-  display: flex
-  flex-direction: column
-  gap: 0.5rem
-
-// Responsive adjustments for mass actions
-@media (max-width: 768px)
-  .admin-products__mass-header
-    flex-direction: column
-    align-items: flex-start
+  &__result
+    padding: 16px
+    border-radius: 6px
 
-  .admin-products__mass-buttons
-    width: 100%
-    justify-content: flex-start
+    &--success
+      background: #d1fae5
+      border: 1px solid #a7f3d0
 
-  .admin-products__mass-actions-grid
-    grid-template-columns: 1fr
+    &--error
+      background: #fee2e2
+      border: 1px solid #fecaca
 
-  .admin-products__mass-action-buttons
-    flex-direction: column
-// Responsive adjustments
+    h3
+      margin: 0 0 8px 0
+      font-size: 16px
+      font-weight: 600
+
+    p
+      margin: 0 0 8px 0
+      font-size: 14px
+
+    ul
+      margin: 8px 0 0 0
+      padding-left: 20px
+
+      li
+        font-size: 12px
+        color: #6b7280
+
+  &__mass-actions
+    display: grid
+    grid-template-columns: 1fr 1fr
+    gap: 12px
+
+// Адаптивные стили
 @media (max-width: 768px)
-  .admin-products__header
+  .admin-products
+    padding: 12px
+
+    &__header
+      flex-direction: column
+      gap: 16px
+      align-items: stretch
+
+    &__actions
+      flex-wrap: wrap
+      justify-content: center
+
+    &__filters
+      flex-direction: column
+
+    &__filter-group
+      flex-direction: column
+
+    &__td--actions
+      flex-direction: column
+
+    &__mass-actions
+      grid-template-columns: 1fr
+
+    &__modal-content
+      width: 95%
+      margin: 20px
+
+    &__modal-footer
+      flex-direction: column
+// ... предыдущие стилы остаются без изменений ...
+
+// Стили для формы редактирования
+.admin-products
+  &__modal-content--large
+    max-width: 800px
+
+  &__form
+    display: flex
     flex-direction: column
-    align-items: flex-start
-    gap: 1rem
+    gap: 16px
 
-  .admin-products__actions
-    width: 100%
-    justify-content: flex-start
-    flex-wrap: wrap
+  &__form-row
+    display: grid
+    grid-template-columns: 1fr 1fr
+    gap: 16px
 
-  .admin-products__filters
-    grid-template-columns: 1fr
+    @media (max-width: 768px)
+      grid-template-columns: 1fr
 
-  .admin-products__action-buttons
+  &__form-group
+    display: flex
     flex-direction: column
+    gap: 8px
+
+  &__label
+    font-weight: 500
+    color: #374151
+    font-size: 14px
+
+    &--checkbox
+      display: flex
+      align-items: center
+      gap: 8px
+      cursor: pointer
+
+  &__input
+    padding: 10px 12px
+    border: 1px solid #d1d5db
+    border-radius: 6px
+    font-size: 14px
+    transition: border-color 0.2s ease
 
-  .admin-products__action-btn
-    text-align: center
+    &:focus
+      outline: none
+      border-color: #3b82f6
+      box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1)
+
+  &__textarea
+    padding: 10px 12px
+    border: 1px solid #d1d5db
+    border-radius: 6px
+    font-size: 14px
+    resize: vertical
+    min-height: 80px
+    transition: border-color 0.2s ease
 
-  .admin-products__modal-content
-    margin: 0 0.5rem
-    padding: 1rem
+    &:focus
+      outline: none
+      border-color: #3b82f6
+      box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1)
 
-  .admin-products__categories-grid
-    grid-template-columns: 1fr
+  // Стили для загрузки изображений
+  &__image-upload
+    display: flex
+    flex-direction: column
+    gap: 12px
+
+  &__image-preview
+    display: flex
+    align-items: center
+    gap: 12px
+    padding: 12px
+    border: 1px solid #e5e7eb
+    border-radius: 6px
+    background: #f9fafb
+
+  &__preview-img
+    width: 60px
+    height: 60px
+    object-fit: cover
+    border-radius: 4px
+
+  &__image-info
+    color: #6b7280
+    font-size: 14px
+
+  &__upload-controls
+    display: flex
+    gap: 8px
+
+    @media (max-width: 768px)
+      flex-direction: column
+
+  &__additional-images
+    display: grid
+    grid-template-columns: repeat(auto-fill, minmax(80px, 1fr))
+    gap: 8px
+    margin-bottom: 12px
+
+  &__additional-image
+    position: relative
+    width: 80px
+    height: 80px
+
+  &__image-remove
+    position: absolute
+    top: -8px
+    right: -8px
+    width: 24px
+    height: 24px
+    background: #ef4444
+    color: white
+    border: none
+    border-radius: 50%
+    cursor: pointer
+    display: flex
+    align-items: center
+    justify-content: center
+    font-size: 14px
+    line-height: 1
 
-  .admin-products__domains-list
-    grid-template-columns: 1fr
+    &:hover
+      background: #dc2626
+// ... предыдущие стили остаются без изменений ...
 
-  .admin-products__categories-tabs
+// Стили для управления атрибутами
+.admin-products
+  &__attributes
+    display: flex
     flex-direction: column
+    gap: 8px
+    margin-bottom: 12px
+
+  &__attribute
+    display: flex
+    align-items: center
+    gap: 8px
+    padding: 8px
+    border: 1px solid #e5e7eb
+    border-radius: 4px
+    background: #f9fafb
+
+  &__attribute-key
+    flex: 1
+    font-weight: 500
+    color: #374151
+    font-size: 14px
+
+  &__input--small
+    flex: 2
+    padding: 6px 8px
+    font-size: 13px
+
+  &__attribute-remove
+    width: 24px
+    height: 24px
+    background: #ef4444
+    color: white
+    border: none
+    border-radius: 4px
+    cursor: pointer
+    display: flex
+    align-items: center
+    justify-content: center
+    font-size: 14px
+    line-height: 1
 
-  .admin-products__categories-tab
-    text-align: center
+    &:hover
+      background: #dc2626
+
+  &__attribute-add
+    display: flex
+    gap: 8px
+    align-items: center
+
+    @media (max-width: 768px)
+      flex-direction: column
+
+// Стили для управления тегами
+.admin-products
+  &__tags
+    display: flex
+    flex-wrap: wrap
+    gap: 6px
+    margin-bottom: 12px
+
+  &__tag
+    display: inline-flex
+    align-items: center
+    gap: 4px
+    padding: 4px 8px
+    background: #dbeafe
+    color: #1e40af
+    border-radius: 12px
+    font-size: 12px
+    font-weight: 500
+
+  &__tag-remove
+    width: 16px
+    height: 16px
+    background: #93c5fd
+    color: #1e40af
+    border: none
+    border-radius: 50%
+    cursor: pointer
+    display: flex
+    align-items: center
+    justify-content: center
+    font-size: 10px
+    line-height: 1
+
+    &:hover
+      background: #60a5fa
+
+  &__tag-add
+    display: flex
+    gap: 8px
+    align-items: center
+
+    @media (max-width: 768px)
+      flex-direction: column
+
+// Стили для управления категориями
+.admin-products
+  &__categories-header
+    margin-bottom: 16px
 
-@media (max-width: 480px)
-  .admin-products__category-meta
+  &__categories-list
+    display: flex
     flex-direction: column
-    gap: 0.5rem
-    align-items: flex-start
+    gap: 8px
+
+  &__category-item
+    display: flex
+    justify-content: space-between
+    align-items: center
+    padding: 12px
+    border: 1px solid #e5e7eb
+    border-radius: 6px
+    background: white
+
+    @media (max-width: 768px)
+      flex-direction: column
+      align-items: stretch
+      gap: 8px
+
+  &__category-info
+    flex: 1
+
+  &__category-name
+    font-weight: 500
+    color: #1f2937
+    margin-bottom: 4px
+
+  &__category-meta
+    display: flex
+    gap: 12px
+    font-size: 12px
+    color: #6b7280
+
+  &__category-actions
+    display: flex
+    gap: 8px
+
+    @media (max-width: 768px)
+      justify-content: flex-end

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor