Skip to content

Commit b9d94a4

Browse files
authored
Merge pull request #159 from modx-pro/release/1.7.0-beta1
chore(release): v1.7.0-beta1
2 parents d433d0f + 8724b2f commit b9d94a4

4 files changed

Lines changed: 96 additions & 21 deletions

File tree

CHANGELOG.md

Lines changed: 60 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,24 @@
1717

1818
## Март 2026
1919

20-
### 🚀 Версия 1.6.0-beta1
20+
### 🚀 Версия 1.7.0-beta1
2121

22-
**Тип релиза:** MINOR (beta) — httpOnly cookie auth, отмена заказов, community PRs
22+
**Тип релиза:** MINOR (beta) — inline-edit, форматированные плейсхолдеры, миграция галереи на Vue, баг-фиксы
2323

2424
---
2525

2626
#### ♻️ Рефакторинг
2727

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+
2838
**Миграция галереи товара с ExtJS на Vue (#112, #150):**
2939
- ExtJS прослойка (gallery.panel, toolbar, view, window, ext.ddview) заменена чистыми Vue-компонентами
3040
- Новая архитектура: `ProductGallery` (оркестратор) → `ProductGalleryGrid` (vuedraggable + ContextMenu + поиск + пагинация) + `ProductGalleryToolbar` (выбор source + bulk actions) + `ProductGalleryEditDialog`
@@ -33,24 +43,19 @@
3343
- `GalleryUploader` (Uppy) встроен в `product-tabs` бандл, отдельный entry point `gallery-uploader` удалён
3444
- Удалено 6 ExtJS-файлов (~900 строк), добавлено 5 Vue-компонентов + composable (~1300 строк)
3545

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+
#### ✨ Добавлено
4847

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`
5253

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-чанки их больше не используют
5459

5560
**Поддержка кастомных полей в валидации заказа (#135):**
5661
- Кастомные поля из правил валидации доставки (например, чекбокс `agreement` с правилом `required|accepted`) сохраняются в `draft->properties['_validated']` между `order/add` и `order/submit`
@@ -59,6 +64,11 @@
5964

6065
#### 🐛 Исправлено
6166

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
6272
- **`empty('0')` в OrderFieldManager::add() (#135):** значение `'0'` больше не считается пустым — фикс PHP-ловушки `empty('0') === true`
6373
- **Return type `OrderAddressManager::saveToCustomerAddresses()` (#135):** метод возвращал `bool`, но был объявлен как `?msCustomerAddress` — исправлен на `bool`
6474
- **`save_address` при снятии чекбокса (#135):** раньше снятие чекбокса игнорировалось (значение `'0'` не заходило в обработчик), теперь корректно удаляет ключ из properties
@@ -67,9 +77,41 @@
6777
- **Статус заказа не отображался в истории заказов клиента (#139):** ad-hoc поля из LEFT JOIN (`status_name`, `status_color`) не гидрировались в xPDO-объекты (`hydrate_adhoc_fields` выключен по умолчанию) — заменено на предзагрузку статусов в map. Та же проблема исправлена для данных товаров в деталях заказа (`pagetitle`, `article`, `old_price`). Добавлен `#` к CSS-цветам в чанках
6878
- **Некорректные 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-иконок в деталях заказа
6979
- **Некорректные 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` в списке заказов ЛК теперь включает символ валюты — кастомные чанки, добавляющие валюту вручную, получат двойной символ
7085

7186
---
7287

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+
73115
**Отмена заказа покупателем (#119, Issue #117):**
74116
- API endpoint `POST /api/v1/customer/orders/{id}/cancel` с авторизацией
75117
- Кнопка «Отменить заказ» в списке заказов и на странице деталей
@@ -81,7 +123,6 @@
81123

82124
#### 🐛 Исправлено
83125

84-
- **Отсутствие ключа `desc` в свойствах сниппетов и источников при сборке пакета (#127):** добавлена инициализация `desc` пустой строкой если ключ отсутствует в определении свойства — устраняет warning/ошибку в `resolver_04_sources` и `resolver_08_snippet_properties`
85126
- **httpOnly cookie token architecture (#124):** единый httpOnly cookie `ms3_token` вместо 4 несинхронизированных хранилищ (localStorage, `$_SESSION`, `ms3_customer_tokens`, `msCustomer.token`). Middleware injection (`$_COOKIE``$_REQUEST`) для обратной совместимости. Корзина сохраняется при логине/регистрации.
86127
- Корректное отображение кнопки «Сохранить» для товаров и категорий в MODX 3.2 (#118) — явное вычисление `canSave`/`locked` с учётом `save_document`, компонентных permissions и `checkPolicy('save')`
87128
- Формат `data` в политиках доступа для совместимости с апгрейдом MODX (#107, Issue #100) — устранено двойное JSON-кодирование при сборке пакета

_build/config.inc.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
'name' => 'MiniShop3',
1313
'name_lower' => 'minishop3',
1414
'name_short' => 'ms3',
15-
'version' => '1.6.0',
15+
'version' => '1.7.0',
1616
'release' => 'beta1',
1717
// Install package to site right after build
1818
'install' => false,

core/components/minishop3/docs/changelog.txt

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,40 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [1.7.0-beta1]
9+
10+
### Added
11+
- Inline editing in category products grid: double-click to edit text, number, boolean fields directly in table (#116, #134)
12+
- Editable field configuration in Utilities → Grid Fields for category-products grid (#134)
13+
- Formatted currency and weight placeholders: `price_formatted`, `cost_formatted`, `old_price_formatted`, `old_cost_formatted`, `weight_formatted`, `discount_price_formatted`, `discount_cost_formatted` (#144, #147)
14+
- New `ms3_weight_unit` system setting, `Format::weightWithUnit()` and `Format::getWeightUnit()` methods (#147)
15+
- Custom fields support in order validation: fields from delivery validation rules persist in draft properties between `order/add` and `order/submit` (#135)
16+
17+
### Refactored
18+
- Removed unused `ms3_category_grid_fields` setting and `Processors\Category\GetList` processor (#145, #146)
19+
- Simplified `Product\GetList` processor: removed non-combo logic, added `combo: true` validation (#151, #152)
20+
- Migrated product gallery from ExtJS to Vue: 6 ExtJS files (~900 lines) replaced with 5 Vue components + composable (~1300 lines) (#112, #150)
21+
- New `Product\UpdateSource` processor for media source change without full form save (#150)
22+
23+
### Fixed
24+
- Product options not deletable in admin: `options-color[]` parsed as `color[]` instead of `color` — extracted to `Utils::extractOptionKey()` (#148, #149)
25+
- Visual editor (TinyMCE) broken in product category: unconditional value reset and missing `modx-resource-content` block restored (#156)
26+
- Custom category options deleted on product save: `saveOptions(null, true)` removed options not in auto-collected JSON fields — now forces `removeOther=false` when `options=null` (#153, #158)
27+
- "Create Document" missing from category context menu: fallback to `pnew` class when `pnew_modDocument` not set by Form Customization (#153, #158)
28+
- Duplicate/Delete buttons missing for products and categories: permission flags compared with `=== 1` but `json_encode(true)` produces `true` — added `(int)` cast (#128, #133)
29+
- `empty('0')` in `OrderFieldManager::add()`: value `'0'` no longer treated as empty (#135)
30+
- `OrderAddressManager::saveToCustomerAddresses()` return type fixed from `?msCustomerAddress` to `bool` (#135)
31+
- `save_address` checkbox uncheck now correctly removes key from properties (#135)
32+
- Table prefix missing for relation fields in grid config — aggregate values returned zeros (#136)
33+
- Customers grid sorting and server-side pagination: `getIterator()` received sort/pagination params as `$cacheFlag` (#137)
34+
- Order status not displayed in customer order history: ad-hoc JOIN fields not hydrated — replaced with status map preloading (#139)
35+
- Incorrect URLs in customer orders: reset button and pagination links pointed to site root — URLs built server-side via `makeUrl()` (#141)
36+
- Incorrect URLs and hardcoded English messages in customer addresses — URLs built server-side, messages replaced with lexicon keys (#142)
37+
- Missing `desc` key in snippet and source properties during package build (#127)
38+
39+
### Breaking Changes
40+
- `cost_formatted` in customer order list now includes currency symbol — custom chunks adding currency manually will get double symbol (#147)
41+
842
## [1.6.0-beta1]
943

1044
### Added

core/components/minishop3/src/MiniShop3.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
class MiniShop3
2222
{
23-
public $version = '1.6.0-beta1';
23+
public $version = '1.7.0-beta1';
2424

2525
/** @var modX $modx */
2626
public $modx;

0 commit comments

Comments
 (0)