angular-slickgrid 8.14.1 → 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 +168 -194
  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 -304
  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,268 @@
1
+ describe('Example 3 - Grid with Editors', () => {
2
+ const GRID_ROW_HEIGHT = 35;
3
+ const fullTitles = [
4
+ '',
5
+ '',
6
+ 'Title',
7
+ 'Title, Custom Editor',
8
+ 'Duration (days)',
9
+ '% Complete',
10
+ 'Start',
11
+ 'Finish',
12
+ 'City of Origin',
13
+ 'Country of Origin',
14
+ 'Country of Origin Name',
15
+ 'Effort Driven',
16
+ 'Prerequisites',
17
+ ];
18
+
19
+ it('should display Example title', () => {
20
+ cy.visit(`${Cypress.config('baseUrl')}/example03`);
21
+ cy.get('h2').should('contain', 'Example 3: Editors / Delete');
22
+ });
23
+
24
+ it('should have exact Column Titles in the grid', () => {
25
+ cy.get('#grid3')
26
+ .find('.slick-header-columns')
27
+ .children()
28
+ .each(($child, index) => expect($child.text()).to.eq(fullTitles[index]));
29
+ });
30
+
31
+ it('should be able to change Title with Custom Editor and expect to save when changing the value and then mouse clicking on a different cell', () => {
32
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 1}px);"] > .slick-cell:nth(3)`)
33
+ .should('contain', 'Task 1')
34
+ .click();
35
+ cy.get('input[type=text].editor-text').type('Task 8888');
36
+
37
+ // mouse click on next cell on the right & expect a save
38
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 1}px);"] > .slick-cell:nth(4)`).click();
39
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 1}px);"] > .slick-cell:nth(3)`).should('contain', 'Task 8888');
40
+ });
41
+
42
+ it('should be able to undo the editor and expect it to be opened, then clicking on Escape should reveal the cell to have rolled back text of "Task 1"', () => {
43
+ cy.get('[data-test="undo-btn"]').click();
44
+
45
+ cy.get('input[type=text].editor-text').should('exist').type('{esc}');
46
+
47
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 1}px);"] > .slick-cell:nth(3)`).should('contain', 'Task 1');
48
+ });
49
+
50
+ it('should enable "Auto Commit Edit"', () => {
51
+ cy.get('[data-test=auto-commit]').click();
52
+ });
53
+
54
+ it('should be able to change all values of 3rd row', () => {
55
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 2}px);"] > .slick-cell:nth(2)`)
56
+ .should('contain', 'Task 2')
57
+ .click();
58
+
59
+ // change Title & Custom Title
60
+ cy.get('.editor-title > textarea').type('Task 2222');
61
+ cy.get('.editor-title .btn-save').click();
62
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 2}px);"] > .slick-cell:nth(2)`).should('contain', 'Task 2222');
63
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 2}px);"] > .slick-cell:nth(3)`).should('contain', 'Task 2222');
64
+
65
+ // change duration
66
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 2}px);"] > .slick-cell:nth(4)`).click();
67
+ cy.get('.slider-editor input[type=range]').as('range').invoke('val', 25).trigger('change', { force: true });
68
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 2}px);"] > .slick-cell:nth(4)`).should('contain', '25');
69
+
70
+ // change % Complete
71
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 2}px);"] > .slick-cell:nth(5)`).click();
72
+ cy.get('[data-name=editor-complete].ms-drop > ul > li > label:nth(5)').contains('95').click();
73
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 2}px);"] > .slick-cell:nth(5)`).find(
74
+ '.percent-complete-bar[style="background: green; width: 95%;"]'
75
+ );
76
+
77
+ // change Finish date
78
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 2}px);"] > .slick-cell:nth(6)`).click();
79
+ cy.get('.vc-month:visible').click();
80
+ cy.get('.vc-months__month').contains('Jan').click();
81
+ cy.get('[data-vc="year"]').click();
82
+ cy.get('.vc-years__year').contains('2009').click();
83
+ cy.get('[data-vc-date-btn]').contains('22').click();
84
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 2}px);"] > .slick-cell:nth(6)`).should('contain', '2009-01-22');
85
+
86
+ // change City of Origin
87
+ // cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 2}px);"] > .slick-cell:nth(8)`).click({ force: true });
88
+ // cy.get('input.autocomplete.editor-cityOfOrigin.ui-autocomplete-input')
89
+ // .type('Venice');
90
+
91
+ // change Effort Driven
92
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 2}px);"] > .slick-cell:nth(11)`).click();
93
+ cy.get(
94
+ `[style="transform: translateY(${GRID_ROW_HEIGHT * 2}px);"] > .slick-cell:nth(11) > input.editor-checkbox.editor-effort-driven`
95
+ ).check();
96
+
97
+ cy.get('.slick-viewport.slick-viewport-top.slick-viewport-left').scrollTo('top');
98
+ });
99
+
100
+ it('should dynamically add 2x new "Title" columns', () => {
101
+ const updatedTitles = [
102
+ '',
103
+ '',
104
+ 'Title',
105
+ 'Title, Custom Editor',
106
+ 'Duration (days)',
107
+ '% Complete',
108
+ 'Start',
109
+ 'Finish',
110
+ 'City of Origin',
111
+ 'Country of Origin',
112
+ 'Country of Origin Name',
113
+ 'Effort Driven',
114
+ 'Prerequisites',
115
+ 'Title',
116
+ 'Title',
117
+ ];
118
+
119
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(2)`).should('contain', 'Task 0');
120
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(13)`).should('not.exist');
121
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(14)`).should('not.exist');
122
+
123
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(2)`)
124
+ .should('contain', 'Task 0')
125
+ .should('have.length', 1);
126
+
127
+ cy.get('#grid3')
128
+ .find('.slick-header-columns')
129
+ .children()
130
+ .each(($child, index) => expect($child.text()).to.eq(updatedTitles[index]));
131
+
132
+ cy.get('[data-test=add-title-column]').click().click();
133
+
134
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(2)`).should('contain', 'Task 0');
135
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(3)`).should('contain', 'Task 0');
136
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(13)`).should('contain', 'Task 0');
137
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(14)`).should('contain', 'Task 0');
138
+ });
139
+
140
+ it('should be able to change value of 1st row "Title" column and expect same value set in all 3 "Title" columns', () => {
141
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(2)`)
142
+ .should('contain', 'Task 0')
143
+ .click();
144
+
145
+ // change Title & Custom Title
146
+ cy.get('.editor-title > textarea').type('Task 0000');
147
+ cy.get('.editor-title .btn-save').click();
148
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(2)`).should('contain', 'Task 0000');
149
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(3)`).should('contain', 'Task 0000');
150
+
151
+ // change duration
152
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(4)`).click();
153
+ cy.get('.slider-editor input[type=range]').as('range').invoke('val', 50).trigger('change', { force: true });
154
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(4)`).should('contain', '50');
155
+
156
+ // change % Complete
157
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(5)`).click();
158
+ cy.get('[data-name=editor-complete].ms-drop > ul > li > label:nth(5)').contains('95').click();
159
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(5)`).find(
160
+ '.percent-complete-bar[style="background: green; width: 95%;"]'
161
+ );
162
+
163
+ // change Finish date
164
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(6)`).click();
165
+ cy.get('.vc-month:visible').click();
166
+ cy.get('.vc-months__month').contains('Jan').click();
167
+ cy.get('[data-vc="year"]').click();
168
+ cy.get('.vc-years__year').contains('2009').click();
169
+ cy.get('[data-vc-date-btn]').contains('22').click();
170
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(6)`).should('contain', '2009-01-22');
171
+
172
+ // change Effort Driven
173
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(11)`).click();
174
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(11) > input.editor-checkbox.editor-effort-driven`)
175
+ .check()
176
+ .blur();
177
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(10)`).click(); // the blur seems to not always work, so just click on another cell
178
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(11)`).find('.mdi-check.checkmark-icon');
179
+
180
+ cy.get('.slick-viewport.slick-viewport-top.slick-viewport-left').scrollTo('top');
181
+ });
182
+
183
+ it('should be able to filter and search "Task 2222" in the new column and expect only 1 row showing in the grid', () => {
184
+ cy.get('input.search-filter.filter-title1').type('Task 2222', { force: true }).should('have.value', 'Task 2222');
185
+
186
+ cy.get('.slick-row').should('have.length', 1);
187
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(2)`).should('contain', 'Task 2222');
188
+ });
189
+
190
+ it('should hover over the last "Title" column and click on "Clear Filter" and expect grid to have all rows shown', () => {
191
+ cy.get('.slick-header-column:nth-child(14)').first().trigger('mouseover').children('.slick-header-menu-button').invoke('show').click();
192
+
193
+ cy.get('.slick-header-menu .slick-menu-command-list')
194
+ .should('be.visible')
195
+ .children('.slick-menu-item:nth-of-type(6)')
196
+ .children('.slick-menu-content')
197
+ .should('contain', 'Remove Filter')
198
+ .click();
199
+
200
+ cy.get('.slick-row').should('have.length.greaterThan', 1);
201
+ });
202
+
203
+ it('should be able to dynamically remove last 2 added Title columns', () => {
204
+ cy.get('[data-test=remove-title-column]').click().click();
205
+
206
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(2)`).should('contain', 'Task 0');
207
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(13)`).should('not.exist');
208
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(14)`).should('not.exist');
209
+ });
210
+
211
+ it('should be able to change values again of 1st row "Title" column and expect same value set in all 3 "Title" columns', () => {
212
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(2)`)
213
+ .should('contain', 'Task 0')
214
+ .click();
215
+
216
+ // change Title & Custom Title
217
+ cy.get('.editor-title > textarea').type('Task 0000');
218
+ cy.get('.editor-title .btn-save').click();
219
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(2)`).should('contain', 'Task 0000');
220
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(3)`).should('contain', 'Task 0000');
221
+
222
+ // change duration
223
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(4)`).click();
224
+ cy.get('.slider-editor input[type=range]').as('range').invoke('val', 50).trigger('change', { force: true });
225
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(4)`).should('contain', '50');
226
+
227
+ // change % Complete
228
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(5)`).click();
229
+ cy.get('[data-name=editor-complete].ms-drop > ul > li > label:nth(3)').contains('97').click();
230
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(5)`).find(
231
+ '.percent-complete-bar[style="background: green; width: 97%;"]'
232
+ );
233
+
234
+ // change Finish date
235
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(6)`).click();
236
+ cy.get('[data-vc-date-btn]').contains('21').click();
237
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(6)`).should('contain', '2009-01-21');
238
+
239
+ // // change Effort Driven
240
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(11)`).click();
241
+ cy.get(
242
+ `[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(11) > input.editor-checkbox.editor-effort-driven`
243
+ ).uncheck();
244
+ });
245
+
246
+ it('should open the "Prerequisites" Filter then choose "Task 3", "Task 4" and "Task 8" from the list and expect to see 2 rows of data in the grid', () => {
247
+ cy.get('div.ms-filter.filter-prerequisites').trigger('click');
248
+
249
+ cy.get('.ms-drop')
250
+ .contains(/^Task 3$/) // use regexp to avoid finding first Task 3 which is in fact Task 399
251
+ .click();
252
+
253
+ cy.get('.ms-drop')
254
+ .contains(/^Task 4$/)
255
+ .click();
256
+
257
+ cy.get('.ms-drop')
258
+ .contains(/^Task 8$/)
259
+ .click();
260
+
261
+ cy.get('.ms-ok-button').click();
262
+
263
+ cy.get('.slick-row').should('have.length', 2);
264
+
265
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 0}px);"] > .slick-cell:nth(2)`).should('contain', 'Task 4');
266
+ cy.get(`[style="transform: translateY(${GRID_ROW_HEIGHT * 1}px);"] > .slick-cell:nth(2)`).should('contain', 'Task 8');
267
+ });
268
+ });
@@ -0,0 +1,254 @@
1
+ import { isAfter, isBefore, isEqual, parse } from '@formkit/tempo';
2
+ import { removeExtraSpaces } from '../plugins/utilities';
3
+
4
+ describe('Example 4 - Client Side Sort/Filter Grid', () => {
5
+ beforeEach(() => {
6
+ // create a console.log spy for later use
7
+ cy.window().then((win) => {
8
+ cy.spy(win.console, 'log');
9
+ });
10
+ });
11
+
12
+ it('should display Example title', () => {
13
+ cy.visit(`${Cypress.config('baseUrl')}/example04`);
14
+ cy.get('h2').should('contain', 'Example 4: Client Side Sort/Filter');
15
+ });
16
+
17
+ describe('Load Grid with Presets', () => {
18
+ const presetDurationValues = [98, 10];
19
+ const presetUsDateShort = '4/20/25';
20
+
21
+ it('should have "Duration" fields within the inclusive range of the preset filters and be displayed in the Filter itself', () => {
22
+ cy.get('.ms-filter.search-filter.filter-duration.filled').find('.ms-choice').contains('98, 10');
23
+
24
+ cy.get('#grid4')
25
+ .find('.slick-row')
26
+ .each(($row) => {
27
+ cy.wrap($row)
28
+ .children('.slick-cell:nth(2)')
29
+ .each(($cell) => {
30
+ const value = parseInt($cell.text().trim(), 10);
31
+ if (!isNaN(value)) {
32
+ const foundItems = presetDurationValues.filter((acceptedValue) => acceptedValue === value);
33
+ expect(foundItems).to.have.length(1);
34
+ }
35
+ });
36
+ });
37
+ });
38
+
39
+ it('should have US Date Short within the range of the preset filters', () => {
40
+ cy.get('.search-filter.filter-usDateShort')
41
+ .find('input')
42
+ .invoke('val')
43
+ .then((text) => expect(text).to.eq(presetUsDateShort));
44
+
45
+ cy.get('#grid4')
46
+ .find('.slick-row')
47
+ .each(($row) => {
48
+ cy.wrap($row)
49
+ .children('.slick-cell:nth(5)')
50
+ .each(($cell) => {
51
+ const isDateValid = isBefore(parse($cell.text(), 'M/D/YY'), parse(presetUsDateShort, 'M/D/YY'));
52
+ expect(isDateValid).to.eq(true);
53
+ });
54
+ });
55
+ });
56
+
57
+ it('should have some metrics shown in the grid footer well below 10500 items', () => {
58
+ cy.get('#slickGridContainer-grid4')
59
+ .find('.slick-custom-footer')
60
+ .find('.right-footer')
61
+ .should(($span) => {
62
+ const text = removeExtraSpaces($span.text()); // remove all white spaces
63
+ expect(text).not.to.eq('10500 of 10500 items');
64
+ });
65
+ });
66
+
67
+ it('should expect the grid to be sorted by "Duration" descending and "% Complete" ascending', () => {
68
+ cy.get('#grid4')
69
+ .get('.slick-header-column:nth(2)')
70
+ .find('.slick-sort-indicator-desc')
71
+ .should('have.length', 1)
72
+ .siblings('.slick-sort-indicator-numbered')
73
+ .contains('1');
74
+
75
+ cy.get('#grid4')
76
+ .get('.slick-header-column:nth(3)')
77
+ .find('.slick-sort-indicator-asc')
78
+ .should('have.length', 1)
79
+ .siblings('.slick-sort-indicator-numbered')
80
+ .contains('2');
81
+
82
+ cy.get('.slick-row').first().children('.slick-cell:nth(2)').should('contain', '98');
83
+
84
+ cy.get('[data-test="scroll-bottom-btn"').click();
85
+
86
+ cy.get('.slick-row').last().children('.slick-cell:nth(2)').should('contain', '10');
87
+ });
88
+ });
89
+
90
+ describe('Set Dymamic Filters', () => {
91
+ const dynamicDurationValues = [2, 25, 48, 50];
92
+ const dynamicMaxComplete = 95;
93
+ const dynamicStartDate = '2001-02-28';
94
+
95
+ it('should click on Set Dynamic Filters', () => {
96
+ cy.get('[data-test=set-dynamic-filter]').click();
97
+ });
98
+
99
+ it('should have "% Complete" fields within the exclusive range of the filters presets', () => {
100
+ cy.get('#grid4')
101
+ .find('.slick-row')
102
+ .each(($row) => {
103
+ cy.wrap($row)
104
+ .children('.slick-cell:nth(3)')
105
+ .each(($cell) => {
106
+ const value = parseInt($cell.text().trim(), 10);
107
+ if (!isNaN(value)) {
108
+ expect(value < dynamicMaxComplete).to.eq(true);
109
+ }
110
+ });
111
+ });
112
+ });
113
+
114
+ it('should have "Duration" fields within the inclusive range of the dynamic filters', () => {
115
+ cy.get('#grid4')
116
+ .find('.slick-row')
117
+ .each(($row) => {
118
+ cy.wrap($row)
119
+ .children('.slick-cell:nth(2)')
120
+ .each(($cell) => {
121
+ const value = parseInt($cell.text().trim(), 10);
122
+ if (!isNaN(value)) {
123
+ const foundItems = dynamicDurationValues.filter((acceptedValue) => acceptedValue === value);
124
+ expect(foundItems).to.have.length(1);
125
+ }
126
+ });
127
+ });
128
+ });
129
+
130
+ it('should have Start Date within the range of the dynamic filters', () => {
131
+ cy.get('.search-filter.filter-start')
132
+ .find('input')
133
+ .invoke('val')
134
+ .then((text) => expect(text).to.eq(dynamicStartDate));
135
+
136
+ cy.get('#grid4')
137
+ .find('.slick-row')
138
+ .each(($row) => {
139
+ cy.wrap($row)
140
+ .children('.slick-cell:nth(4)')
141
+ .each(($cell) => {
142
+ const isDateValid = isEqual(parse($cell.text()), dynamicStartDate) || isAfter(parse($cell.text()), dynamicStartDate);
143
+ expect(isDateValid).to.eq(true);
144
+ });
145
+ });
146
+ });
147
+ });
148
+
149
+ describe('Set Dynamic Sorting', () => {
150
+ it('should click on "Clear Filters" then "Set Dynamic Sorting" buttons', () => {
151
+ cy.get('[data-test=clear-filters]').click();
152
+
153
+ cy.get('[data-test=set-dynamic-sorting]').click();
154
+ });
155
+
156
+ it('should have some metrics shown in the grid footer', () => {
157
+ cy.get('#slickGridContainer-grid4')
158
+ .find('.slick-custom-footer')
159
+ .find('.right-footer')
160
+ .should(($span) => {
161
+ const text = removeExtraSpaces($span.text()); // remove all white spaces
162
+ expect(text).to.eq('10500 of 10500 items');
163
+ });
164
+ });
165
+
166
+ it('should expect the grid to be sorted by "Duration" ascending and "Start" descending', () => {
167
+ cy.get('#grid4')
168
+ .get('.slick-header-column:nth(2)')
169
+ .find('.slick-sort-indicator-asc')
170
+ .should('have.length', 1)
171
+ .siblings('.slick-sort-indicator-numbered')
172
+ .contains('1');
173
+
174
+ cy.get('#grid4')
175
+ .get('.slick-header-column:nth(4)')
176
+ .find('.slick-sort-indicator-desc')
177
+ .should('have.length', 1)
178
+ .siblings('.slick-sort-indicator-numbered')
179
+ .contains('2');
180
+
181
+ cy.get('.slick-row').first().children('.slick-cell:nth(2)').should('contain', '0');
182
+
183
+ cy.get('[data-test="scroll-bottom-btn"').click();
184
+
185
+ cy.get('.slick-row').last().children('.slick-cell:nth(2)').should('contain', '100');
186
+
187
+ cy.get('.slick-row').last().children('.slick-cell:nth(4)').should('contain', '');
188
+ });
189
+ });
190
+
191
+ describe('Grid State Changes', () => {
192
+ const dynamicStartDate = '2001-02-28';
193
+
194
+ it('should click on Set Dynamic Filters', () => {
195
+ cy.get('[data-test=set-dynamic-filter]').click();
196
+ });
197
+
198
+ it('should have Start Date within the range of the dynamic filters', () => {
199
+ cy.get('.search-filter.filter-start')
200
+ .find('input')
201
+ .invoke('val')
202
+ .then((text) => expect(text).to.eq(dynamicStartDate));
203
+
204
+ cy.get('#grid4')
205
+ .find('.slick-row')
206
+ .each(($row) => {
207
+ cy.wrap($row)
208
+ .children('.slick-cell:nth(4)')
209
+ .each(($cell) => {
210
+ const isDateValid = isEqual(parse($cell.text()), dynamicStartDate) || isAfter(parse($cell.text()), dynamicStartDate);
211
+ expect(isDateValid).to.eq(true);
212
+ });
213
+ });
214
+ });
215
+
216
+ it('should focus on Start filter, then type Backspace and expect Start filter to no longer exists in the list of Filters in Grid State change', () => {
217
+ cy.get('.search-filter.filter-start').click();
218
+ cy.wait(20);
219
+ cy.get('.search-filter.filter-start input.date-picker').type('{backspace}', { force: true });
220
+
221
+ cy.get('.search-filter.filter-start')
222
+ .find('input')
223
+ .invoke('val')
224
+ .then((text) => expect(text).to.eq(''));
225
+
226
+ cy.window().then((win) => {
227
+ expect(win.console.log).to.have.callCount(1);
228
+ expect(win.console.log).to.be.calledWith('Client sample, Grid State changed:: ', {
229
+ newValues: [
230
+ { columnId: 'duration', searchTerms: ['2', '25', '48', '50'], operator: 'IN' },
231
+ { columnId: 'complete', searchTerms: ['95'], operator: '<' },
232
+ { columnId: 'effort-driven', searchTerms: ['true'], operator: 'EQ' },
233
+ ],
234
+ type: 'filter',
235
+ });
236
+ });
237
+ });
238
+
239
+ it('should click on DOM body and reopen Start filter date picker and still expect it to be empty', () => {
240
+ cy.get('h2').click(); // just to simulate clicking outside of the date picker
241
+
242
+ cy.get('.search-filter.filter-start')
243
+ .find('input')
244
+ .invoke('val')
245
+ .then((text) => expect(text).to.eq(''));
246
+
247
+ cy.get('.search-filter.filter-start').click();
248
+
249
+ cy.get('.vc:visible').find('[data-vc-date-selected]').should('not.exist');
250
+
251
+ cy.get('h2').click();
252
+ });
253
+ });
254
+ });