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,76 @@
1
+ import type {
2
+ BackendService,
3
+ BasePaginationComponent,
4
+ ExtensionList,
5
+ ExtensionService,
6
+ FilterService,
7
+ GridEventService,
8
+ GridService,
9
+ GridStateService,
10
+ HeaderGroupingService,
11
+ PaginationService,
12
+ ResizerService,
13
+ SlickDataView,
14
+ SlickGrid,
15
+ SortService,
16
+ TreeDataService,
17
+ } from '@slickgrid-universal/common';
18
+ import type { EventPubSubService } from '@slickgrid-universal/event-pub-sub';
19
+
20
+ export interface AngularGridInstance {
21
+ /** Slick DataView object */
22
+ dataView: SlickDataView;
23
+
24
+ /** Slick Grid object */
25
+ slickGrid: SlickGrid;
26
+
27
+ /** SlickGrid extensions (external controls/plugins) */
28
+ extensions: ExtensionList<any>;
29
+
30
+ // --
31
+ // Methods
32
+ /** Dispose of the grid and optionally empty the DOM element grid container as well */
33
+ destroy: (emptyDomElementContainer?: boolean) => void;
34
+
35
+ // --
36
+ // Services
37
+
38
+ /** Backend Service, when available */
39
+ backendService?: BackendService;
40
+
41
+ /** EventPubSub Service instance that is used internal by the lib and could be used externally to subscribe to Angular-Slickgrid events */
42
+ eventPubSubService?: EventPubSubService;
43
+
44
+ /** Extension (Plugins & Controls) Service */
45
+ extensionService: ExtensionService;
46
+
47
+ /** Filter Service */
48
+ filterService: FilterService;
49
+
50
+ /** Grid Service (grid extra functionalities) */
51
+ gridService: GridService;
52
+
53
+ /** Grid Events Service */
54
+ gridEventService: GridEventService;
55
+
56
+ /** Grid State Service */
57
+ gridStateService: GridStateService;
58
+
59
+ /** Grouping (and colspan) Service */
60
+ headerGroupingService: HeaderGroupingService;
61
+
62
+ /** Pagination Component */
63
+ paginationComponent?: BasePaginationComponent;
64
+
65
+ /** Pagination Service (allows you to programmatically go to first/last page, etc...) */
66
+ paginationService?: PaginationService;
67
+
68
+ /** Resizer Service (including auto-resize) */
69
+ resizerService: ResizerService;
70
+
71
+ /** Sort Service */
72
+ sortService: SortService;
73
+
74
+ /** Tree Data View Service */
75
+ treeDataService: TreeDataService;
76
+ }
@@ -0,0 +1,37 @@
1
+ import type {
2
+ BackendUtilityService,
3
+ CollectionService,
4
+ ExtensionService,
5
+ ExtensionUtility,
6
+ FilterService,
7
+ GridEventService,
8
+ GridService,
9
+ GridStateService,
10
+ HeaderGroupingService,
11
+ PaginationService,
12
+ ResizerService,
13
+ RxJsFacade,
14
+ SharedService,
15
+ SortService,
16
+ TreeDataService,
17
+ } from '@slickgrid-universal/common';
18
+ import type { EventPubSubService } from '@slickgrid-universal/event-pub-sub';
19
+
20
+ export interface ExternalTestingDependencies {
21
+ backendUtilityService?: BackendUtilityService;
22
+ collectionService?: CollectionService;
23
+ eventPubSubService?: EventPubSubService;
24
+ extensionService?: ExtensionService;
25
+ extensionUtility?: ExtensionUtility;
26
+ filterService?: FilterService;
27
+ gridEventService?: GridEventService;
28
+ gridService?: GridService;
29
+ gridStateService?: GridStateService;
30
+ headerGroupingService?: HeaderGroupingService;
31
+ paginationService?: PaginationService;
32
+ resizerService?: ResizerService;
33
+ rxjs?: RxJsFacade;
34
+ sharedService?: SharedService;
35
+ sortService?: SortService;
36
+ treeDataService?: TreeDataService;
37
+ }
@@ -0,0 +1,15 @@
1
+ import type { TranslateService } from '@ngx-translate/core';
2
+ import type { BasePaginationComponent, Column, GridOption as UniversalGridOption } from '@slickgrid-universal/common';
3
+
4
+ import type { RowDetailView } from './rowDetailView.interface';
5
+
6
+ export interface GridOption<C extends Column = Column> extends UniversalGridOption<C> {
7
+ /** External Custom Pagination Component that can be provided by the user */
8
+ customPaginationComponent?: typeof BasePaginationComponent;
9
+
10
+ /** ngx-translate i18n translation service instance */
11
+ i18n?: TranslateService;
12
+
13
+ /** Row Detail View Plugin options & events (columnId, cssClass, toolTip, width) */
14
+ rowDetailView?: RowDetailView;
15
+ }
@@ -0,0 +1,5 @@
1
+ export type * from './angularComponentOutput.interface';
2
+ export type * from './angularGridInstance.interface';
3
+ export type * from './externalTestingDependencies.interface';
4
+ export type * from './gridOption.interface';
5
+ export type * from './rowDetailView.interface';
@@ -0,0 +1,16 @@
1
+ import type { Type } from '@angular/core';
2
+ import type { RowDetailView as UniversalRowDetailView } from '@slickgrid-universal/common';
3
+
4
+ export interface RowDetailView extends UniversalRowDetailView {
5
+ /**
6
+ * Optionally pass your Parent Component reference to your Child Component (row detail component).
7
+ * note:: If anyone finds a better way of passing the parent to the row detail extension, please reach out and/or create a PR
8
+ */
9
+ parentRef?: any;
10
+
11
+ /** View Component of the preload template (typically a spinner) which shows after opening on the row detail but before the row detail is ready */
12
+ preloadComponent?: Type<object>;
13
+
14
+ /** View Component that will be loaded in the row detail after the async function completed */
15
+ viewComponent: Type<object>;
16
+ }
@@ -0,0 +1,25 @@
1
+ import { beforeEach, describe, expect, it } from 'vitest';
2
+
3
+ import { AngularSlickgridModule } from './angular-slickgrid.module.js';
4
+
5
+ describe('AppComponent', () => {
6
+ let angularSlickgridModule: AngularSlickgridModule;
7
+
8
+ beforeEach(() => {
9
+ angularSlickgridModule = new AngularSlickgridModule();
10
+ });
11
+
12
+ it('should create an instance', () => {
13
+ expect(angularSlickgridModule).toBeTruthy();
14
+ });
15
+
16
+ it('should create an instance with providers via forRoot()', () => {
17
+ const angularSlickgridModuleWithProviders = AngularSlickgridModule.forRoot();
18
+ expect(angularSlickgridModuleWithProviders.providers![0]).toEqual({ provide: 'config', useValue: {} });
19
+ });
20
+
21
+ it('should create an instance with providers via forRoot() with extra config options', () => {
22
+ const angularSlickgridModuleWithProviders = AngularSlickgridModule.forRoot({ enableAutoResize: true });
23
+ expect(angularSlickgridModuleWithProviders.providers![0]).toEqual({ provide: 'config', useValue: { enableAutoResize: true } });
24
+ });
25
+ });
@@ -0,0 +1,27 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { type ModuleWithProviders, NgModule } from '@angular/core';
3
+ import { TranslateModule } from '@ngx-translate/core';
4
+
5
+ import { AngularSlickgridComponent } from '../components/angular-slickgrid.component';
6
+ import { GridOption } from '../models/gridOption.interface';
7
+ import { AngularUtilService } from '../services/angularUtil.service';
8
+ import { ContainerService } from '../services/container.service';
9
+
10
+ @NgModule({
11
+ imports: [CommonModule, TranslateModule],
12
+ declarations: [AngularSlickgridComponent],
13
+ exports: [AngularSlickgridComponent],
14
+ })
15
+ export class AngularSlickgridModule {
16
+ static forRoot(config: GridOption = {}): ModuleWithProviders<AngularSlickgridModule> {
17
+ return {
18
+ ngModule: AngularSlickgridModule,
19
+ providers: [
20
+ { provide: 'config', useValue: config },
21
+ { provide: 'externalService', useValue: null },
22
+ AngularUtilService,
23
+ ContainerService,
24
+ ],
25
+ };
26
+ }
27
+ }
@@ -0,0 +1,156 @@
1
+ import { Component, ViewContainerRef } from '@angular/core';
2
+ import { TestBed } from '@angular/core/testing';
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
4
+
5
+ import { AngularUtilService } from '../angularUtil.service.js';
6
+
7
+ const DOM_ELEMENT_ID = 'row-detail123';
8
+ const DOM_PARENT_ID = 'parent-detail';
9
+
10
+ const viewContainerRefStub = {
11
+ createComponent: vi.fn(),
12
+ detectChanges: vi.fn(),
13
+ } as unknown as ViewContainerRef;
14
+
15
+ @Component({ template: `<h4>Loading...</h4>`, standalone: false })
16
+ class TestPreloadComponent {}
17
+
18
+ @Component({ template: `<h1>{{ title }}</h1>` })
19
+ class TestComponent {
20
+ title = '';
21
+ }
22
+
23
+ describe('AngularUtilService', () => {
24
+ let service: AngularUtilService;
25
+
26
+ beforeEach(async () => {
27
+ // define a <div> container to simulate a row detail DOM element
28
+ const div = document.createElement('div');
29
+ div.innerHTML = `<div id="${DOM_PARENT_ID}">parent text</div><div id="${DOM_ELEMENT_ID}">some text</div>`;
30
+ document.body.appendChild(div);
31
+
32
+ await TestBed.configureTestingModule({
33
+ declarations: [TestPreloadComponent],
34
+ providers: [AngularUtilService, { provide: ViewContainerRef, useValue: viewContainerRefStub }],
35
+ teardown: { destroyAfterEach: false },
36
+ });
37
+ service = TestBed.inject(AngularUtilService);
38
+ });
39
+
40
+ afterEach(() => {
41
+ const domElm = document.getElementById(DOM_ELEMENT_ID) as HTMLDivElement;
42
+ domElm.innerHTML = 'some text';
43
+ });
44
+
45
+ it('should create the service', () => {
46
+ expect(service).toBeTruthy();
47
+ });
48
+
49
+ describe('createAngularComponent method', () => {
50
+ let domElm: HTMLElement;
51
+ let domParentElm: HTMLElement;
52
+ let mockComponentFactory: any;
53
+
54
+ beforeEach(() => {
55
+ domElm = document.getElementById(DOM_ELEMENT_ID) as HTMLDivElement;
56
+ domParentElm = document.getElementById(DOM_PARENT_ID) as HTMLDivElement;
57
+ mockComponentFactory = { hostView: { rootNodes: [domElm] }, instance: {}, changeDetectorRef: { detectChanges: vi.fn() } };
58
+ });
59
+
60
+ it('should create an Angular Component and add it to the current component DOM tree', () => {
61
+ // @ts-ignore
62
+ const createCompSpy = vi.spyOn(viewContainerRefStub, 'createComponent').mockReturnValue(mockComponentFactory);
63
+
64
+ const output = service.createAngularComponent(TestPreloadComponent);
65
+
66
+ expect(createCompSpy).toHaveBeenCalled();
67
+ expect(output).toEqual({ componentRef: mockComponentFactory, domElement: domElm });
68
+ });
69
+
70
+ it('should create an Angular Component with optional target element and extra data to provide to the component instance', () => {
71
+ const titleMock = 'Some Title';
72
+ const h1Mock = document.createElement('h1');
73
+ h1Mock.textContent = titleMock;
74
+ mockComponentFactory.hostView.rootNodes[0] = h1Mock;
75
+ // @ts-ignore
76
+ const createCompSpy = vi.spyOn(viewContainerRefStub, 'createComponent').mockReturnValue(mockComponentFactory);
77
+ const output = service.createAngularComponent(TestComponent, domParentElm, { title: titleMock });
78
+
79
+ expect(createCompSpy).toHaveBeenCalled();
80
+ expect(domParentElm.innerHTML).toBe('Some Title');
81
+ expect(output).toEqual({ componentRef: mockComponentFactory, domElement: h1Mock });
82
+ });
83
+
84
+ it('should create an Angular Component with optional target element and extra data and sanitizer', () => {
85
+ const titleMock = 'Some Title';
86
+ const h1Mock = document.createElement('h1');
87
+ h1Mock.textContent = titleMock;
88
+ mockComponentFactory.hostView.rootNodes[0] = h1Mock;
89
+ const sanitizerMock = vi.fn().mockReturnValue(titleMock);
90
+
91
+ // @ts-ignore
92
+ const createCompSpy = vi.spyOn(viewContainerRefStub, 'createComponent').mockReturnValue(mockComponentFactory);
93
+ const output = service.createAngularComponent(TestComponent, domParentElm, { title: titleMock }, { sanitizer: sanitizerMock });
94
+
95
+ expect(sanitizerMock).toHaveBeenCalled();
96
+ expect(createCompSpy).toHaveBeenCalled();
97
+ expect(domParentElm.innerHTML).toBe('Some Title');
98
+ expect(output).toEqual({ componentRef: mockComponentFactory, domElement: h1Mock });
99
+ });
100
+
101
+ it('should create an Interactive Angular Component with target element and extra data to provide to the component instance', () => {
102
+ const titleMock = 'Some Title';
103
+ const h1Mock = document.createElement('h1');
104
+ h1Mock.textContent = titleMock;
105
+ mockComponentFactory.hostView.rootNodes[0] = h1Mock;
106
+ mockComponentFactory.location = {
107
+ nativeElement: h1Mock,
108
+ };
109
+
110
+ // @ts-ignore
111
+ const createCompSpy = vi.spyOn(viewContainerRefStub, 'createComponent').mockReturnValue(mockComponentFactory);
112
+ const output = service.createInteractiveAngularComponent(TestComponent, domParentElm, { title: titleMock });
113
+
114
+ expect(createCompSpy).toHaveBeenCalled();
115
+ expect(domParentElm.innerHTML).toBe('<h1>Some Title</h1>');
116
+ expect(output).toEqual({ componentRef: mockComponentFactory, domElement: h1Mock });
117
+ });
118
+ });
119
+
120
+ describe('createAngularComponentAppendToDom method', () => {
121
+ let domElm: HTMLElement;
122
+ let domParentElm: HTMLElement;
123
+ let mockComponentFactory: any;
124
+
125
+ beforeEach(() => {
126
+ domElm = document.getElementById(DOM_ELEMENT_ID) as HTMLDivElement;
127
+ domParentElm = document.getElementById(DOM_PARENT_ID) as HTMLDivElement;
128
+ mockComponentFactory = { hostView: { rootNodes: [domElm] } };
129
+ });
130
+
131
+ it('should an angular component and append it to the DOM tree in the document body', () => {
132
+ // @ts-ignore
133
+ const createCompSpy = vi.spyOn(viewContainerRefStub, 'createComponent').mockReturnValue(mockComponentFactory);
134
+ const spyBody = vi.spyOn(document.body, 'appendChild');
135
+
136
+ const output = service.createAngularComponentAppendToDom(TestPreloadComponent);
137
+
138
+ expect(createCompSpy).toHaveBeenCalled();
139
+ expect(spyBody).toHaveBeenCalled();
140
+ expect(output).toEqual({ componentRef: mockComponentFactory, domElement: domElm });
141
+ });
142
+
143
+ it('should an angular component and append it to the current component DOM tree, which will have its parent node replaced by the new html', () => {
144
+ // @ts-ignore
145
+ const createCompSpy = vi.spyOn(viewContainerRefStub, 'createComponent').mockReturnValue(mockComponentFactory);
146
+ const spyElement = vi.spyOn(domParentElm, 'replaceChildren');
147
+
148
+ const output = service.createAngularComponentAppendToDom(TestPreloadComponent, domParentElm);
149
+
150
+ expect(createCompSpy).toHaveBeenCalled();
151
+ expect(spyElement).toHaveBeenCalled();
152
+ expect(domParentElm.innerHTML).toBe('<div id="row-detail123">some text</div>');
153
+ expect(output).toEqual({ componentRef: mockComponentFactory, domElement: domElm });
154
+ });
155
+ });
156
+ });
@@ -0,0 +1,25 @@
1
+ import { SharedService } from '@slickgrid-universal/common';
2
+ import { beforeEach, describe, expect, it } from 'vitest';
3
+
4
+ import { ContainerService } from '../container.service.js';
5
+
6
+ describe('Container Service', () => {
7
+ let service: ContainerService;
8
+ let sharedService: SharedService;
9
+
10
+ beforeEach(() => {
11
+ service = new ContainerService();
12
+ sharedService = new SharedService();
13
+ });
14
+
15
+ it('should register an instance and expect to retrieve it with the get method', () => {
16
+ service.registerInstance('SharedService', sharedService);
17
+ expect(service.get('SharedService')).toEqual(sharedService);
18
+ });
19
+
20
+ it('should register an instance and expect to null when calling the get method with an invalid name', () => {
21
+ service.registerInstance('SharedService', sharedService);
22
+ const output = service.get('DifferentName');
23
+ expect(output).toBeNull();
24
+ });
25
+ });
@@ -0,0 +1,43 @@
1
+ import { TestBed } from '@angular/core/testing';
2
+ import { TranslateModule, TranslateService } from '@ngx-translate/core';
3
+ import { beforeEach, describe, expect, it } from 'vitest';
4
+
5
+ import { TranslaterService } from '../translater.service.js';
6
+
7
+ describe('Translater Service', () => {
8
+ let translate: TranslateService;
9
+ let service: TranslaterService;
10
+
11
+ beforeEach(async () => {
12
+ await TestBed.configureTestingModule({
13
+ imports: [TranslateModule.forRoot()],
14
+ teardown: { destroyAfterEach: false },
15
+ });
16
+ translate = TestBed.inject(TranslateService);
17
+ service = new TranslaterService(translate);
18
+
19
+ translate.setTranslation('fr', {
20
+ ITEMS: 'éléments',
21
+ OF: 'de',
22
+ });
23
+ translate.setTranslation('en', {
24
+ ITEMS: 'items',
25
+ OF: 'of',
26
+ });
27
+ });
28
+
29
+ it('should create the service', () => {
30
+ expect(service).toBeTruthy();
31
+ });
32
+
33
+ it('should call "use" method and expect "getCurrentLanguage" to be equal', async () => {
34
+ await service.use('jp');
35
+ expect(service.getCurrentLanguage()).toBe('jp');
36
+ });
37
+
38
+ it('should call "translate" and expect translated value returned', async () => {
39
+ await service.use('fr');
40
+ const output = service.translate('ITEMS');
41
+ expect(output).toBe('éléments');
42
+ });
43
+ });
@@ -0,0 +1,22 @@
1
+ import { of, type Subscription } from 'rxjs';
2
+ import { describe, expect, it } from 'vitest';
3
+
4
+ import { unsubscribeAllObservables } from '../utilities.js';
5
+
6
+ describe('Service/Utilies', () => {
7
+ describe('unsubscribeAllObservables method', () => {
8
+ it('should return original array when array of subscriptions is empty', () => {
9
+ const output = unsubscribeAllObservables([]);
10
+ expect(output).toEqual([]);
11
+ });
12
+
13
+ it('should return unique values when input array has duplicate objects', () => {
14
+ const subscriptions: Subscription[] = [];
15
+ const observable1 = of([1, 2]);
16
+ const observable2 = of([1, 2]);
17
+ subscriptions.push(observable1.subscribe(), observable2.subscribe());
18
+ const output = unsubscribeAllObservables(subscriptions);
19
+ expect(output).toHaveLength(0);
20
+ });
21
+ });
22
+ });
@@ -0,0 +1,120 @@
1
+ import { Injectable, ViewContainerRef } from '@angular/core';
2
+ import type { EmbeddedViewRef, EnvironmentInjector, Injector, NgModuleRef, Type } from '@angular/core';
3
+
4
+ import type { AngularComponentOutput } from '../models/angularComponentOutput.interface';
5
+
6
+ interface CreateComponentOption {
7
+ index?: number;
8
+ injector?: Injector;
9
+ ngModuleRef?: NgModuleRef<unknown>;
10
+ environmentInjector?: EnvironmentInjector | NgModuleRef<unknown>;
11
+ projectableNodes?: Node[][];
12
+ sanitizer?: (dirtyHtml: string) => string;
13
+ }
14
+
15
+ @Injectable()
16
+ export class AngularUtilService {
17
+ constructor(private vcr: ViewContainerRef) {}
18
+
19
+ createInteractiveAngularComponent<C>(
20
+ component: Type<C>,
21
+ targetElement: Element,
22
+ data?: any,
23
+ createCompOptions?: CreateComponentOption
24
+ ): AngularComponentOutput {
25
+ // Create a component reference from the component
26
+ const componentRef = this.vcr.createComponent(component, createCompOptions);
27
+
28
+ // user could provide data to assign to the component instance
29
+ if (componentRef?.instance && data) {
30
+ Object.assign(componentRef.instance as any, data);
31
+ }
32
+
33
+ // Get DOM element from component
34
+ let domElem: HTMLElement | null = null;
35
+ const viewRef = componentRef.hostView as EmbeddedViewRef<any>;
36
+
37
+ if (viewRef && Array.isArray(viewRef.rootNodes) && viewRef.rootNodes[0]) {
38
+ domElem = viewRef.rootNodes[0] as HTMLElement;
39
+
40
+ // when user provides the DOM element target, we will move the dynamic component into that target (aka portal-ing it)
41
+ if (targetElement && domElem) {
42
+ targetElement.replaceChildren(componentRef.location.nativeElement);
43
+ }
44
+ }
45
+
46
+ return { componentRef, domElement: domElem as HTMLElement };
47
+ }
48
+
49
+ /**
50
+ * Dynamically create an Angular component, user could also provide optional arguments for target, data & createComponent options
51
+ * @param {Component} component
52
+ * @param {HTMLElement} [targetElement]
53
+ * @param {*} [data]
54
+ * @param {CreateComponentOption} [createCompOptions]
55
+ * @returns
56
+ */
57
+ createAngularComponent<C>(
58
+ component: Type<C>,
59
+ targetElement?: Element,
60
+ data?: any,
61
+ createCompOptions?: CreateComponentOption
62
+ ): AngularComponentOutput {
63
+ // Create a component reference from the component
64
+ const componentRef = this.vcr.createComponent(component, createCompOptions);
65
+
66
+ // user could provide data to assign to the component instance
67
+ if (componentRef?.instance && data) {
68
+ Object.assign(componentRef.instance as any, data);
69
+
70
+ // NOTE: detectChanges() MUST be done BEFORE returning the DOM element in the next step,
71
+ // because if we do it only after returning the rootNodes (domElement) then it won't have the instance data yet
72
+ // and we would have to wait an extra cycle to see the result, this basically helps with Example22
73
+ componentRef.changeDetectorRef.detectChanges();
74
+ }
75
+
76
+ // Get DOM element from component
77
+ let domElem: HTMLElement | null = null;
78
+ const viewRef = componentRef.hostView as EmbeddedViewRef<any>;
79
+
80
+ // get DOM element from the new dynamic Component, make sure this is read after any data and detectChanges()
81
+ if (viewRef && Array.isArray(viewRef.rootNodes) && viewRef.rootNodes[0]) {
82
+ domElem = viewRef.rootNodes[0] as HTMLElement;
83
+
84
+ // when user provides the DOM element target, we will read the new Component html and use it to replace the target html
85
+ if (targetElement && domElem) {
86
+ targetElement.innerHTML =
87
+ typeof createCompOptions?.sanitizer === 'function' ? createCompOptions.sanitizer(domElem.innerHTML || '') : domElem.innerHTML;
88
+ }
89
+ }
90
+
91
+ return { componentRef, domElement: domElem as HTMLElement };
92
+ }
93
+
94
+ /**
95
+ * Dynamically create an Angular component and append it to the DOM unless a target element is provided,
96
+ * user could also provide other optional arguments for data & createComponent options.
97
+ * @param {Component} component
98
+ * @param {HTMLElement} [targetElement]
99
+ * @param {*} [data]
100
+ * @param {CreateComponentOption} [createCompOptions]
101
+ * @returns
102
+ */
103
+ createAngularComponentAppendToDom<C>(
104
+ component: Type<C>,
105
+ targetElement?: Element,
106
+ data?: any,
107
+ createCompOptions?: CreateComponentOption
108
+ ): AngularComponentOutput {
109
+ const componentOutput = this.createAngularComponent(component, targetElement, data, createCompOptions);
110
+
111
+ // Append DOM element to the HTML element specified
112
+ if (targetElement?.replaceChildren) {
113
+ targetElement.replaceChildren(componentOutput.domElement);
114
+ } else {
115
+ document.body.appendChild(componentOutput.domElement); // when no target provided, we'll simply add it to the HTML Body
116
+ }
117
+
118
+ return componentOutput;
119
+ }
120
+ }
@@ -0,0 +1,26 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { type ContainerInstance, ContainerService as UniversalContainerService } from '@slickgrid-universal/common';
3
+
4
+ @Injectable()
5
+ export class ContainerService implements UniversalContainerService {
6
+ dependencies: ContainerInstance[] = [];
7
+
8
+ get<T = any>(key: string): T | null {
9
+ const dependency = this.dependencies.find((dep) => dep.key === key);
10
+ if (dependency?.instance) {
11
+ return dependency.instance;
12
+ }
13
+ return null;
14
+ }
15
+
16
+ dispose() {
17
+ this.dependencies = [];
18
+ }
19
+
20
+ registerInstance(key: string, instance: any) {
21
+ const dependency = this.dependencies.some((dep) => dep.key === key);
22
+ if (!dependency) {
23
+ this.dependencies.push({ key, instance });
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,4 @@
1
+ export * from './angularUtil.service';
2
+ export * from './container.service';
3
+ export * from './translater.service';
4
+ export * from './utilities';
@@ -0,0 +1,38 @@
1
+ import { Injectable, Optional } from '@angular/core';
2
+ import { TranslateService } from '@ngx-translate/core';
3
+ import { TranslaterService as UniversalTranslateService } from '@slickgrid-universal/common';
4
+
5
+ /**
6
+ * This is a Translate Service Wrapper for Slickgrid-Universal monorepo lib to work properly,
7
+ * it must implement Slickgrid-Universal TranslaterService interface to work properly
8
+ */
9
+ @Injectable()
10
+ export class TranslaterService implements UniversalTranslateService {
11
+ constructor(@Optional() private readonly translateService: TranslateService) {}
12
+
13
+ /**
14
+ * Method to return the current language used by the App
15
+ * @return {string} current language
16
+ */
17
+ getCurrentLanguage(): string {
18
+ return this.translateService?.currentLang ?? '';
19
+ }
20
+
21
+ /**
22
+ * Method to set the language to use in the App and Translate Service
23
+ * @param {string} language
24
+ * @return {Promise} output
25
+ */
26
+ async use(newLang: string): Promise<any> {
27
+ return this.translateService?.use?.(newLang);
28
+ }
29
+
30
+ /**
31
+ * Method which receives a translation key and returns the translated value assigned to that key
32
+ * @param {string} translation key
33
+ * @return {string} translated value
34
+ */
35
+ translate(translationKey: string): string {
36
+ return this.translateService?.instant?.(translationKey || ' ') as string;
37
+ }
38
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Unsubscribe all Observables Subscriptions
3
+ * It will return an empty array if it all went well
4
+ * @param subscriptions
5
+ */
6
+ export function unsubscribeAllObservables(subscriptions: Array<{ unsubscribe: () => void }>): any[] {
7
+ if (Array.isArray(subscriptions)) {
8
+ let subscription = subscriptions.pop();
9
+ while (subscription) {
10
+ if (typeof subscription.unsubscribe === 'function') {
11
+ subscription.unsubscribe();
12
+ }
13
+ subscription = subscriptions.pop();
14
+ }
15
+ }
16
+
17
+ // TODO: deprecated, remove the return type in next major version
18
+ return subscriptions;
19
+ }