Skip to content

fix(manager): переключатель черновиков и фильтры в списке заказов#303

Merged
biz87 merged 4 commits into
betafrom
fix/302-orders-grid-show-drafts
Jun 15, 2026
Merged

fix(manager): переключатель черновиков и фильтры в списке заказов#303
biz87 merged 4 commits into
betafrom
fix/302-orders-grid-show-drafts

Conversation

@Ibochkarev

Copy link
Copy Markdown
Member

Описание

В Vue-гриде заказов добавлен чекбокс «Показывать черновики», который передаёт show_drafts в API и позволяет видеть записи со статусом черновика без правки системной настройки MODX. Бэкенд принимает параметр запроса show_drafts поверх ms3_order_show_drafts.

Исправлена передача фильтров по колонкам: динамические поля отправляются с префиксом filter_, как ожидает OrdersController::applyFilter() (по аналогии с CustomersGrid).

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

  • Исправление бага (non-breaking change)
  • Новая функциональность (non-breaking change)
  • Breaking change (изменение, ломающее обратную совместимость)
  • Рефакторинг (без изменения функциональности)
  • Документация
  • Другое (опишите):

Связанные Issues

Closes #302

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

  • Ручное тестирование
  • Автоматические тесты (PHPStan, ESLint)
  • Тестирование на разных версиях PHP/MODX

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

  • MiniShop3: 1.11.1-beta1
  • MODX: 3.x
  • PHP: 8.2+

Проверки:

  • php -l для изменённых PHP-файлов
  • npm run lint для OrdersGrid.vue
  • npm run build для vueManager (артефакты в gitignore)

Скриншоты (если применимо)

До После
В БД 4 заказа, в гриде 1 (только не-черновик) Чекбокс «Показывать черновики» включает все записи

Чеклист

  • Код соответствует стилю проекта
  • Добавлены/обновлены комментарии в сложных местах
  • Изменения не ломают существующую функциональность
  • Лексиконы добавлены на двух языках (ru/en)
  • PHPStan проходит без новых ошибок
  • ESLint проходит без ошибок (для JS/Vue изменений)
  • Обновлён CHANGELOG.md (для значимых изменений)

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

  • Чекбокс по умолчанию берёт значение из ms3_order_show_drafts через ms3.config.order_show_drafts.
  • Счётчик «Заказов / На сумму» по-прежнему считает только статусы из ms3_status_for_stat — это отдельная логика статистики, не общее число строк грида.

@Ibochkarev Ibochkarev requested a review from biz87 May 25, 2026 06:32
@biz87

biz87 commented Jun 14, 2026

Copy link
Copy Markdown
Member

PR прокликал на dev-стенде. Сам фикс работает корректно (чекбокс включает/выключает черновики, фильтры с filter_ префиксом отрабатывают). Чисто, маленько, по делу — нравится. PHPStan я прогнал — без новых ошибок (чек-бокс в PR можно отметить).

Есть один блокер (формальный, не код) и пара UX-замечаний из ручного теста.

🔴 Блокер — rebase #310

Ветка отрезана от beta до мержа #310 (вчера). Подтверждено: в текущем виде в OrdersController остался старый isset($params[$field]) на строках 643 и 1145, который #310 заменил на per-field null semantics. При мерже PR откатит контракт null payload, как уже случилось бы и с #301 / #298.

Решение — git rebase origin/beta. Конфликты будут в OrdersController, концептуально не пересекаются с твоими правками applyDraftVisibilityFilter / extract-методов: разные блоки кода, разные снэпшоты базы. Решается обычным take-both.

🟡 UX 1 — чекбокс не на своём уровне иерархии

Сейчас «Показывать черновики» лежит внутри .filter-buttons рядом с «Применить фильтры». Это смешение разных семантических уровней:

  • Фильтры (Номер, Поиск, Статус, Доставка и т.п.) — сужают видимое подмножество.
  • «Показывать черновики» — переключает scope того, что вообще учитывается. Это уровень выше.
  • «Применить фильтры» — действие на множестве фильтров.

Когда они на одной строке — пользователь не считывает разницу.

Предлагаю перенести чекбокс в шапку грида, между кнопкой + Создать черновик заказа и блоком статистики 📅 Заказов / 💰 На сумму. Тогда:

  • Чекбокс рядом со счётчиком — визуально ясно, что они в одной семантической группе.
  • Tooltip над счётчиком («Количество и сумма по оформленным заказам; черновики не учитываются»), который PR тоже добавляет, логически связан с близким чекбоксом — наглядно почему счётчик не меняется при включении.
  • .filter-buttons остаётся со своим единственным действием «Применить фильтры», без визуального шума.

Стоимость — 5-10 строк template/CSS правок: перенести <div class="show-drafts-toggle"> из .filter-buttons в шапку, убрать margin-right: auto.

🟡 UX 2 — состояние чекбокса не сохраняется между перезагрузками

Сейчас при каждом перезаходе на страницу чекбокс читается из ms3.config.order_show_drafts (резолвится из ms3_order_show_drafts). То есть если у юзера дефолт false, а он включил черновики, перезагрузил — снова false. Раздражает.

