Skip to content

fix(vue): изоляция confirm-диалогов категории через group — двойной confirm (#538) - #540

Merged
biz87 merged 2 commits into
betafrom
fix/538-category-confirm-group
Aug 12, 2026
Merged

fix(vue): изоляция confirm-диалогов категории через group — двойной confirm (#538)#540
biz87 merged 2 commits into
betafrom
fix/538-category-confirm-group

Conversation

@biz87

@biz87 biz87 commented Aug 12, 2026

Copy link
Copy Markdown
Member

Fixes #538

Проблема

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

Причина

Страница category/update монтирует два независимых Vue-приложения (update.class.php:70-71): category-products (CategoryProductsGrid) и category-options (CategoryOptionsTab). PrimeVue вынесен в общий Import Map (externalized в vite.config.js) → один экземпляр модуля на страницу, а ConfirmationEventBus внутри PrimeVue — модульный singleton. Значит confirm.require() без group ловится всеми смонтированными ungrouped <ConfirmDialog> на странице, в каком бы приложении они ни были. На этой странице их было два → два диалога.

Решение

Namespace обоих приложений через confirm-group (паттерн уже используется в ExtraFieldsManager, GridFieldsConfig, ModelFieldsGrid, ProductDataConfig):

  • useActions / useSelection — новая опциональная опция confirmGroup, подставляется в confirm.require({ group }). По умолчанию null → ungrouped (полная обратная совместимость).
  • ActionsColumn — новый проп confirmGroup, проброс в useActions.
  • CategoryProductsGridgroup="category-products" на <ConfirmDialog>; группа прокинута в useSelection и ActionsColumn; убран висячий useConfirm() (мусор от рефактора).
  • CategoryOptionsTabgroup="category-options" на <ConfirmDialog> и в обоих confirm.require.

Остальные гриды (Customers/Orders/Deliveries/Payments/…) не тронуты: confirmGroup opt-in, по умолчанию ungrouped — поведение прежнее.

Проверка

  • ESLint (5 файлов) ✓
  • npm run build
  • Проверено на DEV после hard-reload: в сетке товаров и в опциях категории теперь один confirm, удаление (строчное и bulk) работает.

Связанное

Системный риск той же природы (общая шина PrimeVue на страницах с несколькими Vue-приложениями/табами, потенциально product-tabs, а также ToastEventBus) вынесен отдельно: #539.

…irm (#538)

Страница category/update монтирует два независимых Vue-приложения
(category-products + category-options). PrimeVue вынесен в общий Import Map,
поэтому ConfirmationEventBus — модульный singleton: один ungrouped
confirm.require() ловился обоими ungrouped <ConfirmDialog> → два диалога сразу.

Namespace обоих приложений через confirm-группу:
- useActions/useSelection: опциональная опция confirmGroup (по умолчанию ungrouped)
- ActionsColumn: проп confirmGroup, проброс в useActions
- CategoryProductsGrid: group="category-products" + убран висячий useConfirm()
- CategoryOptionsTab: group="category-options" на диалоге и в обоих require

Остальные гриды не затронуты (confirmGroup opt-in, по умолчанию ungrouped).
@Ibochkarev

Copy link
Copy Markdown
Member

Review (code-reviewer + thermo-nuclear)

Verdict: no blockers. Фикс бьёт в причину: два Vue-app на category/update + shared PrimeVue Import Map → один ConfirmationEventBus. group — тот же паттерн, что в ExtraFields / GridFieldsConfig / ModelFields / ProductDataConfig. Opt-in confirmGroup не ломает остальные гриды.

Строчное удаление в сетке идёт через ActionsColumnuseActions (confirm: true), bulk — через useSelection. deleteProduct сам confirm не зовёт. Группа прокинута на оба пути и на оба <ConfirmDialog>. Висячий useConfirm() в CategoryProductsGrid убран правильно.

Findings

Medium

  1. Нет регрессионного теста. Для этого бага хватит smoke в духе OrphanExtAssetsTest: в CategoryProductsGrid / CategoryOptionsTab есть group="category-products|category-options", а confirm.require / confirmGroup несут ту же строку. Без этого следующий рефактор composable легко снимет group с одной стороны шины.

Low
2. CategoryOptionsTab по-прежнему без append-to="self" (у грида товаров он есть). К багу #538 не относится, на DEV после hard-reload ок. Если диалог опций когда-нибудь уедет под Ext overlay — добавить append-to="self" там же.

Thermo-nuclear

Code judo здесь уже сделан: не плодить ConfirmationService на app, а namespace существующей шины. Новый слой/wrapper не нужен. confirmGroup || undefined — нормальный opt-in.

Системный риск (Toast + другие dual-mount, в т.ч. product-tabs) правильно вынесен в #539. Этот PR его не должен решать.

Можно мержить. Smoke на group-контракт — по желанию до merge или сразу follow-up.

@Ibochkarev
Ibochkarev self-requested a review August 12, 2026 11:48
Follow-up polish on the review:
- extract the group literal into a single CONFIRM_GROUP const per component
  (CategoryProductsGrid, CategoryOptionsTab) — a typo in any of the 3 usage
  sites (dialog / composable / prop) would silently match no dialog
- document why `group: confirmGroup || undefined` is load-bearing in
  useActions/useSelection: PrimeVue ConfirmDialog matches strictly
  (options.group === this.group; ungrouped => undefined), and confirmGroup
  defaults to null, so reducing it to `group: confirmGroup` would break every
  ungrouped grid silently. No behavior change.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

2 participants