@zeedhi/common 3.0.5 → 3.0.6

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 (257) hide show
  1. package/dist/types/components/zd-date-input/date-input.d.ts +1 -1
  2. package/dist/types/components/zd-date-range/date-range.d.ts +3 -1
  3. package/dist/types/components/zd-iterable/iterable.d.ts +9 -0
  4. package/dist/types/utils/date-utils/date-utils.d.ts +1 -0
  5. package/dist/zd-common.js +75 -24
  6. package/dist/zd-common.min.js +75 -24
  7. package/environments.json +6 -0
  8. package/jest.config.cjs +1 -0
  9. package/package.json +6 -3
  10. package/src/components/zd-date-input/date-input.ts +9 -21
  11. package/src/components/zd-date-range/date-range.ts +27 -4
  12. package/src/components/zd-iterable/iterable.ts +41 -3
  13. package/src/utils/date-utils/date-utils.ts +18 -0
  14. package/tests/unit/components/zd-component/component.spec.ts +3 -2
  15. package/tests/unit/components/zd-date-range/date-range.spec.ts +189 -23
  16. package/tests/unit/components/zd-grid/grid.spec.ts +48 -35
  17. package/tests/unit/components/zd-grid-editable/data-editor.spec.ts +1 -1
  18. package/tests/unit/components/zd-grid-editable/grid-editable.spec.ts +1 -1
  19. package/tests/unit/components/zd-iterable/column.spec.ts +42 -0
  20. package/tests/unit/utils/mock-console.ts +18 -0
  21. package/.package.json +0 -45
  22. package/coverage/clover.xml +0 -5741
  23. package/coverage/coverage-final.json +0 -144
  24. package/coverage/lcov-report/base.css +0 -224
  25. package/coverage/lcov-report/block-navigation.js +0 -87
  26. package/coverage/lcov-report/favicon.png +0 -0
  27. package/coverage/lcov-report/index.html +0 -1316
  28. package/coverage/lcov-report/prettify.css +0 -1
  29. package/coverage/lcov-report/prettify.js +0 -2
  30. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  31. package/coverage/lcov-report/sorter.js +0 -210
  32. package/coverage/lcov-report/src/components/index.html +0 -116
  33. package/coverage/lcov-report/src/components/index.ts.html +0 -730
  34. package/coverage/lcov-report/src/components/zd-alert/alert.ts.html +0 -502
  35. package/coverage/lcov-report/src/components/zd-alert/index.html +0 -116
  36. package/coverage/lcov-report/src/components/zd-badge/badge.ts.html +0 -226
  37. package/coverage/lcov-report/src/components/zd-badge/index.html +0 -116
  38. package/coverage/lcov-report/src/components/zd-breadcrumbs/breadcrumbs.ts.html +0 -226
  39. package/coverage/lcov-report/src/components/zd-breadcrumbs/index.html +0 -116
  40. package/coverage/lcov-report/src/components/zd-button/button.ts.html +0 -706
  41. package/coverage/lcov-report/src/components/zd-button/index.html +0 -116
  42. package/coverage/lcov-report/src/components/zd-button-group/button-group.ts.html +0 -412
  43. package/coverage/lcov-report/src/components/zd-button-group/index.html +0 -116
  44. package/coverage/lcov-report/src/components/zd-card/card.ts.html +0 -748
  45. package/coverage/lcov-report/src/components/zd-card/index.html +0 -116
  46. package/coverage/lcov-report/src/components/zd-carousel/carousel.ts.html +0 -949
  47. package/coverage/lcov-report/src/components/zd-carousel/index.html +0 -116
  48. package/coverage/lcov-report/src/components/zd-checkbox/checkbox.ts.html +0 -148
  49. package/coverage/lcov-report/src/components/zd-checkbox/index.html +0 -116
  50. package/coverage/lcov-report/src/components/zd-checkbox-multiple/checkbox-multiple.ts.html +0 -313
  51. package/coverage/lcov-report/src/components/zd-checkbox-multiple/index.html +0 -116
  52. package/coverage/lcov-report/src/components/zd-chip/chip.ts.html +0 -352
  53. package/coverage/lcov-report/src/components/zd-chip/index.html +0 -116
  54. package/coverage/lcov-report/src/components/zd-code-viewer/code-viewer.ts.html +0 -682
  55. package/coverage/lcov-report/src/components/zd-code-viewer/index.html +0 -116
  56. package/coverage/lcov-report/src/components/zd-col/col.ts.html +0 -250
  57. package/coverage/lcov-report/src/components/zd-col/index.html +0 -116
  58. package/coverage/lcov-report/src/components/zd-collapse-card/collapse-card.ts.html +0 -343
  59. package/coverage/lcov-report/src/components/zd-collapse-card/index.html +0 -116
  60. package/coverage/lcov-report/src/components/zd-component/child-not-found.ts.html +0 -109
  61. package/coverage/lcov-report/src/components/zd-component/component-render.ts.html +0 -160
  62. package/coverage/lcov-report/src/components/zd-component/component.ts.html +0 -1084
  63. package/coverage/lcov-report/src/components/zd-component/index.html +0 -146
  64. package/coverage/lcov-report/src/components/zd-container/container.ts.html +0 -289
  65. package/coverage/lcov-report/src/components/zd-container/index.html +0 -116
  66. package/coverage/lcov-report/src/components/zd-currency/currency.ts.html +0 -259
  67. package/coverage/lcov-report/src/components/zd-currency/index.html +0 -116
  68. package/coverage/lcov-report/src/components/zd-date-input/date-input.ts.html +0 -1798
  69. package/coverage/lcov-report/src/components/zd-date-input/index.html +0 -116
  70. package/coverage/lcov-report/src/components/zd-date-range/date-range.ts.html +0 -2167
  71. package/coverage/lcov-report/src/components/zd-date-range/index.html +0 -116
  72. package/coverage/lcov-report/src/components/zd-dialog/dialog.ts.html +0 -541
  73. package/coverage/lcov-report/src/components/zd-dialog/index.html +0 -116
  74. package/coverage/lcov-report/src/components/zd-divider/divider.ts.html +0 -178
  75. package/coverage/lcov-report/src/components/zd-divider/index.html +0 -116
  76. package/coverage/lcov-report/src/components/zd-dropdown/dropdown.ts.html +0 -460
  77. package/coverage/lcov-report/src/components/zd-dropdown/index.html +0 -116
  78. package/coverage/lcov-report/src/components/zd-footer/footer.ts.html +0 -451
  79. package/coverage/lcov-report/src/components/zd-footer/index.html +0 -116
  80. package/coverage/lcov-report/src/components/zd-form/form.ts.html +0 -1075
  81. package/coverage/lcov-report/src/components/zd-form/index.html +0 -116
  82. package/coverage/lcov-report/src/components/zd-frame/frame.ts.html +0 -763
  83. package/coverage/lcov-report/src/components/zd-frame/index.html +0 -116
  84. package/coverage/lcov-report/src/components/zd-frame-page/frame-page.ts.html +0 -169
  85. package/coverage/lcov-report/src/components/zd-frame-page/index.html +0 -116
  86. package/coverage/lcov-report/src/components/zd-grid/data-navigator.ts.html +0 -304
  87. package/coverage/lcov-report/src/components/zd-grid/data-selector.ts.html +0 -532
  88. package/coverage/lcov-report/src/components/zd-grid/grid-column.ts.html +0 -709
  89. package/coverage/lcov-report/src/components/zd-grid/grid-events.ts.html +0 -244
  90. package/coverage/lcov-report/src/components/zd-grid/grid.ts.html +0 -1042
  91. package/coverage/lcov-report/src/components/zd-grid/index.html +0 -266
  92. package/coverage/lcov-report/src/components/zd-grid/index.ts.html +0 -118
  93. package/coverage/lcov-report/src/components/zd-grid/iterable-table.ts.html +0 -274
  94. package/coverage/lcov-report/src/components/zd-grid/keymap-merger.ts.html +0 -241
  95. package/coverage/lcov-report/src/components/zd-grid/keymap-navigation.ts.html +0 -313
  96. package/coverage/lcov-report/src/components/zd-grid/table-action-builder.ts.html +0 -427
  97. package/coverage/lcov-report/src/components/zd-grid/view-navigator.ts.html +0 -175
  98. package/coverage/lcov-report/src/components/zd-grid-editable/data-editor-with-add.ts.html +0 -826
  99. package/coverage/lcov-report/src/components/zd-grid-editable/data-editor.ts.html +0 -1570
  100. package/coverage/lcov-report/src/components/zd-grid-editable/errors/index.html +0 -146
  101. package/coverage/lcov-report/src/components/zd-grid-editable/errors/index.ts.html +0 -91
  102. package/coverage/lcov-report/src/components/zd-grid-editable/errors/not-editing.ts.html +0 -109
  103. package/coverage/lcov-report/src/components/zd-grid-editable/errors/row-not-found.ts.html +0 -109
  104. package/coverage/lcov-report/src/components/zd-grid-editable/grid-column-editable.ts.html +0 -130
  105. package/coverage/lcov-report/src/components/zd-grid-editable/grid-editable-controller.ts.html +0 -139
  106. package/coverage/lcov-report/src/components/zd-grid-editable/grid-editable-events.ts.html +0 -430
  107. package/coverage/lcov-report/src/components/zd-grid-editable/grid-editable.ts.html +0 -1477
  108. package/coverage/lcov-report/src/components/zd-grid-editable/index.html +0 -221
  109. package/coverage/lcov-report/src/components/zd-grid-editable/index.ts.html +0 -109
  110. package/coverage/lcov-report/src/components/zd-grid-editable/keymap-editing.ts.html +0 -139
  111. package/coverage/lcov-report/src/components/zd-header/header.ts.html +0 -502
  112. package/coverage/lcov-report/src/components/zd-header/index.html +0 -116
  113. package/coverage/lcov-report/src/components/zd-icon/icon.ts.html +0 -325
  114. package/coverage/lcov-report/src/components/zd-icon/index.html +0 -116
  115. package/coverage/lcov-report/src/components/zd-image/image.ts.html +0 -424
  116. package/coverage/lcov-report/src/components/zd-image/index.html +0 -116
  117. package/coverage/lcov-report/src/components/zd-increment/increment.ts.html +0 -436
  118. package/coverage/lcov-report/src/components/zd-increment/index.html +0 -116
  119. package/coverage/lcov-report/src/components/zd-input/index.html +0 -131
  120. package/coverage/lcov-report/src/components/zd-input/input-factory.ts.html +0 -130
  121. package/coverage/lcov-report/src/components/zd-input/input.ts.html +0 -1345
  122. package/coverage/lcov-report/src/components/zd-iterable/column-not-found.ts.html +0 -109
  123. package/coverage/lcov-report/src/components/zd-iterable/column.ts.html +0 -823
  124. package/coverage/lcov-report/src/components/zd-iterable/conditions-manager.ts.html +0 -523
  125. package/coverage/lcov-report/src/components/zd-iterable/index.html +0 -281
  126. package/coverage/lcov-report/src/components/zd-iterable/iterable-columns-button-controller.ts.html +0 -136
  127. package/coverage/lcov-report/src/components/zd-iterable/iterable-columns-button.ts.html +0 -313
  128. package/coverage/lcov-report/src/components/zd-iterable/iterable-controller.ts.html +0 -166
  129. package/coverage/lcov-report/src/components/zd-iterable/iterable-page-component.ts.html +0 -244
  130. package/coverage/lcov-report/src/components/zd-iterable/iterable-page-info.ts.html +0 -106
  131. package/coverage/lcov-report/src/components/zd-iterable/iterable-page-size.ts.html +0 -421
  132. package/coverage/lcov-report/src/components/zd-iterable/iterable-pagination.ts.html +0 -208
  133. package/coverage/lcov-report/src/components/zd-iterable/iterable.ts.html +0 -820
  134. package/coverage/lcov-report/src/components/zd-iterable/search.ts.html +0 -343
  135. package/coverage/lcov-report/src/components/zd-iterable-component-render/index.html +0 -116
  136. package/coverage/lcov-report/src/components/zd-iterable-component-render/iterable-component-render.ts.html +0 -592
  137. package/coverage/lcov-report/src/components/zd-layout/index.html +0 -116
  138. package/coverage/lcov-report/src/components/zd-layout/layout.ts.html +0 -145
  139. package/coverage/lcov-report/src/components/zd-list/index.html +0 -161
  140. package/coverage/lcov-report/src/components/zd-list/item-not-found.ts.html +0 -109
  141. package/coverage/lcov-report/src/components/zd-list/list-group.ts.html +0 -241
  142. package/coverage/lcov-report/src/components/zd-list/list-item.ts.html +0 -298
  143. package/coverage/lcov-report/src/components/zd-list/list.ts.html +0 -460
  144. package/coverage/lcov-report/src/components/zd-loading/index.html +0 -116
  145. package/coverage/lcov-report/src/components/zd-loading/loading.ts.html +0 -217
  146. package/coverage/lcov-report/src/components/zd-login/index.html +0 -131
  147. package/coverage/lcov-report/src/components/zd-login/login-button.ts.html +0 -421
  148. package/coverage/lcov-report/src/components/zd-login/login.ts.html +0 -340
  149. package/coverage/lcov-report/src/components/zd-main/index.html +0 -116
  150. package/coverage/lcov-report/src/components/zd-main/main.ts.html +0 -133
  151. package/coverage/lcov-report/src/components/zd-master-detail/detail-not-found.ts.html +0 -118
  152. package/coverage/lcov-report/src/components/zd-master-detail/index.html +0 -146
  153. package/coverage/lcov-report/src/components/zd-master-detail/master-detail.ts.html +0 -331
  154. package/coverage/lcov-report/src/components/zd-master-detail/master-not-found.ts.html +0 -118
  155. package/coverage/lcov-report/src/components/zd-menu/index.html +0 -176
  156. package/coverage/lcov-report/src/components/zd-menu/menu-button.ts.html +0 -241
  157. package/coverage/lcov-report/src/components/zd-menu/menu-group.ts.html +0 -400
  158. package/coverage/lcov-report/src/components/zd-menu/menu-link.ts.html +0 -337
  159. package/coverage/lcov-report/src/components/zd-menu/menu-separator.ts.html +0 -106
  160. package/coverage/lcov-report/src/components/zd-menu/menu.ts.html +0 -1384
  161. package/coverage/lcov-report/src/components/zd-modal/index.html +0 -131
  162. package/coverage/lcov-report/src/components/zd-modal/modal-close-button.ts.html +0 -220
  163. package/coverage/lcov-report/src/components/zd-modal/modal.ts.html +0 -355
  164. package/coverage/lcov-report/src/components/zd-month/index.html +0 -116
  165. package/coverage/lcov-report/src/components/zd-month/month.ts.html +0 -568
  166. package/coverage/lcov-report/src/components/zd-number-input/index.html +0 -116
  167. package/coverage/lcov-report/src/components/zd-number-input/number-input.ts.html +0 -532
  168. package/coverage/lcov-report/src/components/zd-password/index.html +0 -116
  169. package/coverage/lcov-report/src/components/zd-password/password.ts.html +0 -220
  170. package/coverage/lcov-report/src/components/zd-progress/index.html +0 -116
  171. package/coverage/lcov-report/src/components/zd-progress/progress.ts.html +0 -262
  172. package/coverage/lcov-report/src/components/zd-radio/index.html +0 -116
  173. package/coverage/lcov-report/src/components/zd-radio/radio.ts.html +0 -289
  174. package/coverage/lcov-report/src/components/zd-row/index.html +0 -116
  175. package/coverage/lcov-report/src/components/zd-row/row.ts.html +0 -256
  176. package/coverage/lcov-report/src/components/zd-select/index.html +0 -116
  177. package/coverage/lcov-report/src/components/zd-select/select.ts.html +0 -2089
  178. package/coverage/lcov-report/src/components/zd-select-multiple/index.html +0 -116
  179. package/coverage/lcov-report/src/components/zd-select-multiple/select-multiple.ts.html +0 -1549
  180. package/coverage/lcov-report/src/components/zd-svg-map/index.html +0 -116
  181. package/coverage/lcov-report/src/components/zd-svg-map/svg-map.ts.html +0 -475
  182. package/coverage/lcov-report/src/components/zd-switch/index.html +0 -116
  183. package/coverage/lcov-report/src/components/zd-switch/switch.ts.html +0 -163
  184. package/coverage/lcov-report/src/components/zd-table/index.html +0 -116
  185. package/coverage/lcov-report/src/components/zd-table/table.ts.html +0 -280
  186. package/coverage/lcov-report/src/components/zd-tabs/index.html +0 -146
  187. package/coverage/lcov-report/src/components/zd-tabs/tab-not-found.ts.html +0 -127
  188. package/coverage/lcov-report/src/components/zd-tabs/tab.ts.html +0 -370
  189. package/coverage/lcov-report/src/components/zd-tabs/tabs.ts.html +0 -586
  190. package/coverage/lcov-report/src/components/zd-tag/index.html +0 -116
  191. package/coverage/lcov-report/src/components/zd-tag/tag.ts.html +0 -142
  192. package/coverage/lcov-report/src/components/zd-text/index.html +0 -116
  193. package/coverage/lcov-report/src/components/zd-text/text.ts.html +0 -136
  194. package/coverage/lcov-report/src/components/zd-text-input/index.html +0 -116
  195. package/coverage/lcov-report/src/components/zd-text-input/text-input.ts.html +0 -778
  196. package/coverage/lcov-report/src/components/zd-textarea/index.html +0 -116
  197. package/coverage/lcov-report/src/components/zd-textarea/textarea.ts.html +0 -418
  198. package/coverage/lcov-report/src/components/zd-time/index.html +0 -131
  199. package/coverage/lcov-report/src/components/zd-time/time-format-selector.ts.html +0 -157
  200. package/coverage/lcov-report/src/components/zd-time/time.ts.html +0 -1687
  201. package/coverage/lcov-report/src/components/zd-toggleable/index.html +0 -116
  202. package/coverage/lcov-report/src/components/zd-toggleable/toggleable.ts.html +0 -196
  203. package/coverage/lcov-report/src/components/zd-tooltip/index.html +0 -116
  204. package/coverage/lcov-report/src/components/zd-tooltip/tooltip.ts.html +0 -340
  205. package/coverage/lcov-report/src/components/zd-tree/index.html +0 -116
  206. package/coverage/lcov-report/src/components/zd-tree/tree.ts.html +0 -1849
  207. package/coverage/lcov-report/src/components/zd-tree-grid/index.html +0 -191
  208. package/coverage/lcov-report/src/components/zd-tree-grid/index.ts.html +0 -103
  209. package/coverage/lcov-report/src/components/zd-tree-grid/iterable-tree.ts.html +0 -202
  210. package/coverage/lcov-report/src/components/zd-tree-grid/keymap-tree.ts.html +0 -154
  211. package/coverage/lcov-report/src/components/zd-tree-grid/tree-data-navigator.ts.html +0 -235
  212. package/coverage/lcov-report/src/components/zd-tree-grid/tree-data-selector.ts.html +0 -448
  213. package/coverage/lcov-report/src/components/zd-tree-grid/tree-grid.ts.html +0 -1390
  214. package/coverage/lcov-report/src/error/delete-rows.ts.html +0 -124
  215. package/coverage/lcov-report/src/error/index.html +0 -161
  216. package/coverage/lcov-report/src/error/index.ts.html +0 -94
  217. package/coverage/lcov-report/src/error/non-initialized.ts.html +0 -118
  218. package/coverage/lcov-report/src/error/zeedhi-error.ts.html +0 -109
  219. package/coverage/lcov-report/src/index.html +0 -116
  220. package/coverage/lcov-report/src/index.ts.html +0 -145
  221. package/coverage/lcov-report/src/services/index.html +0 -116
  222. package/coverage/lcov-report/src/services/index.ts.html +0 -97
  223. package/coverage/lcov-report/src/services/zd-alert/alert-queue.ts.html +0 -205
  224. package/coverage/lcov-report/src/services/zd-alert/alert-replace.ts.html +0 -220
  225. package/coverage/lcov-report/src/services/zd-alert/alert-service.ts.html +0 -316
  226. package/coverage/lcov-report/src/services/zd-alert/alert-stack.ts.html +0 -172
  227. package/coverage/lcov-report/src/services/zd-alert/index.html +0 -176
  228. package/coverage/lcov-report/src/services/zd-alert/index.ts.html +0 -100
  229. package/coverage/lcov-report/src/services/zd-dialog/dialog-service.ts.html +0 -205
  230. package/coverage/lcov-report/src/services/zd-dialog/index.html +0 -116
  231. package/coverage/lcov-report/src/services/zd-loading/index.html +0 -116
  232. package/coverage/lcov-report/src/services/zd-loading/loading-service.ts.html +0 -157
  233. package/coverage/lcov-report/src/services/zd-modal/index.html +0 -116
  234. package/coverage/lcov-report/src/services/zd-modal/modal-service.ts.html +0 -298
  235. package/coverage/lcov-report/src/utils/data-value-out/data-value-out.ts.html +0 -202
  236. package/coverage/lcov-report/src/utils/data-value-out/index.html +0 -131
  237. package/coverage/lcov-report/src/utils/data-value-out/index.ts.html +0 -91
  238. package/coverage/lcov-report/src/utils/datasource-searcher/datasource-searcher.ts.html +0 -241
  239. package/coverage/lcov-report/src/utils/datasource-searcher/index.html +0 -131
  240. package/coverage/lcov-report/src/utils/datasource-searcher/index.ts.html +0 -91
  241. package/coverage/lcov-report/src/utils/icons/icons.ts.html +0 -547
  242. package/coverage/lcov-report/src/utils/icons/index.html +0 -116
  243. package/coverage/lcov-report/src/utils/index.html +0 -116
  244. package/coverage/lcov-report/src/utils/index.ts.html +0 -106
  245. package/coverage/lcov-report/src/utils/omit/index.html +0 -116
  246. package/coverage/lcov-report/src/utils/omit/omit.ts.html +0 -124
  247. package/coverage/lcov-report/src/utils/theme/index.html +0 -116
  248. package/coverage/lcov-report/src/utils/theme/theme.ts.html +0 -679
  249. package/coverage/lcov-report/src/utils/tree-data-structure/index.html +0 -131
  250. package/coverage/lcov-report/src/utils/tree-data-structure/index.ts.html +0 -91
  251. package/coverage/lcov-report/src/utils/tree-data-structure/tree-data-structure.ts.html +0 -1645
  252. package/coverage/lcov-report/src/utils/unique-by/index.html +0 -116
  253. package/coverage/lcov-report/src/utils/unique-by/unique-by.ts.html +0 -130
  254. package/coverage/lcov-report/tests/unit/components/zd-component/ComponentMock.ts.html +0 -166
  255. package/coverage/lcov-report/tests/unit/components/zd-component/index.html +0 -116
  256. package/coverage/lcov.info +0 -10206
  257. package/tests/unit/utils/is-filled-object.spec.ts +0 -33
