Skip to content

feat(mgr): Utilities без Ext tabs (Phase 1c #521) - #537

Merged
biz87 merged 1 commit into
betafrom
feat/issue-524-utilities-vue-entry
Aug 12, 2026
Merged

feat(mgr): Utilities без Ext tabs (Phase 1c #521)#537
biz87 merged 1 commit into
betafrom
feat/issue-524-utilities-vue-entry

Conversation

@Ibochkarev

Copy link
Copy Markdown
Member

Описание

Phase 1c epic #521 / #524: раздел «Утилиты» монтируется одним Vue app (как Help), без Ext modx-tabs / utilities.panel.js.

  • Удалены Ext utilities.js, utilities.panel.js, import/panel.js и 6 orphan Vite entries
  • Добавлены utilities.tpl, UtilitiesPage.vue, entry utilities.js
  • Controller: var ms3 = { config } + utilities.min.js / CSS через assetsUrl
  • Tabs: localStorage (ms3-utilities-active-tab) + remap legacy Ext tab ids
  • Gallery читает конфиг через getMs3Config()
  • Smoke: UtilitiesVueEntryTest.php

Тип изменений

  • Рефакторинг (без изменения функциональности)

Связанные Issues

Closes #524
Refs #521

Overlap с #530: удаление utilities/import/panel.js (Phase 0). После merge этого PR правки utilities в #530 станут no-op / конфликт на том же файле.

Как это было протестировано?

php -l core/components/minishop3/controllers/mgr/utilities.class.php   # exit 0
php core/components/minishop3/tests/UtilitiesVueEntryTest.php          # OK, exit 0
cd vueManager && npx eslint src/entries/utilities.js src/components/UtilitiesPage.vue src/components/UtilitiesGallery.vue  # exit 0
npm run build                                                          # exit 0
  • Автоматические тесты (smoke PHP + ESLint + Vite build)
  • Ручное тестирование в MODX Manager (все 6 вкладок + restore localStorage)

Конфигурация тестирования:

  • MiniShop3: branch feat/issue-524-utilities-vue-entry
  • PHP: 8.x local

Чеклист

  • Код соответствует стилю проекта
  • Изменения не ломают существующую функциональность
  • Лексиконы ru/en не требовались
  • ESLint по затронутым Vue-файлам
  • CHANGELOG.md — на релизе

Дополнительные заметки

  • Кнопки Orders/Settings перенесены из Ext action bar в header страницы.
  • HTML preview thumbnails галереи по-прежнему собирается в PHP (utility_gallery_thumbnails) — structured JSON follow-up.
  • DevInput в vite всё ещё keyed как fields-managementindex.html (локальный serve); не влияет на prod entry.

@Ibochkarev Ibochkarev added javascript Pull requests that update javascript code enhancement New feature or request tech-debt Maintainability / refactor / architecture debt labels Aug 11, 2026
@Ibochkarev
Ibochkarev requested a review from biz87 August 11, 2026 02:53
@biz87

biz87 commented Aug 11, 2026

Copy link
Copy Markdown
Member

Спасибо за Phase 1c! Перед мержем нужен ребейз на текущую beta — она ушла вперёд: #530 (orphan-assets smoke-guard), #536 (Settings-консолидация), #533/#534 (Phase 1a/1d). При ребейзе два момента:

1. Контракт entry Utilities ↔ Import.
OrphanExtAssetsTest (из #530, уже в beta) требует, чтобы utilities.class.php регистрировал import.min.js (Vue Import entry). Этот PR консолидирует Utilities в utilities.min.js и убирает Ext-ассеты, но OrphanExtAssetsTest не обновлён → после ребейза тест упадёт: utilities controller must still register import.min.js Vue entry.
Нужно решить дизайн:

  • либо Import остаётся отдельным import.min.js — тогда сохранить его addVueModule(...) в контроллере;
  • либо Import уходит внутрь utilities.min.js — тогда обновить/снять это ожидание в OrphanExtAssetsTest.

2. vite.config.js — конфликт entry-списка.
#536 удалил settings-суб-entries (deliveries/payments/vendors/statuses/options) и добавил settings; этот PR удаляет utilities-суб-entries (model-fields/grid-fields-config/import/utilities-gallery) и добавляет utilities. При ребейзе — union обоих удалений: убрать оба набора суб-entries, оставить и settings, и utilities.

Локально всё остальное зелёное (php -l, smoke кроме OrphanExtAssetsTest, ESLint, build). Как ребейзнёшь на текущую beta — сразу провалидирую по протоколу и вольём.

Replace Ext utilities shell with a single Vite entry and Help-style
mount so all six tabs keep localStorage state without modx-tabs.
@Ibochkarev
Ibochkarev force-pushed the feat/issue-524-utilities-vue-entry branch from 3672899 to 4575af0 Compare August 12, 2026 00:52
@Ibochkarev

Copy link
Copy Markdown
Member Author

Rebase на актуальную beta выполнен (по комментарию @biz87).

Дизайн entry Utilities ↔ Import

Import внутри utilities.min.js (не отдельный entry).
OrphanExtAssetsTest обновлён: ожидает utilities.min.js, запрещает отдельный import.min.js.

vite.config.js

Union после #536 + #537:

  • убраны settings-суб-entries и utilities-суб-entries (import / utilities-gallery / model-fields / …)
  • оставлены и settings, и utilities

Gates

php -l controllers/mgr/utilities.class.php   # exit 0
php tests/OrphanExtAssetsTest.php            # OK
php tests/UtilitiesVueEntryTest.php          # OK
npx eslint …utilities…                       # exit 0

@biz87
biz87 merged commit 2cac062 into beta Aug 12, 2026
3 checks passed
biz87 added a commit that referenced this pull request Aug 12, 2026
…аницах (#544) (#545)

* fix(mgr): inject auth token into ms3.config to kill HTTP_MODAUTH race (#544)

Ext-less Vue manager pages fire their first API requests on DOMContentLoaded,
before the manager JS populates the MODx.siteId global that request.js used as
HTTP_MODAUTH. Those early requests went out tokenless, so the connector rejected
them (HTTP 200 body {success:false, message:"Доступ запрещён.", object:{code:401}}),
surfacing as intermittent "Доступ запрещён" on orders filters/grid-config while the
later list request succeeded (grid filled). #533/#534/#536/#537 exposed the race by
dropping the waitForElement guard.

Ship the token synchronously in the inline ms3.config block, before the Vue module runs:
- manager.class.php: new addVueConfig() helper injects token = getUserToken($contextKey)
- customers/notifications/order/orders/settings/utilities: use addVueConfig()
- request.js getModAuthToken(): read ms3.config.token first, fall back to MODx.siteId

Covers all 6 Ext-less Vue pages. No permission/session change.

* test(mgr): assert addVueConfig contract + base token injection (#544)

Moving the ms3.config emission into the base addVueConfig() helper took the
`var ms3` literal out of the page controllers, so the *VueEntryTest smoke guards
that grep each controller for it failed. Switch the required pattern to
`addVueConfig`, and add a base-controller guard in CustomersNotificationsVueEntryTest
asserting controllers/manager.class.php ships `var ms3` + getUserToken (the #544
token injection that must not regress).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request javascript Pull requests that update javascript code tech-debt Maintainability / refactor / architecture debt

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Phase 1c (#521): Utilities Vue entry без Ext tabs

2 participants