Системную настройку трогать кликом из UI не стоит — это global state, побочный эффект на других менеджеров, плюс требует permission settings, которого может не быть у роли.

Предлагаю persistence через localStorage — per-browser/per-user, без бекенд-вызовов:

const STORAGE_KEY = 'ms3_orders_show_drafts'
const stored = localStorage.getItem(STORAGE_KEY)
const showDrafts = ref(
  stored !== null ? stored === '1' : Boolean(ms3Config?.order_show_drafts)
)

function toggleShowDrafts() {
  localStorage.setItem(STORAGE_KEY, showDrafts.value ? '1' : '0')
  first.value = 0
  loadOrders()
}

Логика: localStorage > системная настройка > false. Если ключ пустой — берём дефолт из системы (как сейчас). После клика — фиксируем выбор юзера. Перезагрузка / возврат на страницу — восстанавливает.

Минус: не синкается между устройствами/браузерами. Для админ-UI это приемлемо.

Альтернатива более «правильная» — modUserSetting через $modx->user->getOption() / setOption(). Чисто MODX-way, per-user, в БД. Но это новая API-ручка + миграции, для UX-полировки оверкилл.

Минорные / на заметку

1. $c параметр без type hint в applyDraftVisibilityFilter($c, array $params). Это xPDOQuery. Не блокер, но docblock или type hint улучшит читаемость.

2. DIRECT_FILTER_KEYS fragile maintenance. Whitelist надо помнить расширять при добавлении новых direct-параметров. Сейчас 7 ключей, через год может быть 15 — кто-то забудет добавить → новый фильтр работает не там. На follow-up: вернуть DIRECT_FILTER_KEYS с бекенда вместе с grid-config'ом, фронт читает.

3. Stats counter не реагирует на show_drafts — намеренно. Tooltip это объясняет, согласен с design choice (статистика по «оформленным», черновики не считать).

Резюме

Что хорошо:

  • extract methods (shouldShowDrafts / applyDraftVisibilityFilter) — образец рефакторинга, single responsibility, понятные имена.
  • FILTER_VALIDATE_BOOLEAN — гибкий парсинг для API-клиентов.
  • DIRECT_FILTER_KEYS whitelist на фронте — закрывает фильтрационный баг.
  • UX-тултип над статистикой — недорого, ценно.
  • Лексиконы на двух языках.
  • PHPStan чист, ESLint чист, точечная правка без посторонних правок.

Что нужно до мержа:

  1. Rebase на текущий beta — иначе откатит fix(api): per-field null payload semantics in Manager API (#289) #310.
  2. Перенос чекбокса в шапку грида — 5-10 строк template/CSS.
  3. localStorage persistence — 5-7 строк JS.

После этих трёх — мержим. PR в остальном чистый, никаких глубоких проблем не нашёл.

@Ibochkarev Ibochkarev force-pushed the fix/302-orders-grid-show-drafts branch from ae2c32c to 22bb74b Compare June 14, 2026 17:26
Ibochkarev added a commit that referenced this pull request Jun 14, 2026
Move the show-drafts checkbox to the grid header next to stats, persist the
user choice in localStorage, and add an xPDOQuery type hint on the backend.
@biz87

biz87 commented Jun 14, 2026

Copy link
Copy Markdown
Member

Текущий вариант выглядит не очень уместно.
image

Предлагаю сделать вот так (шрифт уменьшил до 1rem, объединил с блоком total, перенеся вправо)

image

Vue orders grid lacked a way to include draft rows despite ms3_order_show_drafts,
and column filters were sent without the filter_ prefix expected by the API.
Enhanced the Vue orders grid by adding a tooltip for the order statistics, clarifying that only placed orders are counted, excluding drafts. Updated English and Russian lexicons accordingly. Improved the logic in the OrdersController to handle draft visibility more clearly.
Move the show-drafts checkbox to the grid header next to stats, persist the
user choice in localStorage, and add an xPDOQuery type hint on the backend.
@Ibochkarev Ibochkarev force-pushed the fix/302-orders-grid-show-drafts branch from d81325f to f6318e3 Compare June 15, 2026 04:42
@Ibochkarev

Copy link
Copy Markdown
Member Author

Сделал так

image

@biz87

biz87 commented Jun 15, 2026

Copy link
Copy Markdown
Member

Прокликал на dev-стенде. Новая раскладка ок: чекбокс справа от статистики в обёртке .grid-header-right, шрифт поднят до 1rem, white-space: nowrap на лейбле — не переносится. Все функциональные сценарии (localStorage, tooltip, переключение, регрессия фильтров) работают.

PHPStan на OrdersController.php чист. mergeStateStatus CLEAN.

Мержим.

@biz87 biz87 merged commit e263d24 into beta Jun 15, 2026
@biz87 biz87 deleted the fix/302-orders-grid-show-drafts branch June 15, 2026 16:43
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.

[Bug] В списке заказов не отображаются черновики и нет переключателя в Vue-менеджере

2 participants