@@ -113,7 +113,7 @@ export declare class DateInput extends TextInput implements IDateInput {
113
113
  dateValidation(): boolean | string;
114
114
  click(event?: Event, element?: any): void;
115
115
  blur(event: Event, element: any): void;
116
- onMounted(): void;
116
+ onMounted(element: any): void;
117
117
  focus(event: Event, element: any): void;
118
118
  /**
119
119
  * Add date mask
@@ -1,6 +1,7 @@
1
1
  import { IDateRange } from './interfaces';
2
2
  import { TextInput } from '../zd-text-input/text-input';
3
3
  export declare class DateRange extends TextInput implements IDateRange {
4
+ allowedDates?: string[] | ((date: string) => boolean);
4
5
  /**
5
6
  * Input auto complete.
6
7
  */
@@ -151,8 +152,9 @@ export declare class DateRange extends TextInput implements IDateRange {
151
152
  updateHelperHint(helperValue: string): void;
152
153
  change(event?: Event, element?: any): void;
153
154
  private getExtremities;
154
- setNativeDate(date: Date[]): void;
155
+ setNativeDate(dates: Date[]): void;
155
156
  private dateObject;
156
157
  getNativeDate(): Date[];
158
+ getAllowedDates(date: Date): boolean;
157
159
  getMaskValue(): any;
158
160
  }
@@ -73,5 +73,14 @@ export declare abstract class Iterable<T extends Column = Column> extends Compon
73
73
  delete(row: IDictionary): Promise<any>;
74
74
  getData(): IDictionary[];
75
75
  protected changeDefaultSlotNames(slot: IComponentRender[]): any;
76
+ /**
77
+ * Recursively replaces a pattern in all string values within an object/array tree
78
+ * @param obj The object or array to process
79
+ * @param pattern The regex pattern to search for
80
+ * @param replacement The replacement string
81
+ * @returns A new object/array with replaced values
82
+ */
83
+ private recursiveReplace;
84
+ private isObject;
76
85
  findRow(key: string | number): IDictionary<any> | undefined;
77
86
  }
