gtsAPI 1.1.7 — таблицы на TanStack, инлайн-редактирование как в Excel
Привет всем. Добрался выложить изменения в gtsAPI.
Основное
1. Движок таблиц изменён с PrimeVue DataTable на TanStack. PrimeVue несколько подтормаживает на 200+ строках и не поддерживает динамическую высоту строк.
2. Нам потребовалось, чтобы менеджеры быстро вводили расчёты. В итоге сделано инлайн-редактирование ячеек почти в стиле Excel. Это намного быстрее, чем в прошлых версиях, и быстрее, чем в MIGX. Хотя и чуть медленнее, чем Excel, — но мы сразу сохраняем данные в базу. Быстрее уже не получится.
3. Таблицы и компоненты на PVTables теперь выводятся и на фронте, и в админке MODX. Раньше в менеджере жил только интерфейс getTables. Теперь пункт меню вешается на страницу gtsAPI, а что на ней показать — таблицу, вкладки или своё Vue-приложение — описывается параметром меню. Свой контроллер писать не нужно.
4. Наша рабочая конфигурация — MODX 2.8, PHP 7.4, MySQL 5.7. Протестировал на MODX 3, PHP 8.3, MySQL 8.2: основное работает. В течение полугода думаем перейти на MODX 3.

Установка пакетов
Резолвер зависимостей: недостающие пакеты доустанавливаются ПЕРЕД установкой самого пакета — поиск у провайдера или прямая ссылка на transport.zip. Список задаётся в _build/configs/dependencies.js.
Динамические доп. поля применяются прямо при установке, без ручного прогона. Снос колонок вынесен в отдельную команду админки «Снести колонки удалённых полей».
Поле, добавленное в схему, создаётся с ПЕРВОЙ установки — раньше нужна была вторая.
ALTER выполняется только при реальном расхождении колонки с описанием: установка gtsShop — с 573 перестроек таблиц до одной, сборка пакета 21.6 с против 7.8 с.
Ключевые колонки (id, первичный ключ) и динамические доп. поля не удаляются ни при каких условиях; чужая таблица класса-наследника не изменяется.
Конфиги страниц (resources.js) и данных (data.js) умеют раскладку по сайтам: ставится только то, что относится к текущей инсталляции.
Резолверы прав и групп пользователей: пакет привозит шаблон политик MODX, своих групп не создаёт.
Таблицы и интерфейс
Таблица переехала на TanStack, форк PrimeVue DataTable удалён: виртуальный скролл, автоподгонка и ручной ресайз колонок, выбор видимых колонок, закреплённая колонка действий, sticky-заголовки.
Редактирование: inline и попап, автодополнение в текстовых ячейках, undo/redo для CRUD.
Выделение диапазона ячеек как в Excel со счётом суммы — посмотреть итог по колонке или куску таблицы прямо на месте, не выгружая ничего в Excel.
Фильтры: серверные и клиентский чеклист с разделением в интерфейсе, пустые даты, datetime со своими режимами, фильтры из URL с namespace таблицы.
Файлы: тип ячейки file с превью и выбором, съёмка с камеры, браузер файлов, распределение загрузок по год/месяц, многостраничный снимок документа в PDF.
Мобильный режим: карточки вместо таблицы, роли полей, флаги mobile_only/desktop_only.
Точечное обновление строк (rows_delta) с подписями автокомплитов и сохранением раскрытых дочерних строк.
Модальная форма может приходить в ответе действия — сервер присылает поля, значения и куда отправлять. Ответ на отправку снова может содержать форму, поэтому шагов может быть сколько угодно.
Журнал и версии записей
gtsAPILog: лог действий на стороне сервера с настраиваемым сроком хранения и ежесуточной чисткой, вкладка в админке.
Версии записи и откат к предыдущему значению (действия versions/restore_version, флаг save_version_row).
Логирование UniTree и диспатч триггеров целевого класса на create/update/delete.
Экспорт и печать
Excel: TZ-safe даты, html в текст, настраиваемые ширины колонок и скрытие колонки через col_widths, форматирование decimal, datetime, пустых ячеек.
Печать: PVPrintAction в строке, компактный режим, классы col-<field> для стилей. Для печати нужен компонент PVPrint — печать на физические принтеры через print-server и виртуальный PDF-принтер. Документация на гитхабе: tuniekov/PVPrint
Библиотека PHPExcel вынесена в отдельный пакет — одна копия на сайт вместо копии в каждом компоненте. Заодно починена под PHP 8: там любая выгрузка с автофильтром падала.
Админка gtsAPI
Своя страница вместо интерфейса getTables. Контроллер разбирает параметр меню &config и вызывает указанные в нём сниппеты — таблицу, вкладки или Vue-приложение. Так любой компонент выводится в меню MODX без собственного контроллера, а конфигурация страницы хранится в системной настройке.
Установщик пакетов умеет ставить пункты меню менеджера — в PVExtra появился _build/configs/menus.js, формат тот же, что у сниппетов.
MODX 3 и PHP 8
Резолверы зависимостей читают ответ провайдера в обоих форматах: на MODX 3 provider->request() отдаёт PSR-7 объект, а не modRestClient со свойством ->response. Из-за этого раньше на MODX 3 не устанавливалась ни одна зависимость.
Зависимости ищутся у всех подключённых провайдеров, а не только у указанного в конфиге: pdoTools живёт на modx.com, а не на modstore.
Динамические доп. поля заработали на MODX 3: там $modx->map — объект xPDOMap, а классы лежат под полным именем (MODX\Revolution\modResource), и доп. поля до карты просто не доезжали.
Доп. поля работают и с классами ядра MODX: раньше modResource молча выпадал из синхронизации, потому что «родные» поля брались только из xml-схемы компонента, а у ядра её нет.
Убраны PHP warning на PHP 8 в контроллерах таблиц и при установке.
Исправления
Безопасность: правки по аудиту API, удалены небезопасные скрипты copy_package.php и rename_it.php.
gtsAPILog: поля переименованы из зарезервированных слов MySQL (table_name → log_table, action → log_action).
Пустая дата с фронта сохраняется как NULL, а не режется.
Триггеры before-read получают правило и поля по ссылке и могут менять запрос.
Битый UTF-8 в теле запроса больше не ломает JSON-кодирование.
Установка больше не перезаписывает системные настройки: в них лежат значения, выставленные админом сайта, а обновление затирало их значениями из сборки.
Множество мелких фиксов CRUD, фильтров, деревьев и автокомплитов.
Так же ещё много что было добавлено. Но документацию буду пополнять по запросу. К сожалению, пока gtsAPI не взлетело :-)
Гитхаб touol/gtsAPI
Гитхаб PVTables touol/PVTables
npm PVTables pvtables
4
Основное
1. Движок таблиц изменён с PrimeVue DataTable на TanStack. PrimeVue несколько подтормаживает на 200+ строках и не поддерживает динамическую высоту строк.
2. Нам потребовалось, чтобы менеджеры быстро вводили расчёты. В итоге сделано инлайн-редактирование ячеек почти в стиле Excel. Это намного быстрее, чем в прошлых версиях, и быстрее, чем в MIGX. Хотя и чуть медленнее, чем Excel, — но мы сразу сохраняем данные в базу. Быстрее уже не получится.
3. Таблицы и компоненты на PVTables теперь выводятся и на фронте, и в админке MODX. Раньше в менеджере жил только интерфейс getTables. Теперь пункт меню вешается на страницу gtsAPI, а что на ней показать — таблицу, вкладки или своё Vue-приложение — описывается параметром меню. Свой контроллер писать не нужно.
4. Наша рабочая конфигурация — MODX 2.8, PHP 7.4, MySQL 5.7. Протестировал на MODX 3, PHP 8.3, MySQL 8.2: основное работает. В течение полугода думаем перейти на MODX 3.

