|
17 | 17 |
|
18 | 18 | ## Март 2026 |
19 | 19 |
|
20 | | -### 🚀 Версия 1.6.0-beta1 |
| 20 | +### 🚀 Версия 1.7.0-beta1 |
21 | 21 |
|
22 | | -**Тип релиза:** MINOR (beta) — httpOnly cookie auth, отмена заказов, community PRs |
| 22 | +**Тип релиза:** MINOR (beta) — inline-edit, форматированные плейсхолдеры, миграция галереи на Vue, баг-фиксы |
23 | 23 |
|
24 | 24 | --- |
25 | 25 |
|
26 | 26 | #### ♻️ Рефакторинг |
27 | 27 |
|
| 28 | +**Удаление неиспользуемой настройки ms3_category_grid_fields (#145, #146):** |
| 29 | +- Удалена логика `ms3_category_grid_fields`, `grid_fields`, `option_fields`, `product_fields` из контроллера `category/update` |
| 30 | +- Удалён неиспользуемый процессор `Processors\Category\GetList` |
| 31 | +- Из `Processors\Product\GetList` убрана мёртвая ветка с опциями (процессор вызывается только с `combo: true`) |
| 32 | + |
| 33 | +**Упрощение Product\GetList — удаление non-combo логики (#151, #152):** |
| 34 | +- Удалена non-combo ветка из `prepareArray()` (actions, preview_url, cls, category_name, округление price/weight) |
| 35 | +- Удалены non-combo ветки из `prepareQueryBeforeCount()` (full select, parent-фильтрация, nested products, join msCategoryMember) |
| 36 | +- Добавлена валидация `combo: true` в `initialize()` |
| 37 | + |
28 | 38 | **Миграция галереи товара с ExtJS на Vue (#112, #150):** |
29 | 39 | - ExtJS прослойка (gallery.panel, toolbar, view, window, ext.ddview) заменена чистыми Vue-компонентами |
30 | 40 | - Новая архитектура: `ProductGallery` (оркестратор) → `ProductGalleryGrid` (vuedraggable + ContextMenu + поиск + пагинация) + `ProductGalleryToolbar` (выбор source + bulk actions) + `ProductGalleryEditDialog` |
|
33 | 43 | - `GalleryUploader` (Uppy) встроен в `product-tabs` бандл, отдельный entry point `gallery-uploader` удалён |
34 | 44 | - Удалено 6 ExtJS-файлов (~900 строк), добавлено 5 Vue-компонентов + composable (~1300 строк) |
35 | 45 |
|
36 | | -**Интеграция standalone ЛК-модулей в архитектуру ms3 (#126):** |
37 | | -- Три standalone модуля (`order-cancel.js`, `customer-addresses.js`, `auth-forms.js`) заменены на UI-классы в единой архитектуре (API → UI → hooks → message) |
38 | | -- Новый `AuthUI` — класс для форм авторизации/регистрации с хуками `beforeLogin`/`afterLogin`, `beforeRegister`/`afterRegister` |
39 | | -- `CustomerUI` расширен: отмена заказов, управление адресами (set default, delete) с хуками |
40 | | -- `CustomerAPI` расширен: +4 метода (`login`, `register`, `setDefaultAddress`, `cancelOrder`) |
41 | | -- 6 новых селекторов в `Selectors.js` для ЛК-компонентов |
42 | | - |
43 | | -**Promise-based confirm dialog (#126):** |
44 | | -- Новый модуль `confirm.js` — Bootstrap Modal с fallback на native `confirm()` |
45 | | -- i18n кнопок по атрибуту `<html lang>` (ru/en), переопределение через `ms3Lexicon` или параметры |
46 | | -- Декларативная привязка через `data-ms3-confirm` атрибут на любом элементе |
47 | | -- Заменяет все `confirm()` в ЛК: отмена заказа, удаление адреса, выход |
| 46 | +#### ✨ Добавлено |
48 | 47 |
|
49 | | -**UUID в URL заказов (#126):** |
50 | | -- Ссылки на детали заказа используют `uuid` вместо integer `id` — безопаснее, не раскрывает количество заказов |
51 | | -- Валидация формата UUID из `$_GET` перед запросом к БД |
| 48 | +**Inline-редактирование в таблице товаров категории (#116, #134):** |
| 49 | +- Двойной клик по ячейке → редактирование прямо в таблице (text, number, boolean/checkbox) |
| 50 | +- Настройка редактируемых полей и типа редактора в «Утилиты → Поля таблицы» для грида «Товары категории» |
| 51 | +- Бэкенд: whitelist полей в `ProductDataService`, валидация, проверка прав, корректные HTTP-коды ошибок |
| 52 | +- Поле `published` обновляет ресурс msProduct с вызовом событий `OnDocPublished`/`OnDocUnPublished` |
52 | 53 |
|
53 | | -#### ✨ Добавлено |
| 54 | +**Форматированные плейсхолдеры валюты и веса (#144, #147):** |
| 55 | +- Системные настройки (`ms3_currency_symbol`, `ms3_currency_position`, новая `ms3_weight_unit`) — единый источник истины для отображения валюты и единиц веса |
| 56 | +- Новые `*_formatted` плейсхолдеры во всех сниппетах и чанках: `price_formatted`, `cost_formatted`, `old_price_formatted`, `old_cost_formatted`, `weight_formatted`, `discount_price_formatted`, `discount_cost_formatted` |
| 57 | +- `Format::weightWithUnit()`, `Format::getWeightUnit()` — форматирование веса с единицей измерения |
| 58 | +- Лексиконы `ms3_frontend_currency` и `ms3_frontend_weight_unit` сохранены, но core-чанки их больше не используют |
54 | 59 |
|
55 | 60 | **Поддержка кастомных полей в валидации заказа (#135):** |
56 | 61 | - Кастомные поля из правил валидации доставки (например, чекбокс `agreement` с правилом `required|accepted`) сохраняются в `draft->properties['_validated']` между `order/add` и `order/submit` |
|
59 | 64 |
|
60 | 65 | #### 🐛 Исправлено |
61 | 66 |
|
| 67 | +- **Не удалялись опции товара в админке (#148, #149):** форма отправляла `options-color[]`, но `substr($key, 8)` давал ключ `color[]` вместо `color` — опция не матчилась и не удалялась. Парсинг вынесен в `Utils::extractOptionKey()` с `rtrim('[]')`. Также исправлена обработка пустого массива опций в `OptionSyncService` |
| 68 | +- **Визуальный редактор (TinyMCE) не работал в категории товаров (#156):** `item_j.value = "<p></p>"` выполнялся безусловно, перезатирая контент при редактировании. Блок `modx-resource-content` был исключён из формы, `loadRichTextEditor()` закомментирован — всё восстановлено |
| 69 | +- **Удаление кастомных опций категорий при сохранении товара (#153, #158):** `saveOptions(null, true)` при автосборе только JSON-полей вызывал `removeUnusedOptions` и удалял кастомные опции категорий (proizvoditel, brend и т.п.) — при `options=null` теперь принудительно `removeOther=false` |
| 70 | +- **Пропажа пункта «создать Документ» в контекстном меню категории (#153, #158):** Form Customization не всегда выставлял CSS-класс `pnew_modDocument` на узле дерева — добавлен fallback на общий класс `pnew` для ядровых типов ресурсов. Убран дебаг `console.log` |
| 71 | +- **Кнопки «Дублировать» и «Удалить» не отображались у товаров и категорий (#128, #133):** MODX JS использует строгое сравнение `=== 1` для permission-флагов, а `json_encode(true)` даёт `true` вместо `1` — добавлен `(int)` cast для `canDuplicate`, `canDelete`, `canCreateRoot` в контроллерах update |
62 | 72 | - **`empty('0')` в OrderFieldManager::add() (#135):** значение `'0'` больше не считается пустым — фикс PHP-ловушки `empty('0') === true` |
63 | 73 | - **Return type `OrderAddressManager::saveToCustomerAddresses()` (#135):** метод возвращал `bool`, но был объявлен как `?msCustomerAddress` — исправлен на `bool` |
64 | 74 | - **`save_address` при снятии чекбокса (#135):** раньше снятие чекбокса игнорировалось (значение `'0'` не заходило в обработчик), теперь корректно удаляет ключ из properties |
|
67 | 77 | - **Статус заказа не отображался в истории заказов клиента (#139):** ad-hoc поля из LEFT JOIN (`status_name`, `status_color`) не гидрировались в xPDO-объекты (`hydrate_adhoc_fields` выключен по умолчанию) — заменено на предзагрузку статусов в map. Та же проблема исправлена для данных товаров в деталях заказа (`pagetitle`, `article`, `old_price`). Добавлен `#` к CSS-цветам в чанках |
68 | 78 | - **Некорректные URL в ЛК заказов клиента (#141):** кнопка «Сбросить» фильтра и ссылки пагинации вели на корень сайта (`/?`) из-за `<base href>` в шаблоне MODX — URL формируются server-side через `makeUrl()` + `http_build_query()`, пагинация сохраняет фильтр по статусу. Добавлены недостающие SVG-иконки в спрайт (`icon-arrow-left`, `icon-truck`, `icon-credit-card`, `icon-message`), исправлен `fill` → `stroke` для Feather-иконок в деталях заказа |
69 | 79 | - **Некорректные URL и хардкод английских сообщений в ЛК адресов (#142):** кнопки «Добавить адрес», «Редактировать», «Отмена» вели на корень сайта — URL формируются server-side через `makeUrl()` + `http_build_query()`. API-контроллер `CustomerAddressController` содержал хардкод английских строк вместо лексиконов — все сообщения заменены на `$this->modx->lexicon()`, добавлено 7 ключей в ru/en лексиконы |
| 80 | +- **Отсутствие ключа `desc` в свойствах сниппетов и источников при сборке пакета (#127):** добавлена инициализация `desc` пустой строкой если ключ отсутствует в определении свойства — устраняет warning/ошибку в `resolver_04_sources` и `resolver_08_snippet_properties` |
| 81 | + |
| 82 | +#### ⚠️ Breaking changes |
| 83 | + |
| 84 | +- **`cost_formatted` включает символ валюты (#147):** `cost_formatted` в списке заказов ЛК теперь включает символ валюты — кастомные чанки, добавляющие валюту вручную, получат двойной символ |
70 | 85 |
|
71 | 86 | --- |
72 | 87 |
|
| 88 | +### 🚀 Версия 1.6.0-beta1 |
| 89 | + |
| 90 | +**Тип релиза:** MINOR (beta) — httpOnly cookie auth, отмена заказов, community PRs |
| 91 | + |
| 92 | +--- |
| 93 | + |
| 94 | +#### ♻️ Рефакторинг |
| 95 | + |
| 96 | +**Интеграция standalone ЛК-модулей в архитектуру ms3 (#126):** |
| 97 | +- Три standalone модуля (`order-cancel.js`, `customer-addresses.js`, `auth-forms.js`) заменены на UI-классы в единой архитектуре (API → UI → hooks → message) |
| 98 | +- Новый `AuthUI` — класс для форм авторизации/регистрации с хуками `beforeLogin`/`afterLogin`, `beforeRegister`/`afterRegister` |
| 99 | +- `CustomerUI` расширен: отмена заказов, управление адресами (set default, delete) с хуками |
| 100 | +- `CustomerAPI` расширен: +4 метода (`login`, `register`, `setDefaultAddress`, `cancelOrder`) |
| 101 | +- 6 новых селекторов в `Selectors.js` для ЛК-компонентов |
| 102 | + |
| 103 | +**Promise-based confirm dialog (#126):** |
| 104 | +- Новый модуль `confirm.js` — Bootstrap Modal с fallback на native `confirm()` |
| 105 | +- i18n кнопок по атрибуту `<html lang>` (ru/en), переопределение через `ms3Lexicon` или параметры |
| 106 | +- Декларативная привязка через `data-ms3-confirm` атрибут на любом элементе |
| 107 | +- Заменяет все `confirm()` в ЛК: отмена заказа, удаление адреса, выход |
| 108 | + |
| 109 | +**UUID в URL заказов (#126):** |
| 110 | +- Ссылки на детали заказа используют `uuid` вместо integer `id` — безопаснее, не раскрывает количество заказов |
| 111 | +- Валидация формата UUID из `$_GET` перед запросом к БД |
| 112 | + |
| 113 | +#### ✨ Добавлено |
| 114 | + |
73 | 115 | **Отмена заказа покупателем (#119, Issue #117):** |
74 | 116 | - API endpoint `POST /api/v1/customer/orders/{id}/cancel` с авторизацией |
75 | 117 | - Кнопка «Отменить заказ» в списке заказов и на странице деталей |
|
81 | 123 |
|
82 | 124 | #### 🐛 Исправлено |
83 | 125 |
|
84 | | -- **Отсутствие ключа `desc` в свойствах сниппетов и источников при сборке пакета (#127):** добавлена инициализация `desc` пустой строкой если ключ отсутствует в определении свойства — устраняет warning/ошибку в `resolver_04_sources` и `resolver_08_snippet_properties` |
85 | 126 | - **httpOnly cookie token architecture (#124):** единый httpOnly cookie `ms3_token` вместо 4 несинхронизированных хранилищ (localStorage, `$_SESSION`, `ms3_customer_tokens`, `msCustomer.token`). Middleware injection (`$_COOKIE` → `$_REQUEST`) для обратной совместимости. Корзина сохраняется при логине/регистрации. |
86 | 127 | - Корректное отображение кнопки «Сохранить» для товаров и категорий в MODX 3.2 (#118) — явное вычисление `canSave`/`locked` с учётом `save_document`, компонентных permissions и `checkPolicy('save')` |
87 | 128 | - Формат `data` в политиках доступа для совместимости с апгрейдом MODX (#107, Issue #100) — устранено двойное JSON-кодирование при сборке пакета |
|
0 commit comments