@@ -0,0 +1 @@
1
+ export declare function isDateAllowed(date: Date, dateFormat: string, allowedDates?: ((date: string) => boolean) | string[]): boolean;
package/dist/zd-common.js CHANGED
@@ -2287,6 +2287,18 @@ FormatterParserProvider.registerParser('ZdTextInput', (value, { valueWithPrefix
2287
2287
  });
2288
2288
  InputFactory.register('ZdTextInput', TextInput);
2289
2289
 
2290
+ function isDateAllowed(date, dateFormat, allowedDates) {
2291
+ if (!allowedDates)
2292
+ return true;
2293
+ if (allowedDates.length === 0)
2294
+ return false;
2295
+ const dateString = dayjs(date).format(dateFormat);
2296
+ if (allowedDates instanceof Function) {
2297
+ return allowedDates(dateString);
2298
+ }
2299
+ return allowedDates.indexOf(dateString) !== -1;
2300
+ }
2301
+
2290
2302
  /**
2291
2303
  * Base class for Date component.
2292
2304
  */
@@ -2426,6 +2438,9 @@ class DateInput extends TextInput {
2426
2438
  if (this.isValidFormatDate(value, this.dateFormat)) {
2427
2439
  this.dateObject = dayjs(value, this.dateFormat);
2428
2440
  }
2441
+ else {
2442
+ this.dateObject = null;
2443
+ }
2429
2444
  }
2430
2445
  get displayValue() {
2431
2446
  return this.internalDisplayValue;
@@ -2495,13 +2510,8 @@ class DateInput extends TextInput {
2495
2510
  const isValidMax = !maxDate || date.isBefore(maxDate) || date.isSame(maxDate);
2496
2511
  if (!isValidMax)
2497
2512
  return false;
2498
- const isAllowedDate = this.allowedDates === undefined ||
2499
- (this.allowedDates instanceof Function && this.allowedDates(dayjs(value, format).format(this.dateFormat))) ||
2500
- (Array.isArray(this.allowedDates) &&
2501
- this.allowedDates.indexOf(dayjs(value, format).format(this.dateFormat)) !== -1);
2502
- if (!isAllowedDate)
2503
- return false;
2504
- return true;
2513
+ const isAllowedDate = this.getAllowedDates(dayjs(value, format).toDate());
2514
+ return isAllowedDate;
2505
2515
  }
2506
2516
  isValidFormatDate(value, format, strict = true) {
2507
2517
  return dayjs(value, format, strict).isValid();
@@ -2516,16 +2526,7 @@ class DateInput extends TextInput {
2516
2526
  this.value = this.dateObject.format(this.dateFormat);
2517
2527
  }
2518
2528
  getAllowedDates(date) {
2519
- if (!this.allowedDates)
2520
- return true;
2521
- if (this.allowedDates.length === 0)
2522
- return false;
2523
- const dayjsDate = dayjs(date);
2524
- const dateString = dayjsDate.format(this.dateFormat);
2525
- if (this.allowedDates instanceof Function) {
2526
- return this.allowedDates(dateString);
2527
- }
2528
- return this.allowedDates.indexOf(dateString) !== -1;
2529
+ return isDateAllowed(date, this.dateFormat, this.allowedDates);
2529
2530
  }
2530
2531
  formatISODateValue(value) {
2531
2532
  if (value && this.isValidFormatDate(value, this.dateFormat)) {
@@ -2557,7 +2558,8 @@ class DateInput extends TextInput {
2557
2558
  this.showDatePicker = false;
2558
2559
  }
2559
2560
  }
2560
- onMounted() {
2561
+ onMounted(element) {
2562
+ super.onMounted(element);
2561
2563
  if (!this.value)
2562
2564
  return;
2563
2565
  this.setDateValue(this.formatter(this.value));
@@ -3573,9 +3575,41 @@ class Iterable extends ComponentRender {
3573
3575
  return this.datasource.data;
3574
3576
  }
3575
3577
  changeDefaultSlotNames(slot) {
3576
- const strMetadata = JSON.stringify(slot);
3577
- const newObj = strMetadata.replace(/<<NAME>>/g, this.name);
3578
- return JSON.parse(newObj);
3578
+ return this.recursiveReplace(slot, /<<NAME>>/g, this.name);
3579
+ }
3580
+ /**
3581
+ * Recursively replaces a pattern in all string values within an object/array tree
3582
+ * @param obj The object or array to process
3583
+ * @param pattern The regex pattern to search for
3584
+ * @param replacement The replacement string
3585
+ * @returns A new object/array with replaced values
3586
+ */
3587
+ recursiveReplace(obj, pattern, replacement) {
3588
+ // Handle null or undefined
3589
+ if (obj === null || obj === undefined) {
3590
+ return obj;
3591
+ }
3592
+ // Handle string values - perform replacement
3593
+ if (typeof obj === 'string') {
3594
+ return obj.replace(pattern, replacement);
3595
+ }
3596
+ // Handle arrays - recursively process each element
3597
+ if (Array.isArray(obj)) {
3598
+ return obj.map((item) => this.recursiveReplace(item, pattern, replacement));
3599
+ }
3600
+ // Handle objects - recursively process each property value
3601
+ if (this.isObject(obj)) {
3602
+ const newObj = {};
3603
+ for (const key in obj) {
3604
+ newObj[key] = this.recursiveReplace(obj[key], pattern, replacement);
3605
+ }
3606
+ return newObj;
3607
+ }
3608
+ // For all other types (functions, numbers, booleans, etc.), return as-is
3609
+ return obj;
3610
+ }
3611
+ isObject(value) {
3612
+ return typeof value === 'object';
3579
3613
  }
3580
3614
  findRow(key) {
3581
3615
  return this.getData().find((row) => this.getRowKey(row) === key);
@@ -12561,6 +12595,7 @@ FormatterParserProvider.registerParser('ZdTime', (value, { displayFormat = Confi
12561
12595
  InputFactory.register('ZdTime', Time);
12562
12596
 
12563
12597
  class DateRange extends TextInput {
12598
+ allowedDates;
12564
12599
  /**
12565
12600
  * Input auto complete.
12566
12601
  */
@@ -12664,6 +12699,7 @@ class DateRange extends TextInput {
12664
12699
  else {
12665
12700
  this.appendIcon = this.getInitValue('appendIcon', props.appendIcon, 'calendar');
12666
12701
  }
12702
+ this.allowedDates = this.getInitValue('allowedDates', props.allowedDates, this.allowedDates);
12667
12703
  this.autocomplete = this.getInitValue('autocomplete', props.autocomplete, this.autocomplete);
12668
12704
  this.dateFormat = this.getInitValue('dateFormat', props.dateFormat, this.dateFormat);
12669
12705
  this.dateValidation = this.dateValidation.bind(this);
@@ -12741,7 +12777,6 @@ class DateRange extends TextInput {
12741
12777
  this.internalValue = value;
12742
12778
  const [startDate, endDate] = value;
12743
12779
  const isStartValid = this.isValidFormatDate(startDate, this.dateFormat);
12744
- // if end date is not defined, no need to validate it
12745
12780
  const isEndValid = !endDate || this.isValidFormatDate(endDate, this.dateFormat);
12746
12781
  const areDatesValid = isStartValid && isEndValid;
12747
12782
  if (areDatesValid) {
@@ -12842,6 +12877,9 @@ class DateRange extends TextInput {
12842
12877
  const isValidMax = !maxDate || date.isBefore(maxDate) || date.isSame(maxDate);
12843
12878
  if (!isValidMax)
12844
12879
  return false;
12880
+ if (!this.getAllowedDates(dayjs(value, format).toDate())) {
12881
+ return false;
12882
+ }
12845
12883
  return true;
12846
12884
  }
12847
12885
  isValidFormatDate(value, format, strict = true) {
@@ -12998,9 +13036,19 @@ class DateRange extends TextInput {
12998
13036
  return [arr[0]];
12999
13037
  return [arr[0], arr[arr.length - 1]];
13000
13038
  }
13001
- setNativeDate(date) {
13039
+ setNativeDate(dates) {
13002
13040
  this.dateError = false;
13003
- this.dateObject = date.map((obj) => dayjs(obj));
13041
+ const dayjsDates = (dates || []).map((d) => dayjs(d));
13042
+ const [start, end] = this.getExtremities(dayjsDates);
13043
+ if (start && end) {
13044
+ for (let d = start; d.isBefore(end) || d.isSame(end); d = d.add(1, 'day')) {
13045
+ if (!this.getAllowedDates(d.toDate())) {
13046
+ this.dateError = true;
13047
+ return;
13048
+ }
13049
+ }
13050
+ }
13051
+ this.dateObject = (dates || []).map((obj) => dayjs(obj));
13004
13052
  const extremityDates = this.getExtremities(this.dateObject);
13005
13053
  this.value = extremityDates
13006
13054
  .filter((obj) => obj !== null)
@@ -13010,6 +13058,9 @@ class DateRange extends TextInput {
13010
13058
  getNativeDate() {
13011
13059
  return this.dateObject.filter((obj) => obj !== null).map((obj) => obj.toDate());
13012
13060
  }
13061
+ getAllowedDates(date) {
13062
+ return isDateAllowed(date, this.dateFormat, this.allowedDates);
13063
+ }
13013
13064
  getMaskValue() {
13014
13065
  let mask = '';
13015
13066
  if (typeof this.mask === 'function') {
@@ -2287,6 +2287,18 @@ FormatterParserProvider.registerParser('ZdTextInput', (value, { valueWithPrefix
2287
2287
  });
2288
2288
  InputFactory.register('ZdTextInput', TextInput);
2289
2289
 
2290
+ function isDateAllowed(date, dateFormat, allowedDates) {
2291
+ if (!allowedDates)
2292
+ return true;
2293
+ if (allowedDates.length === 0)
2294
+ return false;
2295
+ const dateString = dayjs(date).format(dateFormat);
2296
+ if (allowedDates instanceof Function) {
2297
+ return allowedDates(dateString);
2298
+ }
2299
+ return allowedDates.indexOf(dateString) !== -1;
2300
+ }
2301
+
2290
2302
  /**
2291
2303
  * Base class for Date component.
2292
2304
  */
@@ -2426,6 +2438,9 @@ class DateInput extends TextInput {
2426
2438
  if (this.isValidFormatDate(value, this.dateFormat)) {
2427
2439
  this.dateObject = dayjs(value, this.dateFormat);
2428
2440
  }
2441
+ else {
2442
+ this.dateObject = null;
2443
+ }
2429
2444
  }
2430
2445
  get displayValue() {
2431
2446
  return this.internalDisplayValue;
@@ -2495,13 +2510,8 @@ class DateInput extends TextInput {
2495
2510
  const isValidMax = !maxDate || date.isBefore(maxDate) || date.isSame(maxDate);
2496
2511
  if (!isValidMax)
2497
2512
  return false;
2498
- const isAllowedDate = this.allowedDates === undefined ||
2499
- (this.allowedDates instanceof Function && this.allowedDates(dayjs(value, format).format(this.dateFormat))) ||
2500
- (Array.isArray(this.allowedDates) &&
2501
- this.allowedDates.indexOf(dayjs(value, format).format(this.dateFormat)) !== -1);
2502
- if (!isAllowedDate)
2503
- return false;
2504
- return true;
2513
+ const isAllowedDate = this.getAllowedDates(dayjs(value, format).toDate());
2514
+ return isAllowedDate;
2505
2515
  }
2506
2516
  isValidFormatDate(value, format, strict = true) {
2507
2517
  return dayjs(value, format, strict).isValid();
@@ -2516,16 +2526,7 @@ class DateInput extends TextInput {
2516
2526
  this.value = this.dateObject.format(this.dateFormat);
2517
2527
  }
2518
2528
  getAllowedDates(date) {
2519
- if (!this.allowedDates)
2520
- return true;
2521
- if (this.allowedDates.length === 0)
2522
- return false;
2523
- const dayjsDate = dayjs(date);
2524
- const dateString = dayjsDate.format(this.dateFormat);
2525
- if (this.allowedDates instanceof Function) {
2526
- return this.allowedDates(dateString);
2527
- }
2528
- return this.allowedDates.indexOf(dateString) !== -1;
2529
+ return isDateAllowed(date, this.dateFormat, this.allowedDates);
2529
2530
  }
2530
2531
  formatISODateValue(value) {
2531
2532
  if (value && this.isValidFormatDate(value, this.dateFormat)) {
@@ -2557,7 +2558,8 @@ class DateInput extends TextInput {
2557
2558
  this.showDatePicker = false;
2558
2559
  }
2559
2560
  }
2560
- onMounted() {
2561
+ onMounted(element) {
2562
+ super.onMounted(element);
2561
2563
  if (!this.value)
2562
2564
  return;
2563
2565
  this.setDateValue(this.formatter(this.value));
@@ -3573,9 +3575,41 @@ class Iterable extends ComponentRender {
3573
3575
  return this.datasource.data;
3574
3576
  }
3575
3577
  changeDefaultSlotNames(slot) {
3576
- const strMetadata = JSON.stringify(slot);
3577
- const newObj = strMetadata.replace(/<<NAME>>/g, this.name);
3578
- return JSON.parse(newObj);
3578
+ return this.recursiveReplace(slot, /<<NAME>>/g, this.name);
3579
+ }
3580
+ /**
3581
+ * Recursively replaces a pattern in all string values within an object/array tree
3582
+ * @param obj The object or array to process
3583
+ * @param pattern The regex pattern to search for
3584
+ * @param replacement The replacement string
3585
+ * @returns A new object/array with replaced values
3586
+ */
3587
+ recursiveReplace(obj, pattern, replacement) {
3588
+ // Handle null or undefined
3589
+ if (obj === null || obj === undefined) {
3590
+ return obj;
3591
+ }
3592
+ // Handle string values - perform replacement
3593
+ if (typeof obj === 'string') {
3594
+ return obj.replace(pattern, replacement);
3595
+ }
3596
+ // Handle arrays - recursively process each element
3597
+ if (Array.isArray(obj)) {
3598
+ return obj.map((item) => this.recursiveReplace(item, pattern, replacement));
3599
+ }
3600
+ // Handle objects - recursively process each property value
3601
+ if (this.isObject(obj)) {
3602
+ const newObj = {};
3603
+ for (const key in obj) {
3604
+ newObj[key] = this.recursiveReplace(obj[key], pattern, replacement);
3605
+ }
3606
+ return newObj;
3607
+ }
3608
+ // For all other types (functions, numbers, booleans, etc.), return as-is
3609
+ return obj;
3610
+ }
3611
+ isObject(value) {
3612
+ return typeof value === 'object';
3579
3613
  }
3580
3614
  findRow(key) {
3581
3615
  return this.getData().find((row) => this.getRowKey(row) === key);
@@ -12561,6 +12595,7 @@ FormatterParserProvider.registerParser('ZdTime', (value, { displayFormat = Confi
12561
12595
  InputFactory.register('ZdTime', Time);
12562
12596
 
12563
12597
  class DateRange extends TextInput {
12598
+ allowedDates;
12564
12599
  /**
12565
12600
  * Input auto complete.
12566
12601
  */
@@ -12664,6 +12699,7 @@ class DateRange extends TextInput {
12664
12699
  else {
12665
12700
  this.appendIcon = this.getInitValue('appendIcon', props.appendIcon, 'calendar');
12666
12701
  }
12702
+ this.allowedDates = this.getInitValue('allowedDates', props.allowedDates, this.allowedDates);
12667
12703
  this.autocomplete = this.getInitValue('autocomplete', props.autocomplete, this.autocomplete);
12668
12704
  this.dateFormat = this.getInitValue('dateFormat', props.dateFormat, this.dateFormat);
12669
12705
  this.dateValidation = this.dateValidation.bind(this);
@@ -12741,7 +12777,6 @@ class DateRange extends TextInput {
12741
12777
  this.internalValue = value;
12742
12778
  const [startDate, endDate] = value;
12743
12779
  const isStartValid = this.isValidFormatDate(startDate, this.dateFormat);
12744
- // if end date is not defined, no need to validate it
12745
12780
  const isEndValid = !endDate || this.isValidFormatDate(endDate, this.dateFormat);
12746
12781
  const areDatesValid = isStartValid && isEndValid;
12747
12782
  if (areDatesValid) {
@@ -12842,6 +12877,9 @@ class DateRange extends TextInput {
12842
12877
  const isValidMax = !maxDate || date.isBefore(maxDate) || date.isSame(maxDate);
12843
12878
  if (!isValidMax)
12844
12879
  return false;
12880
+ if (!this.getAllowedDates(dayjs(value, format).toDate())) {
12881
+ return false;
12882
+ }
12845
12883
  return true;
12846
12884
  }
12847
12885
  isValidFormatDate(value, format, strict = true) {
@@ -12998,9 +13036,19 @@ class DateRange extends TextInput {
12998
13036
  return [arr[0]];
12999
13037
  return [arr[0], arr[arr.length - 1]];
13000
13038
  }
13001
- setNativeDate(date) {
13039
+ setNativeDate(dates) {
13002
13040
  this.dateError = false;
13003
- this.dateObject = date.map((obj) => dayjs(obj));
13041
+ const dayjsDates = (dates || []).map((d) => dayjs(d));
13042
+ const [start, end] = this.getExtremities(dayjsDates);
13043
+ if (start && end) {
13044
+ for (let d = start; d.isBefore(end) || d.isSame(end); d = d.add(1, 'day')) {
13045
+ if (!this.getAllowedDates(d.toDate())) {
13046
+ this.dateError = true;
13047
+ return;
13048
+ }
13049
+ }
13050
+ }
13051
+ this.dateObject = (dates || []).map((obj) => dayjs(obj));
13004
13052
  const extremityDates = this.getExtremities(this.dateObject);
13005
13053
  this.value = extremityDates
13006
13054
  .filter((obj) => obj !== null)
@@ -13010,6 +13058,9 @@ class DateRange extends TextInput {
13010
13058
  getNativeDate() {
13011
13059
  return this.dateObject.filter((obj) => obj !== null).map((obj) => obj.toDate());
13012
13060
  }
13061
+ getAllowedDates(date) {
13062
+ return isDateAllowed(date, this.dateFormat, this.allowedDates);
13063
+ }
13013
13064
  getMaskValue() {
13014
13065
  let mask = '';
13015
13066
  if (typeof this.mask === 'function') {
@@ -0,0 +1,6 @@
1
+ {
2
+ "development": {
3
+ },
4
+ "production": {
5
+ }
6
+ }
package/jest.config.cjs CHANGED
@@ -7,4 +7,5 @@ module.exports = {
7
7
  coveragePathIgnorePatterns: [
8
8
  "/tests/unit/__helpers__/"
9
9
  ],
10
+ setupFilesAfterEnv: ['<rootDir>/tests/unit/utils/mock-console.ts'],
10
11
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeedhi/common",
3
- "version": "3.0.5",
3
+ "version": "3.0.6",
4
4
  "description": "Zeedhi Common",
5
5
  "author": "Zeedhi <zeedhi@teknisa.com>",
6
6
  "license": "ISC",
@@ -21,7 +21,7 @@
21
21
  },
22
22
  "dependencies": {
23
23
  "@zeedhi/autonumeric": "^4.6.3",
24
- "@zeedhi/core": "^3.0.5",
24
+ "@zeedhi/core": "^3.0.6",
25
25
  "lodash.clonedeep": "^4.5.0",
26
26
  "lodash.debounce": "^4.0.8",
27
27
  "lodash.get": "^4.4.2",
@@ -42,5 +42,8 @@
42
42
  "lodash.times": "^4.3.2",
43
43
  "mockdate": "^3.0.5"
44
44
  },
45
- "gitHead": "2c7e039fc90ab9b705354a51f0de77496f2556dd"
45
+ "env": {
46
+ "NODE_ENV": "production"
47
+ },
48
+ "gitHead": "8968e2b143f77acec2e51a6ca22f2e25646d0078"
46
49
  }
@@ -3,6 +3,7 @@ import isUndefined from 'lodash.isundefined';
3
3
  import { InputFactory } from '../zd-input/input-factory';
4
4
  import { TextInput } from '../zd-text-input/text-input';
5
5
  import { IDateInput } from './interfaces';
6
+ import { isDateAllowed } from '../../utils/date-utils/date-utils';
6
7
 
7
8
  /**
8
9
  * Base class for Date component.
@@ -175,6 +176,8 @@ export class DateInput extends TextInput implements IDateInput {
175
176
  }
176
177
  if (this.isValidFormatDate(value, this.dateFormat)) {
177
178
  this.dateObject = dayjs(value, this.dateFormat);
179
+ } else {
180
+ this.dateObject = null;
178
181
  }
179
182
  }
180
183
 
@@ -252,15 +255,9 @@ export class DateInput extends TextInput implements IDateInput {
252
255
  const isValidMax = !maxDate || date.isBefore(maxDate) || date.isSame(maxDate);
253
256
  if (!isValidMax) return false;
254
257
 
255
- const isAllowedDate =
256
- this.allowedDates === undefined ||
257
- (this.allowedDates instanceof Function && this.allowedDates(dayjs(value, format).format(this.dateFormat))) ||
258
- (Array.isArray(this.allowedDates) &&
259
- this.allowedDates.indexOf(dayjs(value, format).format(this.dateFormat)) !== -1);
260
-
261
- if (!isAllowedDate) return false;
258
+ const isAllowedDate = this.getAllowedDates(dayjs(value, format).toDate());
262
259
 
263
- return true;
260
+ return isAllowedDate;
264
261
  }
265
262
 
266
263
  public isValidFormatDate(value: string, format: string, strict = true): boolean {
@@ -280,18 +277,7 @@ export class DateInput extends TextInput implements IDateInput {
280
277
  }
281
278
 
282
279
  public getAllowedDates(date: Date) {
283
- if (!this.allowedDates) return true;
284
-
285
- if (this.allowedDates.length === 0) return false;
286
-
287
- const dayjsDate = dayjs(date);
288
- const dateString = dayjsDate.format(this.dateFormat);
289
-
290
- if (this.allowedDates instanceof Function) {
291
- return this.allowedDates(dateString);
292
- }
293
-
294
- return this.allowedDates.indexOf(dateString) !== -1;
280
+ return isDateAllowed(date, this.dateFormat, this.allowedDates);
295
281
  }
296
282
 
297
283
  public formatISODateValue(value: string): string {
@@ -329,7 +315,9 @@ export class DateInput extends TextInput implements IDateInput {
329
315
  }
330
316
  }
331
317
 
332
- public onMounted() {
318
+ public onMounted(element: any) {
319
+ super.onMounted(element);
320
+
333
321
  if (!this.value) return;
334
322
 
335
323
  this.setDateValue(this.formatter(this.value));
@@ -1,11 +1,13 @@
1
1
  import { Config, DateHelper, FormatterParserProvider, I18n, Mask, Utils, dayjs } from '@zeedhi/core';
2
2
  import isUndefined from 'lodash.isundefined';
3
3
  import { IDateRange } from './interfaces';
4
-
4
+ import { isDateAllowed } from '../../utils/date-utils/date-utils';
5
5
  import { InputFactory } from '../zd-input/input-factory';
6
6
  import { TextInput } from '../zd-text-input/text-input';
7
7
 
8
8
  export class DateRange extends TextInput implements IDateRange {
9
+
10
+ public allowedDates?: string[] | ((date: string) => boolean);
9
11
  /**
10
12
  * Input auto complete.
11
13
  */
@@ -134,6 +136,7 @@ export class DateRange extends TextInput implements IDateRange {
134
136
  } else {
135
137
  this.appendIcon = this.getInitValue('appendIcon', props.appendIcon, 'calendar');
136
138
  }
139
+ this.allowedDates = this.getInitValue('allowedDates', props.allowedDates, this.allowedDates);
137
140
  this.autocomplete = this.getInitValue('autocomplete', props.autocomplete, this.autocomplete);
138
141
  this.dateFormat = this.getInitValue('dateFormat', props.dateFormat, this.dateFormat);
139
142
  this.dateValidation = this.dateValidation.bind(this);
@@ -223,7 +226,6 @@ export class DateRange extends TextInput implements IDateRange {
223
226
 
224
227
  const [startDate, endDate] = value;
225
228
  const isStartValid = this.isValidFormatDate(startDate, this.dateFormat);
226
- // if end date is not defined, no need to validate it
227
229
  const isEndValid = !endDate || this.isValidFormatDate(endDate, this.dateFormat);
228
230
  const areDatesValid = isStartValid && isEndValid;
229
231
 
@@ -328,6 +330,10 @@ export class DateRange extends TextInput implements IDateRange {
328
330
  const isValidMax = !maxDate || date.isBefore(maxDate) || date.isSame(maxDate);
329
331
  if (!isValidMax) return false;
330
332
 
333
+ if (!this.getAllowedDates(dayjs(value, format).toDate())) {
334
+ return false;
335
+ }
336
+
331
337
  return true;
332
338
  }
333
339
 
@@ -515,9 +521,22 @@ export class DateRange extends TextInput implements IDateRange {
515
521
  return [arr[0], arr[arr.length - 1]];
516
522
  }
517
523
 
518
- public setNativeDate(date: Date[]) {
524
+ public setNativeDate(dates: Date[]) {
519
525
  this.dateError = false;
520
- this.dateObject = date.map((obj) => dayjs(obj));
526
+
527
+ const dayjsDates = (dates || []).map((d) => dayjs(d));
528
+ const [start, end] = this.getExtremities(dayjsDates);
529
+
530
+ if (start && end) {
531
+ for (let d = start; d.isBefore(end) || d.isSame(end); d = d.add(1, 'day')) {
532
+ if (!this.getAllowedDates(d.toDate())) {
533
+ this.dateError = true;
534
+ return;
535
+ }
536
+ }
537
+ }
538
+
539
+ this.dateObject = (dates || []).map((obj) => dayjs(obj));
521
540
 
522
541
  const extremityDates = this.getExtremities(this.dateObject);
523
542
  this.value = extremityDates
@@ -531,6 +550,10 @@ export class DateRange extends TextInput implements IDateRange {
531
550
  return this.dateObject.filter((obj): obj is dayjs.Dayjs => obj !== null).map((obj) => obj.toDate());
532
551
  }
533
552
 
553
+ public getAllowedDates(date: Date) {
554
+ return isDateAllowed(date, this.dateFormat, this.allowedDates);
555
+ }
556
+
534
557
  public getMaskValue() {
535
558
  let mask: any = '';
536
559
 
@@ -234,9 +234,47 @@ export abstract class Iterable<T extends Column = Column>
234
234
  }
235
235
 
236
236
  protected changeDefaultSlotNames(slot: IComponentRender[]) {
237
- const strMetadata = JSON.stringify(slot);
238
- const newObj = strMetadata.replace(/<<NAME>>/g, this.name);
239
- return JSON.parse(newObj);
237
+ return this.recursiveReplace(slot, /<<NAME>>/g, this.name);
238
+ }
239
+
240
+ /**
241
+ * Recursively replaces a pattern in all string values within an object/array tree
242
+ * @param obj The object or array to process
243
+ * @param pattern The regex pattern to search for
244
+ * @param replacement The replacement string
245
+ * @returns A new object/array with replaced values
246
+ */
247
+ private recursiveReplace(obj: unknown, pattern: RegExp, replacement: string): any {
248
+ // Handle null or undefined
249
+ if (obj === null || obj === undefined) {
250
+ return obj;
251
+ }
252
+
253
+ // Handle string values - perform replacement
254
+ if (typeof obj === 'string') {
255
+ return obj.replace(pattern, replacement);
256
+ }
257
+
258
+ // Handle arrays - recursively process each element
259
+ if (Array.isArray(obj)) {
260
+ return obj.map((item) => this.recursiveReplace(item, pattern, replacement));
261
+ }
262
+
263
+ // Handle objects - recursively process each property value
264
+ if (this.isObject(obj)) {
265
+ const newObj: IDictionary = {};
266
+ for (const key in obj) {
267
+ newObj[key] = this.recursiveReplace(obj[key], pattern, replacement);
268
+ }
269
+ return newObj;
270
+ }
271
+
272
+ // For all other types (functions, numbers, booleans, etc.), return as-is
273
+ return obj;
274
+ }
275
+
276
+ private isObject(value: unknown): value is IDictionary {
277
+ return typeof value === 'object';
240
278
  }
241
279
 
242
280
  public findRow(key: string | number) {
@@ -0,0 +1,18 @@
1
+ import { dayjs } from '@zeedhi/core';
2
+
3
+ export function isDateAllowed(
4
+ date: Date,
5
+ dateFormat: string,
6
+ allowedDates?: ((date: string) => boolean) | string[],
7
+ ): boolean {
8
+ if (!allowedDates) return true;
9
+
10
+ if (allowedDates.length === 0) return false;
11
+
12
+ const dateString = dayjs(date).format(dateFormat);
13
+
14
+ if (allowedDates instanceof Function) {
15
+ return allowedDates(dateString);
16
+ }
17
+ return allowedDates.indexOf(dateString) !== -1;
18
+ }