ABGrid Engine

ABGrid Engine

Сложное — просто

Движок для сложных табличных CRUD-интерфейсов

Вы делаете конфигурацию — остальное ABGrid Engine

Vanilla JavaScript · React · Vue · TypeScript

Код
                
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 приложений, где таблица, формы, связанные данные и серверное взаимодействие образуют единый рабочий процесс. Ниже — практическое сравнение с популярными Data Grid, а также с React-admin — более широким React-фреймворком для административных и B2B-приложений. Поэтому часть критериев для React-admin относится к его собственным компонентам, а часть — к интегрируемым Grid-модулям.

Встроено — штатная возможность Платно — требуется коммерческая редакция или модуль Требует кода — реализуемо через API/свою интеграцию Ограниченно — возможность есть, но сценарий отличается или имеет ограничения Нет — не поддерживается или не является задачей продукта
Возможность ABGrid Engine AG Grid Tabulator Handsontable MUI X Data Grid DataTables React-admin
Работа с данными
Vanilla JavaScriptВстроеноВстроеноВстроеноВстроеноНет, ReactVanilla JavaScript: Нет (2.x требует jQuery; 3.x beta — без jQuery)Нет, React
React / VueАдаптеры React и VueВстроеноИнтеграцияВстроеноReactИнтеграцияReact
Server-side paginationВстроеноEnterpriseВстроеноВстроеноВстроеноВстроеноВстроено — Data Provider
Server-side sortingВстроеноEnterpriseВстроеноВстроеноВстроеноВстроеноВстроено — Data Provider
Server-side filteringВстроеноEnterpriseВстроеноВстроеноВстроеноВстроеноВстроено — Data Provider
МультисортировкаВстроеноВстроеноВстроеноВстроено*ProВстроеноDatagridAG / настройка
Настраиваемое число строк на страницеВстроеноВстроеноВстроеноВстроеноВстроеноВстроеноВстроено
Progressive / infinite loading при прокруткеНет, планируетсяEnterpriseВстроеноОграниченноProScrollerInfinite List / DatagridAG
Row virtualization / Virtual DOMНетВстроеноВстроеноВстроеноВстроеноScrollerDatagridAG
Итоги по текущей страницеВстроеноВстроено / настройкаВстроеноВстроеноPremiumТребует кодаТребует кода / DatagridAG
Глобальные / server-side итогиВстроеноEnterpriseОграниченноТребует кодаPremiumТребует кодаТребует кода / API
sum / avg / min / max / countВстроеноEnterpriseВстроеноВстроеноPremiumТребует кодаDatagridAG / AG Grid
Фильтрация, представление и выбор строк
Custom filter из произвольного UIВстроено — setFilter(object/function)Filter Model / custom componentsВстроено / custom filtersFilters API / кодFilter Model / custom operatorsSearch API / кодВстроено / custom filters
Автоматическая передача filter в server requestВстроено — единый filter в payloadServer-Side Row Model, EnterpriseRemote filteringDataProvider / server filteringServer filtering / Data SourceServer-side processingВстроено — Data Provider
Виртуальные / UI-only поля, отсутствующие в server rowВстроено — role: "grid"Value getter / cell rendererFormatter / настройкаCustom renderer / настройкаValue getter / renderCellcolumns.render / настройкаВстроено — компоненты / render
Множественный выбор строкВстроеноВстроеноВстроеноВстроеноPro / Premium*Select extensionВстроено
Одиночный выбор строкиВстроеноВстроеноВстроено — selectableRows: 1Встроено / настройкаВстроеноSelect: singleВстроено / настройка
Декларативная Actions columnВстроено — colType: "actions"Cell rendererFormatter / кодCustom rendererВстроено — type: "actions"columns.render / кодВстроено — buttons/components
Централизованный Actions handler с row/contextВстроено — onActionClickRenderer callback / paramsCell callback / componentRenderer / hooksActions cell / paramsEvent handler / кодReact handlers / RecordContext
Связанные и иерархические данные
Master–DetailВстроеноEnterpriseТребует кодаТребует кодаProChild rows / кодRelationships / композиция
Неограниченная иерархия Master–DetailВстроеноТребует настройки/кодаТребует кодаТребует кодаТребует кодаТребует кодаТребует композиции / кода
Автоматическая загрузка и очистка Master–Detail цепочкиВстроеноТребует кодаТребует кодаТребует кодаТребует кодаТребует кодаТребует кода / state
SubgridВстроеноDetail Grid, EnterpriseТребует кодаТребует кодаDetail panel, ProChild rowsВстроено — expand panel
Subgrid на любом уровне Master–DetailВстроеноКомпозиция / кодТребует кодаТребует кодаТребует кодаТребует кодаКомпозиция React-компонентов
Одновременные Master–Detail + SubgridВстроеноКомпозиция / кодТребует кодаТребует кодаТребует кодаТребует кодаКомпозиция / код
TreeGridВстроеноEnterpriseВстроеноNested RowsProНетEnterprise — ra-tree / DatagridAG + AG Grid
Lazy server loading TreeGridВстроеноEnterpriseТребует интеграцииТребует интеграцииProНетEnterprise / Data Provider
Tree-aware CRUD / createChildВстроеноТребует кодаТребует кодаТребует кодаТребует кодаНетEnterprise — ra-tree
DetailsPanels, связанные с текущей строкойВстроеноТребует кодаТребует кодаТребует кодаDetail panelТребует кодаExpand / Show / custom layout
Автоматическое заполнение / очистка DetailsPanelsВстроеноТребует кодаТребует кодаТребует кодаТребует кодаТребует кодаReact state / context
CRUD и формы
CRUDВстроеноAPI / transactionsAPIDataProviderВстроеноEditor, платноСильная сторона / встроено
Отдельная встроенная CRUD-формаEditFormТребует кодаТребует кодаНет, spreadsheet UXТребует кодаEditor, платноВстроено — Create / Edit + Forms
Форма генерируется из schema GridВстроеноТребует кодаТребует кодаНетТребует кодаНастройка EditorJSON Schema Form — Enterprise
Режимы create / edit / createChildВстроеноТребует кодаТребует кодаТребует кодаТребует кодаEditor / кодCreate / Edit; createChild через tree/код
Валидация формыВстроеноРедакторы / кодВстроеноВстроеноВстроеноEditorВстроено
required / readOnly / visible по режиму формыВстроеноТребует кодаТребует кодаТребует кодаТребует кодаНастройка / кодProps / permissions / код
Autocomplete editorВстроеноТребует редактора/кодаВстроеноВстроеноТребует компонента/кодаEditorВстроено — AutocompleteInput
Password editor + confirmOfВстроеноТребует кодаТребует кодаТребует кодаТребует кодаEditor / кодPasswordInput + custom validation
File upload из EditFormВстроеноТребует кодаТребует кодаТребует кодаТребует кодаEditor / настройкаFileInput + Data Provider
Multipart CRUD transportВстроеноТребует кодаТребует кодаТребует кодаТребует кодаНастройкаData Provider / настройка
Server-confirmed обновление строки без reload GridВстроеноAPI / transactionsAPIRefetch после mutationВстроеноEditorВстроено — mutations/cache
Canonical row от сервера после updateВстроеноAPIAPI / интеграцияDataProviderВстроеноEditorВстроено — Data Provider response
Интеграция с приложением
HTTP layer внутри GridВстроеноDatasourceAjaxDataProviderData SourceAjaxData Provider / fetchJson
Request / response / error interceptorsВстроеноЧерез приложениеHooksHooks / приложениеЧерез приложениеCallbacks / AjaxData Provider / lifecycle callbacks
Server-driven permissions / policyВстроеноТребует кодаТребует кодаТребует кодаТребует кодаТребует кодаAuth Provider / canAccess
Toolbar permissions / requiresSelectionВстроеноТребует настройки/кодаТребует кодаТребует кодаТребует кодаТребует кодаAccess Control / component logic
Встроенная 401 redirect policyВстроеноЧерез приложениеЧерез приложениеЧерез приложениеЧерез приложениеЧерез приложениеAuth Provider / checkError
Диалоги и уведомления из APIВстроено — msg / confirm / confirmEx / toastЧерез приложение / custom UIОграниченно — alert(), без confirm / toastВстроено — Dialog + NotificationЧерез MUI Dialog / SnackbarЧерез приложениеВстроено — Confirm / Notification
Plugin / module architectureВстроеноModulesModulesPluginsPackagesExtensionsPackages / providers / hooks
Глобальный readOnly для CRUD-интерфейсаВстроено — блокирует create / update / deleteНастройка editing / application logicНастройка editing / кодreadOnly для Grid / cellsНастройка editing / кодView по умолчанию; с Editor — настройкаPermissions / resource config
Режим View с внешним управлениемExternal Controller — Grid эмитит intents, решения принимает приложениеEvents / API / application stateEvents / callbacks / приложениеHooks / API / приложениеControlled models / React stateEvents / API / приложениеReact state / hooks / contexts
Уровень приложения / Admin framework
AuthenticationЧерез приложениеЧерез приложениеЧерез приложениеЧерез приложениеЧерез приложениеЧерез приложениеВстроено — Auth Provider
Authorization / Access ControlИнтеграция с приложениемЧерез приложениеЧерез приложениеЧерез приложениеЧерез приложениеЧерез приложениеВстроено — canAccess / permissions
Fine-grained RBACЧерез приложениеЧерез приложениеЧерез приложениеЧерез приложениеЧерез приложениеЧерез приложениеEnterprise — ra-rbac
Routing административного приложенияНе задача GridНе задача GridНе задача GridНе задача GridНе задача GridНе задача GridВстроено
i18n приложенияЧерез приложениеЧерез приложениеЧерез приложениеЧерез приложениеЧерез приложениеЧерез приложениеВстроено — i18nProvider
Готовые layout / menu / navigationНе задача GridНе задача GridНе задача GridНе задача GridНе задача GridНе задача GridВстроено
Единый abstraction layer для backend APIВстроено — HTTP / CRUD contractDatasourceAjaxDataProviderData SourceAjaxВстроено — Data Provider
TypeScript / strong typingПоддерживается — abgrid.d.tsВстроеноТипы / интеграцияВстроеноВстроеноТипы экосистемыСильная сторона
Можно встроить в существующий SSR / server-rendered UI без SPAДаДаДаДаНет, ReactДаНет, React application framework
Специализированные возможности и позиционирование
Spreadsheet UXНетОграниченноSpreadsheet modeСильная сторонаPremiumНетEditable Datagrid / DatagridAG, Enterprise
ФормулыНетОграниченно / кодНетВстроеноPremiumНетЧерез grid / custom code
PivotНет; иерархическая детализация — SubgridEnterpriseНетТребует решения/кодаPremiumНетDatagridAG + AG Grid Enterprise
Встроенные ChartsНетEnterpriseНетНетPremiumРасширения / интеграцияИнтеграция / custom components
Очень большие client-side datasetsНе является цельюСильная сторонаСильная сторонаVirtualizationVirtualizationScroller / server-sideDatagridAG / virtualization
Основной сценарийCRUD / business UIUniversal / EnterpriseGeneral-purpose GridSpreadsheetReact / Material UIHTML / data tablesReact B2B / admin applications
История / зрелость продуктаАрхитектурный подход развивается с 2013 года; публичный продукт новыйЗрелый продукт / большая экосистемаЗрелый продукт / развитая экосистемаЗрелый продукт / большая экосистемаЗрелый продукт / экосистема MUIЗрелый продукт / большая экосистемаЗрелый продукт; развивается с 2016 года

* У 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.

Если административная часть строится как полноценное React-приложение и нужны готовые routing, authentication/authorization, i18n, layout, menu и общая инфраструктура B2B-приложения, стоит рассмотреть React-admin. ABGrid занимает другой уровень: его можно встроить в уже существующее server-rendered или frontend-приложение и использовать как независимый движок сложных Grid/CRUD-интерфейсов, не переводя приложение на React SPA.

ABGrid Engine не является лучшим Grid для любой задачи. Он создавался как инструмент для построения сложных CRUD-oriented бизнес-интерфейсов с минимумом прикладного кода вокруг Grid.