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,445 @@
1
+ import { Component, OnDestroy, OnInit } from '@angular/core';
2
+ import { ExcelExportService } from '@slickgrid-universal/excel-export';
3
+ import { TextExportService } from '@slickgrid-universal/text-export';
4
+
5
+ import {
6
+ AngularGridInstance,
7
+ Aggregators,
8
+ Column,
9
+ DelimiterType,
10
+ Editors,
11
+ Filters,
12
+ Formatters,
13
+ GridOption,
14
+ Grouping,
15
+ GroupingGetterFunction,
16
+ GroupTotalFormatters,
17
+ SortDirectionNumber,
18
+ SortComparers,
19
+ } from '../../library';
20
+
21
+ @Component({
22
+ templateUrl: './example18.component.html',
23
+ standalone: false,
24
+ })
25
+ export class Example18Component implements OnInit, OnDestroy {
26
+ private _darkMode = false;
27
+ angularGrid!: AngularGridInstance;
28
+ columnDefinitions!: Column[];
29
+ dataset!: any[];
30
+ dataviewObj: any;
31
+ draggableGroupingPlugin: any;
32
+ durationOrderByCount = false;
33
+ gridObj: any;
34
+ gridOptions!: GridOption;
35
+ processing = false;
36
+ selectedGroupingFields: Array<string | GroupingGetterFunction> = ['', '', ''];
37
+ excelExportService = new ExcelExportService();
38
+ textExportService = new TextExportService();
39
+
40
+ constructor() {
41
+ // define the grid options & columns and then create the grid itself
42
+ this.loadData(500);
43
+ this.defineGrid();
44
+ }
45
+
46
+ ngOnInit(): void {
47
+ // populate the dataset once the grid is ready
48
+ this.defineGrid();
49
+ }
50
+
51
+ ngOnDestroy() {
52
+ document.querySelector('.panel-wm-content')!.classList.remove('dark-mode');
53
+ document.querySelector<HTMLDivElement>('#demo-container')!.dataset.bsTheme = 'light';
54
+ }
55
+
56
+ angularGridReady(angularGrid: AngularGridInstance) {
57
+ this.angularGrid = angularGrid;
58
+ this.gridObj = angularGrid.slickGrid; // grid object
59
+ this.dataviewObj = angularGrid.dataView;
60
+ }
61
+
62
+ /* Define grid Options and Columns */
63
+ defineGrid() {
64
+ this.columnDefinitions = [
65
+ {
66
+ id: 'title',
67
+ name: 'Title',
68
+ field: 'title',
69
+ columnGroup: 'Common Factor',
70
+ width: 70,
71
+ minWidth: 50,
72
+ cssClass: 'cell-title',
73
+ filterable: true,
74
+ sortable: true,
75
+ grouping: {
76
+ getter: 'title',
77
+ formatter: (g) => `Title: ${g.value} <span class="text-primary">(${g.count} items)</span>`,
78
+ aggregators: [new Aggregators.Sum('cost')],
79
+ aggregateCollapsed: false,
80
+ collapsed: false,
81
+ },
82
+ },
83
+ {
84
+ id: 'duration',
85
+ name: 'Duration',
86
+ field: 'duration',
87
+ columnGroup: 'Common Factor',
88
+ width: 70,
89
+ sortable: true,
90
+ filterable: true,
91
+ editor: {
92
+ model: Editors.float,
93
+ // required: true,
94
+ decimal: 2,
95
+ valueStep: 1,
96
+ maxValue: 10000,
97
+ alwaysSaveOnEnterKey: true,
98
+ },
99
+ filter: { model: Filters.slider, operator: '>=' },
100
+ type: 'number',
101
+ groupTotalsFormatter: GroupTotalFormatters.sumTotals,
102
+ grouping: {
103
+ getter: 'duration',
104
+ formatter: (g) => `Duration: ${g.value} <span class="text-primary">(${g.count} items)</span>`,
105
+ comparer: (a, b) => {
106
+ return this.durationOrderByCount ? a.count - b.count : SortComparers.numeric(a.value, b.value, SortDirectionNumber.asc);
107
+ },
108
+ aggregators: [new Aggregators.Sum('duration'), new Aggregators.Sum('cost')],
109
+ aggregateCollapsed: false,
110
+ collapsed: false,
111
+ },
112
+ },
113
+ {
114
+ id: 'start',
115
+ name: 'Start',
116
+ field: 'start',
117
+ columnGroup: 'Period',
118
+ minWidth: 60,
119
+ sortable: true,
120
+ filterable: true,
121
+ filter: { model: Filters.compoundDate },
122
+ formatter: Formatters.dateIso,
123
+ type: 'dateUtc',
124
+ outputType: 'dateIso',
125
+ exportWithFormatter: true,
126
+ grouping: {
127
+ getter: 'start',
128
+ formatter: (g) => `Start: ${g.value} <span class="text-primary">(${g.count} items)</span>`,
129
+ aggregators: [new Aggregators.Sum('cost')],
130
+ aggregateCollapsed: false,
131
+ collapsed: false,
132
+ },
133
+ },
134
+ {
135
+ id: 'finish',
136
+ name: 'Finish',
137
+ field: 'finish',
138
+ columnGroup: 'Period',
139
+ minWidth: 60,
140
+ sortable: true,
141
+ filterable: true,
142
+ filter: { model: Filters.compoundDate },
143
+ formatter: Formatters.dateIso,
144
+ type: 'dateUtc',
145
+ outputType: 'dateIso',
146
+ exportWithFormatter: true,
147
+ grouping: {
148
+ getter: 'finish',
149
+ formatter: (g) => `Finish: ${g.value} <span class="text-primary">(${g.count} items)</span>`,
150
+ aggregators: [new Aggregators.Sum('cost')],
151
+ aggregateCollapsed: false,
152
+ collapsed: false,
153
+ },
154
+ },
155
+ {
156
+ id: 'cost',
157
+ name: 'Cost',
158
+ field: 'cost',
159
+ columnGroup: 'Analysis',
160
+ width: 90,
161
+ sortable: true,
162
+ filterable: true,
163
+ filter: { model: Filters.compoundInput },
164
+ formatter: Formatters.dollar,
165
+ groupTotalsFormatter: GroupTotalFormatters.sumTotalsDollar,
166
+ type: 'number',
167
+ grouping: {
168
+ getter: 'cost',
169
+ formatter: (g) => `Cost: ${g.value} <span class="text-primary">(${g.count} items)</span>`,
170
+ aggregators: [new Aggregators.Sum('cost')],
171
+ aggregateCollapsed: true,
172
+ collapsed: true,
173
+ },
174
+ },
175
+ {
176
+ id: 'percentComplete',
177
+ name: '% Complete',
178
+ field: 'percentComplete',
179
+ columnGroup: 'Analysis',
180
+ minWidth: 70,
181
+ width: 90,
182
+ formatter: Formatters.percentCompleteBar,
183
+ type: 'number',
184
+ filterable: true,
185
+ filter: { model: Filters.compoundSlider },
186
+ sortable: true,
187
+ groupTotalsFormatter: GroupTotalFormatters.avgTotalsPercentage,
188
+ grouping: {
189
+ getter: 'percentComplete',
190
+ formatter: (g) => `% Complete: ${g.value} <span class="text-primary">(${g.count} items)</span>`,
191
+ aggregators: [new Aggregators.Sum('cost')],
192
+ aggregateCollapsed: false,
193
+ collapsed: false,
194
+ },
195
+ params: { groupFormatterPrefix: '<i>Avg</i>: ' },
196
+ },
197
+ {
198
+ id: 'effortDriven',
199
+ name: 'Effort-Driven',
200
+ field: 'effortDriven',
201
+ columnGroup: 'Analysis',
202
+ width: 80,
203
+ minWidth: 20,
204
+ maxWidth: 100,
205
+ cssClass: 'cell-effort-driven',
206
+ sortable: true,
207
+ filterable: true,
208
+ filter: {
209
+ collection: [
210
+ { value: '', label: '' },
211
+ { value: true, label: 'True' },
212
+ { value: false, label: 'False' },
213
+ ],
214
+ model: Filters.singleSelect,
215
+ },
216
+ formatter: Formatters.checkmarkMaterial,
217
+ grouping: {
218
+ getter: 'effortDriven',
219
+ formatter: (g) => `Effort-Driven: ${g.value ? 'True' : 'False'} <span class="text-primary">(${g.count} items)</span>`,
220
+ aggregators: [new Aggregators.Sum('duration'), new Aggregators.Sum('cost')],
221
+ collapsed: false,
222
+ },
223
+ },
224
+ ];
225
+
226
+ this.gridOptions = {
227
+ autoResize: {
228
+ container: '#demo-container',
229
+ rightPadding: 10,
230
+ },
231
+ enableDraggableGrouping: true,
232
+ autoEdit: true, // true single click (false for double-click)
233
+ autoCommitEdit: true,
234
+ editable: true,
235
+ enableCellNavigation: true,
236
+
237
+ // pre-header will include our Header Grouping (i.e. "Common Factor")
238
+ // Draggable Grouping could be located in either the Pre-Header OR the new Top-Header
239
+ createPreHeaderPanel: true,
240
+ showPreHeaderPanel: true,
241
+ preHeaderPanelHeight: 30,
242
+
243
+ // when Top-Header is created, it will be used by the Draggable Grouping (otherwise the Pre-Header will be used)
244
+ createTopHeaderPanel: true,
245
+ showTopHeaderPanel: true,
246
+ topHeaderPanelHeight: 35,
247
+
248
+ showCustomFooter: true,
249
+ enableFiltering: true,
250
+ // you could debounce/throttle the input text filter if you have lots of data
251
+ // filterTypingDebounce: 250,
252
+ enableSorting: true,
253
+ textExportOptions: {
254
+ sanitizeDataExport: true,
255
+ },
256
+ gridMenu: {
257
+ onCommand: (e, args) => {
258
+ if (args.command === 'toggle-preheader') {
259
+ // in addition to the grid menu pre-header toggling (internally), we will also clear grouping
260
+ this.clearGrouping();
261
+ }
262
+ },
263
+ },
264
+ draggableGrouping: {
265
+ dropPlaceHolderText: 'Drop a column header here to group by the column',
266
+ // groupIconCssClass: 'mdi mdi-drag-vertical',
267
+ deleteIconCssClass: 'mdi mdi-close text-color-danger',
268
+ sortAscIconCssClass: 'mdi mdi-arrow-up',
269
+ sortDescIconCssClass: 'mdi mdi-arrow-down',
270
+ onGroupChanged: (e, args) => this.onGroupChanged(args),
271
+ onExtensionRegistered: (extension) => (this.draggableGroupingPlugin = extension),
272
+ },
273
+ darkMode: this._darkMode,
274
+ enableTextExport: true,
275
+ enableExcelExport: true,
276
+ excelExportOptions: { sanitizeDataExport: true },
277
+ externalResources: [this.excelExportService, this.textExportService],
278
+ };
279
+
280
+ this.loadData(500);
281
+ }
282
+
283
+ loadData(rowCount: number) {
284
+ // mock a dataset
285
+ const tmpData = [];
286
+ for (let i = 0; i < rowCount; i++) {
287
+ const randomYear = 2000 + Math.floor(Math.random() * 10);
288
+ const randomMonth = Math.floor(Math.random() * 11);
289
+ const randomDay = Math.floor(Math.random() * 29);
290
+ const randomPercent = Math.round(Math.random() * 100);
291
+ const randomCost = Math.round(Math.random() * 10000) / 100;
292
+
293
+ tmpData[i] = {
294
+ id: 'id_' + i,
295
+ num: i,
296
+ title: 'Task ' + i,
297
+ duration: Math.round(Math.random() * 100) + '',
298
+ percentComplete: randomPercent,
299
+ percentCompleteNumber: randomPercent,
300
+ start: new Date(randomYear, randomMonth, randomDay),
301
+ finish: new Date(randomYear, randomMonth + 1, randomDay),
302
+ cost: i % 33 === 0 ? -randomCost : randomCost,
303
+ effortDriven: i % 5 === 0,
304
+ };
305
+ }
306
+ this.dataset = tmpData;
307
+ }
308
+
309
+ clearGroupsAndSelects() {
310
+ this.clearGroupingSelects();
311
+ this.clearGrouping();
312
+ }
313
+
314
+ clearGrouping(invalidateRows = true) {
315
+ this.draggableGroupingPlugin?.clearDroppedGroups();
316
+ if (invalidateRows) {
317
+ this.gridObj?.invalidate(); // invalidate all rows and re-render
318
+ }
319
+ }
320
+
321
+ clearGroupingSelects() {
322
+ this.selectedGroupingFields.forEach((g, i) => (this.selectedGroupingFields[i] = ''));
323
+ }
324
+
325
+ collapseAllGroups() {
326
+ this.dataviewObj.collapseAllGroups();
327
+ }
328
+
329
+ expandAllGroups() {
330
+ this.dataviewObj.expandAllGroups();
331
+ }
332
+
333
+ exportToExcel() {
334
+ this.excelExportService.exportToExcel({
335
+ filename: 'Export',
336
+ format: 'xlsx',
337
+ });
338
+ }
339
+
340
+ exportToCsv(type = 'csv') {
341
+ this.textExportService.exportToFile({
342
+ delimiter: type === 'csv' ? DelimiterType.comma : DelimiterType.tab,
343
+ filename: 'myExport',
344
+ format: type === 'csv' ? 'csv' : 'txt',
345
+ });
346
+ }
347
+
348
+ groupByDurationOrderByCount(sortedByCount = false) {
349
+ this.durationOrderByCount = sortedByCount;
350
+ this.clearGrouping(false);
351
+
352
+ if (this.draggableGroupingPlugin?.setDroppedGroups) {
353
+ this.showPreHeader();
354
+ this.draggableGroupingPlugin.setDroppedGroups('duration');
355
+
356
+ // you need to manually add the sort icon(s) in UI
357
+ const sortColumns = sortedByCount ? [] : [{ columnId: 'duration', sortAsc: true }];
358
+ this.gridObj?.setSortColumns(sortColumns);
359
+ this.gridObj?.invalidate(); // invalidate all rows and re-render
360
+ }
361
+ }
362
+
363
+ groupByDurationEffortDriven() {
364
+ this.clearGrouping(false);
365
+ if (this.draggableGroupingPlugin?.setDroppedGroups) {
366
+ this.showPreHeader();
367
+ this.draggableGroupingPlugin.setDroppedGroups(['duration', 'effortDriven']);
368
+ this.gridObj?.invalidate(); // invalidate all rows and re-render
369
+ }
370
+ }
371
+
372
+ groupByFieldName(_fieldName: string, _index: number) {
373
+ this.clearGrouping();
374
+ if (this.draggableGroupingPlugin && this.draggableGroupingPlugin.setDroppedGroups) {
375
+ // get the field names from Group By select(s) dropdown, but filter out any empty fields
376
+ const groupedFields = this.selectedGroupingFields.filter((g) => g !== '');
377
+
378
+ this.showPreHeader();
379
+ this.draggableGroupingPlugin.setDroppedGroups(groupedFields);
380
+ this.gridObj.invalidate(); // invalidate all rows and re-render
381
+ }
382
+ }
383
+
384
+ onGroupChanged(change: { caller?: string; groupColumns: Grouping[] }) {
385
+ // the "caller" property might not be in the SlickGrid core lib yet, reference PR https://github.com/6pac/SlickGrid/pull/303
386
+ const caller = (change && change.caller) || [];
387
+ const groups = (change && change.groupColumns) || [];
388
+
389
+ if (Array.isArray(this.selectedGroupingFields) && Array.isArray(groups) && groups.length > 0) {
390
+ // update all Group By select dropdown
391
+ this.selectedGroupingFields.forEach((g, i) => (this.selectedGroupingFields[i] = (groups[i] && groups[i].getter) || ''));
392
+ } else if (groups.length === 0 && caller === 'remove-group') {
393
+ this.clearGroupingSelects();
394
+ }
395
+ }
396
+
397
+ onCellChanged() {
398
+ // when user changes a cell, we need to advise the DataView for the grouping to update its totals
399
+ this.angularGrid.dataView?.refresh();
400
+ }
401
+
402
+ showPreHeader() {
403
+ this.gridObj.setPreHeaderPanelVisibility(true);
404
+ }
405
+
406
+ selectTrackByFn(index: number, _item: any) {
407
+ return index;
408
+ }
409
+
410
+ setFiltersDynamically() {
411
+ // we can Set Filters Dynamically (or different filters) afterward through the FilterService
412
+ this.angularGrid.filterService.updateFilters([
413
+ { columnId: 'percentComplete', operator: '>=', searchTerms: ['55'] },
414
+ { columnId: 'cost', operator: '<', searchTerms: ['80'] },
415
+ ]);
416
+ }
417
+
418
+ setSortingDynamically() {
419
+ this.angularGrid.sortService.updateSorting([
420
+ // orders matter, whichever is first in array will be the first sorted column
421
+ { columnId: 'percentComplete', direction: 'ASC' },
422
+ ]);
423
+ }
424
+
425
+ toggleDraggableGroupingRow() {
426
+ this.clearGrouping();
427
+ this.gridObj.setPreHeaderPanelVisibility(!this.gridObj.getOptions().showPreHeaderPanel);
428
+ }
429
+
430
+ toggleDarkMode() {
431
+ this._darkMode = !this._darkMode;
432
+ this.toggleBodyBackground();
433
+ this.angularGrid.slickGrid?.setOptions({ darkMode: this._darkMode });
434
+ }
435
+
436
+ toggleBodyBackground() {
437
+ if (this._darkMode) {
438
+ document.querySelector<HTMLDivElement>('.panel-wm-content')!.classList.add('dark-mode');
439
+ document.querySelector<HTMLDivElement>('#demo-container')!.dataset.bsTheme = 'dark';
440
+ } else {
441
+ document.querySelector('.panel-wm-content')!.classList.remove('dark-mode');
442
+ document.querySelector<HTMLDivElement>('#demo-container')!.dataset.bsTheme = 'light';
443
+ }
444
+ }
445
+ }
@@ -0,0 +1,40 @@
1
+ <div class="container-fluid">
2
+ <h3>{{ model?.title }}</h3>
3
+ <div class="row">
4
+ <div class="col-3 detail-label"><label>Assignee:</label> <input class="form-control" [(ngModel)]="model.assignee" /></div>
5
+ <div class="col-3 detail-label">
6
+ <label>Reporter:</label> <span>{{ model?.reporter }}</span>
7
+ </div>
8
+ <div class="col-3 detail-label">
9
+ <label>Duration:</label> <span>{{ model?.duration | number: '1.2-2' }}</span>
10
+ </div>
11
+ <div class="col-3 detail-label">
12
+ <label>% Complete:</label> <span>{{ model?.percentComplete }}</span>
13
+ </div>
14
+ </div>
15
+
16
+ <div class="row">
17
+ <div class="col-3 detail-label">
18
+ <label>Start:</label> <span>{{ model?.start | date: 'yyyy-MM-dd' }}</span>
19
+ </div>
20
+ <div class="col-3 detail-label">
21
+ <label>Finish:</label> <span>{{ model?.finish | date: 'yyyy-MM-dd' }}</span>
22
+ </div>
23
+ <div class="col-3 detail-label"><label>Effort Driven:</label> <i [class]="model?.effortDriven ? 'mdi mdi-check' : ''"></i></div>
24
+ </div>
25
+
26
+ <hr />
27
+
28
+ <div class="col-sm-8">
29
+ <h4>
30
+ Find out who is the Assignee
31
+ <small>
32
+ <button class="btn btn-primary btn-sm" (click)="alertAssignee(model?.assignee)" data-test="assignee-btn">Click Me</button>
33
+ </small>
34
+ </h4>
35
+ </div>
36
+ <div class="col-sm-4">
37
+ <button class="btn btn-primary btn-danger btn-sm" (click)="deleteRow(model)" data-test="delete-btn">Delete Row</button>
38
+ <button class="btn btn-outline-secondary btn-sm" (click)="callParentMethod(model)" data-test="parent-btn">Call Parent Method</button>
39
+ </div>
40
+ </div>
@@ -0,0 +1,54 @@
1
+ import { Component } from '@angular/core';
2
+ import { SlickDataView, SlickGrid } from '../../library';
3
+ import { Example19Component } from './example19.component';
4
+
5
+ @Component({
6
+ styles: ['.detail-label { display: inline-flex; align-items: center; gap: 4px; padding: 4px; }', 'label { font-weight: 600; }'],
7
+ templateUrl: './example19-rowdetail.component.html',
8
+ standalone: false,
9
+ })
10
+ export class Example19RowDetailComponent {
11
+ model!: {
12
+ duration: Date;
13
+ percentComplete: number;
14
+ reporter: string;
15
+ start: Date;
16
+ finish: Date;
17
+ effortDriven: boolean;
18
+ assignee: string;
19
+ title: string;
20
+ };
21
+
22
+ // you also have access to the following objects (it must match the exact property names shown below)
23
+ addon: any; // row detail addon instance
24
+ grid!: SlickGrid;
25
+ dataView!: SlickDataView;
26
+
27
+ // you can also optionally use the Parent Component reference
28
+ // NOTE that you MUST provide it through the "parentRef" property in your "rowDetail" grid options
29
+ parentRef!: Example19Component;
30
+
31
+ alertAssignee(name: string) {
32
+ if (typeof name === 'string') {
33
+ alert(`Assignee on this task is: ${name.toUpperCase()}`);
34
+ } else {
35
+ alert('No one is assigned to this task.');
36
+ }
37
+ }
38
+
39
+ deleteRow(model: any) {
40
+ if (confirm(`Are you sure that you want to delete ${model.title}?`)) {
41
+ // you first need to collapse all rows (via the 3rd party addon instance)
42
+ this.addon.collapseAll();
43
+
44
+ // then you can delete the item from the dataView
45
+ this.dataView.deleteItem(model.rowId);
46
+
47
+ this.parentRef.showFlashMessage(`Deleted row with ${model.title}`, 'danger');
48
+ }
49
+ }
50
+
51
+ callParentMethod(model: any) {
52
+ this.parentRef.showFlashMessage(`We just called Parent Method from the Row Detail Child Component on ${model.title}`);
53
+ }
54
+ }
@@ -0,0 +1,79 @@
1
+ <div class="container-fluid">
2
+ <h2>
3
+ Example 19: Row Detail View
4
+ <span class="float-end">
5
+ <a
6
+ style="font-size: 18px"
7
+ target="_blank"
8
+ href="https://github.com/ghiscoding/slickgrid-universal/blob/master/frameworks/angular-slickgrid/src/demos/examples/grid-rowdetail.component.ts"
9
+ >
10
+ <span class="mdi mdi-link-variant"></span> code
11
+ </a>
12
+ </span>
13
+ <button class="ms-2 btn btn-outline-secondary btn-sm btn-icon" type="button" data-test="toggle-subtitle" (click)="toggleSubTitle()">
14
+ <span class="mdi mdi-information-outline" title="Toggle example sub-title details"></span>
15
+ </button>
16
+ <button class="btn btn-outline-secondary btn-sm btn-icon" (click)="toggleDarkMode()" data-test="toggle-dark-mode">
17
+ <span class="mdi mdi-theme-light-dark"></span>
18
+ <span>Toggle Dark Mode</span>
19
+ </button>
20
+ </h2>
21
+ <div class="subtitle">
22
+ Add functionality to show extra information with a Row Detail View, (<a
23
+ href="https://ghiscoding.gitbook.io/angular-slickgrid/grid-functionalities/row-detail"
24
+ target="_blank"
25
+ >Wiki docs</a
26
+ >)
27
+ <ul>
28
+ <li>Click on the row "+" icon or anywhere on the row to open it (the latter can be changed via property "useRowClick: false")</li>
29
+ <li>Pass a View/Model as a Template to the Row Detail</li>
30
+ <li>
31
+ You can use "expandableOverride()" callback to override logic to display expand icon on every row (for example only show it every
32
+ 2nd row)
33
+ </li>
34
+ </ul>
35
+ </div>
36
+
37
+ <div class="row">
38
+ <div class="col-sm-6">
39
+ <button class="btn btn-outline-secondary btn-sm btn-icon" (click)="changeEditableGrid()" data-test="editable-grid-btn">
40
+ Make Grid Editable
41
+ </button>
42
+ <button class="btn btn-outline-secondary btn-sm btn-icon" (click)="closeAllRowDetail()" data-test="collapse-all-btn">
43
+ Close All Row Details
44
+ </button>
45
+ &nbsp;&nbsp;
46
+
47
+ <span class="d-inline-flex gap-4px">
48
+ <label for="detailViewRowCount">Detail View Rows Shown: </label>
49
+ <input id="detailViewRowCount" type="number" style="height: 22px; width: 40px" [(ngModel)]="detailViewRowCount" />
50
+ <button class="btn btn-outline-secondary btn-xs btn-icon" (click)="changeDetailViewRowCount()" data-test="set-count-btn">
51
+ Set
52
+ </button>
53
+ <label for="serverdelay" class="ms-2">Server Delay: </label>
54
+ <input
55
+ id="serverdelay"
56
+ [(ngModel)]="serverWaitDelay"
57
+ type="number"
58
+ data-test="server-delay"
59
+ style="height: 26px; width: 55px"
60
+ title="input a fake timer delay to simulate slow server response"
61
+ />
62
+ </span>
63
+ </div>
64
+ <div class="alert alert-{{ flashAlertType }} col-sm-6" *ngIf="message" data-test="flash-msg">
65
+ {{ message }}
66
+ </div>
67
+ </div>
68
+
69
+ <hr />
70
+
71
+ <angular-slickgrid
72
+ gridId="grid19"
73
+ [columns]="columnDefinitions"
74
+ [options]="gridOptions"
75
+ [dataset]="dataset"
76
+ (onAngularGridCreated)="angularGridReady($event.detail)"
77
+ >
78
+ </angular-slickgrid>
79
+ </div>