Skip to content

Двойной confirm при удалении товара в сетке категории (category/update) #538

Closed

Description

@biz87

Проблема

Админка → редактирование категории → вкладка «Сетка товаров». Клик по кнопке удаления (иконка-корзина в строке или «Удалить выбранные») показывает два диалога подтверждения одновременно.

Причина

Страница category/update монтирует два независимых Vue-приложения (core/components/minishop3/controllers/category/update.class.php:70-71):

  • category-products.min.js → компонент CategoryProductsGrid
  • category-options.min.js → компонент CategoryOptionsTab

PrimeVue вынесен в общий Import Map (external: ['vue','pinia','primevue'] в vueManager/vite.config.js), поэтому на всю страницу — один экземпляр модуля PrimeVue. Шина подтверждений ConfirmationEventBus внутри PrimeVue — модульный singleton. Значит confirm.require() из любого из двух приложений улетает в одну общую шину, и её слушают все смонтированные <ConfirmDialog> без атрибута group.

На этой странице два ungrouped <ConfirmDialog>:

  • vueManager/src/components/CategoryProductsGrid.vue:775 — <ConfirmDialog append-to="self" />
  • vueManager/src/components/CategoryOptionsTab.vue:299 — <ConfirmDialog />

Один confirm.require() (из useActions для строки или useSelection для bulk) → его ловят оба диалога → «два confirm сразу».

Доказательство

В проекте уже есть 4 компонента, изолирующих подтверждения через group именно из-за этой коллизии: ExtraFieldsManager (extra-fields), GridFieldsConfig, ModelFieldsGrid, ProductDataConfig. CategoryProductsGrid и CategoryOptionsTab — единственные два на этой странице, оставшиеся без группы.

Дополнительно: висячий useConfirm() в CategoryProductsGrid.vue:36 (вызван без присваивания) — мусор от рефактора, к багу отношения не имеет, убрать заодно.

Решение

Namespace-ить оба приложения через group (по уже принятому в проекте паттерну):

  • CategoryOptionsTab → group="category-options" на <ConfirmDialog> + в обоих confirm.require() (стр. 184, 257).
  • CategoryProductsGrid → group="category-products" на <ConfirmDialog> (775); группа прокидывается через composables useActions/useSelection (новая опциональная опция confirmGroup, по умолчанию ungrouped — обратная совместимость для остальных гридов).
  • Убрать висячий useConfirm() (CategoryProductsGrid.vue:36).

Воспроизведение

  1. Открыть любую категорию на редактирование.
  2. Вкладка «Сетка товаров».
  3. Нажать удаление у любого товара → появляются два одинаковых диалога подтверждения.

Затрагивает beta.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions