diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
new file mode 100644
index 0000000000..c3b3d43a71
--- /dev/null
+++ b/.github/copilot-instructions.md
@@ -0,0 +1,76 @@
+# GitHub Copilot Instructions for slickgrid-universal
+
+## Repository Overview
+This is a monorepo for SlickGrid Universal containing:
+- Core packages in `packages/` (common, plugins, exports, etc.)
+- Framework wrappers in `frameworks/` (Angular, React, Vue, Aurelia)
+- Demo applications in `demos/` for each framework
+ - except Angular demos which are located in `frameworks/angular-slickgrid/src/demos`
+- Shared test utilities in `test/`
+
+## Code Standards
+
+### Testing
+- Use **Vitest** for unit tests (`.spec.ts` files)
+- Use **Cypress** for E2E tests (`.cy.ts` files in `test/cypress/e2e/`)
+- Aim for 100% statement coverage on core functionality
+- Test files are usually in `__tests__/` subdirectory (or same folder if only 1-2 test files)
+- Unit tests exist in 2 implementations:
+ - Native/vanilla implementation: all under `packages/`
+ - Angular-specific tests: under `frameworks/angular-slickgrid/`
+
+### TypeScript Patterns
+- Use strict TypeScript with proper typing
+- Prefer `interface` over `type` for object shapes
+- Use `protected` for class methods that may be extended
+- Follow existing naming conventions: `_privateField`, `publicMethod`
+
+### Code Formatting & Linting
+- **OXLint** is used for linting TypeScript/JavaScript code
+- **Prettier** handles code formatting automatically
+- Code should be formatted before committing
+- Run `pnpm lint:fix` to auto-fix linting issues
+- Run `pnpm prettier:write` to format code
+- Ensure no linting errors before creating pull requests
+
+### Plugin Development
+- All plugins extend SlickGrid and use `SlickEventHandler`
+- Use `BindingEventService` for DOM event binding/cleanup
+- Always implement `init()`, `dispose()`, and `getOptions()`/`setOptions()`
+- Plugins should support both grid options and column definition options
+
+### Framework Support
+When making changes to demos or documentation:
+- Update **all 4 frameworks**: Angular, React, Vue, Aurelia
+- Maintain consistency across framework implementations
+- Check for framework-specific syntax (e.g., Vue's template vs React's JSX)
+
+### Documentation
+- Update corresponding docs in `docs/` AND framework-specific `frameworks/*/docs/`
+- Use markdown with proper linking: `[file.ts](path/to/file.ts)`
+- Include code examples that work across frameworks
+
+## Common Commands
+- `pnpm build` - Build all packages
+ - aka "Build Everything" task, which builds all packages and frameworks in the monorepo
+- `pnpm lint` - Run linter (OXLint) on all files
+- `pnpm lint:fix` - Auto-fix linting issues
+- `pnpm prettier:check` - Check code formatting
+- `pnpm prettier:write` - Format code with Prettier
+- `pnpm test` - Run Vitest unit tests
+- `pnpm test:coverage` - Run tests with coverage
+- `pnpm dev` - Start vanilla demo
+- `pnpm dev:[framework]` - Start framework-specific demos
+ - e.g.: `dev:angular`, `dev:react`, `dev:vue`, `dev:aurelia`
+
+## Monorepo Structure
+- Changes to `packages/*` affect all frameworks
+- Framework wrappers depend on core packages
+- Use relative imports within packages
+- Avoid circular dependencies
+
+## Code Review Focus
+- Maintain backward compatibility
+- Consider impact across all 4 framework implementations
+- Verify tests pass and coverage remains high
+- Check that examples work in all framework demos
diff --git a/.github/renovate.json5 b/.github/renovate.json5
index 8a603c172f..a656074633 100644
--- a/.github/renovate.json5
+++ b/.github/renovate.json5
@@ -25,13 +25,6 @@
enabled: false,
},
},
- {
- description: 'Prevent major updates for Vite 6 catalog',
- matchDepTypes: ['pnpm.catalog.vite6'],
- major: {
- enabled: false,
- },
- },
],
ignoreDeps: ['lee-dohm/no-response', 'node', 'pnpm', 'typescript'],
schedule: ['every 4 weeks on friday'],
diff --git a/.github/workflows/pkg-pr-new.yml b/.github/workflows/pkg-pr-new.yml
index 50ce2852df..0c2a443cde 100644
--- a/.github/workflows/pkg-pr-new.yml
+++ b/.github/workflows/pkg-pr-new.yml
@@ -28,4 +28,4 @@ jobs:
run: pnpm build
- name: Publish
- run: pnpm dlx pkg-pr-new publish --no-template --pnpm './packages/*' './frameworks/*'
+ run: pnpm dlx pkg-pr-new publish --no-template --pnpm './packages/*' './frameworks/*' './frameworks-plugins/*'
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index dc09f4b8e0..674f9acbd8 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -6,9 +6,6 @@ on:
dryrun:
type: boolean
description: Dry-Run
- graduate:
- type: boolean
- description: Force Conventional Graduate
tag:
type: choice
default: latest
@@ -73,20 +70,19 @@ jobs:
- name: Lerna Version (build query)
shell: bash
run: |
- if ${{inputs.dryrun == true && inputs.graduate != true}}
+ if ${{inputs.dryrun == true && (inputs.tag == 'alpha' || inputs.tag == 'beta' || inputs.tag == 'next')}}
+ then
+ echo "LERNA_VERSION_TYPE=🧪 Dry-Run w/Prerelease" >> $GITHUB_ENV
+ echo "LERNA_VERSION_QUERY=lerna version --yes --conventional-prerelease --preid ${{ inputs.tag }} --dry-run" >> $GITHUB_ENV
+ elif ${{inputs.dryrun == true}}
then
echo "LERNA_VERSION_TYPE=🧪 Dry-Run" >> $GITHUB_ENV
echo "LERNA_VERSION_QUERY=lerna version --yes --dry-run" >> $GITHUB_ENV
- elif ${{inputs.dryrun == true && inputs.graduate == true}}
- then
- echo "LERNA_VERSION_TYPE=🧪 Dry-Run w/Graduate" >> $GITHUB_ENV
- echo "LERNA_VERSION_QUERY=lerna version --yes --dry-run --conventional-graduate" >> $GITHUB_ENV
- elif ${{inputs.dryrun != true && inputs.graduate == true}}
- then
- echo "LERNA_VERSION_TYPE=🚀 Prod Version w/Graduate" >> $GITHUB_ENV
- echo "LERNA_VERSION_QUERY=lerna version --yes --conventional-graduate" >> $GITHUB_ENV
- elif ${{inputs.dryrun != true && inputs.graduate != true}}
+ elif ${{inputs.tag == 'alpha' || inputs.tag == 'beta' || inputs.tag == 'next'}}
then
+ echo "LERNA_VERSION_TYPE=🚀 Prod Version w/Prerelease" >> $GITHUB_ENV
+ echo "LERNA_VERSION_QUERY=lerna version --yes --conventional-prerelease --preid ${{ inputs.tag }}" >> $GITHUB_ENV
+ else
echo "LERNA_VERSION_TYPE=🚀 Prod Version" >> $GITHUB_ENV
echo "LERNA_VERSION_QUERY=lerna version --yes" >> $GITHUB_ENV
fi
@@ -104,13 +100,36 @@ jobs:
git config --global user.email "${{ github.actor }}@users.noreply.github.com"
pnpm exec ${{ env.LERNA_VERSION_QUERY }}
+ - name: Lerna Publish (build query)
+ shell: bash
+ run: |
+ if ${{inputs.dryrun == true && (inputs.tag == 'alpha' || inputs.tag == 'beta' || inputs.tag == 'next')}}
+ then
+ echo "LERNA_PUBLISH_TYPE=🧪 Dry-Run w/Prerelease" >> $GITHUB_ENV
+ echo "LERNA_PUBLISH_QUERY=lerna publish from-package --force-publish --yes --pre-dist-tag ${{ inputs.tag }} --dry-run" >> $GITHUB_ENV
+ elif ${{inputs.dryrun == true}}
+ then
+ echo "LERNA_PUBLISH_TYPE=🧪 Dry-Run" >> $GITHUB_ENV
+ echo "LERNA_PUBLISH_QUERY=lerna publish from-package --force-publish --yes --dist-tag latest --dry-run" >> $GITHUB_ENV
+ elif [[ "${{ inputs.tag }}" == "alpha" || "${{ inputs.tag }}" == "beta" || "${{ inputs.tag }}" == "next" ]]
+ then
+ echo "LERNA_PUBLISH_TYPE=📦 Publish w/Prerelease" >> $GITHUB_ENV
+ echo "LERNA_PUBLISH_QUERY=lerna publish from-package --force-publish --yes --pre-dist-tag ${{ inputs.tag }}" >> $GITHUB_ENV
+ else
+ echo "LERNA_PUBLISH_TYPE=📦 Publish Latest" >> $GITHUB_ENV
+ echo "LERNA_PUBLISH_QUERY=lerna publish from-package --force-publish --yes --dist-tag latest" >> $GITHUB_ENV
+ fi
+
+ - name: Final publish type → ${{ env.LERNA_PUBLISH_TYPE }}
+ shell: bash
+ run: echo "${{ env.LERNA_PUBLISH_QUERY }}"
+
- name: Lerna Publish 📦
- if: ${{ inputs.dryrun != true }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
shell: bash
id: lerna-publish
- run: pnpm exec lerna publish from-package --force-publish --yes --dist-tag ${{ inputs.tag || 'latest' }}
+ run: pnpm exec ${{ env.LERNA_PUBLISH_QUERY }}
- name: Website Dev Build
run: pnpm build:dev
diff --git a/.github/workflows/test-angular.yml b/.github/workflows/test-angular.yml
index 109e1e4212..fdedfc9c1d 100644
--- a/.github/workflows/test-angular.yml
+++ b/.github/workflows/test-angular.yml
@@ -70,17 +70,12 @@ jobs:
- name: Angular-Slickgrid Framework Build
run: pnpm angular:build:framework
+ - name: Angular-Slickgrid Framework-Plugins Build
+ run: pnpm angular:build:framework-plugins
+
- name: Website Dev Build (served for Cypress)
run: pnpm angular:build:demo
- - name: Cache Cypress binary
- uses: actions/cache@v5
- with:
- path: ~/.cache/Cypress
- key: ${{ runner.os }}-cypress-${{ hashFiles('**/pnpm-lock.yaml') }}
- restore-keys: |
- ${{ runner.os }}-cypress-
-
- name: Ensure Cypress binary is installed
run: pnpm exec cypress install
@@ -88,9 +83,10 @@ jobs:
run: pnpm angular:serve &
- name: Run Cypress E2E tests
- uses: cypress-io/github-action@v6
+ uses: cypress-io/github-action@v7
with:
install: false
+ package-manager-cache: false
working-directory: frameworks/angular-slickgrid
# start: pnpm angular:serve
wait-on: 'http://localhost:4300'
diff --git a/.github/workflows/test-aurelia.yml b/.github/workflows/test-aurelia.yml
index 38af7278dc..f8d83ee847 100644
--- a/.github/workflows/test-aurelia.yml
+++ b/.github/workflows/test-aurelia.yml
@@ -55,17 +55,12 @@ jobs:
- name: Aurelia-Slickgrid Framework Build
run: pnpm aurelia:build:framework
+ - name: Aurelia-Slickgrid Framework-Plugins Build
+ run: pnpm aurelia:build:framework-plugins
+
- name: Website Dev Build (served for Cypress)
run: pnpm aurelia:build:demo
- - name: Cache Cypress binary
- uses: actions/cache@v5
- with:
- path: ~/.cache/Cypress
- key: ${{ runner.os }}-cypress-${{ hashFiles('**/pnpm-lock.yaml') }}
- restore-keys: |
- ${{ runner.os }}-cypress-
-
- name: Ensure Cypress binary is installed
run: pnpm exec cypress install
@@ -73,9 +68,10 @@ jobs:
run: pnpm aurelia:serve &
- name: Run Cypress E2E tests
- uses: cypress-io/github-action@v6
+ uses: cypress-io/github-action@v7
with:
install: false
+ package-manager-cache: false
working-directory: demos/aurelia
# start: pnpm aurelia:serve
wait-on: 'http://localhost:7900'
diff --git a/.github/workflows/test-react.yml b/.github/workflows/test-react.yml
index a7d57754ca..3838b22532 100644
--- a/.github/workflows/test-react.yml
+++ b/.github/workflows/test-react.yml
@@ -55,17 +55,12 @@ jobs:
- name: Slickgrid-React Framework Build
run: pnpm react:build:framework
+ - name: Slickgrid-React Framework-Plugins Build
+ run: pnpm react:build:framework-plugins
+
- name: Website Dev Build (served for Cypress)
run: pnpm react:build:demo
- - name: Cache Cypress binary
- uses: actions/cache@v5
- with:
- path: ~/.cache/Cypress
- key: ${{ runner.os }}-cypress-${{ hashFiles('**/pnpm-lock.yaml') }}
- restore-keys: |
- ${{ runner.os }}-cypress-
-
- name: Ensure Cypress binary is installed
run: pnpm exec cypress install
@@ -73,9 +68,10 @@ jobs:
run: pnpm react:serve &
- name: Run Cypress E2E tests
- uses: cypress-io/github-action@v6
+ uses: cypress-io/github-action@v7
with:
install: false
+ package-manager-cache: false
working-directory: demos/react
wait-on: 'http://localhost:8000'
config-file: test/cypress.config.ts
diff --git a/.github/workflows/test-vanilla.yml b/.github/workflows/test-vanilla.yml
index 460e53571e..4cb1fa2d2f 100644
--- a/.github/workflows/test-vanilla.yml
+++ b/.github/workflows/test-vanilla.yml
@@ -55,14 +55,6 @@ jobs:
- name: Website Dev Build (served for Cypress)
run: pnpm build:dev
- - name: Cache Cypress binary
- uses: actions/cache@v5
- with:
- path: ~/.cache/Cypress
- key: ${{ runner.os }}-cypress-${{ hashFiles('**/pnpm-lock.yaml') }}
- restore-keys: |
- ${{ runner.os }}-cypress-
-
- name: Ensure Cypress binary is installed
run: pnpm exec cypress install
@@ -70,9 +62,10 @@ jobs:
run: pnpm vanilla:serve:demo &
- name: Run Cypress E2E tests
- uses: cypress-io/github-action@v6
+ uses: cypress-io/github-action@v7
with:
install: false
+ package-manager-cache: false
# working-directory: packages/dnd
# start: pnpm vanilla:serve:demo
# start: pnpm serve:vite
diff --git a/.github/workflows/test-vue.yml b/.github/workflows/test-vue.yml
index e276f1cda3..237b038b44 100644
--- a/.github/workflows/test-vue.yml
+++ b/.github/workflows/test-vue.yml
@@ -55,17 +55,12 @@ jobs:
- name: Slickgrid-Vue Framework Build
run: pnpm vue:build:framework
+ - name: Slickgrid-Vue Framework-Plugins Build
+ run: pnpm vue:build:framework-plugins
+
- name: Website Dev Build (served for Cypress)
run: pnpm vue:build:demo
- - name: Cache Cypress binary
- uses: actions/cache@v5
- with:
- path: ~/.cache/Cypress
- key: ${{ runner.os }}-cypress-${{ hashFiles('**/pnpm-lock.yaml') }}
- restore-keys: |
- ${{ runner.os }}-cypress-
-
- name: Ensure Cypress binary is installed
run: pnpm exec cypress install
@@ -73,9 +68,10 @@ jobs:
run: pnpm vue:serve &
- name: Run Cypress E2E tests
- uses: cypress-io/github-action@v6
+ uses: cypress-io/github-action@v7
with:
install: false
+ package-manager-cache: false
working-directory: demos/vue
# start: pnpm vue:serve
wait-on: 'http://localhost:7000'
diff --git a/.prettierignore b/.prettierignore
index a61667e120..8f569d1b18 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -2,4 +2,6 @@
_variables.scss
_variables-theme-material.scss
_variables-theme-salesforce.scss
-**/test/vitest-coverage/*.*
\ No newline at end of file
+**/test/vitest-coverage/*.*
+demos/vue/src/router/index.ts
+demos/react/src/examples/slickgrid/App.tsx
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 9a4f7944a7..57b4ac2042 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -7,5 +7,7 @@
],
"typescript.format.semicolons": "insert",
"vitest.rootConfig": "./test/vitest.config.mts",
- "typescript.tsdk": "node_modules\\typescript\\lib"
+ "typescript.tsdk": "node_modules\\typescript\\lib",
+ "prettier.prettierPath": "node_modules/prettier/index.cjs",
+ "prettier.configPath": ".prettierrc"
}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8e9af0ef50..a9b3aac12f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,80 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [10.0.0-beta.0](https://github.com/ghiscoding/slickgrid-universal/compare/v9.12.0...v10.0.0-beta.0) (2026-02-14)
+
+### ⚠ BREAKING CHANGES
+
+* **angular:** migrate Angular-Slickgrid to Zoneless (#2341)
+* **angular:** migrate Angular-Slickgrid to Standalone Component (#2339)
+* upgrade to Angular 21 (#2338)
+* migrate Row/Hybrid Selection flag into a single `enableSelection` flag (#2331)
+* drop Cell/Row Selection Models & keep only HybridSelectionModel (#2330)
+* remove all Deprecated code (#2302)
+* drop OperatorType enums and keep only type literal (#2301)
+* replacing multiple TypeScript `enum` with `type` to decrease build size (#2300)
+* drop FieldType enums and keep only field type literal (#2299)
+* rename `v-model:data` to `v-model:dataset` (#2298)
+* make Row Detail plugin as optional in all framework wrappers (#2291)
+* rewrite Grid Menu using CSS flexbox instead of width and calc() (#2282)
+* switch to column `hidden` property and always keep all columns (#2281)
+
+### Features
+
+* add custom menu slot renderers ([#2375](https://github.com/ghiscoding/slickgrid-universal/issues/2375)) ([7ebbda5](https://github.com/ghiscoding/slickgrid-universal/commit/7ebbda58233bb5ce94b81b5b2b578af0ea6a068d)) - by @ghiscoding
+* **angular:** migrate Angular-Slickgrid to Standalone Component ([#2339](https://github.com/ghiscoding/slickgrid-universal/issues/2339)) ([89e8e26](https://github.com/ghiscoding/slickgrid-universal/commit/89e8e261af4a747b9bfd274d3df0953b231edb97)) - by @ghiscoding
+* **angular:** migrate Angular-Slickgrid to Zoneless ([#2341](https://github.com/ghiscoding/slickgrid-universal/issues/2341)) ([f55cbe2](https://github.com/ghiscoding/slickgrid-universal/commit/f55cbe28ce6999fb3933bc55372c22a84df99a15)) - by @ghiscoding
+* auto-enabled external resources with their associated flags ([#2362](https://github.com/ghiscoding/slickgrid-universal/issues/2362)) ([16dd8a7](https://github.com/ghiscoding/slickgrid-universal/commit/16dd8a77dd5d136a5a99321f0fc4c50571fdb0c0)) - by @ghiscoding
+* bind css classes to slickgrid container ([#2369](https://github.com/ghiscoding/slickgrid-universal/issues/2369)) ([a7cd4aa](https://github.com/ghiscoding/slickgrid-universal/commit/a7cd4aa6af3688ebf1ec09140856ea451a6789da)) - by @zewa666
+* drop Cell/Row Selection Models & keep only HybridSelectionModel ([#2330](https://github.com/ghiscoding/slickgrid-universal/issues/2330)) ([4398cf4](https://github.com/ghiscoding/slickgrid-universal/commit/4398cf42e03f6971b81db8cea4ed11138c0aa452)) - by @ghiscoding
+* F2 activates cell editor, closes [#2351](https://github.com/ghiscoding/slickgrid-universal/issues/2351) ([#2370](https://github.com/ghiscoding/slickgrid-universal/issues/2370)) ([6e06f9d](https://github.com/ghiscoding/slickgrid-universal/commit/6e06f9dd3e0ff78650683b0641191b94f2a2aa96)) - by @zewa666
+* make Row Detail plugin as optional in all framework wrappers ([#2291](https://github.com/ghiscoding/slickgrid-universal/issues/2291)) ([fa1a14c](https://github.com/ghiscoding/slickgrid-universal/commit/fa1a14c16c987bfaf7725c46e8114b20ea5a505d)) - by @ghiscoding
+* migrate Row/Hybrid Selection flag into a single `enableSelection` flag ([#2331](https://github.com/ghiscoding/slickgrid-universal/issues/2331)) ([5be5e6a](https://github.com/ghiscoding/slickgrid-universal/commit/5be5e6a862ecd024cf43d404769d65c6c1dd335e)) - by @ghiscoding
+* rename `v-model:data` to `v-model:dataset` ([#2298](https://github.com/ghiscoding/slickgrid-universal/issues/2298)) ([34f42f2](https://github.com/ghiscoding/slickgrid-universal/commit/34f42f2d14c9a1b39a2695c8a885ff2bee53d0b5)) - by @ghiscoding
+* **SlickCompositeEditor:** migrate modal from div to dialog ([#2283](https://github.com/ghiscoding/slickgrid-universal/issues/2283)) ([371c2c6](https://github.com/ghiscoding/slickgrid-universal/commit/371c2c675728f51785485280237572ef5a584eeb)) - by @ghiscoding
+* switch to column `hidden` property and always keep all columns ([#2281](https://github.com/ghiscoding/slickgrid-universal/issues/2281)) ([075c649](https://github.com/ghiscoding/slickgrid-universal/commit/075c64961cb7400500df46b792866d39fba2d9e0)) - by @ghiscoding
+* **tooltip:** add global tooltip observation for non-grid elements ([#2371](https://github.com/ghiscoding/slickgrid-universal/issues/2371)) ([1bbc8de](https://github.com/ghiscoding/slickgrid-universal/commit/1bbc8de895e370843286eadd08574efc552ad8fd)) - by @ghiscoding
+* upgrade to Angular 21 ([#2338](https://github.com/ghiscoding/slickgrid-universal/issues/2338)) ([012def2](https://github.com/ghiscoding/slickgrid-universal/commit/012def265a4e5cb0738ea211d073df129a2eecd9)) - by @ghiscoding
+
+### Bug Fixes
+
+* **deps:** update all non-major dependencies ([#2292](https://github.com/ghiscoding/slickgrid-universal/issues/2292)) ([21da957](https://github.com/ghiscoding/slickgrid-universal/commit/21da95702f44739a9f1b226e305c18a1fa64000f)) - by @renovate-bot
+* **filters:** prevent tooltip triggers on Slider programmatic updates ([#2372](https://github.com/ghiscoding/slickgrid-universal/issues/2372)) ([5734d59](https://github.com/ghiscoding/slickgrid-universal/commit/5734d59a4acfd5c32571ee2f0839561966b1ee2c)) - by @ghiscoding
+* HybridSelectionModelOption should all be optional ([#2293](https://github.com/ghiscoding/slickgrid-universal/issues/2293)) ([1b8f760](https://github.com/ghiscoding/slickgrid-universal/commit/1b8f76060493c43a62e956fb9bf5e0e2feaf4a1f)) - by @ghiscoding
+* **plugin:** SlickCustomTooltip should work with parent+child tooltips ([#2374](https://github.com/ghiscoding/slickgrid-universal/issues/2374)) ([8af7f45](https://github.com/ghiscoding/slickgrid-universal/commit/8af7f45eb19f0a00da2f3de7c729504be7d043eb)) - by @ghiscoding
+* pre-set value for editor validation on paste ([#2368](https://github.com/ghiscoding/slickgrid-universal/issues/2368)) ([2df5cc5](https://github.com/ghiscoding/slickgrid-universal/commit/2df5cc5d529bff41513b05ecb322efc64d234d64)) - by @zewa666
+* remove all Deprecated code ([#2302](https://github.com/ghiscoding/slickgrid-universal/issues/2302)) ([f42c46c](https://github.com/ghiscoding/slickgrid-universal/commit/f42c46cd1f05b5c72c62f552f124b5bfe776f8b0)) - by @ghiscoding
+* **styling:** add missing row highlight assignment for Dark Mode ([6ae55de](https://github.com/ghiscoding/slickgrid-universal/commit/6ae55de071325e37123a4eb32bd57a0d00581a17)) - by @ghiscoding
+
+### Code Refactoring
+
+* drop FieldType enums and keep only field type literal ([#2299](https://github.com/ghiscoding/slickgrid-universal/issues/2299)) ([3858ed0](https://github.com/ghiscoding/slickgrid-universal/commit/3858ed06a9496ddfa94d769ce1d415b68e18c993)) - by @ghiscoding
+* drop OperatorType enums and keep only type literal ([#2301](https://github.com/ghiscoding/slickgrid-universal/issues/2301)) ([5dd0807](https://github.com/ghiscoding/slickgrid-universal/commit/5dd08079460dc9af798ab29527997a6d4b31abdd)) - by @ghiscoding
+* replacing multiple TypeScript `enum` with `type` to decrease build size ([#2300](https://github.com/ghiscoding/slickgrid-universal/issues/2300)) ([ea79395](https://github.com/ghiscoding/slickgrid-universal/commit/ea79395cf663b3abce8e43cf27ba6ffea7cfe113)) - by @ghiscoding
+* rewrite Grid Menu using CSS flexbox instead of width and calc() ([#2282](https://github.com/ghiscoding/slickgrid-universal/issues/2282)) ([2f5141a](https://github.com/ghiscoding/slickgrid-universal/commit/2f5141a12a765510e30a7155a7bf714e3462cfc1)) - by @ghiscoding
+
+## [9.13.0](https://github.com/ghiscoding/slickgrid-universal/compare/v9.12.0...v9.13.0) (2026-01-30)
+
+### Features
+
+* add minus icon for partial row selection ([#2322](https://github.com/ghiscoding/slickgrid-universal/issues/2322)) ([d3dc6e7](https://github.com/ghiscoding/slickgrid-universal/commit/d3dc6e7772243a3d0dd6961680698d05a834ae58)) - by @ghiscoding
+* deprecate `rowSelectionOptions` and rename to `selectionOptions` ([#2325](https://github.com/ghiscoding/slickgrid-universal/issues/2325)) ([ec4d546](https://github.com/ghiscoding/slickgrid-universal/commit/ec4d546b3e0c76edcd12899b16a1f9403550cf0c)) - by @ghiscoding
+* **export:** add new optional PDF Export package ([#2317](https://github.com/ghiscoding/slickgrid-universal/issues/2317)) ([42347f6](https://github.com/ghiscoding/slickgrid-universal/commit/42347f605388d3c080568d8bbe93dcf7c5ed1ff4)) - by @ghiscoding
+* update to latest Aurelia 2 RC.0 ([#2315](https://github.com/ghiscoding/slickgrid-universal/issues/2315)) ([4ea46a6](https://github.com/ghiscoding/slickgrid-universal/commit/4ea46a619e214f5272c364d57d51336c37845035)) - by @ghiscoding
+
+### Bug Fixes
+
+* allow single row selection via click without checkbox column ([#2311](https://github.com/ghiscoding/slickgrid-universal/issues/2311)) ([b2c6594](https://github.com/ghiscoding/slickgrid-universal/commit/b2c659445c5c39b2b76613c113cef833bdd99f97)) - by @ghiscoding
+* **deps:** update all non-major dependencies ([#2292](https://github.com/ghiscoding/slickgrid-universal/issues/2292)) ([21da957](https://github.com/ghiscoding/slickgrid-universal/commit/21da95702f44739a9f1b226e305c18a1fa64000f)) - by @renovate-bot
+* **deps:** update all non-major dependencies ([#2320](https://github.com/ghiscoding/slickgrid-universal/issues/2320)) ([9d9f7ad](https://github.com/ghiscoding/slickgrid-universal/commit/9d9f7ad9c0d2b7b3ee768b8061dfd646dc75bb81)) - by @renovate-bot
+* **deps:** update all non-major dependencies ([#2342](https://github.com/ghiscoding/slickgrid-universal/issues/2342)) ([3b2a921](https://github.com/ghiscoding/slickgrid-universal/commit/3b2a921ff5cae8de5da78f36d7a625fa79eeb557)) - by @renovate-bot
+* double-clicking a checkmark icon should keep current cell selection ([#2312](https://github.com/ghiscoding/slickgrid-universal/issues/2312)) ([1046d2f](https://github.com/ghiscoding/slickgrid-universal/commit/1046d2f6451994ab8eeda7bb87e80297ac038247)) - by @ghiscoding
+* Excel/Text Exports display top/preheader titles w/DraggableGrouping ([#2314](https://github.com/ghiscoding/slickgrid-universal/issues/2314)) ([28817e8](https://github.com/ghiscoding/slickgrid-universal/commit/28817e8055b81ee55c1b3bac17cd7514a3921ff0)) - by @ghiscoding
+* HybridSelectionModelOption should all be optional ([#2293](https://github.com/ghiscoding/slickgrid-universal/issues/2293)) ([1b8f760](https://github.com/ghiscoding/slickgrid-universal/commit/1b8f76060493c43a62e956fb9bf5e0e2feaf4a1f)) - by @ghiscoding
+* only assign CellRangeSelector when Hybrid has `dragToSelect` set ([#2329](https://github.com/ghiscoding/slickgrid-universal/issues/2329)) ([a941819](https://github.com/ghiscoding/slickgrid-universal/commit/a941819649dfa1b54f7887603b930cab27d67c3a)) - by @ghiscoding
+* should stop Draggable service when setting hybrid 'row-click' ([#2313](https://github.com/ghiscoding/slickgrid-universal/issues/2313)) ([0082b2d](https://github.com/ghiscoding/slickgrid-universal/commit/0082b2d532223f03854f9c0a8766e6f2971f3333)) - by @ghiscoding
+* this supports now multiple edge cases when copy pasting from excel to grid ([#2340](https://github.com/ghiscoding/slickgrid-universal/issues/2340)) ([2b4e2ba](https://github.com/ghiscoding/slickgrid-universal/commit/2b4e2baded436a89b9780563485af92bd60ea706)) - by @zewa666
+
## [9.12.0](https://github.com/ghiscoding/slickgrid-universal/compare/v9.11.0...v9.12.0) (2025-12-29)
### Features
diff --git a/README.md b/README.md
index 42065a2f0d..9ce91a785f 100644
--- a/README.md
+++ b/README.md
@@ -15,42 +15,44 @@
📘 [Documentation](https://ghiscoding.gitbook.io/slickgrid-universal/) website powered by GitBook for version 4.0+ (_or use the [Wikis](https://github.com/ghiscoding/slickgrid-universal/wiki) for older versions_)
### Live Demo
-[Live Demo](https://ghiscoding.github.io/slickgrid-universal/) website
+[Live Demo](https://ghiscoding.github.io/slickgrid-universal/) website OR see [Available Framework Wrappers](#available-framework-wrappers) table below for more demos.
-Also available in Stackblitz for all available frameworks (see [table](https://github.com/ghiscoding/slickgrid-universal?tab=readme-ov-file#available-framework-wrappers) below)
+Stackblitz links are also available for all frameworks supported (see [table](https://github.com/ghiscoding/slickgrid-universal?tab=readme-ov-file#available-framework-wrappers) below)
### Description
One of the best JavaScript data grid named "SlickGrid", which was originally developed by @mleibman, beats most other data grids in terms of features, customizability & performance (running smoothly with even a million rows).
-This is a monorepo project (using [pnpm workspaces](https://pnpm.io/workspaces) and [Lerna-Lite](https://github.com/lerna-lite/lerna-lite)) which is regrouping a few packages under a single repository. It was originally requiring `@6pac/SlickGrid` as an external dependency, but that was dropped in v4.0, and it has been a standalone library ever since. The main goal of this project is to create a common repo that includes all Editors, Filters, Extensions and Services that could be used by any frameworks (the project is framework agnostic).
+This is a monorepo project (using [pnpm workspaces](https://pnpm.io/workspaces) and [Lerna-Lite](https://github.com/lerna-lite/lerna-lite)) which is regrouping a few packages under a single repository. It was originally requiring `@6pac/SlickGrid` as an external dependency, but that was dropped in v4.0, and it has been a standalone library ever since. The main goal of this project is to create a common repo that includes all Editors, Filters, Extensions and Services that could be used by any frameworks (the core project in itself is framework agnostic).
### What's the difference with the original SlickGrid (now [`@6pac/SlickGrid`](https://github.com/6pac/SlickGrid)) project?
If you've used the original SlickGrid in the past, you might be wondering, should I use the [`@6pac/SlickGrid`](https://github.com/6pac/SlickGrid) or Slickgrid-Universal? The main difference is that the original SlickGrid is like an unassembled IKEA product where it's very bare bone and unassembled, but on the other hand Slickgrid-Universal is an all assembled product with batteries included. What that means is that Slickgrid-Universal comes with many built-in features like Formatters, Editors, Filters, Tree Data, ... which are not directly available in the original SlickGrid. So in the end SlickGrid (`@6pac/SlickGrid`) project is much smaller in size because it's very bare bone but you will have to implement many things yourself (Sorting/Filtering/Editing/...), and if you're looking at creating very basic grids with the smallest footprint possible, then SlickGrid might just work for you, otherwise Slickgrid-Universal has a more complete set of features out of the box with a bit larger download and installation size.
-Side note, I am (`@ghiscoding`) a maintainer in both projects, which are Slickgrid-Universal as well as the [`@6pac/SlickGrid`](https://github.com/6pac/SlickGrid) (in fact Slickgrid-Universal was originally requiring the `@6pac/SlickGrid` dependency but that requirement was eventually dropped in v4 and it is now a standalone). The main reason to support both projects is to keep core files in sync as much as possible (SlickGrid, SlickDataView and all plugins). When combined together, both projects have a much larger user base and this mean much more stability, and I also often sync new core & plugin files in both projects as well... and that's it, I hope this makes it clear what the differences are.
+Side note, I am (`@ghiscoding`) a maintainer in both projects (Slickgrid-Universal and [`@6pac/SlickGrid`](https://github.com/6pac/SlickGrid)), in fact Slickgrid-Universal was originally requiring the `@6pac/SlickGrid` dependency but that requirement was dropped in v4 and is now a standalone. The main reason to support both projects is to keep core files in sync as much as possible (SlickGrid, SlickDataView and all plugins). Combined together, both projects have a much larger user base and this mean much more stability, and I also often sync new core & plugin files in both projects as well... and that's it, I hope this makes it clear what the differences are.
### Why create this monorepo?
Below is a list of reasons as to why this project was created and why it is built as a monorepo project:
1. avoids duplicate code by creating common packages available in Slickgrid-Universal and used by all frameworks
2. many of the Services are decoupled because most project will never require all of these services all at once
- - OData, GraphQL, Export to CSV, Export to Excel, Composite Editor, RxJS, ...
+ - OData, GraphQL, Export to (CSV, Excel or PDF), Composite Editor, RxJS, ...
4. and finally it is framework agnostic
- - you can reuse the same grids and logic in many different frameworks, because it's easily transportable
- - you can use it in plain JavaScript (ES6) or TypeScript, e.g. we use it ourselves as plain JS (ES6) in our Salesforce environment with LWC (Lightning Web Component)
+ - you can reuse the same grids and logic in many different frameworks, it's easily transportable
+ - you can use it in plain JavaScript (ES6) or TypeScript, for example we use it ourselves as plain JS (ES6) in our Salesforce environment with LWC (Lightning Web Component)
## Latest News & Releases
Check out the [Releases](https://github.com/ghiscoding/slickgrid-universal/releases) section for all the latest News & Releases.
### Like my work?
-You could star ⭐ the project and/or support me with caffeine via GitHub [sponsorship](https://github.com/sponsors/ghiscoding) or the Ko-Fi button below. Thanks in advance.
+If you use and like the project, please give it a star ⭐ and/or support me with caffeine via GitHub [sponsorship](https://github.com/sponsors/ghiscoding) or the Ko-Fi button below would be much appreciated. Thanks in advance.
## Live Demos & Available Framework Wrappers
-The Slickgrid-Universal [live demo](https://ghiscoding.github.io/slickgrid-universal) shows 2 different UI themes (Material Design / Salesforce) and you can also see the Bootstrap theme demoed in all other frameworks with links available in the table shown below. Also please note that even if all the demos are built with [Bootstrap](https://getbootstrap.com/) or [Bulma](https://bulma.io/), you could in theory use any other UI libraries (e.g. Google Material, ...). The project tries to be as much agnostic as possible and it does so by providing a large set of CSS/SASS variables which are available to customize the UI however you want.
+The Slickgrid-Universal [live demo](https://ghiscoding.github.io/slickgrid-universal) shows 2 different UI themes (Material Design / Salesforce) and you can also see the Bootstrap theme demoed in all other frameworks with links available in the table shown below. Also please note that even if all the demos are built with [Bootstrap](https://getbootstrap.com/) or [Bulma](https://bulma.io/), you could use any other UI libraries (Google Material, ...). The project tries to be as much agnostic as possible and it does so by providing a large set of CSS/SASS variables which are available to customize the UI however you want.
### Available Framework Wrappers
+> There's no SolidJS or Svelte wrappers, but if you are willing to help then let's talk and open a new [Discussion](https://github.com/ghiscoding/slickgrid-universal/discussions)
+
| Platform | Project Repos | Live Demo | Stackblitz | Downloads | Details |
| :------: | ------------- | --------- | ---------- | -------: | ------- |
|
| [Angular-Slickgrid](https://github.com/ghiscoding/slickgrid-universal/tree/master/frameworks/angular-slickgrid) /
[Angular-Slickgrid-Demos](https://github.com/ghiscoding/angular-slickgrid-demos) | [demo](https://ghiscoding.github.io/angular-slickgrid-demos) | [](https://stackblitz.com/github/ghiscoding/angular-slickgrid-demos) | [](https://npmjs.org/package/angular-slickgrid)
[](https://bundlephobia.com/result?p=angular-slickgrid) | [docs](https://ghiscoding.gitbook.io/angular-slickgrid/getting-started/quick-start) /
[changelog](https://github.com/ghiscoding/slickgrid-universal/blob/master/frameworks/angular-slickgrid/CHANGELOG.md) |
@@ -62,7 +64,7 @@ The Slickgrid-Universal [live demo](https://ghiscoding.github.io/slickgrid-unive
| | [Slickgrid-Universal/vanilla-force-bundle](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/vanilla-force-bundle) | n/a | | [zip](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/vanilla-force-bundle/dist-grid-bundle-zip) file | [docs](https://ghiscoding.gitbook.io/slickgrid-universal/getting-started/installation-salesforce) |
|
| [streamlit-slickgrid](https://github.com/streamlit/streamlit-slickgrid/) | [demo](https://slickgrid.streamlit.app/) | | | Python wrapper - community driven |
-The Slickgrid-Universal [live demo](https://ghiscoding.github.io/slickgrid-universal) is a Vanilla Implementation (which is not associated to any framework) built with [ViteJS](https://vitejs.dev/) (originally [WebPack](https://webpack.js.org/)) and is also being used to run all E2E tests with [Cypress](https://www.cypress.io/) for testing every UI functionalities. The [Vanilla-force-bundle](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/vanilla-force-bundle), which extends the [vanilla-bundle](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/vanilla-bundle) package, is what we use in our SalesForce LWC (Lightning Web Component) implementation and this Zip file can also be used as a Standalone script (see [zip](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/vanilla-force-bundle/dist-grid-bundle-zip) file). These were all the original reasons to create the library under a monorepo structure, but above all, it was to avoid code duplication.
+The Slickgrid-Universal [live demo](https://ghiscoding.github.io/slickgrid-universal) is a Vanilla Implementation (which is not associated to any framework) built with [ViteJS](https://vitejs.dev/) (originally [WebPack](https://webpack.js.org/)) and is also being used to run all E2E tests with [Cypress](https://www.cypress.io/) for testing every UI functionalities. The [Vanilla-force-bundle](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/vanilla-force-bundle), which extends the [vanilla-bundle](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/vanilla-bundle) package, is what we use in our SalesForce LWC (Lightning Web Component) implementation and this Zip file can also be used as a Standalone script (see [zip](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/vanilla-force-bundle/dist-grid-bundle-zip) file). These were all the original reasons to create the library under a monorepo structure, but above all, it was mainly to avoid code duplication.
Dark Mode is also shown in some of the examples (not all), see [Dark Mode](https://ghiscoding.gitbook.io/slickgrid-universal/styling/dark-mode) documentation for more infos.
@@ -82,6 +84,7 @@ Slickgrid-Universal has **100%** Unit Test Coverage, 5000+ Vitest unit tests and
| [@slickgrid-universal/empty-warning-component](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/empty-warning-component) | [](https://www.npmjs.com/package/@slickgrid-universal/empty-warning-component) | [](https://www.npmjs.com/package/@slickgrid-universal/empty-warning-component) | [](https://bundlephobia.com/result?p=@slickgrid-universal/empty-warning-component) | [changelog](https://github.com/ghiscoding/slickgrid-universal/blob/master/packages/empty-warning-component/CHANGELOG.md) |
| [@slickgrid-universal/pagination-component](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/pagination-component) | [](https://www.npmjs.com/package/@slickgrid-universal/pagination-component) | [](https://www.npmjs.com/package/@slickgrid-universal/pagination-component) | [](https://bundlephobia.com/result?p=@slickgrid-universal/pagination-component) | [changelog](https://github.com/ghiscoding/slickgrid-universal/blob/master/packages/pagination-component/CHANGELOG.md) |
| [@slickgrid-universal/excel-export](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/excel-export) | [](https://www.npmjs.com/package/@slickgrid-universal/excel-export) | [](https://www.npmjs.com/package/@slickgrid-universal/excel-export) | [](https://bundlephobia.com/result?p=@slickgrid-universal/excel-export) | [changelog](https://github.com/ghiscoding/slickgrid-universal/blob/master/packages/excel-export/CHANGELOG.md) |
+| [@slickgrid-universal/pdf-export](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/pdf-export) | [](https://www.npmjs.com/package/@slickgrid-universal/pdf-export) | [](https://www.npmjs.com/package/@slickgrid-universal/pdf-export) | [](https://bundlephobia.com/result?p=@slickgrid-universal/pdf-export) | [changelog](https://github.com/ghiscoding/slickgrid-universal/blob/master/packages/pdf-export/CHANGELOG.md) |
| [@slickgrid-universal/text-export](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/text-export) | [](https://www.npmjs.com/package/@slickgrid-universal/text-export) | [](https://www.npmjs.com/package/@slickgrid-universal/text-export) | [](https://bundlephobia.com/result?p=@slickgrid-universal/text-export) | [changelog](https://github.com/ghiscoding/slickgrid-universal/blob/master/packages/text-export/CHANGELOG.md) |
| [@slickgrid-universal/graphql](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/graphql) | [](https://www.npmjs.com/package/@slickgrid-universal/graphql) | [](https://www.npmjs.com/package/@slickgrid-universal/graphql) | [](https://bundlephobia.com/result?p=@slickgrid-universal/graphql) | [changelog](https://github.com/ghiscoding/slickgrid-universal/blob/master/packages/graphql/CHANGELOG.md) |
| [@slickgrid-universal/odata](https://github.com/ghiscoding/slickgrid-universal/tree/master/packages/odata) | [](https://www.npmjs.com/package/@slickgrid-universal/odata) | [](https://www.npmjs.com/package/@slickgrid-universal/odata) | [](https://bundlephobia.com/result?p=@slickgrid-universal/odata) | [changelog](https://github.com/ghiscoding/slickgrid-universal/blob/master/packages/odata/CHANGELOG.md) |
diff --git a/demos/aurelia/CHANGELOG.md b/demos/aurelia/CHANGELOG.md
index 717e807a95..daa98ab2f1 100644
--- a/demos/aurelia/CHANGELOG.md
+++ b/demos/aurelia/CHANGELOG.md
@@ -4,6 +4,50 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [10.0.0-beta.0](https://github.com/ghiscoding/slickgrid-universal/compare/v9.12.0...v10.0.0-beta.0) (2026-02-14)
+
+### ⚠ BREAKING CHANGES
+
+* migrate Row/Hybrid Selection flag into a single `enableSelection` flag (#2331)
+* drop Cell/Row Selection Models & keep only HybridSelectionModel (#2330)
+* remove all Deprecated code (#2302)
+* drop OperatorType enums and keep only type literal (#2301)
+* replacing multiple TypeScript `enum` with `type` to decrease build size (#2300)
+* make Row Detail plugin as optional in all framework wrappers (#2291)
+* switch to column `hidden` property and always keep all columns (#2281)
+
+### Features
+
+* add custom menu slot renderers ([#2375](https://github.com/ghiscoding/slickgrid-universal/issues/2375)) ([7ebbda5](https://github.com/ghiscoding/slickgrid-universal/commit/7ebbda58233bb5ce94b81b5b2b578af0ea6a068d)) - by @ghiscoding
+* auto-enabled external resources with their associated flags ([#2362](https://github.com/ghiscoding/slickgrid-universal/issues/2362)) ([16dd8a7](https://github.com/ghiscoding/slickgrid-universal/commit/16dd8a77dd5d136a5a99321f0fc4c50571fdb0c0)) - by @ghiscoding
+* drop Cell/Row Selection Models & keep only HybridSelectionModel ([#2330](https://github.com/ghiscoding/slickgrid-universal/issues/2330)) ([4398cf4](https://github.com/ghiscoding/slickgrid-universal/commit/4398cf42e03f6971b81db8cea4ed11138c0aa452)) - by @ghiscoding
+* make Row Detail plugin as optional in all framework wrappers ([#2291](https://github.com/ghiscoding/slickgrid-universal/issues/2291)) ([fa1a14c](https://github.com/ghiscoding/slickgrid-universal/commit/fa1a14c16c987bfaf7725c46e8114b20ea5a505d)) - by @ghiscoding
+* migrate Row/Hybrid Selection flag into a single `enableSelection` flag ([#2331](https://github.com/ghiscoding/slickgrid-universal/issues/2331)) ([5be5e6a](https://github.com/ghiscoding/slickgrid-universal/commit/5be5e6a862ecd024cf43d404769d65c6c1dd335e)) - by @ghiscoding
+* switch to column `hidden` property and always keep all columns ([#2281](https://github.com/ghiscoding/slickgrid-universal/issues/2281)) ([075c649](https://github.com/ghiscoding/slickgrid-universal/commit/075c64961cb7400500df46b792866d39fba2d9e0)) - by @ghiscoding
+* **tooltip:** add global tooltip observation for non-grid elements ([#2371](https://github.com/ghiscoding/slickgrid-universal/issues/2371)) ([1bbc8de](https://github.com/ghiscoding/slickgrid-universal/commit/1bbc8de895e370843286eadd08574efc552ad8fd)) - by @ghiscoding
+
+### Bug Fixes
+
+* **plugin:** SlickCustomTooltip should work with parent+child tooltips ([#2374](https://github.com/ghiscoding/slickgrid-universal/issues/2374)) ([8af7f45](https://github.com/ghiscoding/slickgrid-universal/commit/8af7f45eb19f0a00da2f3de7c729504be7d043eb)) - by @ghiscoding
+* remove all Deprecated code ([#2302](https://github.com/ghiscoding/slickgrid-universal/issues/2302)) ([f42c46c](https://github.com/ghiscoding/slickgrid-universal/commit/f42c46cd1f05b5c72c62f552f124b5bfe776f8b0)) - by @ghiscoding
+
+### Code Refactoring
+
+* drop OperatorType enums and keep only type literal ([#2301](https://github.com/ghiscoding/slickgrid-universal/issues/2301)) ([5dd0807](https://github.com/ghiscoding/slickgrid-universal/commit/5dd08079460dc9af798ab29527997a6d4b31abdd)) - by @ghiscoding
+* replacing multiple TypeScript `enum` with `type` to decrease build size ([#2300](https://github.com/ghiscoding/slickgrid-universal/issues/2300)) ([ea79395](https://github.com/ghiscoding/slickgrid-universal/commit/ea79395cf663b3abce8e43cf27ba6ffea7cfe113)) - by @ghiscoding
+
+## [9.13.0](https://github.com/ghiscoding/slickgrid-universal/compare/v9.12.0...v9.13.0) (2026-01-30)
+
+### Features
+
+* **export:** add new optional PDF Export package ([#2317](https://github.com/ghiscoding/slickgrid-universal/issues/2317)) ([42347f6](https://github.com/ghiscoding/slickgrid-universal/commit/42347f605388d3c080568d8bbe93dcf7c5ed1ff4)) - by @ghiscoding
+* update to latest Aurelia 2 RC.0 ([#2315](https://github.com/ghiscoding/slickgrid-universal/issues/2315)) ([4ea46a6](https://github.com/ghiscoding/slickgrid-universal/commit/4ea46a619e214f5272c364d57d51336c37845035)) - by @ghiscoding
+
+### Bug Fixes
+
+* allow single row selection via click without checkbox column ([#2311](https://github.com/ghiscoding/slickgrid-universal/issues/2311)) ([b2c6594](https://github.com/ghiscoding/slickgrid-universal/commit/b2c659445c5c39b2b76613c113cef833bdd99f97)) - by @ghiscoding
+* only assign CellRangeSelector when Hybrid has `dragToSelect` set ([#2329](https://github.com/ghiscoding/slickgrid-universal/issues/2329)) ([a941819](https://github.com/ghiscoding/slickgrid-universal/commit/a941819649dfa1b54f7887603b930cab27d67c3a)) - by @ghiscoding
+
## [9.12.0](https://github.com/ghiscoding/slickgrid-universal/compare/v9.11.0...v9.12.0) (2025-12-29)
### Bug Fixes
diff --git a/demos/aurelia/package.json b/demos/aurelia/package.json
index 84c2c5560d..441828e1cb 100644
--- a/demos/aurelia/package.json
+++ b/demos/aurelia/package.json
@@ -1,7 +1,7 @@
{
"name": "aurelia-slickgrid-demo",
"private": true,
- "version": "9.12.0",
+ "version": "10.0.0-beta.0",
"description": "Aurelia-Slickgrid demos",
"keywords": [
"aurelia",
@@ -20,34 +20,37 @@
"type-check": "tsc --noEmit"
},
"dependencies": {
- "@aurelia/fetch-client": "^2.0.0-beta.27",
- "@aurelia/i18n": "^2.0.0-beta.27",
- "@aurelia/kernel": "^2.0.0-beta.27",
- "@aurelia/metadata": "^2.0.0-beta.27",
- "@aurelia/router": "^2.0.0-beta.27",
- "@aurelia/runtime": "^2.0.0-beta.27",
- "@aurelia/runtime-html": "^2.0.0-beta.27",
+ "@aurelia/fetch-client": "^2.0.0-rc.0",
+ "@aurelia/i18n": "^2.0.0-rc.0",
+ "@aurelia/kernel": "^2.0.0-rc.0",
+ "@aurelia/metadata": "^2.0.0-rc.0",
+ "@aurelia/router": "^2.0.0-rc.0",
+ "@aurelia/runtime": "^2.0.0-rc.0",
+ "@aurelia/runtime-html": "^2.0.0-rc.0",
"@faker-js/faker": "catalog:",
"@fnando/sparkline": "catalog:",
"@formkit/tempo": "catalog:",
"@popperjs/core": "catalog:",
+ "@slickgrid-universal/aurelia-row-detail-plugin": "workspace:*",
"@slickgrid-universal/common": "workspace:*",
"@slickgrid-universal/composite-editor-component": "workspace:*",
"@slickgrid-universal/custom-tooltip-plugin": "workspace:*",
"@slickgrid-universal/excel-export": "workspace:*",
"@slickgrid-universal/graphql": "workspace:*",
"@slickgrid-universal/odata": "workspace:*",
+ "@slickgrid-universal/pdf-export": "workspace:*",
"@slickgrid-universal/row-detail-view-plugin": "workspace:*",
"@slickgrid-universal/rxjs-observable": "workspace:*",
"@slickgrid-universal/text-export": "workspace:*",
- "aurelia": "^2.0.0-beta.27",
+ "aurelia": "^2.0.0-rc.0",
"aurelia-slickgrid": "workspace:*",
"bootstrap": "catalog:",
"i18next": "catalog:",
+ "jspdf": "catalog:",
"rxjs": "catalog:"
},
"devDependencies": {
- "@aurelia/vite-plugin": "^2.0.0-beta.27",
+ "@aurelia/vite-plugin": "^2.0.0-rc.0",
"@types/fnando__sparkline": "catalog:",
"@types/node": "catalog:",
"@types/sortablejs": "catalog:",
@@ -55,11 +58,10 @@
"cypress": "catalog:",
"cypress-real-events": "catalog:",
"dompurify": "catalog:",
- "npm-run-all2": "catalog:",
"sass": "catalog:",
"tslib": "catalog:",
"typescript": "catalog:",
- "vite": "catalog:vite7",
+ "vite": "catalog:",
"vite-plugin-sass-dts": "^1.3.35"
}
-}
\ No newline at end of file
+}
diff --git a/demos/aurelia/src/assets/i18n/en/aurelia-slickgrid.json b/demos/aurelia/src/assets/i18n/en/aurelia-slickgrid.json
index 8f1107ea84..b412eea6d6 100644
--- a/demos/aurelia/src/assets/i18n/en/aurelia-slickgrid.json
+++ b/demos/aurelia/src/assets/i18n/en/aurelia-slickgrid.json
@@ -22,6 +22,7 @@
"EXPAND_ALL_GROUPS": "Expand all Groups",
"EXPORT_TO_CSV": "Export in CSV format",
"EXPORT_TO_EXCEL": "Export to Excel",
+ "EXPORT_TO_PDF": "Export to PDF",
"EXPORT_TO_TAB_DELIMITED": "Export in Text format (Tab delimited)",
"EXPORT_TO_TEXT_FORMAT": "Export in Text format",
"FILTER_SHORTCUTS": "Filter Shortcuts",
diff --git a/demos/aurelia/src/assets/i18n/fr/aurelia-slickgrid.json b/demos/aurelia/src/assets/i18n/fr/aurelia-slickgrid.json
index cfe73a2670..c957bb46b8 100644
--- a/demos/aurelia/src/assets/i18n/fr/aurelia-slickgrid.json
+++ b/demos/aurelia/src/assets/i18n/fr/aurelia-slickgrid.json
@@ -22,6 +22,7 @@
"EXPAND_ALL_GROUPS": "Étendre tous les groupes",
"EXPORT_TO_CSV": "Exporter en format CSV",
"EXPORT_TO_EXCEL": "Exporter vers Excel",
+ "EXPORT_TO_PDF": "Exporter vers PDF",
"EXPORT_TO_TAB_DELIMITED": "Exporter en format texte (délimité par tabulation)",
"EXPORT_TO_TEXT_FORMAT": "Exporter en format texte",
"FILTER_SHORTCUTS": "Raccourcis de filtre",
diff --git a/demos/aurelia/src/examples/slickgrid/custom-aureliaViewModelEditor.ts b/demos/aurelia/src/examples/slickgrid/custom-aureliaViewModelEditor.ts
index 008e259c40..1e291b379b 100644
--- a/demos/aurelia/src/examples/slickgrid/custom-aureliaViewModelEditor.ts
+++ b/demos/aurelia/src/examples/slickgrid/custom-aureliaViewModelEditor.ts
@@ -33,7 +33,7 @@ export class CustomAureliaViewModelEditor implements Editor {
elmBindingContext?: IBindingContext;
constructor(private args: any) {
- this.grid = args && args.grid;
+ this.grid = args?.grid;
this.init();
}
diff --git a/demos/aurelia/src/examples/slickgrid/custom-aureliaViewModelFilter.ts b/demos/aurelia/src/examples/slickgrid/custom-aureliaViewModelFilter.ts
index d44cc0d24f..f5b6ebbb3a 100644
--- a/demos/aurelia/src/examples/slickgrid/custom-aureliaViewModelFilter.ts
+++ b/demos/aurelia/src/examples/slickgrid/custom-aureliaViewModelFilter.ts
@@ -3,14 +3,13 @@ import type { ICustomElementController } from '@aurelia/runtime-html';
import {
AureliaUtilService,
emptyElement,
- OperatorType,
type Column,
type ColumnFilter,
type Filter,
type FilterArguments,
type FilterCallback,
type GridOption,
- type OperatorString,
+ type OperatorType,
type SearchTerm,
type SlickGrid,
type ViewModelBindableInputData,
@@ -23,7 +22,7 @@ export class CustomAureliaViewModelFilter implements Filter {
searchTerms: SearchTerm[] = [];
columnDef!: Column;
callback!: FilterCallback;
- operator: OperatorType | OperatorString = OperatorType.equal;
+ operator: OperatorType = 'EQ';
/** Aurelia ViewModel Reference */
vm?: { controller?: ICustomElementController } | null;
diff --git a/demos/aurelia/src/examples/slickgrid/custom-inputFilter.ts b/demos/aurelia/src/examples/slickgrid/custom-inputFilter.ts
index fad4c145b6..5972dfba15 100644
--- a/demos/aurelia/src/examples/slickgrid/custom-inputFilter.ts
+++ b/demos/aurelia/src/examples/slickgrid/custom-inputFilter.ts
@@ -1,13 +1,12 @@
import {
emptyElement,
- OperatorType,
type Column,
type ColumnFilter,
type Filter,
type FilterArguments,
type FilterCallback,
type GridOption,
- type OperatorString,
+ type OperatorType,
type SearchTerm,
type SlickGrid,
} from 'aurelia-slickgrid';
@@ -20,7 +19,7 @@ export class CustomInputFilter implements Filter {
searchTerms: SearchTerm[] = [];
columnDef!: Column;
callback!: FilterCallback;
- operator: OperatorType | OperatorString = OperatorType.equal;
+ operator: OperatorType = 'EQ';
/** Getter for the Filter Operator */
get columnFilter(): ColumnFilter {
diff --git a/demos/aurelia/src/examples/slickgrid/example10.ts b/demos/aurelia/src/examples/slickgrid/example10.ts
index 4aff989b69..8788d246e7 100644
--- a/demos/aurelia/src/examples/slickgrid/example10.ts
+++ b/demos/aurelia/src/examples/slickgrid/example10.ts
@@ -148,7 +148,7 @@ export class Example10 {
this.gridOptions1 = {
enableAutoResize: false,
enableCellNavigation: true,
- enableRowSelection: true,
+ enableSelection: true,
enableCheckboxSelector: true,
enableFiltering: true,
checkboxSelector: {
@@ -160,7 +160,7 @@ export class Example10 {
// selectableOverride: (row: number, dataContext: any, grid: SlickGrid) => (dataContext.id % 2 === 1)
},
multiSelect: false,
- rowSelectionOptions: {
+ selectionOptions: {
// True (Single Selection), False (Multiple Selections)
selectActiveRow: true,
},
@@ -196,12 +196,12 @@ export class Example10 {
hideInColumnTitleRow: true,
applySelectOnAllPages: true, // when clicking "Select All", should we apply it to all pages (defaults to true)
},
- rowSelectionOptions: {
+ enableSelection: true,
+ selectionOptions: {
// True (Single Selection), False (Multiple Selections)
selectActiveRow: false,
},
enableCheckboxSelector: true,
- enableRowSelection: true,
gridHeight: 255,
gridWidth: 800,
enablePagination: true,
@@ -293,7 +293,7 @@ export class Example10 {
}
onGrid1SelectedRowsChanged(_e: Event, args: any) {
- const grid = args && args.grid;
+ const grid = args?.grid;
if (Array.isArray(args.rows)) {
this.selectedTitle = args.rows.map((idx: number) => {
const item = grid.getDataItem(idx);
diff --git a/demos/aurelia/src/examples/slickgrid/example11.html b/demos/aurelia/src/examples/slickgrid/example11.html
index 22c7ce799c..71309fb273 100644
--- a/demos/aurelia/src/examples/slickgrid/example11.html
+++ b/demos/aurelia/src/examples/slickgrid/example11.html
@@ -25,7 +25,7 @@
SlickHybridSelectionModel This Selection Model is an hybrid approach that uses a combination of the row or cell selections
- depending on certain conditions. Use enableHybridSelection grid option to enable the new Hybrid Selection Model.
+ depending on certain conditions.
id) will use RowSelectionModel because of our configuration of
@@ -54,6 +54,7 @@ onDragReplaceCells event to customize the
- drag-fill behavior. Use enableHybridSelection grid option to enable the new Hybrid Selection Model.
+ drag-fill behavior. Use { enableSelection: true, selectionOptions: { selectionType: 'mixed' }}
+ grid option to enable the new Hybrid Selection Model.
+ Click on the menu buttons to see the new single slot functionality working across all menu types (Header Menu, Cell + Menu, Context Menu, Grid Menu): +
+
+ Note: The demo focuses on the custom rendering capability via slotRenderer and
+ defaultMenuItemRenderer, which work across all menu plugins (SlickHeaderMenu, SlickCellMenu, SlickContextMenu,
+ SlickGridMenu). Also note that the keyboard shortcuts displayed in the menus (e.g., Alt+↑, F5) are for
+ demo purposes only and do not actually trigger any actions.
+
+
SlickHybridSelectionModel This Selection Model is an hybrid approach that uses a combination of the row or cell
- selections depending on certain conditions. Use enableHybridSelection grid option to enable the new Hybrid Selection
- Model.
+ selections depending on certain conditions.
id) will use RowSelectionModel because of our configuration of
diff --git a/demos/react/src/examples/slickgrid/Example49.tsx b/demos/react/src/examples/slickgrid/Example49.tsx
index 09c5debe6a..2a011ddf22 100644
--- a/demos/react/src/examples/slickgrid/Example49.tsx
+++ b/demos/react/src/examples/slickgrid/Example49.tsx
@@ -75,10 +75,11 @@ const Example49: React.FC = () => {
editorNavigateOnArrows: true, // enable editor navigation using arrow keys
// enable new hybrid selection model (rows & cells)
- enableHybridSelection: true,
- rowSelectionOptions: {
+ enableSelection: true,
+ selectionOptions: {
selectActiveRow: true,
rowSelectColumnIds: ['selector'],
+ selectionType: 'mixed',
},
// when using the ExcelCopyBuffer, you can see what the selection range is
@@ -180,7 +181,9 @@ const Example49: React.FC = () => {
onDragReplaceCells event to
- customize the drag-fill behavior. Use enableHybridSelection grid option to enable the new Hybrid Selection Model.
+ customize the drag-fill behavior. Use{' '}
+ { enableSelection: true, selectionOptions: { selectionType: 'mixed' }}
+ grid option to enable the new Hybrid Selection Model.
+ Click on the menu buttons to see the new single slot functionality working across all menu types (Header Menu, + Cell Menu, Context Menu, Grid Menu): +
+
+
+ Note: The demo focuses on the custom rendering capability via slotRenderer and
+ defaultMenuItemRenderer, which work across all menu plugins (SlickHeaderMenu, SlickCellMenu, SlickContextMenu,
+ SlickGridMenu). Also note that the keyboard shortcuts displayed in the menus (e.g., Alt+↑, F5) are for
+ demo purposes only and do not actually trigger any actions.
+
+
SlickCellRangeSelectorSlickCellRangeSelector with SlickHybridRangeSelector({ selectionType: 'cell' })
+ SlickCellRangeSelector and SlickRowSelectionModelSlickCellRangeSelector and SlickHybridRangeSelector({ selectionType: 'row' })
+ Grid - using enableExcelCopyBuffer which uses SlickCellSelectionModel
Grid - using enableExcelCopyBuffer which uses SlickHybridSelectionModel
The complete first row and the cells C - E of the second row are not allowing to paste values.
Additionally the columns are configured to exportWithFormatter and a custom formatter that renders the cells coordinates or
diff --git a/demos/vanilla/src/examples/example20.ts b/demos/vanilla/src/examples/example20.ts
index 992e6d04be..1a72a4b4dc 100644
--- a/demos/vanilla/src/examples/example20.ts
+++ b/demos/vanilla/src/examples/example20.ts
@@ -2,7 +2,6 @@ import { BindingEventService } from '@slickgrid-universal/binding';
import {
createDomElement,
Editors,
- ExtensionName,
Filters,
Formatters,
SlickEventHandler,
@@ -177,7 +176,7 @@ export default class Example20 {
// Row Detail View is a special case because of its requirement to create extra column definition dynamically
// so it must be pre-registered before SlickGrid is instantiated, we can do so via this option
this.rowDetail = new SlickRowDetailView(pubSubService);
- return [{ name: ExtensionName.rowDetailView, instance: this.rowDetail }];
+ return [{ name: 'rowDetailView', instance: this.rowDetail }];
},
rowHeight: 33,
rowTopOffsetRenderType: 'top', // RowDetail and/or RowSpan don't render well with "transform", you should use "top"
@@ -198,14 +197,14 @@ export default class Example20 {
// you can override it here in the options or externally by calling the method on the plugin instance
expandableOverride: (_row, dataContext) => dataContext.id % 2 === 1,
},
- rowSelectionOptions: {
+ selectionOptions: {
// True (Single Selection), False (Multiple Selections)
selectActiveRow: false,
},
// You could also enable Row Selection as well, but just make sure to disable `useRowClick: false`
enableCheckboxSelector: true,
- enableRowSelection: true,
+ enableSelection: true,
checkboxSelector: {
hideInFilterHeaderRow: false,
hideSelectAllCheckbox: true,
diff --git a/demos/vanilla/src/examples/example21.ts b/demos/vanilla/src/examples/example21.ts
index 6535a53deb..71a4581a49 100644
--- a/demos/vanilla/src/examples/example21.ts
+++ b/demos/vanilla/src/examples/example21.ts
@@ -1,6 +1,6 @@
import { faker } from '@faker-js/faker';
import { BindingEventService } from '@slickgrid-universal/binding';
-import { createDomElement, ExtensionName, SlickEventHandler, type Column, type GridOption } from '@slickgrid-universal/common';
+import { createDomElement, SlickEventHandler, type Column, type GridOption } from '@slickgrid-universal/common';
import { SlickRowDetailView } from '@slickgrid-universal/row-detail-view-plugin';
import { Slicker, type SlickVanillaGridBundle } from '@slickgrid-universal/vanilla-bundle';
import { ExampleGridOptions } from './example-grid-options.js';
@@ -140,7 +140,7 @@ export default class Example21 {
// Row Detail View is a special case because of its requirement to create extra column definition dynamically
// so it must be pre-registered before SlickGrid is instantiated, we can do so via this option
this.rowDetail = new SlickRowDetailView(pubSubService);
- return [{ name: ExtensionName.rowDetailView, instance: this.rowDetail }];
+ return [{ name: 'rowDetailView', instance: this.rowDetail }];
},
rowTopOffsetRenderType: 'top', // RowDetail and/or RowSpan don't render well with "transform", you should use "top"
rowHeight: 33,
diff --git a/demos/vanilla/src/examples/example25.ts b/demos/vanilla/src/examples/example25.ts
index 77aab02cbe..19a3f4abc5 100644
--- a/demos/vanilla/src/examples/example25.ts
+++ b/demos/vanilla/src/examples/example25.ts
@@ -3,7 +3,6 @@ import { BindingEventService } from '@slickgrid-universal/binding';
import {
Filters,
Formatters,
- OperatorType,
type Column,
type CurrentFilter,
type GridOption,
@@ -124,7 +123,7 @@ export default class Example25 {
filter: {
model: Filters.sliderRange,
maxValue: 100, // or you can use the options as well
- operator: OperatorType.rangeInclusive, // defaults to inclusive
+ operator: 'RangeInclusive', // defaults to inclusive
options: {
hideSliderNumbers: false, // you can hide/show the slider numbers on both side
min: 0,
@@ -173,7 +172,7 @@ export default class Example25 {
filterable: true,
filter: {
model: Filters.input,
- operator: OperatorType.rangeExclusive, // defaults to exclusive
+ operator: 'RangeExclusive', // defaults to exclusive
},
},
{
@@ -313,10 +312,10 @@ export default class Example25 {
filters = [
{
columnId: 'finish',
- operator: OperatorType.rangeInclusive,
+ operator: 'RangeInclusive',
searchTerms: [`${currentYear}-01-01`, `${currentYear}-12-31`],
},
- { columnId: 'completed', operator: OperatorType.equal, searchTerms: [true] },
+ { columnId: 'completed', operator: '=', searchTerms: [true] },
];
break;
case 'nextYearTasks':
diff --git a/demos/vanilla/src/examples/example26.ts b/demos/vanilla/src/examples/example26.ts
index 566e7013e9..12be05f140 100644
--- a/demos/vanilla/src/examples/example26.ts
+++ b/demos/vanilla/src/examples/example26.ts
@@ -3,7 +3,6 @@ import { BindingEventService } from '@slickgrid-universal/binding';
import {
Aggregators,
Filters,
- OperatorType,
SortComparers,
type Column,
type GridOption,
@@ -120,7 +119,7 @@ export default class Example26 {
enableCellNavigation: true,
enableFiltering: true,
enableCheckboxSelector: true,
- enableRowSelection: true,
+ enableSelection: true,
enableGrouping: true,
headerMenu: {
hideFreezeColumnsCommand: false,
@@ -137,7 +136,7 @@ export default class Example26 {
enableCount: true,
filterQueryOverride: ({ fieldName, columnDef, columnFilterOperator, searchValues }) => {
- if (columnFilterOperator === OperatorType.custom && columnDef?.id === 'name') {
+ if (columnFilterOperator === 'Custom' && columnDef?.id === 'name') {
let matchesSearch = searchValues[0].replace(/\*/g, '.*');
matchesSearch = matchesSearch.slice(0, 1) + CARET_HTML_ESCAPED + matchesSearch.slice(1);
matchesSearch = matchesSearch.slice(0, -1) + "$'";
diff --git a/demos/vanilla/src/examples/example29.ts b/demos/vanilla/src/examples/example29.ts
index afa8542d58..d8a883a433 100644
--- a/demos/vanilla/src/examples/example29.ts
+++ b/demos/vanilla/src/examples/example29.ts
@@ -76,11 +76,12 @@ export default class Example29 {
gridWidth: 800,
rowHeight: 33,
enableCellNavigation: true,
- enableRowSelection: true,
+ enableSelection: true,
enableRowMoveManager: true,
- rowSelectionOptions: {
+ selectionOptions: {
// True (Single Selection), False (Multiple Selections)
selectActiveRow: false,
+ selectionType: 'row',
},
rowMoveManager: {
columnIndexPosition: 0,
diff --git a/demos/vanilla/src/examples/example30.ts b/demos/vanilla/src/examples/example30.ts
index a24540570f..23b7b7f4d5 100644
--- a/demos/vanilla/src/examples/example30.ts
+++ b/demos/vanilla/src/examples/example30.ts
@@ -1,7 +1,6 @@
import {
Filters,
Formatters,
- OperatorType,
type Column,
type GridOption,
type MultipleSelectOption,
@@ -80,7 +79,7 @@ export default class Example30 {
filter: {
model: Filters.sliderRange,
maxValue: 100, // or you can use the options as well
- operator: OperatorType.rangeInclusive, // defaults to inclusive
+ operator: 'RangeInclusive', // defaults to inclusive
options: {
hideSliderNumbers: false, // you can hide/show the slider numbers on both side
min: 0,
@@ -126,7 +125,7 @@ export default class Example30 {
filterable: true,
filter: {
model: Filters.input,
- operator: OperatorType.rangeExclusive, // defaults to exclusive
+ operator: 'RangeExclusive', // defaults to exclusive
},
},
{
diff --git a/demos/vanilla/src/examples/example32.html b/demos/vanilla/src/examples/example32.html
index 1e6511b1b9..78bf8e90bf 100644
--- a/demos/vanilla/src/examples/example32.html
+++ b/demos/vanilla/src/examples/example32.html
@@ -72,6 +72,10 @@
SlickHybridSelectionModel This Selection Model is an hybrid approach that uses a combination of the row or cell
- selections depending on certain conditions. Use enableHybridSelection grid option to enable the new Hybrid Selection
- Model.
+ selections depending on certain conditions. { enableSelection: true, selectionOptions: { selectionType: 'mixed' }} grid option to enable the
+ new Hybrid Selection Model.
id) will use RowSelectionModel because of our configuration of
diff --git a/demos/vanilla/src/examples/example37.ts b/demos/vanilla/src/examples/example37.ts
index 8314deaccd..8cf8e6cbbf 100644
--- a/demos/vanilla/src/examples/example37.ts
+++ b/demos/vanilla/src/examples/example37.ts
@@ -136,11 +136,10 @@ export default class Example37 {
externalResources: [new ExcelExportService()],
// enable new hybrid selection model (rows & cells)
- enableHybridSelection: true,
- rowSelectionOptions: {
- // True (Single Selection), False (Multiple Selections)
- selectActiveRow: true,
+ enableSelection: true,
+ selectionOptions: {
rowSelectColumnIds: ['id'],
+ selectionType: 'mixed',
},
// when using the ExcelCopyBuffer, you can see what the selection range is
@@ -151,17 +150,21 @@ export default class Example37 {
replaceNewlinesWith: ' ',
},
};
+
this.gridOptions2 = {
...this.gridOptions1,
// you can also enable checkbox selection & row selection, make sure to use `rowSelectColumnIds: ['id', '_checkbox_selector']`
enableCheckboxSelector: true,
- enableRowSelection: true,
- rowSelectionOptions: {
+ enableSelection: true,
+ selectionOptions: {
// True (Single Selection), False (Multiple Selections)
selectActiveRow: false,
// you could use "row" selection to override the hybrid mode
selectionType: 'row',
+
+ // allow using the mouse drag selection to select multiple rows
+ dragToSelect: true,
},
};
}
diff --git a/demos/vanilla/src/examples/example38.html b/demos/vanilla/src/examples/example38.html
index 3227fb5ba8..cd204c6291 100644
--- a/demos/vanilla/src/examples/example38.html
+++ b/demos/vanilla/src/examples/example38.html
@@ -27,7 +27,8 @@ onDragReplaceCells event to customize the
- drag-fill behavior. Use enableHybridSelection grid option to enable the new Hybrid Selection Model.
+ drag-fill behavior. Use { enableSelection: true, selectionOptions: { selectionType: 'mixed' }}
+ grid option to enable the new Hybrid Selection Model.
+ Click on the menu buttons to see the new single slot functionality working across all menu types (Header Menu, Cell + Menu, Context Menu, Grid Menu): +
+
+ Note: The demo focuses on the custom rendering capability via slotRenderer and
+ defaultMenuItemRenderer, which work across all menu plugins (SlickHeaderMenu, SlickCellMenu, SlickContextMenu,
+ SlickGridMenu). Also note that the keyboard shortcuts displayed in the menus (e.g., Alt+↑, F5) are for demo
+ purposes only and do not actually trigger any actions.
+
+
+ Click on the menu buttons to see the new single slot functionality working across all menu types (Header Menu, Cell + Menu, Context Menu, Grid Menu): +
+
+ Note: The demo focuses on the custom rendering capability via slotRenderer and
+ defaultMenuItemRenderer, which work across all menu plugins (SlickHeaderMenu, SlickCellMenu, SlickContextMenu,
+ SlickGridMenu). Also note that the keyboard shortcuts displayed in the menus (e.g., Alt+↑, F5) are for
+ demo purposes only and do not actually trigger any actions.
+
+
SlickHybridSelectionModel This Selection Model is an hybrid approach that uses a combination of the row or cell selections
- depending on certain conditions. Use enableHybridSelection grid option to enable the new Hybrid Selection Model.
+ depending on certain conditions.
id) will use RowSelectionModel because of our configuration of
diff --git a/frameworks/angular-slickgrid/src/demos/examples/example48.component.ts b/frameworks/angular-slickgrid/src/demos/examples/example48.component.ts
index 03088e4601..b12280aa58 100644
--- a/frameworks/angular-slickgrid/src/demos/examples/example48.component.ts
+++ b/frameworks/angular-slickgrid/src/demos/examples/example48.component.ts
@@ -1,7 +1,7 @@
import { Component, type OnInit } from '@angular/core';
import { ExcelExportService } from '@slickgrid-universal/excel-export';
import {
- AngularSlickgridModule,
+ AngularSlickgridComponent,
Formatters,
SlickEventHandler,
type AngularGridInstance,
@@ -14,7 +14,7 @@ const NB_ITEMS = 995;
@Component({
templateUrl: './example48.component.html',
// styles: ['#grid48-1 { .slick-row .slick-cell:first-child { border-right: 1px solid #d4d4d4; } }'],
- imports: [AngularSlickgridModule],
+ imports: [AngularSlickgridComponent],
})
export class Example48Component implements OnInit {
protected _eventHandler = new SlickEventHandler();
@@ -124,11 +124,10 @@ export class Example48Component implements OnInit {
externalResources: [new ExcelExportService()],
// enable new hybrid selection model (rows & cells)
- enableHybridSelection: true,
- rowSelectionOptions: {
- // True (Single Selection), False (Multiple Selections)
- selectActiveRow: true,
+ enableSelection: true,
+ selectionOptions: {
rowSelectColumnIds: ['id'],
+ selectionType: 'mixed',
},
// when using the ExcelCopyBuffer, you can see what the selection range is
@@ -143,13 +142,16 @@ export class Example48Component implements OnInit {
...this.gridOptions1,
// you can also enable checkbox selection & row selection, make sure to use `rowSelectColumnIds: ['id', '_checkbox_selector']`
enableCheckboxSelector: true,
- enableRowSelection: true,
- rowSelectionOptions: {
+ enableSelection: true,
+ selectionOptions: {
// True (Single Selection), False (Multiple Selections)
selectActiveRow: false,
// you could use "row" selection to override the hybrid mode
selectionType: 'row',
+
+ // allow using the mouse drag selection to select multiple rows
+ dragToSelect: true,
},
};
}
diff --git a/frameworks/angular-slickgrid/src/demos/examples/example49.component.html b/frameworks/angular-slickgrid/src/demos/examples/example49.component.html
index 8e8c7cab33..bbd6605a3f 100644
--- a/frameworks/angular-slickgrid/src/demos/examples/example49.component.html
+++ b/frameworks/angular-slickgrid/src/demos/examples/example49.component.html
@@ -22,7 +22,8 @@ onDragReplaceCells event to customize the
- drag-fill behavior. Use enableHybridSelection grid option to enable the new Hybrid Selection Model.
+ drag-fill behavior. Use { enableSelection: true, selectionOptions: { selectionType: 'mixed' }}
+ grid option to enable the new Hybrid Selection Model.
+ Click on the menu buttons to see the new single slot functionality working across all menu types (Header Menu, Cell + Menu, Context Menu, Grid Menu): +
+
+ Note: The demo focuses on the custom rendering capability via slotRenderer and
+ defaultMenuItemRenderer, which work across all menu plugins (SlickHeaderMenu, SlickCellMenu, SlickContextMenu,
+ SlickGridMenu). Also note that the keyboard shortcuts displayed in the menus (e.g., Alt+↑, F5) are for demo
+ purposes only and do not actually trigger any actions.
+
+