-
-
Notifications
You must be signed in to change notification settings - Fork 14
Migration to 9.x
This new release is focused around 2 things, we now ship ESM-only builds (in other words, CommonJS builds are fully dropped and only ESM will remain), this move will cut the npm download size by half. The other big change is an internal one which is an organizational one, I'm moving all framework wrappers directly into Slickgrid-Universal (Angular, Aurelia, React and Vue wrappers are now all located under the frameworks/ folder), this will help tremendously with the project maintenance (any new PR will now run against all frameworks all at once (catching bugs early), publishing a new version is becoming a single execution for all frameworks all at once, and finally having a single codebase to test & troubleshoot any wrapper, etc... will be so much easier to handle). Now Slickgrid-Universal name totally makes sense with this new structure change 🌐
Wait, what happened to version 6 to 8?
I'm skipping versions 6-8 and going straight to v9.0 because some of the wrappers (Angular-Slickgrid, Aurelia-Slickgrid) were already at v8.x and so the next available major version bump for everyone is v9.0
The other great thing about having everything under the same roof/project is that every package will be released at the exact same time with the exact same versions across the board. Everything will be released under v9.0 and whenever a new feature/bugfix comes in, then every package will be bumped to v9.1 and so on (no more version discrepancies).
- minimum requirements bump
- React v19+
- Node v20+
- upgrade Vanilla-Calendar-Pro to v3 with flat config
-
i18next
is now totally optional- requires i18next v25+ (when installed)
- shorter attribute names
- skipping v6-8 and going straight to v9.0
- now using
clipboard
API, used in ExcelCopyBuffer/ContextMenu/CellCopy, which might requires end user permissions - removing Arrow pointer from Custom Tooltip addon (because it was often offset with the cell text)
Note: if you come from an earlier version, please make sure to follow each migrations in their respected order (review previous migration guides)
-
colspanCallback
was deprecated and removed, please use theglobalItemMetadataProvider
instead
gridOptions = {
- colspanCallback: this.renderDifferentColspan.bind(this),
+ dataView: {
+ globalItemMetadataProvider: {
+ getRowMetadata: this.renderDifferentColspan.bind(this)
+ }
+ }
}
-
groupingService
fromSlickgridReactInstance
was deprecate and removed, but I would be very surprised if anyone used it. Simply useheaderGroupingService
instead.
function reactGridReady(reactGrid: SlickgridReactInstance) {
reactGridRef.current = reactGrid;
- reactGrid.groupingService.renderPreHeaderRowGroupingTitles();
+ reactGrid.headerGroupingService.renderPreHeaderRowGroupingTitles();
}
- Row Detail changes
-
itemDetail
property is removed, just useitem
(there's no reason to keep duplicate props) -
parent
property renamed toparentRef
-
OnRowBackToViewportRangeArgs
andOnRowOutOfViewportRangeArgs
were equal, so it was merged into a newOnRowBackOrOutOfViewportRangeArgs
interface
const gridOptions = {
enableRowDetailView: true,
rowTopOffsetRenderType: 'top', // RowDetail and/or RowSpan don't render well with "transform", you should use "top"
rowDetailView: {
- onAsyncResponse: (e, args) => console.log('before toggling row detail', args.itemDetail),
+ onAsyncResponse: (e, args) => console.log('before toggling row detail', args.item),
},
};
// `parent` renamed as `parentRef`
function callParentMethod(model: any) {
- this.parent!.someParentFunction(`We just called Parent Method from the Row Detail Child Component on ${model.title}`);
+ this.parentRef!.someParentFunction(`We just called Parent Method from the Row Detail Child Component on ${model.title}`);
}
- Draggable Grouping
setDroppedGroups
to load grid with initial Groups was deprecated and now removed, simply useinitialGroupBy
instead
this.gridOptions = {
enableDraggableGrouping: true,
// frozenColumn: 2,
draggableGrouping: {
- setDroppedGroups: () => ['duration', 'cost'],
+ initialGroupBy: ['duration', 'cost'],
},
};
- for Header Menu, we had 2 similar events
onHeaderMenuHideColumns
andonHideColumns
that were basically doing the same thing, and so I droppedonHeaderMenuHideColumns
- onHeaderMenuHideColumns
+ onHideColumns
rowTopOffsetRenderType
default is changing from 'top'
to 'transform'
and the reason is because transform
is known to have better styling perf, especially on large dataset, and that is also what Ag-Grid uses by default.
previous default | new default |
---|---|
rowTopOffsetRenderType: 'top' |
rowTopOffsetRenderType: 'transform' |
- if you are using Cypress to get the row X in the grid, which is what we do ourselves, then you will need to adjust your tests
Cypress before | Cypress after |
---|---|
cy.get([style="top: ${GRID_ROW_HEIGHT * 0}px;"]) |
cy.get([style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"]) |
OR cy.get([data-row=0])
|
Please note that you will have to change the option back to
rowTopOffsetRenderType: 'top'
when using either RowSpan and/or Row Detail features.
We are changing the columnDefinitions
and gridOptions
attribute names to much simpler single word names. Basically, I'm not exactly sure why I chose the long name in the past, but going forward, I think it would be much simpler to use single name attributes (which can help slightly with build size)
<SlickgridReact
gridId="grid2"
- columnDefinitions={columnDefinitions}
- gridOptions={gridOptions}
+ columns={columnDefinitions}
+ options={gridOptions}
dataset={dataset}
/>
Vanilla-Calendar-Pro was upgraded to v3.0 and the main breaking change is that they migrated to flat config (instead of complex object config) and this mean that if you use any of their option, then you'll have to update them to be flat.
The biggest change that you will most probably have to update is the min/max date setting when using the 'today'
shortcut as shown below:
import { type VanillaCalendarOption } from '@slickgrid-universal/common';
prepareGrid() {
setColumns({
id: 'finish', field: 'finish', name: 'Finish',
editor: {
model: Editors.date,
- editorOptions: { range: { min: 'today' } } as VanillaCalendarOption,
+ editorOptions: { displayDateMin: 'today' } as VanillaCalendarOption,
}
}]);
}
Note
for a complete list of option changes, visit the Vanilla-Calendar-Pro migration page, which details every single options with their new option names.
With this new release, I am making the i18next
dependency totally optional, which can help reduce bundle size for users that only use a single locale. However, for the users who still need i18next
, then you will need to provide the i18n
instance to the library as shown in the code change below. Note that if you forget to apply the change, as shown below, then an error will now be thrown to help you fix it.
// index.tsx
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
+ import { I18nextProvider } from 'slickgrid-react';
import App from './App';
i18n.use(initReactI18next)
// ...
const root = createRoot(document.getElementById('main')!);
root.render(
+ <I18nextProvider value={i18n}>
<App />
+ </I18nextProvider>
);
The GridService
has CRUD methods that were sometime returning a single item and other times an array of items, and for that reason we had to rely on code like onItemAdded.subscribe(item => { const items = Array.isArray(item) ? item : [item] }
. So for that reason, I decided to change the event names to plural and always return an array of items which is a lot more predictable.
-
onItemAdded
renamed toonItemsAdded
-
onItemDeleted
renamed toonItemsDeleted
-
onItemUpdated
renamed toonItemsUpdated
-
onItemUpserted
renamed toonItemsUpserted
So when I created the project, I used a few TypeScript Enums and I though this was great but it turns out that all of these Enums end up in the final transpiled JS bundle. So in the next major, I'm planning to remove most of these Enums and replace them with string literal types (type
instead of enum
because type
aren't transpiled and enum
are). So you should consider using string types as much and as soon as possible in all your new grids. Note that at the moment, they are only deprecations, and will only be dropped in the future (not now, but you should still consider this for the future), for example:
setColumns([{
id: 'age', ...
- type: FieldType.number,
+ type: 'number',
}]);
Note that migrating from
FieldType
to string types was already doable for the past couple years, so this one is far from new.
Below are a list of Enums being deprecated and you should think about migrating them eventually because they will be removed in the next major release (whenever that happens, but that won't be before another year). Note that the list below are only a summary of these deprecations and replacements.
Enum Name | from enum
|
to string type
|
Note |
---|---|---|---|
FieldType |
FieldType.boolean |
'boolean' |
|
FieldType.number |
'number' |
||
- | - | - | |
FileType |
FileType.csv |
'csv' |
|
FileType.xlsx |
'xlsx' |
||
- | - | - | |
GridStateType |
GridStateType.columns |
'columns' |
|
GridStateType.filters |
'filters' |
||
GridStateType.sorters |
'sorters' |
||
- | - | - | |
Operator |
Operator.greaterThan |
'>' |
See Operator list for all available opeators |
Operator.lessThanOrEqual |
'<=' |
||
Operator.contains |
'Contains' or 'CONTAINS'
|
Operators are written as PascalCase | |
Operator.equal |
'EQ' |
||
Operator.rangeExclusive |
'RangeExclusive' |
||
- | - | - | |
SortDirection |
SortDirection.ASC |
'ASC' or 'asc'
|
|
SortDirection.DESC |
'DESC' or 'desc'
|
||
- | - | - |
in order to make it easier to merge and simplify editor/filter options, I'm renaming the options to a single options
property which will make it more easily transportable (you will be able to reuse the same options
for both the editor/filter if need be). You can start using options
in v9.0 and above.
import { type MultipleSelectOption } from '@slickgrid-universal/common';
setColumns([{
id: 'duration', field: 'duration', name: 'Duration',
editor: {
- editorOptions: {
+ options: {
maxHeight: 250, useSelectOptionLabelToHtml: true,
} as MultipleSelectOption,
},
filter: {
- filterOptions: {
+ options: {
maxHeight: 250, useSelectOptionLabelToHtml: true,
} as MultipleSelectOption,
}
}]);
Contents
- Slickgrid-React Wiki
- Installation
- Styling
- Interfaces/Models
- Column Functionalities
- Global Grid Options
- Localization
- Events
- Grid Functionalities
- Auto-Resize / Resizer Service
- Resize by Cell Content
- Add/Delete/Update or Highlight item
- Dynamically Change Row CSS Classes
- Column Picker
- Composite Editor Modal
- Context Menu
- Custom Tooltip
- Excel Copy Buffer
- Export to Excel
- Export to File (CSV/Txt)
- Grid Menu
- Grid State & Presets
- Grouping & Aggregators
- Header Menu & Header Buttons
- Header Title Grouping
- Pinning (frozen) of Columns/Rows
- Row Colspan
- Row Detail
- Row Selection
- Tree Data Grid
- SlickGrid & DataView objects
- Addons (controls/plugins)
- Backend Services