fix(vue): изоляция confirm-диалогов категории через group — двойной confirm (#538) - #540
Conversation
…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).
Review (code-reviewer + thermo-nuclear)Verdict: no blockers. Фикс бьёт в причину: два Vue-app на Строчное удаление в сетке идёт через FindingsMedium
Low Thermo-nuclearCode judo здесь уже сделан: не плодить ConfirmationService на app, а namespace существующей шины. Новый слой/wrapper не нужен. Системный риск (Toast + другие dual-mount, в т.ч. product-tabs) правильно вынесен в #539. Этот PR его не должен решать. Можно мержить. Smoke на group-контракт — по желанию до merge или сразу follow-up. |
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.
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.CategoryProductsGrid—group="category-products"на<ConfirmDialog>; группа прокинута вuseSelectionиActionsColumn; убран висячийuseConfirm()(мусор от рефактора).CategoryOptionsTab—group="category-options"на<ConfirmDialog>и в обоихconfirm.require.Остальные гриды (Customers/Orders/Deliveries/Payments/…) не тронуты:
confirmGroupopt-in, по умолчанию ungrouped — поведение прежнее.Проверка
npm run build✓Связанное
Системный риск той же природы (общая шина PrimeVue на страницах с несколькими Vue-приложениями/табами, потенциально
product-tabs, а такжеToastEventBus) вынесен отдельно: #539.