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
Александр Туниеков
Александр Туниеков
53 минуты назад
modx.pro
18
Поблагодарить автора Отправить деньги

Комментарии: 4

Иван Бочкарев
46 минут назад
Вам явно нужен дизайнер и какой то скилл, который подтянет визуал… =)
    Александр Туниеков
    35 минут назад
    Это точно :-) но дизайнера нет. Делаю стараюсь но дизайн не мое :-(
      Иван Бочкарев
      33 минуты назад
      В Prime Vue все есть — у нас весь интерфейс в minishop3 на нем построен, как и все компоненты которые имеют зависимость от VueTools
        Александр Туниеков
        23 минуты назад
        Prime Vue datatable тупит на 200+ строк и в виртуальном скролинге высота полей фиксирована. Вот нам в итоге и не подошло. Директор сказал расчет должен сразу показываться без пагинации. Только скрол. А это может быть 1000 строк.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    4