angular-slickgrid 8.14.0 → 9.0.0

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.
Files changed (419) hide show
  1. package/.gitbook.yaml +5 -0
  2. package/CHANGELOG.md +1691 -0
  3. package/CONTRIBUTING.md +17 -0
  4. package/README.md +13 -50
  5. package/angular.json +133 -0
  6. package/coverage/base.css +224 -0
  7. package/coverage/block-navigation.js +87 -0
  8. package/coverage/clover.xml +1620 -0
  9. package/coverage/coverage-final.json +9 -0
  10. package/coverage/favicon.png +0 -0
  11. package/coverage/index.html +176 -0
  12. package/coverage/library/components/angular-slickgrid.component.ts.html +5074 -0
  13. package/coverage/library/components/index.html +116 -0
  14. package/coverage/library/constants.ts.html +397 -0
  15. package/coverage/library/extensions/index.html +116 -0
  16. package/coverage/library/extensions/slickRowDetailView.ts.html +1261 -0
  17. package/coverage/library/index.html +116 -0
  18. package/coverage/library/modules/angular-slickgrid.module.ts.html +166 -0
  19. package/coverage/library/modules/index.html +116 -0
  20. package/coverage/library/services/angularUtil.service.ts.html +445 -0
  21. package/coverage/library/services/container.service.ts.html +163 -0
  22. package/coverage/library/services/index.html +161 -0
  23. package/coverage/library/services/translater.service.ts.html +199 -0
  24. package/coverage/library/services/utilities.ts.html +142 -0
  25. package/coverage/prettify.css +1 -0
  26. package/coverage/prettify.js +2 -0
  27. package/coverage/sort-arrow-sprite.png +0 -0
  28. package/coverage/sorter.js +196 -0
  29. package/dist/LICENSE +21 -0
  30. package/dist/README.md +142 -0
  31. package/{fesm2022 → dist/fesm2022}/angular-slickgrid.mjs +175 -198
  32. package/dist/fesm2022/angular-slickgrid.mjs.map +1 -0
  33. package/{i18n → dist/i18n}/en.json +2 -1
  34. package/{i18n → dist/i18n}/fr.json +2 -1
  35. package/{app/modules/angular-slickgrid → dist/library}/components/angular-slickgrid.component.d.ts +9 -9
  36. package/{app/modules/angular-slickgrid → dist/library}/extensions/slickRowDetailView.d.ts +4 -4
  37. package/{app/modules/angular-slickgrid → dist/library}/models/angularGridInstance.interface.d.ts +0 -2
  38. package/dist/library/models/index.d.ts +5 -0
  39. package/{app/modules/angular-slickgrid → dist/library}/models/rowDetailView.interface.d.ts +1 -1
  40. package/{app/modules/angular-slickgrid → dist/library}/modules/angular-slickgrid.module.d.ts +1 -1
  41. package/dist/public_api.d.ts +1 -0
  42. package/docs/README.md +5 -0
  43. package/docs/TOC.md +105 -0
  44. package/docs/backend-services/Custom-Backend-Service.md +50 -0
  45. package/docs/backend-services/GraphQL.md +276 -0
  46. package/docs/backend-services/OData.md +245 -0
  47. package/docs/backend-services/graphql/GraphQL-Filtering.md +156 -0
  48. package/docs/backend-services/graphql/GraphQL-JSON-Result.md +85 -0
  49. package/docs/backend-services/graphql/GraphQL-Pagination.md +77 -0
  50. package/docs/backend-services/graphql/GraphQL-Sorting.md +78 -0
  51. package/docs/column-functionalities/cell-menu.md +212 -0
  52. package/docs/column-functionalities/editors/autocomplete-editor.md +466 -0
  53. package/docs/column-functionalities/editors/date-editor-flatpickr.md +71 -0
  54. package/docs/column-functionalities/editors/date-editor-vanilla-calendar.md +91 -0
  55. package/docs/column-functionalities/editors/longtext-editor-textarea.md +80 -0
  56. package/docs/column-functionalities/editors/select-dropdown-editor.md +227 -0
  57. package/docs/column-functionalities/editors.md +604 -0
  58. package/docs/column-functionalities/filters/autocomplete-filter.md +183 -0
  59. package/docs/column-functionalities/filters/compound-filters.md +234 -0
  60. package/docs/column-functionalities/filters/custom-filter.md +117 -0
  61. package/docs/column-functionalities/filters/filter-intro.md +81 -0
  62. package/docs/column-functionalities/filters/input-filter.md +260 -0
  63. package/docs/column-functionalities/filters/range-filters.md +188 -0
  64. package/docs/column-functionalities/filters/select-filter.md +695 -0
  65. package/docs/column-functionalities/filters/single-search-filter.md +77 -0
  66. package/docs/column-functionalities/filters/styling-filled-filters.md +45 -0
  67. package/docs/column-functionalities/formatters.md +325 -0
  68. package/docs/column-functionalities/sorting.md +200 -0
  69. package/docs/developer-guides/csp-compliance.md +64 -0
  70. package/docs/events/Available-Events.md +223 -0
  71. package/docs/events/Grid-&-DataView-Events.md +211 -0
  72. package/docs/getting-started/quick-start.md +230 -0
  73. package/docs/getting-started/troubleshooting.md +80 -0
  74. package/docs/grid-functionalities/Column-Picker.md +22 -0
  75. package/docs/grid-functionalities/Composite-Editor-Modal.md +627 -0
  76. package/docs/grid-functionalities/Context-Menu.md +226 -0
  77. package/docs/grid-functionalities/Custom-Footer.md +80 -0
  78. package/docs/grid-functionalities/Custom-Tooltip-(plugin).md +258 -0
  79. package/docs/grid-functionalities/Export-to-Excel.md +457 -0
  80. package/docs/grid-functionalities/Export-to-Text-File.md +165 -0
  81. package/docs/grid-functionalities/FAQ.md +53 -0
  82. package/docs/grid-functionalities/Global-Options.md +29 -0
  83. package/docs/grid-functionalities/Grid-Auto-Resize.md +218 -0
  84. package/docs/grid-functionalities/Grid-Menu.md +134 -0
  85. package/docs/grid-functionalities/Grid-State-&-Preset.md +245 -0
  86. package/docs/grid-functionalities/Header-Menu-&-Header-Buttons.md +125 -0
  87. package/docs/grid-functionalities/Resize-by-Cell-Content.md +138 -0
  88. package/docs/grid-functionalities/Row-Selection.md +247 -0
  89. package/docs/grid-functionalities/Row-based-edit.md +71 -0
  90. package/docs/grid-functionalities/add-update-highlight.md +258 -0
  91. package/docs/grid-functionalities/column-row-spanning.md +74 -0
  92. package/docs/grid-functionalities/dynamic-item-metadata.md +124 -0
  93. package/docs/grid-functionalities/excel-copy-buffer.md +145 -0
  94. package/docs/grid-functionalities/frozen-columns-rows.md +164 -0
  95. package/docs/grid-functionalities/grouping-and-aggregators.md +269 -0
  96. package/docs/grid-functionalities/header-footer-slots.md +22 -0
  97. package/docs/grid-functionalities/infinite-scroll.md +150 -0
  98. package/docs/grid-functionalities/providing-grid-data.md +61 -0
  99. package/docs/grid-functionalities/row-detail.md +530 -0
  100. package/docs/grid-functionalities/tree-data-grid.md +391 -0
  101. package/docs/localization/Localization---Component-Sample.md +87 -0
  102. package/docs/localization/Localization-with-Custom-Locales.md +66 -0
  103. package/docs/localization/Localization-with-ngx-translate.md +148 -0
  104. package/docs/migrations/migration-to-2.x.md +304 -0
  105. package/docs/migrations/migration-to-3.x.md +295 -0
  106. package/docs/migrations/migration-to-4.x.md +83 -0
  107. package/docs/migrations/migration-to-5.x.md +160 -0
  108. package/docs/migrations/migration-to-6.x.md +128 -0
  109. package/docs/migrations/migration-to-7.x.md +294 -0
  110. package/docs/migrations/migration-to-8.x.md +316 -0
  111. package/docs/migrations/migration-to-9.x.md +219 -0
  112. package/docs/slick-grid-dataview-objects/slickgrid-dataview-objects.md +79 -0
  113. package/docs/styling/dark-mode.md +100 -0
  114. package/docs/styling/styling.md +250 -0
  115. package/docs/testing/testing-patterns.md +73 -0
  116. package/eslint.config.mjs +60 -0
  117. package/ng-package.json +10 -0
  118. package/package.json +24 -48
  119. package/src/assets/angular-logo.png +0 -0
  120. package/src/assets/angular-logo2.png +0 -0
  121. package/src/assets/data/collection_100_numbers.json +12 -0
  122. package/src/assets/data/collection_500_numbers.json +52 -0
  123. package/src/assets/data/countries.json +245 -0
  124. package/src/assets/data/country_names.json +245 -0
  125. package/src/assets/data/customers_100.json +102 -0
  126. package/src/assets/data/users.csv +5 -0
  127. package/src/assets/i18n/en.json +102 -0
  128. package/src/assets/i18n/fr.json +103 -0
  129. package/src/demos/app-routing.module.ts +108 -0
  130. package/src/demos/app.component.html +187 -0
  131. package/src/demos/app.component.scss +79 -0
  132. package/src/demos/app.component.ts +11 -0
  133. package/src/demos/app.module.ts +196 -0
  134. package/src/demos/environments/environment.dev.ts +3 -0
  135. package/src/demos/environments/environment.prod.ts +3 -0
  136. package/src/demos/environments/environment.ts +8 -0
  137. package/src/demos/examples/custom-angularComponentEditor.ts +187 -0
  138. package/src/demos/examples/custom-angularComponentFilter.ts +123 -0
  139. package/src/demos/examples/custom-buttonFormatter.component.ts +13 -0
  140. package/src/demos/examples/custom-inputEditor.ts +132 -0
  141. package/src/demos/examples/custom-inputFilter.ts +134 -0
  142. package/src/demos/examples/custom-titleFormatter.component.ts +9 -0
  143. package/src/demos/examples/data/collection_100_numbers.json +12 -0
  144. package/src/demos/examples/data/collection_500_numbers.json +52 -0
  145. package/src/demos/examples/data/countries.json +245 -0
  146. package/src/demos/examples/data/country_names.json +245 -0
  147. package/src/demos/examples/data/customers_100.json +102 -0
  148. package/src/demos/examples/data/users.csv +5 -0
  149. package/src/demos/examples/editor-ng-select.component.ts +38 -0
  150. package/src/demos/examples/example01.component.html +48 -0
  151. package/src/demos/examples/example01.component.ts +109 -0
  152. package/src/demos/examples/example02.component.html +45 -0
  153. package/src/demos/examples/example02.component.ts +218 -0
  154. package/src/demos/examples/example03.component.html +118 -0
  155. package/src/demos/examples/example03.component.ts +694 -0
  156. package/src/demos/examples/example04.component.html +87 -0
  157. package/src/demos/examples/example04.component.ts +326 -0
  158. package/src/demos/examples/example05.component.html +151 -0
  159. package/src/demos/examples/example05.component.ts +474 -0
  160. package/src/demos/examples/example06.component.html +163 -0
  161. package/src/demos/examples/example06.component.ts +446 -0
  162. package/src/demos/examples/example07.component.html +56 -0
  163. package/src/demos/examples/example07.component.scss +10 -0
  164. package/src/demos/examples/example07.component.ts +216 -0
  165. package/src/demos/examples/example08.component.html +51 -0
  166. package/src/demos/examples/example08.component.scss +23 -0
  167. package/src/demos/examples/example08.component.ts +195 -0
  168. package/src/demos/examples/example09.component.html +55 -0
  169. package/src/demos/examples/example09.component.scss +22 -0
  170. package/src/demos/examples/example09.component.ts +302 -0
  171. package/src/demos/examples/example10.component.html +103 -0
  172. package/src/demos/examples/example10.component.ts +309 -0
  173. package/src/demos/examples/example11.component.html +91 -0
  174. package/src/demos/examples/example11.component.ts +276 -0
  175. package/src/demos/examples/example12.component.html +98 -0
  176. package/src/demos/examples/example12.component.ts +317 -0
  177. package/src/demos/examples/example13.component.html +96 -0
  178. package/src/demos/examples/example13.component.ts +370 -0
  179. package/src/demos/examples/example14.component.html +50 -0
  180. package/src/demos/examples/example14.component.scss +11 -0
  181. package/src/demos/examples/example14.component.ts +156 -0
  182. package/src/demos/examples/example15.component.html +56 -0
  183. package/src/demos/examples/example15.component.ts +304 -0
  184. package/src/demos/examples/example16.component.html +77 -0
  185. package/src/demos/examples/example16.component.ts +277 -0
  186. package/src/demos/examples/example17.component.html +50 -0
  187. package/src/demos/examples/example17.component.ts +109 -0
  188. package/src/demos/examples/example18.component.html +132 -0
  189. package/src/demos/examples/example18.component.ts +445 -0
  190. package/src/demos/examples/example19-rowdetail.component.html +40 -0
  191. package/src/demos/examples/example19-rowdetail.component.ts +54 -0
  192. package/src/demos/examples/example19.component.html +79 -0
  193. package/src/demos/examples/example19.component.ts +316 -0
  194. package/src/demos/examples/example20.component.html +76 -0
  195. package/src/demos/examples/example20.component.scss +11 -0
  196. package/src/demos/examples/example20.component.ts +341 -0
  197. package/src/demos/examples/example21.component.html +86 -0
  198. package/src/demos/examples/example21.component.scss +16 -0
  199. package/src/demos/examples/example21.component.ts +140 -0
  200. package/src/demos/examples/example22.component.html +41 -0
  201. package/src/demos/examples/example22.component.ts +117 -0
  202. package/src/demos/examples/example23.component.html +111 -0
  203. package/src/demos/examples/example23.component.ts +323 -0
  204. package/src/demos/examples/example24.component.html +120 -0
  205. package/src/demos/examples/example24.component.scss +62 -0
  206. package/src/demos/examples/example24.component.ts +641 -0
  207. package/src/demos/examples/example25.component.html +60 -0
  208. package/src/demos/examples/example25.component.scss +8 -0
  209. package/src/demos/examples/example25.component.ts +255 -0
  210. package/src/demos/examples/example26.component.html +98 -0
  211. package/src/demos/examples/example26.component.scss +42 -0
  212. package/src/demos/examples/example26.component.ts +383 -0
  213. package/src/demos/examples/example27.component.html +138 -0
  214. package/src/demos/examples/example27.component.scss +10 -0
  215. package/src/demos/examples/example27.component.ts +369 -0
  216. package/src/demos/examples/example28.component.html +143 -0
  217. package/src/demos/examples/example28.component.scss +54 -0
  218. package/src/demos/examples/example28.component.ts +453 -0
  219. package/src/demos/examples/example29.component.html +30 -0
  220. package/src/demos/examples/example29.component.ts +70 -0
  221. package/src/demos/examples/example30.component.html +116 -0
  222. package/src/demos/examples/example30.component.scss +20 -0
  223. package/src/demos/examples/example30.component.ts +1070 -0
  224. package/src/demos/examples/example32.component.html +77 -0
  225. package/src/demos/examples/example32.component.scss +8 -0
  226. package/src/demos/examples/example32.component.ts +905 -0
  227. package/src/demos/examples/example33.component.html +50 -0
  228. package/src/demos/examples/example33.component.scss +46 -0
  229. package/src/demos/examples/example33.component.ts +571 -0
  230. package/src/demos/examples/example34.component.html +82 -0
  231. package/src/demos/examples/example34.component.scss +77 -0
  232. package/src/demos/examples/example34.component.ts +434 -0
  233. package/src/demos/examples/example35.component.html +77 -0
  234. package/src/demos/examples/example35.component.scss +18 -0
  235. package/src/demos/examples/example35.component.ts +264 -0
  236. package/src/demos/examples/example36.component.html +56 -0
  237. package/src/demos/examples/example36.component.scss +26 -0
  238. package/src/demos/examples/example36.component.ts +504 -0
  239. package/src/demos/examples/example37.component.html +30 -0
  240. package/src/demos/examples/example37.component.ts +123 -0
  241. package/src/demos/examples/example38.component.html +104 -0
  242. package/src/demos/examples/example38.component.scss +8 -0
  243. package/src/demos/examples/example38.component.ts +420 -0
  244. package/src/demos/examples/example39.component.html +112 -0
  245. package/src/demos/examples/example39.component.scss +8 -0
  246. package/src/demos/examples/example39.component.ts +371 -0
  247. package/src/demos/examples/example40.component.html +76 -0
  248. package/src/demos/examples/example40.component.ts +226 -0
  249. package/src/demos/examples/example41.component.html +50 -0
  250. package/src/demos/examples/example41.component.scss +42 -0
  251. package/src/demos/examples/example41.component.ts +229 -0
  252. package/src/demos/examples/example42.component.html +47 -0
  253. package/src/demos/examples/example42.component.ts +203 -0
  254. package/src/demos/examples/example43.component.html +94 -0
  255. package/src/demos/examples/example43.component.scss +30 -0
  256. package/src/demos/examples/example43.component.ts +449 -0
  257. package/src/demos/examples/example44.component.html +78 -0
  258. package/src/demos/examples/example44.component.scss +50 -0
  259. package/src/demos/examples/example44.component.ts +375 -0
  260. package/src/demos/examples/example45-detail.component.html +15 -0
  261. package/src/demos/examples/example45-detail.component.ts +97 -0
  262. package/src/demos/examples/example45.component.html +110 -0
  263. package/src/demos/examples/example45.component.scss +50 -0
  264. package/src/demos/examples/example45.component.ts +243 -0
  265. package/src/demos/examples/filter-ng-select.component.ts +33 -0
  266. package/src/demos/examples/grid-custom-pager.component.html +60 -0
  267. package/src/demos/examples/grid-custom-pager.component.scss +57 -0
  268. package/src/demos/examples/grid-custom-pager.component.ts +107 -0
  269. package/src/demos/examples/grid-remote.component.html +44 -0
  270. package/src/demos/examples/grid-remote.component.ts +164 -0
  271. package/src/demos/examples/home.component.html +39 -0
  272. package/src/demos/examples/home.component.ts +10 -0
  273. package/src/demos/examples/jsonp.ts +89 -0
  274. package/src/demos/examples/rowdetail-preload.component.ts +10 -0
  275. package/src/demos/examples/swt-common-grid-pagination.component.ts +160 -0
  276. package/src/demos/examples/swt-common-grid-test.component.html +37 -0
  277. package/src/demos/examples/swt-common-grid-test.component.ts +214 -0
  278. package/src/demos/examples/swt-common-grid.component.ts +436 -0
  279. package/src/demos/examples/swt-logger.service.ts +173 -0
  280. package/src/demos/examples/utilities.ts +9 -0
  281. package/src/favicon.ico +0 -0
  282. package/src/index.html +17 -0
  283. package/src/library/components/__tests__/angular-slickgrid.component.spec.ts +2638 -0
  284. package/src/library/components/angular-slickgrid.component.html +5 -0
  285. package/src/library/components/angular-slickgrid.component.ts +1662 -0
  286. package/src/library/constants.ts +105 -0
  287. package/src/library/extensions/__tests__/slickRowDetailView.spec.ts +751 -0
  288. package/src/library/extensions/index.ts +1 -0
  289. package/src/library/extensions/slickRowDetailView.ts +395 -0
  290. package/src/library/global-grid-options.ts +273 -0
  291. package/src/library/index.ts +11 -0
  292. package/src/library/models/angularComponentOutput.interface.ts +6 -0
  293. package/src/library/models/angularGridInstance.interface.ts +76 -0
  294. package/src/library/models/externalTestingDependencies.interface.ts +37 -0
  295. package/src/library/models/gridOption.interface.ts +15 -0
  296. package/src/library/models/index.ts +5 -0
  297. package/src/library/models/rowDetailView.interface.ts +16 -0
  298. package/src/library/modules/angular-slickgrid.module.spec.ts +25 -0
  299. package/src/library/modules/angular-slickgrid.module.ts +27 -0
  300. package/src/library/services/__tests__/angularUtilService.spec.ts +156 -0
  301. package/src/library/services/__tests__/container.service.spec.ts +25 -0
  302. package/src/library/services/__tests__/translater.service.spec.ts +43 -0
  303. package/src/library/services/__tests__/utilities.spec.ts +22 -0
  304. package/src/library/services/angularUtil.service.ts +120 -0
  305. package/src/library/services/container.service.ts +26 -0
  306. package/src/library/services/index.ts +4 -0
  307. package/src/library/services/translater.service.ts +38 -0
  308. package/src/library/services/utilities.ts +19 -0
  309. package/src/library/slickgrid-config.ts +10 -0
  310. package/src/main.ts +13 -0
  311. package/src/public_api.ts +1 -0
  312. package/src/styles.scss +178 -0
  313. package/test/cypress/e2e/example01.cy.ts +367 -0
  314. package/test/cypress/e2e/example02.cy.ts +60 -0
  315. package/test/cypress/e2e/example03.cy.ts +268 -0
  316. package/test/cypress/e2e/example04.cy.ts +254 -0
  317. package/test/cypress/e2e/example05.cy.ts +804 -0
  318. package/test/cypress/e2e/example06.cy.ts +890 -0
  319. package/test/cypress/e2e/example07.cy.ts +384 -0
  320. package/test/cypress/e2e/example08.cy.ts +190 -0
  321. package/test/cypress/e2e/example09.cy.ts +392 -0
  322. package/test/cypress/e2e/example10.cy.ts +650 -0
  323. package/test/cypress/e2e/example11.cy.ts +86 -0
  324. package/test/cypress/e2e/example12.cy.ts +269 -0
  325. package/test/cypress/e2e/example13.cy.ts +246 -0
  326. package/test/cypress/e2e/example14.cy.ts +122 -0
  327. package/test/cypress/e2e/example15.cy.ts +598 -0
  328. package/test/cypress/e2e/example16.cy.ts +427 -0
  329. package/test/cypress/e2e/example17.cy.ts +83 -0
  330. package/test/cypress/e2e/example18.cy.ts +431 -0
  331. package/test/cypress/e2e/example19.cy.ts +263 -0
  332. package/test/cypress/e2e/example20.cy.ts +264 -0
  333. package/test/cypress/e2e/example21.cy.ts +77 -0
  334. package/test/cypress/e2e/example22.cy.ts +94 -0
  335. package/test/cypress/e2e/example23.cy.ts +259 -0
  336. package/test/cypress/e2e/example24.cy.ts +707 -0
  337. package/test/cypress/e2e/example25.cy.ts +193 -0
  338. package/test/cypress/e2e/example26.cy.ts +111 -0
  339. package/test/cypress/e2e/example27.cy.ts +261 -0
  340. package/test/cypress/e2e/example28.cy.ts +740 -0
  341. package/test/cypress/e2e/example29.cy.ts +30 -0
  342. package/test/cypress/e2e/example30.cy.ts +757 -0
  343. package/test/cypress/e2e/example31.cy.ts +69 -0
  344. package/test/cypress/e2e/example32.cy.ts +272 -0
  345. package/test/cypress/e2e/example33.cy.ts +278 -0
  346. package/test/cypress/e2e/example34.cy.ts +84 -0
  347. package/test/cypress/e2e/example35.cy.ts +178 -0
  348. package/test/cypress/e2e/example36.cy.ts +219 -0
  349. package/test/cypress/e2e/example37.cy.ts +52 -0
  350. package/test/cypress/e2e/example38.cy.ts +160 -0
  351. package/test/cypress/e2e/example39.cy.ts +150 -0
  352. package/test/cypress/e2e/example40.cy.ts +126 -0
  353. package/test/cypress/e2e/example41.cy.ts +90 -0
  354. package/test/cypress/e2e/example42.cy.ts +82 -0
  355. package/test/cypress/e2e/example43.cy.ts +482 -0
  356. package/test/cypress/e2e/example44.cy.ts +458 -0
  357. package/test/cypress/e2e/example45.cy.ts +455 -0
  358. package/test/cypress/e2e/home.cy.ts +7 -0
  359. package/test/cypress/fixtures/example.json +5 -0
  360. package/test/cypress/plugins/index.ts +17 -0
  361. package/test/cypress/plugins/utilities.ts +28 -0
  362. package/test/cypress/support/commands.ts +88 -0
  363. package/test/cypress/support/common.ts +47 -0
  364. package/test/cypress/support/drag.ts +101 -0
  365. package/test/cypress/support/index.ts +20 -0
  366. package/test/cypress/tsconfig.json +9 -0
  367. package/test/cypress.config.ts +34 -0
  368. package/test/mockSlickEvent.ts +77 -0
  369. package/test/rxjsResourceStub.ts +69 -0
  370. package/test/test-setup.ts +6 -0
  371. package/test/translateServiceStub.ts +230 -0
  372. package/test/translaterServiceStub.ts +239 -0
  373. package/test/tsconfig.json +17 -0
  374. package/test/vitest-global-mocks.ts +41 -0
  375. package/test/vitest-global-setup.ts +3 -0
  376. package/test/vitest-pretest.ts +5 -0
  377. package/tsconfig.app.json +14 -0
  378. package/tsconfig.json +31 -0
  379. package/tsconfig.spec.json +11 -0
  380. package/types/sortablejs.d.ts +4 -0
  381. package/vite.config.mts +51 -0
  382. package/app/modules/angular-slickgrid/models/index.d.ts +0 -5
  383. package/esm2022/angular-slickgrid.mjs +0 -5
  384. package/esm2022/app/modules/angular-slickgrid/components/angular-slickgrid.component.mjs +0 -1407
  385. package/esm2022/app/modules/angular-slickgrid/constants.mjs +0 -96
  386. package/esm2022/app/modules/angular-slickgrid/extensions/index.mjs +0 -2
  387. package/esm2022/app/modules/angular-slickgrid/extensions/slickRowDetailView.mjs +0 -301
  388. package/esm2022/app/modules/angular-slickgrid/global-grid-options.mjs +0 -263
  389. package/esm2022/app/modules/angular-slickgrid/index.mjs +0 -8
  390. package/esm2022/app/modules/angular-slickgrid/models/angularComponentOutput.interface.mjs +0 -2
  391. package/esm2022/app/modules/angular-slickgrid/models/angularGridInstance.interface.mjs +0 -2
  392. package/esm2022/app/modules/angular-slickgrid/models/externalTestingDependencies.interface.mjs +0 -2
  393. package/esm2022/app/modules/angular-slickgrid/models/gridOption.interface.mjs +0 -2
  394. package/esm2022/app/modules/angular-slickgrid/models/index.mjs +0 -6
  395. package/esm2022/app/modules/angular-slickgrid/models/rowDetailView.interface.mjs +0 -2
  396. package/esm2022/app/modules/angular-slickgrid/modules/angular-slickgrid.module.mjs +0 -32
  397. package/esm2022/app/modules/angular-slickgrid/services/angularUtil.service.mjs +0 -88
  398. package/esm2022/app/modules/angular-slickgrid/services/container.service.mjs +0 -27
  399. package/esm2022/app/modules/angular-slickgrid/services/index.mjs +0 -5
  400. package/esm2022/app/modules/angular-slickgrid/services/translater.service.mjs +0 -45
  401. package/esm2022/app/modules/angular-slickgrid/services/utilities.mjs +0 -19
  402. package/esm2022/app/modules/angular-slickgrid/slickgrid-config.mjs +0 -8
  403. package/esm2022/public_api.mjs +0 -2
  404. package/fesm2022/angular-slickgrid.mjs.map +0 -1
  405. package/public_api.d.ts +0 -1
  406. /package/{index.d.ts → dist/index.d.ts} +0 -0
  407. /package/{app/modules/angular-slickgrid → dist/library}/constants.d.ts +0 -0
  408. /package/{app/modules/angular-slickgrid → dist/library}/extensions/index.d.ts +0 -0
  409. /package/{app/modules/angular-slickgrid → dist/library}/global-grid-options.d.ts +0 -0
  410. /package/{app/modules/angular-slickgrid → dist/library}/index.d.ts +0 -0
  411. /package/{app/modules/angular-slickgrid → dist/library}/models/angularComponentOutput.interface.d.ts +0 -0
  412. /package/{app/modules/angular-slickgrid → dist/library}/models/externalTestingDependencies.interface.d.ts +0 -0
  413. /package/{app/modules/angular-slickgrid → dist/library}/models/gridOption.interface.d.ts +0 -0
  414. /package/{app/modules/angular-slickgrid → dist/library}/services/angularUtil.service.d.ts +0 -0
  415. /package/{app/modules/angular-slickgrid → dist/library}/services/container.service.d.ts +0 -0
  416. /package/{app/modules/angular-slickgrid → dist/library}/services/index.d.ts +0 -0
  417. /package/{app/modules/angular-slickgrid → dist/library}/services/translater.service.d.ts +0 -0
  418. /package/{app/modules/angular-slickgrid → dist/library}/services/utilities.d.ts +0 -0
  419. /package/{app/modules/angular-slickgrid → dist/library}/slickgrid-config.d.ts +0 -0
