data-grid-workspace 0.0.120

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 (325) hide show
  1. package/.editorconfig +16 -0
  2. package/.vscode/extensions.json +4 -0
  3. package/.vscode/launch.json +20 -0
  4. package/.vscode/tasks.json +42 -0
  5. package/README.md +265 -0
  6. package/angular.json +144 -0
  7. package/backup-04112025/projects/data-grid/README.md +24 -0
  8. package/backup-04112025/projects/data-grid/ng-package.json +18 -0
  9. package/backup-04112025/projects/data-grid/package-lock.json +25 -0
  10. package/backup-04112025/projects/data-grid/package.json +23 -0
  11. package/backup-04112025/projects/data-grid/src/lib/css/bootstrap.css +12043 -0
  12. package/backup-04112025/projects/data-grid/src/lib/data-grid/animations.ts +228 -0
  13. package/backup-04112025/projects/data-grid/src/lib/data-grid/data-grid.component.html +5356 -0
  14. package/backup-04112025/projects/data-grid/src/lib/data-grid/data-grid.component.scss +2005 -0
  15. package/backup-04112025/projects/data-grid/src/lib/data-grid/data-grid.component.spec.ts +28 -0
  16. package/backup-04112025/projects/data-grid/src/lib/data-grid/data-grid.component.ts +5368 -0
  17. package/backup-04112025/projects/data-grid/src/lib/data-grid/statuses.ts +49 -0
  18. package/backup-04112025/projects/data-grid/src/lib/data-grid.module.ts +19 -0
  19. package/backup-04112025/projects/data-grid/src/lib/data-grid.service.spec.ts +16 -0
  20. package/backup-04112025/projects/data-grid/src/lib/data-grid.service.ts +9 -0
  21. package/backup-04112025/projects/data-grid/src/lib/directives/draggable-header.directive.spec.ts +11 -0
  22. package/backup-04112025/projects/data-grid/src/lib/directives/draggable-header.directive.ts +172 -0
  23. package/backup-04112025/projects/data-grid/src/lib/pipes/filter.pipe.spec.ts +11 -0
  24. package/backup-04112025/projects/data-grid/src/lib/pipes/filter.pipe.ts +22 -0
  25. package/backup-04112025/projects/data-grid/src/lib/services/cell-selection.service.spec.ts +16 -0
  26. package/backup-04112025/projects/data-grid/src/lib/services/cell-selection.service.ts +205 -0
  27. package/backup-04112025/projects/data-grid/src/lib/services/common.service.spec.ts +16 -0
  28. package/backup-04112025/projects/data-grid/src/lib/services/common.service.ts +278 -0
  29. package/backup-04112025/projects/data-grid/src/lib/services/copy-service.service.spec.ts +16 -0
  30. package/backup-04112025/projects/data-grid/src/lib/services/copy-service.service.ts +252 -0
  31. package/backup-04112025/projects/data-grid/src/lib/services/drag-drp.service.spec.ts +16 -0
  32. package/backup-04112025/projects/data-grid/src/lib/services/drag-drp.service.ts +58 -0
  33. package/backup-04112025/projects/data-grid/src/lib/services/export.service.spec.ts +16 -0
  34. package/backup-04112025/projects/data-grid/src/lib/services/export.service.ts +189 -0
  35. package/backup-04112025/projects/data-grid/src/lib/services/split-columns.service.spec.ts +16 -0
  36. package/backup-04112025/projects/data-grid/src/lib/services/split-columns.service.ts +148 -0
  37. package/backup-04112025/projects/data-grid/src/lib/services/swap-columns.service.spec.ts +16 -0
  38. package/backup-04112025/projects/data-grid/src/lib/services/swap-columns.service.ts +162 -0
  39. package/backup-04112025/projects/data-grid/src/public-api.ts +6 -0
  40. package/backup-04112025/projects/data-grid/src/typings.d.ts +4 -0
  41. package/backup-04112025/projects/data-grid/tsconfig.lib.json +19 -0
  42. package/backup-04112025/projects/data-grid/tsconfig.lib.prod.json +10 -0
  43. package/backup-04112025/projects/data-grid/tsconfig.spec.json +14 -0
  44. package/backup-29-10-2025/projects/data-grid/README.md +24 -0
  45. package/backup-29-10-2025/projects/data-grid/ng-package.json +10 -0
  46. package/backup-29-10-2025/projects/data-grid/package-lock.json +25 -0
  47. package/backup-29-10-2025/projects/data-grid/package.json +12 -0
  48. package/backup-29-10-2025/projects/data-grid/src/lib/css/bootstrap.css +12043 -0
  49. package/backup-29-10-2025/projects/data-grid/src/lib/data-grid/animations.ts +228 -0
  50. package/backup-29-10-2025/projects/data-grid/src/lib/data-grid/data-grid.component.html +5236 -0
  51. package/backup-29-10-2025/projects/data-grid/src/lib/data-grid/data-grid.component.scss +1717 -0
  52. package/backup-29-10-2025/projects/data-grid/src/lib/data-grid/data-grid.component.spec.ts +28 -0
  53. package/backup-29-10-2025/projects/data-grid/src/lib/data-grid/data-grid.component.ts +5092 -0
  54. package/backup-29-10-2025/projects/data-grid/src/lib/data-grid/statuses.ts +47 -0
  55. package/backup-29-10-2025/projects/data-grid/src/lib/data-grid.module.ts +19 -0
  56. package/backup-29-10-2025/projects/data-grid/src/lib/data-grid.service.spec.ts +16 -0
  57. package/backup-29-10-2025/projects/data-grid/src/lib/data-grid.service.ts +9 -0
  58. package/backup-29-10-2025/projects/data-grid/src/lib/directives/draggable-header.directive.spec.ts +11 -0
  59. package/backup-29-10-2025/projects/data-grid/src/lib/directives/draggable-header.directive.ts +172 -0
  60. package/backup-29-10-2025/projects/data-grid/src/lib/pipes/filter.pipe.spec.ts +11 -0
  61. package/backup-29-10-2025/projects/data-grid/src/lib/pipes/filter.pipe.ts +22 -0
  62. package/backup-29-10-2025/projects/data-grid/src/lib/services/cell-selection.service.spec.ts +16 -0
  63. package/backup-29-10-2025/projects/data-grid/src/lib/services/cell-selection.service.ts +205 -0
  64. package/backup-29-10-2025/projects/data-grid/src/lib/services/common.service.spec.ts +16 -0
  65. package/backup-29-10-2025/projects/data-grid/src/lib/services/common.service.ts +274 -0
  66. package/backup-29-10-2025/projects/data-grid/src/lib/services/copy-service.service.spec.ts +16 -0
  67. package/backup-29-10-2025/projects/data-grid/src/lib/services/copy-service.service.ts +251 -0
  68. package/backup-29-10-2025/projects/data-grid/src/lib/services/drag-drp.service.spec.ts +16 -0
  69. package/backup-29-10-2025/projects/data-grid/src/lib/services/drag-drp.service.ts +58 -0
  70. package/backup-29-10-2025/projects/data-grid/src/lib/services/split-columns.service.spec.ts +16 -0
  71. package/backup-29-10-2025/projects/data-grid/src/lib/services/split-columns.service.ts +148 -0
  72. package/backup-29-10-2025/projects/data-grid/src/lib/services/swap-columns.service.spec.ts +16 -0
  73. package/backup-29-10-2025/projects/data-grid/src/lib/services/swap-columns.service.ts +162 -0
  74. package/backup-29-10-2025/projects/data-grid/src/public-api.ts +6 -0
  75. package/backup-29-10-2025/projects/data-grid/tsconfig.lib.json +16 -0
  76. package/backup-29-10-2025/projects/data-grid/tsconfig.lib.prod.json +10 -0
  77. package/backup-29-10-2025/projects/data-grid/tsconfig.spec.json +14 -0
  78. package/image.png +0 -0
  79. package/package.json +52 -0
  80. package/projects/data-grid/README.md +324 -0
  81. package/projects/data-grid/ng-package.json +19 -0
  82. package/projects/data-grid/package-lock.json +25 -0
  83. package/projects/data-grid/package.json +38 -0
  84. package/projects/data-grid/src/lib/assets/fonts/Inter/Inter-Italic-VariableFont_opsz,wght.ttf +0 -0
  85. package/projects/data-grid/src/lib/assets/fonts/Inter/Inter-VariableFont_opsz,wght.ttf +0 -0
  86. package/projects/data-grid/src/lib/assets/fonts/Inter/OFL.txt +93 -0
  87. package/projects/data-grid/src/lib/assets/fonts/Inter/README.txt +118 -0
  88. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-Black.ttf +0 -0
  89. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-BlackItalic.ttf +0 -0
  90. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-Bold.ttf +0 -0
  91. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-BoldItalic.ttf +0 -0
  92. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-ExtraBold.ttf +0 -0
  93. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-ExtraBoldItalic.ttf +0 -0
  94. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-ExtraLight.ttf +0 -0
  95. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-ExtraLightItalic.ttf +0 -0
  96. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-Italic.ttf +0 -0
  97. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-Light.ttf +0 -0
  98. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-LightItalic.ttf +0 -0
  99. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-Medium.ttf +0 -0
  100. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-MediumItalic.ttf +0 -0
  101. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-Regular.ttf +0 -0
  102. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-SemiBold.ttf +0 -0
  103. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-SemiBoldItalic.ttf +0 -0
  104. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-Thin.ttf +0 -0
  105. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_18pt-ThinItalic.ttf +0 -0
  106. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-Black.ttf +0 -0
  107. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-BlackItalic.ttf +0 -0
  108. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-Bold.ttf +0 -0
  109. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-BoldItalic.ttf +0 -0
  110. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-ExtraBold.ttf +0 -0
  111. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-ExtraBoldItalic.ttf +0 -0
  112. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-ExtraLight.ttf +0 -0
  113. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-ExtraLightItalic.ttf +0 -0
  114. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-Italic.ttf +0 -0
  115. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-Light.ttf +0 -0
  116. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-LightItalic.ttf +0 -0
  117. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-Medium.ttf +0 -0
  118. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-MediumItalic.ttf +0 -0
  119. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-Regular.ttf +0 -0
  120. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-SemiBold.ttf +0 -0
  121. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-SemiBoldItalic.ttf +0 -0
  122. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-Thin.ttf +0 -0
  123. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_24pt-ThinItalic.ttf +0 -0
  124. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-Black.ttf +0 -0
  125. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-BlackItalic.ttf +0 -0
  126. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-Bold.ttf +0 -0
  127. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-BoldItalic.ttf +0 -0
  128. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-ExtraBold.ttf +0 -0
  129. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-ExtraBoldItalic.ttf +0 -0
  130. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-ExtraLight.ttf +0 -0
  131. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-ExtraLightItalic.ttf +0 -0
  132. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-Italic.ttf +0 -0
  133. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-Light.ttf +0 -0
  134. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-LightItalic.ttf +0 -0
  135. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-Medium.ttf +0 -0
  136. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-MediumItalic.ttf +0 -0
  137. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-Regular.ttf +0 -0
  138. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-SemiBold.ttf +0 -0
  139. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-SemiBoldItalic.ttf +0 -0
  140. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-Thin.ttf +0 -0
  141. package/projects/data-grid/src/lib/assets/fonts/Inter/static/Inter_28pt-ThinItalic.ttf +0 -0
  142. package/projects/data-grid/src/lib/css/bootstrap.css +12043 -0
  143. package/projects/data-grid/src/lib/data-grid/animations.ts +267 -0
  144. package/projects/data-grid/src/lib/data-grid/data-grid.component.html +5759 -0
  145. package/projects/data-grid/src/lib/data-grid/data-grid.component.scss +2154 -0
  146. package/projects/data-grid/src/lib/data-grid/data-grid.component.spec.ts +28 -0
  147. package/projects/data-grid/src/lib/data-grid/data-grid.component.ts +6773 -0
  148. package/projects/data-grid/src/lib/data-grid/data-grid.tokens.ts +4 -0
  149. package/projects/data-grid/src/lib/data-grid/statuses.ts +49 -0
  150. package/projects/data-grid/src/lib/data-grid.module.ts +23 -0
  151. package/projects/data-grid/src/lib/data-grid.service.spec.ts +16 -0
  152. package/projects/data-grid/src/lib/data-grid.service.ts +9 -0
  153. package/projects/data-grid/src/lib/directives/cell-editor.directive.spec.ts +11 -0
  154. package/projects/data-grid/src/lib/directives/cell-editor.directive.ts +88 -0
  155. package/projects/data-grid/src/lib/directives/cell-render-init.directive.spec.ts +11 -0
  156. package/projects/data-grid/src/lib/directives/cell-render-init.directive.ts +98 -0
  157. package/projects/data-grid/src/lib/directives/cellHost.directive.spec.ts +11 -0
  158. package/projects/data-grid/src/lib/directives/cellHost.directive.ts +10 -0
  159. package/projects/data-grid/src/lib/directives/draggable-header.directive.spec.ts +11 -0
  160. package/projects/data-grid/src/lib/directives/draggable-header.directive.ts +172 -0
  161. package/projects/data-grid/src/lib/interfaces/data-grid-config.ts.ts +136 -0
  162. package/projects/data-grid/src/lib/pipes/filter.pipe.spec.ts +11 -0
  163. package/projects/data-grid/src/lib/pipes/filter.pipe.ts +22 -0
  164. package/projects/data-grid/src/lib/pipes/format-currency.pipe.spec.ts +11 -0
  165. package/projects/data-grid/src/lib/pipes/format-currency.pipe.ts +59 -0
  166. package/projects/data-grid/src/lib/pipes/format-index.pipe.spec.ts +11 -0
  167. package/projects/data-grid/src/lib/pipes/format-index.pipe.ts +20 -0
  168. package/projects/data-grid/src/lib/services/cell-selection.service.spec.ts +16 -0
  169. package/projects/data-grid/src/lib/services/cell-selection.service.ts +372 -0
  170. package/projects/data-grid/src/lib/services/common.service.spec.ts +16 -0
  171. package/projects/data-grid/src/lib/services/common.service.ts +395 -0
  172. package/projects/data-grid/src/lib/services/copy-service.service.spec.ts +16 -0
  173. package/projects/data-grid/src/lib/services/copy-service.service.ts +252 -0
  174. package/projects/data-grid/src/lib/services/drag-drp.service.spec.ts +16 -0
  175. package/projects/data-grid/src/lib/services/drag-drp.service.ts +58 -0
  176. package/projects/data-grid/src/lib/services/export.service.spec.ts +16 -0
  177. package/projects/data-grid/src/lib/services/export.service.ts +189 -0
  178. package/projects/data-grid/src/lib/services/row-action.service.ts +203 -0
  179. package/projects/data-grid/src/lib/services/split-columns.service.spec.ts +16 -0
  180. package/projects/data-grid/src/lib/services/split-columns.service.ts +168 -0
  181. package/projects/data-grid/src/lib/services/swap-columns.service.spec.ts +16 -0
  182. package/projects/data-grid/src/lib/services/swap-columns.service.ts +162 -0
  183. package/projects/data-grid/src/lib/styles/font-style.css +34 -0
  184. package/projects/data-grid/src/public-api.ts +8 -0
  185. package/projects/data-grid/src/typings.d.ts +4 -0
  186. package/projects/data-grid/tsconfig.lib.json +19 -0
  187. package/projects/data-grid/tsconfig.lib.prod.json +10 -0
  188. package/projects/data-grid/tsconfig.spec.json +14 -0
  189. package/src/app/app.component.html +61 -0
  190. package/src/app/app.component.scss +1 -0
  191. package/src/app/app.component.spec.ts +27 -0
  192. package/src/app/app.component.ts +166 -0
  193. package/src/app/app.module.ts +33 -0
  194. package/src/app/dropdown-filter/dropdown-filter.component.css +122 -0
  195. package/src/app/dropdown-filter/dropdown-filter.component.html +118 -0
  196. package/src/app/dropdown-filter/dropdown-filter.component.spec.ts +28 -0
  197. package/src/app/dropdown-filter/dropdown-filter.component.ts +139 -0
  198. package/src/app/status-cell/status-cell.component.css +0 -0
  199. package/src/app/status-cell/status-cell.component.html +1 -0
  200. package/src/app/status-cell/status-cell.component.spec.ts +28 -0
  201. package/src/app/status-cell/status-cell.component.ts +18 -0
  202. package/src/app/status-cell-editor/status-cell-editor.component.css +0 -0
  203. package/src/app/status-cell-editor/status-cell-editor.component.html +12 -0
  204. package/src/app/status-cell-editor/status-cell-editor.component.spec.ts +28 -0
  205. package/src/app/status-cell-editor/status-cell-editor.component.ts +77 -0
  206. package/src/app/sub-category-cell-component/sub-category-cell-component.component.css +6 -0
  207. package/src/app/sub-category-cell-component/sub-category-cell-component.component.html +3 -0
  208. package/src/app/sub-category-cell-component/sub-category-cell-component.component.spec.ts +28 -0
  209. package/src/app/sub-category-cell-component/sub-category-cell-component.component.ts +26 -0
  210. package/src/app/testing-data/api-translation/data.ts +1929 -0
  211. package/src/app/testing-data/assets-category/data.ts +1410 -0
  212. package/src/app/testing-data/assets-list/data.ts +26633 -0
  213. package/src/app/testing-data/invoices/data.ts +3698 -0
  214. package/src/app/testing-data/manage-employee/data.ts +83205 -0
  215. package/src/app/testing-data/single-day-timesheet/data.ts +4450 -0
  216. package/src/app/testing-data/task-management/tasks.ts +2536 -0
  217. package/src/app/testing-data/translation.ts +135580 -0
  218. package/src/app/testing-data/writeup/data.ts +29506 -0
  219. package/src/assets/.gitkeep +0 -0
  220. package/src/assets/data-grid/document-icons/Newxlsx.svg +19 -0
  221. package/src/assets/data-grid/document-icons/Presentation.pptx +0 -0
  222. package/src/assets/data-grid/document-icons/Untitled spreadsheet.xlsx +0 -0
  223. package/src/assets/data-grid/document-icons/bell-icon.svg +31 -0
  224. package/src/assets/data-grid/document-icons/blank sheet ppt.pptx +0 -0
  225. package/src/assets/data-grid/document-icons/blank-docs-file.docx +0 -0
  226. package/src/assets/data-grid/document-icons/csv.svg +34 -0
  227. package/src/assets/data-grid/document-icons/doc.svg +34 -0
  228. package/src/assets/data-grid/document-icons/document-download.svg +18 -0
  229. package/src/assets/data-grid/document-icons/document-upload.svg +6 -0
  230. package/src/assets/data-grid/document-icons/docx.svg +35 -0
  231. package/src/assets/data-grid/document-icons/downloadDOC.svg +7 -0
  232. package/src/assets/data-grid/document-icons/edit-doc.svg +6 -0
  233. package/src/assets/data-grid/document-icons/empty-trash.svg +47 -0
  234. package/src/assets/data-grid/document-icons/jpeg.svg +40 -0
  235. package/src/assets/data-grid/document-icons/jpg.svg +24 -0
  236. package/src/assets/data-grid/document-icons/loading gif.gif +0 -0
  237. package/src/assets/data-grid/document-icons/more-Icon.svg +19 -0
  238. package/src/assets/data-grid/document-icons/mp4.svg +28 -0
  239. package/src/assets/data-grid/document-icons/my-request-empty.svg +37 -0
  240. package/src/assets/data-grid/document-icons/newDoc.svg +16 -0
  241. package/src/assets/data-grid/document-icons/newppt.svg +16 -0
  242. package/src/assets/data-grid/document-icons/overDue.svg +8 -0
  243. package/src/assets/data-grid/document-icons/ownerShare.svg +13 -0
  244. package/src/assets/data-grid/document-icons/pdf.svg +36 -0
  245. package/src/assets/data-grid/document-icons/permanantDelete.svg +4 -0
  246. package/src/assets/data-grid/document-icons/png.svg +53 -0
  247. package/src/assets/data-grid/document-icons/ppt.svg +24 -0
  248. package/src/assets/data-grid/document-icons/pptx.svg +25 -0
  249. package/src/assets/data-grid/document-icons/restore-delete.svg +4 -0
  250. package/src/assets/data-grid/document-icons/restoreTrash.svg +10 -0
  251. package/src/assets/data-grid/document-icons/send-2.svg +16 -0
  252. package/src/assets/data-grid/document-icons/send-request-empty.svg +41 -0
  253. package/src/assets/data-grid/document-icons/shareIcon.svg +6 -0
  254. package/src/assets/data-grid/document-icons/sharedFileIcon.svg +6 -0
  255. package/src/assets/data-grid/document-icons/sharedriveempty.svg +40 -0
  256. package/src/assets/data-grid/document-icons/task-square.svg +25 -0
  257. package/src/assets/data-grid/document-icons/trash-01.svg +3 -0
  258. package/src/assets/data-grid/document-icons/trashRestore.svg +4 -0
  259. package/src/assets/data-grid/document-icons/txt.svg +34 -0
  260. package/src/assets/data-grid/document-icons/uploadFile.svg +16 -0
  261. package/src/assets/data-grid/document-icons/uploadfilefolder.svg +40 -0
  262. package/src/assets/data-grid/document-icons/xls.svg +34 -0
  263. package/src/assets/data-grid/document-icons/xlsx.svg +36 -0
  264. package/src/assets/data-grid/icons/Buttons.svg +3 -0
  265. package/src/assets/data-grid/icons/High.svg +3 -0
  266. package/src/assets/data-grid/icons/Low.svg +3 -0
  267. package/src/assets/data-grid/icons/Medium.svg +3 -0
  268. package/src/assets/data-grid/icons/Vector.svg +3 -0
  269. package/src/assets/data-grid/icons/arrow-counterclockwise.svg +4 -0
  270. package/src/assets/data-grid/icons/arrow-down.svg +3 -0
  271. package/src/assets/data-grid/icons/arrow-left.svg +3 -0
  272. package/src/assets/data-grid/icons/arrow-right-solid-full.svg +1 -0
  273. package/src/assets/data-grid/icons/arrow-right.svg +10 -0
  274. package/src/assets/data-grid/icons/arrow-up.svg +3 -0
  275. package/src/assets/data-grid/icons/arrows-angle-expand.svg +3 -0
  276. package/src/assets/data-grid/icons/arrows-expand-vertical.svg +3 -0
  277. package/src/assets/data-grid/icons/arrows-move.svg +3 -0
  278. package/src/assets/data-grid/icons/attachments.svg +3 -0
  279. package/src/assets/data-grid/icons/ban.svg +3 -0
  280. package/src/assets/data-grid/icons/check-blue.svg +3 -0
  281. package/src/assets/data-grid/icons/chevron-down.svg +3 -0
  282. package/src/assets/data-grid/icons/chevron-right.svg +3 -0
  283. package/src/assets/data-grid/icons/comments.svg +3 -0
  284. package/src/assets/data-grid/icons/cross-primary.svg +3 -0
  285. package/src/assets/data-grid/icons/dash.svg +3 -0
  286. package/src/assets/data-grid/icons/delete.svg +3 -0
  287. package/src/assets/data-grid/icons/diagram-3.svg +3 -0
  288. package/src/assets/data-grid/icons/download.svg +5 -0
  289. package/src/assets/data-grid/icons/edit.svg +3 -0
  290. package/src/assets/data-grid/icons/expend.svg +3 -0
  291. package/src/assets/data-grid/icons/eye-cross.svg +10 -0
  292. package/src/assets/data-grid/icons/eye.svg +4 -0
  293. package/src/assets/data-grid/icons/filter-2.svg +5 -0
  294. package/src/assets/data-grid/icons/grid-3x2-gap.svg +3 -0
  295. package/src/assets/data-grid/icons/grip-vertical.svg +8 -0
  296. package/src/assets/data-grid/icons/horizontal-dots.svg +5 -0
  297. package/src/assets/data-grid/icons/justify.svg +3 -0
  298. package/src/assets/data-grid/icons/layout-three-columns.svg +3 -0
  299. package/src/assets/data-grid/icons/list-details.svg +8 -0
  300. package/src/assets/data-grid/icons/minimize.svg +4 -0
  301. package/src/assets/data-grid/icons/pin-blue.svg +5 -0
  302. package/src/assets/data-grid/icons/pin-left.svg +3 -0
  303. package/src/assets/data-grid/icons/pin-right.svg +3 -0
  304. package/src/assets/data-grid/icons/pin.svg +5 -0
  305. package/src/assets/data-grid/icons/plus.svg +3 -0
  306. package/src/assets/data-grid/icons/resize-handle.svg +3 -0
  307. package/src/assets/data-grid/icons/search.svg +3 -0
  308. package/src/assets/data-grid/icons/settings-2.svg +3 -0
  309. package/src/assets/data-grid/icons/sort-asc.svg +4 -0
  310. package/src/assets/data-grid/icons/sort-desc.svg +4 -0
  311. package/src/assets/data-grid/icons/star-blue.svg +3 -0
  312. package/src/assets/data-grid/icons/star.svg +3 -0
  313. package/src/assets/data-grid/icons/table-2.svg +3 -0
  314. package/src/assets/data-grid/icons/three-dots-vertical.svg +5 -0
  315. package/src/assets/data-grid/icons/trash-red.svg +7 -0
  316. package/src/assets/data-grid/icons/ui-checks-grid.svg +3 -0
  317. package/src/assets/data-grid/icons/x.svg +3 -0
  318. package/src/assets/data-grid/icons/zoom-charge.svg +4 -0
  319. package/src/favicon.ico +0 -0
  320. package/src/index.html +19 -0
  321. package/src/main.ts +7 -0
  322. package/src/styles.scss +3 -0
  323. package/tsconfig.app.json +14 -0
  324. package/tsconfig.json +44 -0
  325. package/tsconfig.spec.json +14 -0
