ABGrid Engine
Сложное — просто
Enterprise-возможности без enterprise-боли
Профессиональный грид-компонент
Вы делаете конфигурацию — остальное ABGrid Engine
function onActionClick (action, row, column, grid) {
grid.msg("Действие : " + action,"Информация: Обработчик действий");
}
const cfgDemo = {
readOnly:true,
// ===== ЗАГРУЗКА ТАБЛИЦЫ =====
autoLoad: true,
data: {
dataKey: 'gridP',
url: '/api/demo/simple'
},
// ===== SCHEMA =====
schema: {
fields: {
id: {type: 'int', ui: {label: 'id', grid: {visible: false}}},
categoryId: {type: 'int', ui: {label: 'categoryId', grid: {visible: false}}},
category: {type: 'string', ui: {label: 'Категория', grid: {visible: true, width: '20%'}}},
name: {type: 'string', ui: {label: 'Наименование', grid: {visible: true, width: '60%'}}},
price: {type: 'number', ui: {label: 'Цена', grid: {visible: true, width: '15%'}}},
actions: { type: 'text',
ui: { label: 'Действия',
grid: { visible: true, width: '20%', colType: 'actions',
actions: {
edit: { classes: 'fa fa-pencil',
'aria-label': 'Редактирование', hint: 'Редактирование' },
trash: { classes: 'fa fa-trash-can',
'aria-label': 'Удалить', hint: 'Удалить' }
}
}
}
}
}
},
// ===== VIEW =====
view: {
height:230,
checkbox: false,
tableTitle: {
enabled: true,
caption:'Продукция',
hint: 'Продукция нашего магазина',
toggle: true
},
pager: {
enabled: true,
rpp: [3, 5, 10]
}
}
};
const gridDemo = new ABGrid("#demogrid", cfgDemo);
gridDemo.onActionClick(onActionClick);
Сравнение ABGrid Engine с другими Data Grid
ABGrid Engine не пытается быть лучшим Grid для любой задачи. Он создавался прежде всего для административных панелей, внутренних информационных систем и CRUD-heavy приложений, где таблица, формы, связанные данные и серверное взаимодействие образуют единый рабочий процесс. Ниже — практическое сравнение с популярными решениями.
| Возможность | ABGrid Engine | AG Grid | Tabulator | Handsontable | MUI X Data Grid | DataTables |
|---|---|---|---|---|---|---|
| Работа с данными | ||||||
| Vanilla JavaScript | Встроено | Встроено | Встроено | Встроено | Нет, React | Vanilla JavaScript: Нет (2.x требует jQuery; 3.x beta — без jQuery) |
| React / Vue | Адаптеры React и Vue | Встроено | Интеграция | Встроено | React | Интеграция |
| Server-side pagination | Встроено | Enterprise | Встроено | Встроено | Встроено | Встроено |
| Server-side sorting | Встроено | Enterprise | Встроено | Встроено | Встроено | Встроено |
| Server-side filtering | Встроено | Enterprise | Встроено | Встроено | Встроено | Встроено |
| Мультисортировка | Встроено | Встроено | Встроено | Встроено* | Pro | Встроено |
| Настраиваемое число строк на странице | Встроено | Встроено | Встроено | Встроено | Встроено | Встроено |
| Progressive / infinite loading при прокрутке | Нет, планируется | Enterprise | Встроено | Ограниченно | Pro | Scroller |
| Row virtualization / Virtual DOM | Нет | Встроено | Встроено | Встроено | Встроено | Scroller |
| Итоги по текущей странице | Встроено | Встроено / настройка | Встроено | Встроено | Premium | Требует кода |
| Глобальные / server-side итоги | Встроено | Enterprise | Ограниченно | Требует кода | Premium | Требует кода |
| sum / avg / min / max / count | Встроено | Enterprise | Встроено | Встроено | Premium | Требует кода |
| Фильтрация, представление и выбор строк | ||||||
| Custom filter из произвольного UI | Встроено — setFilter(object/function) | Filter Model / custom components | Встроено / custom filters | Filters API / код | Filter Model / custom operators | Search API / код |
| Автоматическая передача filter в server request | Встроено — единый filter в payload | Server-Side Row Model, Enterprise | Remote filtering | DataProvider / server filtering | Server filtering / Data Source | Server-side processing |
| Виртуальные / UI-only поля, отсутствующие в server row | Встроено — role: "grid" | Value getter / cell renderer | Formatter / настройка | Custom renderer / настройка | Value getter / renderCell | columns.render / настройка |
| Множественный выбор строк | Встроено | Встроено | Встроено | Встроено | Pro / Premium* | Select extension |
| Одиночный выбор строки | Встроено | Встроено | Встроено — selectableRows: 1 | Встроено / настройка | Встроено | Select: single |
| Декларативная Actions column | Встроено — colType: "actions" | Cell renderer | Formatter / код | Custom renderer | Встроено — type: "actions" | columns.render / код |
| Централизованный Actions handler с row/context | Встроено — onActionClick | Renderer callback / params | Cell callback / component | Renderer / hooks | Actions cell / params | Event handler / код |
| Связанные и иерархические данные | ||||||
| Master–Detail | Встроено | Enterprise | Требует кода | Требует кода | Pro | Child rows / код |
| Неограниченная иерархия Master–Detail | Встроено | Требует настройки/кода | Требует кода | Требует кода | Требует кода | Требует кода |
| Автоматическая загрузка и очистка Master–Detail цепочки | Встроено | Требует кода | Требует кода | Требует кода | Требует кода | Требует кода |
| Subgrid | Встроено | Detail Grid, Enterprise | Требует кода | Требует кода | Detail panel, Pro | Child rows |
| Subgrid на любом уровне Master–Detail | Встроено | Композиция / код | Требует кода | Требует кода | Требует кода | Требует кода |
| Одновременные Master–Detail + Subgrid | Встроено | Композиция / код | Требует кода | Требует кода | Требует кода | Требует кода |
| TreeGrid | Встроено | Enterprise | Встроено | Nested Rows | Pro | Нет |
| Lazy server loading TreeGrid | Встроено | Enterprise | Требует интеграции | Требует интеграции | Pro | Нет |
| Tree-aware CRUD / createChild | Встроено | Требует кода | Требует кода | Требует кода | Требует кода | Нет |
| DetailsPanels, связанные с текущей строкой | Встроено | Требует кода | Требует кода | Требует кода | Detail panel | Требует кода |
| Автоматическое заполнение / очистка DetailsPanels | Встроено | Требует кода | Требует кода | Требует кода | Требует кода | Требует кода |
| CRUD и формы | ||||||
| CRUD | Встроено | API / transactions | API | DataProvider | Встроено | Editor, платно |
| Отдельная встроенная CRUD-форма | EditForm | Требует кода | Требует кода | Нет, spreadsheet UX | Требует кода | Editor, платно |
| Форма генерируется из schema Grid | Встроено | Требует кода | Требует кода | Нет | Требует кода | Настройка Editor |
| Режимы create / edit / createChild | Встроено | Требует кода | Требует кода | Требует кода | Требует кода | Editor / код |
| Валидация формы | Встроено | Редакторы / код | Встроено | Встроено | Встроено | Editor |
| required / readOnly / visible по режиму формы | Встроено | Требует кода | Требует кода | Требует кода | Требует кода | Настройка / код |
| Autocomplete editor | Встроено | Требует редактора/кода | Встроено | Встроено | Требует компонента/кода | Editor |
| Password editor + confirmOf | Встроено | Требует кода | Требует кода | Требует кода | Требует кода | Editor / код |
| File upload из EditForm | Встроено | Требует кода | Требует кода | Требует кода | Требует кода | Editor / настройка |
| Multipart CRUD transport | Встроено | Требует кода | Требует кода | Требует кода | Требует кода | Настройка |
| Server-confirmed обновление строки без reload Grid | Встроено | API / transactions | API | Refetch после mutation | Встроено | Editor |
| Canonical row от сервера после update | Встроено | API | API / интеграция | DataProvider | Встроено | Editor |
| Интеграция с приложением | ||||||
| HTTP layer внутри Grid | Встроено | Datasource | Ajax | DataProvider | Data Source | Ajax |
| Request / response / error interceptors | Встроено | Через приложение | Hooks | Hooks / приложение | Через приложение | Callbacks / Ajax |
| Server-driven permissions / policy | Встроено | Требует кода | Требует кода | Требует кода | Требует кода | Требует кода |
| Toolbar permissions / requiresSelection | Встроено | Требует настройки/кода | Требует кода | Требует кода | Требует кода | Требует кода |
| Встроенная 401 redirect policy | Встроено | Через приложение | Через приложение | Через приложение | Через приложение | Через приложение |
| Диалоги и уведомления из API | Встроено — msg / confirm / confirmEx / toast | Через приложение / custom UI | Ограниченно — alert(), без confirm / toast | Встроено — Dialog + Notification | Через MUI Dialog / Snackbar | Через приложение |
| Plugin / module architecture | Встроено | Modules | Modules | Plugins | Packages | Extensions |
| Глобальный readOnly для CRUD-интерфейса | Встроено — блокирует create / update / delete | Настройка editing / application logic | Настройка editing / код | readOnly для Grid / cells | Настройка editing / код | View по умолчанию; с Editor — настройка |
| Режим View с внешним управлением | External Controller — Grid эмитит intents, решения принимает приложение | Events / API / application state | Events / callbacks / приложение | Hooks / API / приложение | Controlled models / React state | Events / API / приложение |
| Специализированные возможности и позиционирование | ||||||
| Spreadsheet UX | Нет | Ограниченно | Spreadsheet mode | Сильная сторона | Premium | Нет |
| Формулы | Нет | Ограниченно / код | Нет | Встроено | Premium | Нет |
| Pivot | Нет; иерархическая детализация — Subgrid | Enterprise | Нет | Требует решения/кода | Premium | Нет |
| Встроенные Charts | Нет | Enterprise | Нет | Нет | Premium | Расширения / интеграция |
| Очень большие client-side datasets | Не является целью | Сильная сторона | Сильная сторона | Virtualization | Virtualization | Scroller / server-side |
| Основной сценарий | CRUD / business UI | Universal / Enterprise | General-purpose Grid | Spreadsheet | React / Material UI | HTML / data tables |
| История / зрелость продукта | Архитектурный подход развивается с 2013 года; публичный продукт новый | Зрелый продукт / большая экосистема | Зрелый продукт / развитая экосистема | Зрелый продукт / большая экосистема | Зрелый продукт / экосистема MUI | Зрелый продукт / большая экосистема |
* У Handsontable мультисортировка доступна как отдельная возможность, однако новый server-side DataProvider имеет собственные ограничения на совместное использование с MultiColumnSorting. В MUI X одиночный выбор доступен в MIT Data Grid, а полноценный множественный выбор строк относится к Pro/Premium; checkbox selection имеет отдельные возможности конфигурации. Архитектурный подход ABGrid — декларативная конфигурация, при которой типовые операции берёт на себя движок, — развивается автором с 2013 года; ABGrid Engine как публичный продукт является современной реализацией этого подхода. Коммерческие редакции и состав функций конкурирующих продуктов могут меняться; перед выбором рекомендуется свериться с их актуальной документацией.
Когда стоит выбрать ABGrid Engine
ABGrid Engine имеет смысл выбирать, если вы разрабатываете административную панель, внутреннюю информационную систему или другое CRUD-heavy приложение и хотите описывать Grid, формы редактирования, связанные данные и серверное взаимодействие преимущественно конфигурацией.
Особенно хорошо ABGrid подходит для интерфейсов со сложными связями между данными: Master–Detail может образовывать иерархию без заданного движком ограничения глубины, каждый Grid в этой цепочке может одновременно иметь собственный Subgrid, а загрузкой, сменой master-записи и каскадной очисткой связанных Grid управляет сам движок.
Если требуется именно динамический Pivot-анализ с перестройкой измерений по строкам и колонкам, сложная аналитика или встроенные графики, разумнее рассмотреть AG Grid или MUI X. Для иерархического представления агрегированных данных с раскрытием исходной детализации ABGrid использует Subgrid. Для spreadsheet-интерфейсов и формул лучше подходит Handsontable. Если нужен универсальный Vanilla JavaScript Grid с Virtual DOM и progressive loading, стоит рассмотреть Tabulator.
ABGrid Engine не является лучшим Grid для любой задачи. Он создавался как инструмент для построения сложных CRUD-oriented бизнес-интерфейсов с минимумом прикладного кода вокруг Grid.