@@ -0,0 +1,87 @@
1
+ <div id="demo-container" class="container-fluid">
2
+ <h2>
3
+ Example 4: Client Side Sort/Filter
4
+ <span class="float-end">
5
+ <a
6
+ style="font-size: 18px"
7
+ target="_blank"
8
+ href="https://github.com/ghiscoding/slickgrid-universal/blob/master/frameworks/angular-slickgrid/src/demos/examples/grid-clientside.component.ts"
9
+ >
10
+ <span class="mdi mdi-link-variant"></span> code
11
+ </a>
12
+ </span>
13
+ </h2>
14
+ <div class="subtitle">
15
+ Sort/Filter on client side only using SlickGrid DataView (<a
16
+ href="https://ghiscoding.gitbook.io/angular-slickgrid/column-functionalities/sorting"
17
+ target="_blank"
18
+ >Wiki docs</a
19
+ >)
20
+ <br />
21
+ <ul class="small">
22
+ <li>Support multi-sort (by default), hold "Shift" key and click on the next column to sort.</li>
23
+ <li>All column types support the following operators: (>, >=, <, <=, <>, !=, =, ==, *)</li>
24
+ <ul>
25
+ <li>Example: >100 ... >=2001-01-01 ... >02/28/17</li>
26
+ <li>
27
+ <b>Note:</b> For filters to work properly (default is string), make sure to provide a FieldType (type is against the dataset, not
28
+ the Formatter)
29
+ </li>
30
+ </ul>
31
+ <li>Date Filters</li>
32
+ <ul>
33
+ <li>
34
+ FieldType of dateUtc/date (from dataset) can use an extra option of "filterSearchType" to let user filter more easily. For
35
+ example, in the "UTC Date" field below, you can type "&gt;02/28/2017", also when dealing with UTC you have to take the time
36
+ difference in consideration.
37
+ </li>
38
+ </ul>
39
+ <li>On String filters, (*) can be used as startsWith (Hello* => matches "Hello Word") ... endsWith (*Doe => matches: "John Doe")</li>
40
+ <li>
41
+ Custom Filter are now possible, "Description" column below, is a customized InputFilter with different placeholder. See
42
+ <a href="https://ghiscoding.gitbook.io/angular-slickgrid/column-functionalities/custom-filter" target="_blank"
43
+ >Wiki - Custom Filter</a
44
+ >
45
+ </li>
46
+ <li>MultipleSelect & SingeSelect Filters can use a regular "collection" or "collectionAsync" to load it asynchronously</li>
47
+ </ul>
48
+ </div>
49
+
50
+ <br />
51
+ <span *ngIf="metrics" style="margin-right: 10px">
52
+ <b>Metrics:</b> {{ metrics.startTime | date: "yyyy-MM-dd hh:mm aaaaa'm'" }} | {{ metrics.itemCount }} of
53
+ {{ metrics.totalItemCount }} items
54
+ </span>
55
+ <div class="btn-group" role="group">
56
+ <button class="btn btn-sm btn-outline-secondary btn-icon" data-test="scroll-top-btn" (click)="scrollGridTop()">
57
+ <i class="mdi mdi-arrow-down mdi-rotate-180"></i>
58
+ </button>
59
+ <button class="btn btn-sm btn-outline-secondary btn-icon" data-test="scroll-bottom-btn" (click)="scrollGridBottom()">
60
+ <i class="mdi mdi-arrow-down"></i>
61
+ </button>
62
+ </div>
63
+ <button class="btn btn-outline-secondary btn-sm btn-icon" data-test="clear-filters" (click)="angularGrid.filterService.clearFilters()">
64
+ Clear Filters
65
+ </button>
66
+ <button class="btn btn-outline-secondary btn-sm btn-icon" data-test="clear-sorting" (click)="angularGrid.sortService.clearSorting()">
67
+ Clear Sorting
68
+ </button>
69
+ <button class="btn btn-outline-secondary btn-sm btn-icon" data-test="set-dynamic-filter" (click)="setFiltersDynamically()">
70
+ Set Filters Dynamically
71
+ </button>
72
+ <button class="btn btn-outline-secondary btn-sm btn-icon" data-test="set-dynamic-sorting" (click)="setSortingDynamically()">
73
+ Set Sorting Dynamically
74
+ </button>
75
+
76
+ <angular-slickgrid
77
+ gridId="grid4"
78
+ [columns]="columnDefinitions"
79
+ [options]="gridOptions"
80
+ [dataset]="dataset"
81
+ (onAngularGridCreated)="angularGridReady($event.detail)"
82
+ (onGridStateChanged)="gridStateChanged($event.detail)"
83
+ (onBeforeGridDestroy)="saveCurrentGridState()"
84
+ (onRowCountChanged)="refreshMetrics($event.detail.eventData, $event.detail.args)"
85
+ >
86
+ </angular-slickgrid>
87
+ </div>
@@ -0,0 +1,326 @@
1
+ import { Component, OnInit } from '@angular/core';
2
+ import { HttpClient } from '@angular/common/http';
3
+ import { ExcelExportService } from '@slickgrid-universal/excel-export';
4
+ import { TranslateService } from '@ngx-translate/core';
5
+ import {
6
+ AngularGridInstance,
7
+ Column,
8
+ Filters,
9
+ Formatters,
10
+ GridOption,
11
+ GridStateChange,
12
+ Metrics,
13
+ type MultipleSelectOption,
14
+ OperatorType,
15
+ type VanillaCalendarOption,
16
+ } from '../../library';
17
+ import { CustomInputFilter } from './custom-inputFilter';
18
+
19
+ function randomBetween(min: number, max: number) {
20
+ return Math.floor(Math.random() * (max - min + 1) + min);
21
+ }
22
+ const NB_ITEMS = 10500;
23
+ const URL_SAMPLE_COLLECTION_DATA = 'assets/data/collection_500_numbers.json';
24
+
25
+ @Component({
26
+ templateUrl: './example04.component.html',
27
+ standalone: false,
28
+ })
29
+ export class Example4Component implements OnInit {
30
+ angularGrid!: AngularGridInstance;
31
+ columnDefinitions: Column[] = [];
32
+ gridOptions!: GridOption;
33
+ dataset!: any[];
34
+ metrics!: Metrics;
35
+
36
+ constructor(
37
+ private http: HttpClient,
38
+ private translate: TranslateService
39
+ ) {}
40
+
41
+ ngOnInit(): void {
42
+ this.columnDefinitions = [
43
+ {
44
+ id: 'title',
45
+ name: 'Title',
46
+ field: 'title',
47
+ sortable: true,
48
+ minWidth: 55,
49
+ filterable: true,
50
+ filter: { model: Filters.compoundInputText },
51
+ },
52
+ {
53
+ id: 'description',
54
+ name: 'Description',
55
+ field: 'description',
56
+ filterable: true,
57
+ sortable: true,
58
+ minWidth: 80,
59
+ filter: {
60
+ model: CustomInputFilter, // create a new instance to make each Filter independent from each other
61
+ enableTrimWhiteSpace: true, // or use global "enableFilterTrimWhiteSpace" to trim on all Filters
62
+ },
63
+ },
64
+ {
65
+ id: 'duration',
66
+ name: 'Duration (days)',
67
+ field: 'duration',
68
+ sortable: true,
69
+ type: 'number',
70
+ exportCsvForceToKeepAsString: true,
71
+ minWidth: 55,
72
+ filterable: true,
73
+ filter: {
74
+ collectionAsync: this.http.get<{ option: string; value: string }[]>(URL_SAMPLE_COLLECTION_DATA),
75
+ // collectionFilterBy & collectionSortBy accept a single or multiple options
76
+ // we can exclude certains values 365 & 360 from the dropdown filter
77
+ collectionFilterBy: [
78
+ {
79
+ property: 'value',
80
+ operator: OperatorType.notEqual,
81
+ value: 360,
82
+ },
83
+ {
84
+ property: 'value',
85
+ operator: OperatorType.notEqual,
86
+ value: 365,
87
+ },
88
+ ],
89
+ collectionSortBy: {
90
+ property: 'value',
91
+ sortDesc: true,
92
+ fieldType: 'number',
93
+ },
94
+ customStructure: {
95
+ value: 'value',
96
+ label: 'label',
97
+ optionLabel: 'value', // if selected text is too long, we can use option labels instead
98
+ labelSuffix: 'text',
99
+ },
100
+ collectionOptions: {
101
+ separatorBetweenTextLabels: ' ',
102
+ filterResultAfterEachPass: 'chain', // options are "merge" or "chain" (defaults to "chain")
103
+ },
104
+ model: Filters.multipleSelect,
105
+
106
+ // we could add certain option(s) to the "multiple-select" plugin
107
+ options: {
108
+ maxHeight: 250,
109
+ width: 175,
110
+
111
+ // if we want to display shorter text as the selected text (on the select filter itself, parent element)
112
+ // we can use "useSelectOptionLabel" or "useSelectOptionLabelToHtml" the latter will parse html
113
+ useSelectOptionLabelToHtml: true,
114
+ } as MultipleSelectOption,
115
+ },
116
+ },
117
+ {
118
+ id: 'complete',
119
+ name: '% Complete',
120
+ field: 'percentComplete',
121
+ formatter: Formatters.percentCompleteBar,
122
+ minWidth: 70,
123
+ type: 'number',
124
+ sortable: true,
125
+ filterable: true,
126
+ filter: { model: Filters.compoundInputNumber },
127
+ },
128
+ {
129
+ id: 'start',
130
+ name: 'Start',
131
+ field: 'start',
132
+ formatter: Formatters.dateIso,
133
+ sortable: true,
134
+ minWidth: 75,
135
+ type: 'date',
136
+ filterable: true,
137
+ filter: { model: Filters.compoundDate },
138
+ },
139
+ {
140
+ id: 'usDateShort',
141
+ name: 'US Date Short',
142
+ field: 'usDateShort',
143
+ sortable: true,
144
+ minWidth: 70,
145
+ width: 70,
146
+ type: 'dateUsShort',
147
+ exportWithFormatter: true,
148
+ filterable: true,
149
+ filter: { model: Filters.compoundDate },
150
+ },
151
+ {
152
+ id: 'utcDate',
153
+ name: 'UTC Date',
154
+ field: 'utcDate',
155
+ formatter: Formatters.dateTimeIsoAmPm,
156
+ sortable: true,
157
+ minWidth: 115,
158
+ type: 'dateUtc',
159
+ exportWithFormatter: true,
160
+ outputType: 'dateTimeIsoAmPm',
161
+ filterable: true,
162
+ filter: {
163
+ model: Filters.compoundDate,
164
+ // override any of the date picker options through "options"
165
+ options: { displayDateMin: 'today' } as VanillaCalendarOption,
166
+ },
167
+ },
168
+ {
169
+ id: 'effort-driven',
170
+ name: 'Effort Driven',
171
+ field: 'effortDriven.isEffort',
172
+ minWidth: 85,
173
+ maxWidth: 85,
174
+ type: 'boolean',
175
+ sortable: true,
176
+ exportCustomFormatter: Formatters.complexObject,
177
+
178
+ // to pass multiple formatters, use the params property
179
+ // also these formatters are executed in sequence, so if you want the checkmark to work correctly, it has to be the last formatter defined
180
+ formatter: Formatters.multiple,
181
+ params: { formatters: [Formatters.complexObject, Formatters.checkmarkMaterial] },
182
+
183
+ // when the "field" string includes the dot "." notation, the library will consider this to be a complex object and Filter accordingly
184
+ filterable: true,
185
+ filter: {
186
+ // We can also add HTML text to be rendered (any bad script will be sanitized) but we have to opt-in, else it will be sanitized
187
+ // enableRenderHtml: true,
188
+ // collection: [{ value: '', label: '' }, { value: true, label: 'True', labelPrefix: `<i class="mdi mdi-check"></i> ` }, { value: false, label: 'False' }],
189
+
190
+ collection: [
191
+ { isEffort: '', label: '' },
192
+ { isEffort: true, label: 'True' },
193
+ { isEffort: false, label: 'False' },
194
+ ],
195
+ customStructure: {
196
+ value: 'isEffort',
197
+ label: 'label',
198
+ },
199
+ model: Filters.singleSelect,
200
+
201
+ // we could add certain option(s) to the "multiple-select" plugin
202
+ options: { autoAdjustDropHeight: true } as MultipleSelectOption,
203
+ },
204
+ },
205
+ ];
206
+
207
+ this.gridOptions = {
208
+ autoResize: {
209
+ container: '#demo-container',
210
+ rightPadding: 10,
211
+ },
212
+ enableExcelExport: true,
213
+ enableExcelCopyBuffer: true,
214
+ enableFiltering: true,
215
+ // enableFilterTrimWhiteSpace: true,
216
+ i18n: this.translate,
217
+ showCustomFooter: true, // display some metrics in the bottom custom footer
218
+
219
+ // use columnDef searchTerms OR use presets as shown below
220
+ presets: {
221
+ filters: [
222
+ { columnId: 'duration', searchTerms: [10, 98] },
223
+ // { columnId: 'complete', searchTerms: ['5'], operator: '>' },
224
+ { columnId: 'usDateShort', operator: '<', searchTerms: ['4/20/25'] },
225
+ // { columnId: 'effort-driven', searchTerms: [true] },
226
+ ],
227
+ sorters: [
228
+ { columnId: 'duration', direction: 'DESC' },
229
+ { columnId: 'complete', direction: 'ASC' },
230
+ ],
231
+ },
232
+ externalResources: [new ExcelExportService()],
233
+ };
234
+
235
+ // mock a dataset
236
+ this.dataset = this.mockData(NB_ITEMS);
237
+ }
238
+
239
+ angularGridReady(angularGrid: AngularGridInstance) {
240
+ this.angularGrid = angularGrid;
241
+ }
242
+
243
+ mockData(itemCount: number, startingIndex = 0): any[] {
244
+ // mock a dataset
245
+ const tempDataset = [];
246
+ for (let i = startingIndex; i < startingIndex + itemCount; i++) {
247
+ const randomDuration = Math.round(Math.random() * 100);
248
+ const randomYear = randomBetween(2000, 2035);
249
+ const randomYearShort = randomBetween(10, 35);
250
+ const randomMonth = randomBetween(1, 12);
251
+ const randomMonthStr = randomMonth < 10 ? `0${randomMonth}` : randomMonth;
252
+ const randomDay = randomBetween(10, 28);
253
+ const randomPercent = randomBetween(0, 100);
254
+ const randomHour = randomBetween(10, 23);
255
+ const randomTime = randomBetween(10, 59);
256
+ const randomMilliseconds = `${randomBetween(1, 9)}${randomBetween(10, 99)}`;
257
+ const randomIsEffort = i % 3 === 0;
258
+
259
+ tempDataset.push({
260
+ id: i,
261
+ title: 'Task ' + i,
262
+ description: i % 5 ? 'desc ' + i : null, // also add some random to test NULL field
263
+ duration: randomDuration,
264
+ percentComplete: randomPercent,
265
+ percentCompleteNumber: randomPercent,
266
+ start: i % 4 ? null : new Date(randomYear, randomMonth, randomDay), // provide a Date format
267
+ usDateShort: `${randomMonth}/${randomDay}/${randomYearShort}`, // provide a date US Short in the dataset
268
+ utcDate: `${randomYear}-${randomMonthStr}-${randomDay}T${randomHour}:${randomTime}:${randomTime}.${randomMilliseconds}Z`,
269
+ effortDriven: {
270
+ isEffort: randomIsEffort,
271
+ label: randomIsEffort ? 'Effort' : 'NoEffort',
272
+ },
273
+ });
274
+ }
275
+ return tempDataset;
276
+ }
277
+
278
+ /** Dispatched event of a Grid State Changed event */
279
+ gridStateChanged(gridState: GridStateChange) {
280
+ console.log('Client sample, Grid State changed:: ', gridState.change);
281
+ }
282
+
283
+ /** Save current Filters, Sorters in LocaleStorage or DB */
284
+ saveCurrentGridState() {
285
+ console.log('Client sample, last Grid State:: ', this.angularGrid.gridStateService.getCurrentGridState());
286
+ }
287
+
288
+ setFiltersDynamically() {
289
+ // we can Set Filters Dynamically (or different filters) afterward through the FilterService
290
+ this.angularGrid.filterService.updateFilters([
291
+ { columnId: 'duration', searchTerms: [2, 25, 48, 50] },
292
+ { columnId: 'complete', searchTerms: [95], operator: '<' },
293
+ { columnId: 'effort-driven', searchTerms: [true] },
294
+ { columnId: 'start', operator: '>=', searchTerms: ['2001-02-28'] },
295
+ ]);
296
+ }
297
+
298
+ setSortingDynamically() {
299
+ this.angularGrid.sortService.updateSorting([
300
+ // orders matter, whichever is first in array will be the first sorted column
301
+ { columnId: 'duration', direction: 'ASC' },
302
+ { columnId: 'start', direction: 'DESC' },
303
+ ]);
304
+ }
305
+
306
+ refreshMetrics(e: Event, args: any) {
307
+ if (args && args.current >= 0) {
308
+ setTimeout(() => {
309
+ this.metrics = {
310
+ startTime: new Date(),
311
+ endTime: new Date(),
312
+ itemCount: (args && args.current) || 0,
313
+ totalItemCount: this.dataset.length || 0,
314
+ };
315
+ });
316
+ }
317
+ }
318
+
319
+ scrollGridBottom() {
320
+ this.angularGrid.slickGrid.navigateBottom();
321
+ }
322
+
323
+ scrollGridTop() {
324
+ this.angularGrid.slickGrid.navigateTop();
325
+ }
326
+ }
@@ -0,0 +1,151 @@
1
+ <div id="demo-container" class="container-fluid">
2
+ <h2>
3
+ Example 5: Grid connected to Backend Server with OData
4
+ <span class="float-end">
5
+ <a
6
+ style="font-size: 18px"
7
+ target="_blank"
8
+ href="https://github.com/ghiscoding/slickgrid-universal/blob/master/frameworks/angular-slickgrid/src/demos/examples/grid-odata.component.ts"
9
+ >
10
+ <span class="mdi mdi-link-variant"></span> code
11
+ </a>
12
+ </span>
13
+ </h2>
14
+ <div class="row">
15
+ <div class="col-sm-9">
16
+ <div class="subtitle">
17
+ Sorting/Paging connected to a Backend OData Service (<a
18
+ href="https://ghiscoding.gitbook.io/angular-slickgrid/backend-services/odata"
19
+ target="_blank"
20
+ >Docs</a
21
+ >).
22
+ <br />
23
+ <ul class="small">
24
+ <li>Only "Name" field is sortable for the demo (because we use JSON files), however "multiColumnSort: true" is also supported</li>
25
+ <li>This example also demos the Grid State feature, open the console log to see the changes</li>
26
+ <li>String column also support operator (>, >=, <, <=, <>, !=, =, ==, *)</li>
27
+ <ul>
28
+ <li>The (*) can be used as startsWith (ex.: "abc*" => startsWith "abc") / endsWith (ex.: "*xyz" => endsWith "xyz")</li>
29
+ <li>The other operators can be used on column type number for example: ">=100" (bigger or equal than 100)</li>
30
+ </ul>
31
+ <li>OData Service could be replaced by other Service type in the future (GraphQL or whichever you provide)</li>
32
+ <li>
33
+ You can also preload a grid with certain "presets" like Filters / Sorters / Pagination
34
+ <a href="https://ghiscoding.gitbook.io/angular-slickgrid/grid-functionalities/grid-state-and-preset" target="_blank"
35
+ >Docs - Grid Preset</a
36
+ >
37
+ </li>
38
+ <li>
39
+ <span class="text-danger">NOTE:</span> For demo purposes, the last column (filter & sort) will always throw an error and its
40
+ only purpose is to demo what would happen when you encounter a backend server error (the UI should rollback to previous state
41
+ before you did the action). Also changing Page Size to 50,000 will also throw which again is for demo purposes.
42
+ </li>
43
+ </ul>
44
+ </div>
45
+ </div>
46
+ <div class="col-sm-3">
47
+ <div class="alert alert-danger" *ngIf="errorStatus" data-test="error-status">
48
+ <em><strong>Backend Error:</strong> <span [innerHTML]="errorStatus"></span></em>
49
+ </div>
50
+ </div>
51
+ </div>
52
+
53
+ <div class="row">
54
+ <div class="col-sm-2">
55
+ <div [class]="status.class" role="alert" data-test="status">
56
+ <strong>Status: </strong> {{ status.text }}
57
+ <span [hidden]="!processing">
58
+ <i class="mdi mdi-sync mdi-spin-1s"></i>
59
+ </span>
60
+ </div>
61
+ </div>
62
+ <div class="col-sm-10">
63
+ <div class="alert alert-info" data-test="alert-odata-query">
64
+ <strong>OData Query:</strong> <span data-test="odata-query-result">{{ odataQuery }}</span>
65
+ </div>
66
+ </div>
67
+ </div>
68
+
69
+ <div class="row">
70
+ <div class="col-sm-4">
71
+ <button class="btn btn-outline-secondary btn-sm btn-icon" data-test="set-dynamic-filter" (click)="setFiltersDynamically()">
72
+ Set Filters Dynamically
73
+ </button>
74
+ <button class="btn btn-outline-secondary btn-sm btn-icon" data-test="set-dynamic-sorting" (click)="setSortingDynamically()">
75
+ Set Sorting Dynamically
76
+ </button>
77
+ <br />
78
+ <span *ngIf="metrics">
79
+ <b>Metrics:</b> {{ metrics.endTime | date: "yyyy-MM-dd hh:mm aaaaa'm'" }} | {{ metrics.executionTime }}ms |
80
+ {{ metrics.totalItemCount }} items
81
+ </span>
82
+ </div>
83
+
84
+ <div class="col-sm-8">
85
+ <label>OData Version: </label>
86
+ <span data-test="radioVersion">
87
+ <label class="radio-inline control-label" for="radio2">
88
+ <input
89
+ type="radio"
90
+ name="inlineRadioOptions"
91
+ data-test="version2"
92
+ id="radio2"
93
+ checked
94
+ [value]="2"
95
+ (change)="setOdataVersion(2)"
96
+ />
97
+ 2
98
+ </label>
99
+ <label class="radio-inline control-label" for="radio4">
100
+ <input type="radio" name="inlineRadioOptions" data-test="version4" id="radio4" [value]="4" (change)="setOdataVersion(4)" /> 4
101
+ </label>
102
+ </span>
103
+ <label class="checkbox-inline control-label" for="enableCount" style="margin-left: 20px">
104
+ <input type="checkbox" id="enableCount" data-test="enable-count" [checked]="isCountEnabled" (click)="changeCountEnableFlag()" />
105
+ <span style="font-weight: bold">Enable Count</span> (add to OData query)
106
+ </label>
107
+ <label class="checkbox-inline control-label" for="enableSelect" style="margin-left: 20px">
108
+ <input type="checkbox" id="enableSelect" data-test="enable-select" [checked]="isSelectEnabled" (click)="changeEnableSelectFlag()" />
109
+ <span style="font-weight: bold">Enable Select</span> (add to OData query)
110
+ </label>
111
+ <label class="checkbox-inline control-label" for="enableExpand" style="margin-left: 20px">
112
+ <input type="checkbox" id="enableExpand" data-test="enable-expand" [checked]="isExpandEnabled" (click)="changeEnableExpandFlag()" />
113
+ <span style="font-weight: bold">Enable Expand</span> (add to OData query)
114
+ </label>
115
+ </div>
116
+ </div>
117
+ <div class="row mt-2 mb-1">
118
+ <div class="col-md-12">
119
+ <button class="btn btn-outline-danger btn-sm btn-icon" data-test="throw-page-error-btn" (click)="throwPageChangeError()">
120
+ <span>Throw Error Going to Last Page... </span>
121
+ <i class="mdi mdi-page-last"></i>
122
+ </button>
123
+
124
+ <span class="ms-2">
125
+ <label>Programmatically go to first/last page:</label>
126
+ <div class="btn-group" role="group">
127
+ <button class="btn btn-outline-secondary btn-xs btn-icon px-2" data-test="goto-first-page" (click)="goToFirstPage()">
128
+ <i class="mdi mdi-page-first"></i>
129
+ </button>
130
+ <button class="btn btn-outline-secondary btn-xs btn-icon px-2" data-test="goto-last-page" (click)="goToLastPage()">
131
+ <i class="mdi mdi-page-last"></i>
132
+ </button>
133
+ </div>
134
+ </span>
135
+ </div>
136
+ </div>
137
+
138
+ <angular-slickgrid
139
+ gridId="grid5"
140
+ [columns]="columnDefinitions"
141
+ [options]="gridOptions"
142
+ [paginationOptions]="paginationOptions"
143
+ [dataset]="dataset"
144
+ (onAngularGridCreated)="angularGridReady($event.detail)"
145
+ (onGridStateChanged)="gridStateChanged($event.detail)"
146
+ (onBeforeSort)="handleOnBeforeSort($event)"
147
+ (onBeforeSearchChange)="handleOnBeforeSearchChange($event)"
148
+ (onBeforePaginationChange)="handleOnBeforePaginationChange($event)"
149
+ >
150
+ </angular-slickgrid>
151
+ </div>