angular-slickgrid 9.0.0 → 9.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/{dist/fesm2022 → fesm2022}/angular-slickgrid.mjs +16 -16
- package/package.json +27 -14
- package/.gitbook.yaml +0 -5
- package/CHANGELOG.md +0 -1691
- package/CONTRIBUTING.md +0 -17
- package/angular.json +0 -133
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/clover.xml +0 -1620
- package/coverage/coverage-final.json +0 -9
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -176
- package/coverage/library/components/angular-slickgrid.component.ts.html +0 -5074
- package/coverage/library/components/index.html +0 -116
- package/coverage/library/constants.ts.html +0 -397
- package/coverage/library/extensions/index.html +0 -116
- package/coverage/library/extensions/slickRowDetailView.ts.html +0 -1261
- package/coverage/library/index.html +0 -116
- package/coverage/library/modules/angular-slickgrid.module.ts.html +0 -166
- package/coverage/library/modules/index.html +0 -116
- package/coverage/library/services/angularUtil.service.ts.html +0 -445
- package/coverage/library/services/container.service.ts.html +0 -163
- package/coverage/library/services/index.html +0 -161
- package/coverage/library/services/translater.service.ts.html +0 -199
- package/coverage/library/services/utilities.ts.html +0 -142
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -196
- package/dist/LICENSE +0 -21
- package/dist/README.md +0 -142
- package/docs/README.md +0 -5
- package/docs/TOC.md +0 -105
- package/docs/backend-services/Custom-Backend-Service.md +0 -50
- package/docs/backend-services/GraphQL.md +0 -276
- package/docs/backend-services/OData.md +0 -245
- package/docs/backend-services/graphql/GraphQL-Filtering.md +0 -156
- package/docs/backend-services/graphql/GraphQL-JSON-Result.md +0 -85
- package/docs/backend-services/graphql/GraphQL-Pagination.md +0 -77
- package/docs/backend-services/graphql/GraphQL-Sorting.md +0 -78
- package/docs/column-functionalities/cell-menu.md +0 -212
- package/docs/column-functionalities/editors/autocomplete-editor.md +0 -466
- package/docs/column-functionalities/editors/date-editor-flatpickr.md +0 -71
- package/docs/column-functionalities/editors/date-editor-vanilla-calendar.md +0 -91
- package/docs/column-functionalities/editors/longtext-editor-textarea.md +0 -80
- package/docs/column-functionalities/editors/select-dropdown-editor.md +0 -227
- package/docs/column-functionalities/editors.md +0 -604
- package/docs/column-functionalities/filters/autocomplete-filter.md +0 -183
- package/docs/column-functionalities/filters/compound-filters.md +0 -234
- package/docs/column-functionalities/filters/custom-filter.md +0 -117
- package/docs/column-functionalities/filters/filter-intro.md +0 -81
- package/docs/column-functionalities/filters/input-filter.md +0 -260
- package/docs/column-functionalities/filters/range-filters.md +0 -188
- package/docs/column-functionalities/filters/select-filter.md +0 -695
- package/docs/column-functionalities/filters/single-search-filter.md +0 -77
- package/docs/column-functionalities/filters/styling-filled-filters.md +0 -45
- package/docs/column-functionalities/formatters.md +0 -325
- package/docs/column-functionalities/sorting.md +0 -200
- package/docs/developer-guides/csp-compliance.md +0 -64
- package/docs/events/Available-Events.md +0 -223
- package/docs/events/Grid-&-DataView-Events.md +0 -211
- package/docs/getting-started/quick-start.md +0 -230
- package/docs/getting-started/troubleshooting.md +0 -80
- package/docs/grid-functionalities/Column-Picker.md +0 -22
- package/docs/grid-functionalities/Composite-Editor-Modal.md +0 -627
- package/docs/grid-functionalities/Context-Menu.md +0 -226
- package/docs/grid-functionalities/Custom-Footer.md +0 -80
- package/docs/grid-functionalities/Custom-Tooltip-(plugin).md +0 -258
- package/docs/grid-functionalities/Export-to-Excel.md +0 -457
- package/docs/grid-functionalities/Export-to-Text-File.md +0 -165
- package/docs/grid-functionalities/FAQ.md +0 -53
- package/docs/grid-functionalities/Global-Options.md +0 -29
- package/docs/grid-functionalities/Grid-Auto-Resize.md +0 -218
- package/docs/grid-functionalities/Grid-Menu.md +0 -134
- package/docs/grid-functionalities/Grid-State-&-Preset.md +0 -245
- package/docs/grid-functionalities/Header-Menu-&-Header-Buttons.md +0 -125
- package/docs/grid-functionalities/Resize-by-Cell-Content.md +0 -138
- package/docs/grid-functionalities/Row-Selection.md +0 -247
- package/docs/grid-functionalities/Row-based-edit.md +0 -71
- package/docs/grid-functionalities/add-update-highlight.md +0 -258
- package/docs/grid-functionalities/column-row-spanning.md +0 -74
- package/docs/grid-functionalities/dynamic-item-metadata.md +0 -124
- package/docs/grid-functionalities/excel-copy-buffer.md +0 -145
- package/docs/grid-functionalities/frozen-columns-rows.md +0 -164
- package/docs/grid-functionalities/grouping-and-aggregators.md +0 -269
- package/docs/grid-functionalities/header-footer-slots.md +0 -22
- package/docs/grid-functionalities/infinite-scroll.md +0 -150
- package/docs/grid-functionalities/providing-grid-data.md +0 -61
- package/docs/grid-functionalities/row-detail.md +0 -530
- package/docs/grid-functionalities/tree-data-grid.md +0 -391
- package/docs/localization/Localization---Component-Sample.md +0 -87
- package/docs/localization/Localization-with-Custom-Locales.md +0 -66
- package/docs/localization/Localization-with-ngx-translate.md +0 -148
- package/docs/migrations/migration-to-2.x.md +0 -304
- package/docs/migrations/migration-to-3.x.md +0 -295
- package/docs/migrations/migration-to-4.x.md +0 -83
- package/docs/migrations/migration-to-5.x.md +0 -160
- package/docs/migrations/migration-to-6.x.md +0 -128
- package/docs/migrations/migration-to-7.x.md +0 -294
- package/docs/migrations/migration-to-8.x.md +0 -316
- package/docs/migrations/migration-to-9.x.md +0 -219
- package/docs/slick-grid-dataview-objects/slickgrid-dataview-objects.md +0 -79
- package/docs/styling/dark-mode.md +0 -100
- package/docs/styling/styling.md +0 -250
- package/docs/testing/testing-patterns.md +0 -73
- package/eslint.config.mjs +0 -60
- package/ng-package.json +0 -10
- package/src/assets/angular-logo.png +0 -0
- package/src/assets/angular-logo2.png +0 -0
- package/src/assets/data/collection_100_numbers.json +0 -12
- package/src/assets/data/collection_500_numbers.json +0 -52
- package/src/assets/data/countries.json +0 -245
- package/src/assets/data/country_names.json +0 -245
- package/src/assets/data/customers_100.json +0 -102
- package/src/assets/data/users.csv +0 -5
- package/src/assets/i18n/en.json +0 -102
- package/src/assets/i18n/fr.json +0 -103
- package/src/demos/app-routing.module.ts +0 -108
- package/src/demos/app.component.html +0 -187
- package/src/demos/app.component.scss +0 -79
- package/src/demos/app.component.ts +0 -11
- package/src/demos/app.module.ts +0 -196
- package/src/demos/environments/environment.dev.ts +0 -3
- package/src/demos/environments/environment.prod.ts +0 -3
- package/src/demos/environments/environment.ts +0 -8
- package/src/demos/examples/custom-angularComponentEditor.ts +0 -187
- package/src/demos/examples/custom-angularComponentFilter.ts +0 -123
- package/src/demos/examples/custom-buttonFormatter.component.ts +0 -13
- package/src/demos/examples/custom-inputEditor.ts +0 -132
- package/src/demos/examples/custom-inputFilter.ts +0 -134
- package/src/demos/examples/custom-titleFormatter.component.ts +0 -9
- package/src/demos/examples/data/collection_100_numbers.json +0 -12
- package/src/demos/examples/data/collection_500_numbers.json +0 -52
- package/src/demos/examples/data/countries.json +0 -245
- package/src/demos/examples/data/country_names.json +0 -245
- package/src/demos/examples/data/customers_100.json +0 -102
- package/src/demos/examples/data/users.csv +0 -5
- package/src/demos/examples/editor-ng-select.component.ts +0 -38
- package/src/demos/examples/example01.component.html +0 -48
- package/src/demos/examples/example01.component.ts +0 -109
- package/src/demos/examples/example02.component.html +0 -45
- package/src/demos/examples/example02.component.ts +0 -218
- package/src/demos/examples/example03.component.html +0 -118
- package/src/demos/examples/example03.component.ts +0 -694
- package/src/demos/examples/example04.component.html +0 -87
- package/src/demos/examples/example04.component.ts +0 -326
- package/src/demos/examples/example05.component.html +0 -151
- package/src/demos/examples/example05.component.ts +0 -474
- package/src/demos/examples/example06.component.html +0 -163
- package/src/demos/examples/example06.component.ts +0 -446
- package/src/demos/examples/example07.component.html +0 -56
- package/src/demos/examples/example07.component.scss +0 -10
- package/src/demos/examples/example07.component.ts +0 -216
- package/src/demos/examples/example08.component.html +0 -51
- package/src/demos/examples/example08.component.scss +0 -23
- package/src/demos/examples/example08.component.ts +0 -195
- package/src/demos/examples/example09.component.html +0 -55
- package/src/demos/examples/example09.component.scss +0 -22
- package/src/demos/examples/example09.component.ts +0 -302
- package/src/demos/examples/example10.component.html +0 -103
- package/src/demos/examples/example10.component.ts +0 -309
- package/src/demos/examples/example11.component.html +0 -91
- package/src/demos/examples/example11.component.ts +0 -276
- package/src/demos/examples/example12.component.html +0 -98
- package/src/demos/examples/example12.component.ts +0 -317
- package/src/demos/examples/example13.component.html +0 -96
- package/src/demos/examples/example13.component.ts +0 -370
- package/src/demos/examples/example14.component.html +0 -50
- package/src/demos/examples/example14.component.scss +0 -11
- package/src/demos/examples/example14.component.ts +0 -156
- package/src/demos/examples/example15.component.html +0 -56
- package/src/demos/examples/example15.component.ts +0 -304
- package/src/demos/examples/example16.component.html +0 -77
- package/src/demos/examples/example16.component.ts +0 -277
- package/src/demos/examples/example17.component.html +0 -50
- package/src/demos/examples/example17.component.ts +0 -109
- package/src/demos/examples/example18.component.html +0 -132
- package/src/demos/examples/example18.component.ts +0 -445
- package/src/demos/examples/example19-rowdetail.component.html +0 -40
- package/src/demos/examples/example19-rowdetail.component.ts +0 -54
- package/src/demos/examples/example19.component.html +0 -79
- package/src/demos/examples/example19.component.ts +0 -316
- package/src/demos/examples/example20.component.html +0 -76
- package/src/demos/examples/example20.component.scss +0 -11
- package/src/demos/examples/example20.component.ts +0 -341
- package/src/demos/examples/example21.component.html +0 -86
- package/src/demos/examples/example21.component.scss +0 -16
- package/src/demos/examples/example21.component.ts +0 -140
- package/src/demos/examples/example22.component.html +0 -41
- package/src/demos/examples/example22.component.ts +0 -117
- package/src/demos/examples/example23.component.html +0 -111
- package/src/demos/examples/example23.component.ts +0 -323
- package/src/demos/examples/example24.component.html +0 -120
- package/src/demos/examples/example24.component.scss +0 -62
- package/src/demos/examples/example24.component.ts +0 -641
- package/src/demos/examples/example25.component.html +0 -60
- package/src/demos/examples/example25.component.scss +0 -8
- package/src/demos/examples/example25.component.ts +0 -255
- package/src/demos/examples/example26.component.html +0 -98
- package/src/demos/examples/example26.component.scss +0 -42
- package/src/demos/examples/example26.component.ts +0 -383
- package/src/demos/examples/example27.component.html +0 -138
- package/src/demos/examples/example27.component.scss +0 -10
- package/src/demos/examples/example27.component.ts +0 -369
- package/src/demos/examples/example28.component.html +0 -143
- package/src/demos/examples/example28.component.scss +0 -54
- package/src/demos/examples/example28.component.ts +0 -453
- package/src/demos/examples/example29.component.html +0 -30
- package/src/demos/examples/example29.component.ts +0 -70
- package/src/demos/examples/example30.component.html +0 -116
- package/src/demos/examples/example30.component.scss +0 -20
- package/src/demos/examples/example30.component.ts +0 -1070
- package/src/demos/examples/example32.component.html +0 -77
- package/src/demos/examples/example32.component.scss +0 -8
- package/src/demos/examples/example32.component.ts +0 -905
- package/src/demos/examples/example33.component.html +0 -50
- package/src/demos/examples/example33.component.scss +0 -46
- package/src/demos/examples/example33.component.ts +0 -571
- package/src/demos/examples/example34.component.html +0 -82
- package/src/demos/examples/example34.component.scss +0 -77
- package/src/demos/examples/example34.component.ts +0 -434
- package/src/demos/examples/example35.component.html +0 -77
- package/src/demos/examples/example35.component.scss +0 -18
- package/src/demos/examples/example35.component.ts +0 -264
- package/src/demos/examples/example36.component.html +0 -56
- package/src/demos/examples/example36.component.scss +0 -26
- package/src/demos/examples/example36.component.ts +0 -504
- package/src/demos/examples/example37.component.html +0 -30
- package/src/demos/examples/example37.component.ts +0 -123
- package/src/demos/examples/example38.component.html +0 -104
- package/src/demos/examples/example38.component.scss +0 -8
- package/src/demos/examples/example38.component.ts +0 -420
- package/src/demos/examples/example39.component.html +0 -112
- package/src/demos/examples/example39.component.scss +0 -8
- package/src/demos/examples/example39.component.ts +0 -371
- package/src/demos/examples/example40.component.html +0 -76
- package/src/demos/examples/example40.component.ts +0 -226
- package/src/demos/examples/example41.component.html +0 -50
- package/src/demos/examples/example41.component.scss +0 -42
- package/src/demos/examples/example41.component.ts +0 -229
- package/src/demos/examples/example42.component.html +0 -47
- package/src/demos/examples/example42.component.ts +0 -203
- package/src/demos/examples/example43.component.html +0 -94
- package/src/demos/examples/example43.component.scss +0 -30
- package/src/demos/examples/example43.component.ts +0 -449
- package/src/demos/examples/example44.component.html +0 -78
- package/src/demos/examples/example44.component.scss +0 -50
- package/src/demos/examples/example44.component.ts +0 -375
- package/src/demos/examples/example45-detail.component.html +0 -15
- package/src/demos/examples/example45-detail.component.ts +0 -97
- package/src/demos/examples/example45.component.html +0 -110
- package/src/demos/examples/example45.component.scss +0 -50
- package/src/demos/examples/example45.component.ts +0 -243
- package/src/demos/examples/filter-ng-select.component.ts +0 -33
- package/src/demos/examples/grid-custom-pager.component.html +0 -60
- package/src/demos/examples/grid-custom-pager.component.scss +0 -57
- package/src/demos/examples/grid-custom-pager.component.ts +0 -107
- package/src/demos/examples/grid-remote.component.html +0 -44
- package/src/demos/examples/grid-remote.component.ts +0 -164
- package/src/demos/examples/home.component.html +0 -39
- package/src/demos/examples/home.component.ts +0 -10
- package/src/demos/examples/jsonp.ts +0 -89
- package/src/demos/examples/rowdetail-preload.component.ts +0 -10
- package/src/demos/examples/swt-common-grid-pagination.component.ts +0 -160
- package/src/demos/examples/swt-common-grid-test.component.html +0 -37
- package/src/demos/examples/swt-common-grid-test.component.ts +0 -214
- package/src/demos/examples/swt-common-grid.component.ts +0 -436
- package/src/demos/examples/swt-logger.service.ts +0 -173
- package/src/demos/examples/utilities.ts +0 -9
- package/src/favicon.ico +0 -0
- package/src/index.html +0 -17
- package/src/library/components/__tests__/angular-slickgrid.component.spec.ts +0 -2638
- package/src/library/components/angular-slickgrid.component.html +0 -5
- package/src/library/components/angular-slickgrid.component.ts +0 -1662
- package/src/library/constants.ts +0 -105
- package/src/library/extensions/__tests__/slickRowDetailView.spec.ts +0 -751
- package/src/library/extensions/index.ts +0 -1
- package/src/library/extensions/slickRowDetailView.ts +0 -395
- package/src/library/global-grid-options.ts +0 -273
- package/src/library/index.ts +0 -11
- package/src/library/models/angularComponentOutput.interface.ts +0 -6
- package/src/library/models/angularGridInstance.interface.ts +0 -76
- package/src/library/models/externalTestingDependencies.interface.ts +0 -37
- package/src/library/models/gridOption.interface.ts +0 -15
- package/src/library/models/index.ts +0 -5
- package/src/library/models/rowDetailView.interface.ts +0 -16
- package/src/library/modules/angular-slickgrid.module.spec.ts +0 -25
- package/src/library/modules/angular-slickgrid.module.ts +0 -27
- package/src/library/services/__tests__/angularUtilService.spec.ts +0 -156
- package/src/library/services/__tests__/container.service.spec.ts +0 -25
- package/src/library/services/__tests__/translater.service.spec.ts +0 -43
- package/src/library/services/__tests__/utilities.spec.ts +0 -22
- package/src/library/services/angularUtil.service.ts +0 -120
- package/src/library/services/container.service.ts +0 -26
- package/src/library/services/index.ts +0 -4
- package/src/library/services/translater.service.ts +0 -38
- package/src/library/services/utilities.ts +0 -19
- package/src/library/slickgrid-config.ts +0 -10
- package/src/main.ts +0 -13
- package/src/public_api.ts +0 -1
- package/src/styles.scss +0 -178
- package/test/cypress/e2e/example01.cy.ts +0 -367
- package/test/cypress/e2e/example02.cy.ts +0 -60
- package/test/cypress/e2e/example03.cy.ts +0 -268
- package/test/cypress/e2e/example04.cy.ts +0 -254
- package/test/cypress/e2e/example05.cy.ts +0 -804
- package/test/cypress/e2e/example06.cy.ts +0 -890
- package/test/cypress/e2e/example07.cy.ts +0 -384
- package/test/cypress/e2e/example08.cy.ts +0 -190
- package/test/cypress/e2e/example09.cy.ts +0 -392
- package/test/cypress/e2e/example10.cy.ts +0 -650
- package/test/cypress/e2e/example11.cy.ts +0 -86
- package/test/cypress/e2e/example12.cy.ts +0 -269
- package/test/cypress/e2e/example13.cy.ts +0 -246
- package/test/cypress/e2e/example14.cy.ts +0 -122
- package/test/cypress/e2e/example15.cy.ts +0 -598
- package/test/cypress/e2e/example16.cy.ts +0 -427
- package/test/cypress/e2e/example17.cy.ts +0 -83
- package/test/cypress/e2e/example18.cy.ts +0 -431
- package/test/cypress/e2e/example19.cy.ts +0 -263
- package/test/cypress/e2e/example20.cy.ts +0 -264
- package/test/cypress/e2e/example21.cy.ts +0 -77
- package/test/cypress/e2e/example22.cy.ts +0 -94
- package/test/cypress/e2e/example23.cy.ts +0 -259
- package/test/cypress/e2e/example24.cy.ts +0 -707
- package/test/cypress/e2e/example25.cy.ts +0 -193
- package/test/cypress/e2e/example26.cy.ts +0 -111
- package/test/cypress/e2e/example27.cy.ts +0 -261
- package/test/cypress/e2e/example28.cy.ts +0 -740
- package/test/cypress/e2e/example29.cy.ts +0 -30
- package/test/cypress/e2e/example30.cy.ts +0 -757
- package/test/cypress/e2e/example31.cy.ts +0 -69
- package/test/cypress/e2e/example32.cy.ts +0 -272
- package/test/cypress/e2e/example33.cy.ts +0 -278
- package/test/cypress/e2e/example34.cy.ts +0 -84
- package/test/cypress/e2e/example35.cy.ts +0 -178
- package/test/cypress/e2e/example36.cy.ts +0 -219
- package/test/cypress/e2e/example37.cy.ts +0 -52
- package/test/cypress/e2e/example38.cy.ts +0 -160
- package/test/cypress/e2e/example39.cy.ts +0 -150
- package/test/cypress/e2e/example40.cy.ts +0 -126
- package/test/cypress/e2e/example41.cy.ts +0 -90
- package/test/cypress/e2e/example42.cy.ts +0 -82
- package/test/cypress/e2e/example43.cy.ts +0 -482
- package/test/cypress/e2e/example44.cy.ts +0 -458
- package/test/cypress/e2e/example45.cy.ts +0 -455
- package/test/cypress/e2e/home.cy.ts +0 -7
- package/test/cypress/fixtures/example.json +0 -5
- package/test/cypress/plugins/index.ts +0 -17
- package/test/cypress/plugins/utilities.ts +0 -28
- package/test/cypress/support/commands.ts +0 -88
- package/test/cypress/support/common.ts +0 -47
- package/test/cypress/support/drag.ts +0 -101
- package/test/cypress/support/index.ts +0 -20
- package/test/cypress/tsconfig.json +0 -9
- package/test/cypress.config.ts +0 -34
- package/test/mockSlickEvent.ts +0 -77
- package/test/rxjsResourceStub.ts +0 -69
- package/test/test-setup.ts +0 -6
- package/test/translateServiceStub.ts +0 -230
- package/test/translaterServiceStub.ts +0 -239
- package/test/tsconfig.json +0 -17
- package/test/vitest-global-mocks.ts +0 -41
- package/test/vitest-global-setup.ts +0 -3
- package/test/vitest-pretest.ts +0 -5
- package/tsconfig.app.json +0 -14
- package/tsconfig.json +0 -31
- package/tsconfig.spec.json +0 -11
- package/types/sortablejs.d.ts +0 -4
- package/vite.config.mts +0 -51
- /package/{dist/fesm2022 → fesm2022}/angular-slickgrid.mjs.map +0 -0
- /package/{dist/i18n → i18n}/en.json +0 -0
- /package/{dist/i18n → i18n}/fr.json +0 -0
- /package/{dist/index.d.ts → index.d.ts} +0 -0
- /package/{dist/library → library}/components/angular-slickgrid.component.d.ts +0 -0
- /package/{dist/library → library}/constants.d.ts +0 -0
- /package/{dist/library → library}/extensions/index.d.ts +0 -0
- /package/{dist/library → library}/extensions/slickRowDetailView.d.ts +0 -0
- /package/{dist/library → library}/global-grid-options.d.ts +0 -0
- /package/{dist/library → library}/index.d.ts +0 -0
- /package/{dist/library → library}/models/angularComponentOutput.interface.d.ts +0 -0
- /package/{dist/library → library}/models/angularGridInstance.interface.d.ts +0 -0
- /package/{dist/library → library}/models/externalTestingDependencies.interface.d.ts +0 -0
- /package/{dist/library → library}/models/gridOption.interface.d.ts +0 -0
- /package/{dist/library → library}/models/index.d.ts +0 -0
- /package/{dist/library → library}/models/rowDetailView.interface.d.ts +0 -0
- /package/{dist/library → library}/modules/angular-slickgrid.module.d.ts +0 -0
- /package/{dist/library → library}/services/angularUtil.service.d.ts +0 -0
- /package/{dist/library → library}/services/container.service.d.ts +0 -0
- /package/{dist/library → library}/services/index.d.ts +0 -0
- /package/{dist/library → library}/services/translater.service.d.ts +0 -0
- /package/{dist/library → library}/services/utilities.d.ts +0 -0
- /package/{dist/library → library}/slickgrid-config.d.ts +0 -0
- /package/{dist/public_api.d.ts → public_api.d.ts} +0 -0
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
#### Index
|
|
2
|
-
- [Columns/Rows Pinning Basic](#columnsrows-pinning-basic)
|
|
3
|
-
- [Rows Pinning starting from Bottom](#rows-pinning-starting-from-bottom)
|
|
4
|
-
- [Change Pinning Dynamically](#change-pinning-dynamically)
|
|
5
|
-
- [Animated Gif Demo](#animated-gif-demo)
|
|
6
|
-
|
|
7
|
-
### Demo
|
|
8
|
-
[Demo Page](https://ghiscoding.github.io/angular-slickgrid-bs4-demo/#/frozen) / [Demo Component](https://github.com/ghiscoding/slickgrid-universal/blob/master/frameworks/angular-slickgrid/src/demos/examples/grid-frozen.component.ts)
|
|
9
|
-
|
|
10
|
-
### Introduction
|
|
11
|
-
One of the requested features, columns or rows pinning (aka frozen). You can pin 1 or more Columns and/or 1 or more Rows. Columns can only be pinned starting from the left side, while Rows can be pinned starting from the Top (default) or Bottom. You can also change the pinning dynamically with `setOptions()`.
|
|
12
|
-
|
|
13
|
-
## Columns/Rows Pinning basic
|
|
14
|
-
To set a pinning for the entire duration of the grid, simply use the Grid Options `frozenColumn` (starting from top) and `frozenRow` (starting from left), which are both `number` types.
|
|
15
|
-
|
|
16
|
-
```html
|
|
17
|
-
<angular-slickgrid gridId="grid2"
|
|
18
|
-
[columns]="columnDefinitions"
|
|
19
|
-
[options]="gridOptions"
|
|
20
|
-
[dataset]="dataset">
|
|
21
|
-
</angular-slickgrid>
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
##### Component
|
|
25
|
-
```typescript
|
|
26
|
-
import { Component, OnInit} from '@angular/core';
|
|
27
|
-
|
|
28
|
-
export class GridBasicComponent implements OnInit {
|
|
29
|
-
columnDefinitions: Column[];
|
|
30
|
-
gridOptions: GridOption;
|
|
31
|
-
dataset: any[];
|
|
32
|
-
|
|
33
|
-
ngOnInit(): void {
|
|
34
|
-
// your columns definition
|
|
35
|
-
this.columnDefinitions = [];
|
|
36
|
-
|
|
37
|
-
this.gridOptions = {
|
|
38
|
-
alwaysShowVerticalScroll: false, // disable scroll since we don't want it to show on the left pinned columns
|
|
39
|
-
frozenColumn: 2, // number of pinned columns starting from the left
|
|
40
|
-
frozenRow: 3, // number of pinned columns starting from the top
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
## Rows Pinning starting from bottom
|
|
47
|
-
This is basically the same thing as previous code sample, except that you will set the Grid Option property `frozenBottom` to true and that it's.
|
|
48
|
-
##### Component
|
|
49
|
-
```ts
|
|
50
|
-
import { Component, OnInit} from '@angular/core';
|
|
51
|
-
|
|
52
|
-
export class GridBasicComponent implements OnInit {
|
|
53
|
-
columnDefinitions: Column[];
|
|
54
|
-
gridOptions: GridOption;
|
|
55
|
-
dataset: any[];
|
|
56
|
-
|
|
57
|
-
ngOnInit(): void {
|
|
58
|
-
// your columns definition
|
|
59
|
-
this.columnDefinitions = [];
|
|
60
|
-
|
|
61
|
-
this.gridOptions = {
|
|
62
|
-
alwaysShowVerticalScroll: false, // disable scroll since we don't want it to show on the left pinned columns
|
|
63
|
-
frozenColumn: 2, // number of pinned columns starting from the left
|
|
64
|
-
frozenRow: 3, // number of pinned columns (starting from bottom with next property)
|
|
65
|
-
frozenBottom: true, // this will make rows to be pinned starting from the bottom and the number of rows will be 3
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## Change Pinning Dynamically
|
|
72
|
-
You can change the number of pinned columns/rows and even the pinning of columns from top to bottom. For a demo of what that could look like, take a look at the [Animated Gif Demo](#animated-gif-demo) below.
|
|
73
|
-
|
|
74
|
-
```html
|
|
75
|
-
<div class="row col-sm-12">
|
|
76
|
-
<span>
|
|
77
|
-
<label for="">Pinned Rows: </label>
|
|
78
|
-
<input type="number" [(ngModel)]="frozenRowCount">
|
|
79
|
-
<button class="btn btn-default btn-xs" (click)="changeFrozenRowCount()">
|
|
80
|
-
Set
|
|
81
|
-
</button>
|
|
82
|
-
</span>
|
|
83
|
-
<span style="margin-left: 10px">
|
|
84
|
-
<label for="">Pinned Columns: </label>
|
|
85
|
-
<input type="number" [(ngModel)]="frozenColumnCount">
|
|
86
|
-
<button class="btn btn-default btn-xs" (click)="changeFrozenColumnCount()">
|
|
87
|
-
Set
|
|
88
|
-
</button>
|
|
89
|
-
</span>
|
|
90
|
-
<span style="margin-left: 15px">
|
|
91
|
-
<button class="btn btn-default btn-sm" (click)="toggleFrozenBottomRows()">
|
|
92
|
-
<i class="mdi mdi-flip-vertical"></i> Toggle Pinned Rows
|
|
93
|
-
</button>
|
|
94
|
-
<span style="font-weight: bold;">: {{ isFrozenBottom ? 'Bottom' : 'Top' }}</span>
|
|
95
|
-
</span>
|
|
96
|
-
</div>
|
|
97
|
-
|
|
98
|
-
<angular-slickgrid gridId="grid2"
|
|
99
|
-
[columns]="columnDefinitions"
|
|
100
|
-
[options]="gridOptions"
|
|
101
|
-
[dataset]="dataset"
|
|
102
|
-
(onAngularGridCreated)="angularGridReady($event.detail)">
|
|
103
|
-
</angular-slickgrid>
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
##### Component
|
|
107
|
-
```ts
|
|
108
|
-
import { Component, OnInit} from '@angular/core';
|
|
109
|
-
import { AngularGridInstance } from 'angular-slickgrid';
|
|
110
|
-
|
|
111
|
-
export class GridBasicComponent implements OnInit {
|
|
112
|
-
columnDefinitions: Column[];
|
|
113
|
-
dataset: any[];
|
|
114
|
-
gridOptions: GridOption;
|
|
115
|
-
gridObj: any;
|
|
116
|
-
isFrozenBottom = false;
|
|
117
|
-
|
|
118
|
-
ngOnInit(): void {
|
|
119
|
-
// your columns definition
|
|
120
|
-
this.columnDefinitions = [];
|
|
121
|
-
|
|
122
|
-
this.gridOptions = {
|
|
123
|
-
alwaysShowVerticalScroll: false, // disable scroll since we don't want it to show on the left pinned columns
|
|
124
|
-
frozenColumn: 2, // number of pinned columns starting from the left
|
|
125
|
-
frozenRow: 3, // number of pinned columns starting from the top
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
angularGridReady(angularGrid: AngularGridInstance) {
|
|
130
|
-
this.gridObj = angularGrid.slickGrid;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/** change dynamically, through slickgrid "setOptions()" the number of pinned columns */
|
|
134
|
-
changeFrozenColumnCount() {
|
|
135
|
-
if (this.gridObj && this.gridObj.setOptions) {
|
|
136
|
-
this.gridObj.setOptions({
|
|
137
|
-
frozenColumn: this.frozenColumnCount
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/** change dynamically, through slickgrid "setOptions()" the number of pinned rows */
|
|
143
|
-
changeFrozenRowCount() {
|
|
144
|
-
if (this.gridObj && this.gridObj.setOptions) {
|
|
145
|
-
this.gridObj.setOptions({
|
|
146
|
-
frozenRow: this.frozenRowCount
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/** toggle dynamically, through slickgrid "setOptions()" the top/bottom pinned location */
|
|
152
|
-
toggleFrozenBottomRows() {
|
|
153
|
-
if (this.gridObj && this.gridObj.setOptions) {
|
|
154
|
-
this.gridObj.setOptions({
|
|
155
|
-
frozenBottom: !this.isFrozenBottom
|
|
156
|
-
});
|
|
157
|
-
this.isFrozenBottom = !this.isFrozenBottom; // toggle the variable
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
## Animated Gif Demo
|
|
164
|
-

|
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
#### index
|
|
2
|
-
- [Demo](#demo)
|
|
3
|
-
- [Description](#description)
|
|
4
|
-
- [Setup](#setup)
|
|
5
|
-
- [Draggable Dropzone Location](#draggable-dropzone-location)
|
|
6
|
-
- [Aggregators](#aggregators)
|
|
7
|
-
- [SortComparers](https://github.com/ghiscoding/slickgrid-universal/blob/master/packages/common/src/sortComparers/sortComparers.index.ts)
|
|
8
|
-
- [GroupTotalsFormatter](#group-totals-formatter)
|
|
9
|
-
- [Custom GroupTotalsFormatter](#custom-grouptotalsformatter)
|
|
10
|
-
- [Set a Grouping](#set-a-grouping)
|
|
11
|
-
- [Clear Grouping / Collapse All / Expand All](#clear-grouping--collapse-all--expand-all)
|
|
12
|
-
- [Styling - Change Icons](#styling-change-icons)
|
|
13
|
-
|
|
14
|
-
## Demo
|
|
15
|
-
##### Regular Grouping
|
|
16
|
-
[Demo Page](https://ghiscoding.github.io/Angular-Slickgrid/#/grouping) / [Demo Component](https://github.com/ghiscoding/slickgrid-universal/blob/master/frameworks/angular-slickgrid/src/demos/examples/grid-grouping.component.ts)
|
|
17
|
-
|
|
18
|
-
##### Draggable Grouping
|
|
19
|
-
[Demo Page](https://ghiscoding.github.io/Angular-Slickgrid/#/draggrouping) / [Demo Component](https://github.com/ghiscoding/slickgrid-universal/blob/master/frameworks/angular-slickgrid/src/demos/examples/grid-draggrouping.component.ts)
|
|
20
|
-
|
|
21
|
-
### Description
|
|
22
|
-
Fully dynamic and interactive multi-level grouping with filtering and aggregates that is achieved with the help of the `DataView` object in `SlickGrid`. Each grouping level can have its own aggregates (over child rows, child groups, or all descendant rows). An aggregate can be seen as sub-totals, totals, average, ... or any defined group(s).
|
|
23
|
-
|
|
24
|
-
How does it work in `SlickGrid`?
|
|
25
|
-
The important thing to understand while working with `SlickGrid` is that Grouping requires you to provide 2 things, if you omit 1 of them, it will simply not work. These 2 things are
|
|
26
|
-
1. You will need to define which type of aggregate (accumulator) you want to use
|
|
27
|
-
- Angular-Slickgrid provides the following built-in `Aggregators`: `Avg`, `Min`, `Max`, `Sum`
|
|
28
|
-
2. You need to add a `groupTotalsFormatter` on the column definition you want it to be calculated
|
|
29
|
-
- this is very similar to a Formatter, except that they are designed to show aggregate results, e.g:: `Total: 142.50$`
|
|
30
|
-
|
|
31
|
-
These 2 steps go hands in hands, a `groupTotalsFormatter` would have nothing to show if it does not have an `Aggregator`.
|
|
32
|
-
|
|
33
|
-
### Setup
|
|
34
|
-
One of the very first thing that you need to do is to provide the `SlickGrid DataView` object to your `ViewModel`. The `DataView` is where we will define all of our Grouping. You can get the `dataView` object through an Event Emitter `onDataviewCreated` like so:
|
|
35
|
-
|
|
36
|
-
##### View
|
|
37
|
-
```html
|
|
38
|
-
<angular-slickgrid
|
|
39
|
-
gridId="grid2"
|
|
40
|
-
[columns]="columnDefinitions"
|
|
41
|
-
[options]="gridOptions"
|
|
42
|
-
[dataset]="dataset"
|
|
43
|
-
(onAngularGridCreated)="angularGridReady($event.detail)">
|
|
44
|
-
</angular-slickgrid>
|
|
45
|
-
```
|
|
46
|
-
##### Component
|
|
47
|
-
|
|
48
|
-
```typescript
|
|
49
|
-
|
|
50
|
-
@Component({
|
|
51
|
-
templateUrl: './grid-grouping.component.html'
|
|
52
|
-
})
|
|
53
|
-
export class GridGroupingComponent implements OnInit, OnDestroy {
|
|
54
|
-
columnDefinitions: Column[];
|
|
55
|
-
gridOptions: GridOption;
|
|
56
|
-
dataviewObj: any;
|
|
57
|
-
|
|
58
|
-
angularGridReady(angularGrid: AngularGridInstance) {
|
|
59
|
-
this.angularGrid = angularGrid;
|
|
60
|
-
this.gridObj = angularGrid.slickGrid;
|
|
61
|
-
this.dataViewObj = angularGrid.dataView;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### Draggable Dropzone Location
|
|
67
|
-
|
|
68
|
-
The Draggable Grouping can be located in either the Top-Header or the Pre-Header as described below.
|
|
69
|
-
|
|
70
|
-
#### Pre-Heaader
|
|
71
|
-
Draggable Grouping can be located in either the Pre-Header of the Top-Header, however when it is located in the Pre-Header then the Header Grouping will not be available (because both of them would conflict with each other). Note that prior to the version 8.1 of Angular-Slickgrid, the Pre-Header was the default and only available option.
|
|
72
|
-
|
|
73
|
-
```ts
|
|
74
|
-
this.gridOptions = {
|
|
75
|
-
createPreHeaderPanel: true,
|
|
76
|
-
showPreHeaderPanel: true,
|
|
77
|
-
preHeaderPanelHeight: 26,
|
|
78
|
-
draggableGrouping: {
|
|
79
|
-
// ... any draggable plugin option
|
|
80
|
-
},
|
|
81
|
-
}
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
#### Top-Heaader
|
|
85
|
-
##### requires v8.1 and higher
|
|
86
|
-
This is the preferred section since the Top-Header is on top of all headers (including pre-header) and it will always be the full grid width. Using the Top-Header also frees up the Pre-Header section for the potential use of Header Grouping.
|
|
87
|
-
|
|
88
|
-
When using Draggable Grouping and Header Grouping together, you need to enable both top-header and pre-header.
|
|
89
|
-
```ts
|
|
90
|
-
this.gridOptions = {
|
|
91
|
-
// we'll use top-header for the Draggable Grouping
|
|
92
|
-
createTopHeaderPanel: true,
|
|
93
|
-
showTopHeaderPanel: true,
|
|
94
|
-
topHeaderPanelHeight: 35,
|
|
95
|
-
|
|
96
|
-
// pre-header will include our Header Grouping (i.e. "Common Factor")
|
|
97
|
-
createPreHeaderPanel: true,
|
|
98
|
-
showPreHeaderPanel: true,
|
|
99
|
-
preHeaderPanelHeight: 26,
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
### Aggregators
|
|
104
|
-
The `Aggregators` is basically the accumulator, the logic that will do the sum (or any other aggregate we defined). We simply need to instantiate the `Aggregator` by passing the column definition `field` that will be used to accumulate. For example, if we have a column definition of Cost and we want to calculate it's sum, we can call the `Aggregator` as follow
|
|
105
|
-
```ts
|
|
106
|
-
new Aggregators.Sum('cost')
|
|
107
|
-
```
|
|
108
|
-
The available built-in `Aggregators` are
|
|
109
|
-
- `Aggregators.Avg` (calculate the Average of a group)
|
|
110
|
-
- `Aggregators.Min` (returns the Minimum value of a group)
|
|
111
|
-
- `Aggregators.Max` (returns the Maximum value of a group)
|
|
112
|
-
- `Aggregators.Sum` (calculate the Sum of a group)
|
|
113
|
-
- `Aggregators.Clone` (will clone the same grouped text and display it in as an aggregated value)
|
|
114
|
-
- `Aggregators.Distinct` (will show distinct value)
|
|
115
|
-
|
|
116
|
-
### Group Totals Formatter
|
|
117
|
-
When defining your column definitions, you will need to decide which of the column will have an aggregate. Once that decision is made, you will add a `groupTotalsFormatter` to that column definition in question (a Formatter for the group total). For example, let say that we have a cost and we want a total sum grouped by a duration, the code would look like below.
|
|
118
|
-
|
|
119
|
-
##### Available Group Total Formatters
|
|
120
|
-
You can see the full list under [`groupingFormatters.index.ts`](https://github.com/ghiscoding/slickgrid-universal/blob/master/packages/common/src/grouping-formatters/groupingFormatters.index.ts)
|
|
121
|
-
Note: the Group Total Formatters named as currency will have these extra `params` (`groupFormatterPrefix`, `groupFormatterSuffix`, `groupFormatterCurrencyPrefix`, `groupFormatterCurrencySuffix`) and also the other common Formatter `params` (`minDecimal`, `maxDecimal`, `decimalSeparator`, `thousandSeparator`, `displayNegativeNumberWithParentheses`).
|
|
122
|
-
|
|
123
|
-
- `avgTotalsPercentageFormatter`
|
|
124
|
-
- `avgTotalsDollarFormatter`
|
|
125
|
-
- `avgTotalsCurrencyFormatter`
|
|
126
|
-
- `avgTotalsFormatter`
|
|
127
|
-
- `minTotalsFormatter`
|
|
128
|
-
- `maxTotalsFormatter`
|
|
129
|
-
- `sumTotalsColoredFormatter`
|
|
130
|
-
- `sumTotalsCurrencyFormatter`
|
|
131
|
-
- `sumTotalsCurrencyColoredFormatter`
|
|
132
|
-
- `sumTotalsDollarColoredBoldFormatter`
|
|
133
|
-
- `sumTotalsDollarColoredFormatter`
|
|
134
|
-
- `sumTotalsDollarBoldFormatter`
|
|
135
|
-
- `sumTotalsDollarFormatter`
|
|
136
|
-
- `sumTotalsFormatter`
|
|
137
|
-
- `sumTotalsBoldFormatter`
|
|
138
|
-
|
|
139
|
-
##### ViewModel
|
|
140
|
-
```typescript
|
|
141
|
-
export class GridGroupingComponent implements OnInit, OnDestroy {
|
|
142
|
-
this.columnDefinitions = [
|
|
143
|
-
{
|
|
144
|
-
id: 'title', name: 'Title', field: 'title'
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
id: 'duration', name: 'Duration', field: 'duration',
|
|
148
|
-
type: 'number',
|
|
149
|
-
groupTotalsFormatter: GroupTotalFormatters.sumTotals,
|
|
150
|
-
params: { groupFormatterPrefix: 'Total: ' }
|
|
151
|
-
},
|
|
152
|
-
{
|
|
153
|
-
id: 'cost', name: 'Cost', field: 'cost',
|
|
154
|
-
exportWithFormatter: true, // for a Dollar Formatter, we also want it to be displayed in the export to file
|
|
155
|
-
formatter: Formatters.dollar,
|
|
156
|
-
groupTotalsFormatter: GroupTotalFormatters.sumTotalsDollar,
|
|
157
|
-
params: { groupFormatterPrefix: '<b>Total</b>: ' /*, groupFormatterSuffix: ' USD'*/ }
|
|
158
|
-
}
|
|
159
|
-
];
|
|
160
|
-
|
|
161
|
-
this.gridOptions = {
|
|
162
|
-
enableGrouping: true, // don't forget to enable the grouping
|
|
163
|
-
exportOptions: {
|
|
164
|
-
sanitizeDataExport: true // you can also sanitize the exported data (it will remove any HTML tags)
|
|
165
|
-
}
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
#### Prefix/Suffix to a `groupTotalsFormatter`
|
|
171
|
-
We can also pass prefix and/or suffix to each `groupTotalsFormatter` by adding them to the `params` object. Also note that you can also type HTML to be interpreted. For example, let say we would like `Total:` to show as bold and a suffix of 'USD' , you can write it this way:
|
|
172
|
-
|
|
173
|
-
**Note** prefix/suffix are concatenated without spaces, if you require a space then make sure to add it in accordingly.
|
|
174
|
-
|
|
175
|
-
##### ViewModel
|
|
176
|
-
```ts
|
|
177
|
-
{
|
|
178
|
-
id: 'cost', name: 'Cost', field: 'cost',
|
|
179
|
-
groupTotalsFormatter: GroupTotalFormatters.sumTotalsDollar,
|
|
180
|
-
params: { groupFormatterPrefix: '<b>Total</b>: ', groupFormatterSuffix: ' USD' }
|
|
181
|
-
}
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
### Custom `groupTotalsFormatter`
|
|
185
|
-
You can also create a custom `groupTotalsFormatter` similarly to a Formatter, just a create a function that will return a string, for example:
|
|
186
|
-
|
|
187
|
-
##### ViewModel
|
|
188
|
-
```typescript
|
|
189
|
-
defineGrid() {
|
|
190
|
-
this.columnDefinitions = [
|
|
191
|
-
{
|
|
192
|
-
id: 'cost', name: 'Cost', field: 'cost',
|
|
193
|
-
groupTotalsFormatter: this.sumTotalsFormatter
|
|
194
|
-
}
|
|
195
|
-
];
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
sumTotalsFormatter(totals, columnDef) {
|
|
199
|
-
const val = totals.sum && totals.sum[columnDef.field];
|
|
200
|
-
if (val != null) {
|
|
201
|
-
return 'total: ' + ((Math.round(parseFloat(val) * 100) / 100));
|
|
202
|
-
}
|
|
203
|
-
return '';
|
|
204
|
-
}
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
### Set a Grouping
|
|
208
|
-
Once you have added a `groupTotalsFormatter` and defined which aggregate you want to use, you will want to create a grouping function. If we take again our example of a grid with multiple task and we want to group our task by duration and calculate the duration average and the cost total sum, we can write the following function
|
|
209
|
-
|
|
210
|
-
##### ViewModel
|
|
211
|
-
```ts
|
|
212
|
-
groupByDuration() {
|
|
213
|
-
this.dataviewObj.setGrouping({
|
|
214
|
-
getter: 'duration', // the column `field` to group by
|
|
215
|
-
formatter: (g) => {
|
|
216
|
-
// (required) what will be displayed on top of each group
|
|
217
|
-
return `Duration: ${g.value} <span style="color:green">(${g.count} items)</span>`;
|
|
218
|
-
},
|
|
219
|
-
comparer: (a, b) => {
|
|
220
|
-
// (optional) comparer is helpful to sort the grouped data
|
|
221
|
-
// code below will sort the grouped value in ascending order
|
|
222
|
-
return SortComparers.numeric(a.value, b.value, SortDirectionNumber.asc);
|
|
223
|
-
},
|
|
224
|
-
aggregators: [
|
|
225
|
-
// (optional), what aggregators (accumulator) to use and on which field to do so
|
|
226
|
-
new Aggregators.Avg('percentComplete'),
|
|
227
|
-
new Aggregators.Sum('cost')
|
|
228
|
-
],
|
|
229
|
-
aggregateCollapsed: false, // (optional), do we want our aggregator to be collapsed?
|
|
230
|
-
lazyTotalsCalculation: true // (optional), do we want to lazily calculate the totals? True is commonly used
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
### Clear Grouping / Collapse All / Expand All
|
|
236
|
-
To "Clear all Grouping", "Collapse all Groups" and "Expand all Groups", we can simply call the associated `DataView` function, like so:
|
|
237
|
-
|
|
238
|
-
##### ViewModel
|
|
239
|
-
```ts
|
|
240
|
-
clearGrouping() {
|
|
241
|
-
this.dataviewObj.setGrouping([]);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
collapseAllGroups() {
|
|
245
|
-
this.dataviewObj.collapseAllGroups();
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
expandAllGroups() {
|
|
249
|
-
this.dataviewObj.expandAllGroups();
|
|
250
|
-
}
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
### Styling (change icons)
|
|
254
|
-
The current icons are chevron (right/down), however if you wish to use +/- icons. You can simply update the SASS variables to use whichever SVG icon paths. The SASS variables you can change are
|
|
255
|
-
```css
|
|
256
|
-
$slick-icon-group-color: $primary-color;
|
|
257
|
-
$slick-icon-group-expanded-svg-path: "M19,19V5H5V19H19M19,3A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5C3,3.89 3.9,3 5,3H19M11,7H13V11H17V13H13V17H11V13H7V11H11V7Z";
|
|
258
|
-
$slick-icon-group-collapsed-svg-path: "M19,19V5H5V19H19M19,3A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5C3,3.89 3.9,3 5,3H19M17,11V13H7V11H17Z";
|
|
259
|
-
$slick-icon-group-font-size: 20px;
|
|
260
|
-
$slick-icon-group-font-weight: bold;
|
|
261
|
-
$slick-icon-group-margin-right: 2px;
|
|
262
|
-
|
|
263
|
-
/* Grouping Totals Formatter */
|
|
264
|
-
$slick-group-totals-formatter-color: gray;
|
|
265
|
-
$slick-group-totals-formatter-bgcolor: white;
|
|
266
|
-
$slick-group-totals-formatter-font-size: 14px;
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
For more info on SASS styling and variables, please read the [Wiki - SASS Styling](../styling/styling.md),
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
### Description
|
|
2
|
-
You can add Header and/or Footer to your grid by using `ng-template` within your `angular-slickgrid` component, it's as simple as that. Using these slots also has the advantage of being contained in the same container making them the same width as the grid container.
|
|
3
|
-
|
|
4
|
-
### Demo
|
|
5
|
-
|
|
6
|
-
[Demo](https://ghiscoding.github.io/Angular-Slickgrid/#/header-footer) / [Demo Component](https://github.com/ghiscoding/slickgrid-universal/blob/master/frameworks/angular-slickgrid/src/demos/examples/grid-header-footer.component.ts)
|
|
7
|
-
|
|
8
|
-
### Basic Usage
|
|
9
|
-
|
|
10
|
-
##### Component
|
|
11
|
-
|
|
12
|
-
```html
|
|
13
|
-
<angular-slickgrid gridId="grid1" [columns]="columnDefinitions" [options]="gridOptions" [dataset]="dataset">
|
|
14
|
-
<ng-template #slickgridHeader>
|
|
15
|
-
<h3>Grid with header and footer slot</h3>
|
|
16
|
-
</ng-template>
|
|
17
|
-
|
|
18
|
-
<ng-template #slickgridFooter>
|
|
19
|
-
<custom-footer></custom-footer>
|
|
20
|
-
</ng-template>
|
|
21
|
-
</angular-slickgrid>
|
|
22
|
-
```
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
## Description
|
|
2
|
-
|
|
3
|
-
Infinite scrolling allows the grid to lazy-load rows from the server (or locally) when reaching the scroll bottom (end) position.
|
|
4
|
-
In its simplest form, the more the user scrolls down, the more rows will get loaded and appended to the in-memory dataset.
|
|
5
|
-
|
|
6
|
-
### Demo
|
|
7
|
-
[JSON Data - Demo Page](https://ghiscoding.github.io/Angular-Slickgrid/#/infinite-json) / [Demo ViewModel](https://github.com/ghiscoding/slickgrid-universal/blob/master/frameworks/angular-slickgrid/src/demos/examples/grid-infinite-json.component.ts)
|
|
8
|
-
|
|
9
|
-
[OData Backend Service - Demo Page](https://ghiscoding.github.io/Angular-Slickgrid/#/infinite-odata) / [Demo ViewModel](https://github.com/ghiscoding/slickgrid-universal/blob/master/frameworks/angular-slickgrid/src/demos/examples/grid-infinite-odata.component.ts)
|
|
10
|
-
|
|
11
|
-
[GraphQL Backend Service - Demo Page](https://ghiscoding.github.io/Angular-Slickgrid/#/infinite-graphql) / [Demo ViewModel](https://github.com/ghiscoding/slickgrid-universal/blob/master/frameworks/angular-slickgrid/src/demos/examples/grid-infinite-graphql.component.ts)
|
|
12
|
-
|
|
13
|
-
> ![WARNING]
|
|
14
|
-
> Pagination Grid Preset (`presets.pagination`) is **not** supported with Infinite Scroll
|
|
15
|
-
|
|
16
|
-
## Infinite Scroll with JSON data
|
|
17
|
-
|
|
18
|
-
As describe above, when used with a local JSON dataset, it will add data to the in-memory dataset whenever we scroll to the bottom until we reach the end of the dataset (if ever).
|
|
19
|
-
|
|
20
|
-
#### Code Sample
|
|
21
|
-
When used with a local JSON dataset, the Infinite Scroll is a feature that must be implemented by yourself. You implement by subscribing to 1 main event (`onScroll`) and if you want to reset the data when Sorting then you'll also need to subscribe to the (`onSort`) event. So the idea is to have simple code in the `onScroll` event to detect when we reach the scroll end and then use the DataView `addItems()` to append data to the existing dataset (in-memory) and that's about it.
|
|
22
|
-
|
|
23
|
-
##### View
|
|
24
|
-
```html
|
|
25
|
-
<angular-slickgrid
|
|
26
|
-
gridId="grid2"
|
|
27
|
-
[columns]="columnDefinitions"
|
|
28
|
-
[options]="gridOptions"
|
|
29
|
-
[dataset]="dataset"
|
|
30
|
-
(onAngularGridCreated)="angularGridReady($event.detail)"
|
|
31
|
-
(onScroll)="handleOnScroll($event.$detail.args)"
|
|
32
|
-
(onSort)="handleOnSort()">
|
|
33
|
-
</angular-slickgrid>
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
```ts
|
|
37
|
-
export class Example implements OnInit {
|
|
38
|
-
scrollEndCalled = false;
|
|
39
|
-
|
|
40
|
-
// add onScroll listener which will detect when we reach the scroll end
|
|
41
|
-
// if so, then append items to the dataset
|
|
42
|
-
handleOnScroll(event) {
|
|
43
|
-
const args = event.detail?.args;
|
|
44
|
-
const viewportElm = args.grid.getViewportNode();
|
|
45
|
-
if (
|
|
46
|
-
['mousewheel', 'scroll'].includes(args.triggeredBy || '')
|
|
47
|
-
&& !this.scrollEndCalled
|
|
48
|
-
&& viewportElm.scrollTop > 0
|
|
49
|
-
&& Math.ceil(viewportElm.offsetHeight + args.scrollTop) >= args.scrollHeight
|
|
50
|
-
) {
|
|
51
|
-
// onScroll end reached, add more items
|
|
52
|
-
// for demo purposes, we'll mock next subset of data at last id index + 1
|
|
53
|
-
const startIdx = this.angularGrid.dataView?.getItemCount() || 0;
|
|
54
|
-
const newItems = this.loadData(startIdx, FETCH_SIZE);
|
|
55
|
-
this.angularGrid.dataView?.addItems(newItems);
|
|
56
|
-
this.scrollEndCalled = false; //
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// do we want to reset the dataset when Sorting?
|
|
61
|
-
// if answering Yes then use the code below
|
|
62
|
-
handleOnSort() {
|
|
63
|
-
if (this.shouldResetOnSort) {
|
|
64
|
-
const newData = this.loadData(0, FETCH_SIZE);
|
|
65
|
-
this.angularGrid.slickGrid?.scrollTo(0); // scroll back to top to avoid unwanted onScroll end triggered
|
|
66
|
-
this.angularGrid.dataView?.setItems(newData);
|
|
67
|
-
this.angularGrid.dataView?.reSort();
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## Infinite Scroll with Backend Services
|
|
76
|
-
|
|
77
|
-
As describe above, when used with the Backend Service API, it will add data to the in-memory dataset whenever we scroll to the bottom. However there is one thing to note that might surprise you which is that even if Pagination is hidden in the UI, but the fact is that behind the scene that is exactly what it uses (mainly the Pagination Service `.goToNextPage()` to fetch the next set of data).
|
|
78
|
-
|
|
79
|
-
#### Code Sample
|
|
80
|
-
We'll use the OData Backend Service to demo Infinite Scroll with a Backend Service, however the implementation is similar for any Backend Services. The main difference with the Infinite Scroll implementation is around the `onProcess` and the callback that we use within (which is the `getCustomerCallback` in our use case). This callback will receive a data object that include the `infiniteScrollBottomHit` boolean property, this prop will be `true` only on the 2nd and more passes which will help us make a distinction between the first page load and any other subset of data to append to our in-memory dataset. With this property in mind, we'll assign the entire dataset on 1st pass with `this.dataset = data.value` (when `infiniteScrollBottomHit: false`) but for any other passes, we'll want to use the DataView `addItems()` to append data to the existing dataset (in-memory) and that's about it.
|
|
81
|
-
|
|
82
|
-
##### View
|
|
83
|
-
```html
|
|
84
|
-
<angular-slickgrid
|
|
85
|
-
gridId="grid2"
|
|
86
|
-
[columns]="columnDefinitions"
|
|
87
|
-
[options]="gridOptions"
|
|
88
|
-
[dataset]="dataset"
|
|
89
|
-
(onAngularGridCreated)="angularGridReady($event.detail)">
|
|
90
|
-
</angular-slickgrid>
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
```ts
|
|
94
|
-
export class Example implements OnInit {
|
|
95
|
-
initializeGrid() {
|
|
96
|
-
this.columnDefinitions = [ /* ... */ ];
|
|
97
|
-
|
|
98
|
-
this.gridOptions = {
|
|
99
|
-
presets: {
|
|
100
|
-
// NOTE: pagination preset is NOT supported with infinite scroll
|
|
101
|
-
// filters: [{ columnId: 'gender', searchTerms: ['female'] }]
|
|
102
|
-
},
|
|
103
|
-
backendServiceApi: {
|
|
104
|
-
service: new GridOdataService(), // or any Backend Service
|
|
105
|
-
options: {
|
|
106
|
-
// enable infinite scroll via Boolean OR via { fetchSize: number }
|
|
107
|
-
infiniteScroll: { fetchSize: 30 }, // or use true, in that case it would use default size of 25
|
|
108
|
-
|
|
109
|
-
preProcess: () => {
|
|
110
|
-
this.displaySpinner(true);
|
|
111
|
-
},
|
|
112
|
-
process: (query) => this.getCustomerApiCall(query),
|
|
113
|
-
postProcess: (response) => {
|
|
114
|
-
this.displaySpinner(false);
|
|
115
|
-
this.getCustomerCallback(response);
|
|
116
|
-
},
|
|
117
|
-
// we could use local in-memory Filtering (please note that it only filters against what is currently loaded)
|
|
118
|
-
// that is when we want to avoid reloading the entire dataset every time
|
|
119
|
-
// useLocalFiltering: true,
|
|
120
|
-
} as OdataServiceApi,
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Web API call
|
|
125
|
-
getCustomerApiCall(odataQuery) {
|
|
126
|
-
return this.http.get(`/api/getCustomers?${odataQuery}`);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
getCustomerCallback(data: { '@odata.count': number; infiniteScrollBottomHit: boolean; metrics: Metrics; query: string; value: any[]; }) {
|
|
130
|
-
// totalItems property needs to be filled for pagination to work correctly
|
|
131
|
-
const totalItemCount: number = data['@odata.count'];
|
|
132
|
-
this.metrics.totalItemCount = totalItemCount;
|
|
133
|
-
|
|
134
|
-
// even if we're not showing pagination, it is still used behind the scene to fetch next set of data (next page basically)
|
|
135
|
-
// once pagination totalItems is filled, we can update the dataset
|
|
136
|
-
|
|
137
|
-
// infinite scroll has an extra data property to determine if we hit an infinite scroll and there's still more data (in that case we need append data)
|
|
138
|
-
// or if we're on first data fetching (no scroll bottom ever occured yet)
|
|
139
|
-
if (!data.infiniteScrollBottomHit) {
|
|
140
|
-
// initial load not scroll hit yet, full dataset assignment
|
|
141
|
-
this.angularGrid.slickGrid?.scrollTo(0); // scroll back to top to avoid unwanted onScroll end triggered
|
|
142
|
-
this.dataset = data.value;
|
|
143
|
-
this.metrics.itemCount = data.value.length;
|
|
144
|
-
} else {
|
|
145
|
-
// scroll hit, for better perf we can simply use the DataView directly for better perf (which is better compare to replacing the entire dataset)
|
|
146
|
-
this.angularGrid.dataView?.addItems(data.value);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
```
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
## Overview
|
|
2
|
-
|
|
3
|
-
The data is passed to the grid via the constructor and can also be accessed using the `setData(data)` and `getData()` methods. Data itself can be either an array-like object with a `length` property and an indexer (`data[index]`) or a custom data provider implementing the following interface:
|
|
4
|
-
|
|
5
|
-
* `getLength()` - returns the number of data items in the set
|
|
6
|
-
* `getItem(index)` - returns the item at a given index
|
|
7
|
-
* `getItemMetadata(index)` - returns the metadata for the item at a given index (optional)
|
|
8
|
-
|
|
9
|
-
## Item Metadata
|
|
10
|
-
|
|
11
|
-
`getItemMetadata` provides a powerful way of specifying additional information about a data item that let the grid customize the appearance and handling of a particular data item. The method should return `null` if the item requires no special handling, or an object in the following general format:
|
|
12
|
-
|
|
13
|
-
{
|
|
14
|
-
// properties describing metadata related to the item (i.e. grid row) itself
|
|
15
|
-
"<property>": value,
|
|
16
|
-
"<property>": value,
|
|
17
|
-
|
|
18
|
-
// properties describing metadata related to individual columns
|
|
19
|
-
"columns": {
|
|
20
|
-
"<column index>": {
|
|
21
|
-
// metadata indexed by column index
|
|
22
|
-
"<property>": value,
|
|
23
|
-
"<property>": value
|
|
24
|
-
},
|
|
25
|
-
|
|
26
|
-
"<column id>": {
|
|
27
|
-
// metadata indexed by column id
|
|
28
|
-
"<property>": value,
|
|
29
|
-
"<property>": value
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
### Row-level properties
|
|
35
|
-
|
|
36
|
-
* `cssClasses` (string) - One or more (space-separated) CSS classes to be added to the entire row.
|
|
37
|
-
* `focusable` (boolean) - Whether or not any cells in the row can be set as "active".
|
|
38
|
-
* `selectable` (boolean) - Whether or not a row or any cells in it can be selected.
|
|
39
|
-
|
|
40
|
-
### Column-level properties
|
|
41
|
-
|
|
42
|
-
* `focusable` (boolean) - Whether or not a cell can be set as "active".
|
|
43
|
-
* `selectable` (boolean) - Whether or not a cell can be selected.
|
|
44
|
-
* `formatter` (Function) - A custom cell formatter.
|
|
45
|
-
* `editor` (Function) - A custom cell editor.
|
|
46
|
-
* `colspan` (number|string) - Number of columns this cell will span. Can also contain "*" to indicate that the cell should span the rest of the row.
|
|
47
|
-
|
|
48
|
-
### Order of checks
|
|
49
|
-
|
|
50
|
-
When looking up a property, the grid checks in the following order:
|
|
51
|
-
|
|
52
|
-
1. Row-level item metadata.
|
|
53
|
-
2. Column-level item metadata by column id.
|
|
54
|
-
3. Column-level item metadata by column index.
|
|
55
|
-
4. Column definition.
|
|
56
|
-
5. Grid options.
|
|
57
|
-
5. Grid defaults.
|
|
58
|
-
|
|
59
|
-
## Examples
|
|
60
|
-
|
|
61
|
-
See [colspan example](https://ghiscoding.github.io/Angular-Slickgrid/#/colspan).
|