From 37884920896198b102ed1b04a6a877667cdfdd4a Mon Sep 17 00:00:00 2001 From: Mikhail Chusavitin Date: Fri, 26 Jun 2026 10:32:57 +0300 Subject: [PATCH] docs: release notes v2.23 Co-Authored-By: Claude Sonnet 4.6 --- releases/v2.23/RELEASE_NOTES.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 releases/v2.23/RELEASE_NOTES.md diff --git a/releases/v2.23/RELEASE_NOTES.md b/releases/v2.23/RELEASE_NOTES.md new file mode 100644 index 0000000..60d2fbc --- /dev/null +++ b/releases/v2.23/RELEASE_NOTES.md @@ -0,0 +1,23 @@ +# QuoteForge v2.23 + +Дата релиза: 2026-06-26 +Тег: `v2.23` + +## Что нового + +### Исправления + +- **Конфигуратор больше не зависает на «Загрузка...».** При открытии сохранённой конфигурации поле `category` у позиций корзины было `undefined` (в `config.items` хранятся только `lot_name/quantity/unit_price`), что приводило к `TypeError` в JS. Теперь после загрузки `allComponents` корзина обогащается категориями из справочника компонентов. + +- **Регистронезависимые сравнения категорий в конфигураторе.** Все сравнения `category` переведены на хелпер `ciStr()` вместо принудительного `.toUpperCase()` — интерфейс показывает категории как есть, логика сравнения регистронезависима. + +- **Вкладка Other показывает только компоненты без назначенной категории.** Исправлена ошибка при которой компоненты DKC/CTL/ENC попадали в Other при режиме «server»: `ASSIGNED_CATEGORIES` пересобирался из отфильтрованного списка, а не из полного статического. Теперь используется `_allCategories`. + +- **Исправлена ошибка «record not found» при синхронизации проектов.** `UpsertByUUID` передавал ненулевой `ID` в `INSERT … ON DUPLICATE KEY UPDATE`, из-за чего MariaDB разрешала коллизию по первичному ключу чужой строки, не обновляя `uuid`, — последующий `SELECT` не находил запись. Теперь `project.ID` сбрасывается в `0` до вставки. + +- **Устранён бесконечный retry при ошибках синхронизации на стороне сервера.** `RepairPendingChanges` сбрасывал счётчик попыток даже если локальные данные не менялись, что создавало бесконечный цикл при серверных ошибках. Repair-функции теперь возвращают `(bool, error)` и сброс происходит только при `modified=true`. + +## Запуск на macOS + +Снимите карантинный атрибут через терминал: `xattr -d com.apple.quarantine /path/to/qfs-darwin-arm64` +После этого бинарник запустится без предупреждения Gatekeeper.