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,804 @@
1
+ describe('Example 5 - OData Grid', () => {
2
+ const GRID_ROW_HEIGHT = 35;
3
+ beforeEach(() => {
4
+ // create a console.log spy for later use
5
+ cy.window().then((win) => {
6
+ cy.spy(win.console, 'log');
7
+ });
8
+ });
9
+
10
+ it('should display Example title', () => {
11
+ cy.visit(`${Cypress.config('baseUrl')}/example05`);
12
+ cy.get('h2').should('contain', 'Example 5: Grid connected to Backend Server with OData');
13
+ });
14
+
15
+ describe('when "enableCount" is set', () => {
16
+ it('should have default OData query', () => {
17
+ cy.get('[data-test=alert-odata-query]').should('exist');
18
+ cy.get('[data-test=alert-odata-query]').should('contain', 'OData Query');
19
+
20
+ // wait for the query to finish
21
+ cy.get('[data-test=status]').should('contain', 'finished');
22
+
23
+ cy.get('[data-test=odata-query-result]').should(($span) => {
24
+ expect($span.text()).to.eq(`$inlinecount=allpages&$top=20&$skip=20&$orderby=Name asc&$filter=(Gender eq 'male')`);
25
+ });
26
+ });
27
+
28
+ it('should change Pagination to next page', () => {
29
+ cy.get('.icon-seek-next').click();
30
+
31
+ // wait for the query to finish
32
+ cy.get('[data-test=status]').should('contain', 'finished');
33
+
34
+ cy.get('[data-test=page-number-input]')
35
+ .invoke('val')
36
+ .then((pageNumber) => expect(pageNumber).to.eq('3'));
37
+
38
+ cy.get('[data-test=page-count]').contains('3');
39
+
40
+ cy.get('[data-test=item-from]').contains('41');
41
+
42
+ cy.get('[data-test=item-to]').contains('50');
43
+
44
+ cy.get('[data-test=total-items]').contains('50');
45
+
46
+ cy.get('[data-test=odata-query-result]').should(($span) => {
47
+ expect($span.text()).to.eq(`$inlinecount=allpages&$top=20&$skip=40&$orderby=Name asc&$filter=(Gender eq 'male')`);
48
+ });
49
+
50
+ cy.window().then((win) => {
51
+ expect(win.console.log).to.have.callCount(1);
52
+ expect(win.console.log).to.be.calledWith('Client sample, Grid State changed:: ', {
53
+ newValues: { pageNumber: 3, pageSize: 20 },
54
+ type: 'pagination',
55
+ });
56
+ });
57
+ });
58
+
59
+ it('should change Pagination to first page with 10 items', () => {
60
+ cy.get('#items-per-page-label').select('10');
61
+
62
+ // wait for the query to start and finish
63
+ cy.get('[data-test=status]').should('contain', 'loading');
64
+ cy.get('[data-test=status]').should('contain', 'finished');
65
+
66
+ cy.get('[data-test=page-number-input]')
67
+ .invoke('val')
68
+ .then((pageNumber) => expect(pageNumber).to.eq('1'));
69
+
70
+ cy.get('[data-test=page-count]').contains('5');
71
+
72
+ cy.get('[data-test=item-from]').contains('1');
73
+
74
+ cy.get('[data-test=item-to]').contains('10');
75
+
76
+ cy.get('[data-test=total-items]').contains('50');
77
+
78
+ cy.get('[data-test=odata-query-result]').should(($span) => {
79
+ expect($span.text()).to.eq(`$inlinecount=allpages&$top=10&$orderby=Name asc&$filter=(Gender eq 'male')`);
80
+ });
81
+
82
+ cy.window().then((win) => {
83
+ expect(win.console.log).to.have.callCount(1);
84
+ expect(win.console.log).to.be.calledWith('Client sample, Grid State changed:: ', {
85
+ newValues: { pageNumber: 1, pageSize: 10 },
86
+ type: 'pagination',
87
+ });
88
+ });
89
+ });
90
+
91
+ it('should change Pagination to last page', () => {
92
+ cy.get('.icon-seek-end').click();
93
+
94
+ // wait for the query to finish
95
+ cy.get('[data-test=status]').should('contain', 'finished');
96
+
97
+ cy.get('[data-test=page-number-input]')
98
+ .invoke('val')
99
+ .then((pageNumber) => expect(pageNumber).to.eq('5'));
100
+
101
+ cy.get('[data-test=page-count]').contains('5');
102
+
103
+ cy.get('[data-test=item-from]').contains('41');
104
+
105
+ cy.get('[data-test=item-to]').contains('50');
106
+
107
+ cy.get('[data-test=total-items]').contains('50');
108
+
109
+ cy.get('[data-test=odata-query-result]').should(($span) => {
110
+ expect($span.text()).to.eq(`$inlinecount=allpages&$top=10&$skip=40&$orderby=Name asc&$filter=(Gender eq 'male')`);
111
+ });
112
+
113
+ cy.window().then((win) => {
114
+ expect(win.console.log).to.have.callCount(1);
115
+ expect(win.console.log).to.be.calledWith('Client sample, Grid State changed:: ', {
116
+ newValues: { pageNumber: 5, pageSize: 10 },
117
+ type: 'pagination',
118
+ });
119
+ });
120
+ });
121
+
122
+ it('should change Pagination to first page using the external button', () => {
123
+ cy.get('[data-test=goto-first-page').click();
124
+
125
+ // wait for the query to finish
126
+ cy.get('[data-test=status]').should('contain', 'finished');
127
+
128
+ cy.get('[data-test=page-number-input]')
129
+ .invoke('val')
130
+ .then((pageNumber) => expect(pageNumber).to.eq('1'));
131
+
132
+ cy.get('[data-test=page-count]').contains('5');
133
+
134
+ cy.get('[data-test=item-from]').contains('1');
135
+
136
+ cy.get('[data-test=item-to]').contains('10');
137
+
138
+ cy.get('[data-test=total-items]').contains('50');
139
+
140
+ cy.get('[data-test=odata-query-result]').should(($span) => {
141
+ expect($span.text()).to.eq(`$inlinecount=allpages&$top=10&$orderby=Name asc&$filter=(Gender eq 'male')`);
142
+ });
143
+
144
+ cy.window().then((win) => {
145
+ expect(win.console.log).to.have.callCount(1);
146
+ expect(win.console.log).to.be.calledWith('Client sample, Grid State changed:: ', {
147
+ newValues: { pageNumber: 1, pageSize: 10 },
148
+ type: 'pagination',
149
+ });
150
+ });
151
+ });
152
+
153
+ it('should change Pagination to last page using the external button', () => {
154
+ cy.get('[data-test=goto-last-page').click();
155
+
156
+ // wait for the query to finish
157
+ cy.get('[data-test=status]').should('contain', 'finished');
158
+
159
+ cy.get('[data-test=page-number-input]')
160
+ .invoke('val')
161
+ .then((pageNumber) => expect(pageNumber).to.eq('5'));
162
+
163
+ cy.get('[data-test=page-count]').contains('5');
164
+
165
+ cy.get('[data-test=item-from]').contains('41');
166
+
167
+ cy.get('[data-test=item-to]').contains('50');
168
+
169
+ cy.get('[data-test=total-items]').contains('50');
170
+
171
+ cy.get('[data-test=odata-query-result]').should(($span) => {
172
+ expect($span.text()).to.eq(`$inlinecount=allpages&$top=10&$skip=40&$orderby=Name asc&$filter=(Gender eq 'male')`);
173
+ });
174
+
175
+ cy.window().then((win) => {
176
+ expect(win.console.log).to.have.callCount(1);
177
+ expect(win.console.log).to.be.calledWith('Client sample, Grid State changed:: ', {
178
+ newValues: { pageNumber: 5, pageSize: 10 },
179
+ type: 'pagination',
180
+ });
181
+ });
182
+ });
183
+
184
+ it('should Clear all Filters and expect to go back to first page', () => {
185
+ cy.get('#grid5').find('button.slick-grid-menu-button').click({ force: true });
186
+
187
+ cy.get(`.slick-grid-menu:visible`).find('.slick-menu-item').first().find('span').contains('Clear all Filters').click();
188
+
189
+ // wait for the query to finish
190
+ cy.get('[data-test=status]').should('contain', 'finished');
191
+
192
+ cy.get('[data-test=page-number-input]')
193
+ .invoke('val')
194
+ .then((pageNumber) => expect(pageNumber).to.eq('1'));
195
+
196
+ cy.get('[data-test=page-count]').contains('10');
197
+
198
+ cy.get('[data-test=item-from]').contains('1');
199
+
200
+ cy.get('[data-test=item-to]').contains('10');
201
+
202
+ cy.get('[data-test=total-items]').contains('100');
203
+
204
+ cy.get('[data-test=odata-query-result]').should(($span) => {
205
+ expect($span.text()).to.eq(`$inlinecount=allpages&$top=10&$orderby=Name asc`);
206
+ });
207
+
208
+ cy.window().then((win) => {
209
+ // TODO look into, this should be called 2x times not 3x times
210
+ // expect(win.console.log).to.have.callCount(2);
211
+ expect(win.console.log).to.be.calledWith('Client sample, Grid State changed:: ', { newValues: [], type: 'filter' });
212
+ expect(win.console.log).to.be.calledWith('Client sample, Grid State changed:: ', {
213
+ newValues: { pageNumber: 1, pageSize: 10 },
214
+ type: 'pagination',
215
+ });
216
+ });
217
+ });
218
+
219
+ it('should Clear all Sorting', () => {
220
+ cy.get('#grid5').find('button.slick-grid-menu-button').click({ force: true });
221
+
222
+ cy.get(`.slick-grid-menu:visible`).find('.slick-menu-item:nth(1)').find('span').contains('Clear all Sorting').click();
223
+
224
+ // wait for the query to finish
225
+ cy.get('[data-test=status]').should('contain', 'finished');
226
+
227
+ cy.get('[data-test=odata-query-result]').should(($span) => {
228
+ expect($span.text()).to.eq(`$inlinecount=allpages&$top=10`);
229
+ });
230
+
231
+ cy.window().then((win) => {
232
+ expect(win.console.log).to.have.callCount(1);
233
+ expect(win.console.log).to.be.calledWith('Client sample, Grid State changed:: ', { newValues: [], type: 'sorter' });
234
+ });
235
+ });
236
+
237
+ it('should use "substringof" when OData version is set to 2', () => {
238
+ cy.get('.search-filter.filter-name').find('input').type('John');
239
+
240
+ // wait for the query to finish
241
+ cy.get('[data-test=status]').should('contain', 'finished');
242
+
243
+ cy.get('[data-test=odata-query-result]').should(($span) => {
244
+ expect($span.text()).to.eq(`$inlinecount=allpages&$top=10&$filter=(substringof('John', Name))`);
245
+ });
246
+
247
+ cy.get('#grid5').find('.slick-row').should('have.length', 1);
248
+ });
249
+
250
+ it('should use "contains" when OData version is set to 4', () => {
251
+ cy.get('[data-test=version4]').click();
252
+
253
+ cy.get('.search-filter.filter-name').find('input').type('John');
254
+
255
+ // wait for the query to finish
256
+ cy.get('[data-test=status]').should('contain', 'finished');
257
+
258
+ cy.get('[data-test=odata-query-result]').should(($span) => {
259
+ expect($span.text()).to.eq(`$count=true&$top=10&$filter=(contains(Name, 'John'))`);
260
+ });
261
+
262
+ cy.get('#grid5').find('.slick-row').should('have.length', 1);
263
+ });
264
+
265
+ it('should return 3 rows using "C*n" (starts with "C" + ends with "n")', () => {
266
+ cy.get('input.filter-name').clear().type('C*n');
267
+
268
+ // wait for the query to finish
269
+ cy.get('[data-test=status]').should('contain', 'finished');
270
+
271
+ cy.get('[data-test=odata-query-result]').should(($span) => {
272
+ expect($span.text()).to.eq(`$count=true&$top=10&$filter=(startswith(Name, 'C') and endswith(Name, 'n'))`);
273
+ });
274
+
275
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(1)`).should('contain', 'Carroll Buchanan');
276
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 1}px);"] > .slick-cell:nth(1)`).should('contain', 'Consuelo Dickson');
277
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 2}px);"] > .slick-cell:nth(1)`).should('contain', 'Christine Compton');
278
+ });
279
+
280
+ it('should perform filterQueryOverride when operator "%%" is selected', () => {
281
+ cy.get('.search-filter.filter-name select')
282
+ .find('option')
283
+ .last()
284
+ .then((element) => {
285
+ cy.get('.search-filter.filter-name select').select(element.val());
286
+ });
287
+
288
+ cy.get('.search-filter.filter-name').find('input').clear().type('Jo%yn%er');
289
+
290
+ // wait for the query to finish
291
+ cy.get('[data-test=status]').should('contain', 'finished');
292
+
293
+ cy.get('[data-test=odata-query-result]').should(($span) => {
294
+ expect($span.text()).to.eq(`$count=true&$top=10&$filter=(matchesPattern(Name, '%5EJo%25yn%25er$'))`);
295
+ });
296
+
297
+ cy.get('.slick-row').should('have.length', 1);
298
+ });
299
+
300
+ it('should click on Set Dynamic Filter and expect query and filters to be changed', () => {
301
+ cy.get('[data-test=set-dynamic-filter]').click();
302
+
303
+ cy.get('.search-filter.filter-name select').should('have.value', 'a*');
304
+
305
+ cy.get('.search-filter.filter-name')
306
+ .find('input')
307
+ .invoke('val')
308
+ .then((text) => expect(text).to.eq('A'));
309
+
310
+ // wait for the query to finish
311
+ cy.get('[data-test=status]').should('contain', 'finished');
312
+
313
+ cy.get('[data-test=odata-query-result]').should(($span) => {
314
+ expect($span.text()).to.eq(`$count=true&$top=10&$filter=(startswith(Name, 'A'))`);
315
+ });
316
+
317
+ cy.get('#grid5').find('.slick-row').should('have.length', 5);
318
+ });
319
+
320
+ it('should use a range filter when searching with ".."', () => {
321
+ cy.get('.slick-header-columns').children('.slick-header-column:nth(1)').contains('Name').click();
322
+
323
+ cy.get('.search-filter.filter-name').find('input').clear().type('Anthony Joyner..Ayers Hood');
324
+
325
+ // wait for the query to finish
326
+ cy.get('[data-test=status]').should('contain', 'finished');
327
+
328
+ cy.get('[data-test=odata-query-result]').should(($span) => {
329
+ expect($span.text()).to.eq(`$count=true&$top=10&$orderby=Name asc&$filter=(Name ge 'Anthony%20Joyner' and Name le 'Ayers%20Hood')`);
330
+ });
331
+
332
+ cy.get('#grid5').find('.slick-row').should('have.length', 3);
333
+ });
334
+ });
335
+
336
+ describe('when "enableCount" is unchecked (not set)', () => {
337
+ it('should Clear all Filters and Sortings, set 20 items per page & uncheck "enableCount"', () => {
338
+ cy.get('#grid5').find('button.slick-grid-menu-button').click({ force: true });
339
+
340
+ cy.get(`.slick-grid-menu:visible`).find('.slick-menu-item').first().find('span').contains('Clear all Filters').click();
341
+
342
+ cy.get('#grid5').find('button.slick-grid-menu-button').trigger('click').click({ force: true });
343
+
344
+ cy.get(`.slick-grid-menu:visible`).find('.slick-menu-item:nth(1)').find('span').contains('Clear all Sorting').click();
345
+
346
+ cy.get('#items-per-page-label').select('20');
347
+
348
+ cy.get('[data-test=enable-count]').click();
349
+ cy.get('[data-test=enable-count]').should('not.be.checked');
350
+
351
+ // wait for the query to finish
352
+ cy.get('[data-test=status]').should('contain', 'finished');
353
+
354
+ cy.get('[data-test=odata-query-result]').should(($span) => {
355
+ expect($span.text()).to.eq(`$top=20`);
356
+ });
357
+ });
358
+
359
+ it('should change Pagination to next page', () => {
360
+ cy.get('.icon-seek-next').click();
361
+
362
+ // wait for the query to finish
363
+ cy.get('[data-test=status]').should('contain', 'finished');
364
+
365
+ cy.get('[data-test=odata-query-result]').should(($span) => {
366
+ expect($span.text()).to.eq(`$top=20&$skip=20`);
367
+ });
368
+ });
369
+
370
+ it('should change Pagination to first page with 10 items', () => {
371
+ cy.get('#items-per-page-label').select('10');
372
+
373
+ // wait for the query to start and finish
374
+ cy.get('[data-test=status]').should('contain', 'loading');
375
+ cy.get('[data-test=status]').should('contain', 'finished');
376
+
377
+ cy.get('[data-test=odata-query-result]').should(($span) => {
378
+ expect($span.text()).to.eq(`$top=10`);
379
+ });
380
+ });
381
+
382
+ it('should change Pagination to last page', () => {
383
+ cy.get('.icon-seek-end').click();
384
+
385
+ // wait for the query to finish
386
+ cy.get('[data-test=status]').should('contain', 'finished');
387
+
388
+ cy.get('[data-test=odata-query-result]').should(($span) => {
389
+ expect($span.text()).to.eq(`$top=10&$skip=90`);
390
+ });
391
+ });
392
+
393
+ it('should click on "Name" column to sort it Ascending', () => {
394
+ cy.get('.slick-header-columns').children('.slick-header-column:nth(1)').click();
395
+
396
+ cy.get('.slick-header-columns')
397
+ .children('.slick-header-column:nth(1)')
398
+ .find('.slick-sort-indicator.slick-sort-indicator-asc')
399
+ .should('be.visible');
400
+
401
+ // wait for the query to finish
402
+ cy.get('[data-test=status]').should('contain', 'finished');
403
+
404
+ cy.get('[data-test=odata-query-result]').should(($span) => {
405
+ expect($span.text()).to.eq(`$top=10&$skip=90&$orderby=Name asc`);
406
+ });
407
+ });
408
+
409
+ it('should Clear all Sorting', () => {
410
+ cy.get('#grid5').find('button.slick-grid-menu-button').click({ force: true });
411
+
412
+ cy.get(`.slick-grid-menu:visible`).find('.slick-menu-item:nth(1)').find('span').contains('Clear all Sorting').click();
413
+
414
+ // wait for the query to finish
415
+ cy.get('[data-test=status]').should('contain', 'finished');
416
+
417
+ cy.get('[data-test=odata-query-result]').should(($span) => {
418
+ expect($span.text()).to.eq(`$top=10&$skip=90`);
419
+ });
420
+ });
421
+
422
+ it('should click on Set Dynamic Filter and expect query and filters to be changed', () => {
423
+ cy.get('[data-test=set-dynamic-filter]').click();
424
+
425
+ cy.get('.search-filter.filter-name select').should('have.value', 'a*');
426
+
427
+ cy.get('.search-filter.filter-name')
428
+ .find('input')
429
+ .invoke('val')
430
+ .then((text) => expect(text).to.eq('A'));
431
+
432
+ // wait for the query to finish
433
+ cy.get('[data-test=status]').should('contain', 'finished');
434
+
435
+ cy.get('[data-test=odata-query-result]').should(($span) => {
436
+ expect($span.text()).to.eq(`$top=10&$filter=(startswith(Name, 'A'))`);
437
+ });
438
+
439
+ cy.get('#grid5').find('.slick-row').should('have.length', 5);
440
+ });
441
+
442
+ it('should use "substringof" when OData version is set to 2', () => {
443
+ cy.get('[data-test=version2]').click();
444
+
445
+ cy.get('.search-filter.filter-name').find('input').type('John');
446
+
447
+ // wait for the query to finish
448
+ cy.get('[data-test=status]').should('contain', 'finished');
449
+
450
+ cy.get('[data-test=odata-query-result]').should(($span) => {
451
+ expect($span.text()).to.eq(`$top=10&$filter=(substringof('John', Name))`);
452
+ });
453
+
454
+ cy.get('#grid5').find('.slick-row').should('have.length', 1);
455
+ });
456
+
457
+ it('should use "contains" when OData version is set to 4', () => {
458
+ cy.get('[data-test=version4]').click();
459
+
460
+ cy.get('.search-filter.filter-name').find('input').type('John');
461
+
462
+ // wait for the query to finish
463
+ cy.get('[data-test=status]').should('contain', 'finished');
464
+
465
+ cy.get('[data-test=odata-query-result]').should(($span) => {
466
+ expect($span.text()).to.eq(`$top=10&$filter=(contains(Name, 'John'))`);
467
+ });
468
+
469
+ cy.get('#grid5').find('.slick-row').should('have.length', 1);
470
+ });
471
+ });
472
+
473
+ describe('General Pagination Behaviors', () => {
474
+ it('should type a filter which returns an empty dataset', () => {
475
+ cy.get('.search-filter.filter-name').find('input').clear().type('xy');
476
+
477
+ cy.get('[data-test=odata-query-result]').should(($span) => {
478
+ expect($span.text()).to.eq(`$top=10&$filter=(contains(Name, 'xy'))`);
479
+ });
480
+
481
+ // wait for the query to finish
482
+ cy.get('[data-test=status]').should('contain', 'finished');
483
+
484
+ cy.get('.slick-empty-data-warning:visible').contains('No data to display.');
485
+ });
486
+
487
+ it('should display page 0 of 0 but hide pagination from/to numbers when filtered data "xy" returns an empty dataset', () => {
488
+ cy.get('[data-test=page-count]').contains('0');
489
+
490
+ cy.get('[data-test=item-from]').should('not.be.visible');
491
+
492
+ cy.get('[data-test=item-to]').should('not.be.visible');
493
+
494
+ cy.get('[data-test=total-items]').contains('0');
495
+
496
+ cy.get('[data-test=odata-query-result]').should(($span) => {
497
+ expect($span.text()).to.eq(`$top=10&$filter=(contains(Name, 'xy'))`);
498
+ });
499
+
500
+ cy.get('[data-test=page-number-input]')
501
+ .invoke('val')
502
+ .then((pageNumber) => expect(pageNumber).to.eq('0'));
503
+ });
504
+
505
+ it('should erase part of the filter so that it filters with "x"', () => {
506
+ cy.get('.search-filter.filter-name').find('input').type('{backspace}');
507
+
508
+ cy.get('[data-test=odata-query-result]').should(($span) => {
509
+ expect($span.text()).to.eq(`$top=10&$filter=(contains(Name, 'x'))`);
510
+ });
511
+
512
+ // wait for the query to finish
513
+ cy.get('[data-test=status]').should('contain', 'finished');
514
+
515
+ cy.get('.slick-empty-data-warning').contains('No data to display.').should('not.be.visible');
516
+
517
+ cy.window().then((win) => {
518
+ expect(win.console.log).to.have.callCount(2);
519
+ expect(win.console.log).to.be.calledWith('Client sample, Grid State changed:: ', {
520
+ newValues: [
521
+ {
522
+ columnId: 'name',
523
+ operator: 'Contains',
524
+ searchTerms: ['x'],
525
+ targetSelector: 'input.form-control.filter-name.compound-input.filled',
526
+ },
527
+ ],
528
+ type: 'filter',
529
+ });
530
+ expect(win.console.log).to.be.calledWith('Client sample, Grid State changed:: ', {
531
+ newValues: { pageNumber: 1, pageSize: 10 },
532
+ type: 'pagination',
533
+ });
534
+ });
535
+ });
536
+
537
+ it('should display page 1 of 1 with 2 items after erasing part of the filter to be "x" which should return 1 page', () => {
538
+ cy.wait(50);
539
+
540
+ cy.get('[data-test=page-count]').contains('1');
541
+
542
+ cy.get('[data-test=item-from]').contains('1');
543
+
544
+ cy.get('[data-test=item-to]').contains('2');
545
+
546
+ cy.get('[data-test=total-items]').contains('2');
547
+
548
+ cy.get('[data-test=page-number-input]')
549
+ .invoke('val')
550
+ .then((pageNumber) => expect(pageNumber).to.eq('1'));
551
+ });
552
+ });
553
+
554
+ describe('Set Dynamic Sorting', () => {
555
+ it('should click on "Set Filters Dynamically" then on "Set Sorting Dynamically"', () => {
556
+ cy.get('[data-test=set-dynamic-filter]').click();
557
+
558
+ // wait for the query to finish
559
+ cy.get('[data-test=status]').should('contain', 'loading');
560
+ cy.get('[data-test=status]').should('contain', 'finished');
561
+
562
+ cy.get('[data-test=set-dynamic-sorting]').click();
563
+
564
+ cy.get('[data-test=status]').should('contain', 'loading');
565
+ cy.get('[data-test=status]').should('contain', 'finished');
566
+ });
567
+
568
+ it('should expect the grid to be sorted by "Name" descending', () => {
569
+ cy.get('#grid5').get('.slick-header-column:nth(1)').find('.slick-sort-indicator-desc').should('have.length', 1);
570
+
571
+ cy.get('.slick-row').first().children('.slick-cell:nth(1)').should('contain', 'Ayers Hood');
572
+
573
+ cy.get('.slick-row').last().children('.slick-cell:nth(1)').should('contain', 'Alexander Foley');
574
+
575
+ cy.get('[data-test=odata-query-result]').should(($span) => {
576
+ expect($span.text()).to.eq(`$top=10&$orderby=Name desc&$filter=(startswith(Name, 'A'))`);
577
+ });
578
+ });
579
+
580
+ it('should display an error when trying to sort by "Company" and the query & sort icons should remain the same', () => {
581
+ cy.get('.slick-header-columns').children('.slick-header-column:nth(3)').click();
582
+
583
+ cy.get('.slick-header-columns')
584
+ .children('.slick-header-column:nth(3)')
585
+ .find('.slick-sort-indicator.slick-sort-indicator-asc')
586
+ .should('not.exist');
587
+
588
+ // wait for the query to finish
589
+ cy.get('[data-test=error-status]').should('contain', 'Server could not sort using the field "Company"');
590
+ cy.get('[data-test=status]').should('contain', 'ERROR!!');
591
+
592
+ // same query string as prior test
593
+ cy.get('[data-test=odata-query-result]').should(($span) => {
594
+ expect($span.text()).to.eq(`$top=10&$orderby=Name desc&$filter=(startswith(Name, 'A'))`);
595
+ });
596
+ });
597
+
598
+ it('should change Gender filter to "female" and still expect previous sort (before the error) to still be in query', () => {
599
+ cy.get('.ms-filter.filter-gender:visible').click();
600
+
601
+ cy.get('[data-name="filter-gender"].ms-drop').find('li:visible:nth(2)').contains('female').click();
602
+
603
+ cy.get('#grid5').find('.slick-row').should('have.length', 1);
604
+
605
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(1)`).should('contain', 'Alisha Myers');
606
+
607
+ // query should still contain previous sort by + new gender filter
608
+ cy.get('[data-test=odata-query-result]').should(($span) => {
609
+ expect($span.text()).to.eq(`$top=10&$orderby=Name desc&$filter=(startswith(Name, 'A') and Gender eq 'female')`);
610
+ });
611
+ });
612
+
613
+ it('should try the "Company" filter and expect an error to throw and also expect the filter to reset to empty after the error is displayed', () => {
614
+ cy.get('input.search-filter.filter-company').type('Core');
615
+
616
+ // wait for the query to finish
617
+ cy.get('[data-test=error-status]').should('contain', 'Server could not filter using the field "Company"');
618
+ cy.get('[data-test=status]').should('contain', 'ERROR!!');
619
+
620
+ cy.get('[data-test=odata-query-result]').should(($span) => {
621
+ expect($span.text()).to.eq(`$top=10&$orderby=Name desc&$filter=(startswith(Name, 'A') and Gender eq 'female')`);
622
+ });
623
+
624
+ cy.get('#grid5').find('.slick-row').should('have.length', 1);
625
+ });
626
+
627
+ it('should clear the "Name" filter and expect query to be successfull with just 1 filter "Gender" to be filled but without the previous failed filter', () => {
628
+ cy.get('#grid5')
629
+ .find('.slick-header-left .slick-header-column:nth(1)')
630
+ .trigger('mouseover')
631
+ .children('.slick-header-menu-button')
632
+ .invoke('show')
633
+ .click();
634
+
635
+ cy.get('.slick-header-menu .slick-menu-command-list')
636
+ .should('be.visible')
637
+ .children('.slick-menu-item:nth-of-type(6)')
638
+ .children('.slick-menu-content')
639
+ .should('contain', 'Remove Filter')
640
+ .click();
641
+
642
+ // wait for the query to finish
643
+ cy.get('[data-test=status]').should('contain', 'finished');
644
+
645
+ cy.get('[data-test=odata-query-result]').should(($span) => {
646
+ expect($span.text()).to.eq(`$top=10&$orderby=Name desc&$filter=(Gender eq 'female')`);
647
+ });
648
+
649
+ cy.get('[data-test=page-number-input]')
650
+ .invoke('val')
651
+ .then((pageNumber) => expect(pageNumber).to.eq('1'));
652
+
653
+ cy.get('[data-test=page-count]').contains('5');
654
+
655
+ cy.get('[data-test=item-from]').contains('1');
656
+
657
+ cy.get('[data-test=item-to]').contains('10');
658
+
659
+ cy.get('[data-test=total-items]').contains('50');
660
+ });
661
+
662
+ it('should display error when clicking on the "Throw Error..." button and not expect query and page to change', () => {
663
+ cy.get('[data-test="throw-page-error-btn"]').click({ force: true });
664
+ cy.wait(50);
665
+
666
+ cy.get('[data-test=error-status]').should('contain', 'Server timed out trying to retrieve data for the last page');
667
+ cy.get('[data-test=status]').should('contain', 'ERROR!!');
668
+
669
+ cy.get('[data-test=odata-query-result]').should(($span) => {
670
+ expect($span.text()).to.eq(`$top=10&$orderby=Name desc&$filter=(Gender eq 'female')`);
671
+ });
672
+
673
+ cy.get('[data-test=page-number-input]')
674
+ .invoke('val')
675
+ .then((pageNumber) => expect(pageNumber).to.eq('1'));
676
+
677
+ cy.get('[data-test=page-count]').contains('5');
678
+
679
+ cy.get('[data-test=item-from]').contains('1');
680
+
681
+ cy.get('[data-test=item-to]').contains('10');
682
+
683
+ cy.get('[data-test=total-items]').contains('50');
684
+ });
685
+
686
+ it('should display error when trying to change items per to 50,000 items and expect query & page to remain the same', () => {
687
+ cy.get('#items-per-page-label').select('50000');
688
+
689
+ cy.get('[data-test=error-status]').should('contain', 'Server timed out retrieving 50,000 rows');
690
+ cy.get('[data-test=status]').should('contain', 'ERROR!!');
691
+
692
+ cy.get('[data-test=odata-query-result]').should(($span) => {
693
+ expect($span.text()).to.eq(`$top=10&$orderby=Name desc&$filter=(Gender eq 'female')`);
694
+ });
695
+
696
+ cy.get('[data-test=page-number-input]')
697
+ .invoke('val')
698
+ .then((pageNumber) => expect(pageNumber).to.eq('1'));
699
+
700
+ cy.get('[data-test=page-count]').contains('5');
701
+
702
+ cy.get('[data-test=item-from]').contains('1');
703
+
704
+ cy.get('[data-test=item-to]').contains('10');
705
+
706
+ cy.get('[data-test=total-items]').contains('50');
707
+ });
708
+
709
+ it('should now go to next page without anymore problems and query & page should change as normal', () => {
710
+ cy.get('.icon-seek-next').click();
711
+
712
+ // wait for the query to finish
713
+ cy.get('[data-test=status]').should('contain', 'finished');
714
+
715
+ cy.get('[data-test=odata-query-result]').should(($span) => {
716
+ expect($span.text()).to.eq(`$top=10&$skip=10&$orderby=Name desc&$filter=(Gender eq 'female')`);
717
+ });
718
+
719
+ cy.get('[data-test=page-number-input]')
720
+ .invoke('val')
721
+ .then((pageNumber) => expect(pageNumber).to.eq('2'));
722
+
723
+ cy.get('[data-test=page-count]').contains('5');
724
+
725
+ cy.get('[data-test=item-from]').contains('11');
726
+
727
+ cy.get('[data-test=item-to]').contains('20');
728
+
729
+ cy.get('[data-test=total-items]').contains('50');
730
+ });
731
+ });
732
+
733
+ describe('Select and Expand Behaviors', () => {
734
+ it('should enable "enableSelect" and "enableExpand" and expect the query to select/expand all fields', () => {
735
+ cy.get('[data-test=enable-expand]').click();
736
+ cy.get('[data-test=enable-expand]').should('be.checked');
737
+ cy.wait(5);
738
+
739
+ // wait for the query to finish
740
+ cy.get('[data-test=status]').should('contain', 'finished');
741
+
742
+ cy.get('[data-test=odata-query-result]').should(($span) => {
743
+ expect($span.text()).to.eq(`$top=10&$orderby=Name desc&$expand=category`);
744
+ });
745
+
746
+ cy.get('[data-test=enable-select]').click();
747
+ cy.get('[data-test=enable-select]').should('be.checked');
748
+
749
+ // wait for the query to finish
750
+ cy.get('[data-test=status]').should('contain', 'finished');
751
+
752
+ cy.get('[data-test=odata-query-result]').should(($span) => {
753
+ expect($span.text()).to.eq(`$top=10&$orderby=Name desc&$select=id,name,gender,company&$expand=category($select=name)`);
754
+ });
755
+ });
756
+
757
+ it('should try to sort and filter on "Category" and expect the query to be succesful', () => {
758
+ cy.get('#grid5').find('button.slick-grid-menu-button').click({ force: true });
759
+
760
+ cy.get(`.slick-grid-menu:visible`).find('.slick-menu-item').first().find('span').contains('Clear all Filters').click();
761
+
762
+ cy.get('#grid5').find('button.slick-grid-menu-button').click({ force: true });
763
+
764
+ cy.get(`.slick-grid-menu:visible`).find('.slick-menu-item').find('span').contains('Clear all Sorting').click();
765
+
766
+ cy.get('.slick-header-columns').children('.slick-header-column:nth(4)').click();
767
+
768
+ cy.get('.slick-header-columns')
769
+ .children('.slick-header-column:nth(4)')
770
+ .find('.slick-sort-indicator.slick-sort-indicator-asc')
771
+ .should('exist');
772
+
773
+ // wait for the query to finish
774
+ cy.get('[data-test=status]').should('contain', 'finished');
775
+
776
+ cy.get('[data-test=odata-query-result]').should(($span) => {
777
+ expect($span.text()).to.eq(`$top=10&$orderby=Category/name asc&$select=id,name,gender,company&$expand=category($select=name)`);
778
+ });
779
+
780
+ cy.get('input.search-filter.filter-category_name').type('Silver');
781
+
782
+ // wait for the query to finish
783
+ cy.get('[data-test=status]').should('contain', 'finished');
784
+
785
+ cy.get('[data-test=odata-query-result]').should(($span) => {
786
+ expect($span.text()).to.eq(
787
+ `$top=10&$orderby=Category/name asc&$filter=(contains(Category/name, 'Silver'))&$select=id,name,gender,company&$expand=category($select=name)`
788
+ );
789
+ });
790
+
791
+ cy.get('[data-test=page-number-input]')
792
+ .invoke('val')
793
+ .then((pageNumber) => expect(pageNumber).to.eq('1'));
794
+
795
+ cy.get('[data-test=page-count]').contains('4');
796
+
797
+ cy.get('[data-test=item-from]').contains('1');
798
+
799
+ cy.get('[data-test=item-to]').contains('10');
800
+
801
+ cy.get('[data-test=total-items]').contains('32');
802
+ });
803
+ });
804
+ });