@@ -0,0 +1,58 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { moveItemInArray } from '@angular/cdk/drag-drop';
3
+
4
+ @Injectable({
5
+ providedIn: 'root',
6
+ })
7
+ export class DragDrpService {
8
+ constructor() {}
9
+
10
+ // sortChildColumnInGroup(
11
+ // columns: any[],
12
+ // draggedChild: any,
13
+ // section: 'leftPinnedColumns' | 'centerColumns' | 'rightPinnedColumns',
14
+ // previousIndex: number,
15
+ // currentIndex: number
16
+ // ): any {
17
+ // const pinned =
18
+ // section === 'leftPinnedColumns'
19
+ // ? 'left'
20
+ // : section === 'rightPinnedColumns'
21
+ // ? 'right'
22
+ // : null;
23
+
24
+ // const group = columns.find(
25
+ // (col: any) =>
26
+ // Array.isArray(col.children) &&
27
+ // col.children.some((child: any) => child?.field === draggedChild?.field)
28
+ // );
29
+
30
+ // if (!group) return;
31
+
32
+ // const groupIndex = columns.findIndex((col) => col.header === group.header);
33
+ // const filteredGroup = group.children.filter(
34
+ // (col: any) => col.pinned === pinned
35
+ // );
36
+
37
+ // const prevField = filteredGroup[previousIndex]?.field;
38
+ // const currField = filteredGroup[currentIndex]?.field;
39
+
40
+ // const visiblePrevIndex = group.children.findIndex(
41
+ // (col: any) => col.field === prevField
42
+ // );
43
+ // const visibleCurrIndex = group.children.findIndex(
44
+ // (col: any) => col.field === currField
45
+ // );
46
+
47
+ // moveItemInArray(
48
+ // columns[groupIndex]?.children,
49
+ // visiblePrevIndex,
50
+ // visibleCurrIndex
51
+ // );
52
+
53
+ // return {
54
+ // group,
55
+ // movedField: currField,
56
+ // };
57
+ // }
58
+ }
@@ -0,0 +1,16 @@
1
+ /* tslint:disable:no-unused-variable */
2
+
3
+ import { TestBed, async, inject } from '@angular/core/testing';
4
+ import { ExportService } from './export.service';
5
+
6
+ describe('Service: Export', () => {
7
+ beforeEach(() => {
8
+ TestBed.configureTestingModule({
9
+ providers: [ExportService]
10
+ });
11
+ });
12
+
13
+ it('should ...', inject([ExportService], (service: ExportService) => {
14
+ expect(service).toBeTruthy();
15
+ }));
16
+ });
@@ -0,0 +1,189 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as XLSX from 'xlsx-js-style';
3
+ import { saveAs } from 'file-saver';
4
+
5
+ @Injectable({
6
+ providedIn: 'root'
7
+ })
8
+ export class ExportService {
9
+
10
+ constructor() {}
11
+
12
+ /**
13
+ * Exports data to CSV or Excel.
14
+ * @param columns List of column definitions (each having name/key/is_visible)
15
+ * @param data The array of data objects
16
+ * @param fileName Name of the exported file (without extension)
17
+ * @param format 'csv' | 'xlsx'
18
+ */
19
+ exportData(
20
+ columns: any[],
21
+ data: any[],
22
+ fileName: string,
23
+ format: 'csv' | 'xlsx' = 'xlsx',
24
+ rowSelectedIndexes: Set<number> | null = new Set(),
25
+ styleConfig: {
26
+ headerBgColor?: string;
27
+ headerTextColor?: string;
28
+ bodyTextColor?: string;
29
+ fontFamily?: string;
30
+ fontWeight?: 'normal' | 'bold';
31
+ zoomScale?: number;
32
+ headerRowHeight?: number;
33
+ selectedRowBgColor?: string;
34
+ } = {}
35
+ ) {
36
+ const {
37
+ headerBgColor = '#228B22',
38
+ headerTextColor = '#FFFFFF',
39
+ bodyTextColor = '#000000',
40
+ fontFamily = 'Calibri',
41
+ fontWeight = 'normal',
42
+ zoomScale = 120,
43
+ headerRowHeight = 20,
44
+ selectedRowBgColor = '#8AC5FF',
45
+ } = styleConfig;
46
+
47
+ const visibleColumns = columns.filter(
48
+ col => col.is_visible && col.type !== 'image' && col.type !== 'logo'
49
+ );
50
+
51
+ const headers = visibleColumns.map(col => col.header || col.headerName || col.name);
52
+
53
+ const flattenValue = (value: any): any => {
54
+ if (value == null) return '';
55
+ if (Array.isArray(value))
56
+ return value.map(v => (typeof v === 'object' ? flattenValue(v) : v)).join(', ');
57
+ if (typeof value === 'object')
58
+ return Object.entries(value)
59
+ .map(([k, v]) => `${k}: ${flattenValue(v)}`)
60
+ .join(', ');
61
+ return value;
62
+ };
63
+
64
+ const exportData = data.map(row =>
65
+ visibleColumns.reduce((acc: any, col) => {
66
+ const header = col.headerName || col.name || col.header;
67
+ let value = this.getNestedValue(row, col.field);
68
+
69
+ switch (col.type) {
70
+ case 'boolean':
71
+ value = value ? 'Yes' : 'No';
72
+ break;
73
+ case 'date':
74
+ if (value) {
75
+ const date = new Date(value);
76
+ if (!isNaN(date.getTime())) {
77
+ value = date.toLocaleDateString('en-US', {
78
+ day: '2-digit',
79
+ month: 'long',
80
+ year: 'numeric',
81
+ });
82
+ }
83
+ }
84
+ break;
85
+ default:
86
+ value = flattenValue(value);
87
+ }
88
+
89
+ acc[header] = value;
90
+ return acc;
91
+ }, {})
92
+ );
93
+
94
+ const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(exportData, { header: headers });
95
+
96
+ // ✅ Define a reusable border style
97
+ const borderStyle = {
98
+ top: { style: 'thin', color: { rgb: 'CCCCCC' } },
99
+ bottom: { style: 'thin', color: { rgb: 'CCCCCC' } },
100
+ left: { style: 'thin', color: { rgb: 'CCCCCC' } },
101
+ right: { style: 'thin', color: { rgb: 'CCCCCC' } },
102
+ };
103
+
104
+ // ✅ Apply header styles
105
+ headers.forEach((header, index) => {
106
+ const cellAddress = XLSX.utils.encode_cell({ r: 0, c: index });
107
+ if (!worksheet[cellAddress]) return;
108
+
109
+ worksheet[cellAddress].s = {
110
+ fill: { fgColor: { rgb: headerBgColor.replace('#', '') } },
111
+ font: {
112
+ name: fontFamily,
113
+ sz: 14,
114
+ color: { rgb: headerTextColor.replace('#', '') },
115
+ bold: fontWeight === 'bold',
116
+ },
117
+ alignment: { horizontal: 'center', vertical: 'center' },
118
+ border: borderStyle, // ✅ Added border here
119
+ };
120
+ });
121
+
122
+ // ✅ Apply body styles + highlight selected rows
123
+ for (let r = 1; r <= exportData.length; r++) {
124
+ const isSelected = rowSelectedIndexes?.has(r - 1);
125
+ const rowBgColor = isSelected ? selectedRowBgColor : '#FFFFFF';
126
+
127
+ for (let c = 0; c < headers.length; c++) {
128
+ const col = visibleColumns[c];
129
+ const cellAddress = XLSX.utils.encode_cell({ r, c });
130
+ const cell = worksheet[cellAddress];
131
+ if (!cell) continue;
132
+
133
+ let horizontalAlign = 'left';
134
+ if (['number', 'boolean', 'date'].includes(col.type)) horizontalAlign = 'center';
135
+
136
+ cell.s = {
137
+ fill: { fgColor: { rgb: rowBgColor.replace('#', '') } },
138
+ font: {
139
+ name: fontFamily,
140
+ sz: 14,
141
+ color: { rgb: bodyTextColor.replace('#', '') },
142
+ bold: false,
143
+ },
144
+ alignment: { horizontal: horizontalAlign, vertical: 'center', wrapText: true },
145
+ border: borderStyle, // ✅ Added border here too
146
+ };
147
+ }
148
+ }
149
+
150
+ // ✅ Adjust column widths
151
+ const colWidths = headers.map(header => {
152
+ let maxLength = header.length;
153
+ exportData.forEach(row => {
154
+ const val = row[header];
155
+ if (val != null) {
156
+ const len = val.toString().length;
157
+ if (len > maxLength) maxLength = len;
158
+ }
159
+ });
160
+ return { wch: Math.min(maxLength + 2, 64) };
161
+ });
162
+ worksheet['!cols'] = colWidths;
163
+
164
+ worksheet['!rows'] = [{ hpt: headerRowHeight }];
165
+ worksheet['!zoom'] = zoomScale;
166
+
167
+ const workbook: XLSX.WorkBook = { Sheets: { Data: worksheet }, SheetNames: ['Data'] };
168
+
169
+ if (format === 'csv') {
170
+ const csv = XLSX.utils.sheet_to_csv(worksheet);
171
+ const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
172
+ saveAs(blob, `${fileName}.csv`);
173
+ } else {
174
+ const excelBuffer: any = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
175
+ const blob = new Blob([excelBuffer], {
176
+ type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8',
177
+ });
178
+ saveAs(blob, `${fileName}.xlsx`);
179
+ }
180
+ }
181
+
182
+
183
+
184
+
185
+ private getNestedValue(obj: any, path: string): any {
186
+ if (!path || typeof obj !== 'object') return obj;
187
+ return path.split('.').reduce((acc, key) => (acc && acc[key] !== undefined ? acc[key] : ''), obj);
188
+ }
189
+ }
@@ -0,0 +1,203 @@
1
+ import { Injectable } from '@angular/core';
2
+
3
+ export interface ActionContext {
4
+ tableType?: string;
5
+ packageData?: boolean;
6
+ showUnLink?: boolean;
7
+ currentUserId?: string | number;
8
+ }
9
+
10
+ interface NormalizedRow {
11
+ isDeleted: boolean;
12
+ status: string;
13
+ availStatus: string;
14
+ accountStatus: string;
15
+ assigneeCount: number;
16
+ assignedToIds: (string | number)[];
17
+ settlementCompleted: boolean;
18
+ finalSettlementCompleted: boolean;
19
+ storeEdit: boolean;
20
+ isOwner: boolean;
21
+ isCustomGrade: string;
22
+ parent: any;
23
+ offerLetter: any;
24
+ typename: string;
25
+ }
26
+
27
+ type ActionRule = (row: NormalizedRow, ctx: ActionContext) => boolean;
28
+
29
+ @Injectable({ providedIn: 'root' })
30
+ export class RowActionService {
31
+
32
+ private readonly STATUS_SETS = {
33
+ EDIT_BLOCKED: [
34
+ 'expired', 'closed', 'Assigning Stop', 'Evaluation Start',
35
+ 'Evaluation Stop', 'Completed', 'approved', 'rejected',
36
+ 'partially', 'accepted'
37
+ ],
38
+ ARCHIVE_BLOCKED: [
39
+ 'approved', 'partially', 'Assigning Start',
40
+ 'Completed', 'Evaluation Start'
41
+ ],
42
+ DISPOSED: ['scrap', 'trashed', 'disposed'],
43
+ SEPARATED: ['termination', 'resignation', 'retirement', 'separated'],
44
+ UNAVAILABLE: ['unavailable', 'unAvailable']
45
+ } as const;
46
+
47
+ private readonly ACTION_ALIASES: Record<string, string> = {
48
+ accept: 'view',
49
+ achive: 'unactive'
50
+ };
51
+
52
+ private readonly rules: Record<string, ActionRule> = {
53
+ assigningstart: (r) => r.status === 'To be start Assigning' && !r.isDeleted,
54
+ assigningstop: (r) => r.status === 'Assigning Start' && !r.isDeleted,
55
+ evaluationstart: (r) => r.status === 'Assigning Stop' && !r.isDeleted,
56
+ completed: (r) => r.status === 'Evaluation Start' && !r.isDeleted,
57
+
58
+ archive: (r) => this.canArchiveOrDelete(r),
59
+ unactive: (r) => this.canArchiveOrDelete(r),
60
+ delete: (r) => this.canArchiveOrDelete(r),
61
+
62
+ unarchive: (r) => r.isDeleted && r.availStatus !== 'disposed',
63
+ active: (r) => r.isDeleted && r.availStatus !== 'disposed',
64
+
65
+ link: (r) =>
66
+ !this.STATUS_SETS.UNAVAILABLE.includes((r.status as any)) &&
67
+ !r.isDeleted &&
68
+ r.availStatus !== 'disposed' &&
69
+ r.status !== 'linked',
70
+ unlink: (r, ctx) => ctx.showUnLink === true && r.status === 'linked',
71
+
72
+ rejoin: (r) => this.STATUS_SETS.SEPARATED.includes((r.accountStatus as any)),
73
+ settlementinfo: (r) => this.STATUS_SETS.SEPARATED.includes((r.accountStatus as any)),
74
+
75
+ assign: (r) => r.status !== 'assigned',
76
+ edit: (r, ctx) => this.canEdit(r, ctx),
77
+
78
+ trash: (r) => !this.STATUS_SETS.DISPOSED.includes((r.availStatus as any)),
79
+ scrap: (r) => !this.STATUS_SETS.DISPOSED.includes((r.availStatus as any)),
80
+ retain: (r) => !this.STATUS_SETS.DISPOSED.includes((r.availStatus as any)),
81
+
82
+ defaultgrade: (r) => r.isCustomGrade !== 'Active',
83
+
84
+ subscribe: (r, ctx) => !r.assignedToIds.includes((ctx.currentUserId as any)),
85
+ unsubscribe: (r, ctx) => r.assignedToIds.includes((ctx.currentUserId as any)),
86
+
87
+ changestatus: (r) => !r.isDeleted,
88
+
89
+ download: (r) => r.offerLetter !== null,
90
+ view: (r) => r.offerLetter !== null
91
+ };
92
+
93
+ private normalizeRow(element: any): NormalizedRow {
94
+ return {
95
+ isDeleted: element.is_deleted === true || element.is_deleted === 'true',
96
+ status: element.status || '',
97
+ availStatus: element.availStatus || '',
98
+ accountStatus: (element.account_status || '').toLowerCase(),
99
+ assigneeCount: element.assignee?.length ?? 0,
100
+ assignedToIds: element.assigned_to?.map((x: any) => x.id) ?? [],
101
+ settlementCompleted: element.settlement_completed === true,
102
+ finalSettlementCompleted: element.final_settlement_completed === true,
103
+ storeEdit: element.store_edit !== false,
104
+ isOwner: element.is_owner ?? true,
105
+ isCustomGrade: element.is_custom_grade || '',
106
+ parent: element.parent,
107
+ offerLetter: element.offer_letter,
108
+ typename: element.__typename || ''
109
+ };
110
+ }
111
+
112
+ private normalizeAction(action: string, ctx: ActionContext): string {
113
+ let normalized = this.ACTION_ALIASES[action] || action;
114
+
115
+ if (ctx.packageData) {
116
+ if (action === 'unarchive') return 'active';
117
+ if (action === 'archive') return 'unactive';
118
+ }
119
+
120
+ return normalized.toLowerCase();
121
+ }
122
+
123
+ private canArchiveOrDelete(r: NormalizedRow): boolean {
124
+ return (
125
+ !r.isDeleted &&
126
+ !r.settlementCompleted &&
127
+ !r.finalSettlementCompleted &&
128
+ r.availStatus !== 'reserved' &&
129
+ r.assigneeCount === 0 &&
130
+ r.availStatus !== 'disposed' &&
131
+ r.availStatus !== 'maintenance' &&
132
+ r.availStatus !== 'assigned' &&
133
+ !this.STATUS_SETS.ARCHIVE_BLOCKED.includes((r.status as any)) &&
134
+ r.parent !== null
135
+ );
136
+ }
137
+
138
+ private canEdit(r: NormalizedRow, ctx: ActionContext): boolean {
139
+ const isBlocked =
140
+ this.STATUS_SETS.EDIT_BLOCKED.includes((r.status as any)) ||
141
+ r.isDeleted ||
142
+ !r.storeEdit ||
143
+ r.availStatus === 'disposed' ||
144
+ r.settlementCompleted ||
145
+ r.finalSettlementCompleted;
146
+
147
+ if (isBlocked) return false;
148
+
149
+ if (ctx.tableType === 'BusinessExpenseListing') {
150
+ return true;
151
+ }
152
+
153
+ return r.status !== 'accepted' && r.isOwner;
154
+ }
155
+
156
+ isActionValid(action: string, element: any, ctx: ActionContext = {}): boolean {
157
+ const row = this.normalizeRow(element);
158
+ const normalizedAction = this.normalizeAction(action, ctx);
159
+ const rule = this.rules[normalizedAction];
160
+
161
+ if (rule) {
162
+ return rule(row, ctx);
163
+ }
164
+
165
+ return row.availStatus !== 'disposed' || row.typename === 'Alert';
166
+ }
167
+
168
+ getValidActions(actions: string[], element: any, ctx: ActionContext = {}): string[] {
169
+ if (!actions?.length) return [];
170
+
171
+ let validActions = actions.filter(action =>
172
+ this.isActionValid(action, element, ctx)
173
+ );
174
+
175
+ if (ctx.tableType === 'recruitmentListing') {
176
+ validActions = this.applyRecruitmentFilters(validActions, element);
177
+ }
178
+
179
+ return validActions;
180
+ }
181
+
182
+ private applyRecruitmentFilters(actions: string[], element: any): string[] {
183
+ let filtered = [...actions];
184
+
185
+ if (element?.status === 'hired' && !element?.is_deleted) {
186
+ filtered = filtered.filter(action =>
187
+ !['changestatus', 'unarchive', 'archive', 'edit'].includes(action)
188
+ );
189
+ }
190
+
191
+ if (element?.is_deleted) {
192
+ filtered = filtered.filter(action => action !== 'changestatus');
193
+ }
194
+
195
+ if (element?.offer_letter === null) {
196
+ filtered = filtered.filter(action =>
197
+ !['download', 'view'].includes(action)
198
+ );
199
+ }
200
+
201
+ return filtered;
202
+ }
203
+ }
@@ -0,0 +1,16 @@
1
+ /* tslint:disable:no-unused-variable */
2
+
3
+ import { TestBed, async, inject } from '@angular/core/testing';
4
+ import { SplitColumnsService } from './split-columns.service';
5
+
6
+ describe('Service: SplitColumns', () => {
7
+ beforeEach(() => {
8
+ TestBed.configureTestingModule({
9
+ providers: [SplitColumnsService]
10
+ });
11
+ });
12
+
13
+ it('should ...', inject([SplitColumnsService], (service: SplitColumnsService) => {
14
+ expect(service).toBeTruthy();
15
+ }));
16
+ });
@@ -0,0 +1,168 @@
1
+ import { Injectable } from '@angular/core';
2
+
3
+ @Injectable({
4
+ providedIn: 'root',
5
+ })
6
+ export class SplitColumnsService {
7
+ prepareColumns(columns: any[], containerWidth: number): any {
8
+ const left: any[] = [];
9
+ const center: any[] = [];
10
+ const right: any[] = [];
11
+
12
+ for (const col of columns) {
13
+ if (col.children?.length) {
14
+ const leftChildren: any[] = [];
15
+ const centerChildren: any[] = [];
16
+ const rightChildren: any[] = [];
17
+
18
+ for (const child of col.children) {
19
+ if (child.is_visible === false) continue;
20
+
21
+ const pinned = child.pinned ?? col.pinned ?? null;
22
+ const childWithPinned = { ...child, pinned };
23
+
24
+ if (pinned === 'left') leftChildren.push(childWithPinned);
25
+ else if (pinned === 'right') rightChildren.push(childWithPinned);
26
+ else centerChildren.push(childWithPinned);
27
+ }
28
+
29
+ if (leftChildren.length) {
30
+ left.push({ header: col.header, children: leftChildren, id: col?.id || col?._id });
31
+ }
32
+ if (centerChildren.length) {
33
+ center.push({
34
+ header: col.header,
35
+ children: centerChildren,
36
+ id: col.id || col._id,
37
+ });
38
+ }
39
+ if (rightChildren.length) {
40
+ right.push({
41
+ header: col.header,
42
+ children: rightChildren,
43
+ id: col.id || col._id,
44
+ });
45
+ }
46
+ } else if (col.is_visible !== false) {
47
+ const pinned = col.pinned ?? null;
48
+ if (pinned === 'left') left.push(col);
49
+ else if (pinned === 'right') right.push(col);
50
+ else center.push(col);
51
+ }
52
+ }
53
+
54
+ return { left, center, right };
55
+ }
56
+
57
+ setColumnsQuery(columns: any[]) {
58
+ for (const col of columns) {
59
+ // if (col.children?.length) {
60
+ // for (const child of col.children) {
61
+ // if (!child?.query?.firt_value && !child?.query?._ids?.length) {
62
+ // child['query'] = {
63
+ // first_condition: 'contain',
64
+ // first_value: null,
65
+ // condition: 'none',
66
+ // second_condition: 'contain',
67
+ // second_value: null,
68
+ // _ids: [],
69
+ // };
70
+ // }
71
+ // }
72
+ // }
73
+ // if (!col?.query?.firt_value && !col?.query?._ids?.length) {
74
+ // col.query = {
75
+ // first_condition: 'contain',
76
+ // first_value: null,
77
+ // condition: 'none',
78
+ // second_condition: 'contain',
79
+ // second_value: null,
80
+ // _ids: [],
81
+ // };
82
+ // }
83
+ }
84
+
85
+ console.log('Updated Columns: ', columns);
86
+
87
+ return columns;
88
+ }
89
+
90
+ assignDefaultWidths(columns: any[], containerWidth: number): any[] {
91
+ const visibleLeafCols = this.getVisibleLeafColumns(columns);
92
+
93
+ if (!visibleLeafCols.length) return columns;
94
+
95
+ // ✅ Columns that already have width
96
+ const fixedCols = visibleLeafCols.filter(
97
+ col => col.width && col.width > 0
98
+ );
99
+
100
+ // ✅ Columns that need width
101
+ const flexibleCols = visibleLeafCols.filter(
102
+ col => !col.width && col.is_visible !== false
103
+ );
104
+
105
+ // ✅ Total width already consumed
106
+ const usedWidth = fixedCols.reduce(
107
+ (sum, col) => sum + col.width,
108
+ 0
109
+ );
110
+
111
+ // ✅ Remaining width after fixed columns
112
+ let remainingWidth = containerWidth - (usedWidth + 50);
113
+ if (remainingWidth < 0) remainingWidth = 0;
114
+
115
+ // ✅ Average width for columns without width
116
+ let defaultWidth =
117
+ flexibleCols.length > 0
118
+ ? Math.floor(remainingWidth / flexibleCols.length)
119
+ : 0;
120
+
121
+ // ✅ Enforce minimum
122
+ if (defaultWidth < 150) defaultWidth = 150;
123
+
124
+ const cloneColumns = (cols: any[]): any[] =>
125
+ cols.map(col => {
126
+ if (col.children?.length) {
127
+ return {
128
+ ...col,
129
+ children: cloneColumns(col.children)
130
+ };
131
+ }
132
+
133
+ // ✅ Keep existing width
134
+ if (col.width) {
135
+ return { ...col };
136
+ }
137
+
138
+ // ✅ Hidden columns → fixed small width
139
+ if (col.is_visible === false) {
140
+ return { ...col, width: 150 };
141
+ }
142
+
143
+ // ✅ Assign calculated default width
144
+ return { ...col, width: defaultWidth };
145
+ });
146
+
147
+ return cloneColumns(columns);
148
+ }
149
+
150
+
151
+
152
+ private getVisibleLeafColumns(columns: any[]): any[] {
153
+ const result: any[] = [];
154
+
155
+ for (const col of columns) {
156
+ if (col.children?.length) {
157
+ const visibleChildren = col.children.filter(
158
+ (c: any) => c.is_visible !== false
159
+ );
160
+ result.push(...visibleChildren);
161
+ } else if (col.is_visible !== false) {
162
+ result.push(col);
163
+ }
164
+ }
165
+
166
+ return result;
167
+ }
168
+ }
@@ -0,0 +1,16 @@
1
+ /* tslint:disable:no-unused-variable */
2
+
3
+ import { TestBed, async, inject } from '@angular/core/testing';
4
+ import { SwapColumnsService } from './swap-columns.service';
5
+
6
+ describe('Service: SwapColumns', () => {
7
+ beforeEach(() => {
8
+ TestBed.configureTestingModule({
9
+ providers: [SwapColumnsService]
10
+ });
11
+ });
12
+
13
+ it('should ...', inject([SwapColumnsService], (service: SwapColumnsService) => {
14
+ expect(service).toBeTruthy();
15
+ }));
16
+ });