Установка пакетов
Резолвер зависимостей: недостающие пакеты доустанавливаются ПЕРЕД установкой самого пакета — поиск у провайдера или прямая ссылка на transport.zip. Список задаётся в _build/configs/dependencies.js.
Динамические доп. поля применяются прямо при установке, без ручного прогона. Снос колонок вынесен в отдельную команду админки «Снести колонки удалённых полей».
Поле, добавленное в схему, создаётся с ПЕРВОЙ установки — раньше нужна была вторая.
ALTER выполняется только при реальном расхождении колонки с описанием: установка gtsShop — с 573 перестроек таблиц до одной, сборка пакета 21.6 с против 7.8 с.
Ключевые колонки (id, первичный ключ) и динамические доп. поля не удаляются ни при каких условиях; чужая таблица класса-наследника не изменяется.
Конфиги страниц (resources.js) и данных (data.js) умеют раскладку по сайтам: ставится только то, что относится к текущей инсталляции.
Резолверы прав и групп пользователей: пакет привозит шаблон политик MODX, своих групп не создаёт.
Таблицы и интерфейс
Таблица переехала на TanStack, форк PrimeVue DataTable удалён: виртуальный скролл, автоподгонка и ручной ресайз колонок, выбор видимых колонок, закреплённая колонка действий, sticky-заголовки.
Редактирование: inline и попап, автодополнение в текстовых ячейках, undo/redo для CRUD.
Выделение диапазона ячеек как в Excel со счётом суммы — посмотреть итог по колонке или куску таблицы прямо на месте, не выгружая ничего в Excel.
Фильтры: серверные и клиентский чеклист с разделением в интерфейсе, пустые даты, datetime со своими режимами, фильтры из URL с namespace таблицы.
Файлы: тип ячейки file с превью и выбором, съёмка с камеры, браузер файлов, распределение загрузок по год/месяц, многостраничный снимок документа в PDF.
Мобильный режим: карточки вместо таблицы, роли полей, флаги mobile_only/desktop_only.
Точечное обновление строк (rows_delta) с подписями автокомплитов и сохранением раскрытых дочерних строк.
Модальная форма может приходить в ответе действия — сервер присылает поля, значения и куда отправлять. Ответ на отправку снова может содержать форму, поэтому шагов может быть сколько угодно.
Журнал и версии записей
gtsAPILog: лог действий на стороне сервера с настраиваемым сроком хранения и ежесуточной чисткой, вкладка в админке.
Версии записи и откат к предыдущему значению (действия versions/restore_version, флаг save_version_row).
Логирование UniTree и диспатч триггеров целевого класса на create/update/delete.
Экспорт и печать
Excel: TZ-safe даты, html в текст, настраиваемые ширины колонок и скрытие колонки через col_widths, форматирование decimal, datetime, пустых ячеек.
Печать: PVPrintAction в строке, компактный режим, классы col-<field> для стилей. Для печати нужен компонент PVPrint — печать на физические принтеры через print-server и виртуальный PDF-принтер. Документация на гитхабе: tuniekov/PVPrint
Библиотека PHPExcel вынесена в отдельный пакет — одна копия на сайт вместо копии в каждом компоненте. Заодно починена под PHP 8: там любая выгрузка с автофильтром падала.
Админка gtsAPI
Своя страница вместо интерфейса getTables. Контроллер разбирает параметр меню &config и вызывает указанные в нём сниппеты — таблицу, вкладки или Vue-приложение. Так любой компонент выводится в меню MODX без собственного контроллера, а конфигурация страницы хранится в системной настройке.
Установщик пакетов умеет ставить пункты меню менеджера — в PVExtra появился _build/configs/menus.js, формат тот же, что у сниппетов.
MODX 3 и PHP 8
Резолверы зависимостей читают ответ провайдера в обоих форматах: на MODX 3 provider->request() отдаёт PSR-7 объект, а не modRestClient со свойством ->response. Из-за этого раньше на MODX 3 не устанавливалась ни одна зависимость.
Зависимости ищутся у всех подключённых провайдеров, а не только у указанного в конфиге: pdoTools живёт на modx.com, а не на modstore.
Динамические доп. поля заработали на MODX 3: там $modx->map — объект xPDOMap, а классы лежат под полным именем (MODX\Revolution\modResource), и доп. поля до карты просто не доезжали.
Доп. поля работают и с классами ядра MODX: раньше modResource молча выпадал из синхронизации, потому что «родные» поля брались только из xml-схемы компонента, а у ядра её нет.
Убраны PHP warning на PHP 8 в контроллерах таблиц и при установке.
Исправления
Безопасность: правки по аудиту API, удалены небезопасные скрипты copy_package.php и rename_it.php.
gtsAPILog: поля переименованы из зарезервированных слов MySQL (table_name → log_table, action → log_action).
Пустая дата с фронта сохраняется как NULL, а не режется.
Триггеры before-read получают правило и поля по ссылке и могут менять запрос.
Битый UTF-8 в теле запроса больше не ломает JSON-кодирование.
Установка больше не перезаписывает системные настройки: в них лежат значения, выставленные админом сайта, а обновление затирало их значениями из сборки.
Множество мелких фиксов CRUD, фильтров, деревьев и автокомплитов.
Так же ещё много что было добавлено. Но документацию буду пополнять по запросу. К сожалению, пока gtsAPI не взлетело :-)
Гитхаб touol/gtsAPI
Гитхаб PVTables touol/PVTables
npm PVTables pvtables
Комментарии: 4