@tuki-io/tuki-widgets 0.0.72 → 0.0.74

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 (350) hide show
  1. package/.editorconfig +16 -0
  2. package/.hintrc +14 -0
  3. package/.vscode/extensions.json +4 -0
  4. package/.vscode/launch.json +20 -0
  5. package/.vscode/tasks.json +42 -0
  6. package/README.md +25 -24
  7. package/angular.json +141 -0
  8. package/package.json +42 -7
  9. package/projects/tuki/widgets/README.md +24 -0
  10. package/projects/tuki/widgets/di2mt/api/api.endpoints.ts +26 -0
  11. package/projects/tuki/widgets/di2mt/assets/icons/details_d_icon.svg +3 -0
  12. package/{di2mt → projects/tuki/widgets/di2mt}/public-api.ts +1 -0
  13. package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/summary-card/summary-card.component.html +2 -2
  14. package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/summary-card/summary-card.component.scss +4 -1
  15. package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/table-filters/table-filters.component.html +3 -3
  16. package/projects/tuki/widgets/di2mt/shared/components/table-filters/table-filters.component.scss +244 -0
  17. package/{user-device-manage/src → projects/tuki/widgets/di2mt/shared/constants}/app.constants.ts +96 -96
  18. package/{di2mt → projects/tuki/widgets/di2mt}/shared/types/constants.ts +2 -1
  19. package/projects/tuki/widgets/di2mt/widgets/site-upgrade/progress-bar/progress-bar.component.html +3 -0
  20. package/projects/tuki/widgets/di2mt/widgets/site-upgrade/progress-bar/progress-bar.component.scss +37 -0
  21. package/projects/tuki/widgets/di2mt/widgets/site-upgrade/progress-bar/progress-bar.component.ts +40 -0
  22. package/projects/tuki/widgets/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.html +158 -0
  23. package/projects/tuki/widgets/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.scss +430 -0
  24. package/projects/tuki/widgets/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.ts +362 -0
  25. package/projects/tuki/widgets/di2mt/widgets/site-upgrade/site-upgrade.module.ts +33 -0
  26. package/projects/tuki/widgets/di2mt/widgets/site-upgrade/site-upgrade.service.ts +102 -0
  27. package/projects/tuki/widgets/di2mt/widgets/site-upgrade/types/user-upgrade.ts +22 -0
  28. package/{di2mt → projects/tuki/widgets/di2mt}/widgets/user-upgrade/types/user-upgrade.ts +2 -1
  29. package/{di2mt → projects/tuki/widgets/di2mt}/widgets/user-upgrade/user-upgrade-data-table/user-upgrade-data-table.component.html +68 -13
  30. package/{di2mt → projects/tuki/widgets/di2mt}/widgets/user-upgrade/user-upgrade-data-table/user-upgrade-data-table.component.scss +73 -3
  31. package/projects/tuki/widgets/di2mt/widgets/user-upgrade/user-upgrade-data-table/user-upgrade-data-table.component.ts +313 -0
  32. package/projects/tuki/widgets/di2mt/widgets/user-upgrade/user-upgrade.module.ts +34 -0
  33. package/projects/tuki/widgets/di2mt/widgets/user-upgrade/user-upgrade.service.ts +79 -0
  34. package/{karma.conf.js → projects/tuki/widgets/karma.conf.js} +44 -44
  35. package/projects/tuki/widgets/package.json +13 -0
  36. package/{src → projects/tuki/widgets/src}/lib/widgets.component.spec.ts +23 -23
  37. package/{src → projects/tuki/widgets/src}/lib/widgets.component.ts +20 -20
  38. package/{src → projects/tuki/widgets/src}/lib/widgets.module.ts +16 -16
  39. package/{src → projects/tuki/widgets/src}/lib/widgets.service.spec.ts +16 -16
  40. package/{src → projects/tuki/widgets/src}/lib/widgets.service.ts +9 -9
  41. package/{src → projects/tuki/widgets/src}/public-api.ts +7 -7
  42. package/{src → projects/tuki/widgets/src}/test.ts +27 -27
  43. package/{users-list/src/styles → projects/tuki/widgets}/styles.scss +572 -572
  44. package/{tsconfig.lib.json → projects/tuki/widgets/tsconfig.lib.json} +36 -36
  45. package/{tsconfig.lib.prod.json → projects/tuki/widgets/tsconfig.lib.prod.json} +10 -10
  46. package/{tsconfig.spec.json → projects/tuki/widgets/tsconfig.spec.json} +17 -17
  47. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/public-api.ts +8 -8
  48. package/projects/tuki/widgets/user-device-manage/src/app.constants.ts +96 -0
  49. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/assets/icons/arrow-left.svg +5 -5
  50. package/{user-manage → projects/tuki/widgets/user-device-manage}/src/assets/icons/arrow-right.svg +5 -5
  51. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/assets/icons/close_icon_x.svg +3 -3
  52. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/assets/icons/delete_icon.svg +5 -5
  53. package/{user-manage → projects/tuki/widgets/user-device-manage}/src/assets/icons/dragger-vertical-icon.svg +3 -3
  54. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/assets/icons/vartical_divider_icon.svg +3 -3
  55. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/classes/device.ts +292 -292
  56. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/classes/line-association-interface.ts +50 -50
  57. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/classes/line-association.ts +177 -177
  58. package/{user-manage → projects/tuki/widgets/user-device-manage}/src/classes/line-call-info-display.ts +21 -21
  59. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/classes/line-directory.ts +41 -41
  60. package/{users-list → projects/tuki/widgets/user-device-manage}/src/classes/line.ts +144 -144
  61. package/{user-manage → projects/tuki/widgets/user-device-manage}/src/classes/notification.ts +40 -39
  62. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/classes/recording-options.ts +6 -6
  63. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/classes/simplified-user.ts +169 -169
  64. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/classes/site-defaults.ts +167 -167
  65. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/classes/translation-pattern.ts +50 -50
  66. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/classes/types.ts +19 -19
  67. package/{user-manage → projects/tuki/widgets/user-device-manage}/src/classes/user-interface.ts +225 -225
  68. package/{user-manage → projects/tuki/widgets/user-device-manage}/src/classes/user.ts +8 -8
  69. package/{user-manage → projects/tuki/widgets/user-device-manage}/src/common-functions.ts +16 -16
  70. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/confirm-dialog/info-dialog.component.html +14 -14
  71. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/confirm-dialog/info-dialog.component.scss +80 -80
  72. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/confirm-dialog/info-dialog.component.ts +35 -35
  73. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/device-associated-line/associated-line-row/associated-line-row.component.html +21 -21
  74. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/device-associated-line/associated-line-row/associated-line-row.component.scss +97 -97
  75. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/device-associated-line/associated-line-row/associated-line-row.component.ts +28 -28
  76. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/device-associated-line/device-associated-line-details-box/device-associated-line-details-box.component.html +5 -5
  77. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/device-associated-line/device-associated-line-details-box/device-associated-line-details-box.component.scss +19 -19
  78. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/device-associated-line/device-associated-line-details-box/device-associated-line-details-box.component.ts +13 -13
  79. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/device-associated-line/device-associated-line-extension/device-associated-line-extension.component.html +6 -6
  80. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/device-associated-line/device-associated-line-extension/device-associated-line-extension.component.scss +4 -4
  81. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/device-associated-line/device-associated-line-extension/device-associated-line-extension.component.ts +63 -63
  82. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/device-associated-line/device-associated-line.component.html +241 -241
  83. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/device-associated-line/device-associated-line.component.scss +500 -500
  84. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/device-associated-line/device-associated-line.component.ts +194 -194
  85. package/{user-manage → projects/tuki/widgets/user-device-manage}/src/device-list/device-list.component.html +27 -27
  86. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/device-list/device-list.component.scss +131 -131
  87. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/device-list/device-list.component.ts +25 -25
  88. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/device-manage-widget.component.html +209 -209
  89. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/device-manage-widget.component.scss +502 -502
  90. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/device-manage-widget.component.ts +354 -354
  91. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/environments/environment.prod.ts +9 -9
  92. package/{user-manage → projects/tuki/widgets/user-device-manage}/src/environments/environment.ts +10 -10
  93. package/{user-manage → projects/tuki/widgets/user-device-manage}/src/interseptors/auth.interceptor.ts +35 -35
  94. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/lazy-loading-select/lazy-loading-select.component.html +50 -50
  95. package/{user-manage → projects/tuki/widgets/user-device-manage}/src/lazy-loading-select/lazy-loading-select.component.scss +8 -8
  96. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/lazy-loading-select/lazy-loading-select.component.ts +81 -81
  97. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/material.module.ts +87 -87
  98. package/{user-manage → projects/tuki/widgets/user-device-manage}/src/notifications/notification.component.html +33 -33
  99. package/{user-manage → projects/tuki/widgets/user-device-manage}/src/notifications/notification.component.scss +84 -84
  100. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/notifications/notification.component.ts +46 -46
  101. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/removeKynFromIBM.service.ts +25 -25
  102. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/services/api.service.ts +87 -87
  103. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/services/common-functions.ts +17 -17
  104. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/services/device.service.ts +95 -95
  105. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/services/dns.service.ts +111 -111
  106. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/services/line.service.ts +89 -89
  107. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/services/notification.service.ts +68 -68
  108. package/{users-list → projects/tuki/widgets/user-device-manage}/src/services/removeKynFromIBM.service.ts +25 -25
  109. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/services/site-settings.service.ts +82 -82
  110. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/services/sorting-utils.service.ts +203 -203
  111. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/services/user.service.ts +283 -283
  112. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/services/utils.service.ts +87 -87
  113. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/services/validation.service.ts +829 -829
  114. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/styles/_variables.scss +90 -90
  115. package/{user-manage → projects/tuki/widgets/user-device-manage}/src/styles/form.scss +231 -231
  116. package/{user-manage → projects/tuki/widgets/user-device-manage}/src/styles/icons.scss +32 -32
  117. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/styles/styles.scss +110 -110
  118. package/{user-manage → projects/tuki/widgets/user-device-manage}/src/styles/tables.scss +30 -30
  119. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/user-device-manage.module.ts +73 -73
  120. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/utils/app-loader/app-loader.component.html +6 -6
  121. package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/utils/app-loader/app-loader.component.scss +11 -11
  122. package/{user-manage → projects/tuki/widgets/user-device-manage}/src/utils/app-loader/app-loader.ts +13 -13
  123. package/{user-manage → projects/tuki/widgets/user-manage}/public-api.ts +6 -6
  124. package/{user-manage → projects/tuki/widgets/user-manage}/src/app.constants.ts +50 -50
  125. package/{user-manage → projects/tuki/widgets/user-manage}/src/assets/icons/arrow-left.svg +5 -5
  126. package/{user-device-manage → projects/tuki/widgets/user-manage}/src/assets/icons/arrow-right.svg +5 -5
  127. package/{user-manage → projects/tuki/widgets/user-manage}/src/assets/icons/delete_icon.svg +5 -5
  128. package/{user-device-manage → projects/tuki/widgets/user-manage}/src/assets/icons/dragger-vertical-icon.svg +3 -3
  129. package/{user-manage → projects/tuki/widgets/user-manage}/src/assets/icons/vartical_divider_icon.svg +3 -3
  130. package/{user-manage → projects/tuki/widgets/user-manage}/src/classes/device.ts +232 -232
  131. package/{user-manage → projects/tuki/widgets/user-manage}/src/classes/line-association-interface.ts +43 -43
  132. package/{user-manage → projects/tuki/widgets/user-manage}/src/classes/line-association.ts +161 -161
  133. package/{user-device-manage → projects/tuki/widgets/user-manage}/src/classes/line-call-info-display.ts +21 -21
  134. package/{user-manage → projects/tuki/widgets/user-manage}/src/classes/line-directory.ts +42 -42
  135. package/{user-manage → projects/tuki/widgets/user-manage}/src/classes/line.ts +144 -144
  136. package/{user-device-manage → projects/tuki/widgets/user-manage}/src/classes/notification.ts +39 -40
  137. package/{user-manage → projects/tuki/widgets/user-manage}/src/classes/pagination.ts +1 -1
  138. package/{user-manage → projects/tuki/widgets/user-manage}/src/classes/recording-options.ts +6 -6
  139. package/{user-manage → projects/tuki/widgets/user-manage}/src/classes/simplified-user.ts +165 -165
  140. package/{user-manage → projects/tuki/widgets/user-manage}/src/classes/table-data.ts +6 -6
  141. package/{user-manage → projects/tuki/widgets/user-manage}/src/classes/translation-pattern.ts +49 -49
  142. package/{users-list → projects/tuki/widgets/user-manage}/src/classes/user-interface.ts +225 -225
  143. package/{user-manage → projects/tuki/widgets/user-manage}/src/classes/user-list.ts +42 -42
  144. package/{users-list → projects/tuki/widgets/user-manage}/src/classes/user.ts +8 -8
  145. package/{user-device-manage → projects/tuki/widgets/user-manage}/src/common-functions.ts +16 -16
  146. package/{user-device-manage → projects/tuki/widgets/user-manage}/src/device-list/device-list.component.html +27 -27
  147. package/{user-manage → projects/tuki/widgets/user-manage}/src/device-list/device-list.component.scss +131 -131
  148. package/{user-manage → projects/tuki/widgets/user-manage}/src/device-list/device-list.component.ts +25 -25
  149. package/{user-manage → projects/tuki/widgets/user-manage}/src/environments/environment.prod.ts +9 -9
  150. package/{user-device-manage → projects/tuki/widgets/user-manage}/src/environments/environment.ts +10 -10
  151. package/{user-device-manage → projects/tuki/widgets/user-manage}/src/interseptors/auth.interceptor.ts +35 -35
  152. package/{user-manage → projects/tuki/widgets/user-manage}/src/lazy-loading-select/lazy-loading-select.component.html +50 -50
  153. package/{user-device-manage → projects/tuki/widgets/user-manage}/src/lazy-loading-select/lazy-loading-select.component.scss +8 -8
  154. package/{user-manage → projects/tuki/widgets/user-manage}/src/lazy-loading-select/lazy-loading-select.component.ts +81 -81
  155. package/{user-manage → projects/tuki/widgets/user-manage}/src/material.module.ts +85 -85
  156. package/{user-device-manage → projects/tuki/widgets/user-manage}/src/notifications/notification.component.html +33 -33
  157. package/{user-device-manage → projects/tuki/widgets/user-manage}/src/notifications/notification.component.scss +84 -84
  158. package/{user-manage → projects/tuki/widgets/user-manage}/src/notifications/notification.component.ts +46 -46
  159. package/{user-manage → projects/tuki/widgets/user-manage}/src/removeKynFromIBM.service.ts +25 -25
  160. package/{user-manage → projects/tuki/widgets/user-manage}/src/services/api.service.ts +90 -90
  161. package/{user-manage → projects/tuki/widgets/user-manage}/src/services/dns.service.ts +116 -116
  162. package/{user-manage → projects/tuki/widgets/user-manage}/src/services/line.service.ts +31 -31
  163. package/{user-manage → projects/tuki/widgets/user-manage}/src/services/notification.service.ts +68 -68
  164. package/{user-device-manage → projects/tuki/widgets/user-manage}/src/services/removeKynFromIBM.service.ts +25 -25
  165. package/{user-manage → projects/tuki/widgets/user-manage}/src/services/site-settings.service.ts +35 -35
  166. package/{user-manage → projects/tuki/widgets/user-manage}/src/services/sorting-utils.service.ts +203 -203
  167. package/{user-manage → projects/tuki/widgets/user-manage}/src/services/user.service.ts +242 -242
  168. package/{user-manage → projects/tuki/widgets/user-manage}/src/services/users-search.service.ts +59 -59
  169. package/{users-list/src/utils → projects/tuki/widgets/user-manage/src/services}/utils.service.ts +71 -71
  170. package/{user-manage → projects/tuki/widgets/user-manage}/src/styles/_variables.scss +90 -90
  171. package/{user-device-manage → projects/tuki/widgets/user-manage}/src/styles/form.scss +231 -231
  172. package/{user-device-manage → projects/tuki/widgets/user-manage}/src/styles/icons.scss +32 -32
  173. package/{user-manage → projects/tuki/widgets/user-manage}/src/styles/styles.scss +110 -110
  174. package/{user-device-manage → projects/tuki/widgets/user-manage}/src/styles/tables.scss +30 -30
  175. package/{user-manage → projects/tuki/widgets/user-manage}/src/user-calling/user-calling-extension/user-calling-extension.component.html +10 -10
  176. package/{user-manage → projects/tuki/widgets/user-manage}/src/user-calling/user-calling-extension/user-calling-extension.component.scss +429 -429
  177. package/{user-manage → projects/tuki/widgets/user-manage}/src/user-calling/user-calling-extension/user-calling-extension.component.ts +63 -63
  178. package/{user-manage → projects/tuki/widgets/user-manage}/src/user-calling/user-calling.component.html +32 -32
  179. package/{user-manage → projects/tuki/widgets/user-manage}/src/user-calling/user-calling.component.scss +444 -444
  180. package/{user-manage → projects/tuki/widgets/user-manage}/src/user-calling/user-calling.component.ts +89 -89
  181. package/{user-manage → projects/tuki/widgets/user-manage}/src/user-details/notification.service.ts +68 -68
  182. package/{user-manage → projects/tuki/widgets/user-manage}/src/user-info/user-info.component.html +29 -29
  183. package/{user-manage → projects/tuki/widgets/user-manage}/src/user-info/user-info.component.scss +64 -64
  184. package/{user-manage → projects/tuki/widgets/user-manage}/src/user-info/user-info.component.ts +19 -19
  185. package/{user-manage → projects/tuki/widgets/user-manage}/src/user-manage-widget.component.html +290 -290
  186. package/{user-manage → projects/tuki/widgets/user-manage}/src/user-manage-widget.component.scss +463 -463
  187. package/{user-manage → projects/tuki/widgets/user-manage}/src/user-manage-widget.component.ts +212 -212
  188. package/{user-manage → projects/tuki/widgets/user-manage}/src/user-manage.module.ts +63 -63
  189. package/{user-manage → projects/tuki/widgets/user-manage}/src/utils/app-loader/app-loader.component.html +6 -6
  190. package/{user-manage → projects/tuki/widgets/user-manage}/src/utils/app-loader/app-loader.component.scss +11 -11
  191. package/{user-device-manage → projects/tuki/widgets/user-manage}/src/utils/app-loader/app-loader.ts +13 -13
  192. package/{users-list → projects/tuki/widgets/user-manage}/src/utils/pagination/pagination.component.html +26 -26
  193. package/{user-manage → projects/tuki/widgets/user-manage}/src/utils/pagination/pagination.component.scss +41 -41
  194. package/{user-manage → projects/tuki/widgets/user-manage}/src/utils/pagination/pagination.component.ts +41 -41
  195. package/{users-list → projects/tuki/widgets/users-list}/public-api.ts +8 -8
  196. package/{users-list → projects/tuki/widgets/users-list}/src/app.constants.ts +54 -54
  197. package/{users-list → projects/tuki/widgets/users-list}/src/assets/icons/close_icon_modal.svg +3 -3
  198. package/{users-list → projects/tuki/widgets/users-list}/src/assets/icons/move_user_to_another_location.svg +14 -14
  199. package/{users-list → projects/tuki/widgets/users-list}/src/assets/icons/white-close-icon.svg +3 -3
  200. package/{users-list → projects/tuki/widgets/users-list}/src/classes/app-location.ts +36 -36
  201. package/{users-list → projects/tuki/widgets/users-list}/src/classes/device.ts +225 -225
  202. package/{user-device-manage → projects/tuki/widgets/users-list}/src/classes/line.ts +144 -144
  203. package/{users-list → projects/tuki/widgets/users-list}/src/classes/move-user.ts +225 -225
  204. package/{users-list → projects/tuki/widgets/users-list}/src/classes/notification.ts +38 -38
  205. package/{users-list → projects/tuki/widgets/users-list}/src/classes/pagination.ts +18 -18
  206. package/{users-list → projects/tuki/widgets/users-list}/src/classes/simlified-user.ts +74 -74
  207. package/{users-list → projects/tuki/widgets/users-list}/src/classes/table-data.ts +6 -6
  208. package/{user-device-manage → projects/tuki/widgets/users-list}/src/classes/user-interface.ts +225 -225
  209. package/{users-list → projects/tuki/widgets/users-list}/src/classes/user-list.ts +47 -47
  210. package/{user-device-manage → projects/tuki/widgets/users-list}/src/classes/user.ts +8 -8
  211. package/{users-list → projects/tuki/widgets/users-list}/src/material.module.ts +94 -94
  212. package/{users-list → projects/tuki/widgets/users-list}/src/move-user-wizard/move-user-stepper/device-move-user/device-move-user-wizard.component.html +37 -37
  213. package/{users-list → projects/tuki/widgets/users-list}/src/move-user-wizard/move-user-stepper/device-move-user/device-move-user-wizard.component.scss +129 -129
  214. package/{users-list → projects/tuki/widgets/users-list}/src/move-user-wizard/move-user-stepper/device-move-user/device-move-user-wizard.component.ts +46 -46
  215. package/{users-list → projects/tuki/widgets/users-list}/src/move-user-wizard/move-user-stepper/device-move-user-tab/devices-move-user-wizard-tab.component.html +31 -31
  216. package/{users-list → projects/tuki/widgets/users-list}/src/move-user-wizard/move-user-stepper/device-move-user-tab/devices-move-user-wizard-tab.component.scss +20 -20
  217. package/{users-list → projects/tuki/widgets/users-list}/src/move-user-wizard/move-user-stepper/device-move-user-tab/devices-move-user-wizard-tab.component.ts +26 -26
  218. package/{users-list → projects/tuki/widgets/users-list}/src/move-user-wizard/move-user-stepper/move-user-stepper.component.html +222 -222
  219. package/{users-list → projects/tuki/widgets/users-list}/src/move-user-wizard/move-user-stepper/move-user-stepper.component.scss +239 -239
  220. package/{users-list → projects/tuki/widgets/users-list}/src/move-user-wizard/move-user-stepper/move-user-stepper.component.ts +206 -206
  221. package/{users-list → projects/tuki/widgets/users-list}/src/move-user-wizard/move-user-wizard.component.html +12 -12
  222. package/{users-list → projects/tuki/widgets/users-list}/src/move-user-wizard/move-user-wizard.component.scss +41 -41
  223. package/{users-list → projects/tuki/widgets/users-list}/src/move-user-wizard/move-user-wizard.component.ts +36 -36
  224. package/{users-list → projects/tuki/widgets/users-list}/src/services/api-webex.service.ts +14 -14
  225. package/{users-list → projects/tuki/widgets/users-list}/src/services/api.service.ts +90 -90
  226. package/{users-list → projects/tuki/widgets/users-list}/src/services/dns.service.ts +128 -128
  227. package/{users-list → projects/tuki/widgets/users-list}/src/services/events-communication.service.ts +11 -11
  228. package/{users-list → projects/tuki/widgets/users-list}/src/services/move-user.service.ts +59 -59
  229. package/{users-list → projects/tuki/widgets/users-list}/src/services/notification.service.ts +68 -68
  230. package/{user-manage → projects/tuki/widgets/users-list}/src/services/removeKynFromIBM.service.ts +25 -25
  231. package/{users-list → projects/tuki/widgets/users-list}/src/services/site-settings.service.ts +26 -26
  232. package/{users-list → projects/tuki/widgets/users-list}/src/services/user.service.ts +159 -159
  233. package/{users-list → projects/tuki/widgets/users-list}/src/services/users-search.service.ts +139 -137
  234. package/{styles.scss → projects/tuki/widgets/users-list/src/styles/styles.scss} +572 -572
  235. package/{users-list → projects/tuki/widgets/users-list}/src/user-list-confirm-dialog/user-list-confirm-dialog.component.html +15 -15
  236. package/{users-list → projects/tuki/widgets/users-list}/src/user-list-confirm-dialog/user-list-confirm-dialog.component.scss +103 -103
  237. package/{users-list → projects/tuki/widgets/users-list}/src/user-list-confirm-dialog/user-list-confirm-dialog.component.ts +35 -35
  238. package/{users-list → projects/tuki/widgets/users-list}/src/users-list.component.html +86 -86
  239. package/{users-list → projects/tuki/widgets/users-list}/src/users-list.component.scss +572 -572
  240. package/{users-list → projects/tuki/widgets/users-list}/src/users-list.component.ts +312 -312
  241. package/{users-list → projects/tuki/widgets/users-list}/src/users-list.module.ts +63 -63
  242. package/{users-list → projects/tuki/widgets/users-list}/src/utils/app-loader/app-loader.component.html +6 -6
  243. package/{users-list → projects/tuki/widgets/users-list}/src/utils/app-loader/app-loader.component.scss +11 -11
  244. package/{users-list → projects/tuki/widgets/users-list}/src/utils/app-loader/app-loader.ts +13 -13
  245. package/{users-list → projects/tuki/widgets/users-list}/src/utils/common-functions.ts +32 -32
  246. package/{users-list → projects/tuki/widgets/users-list}/src/utils/notifications/notification.component.html +33 -33
  247. package/{users-list → projects/tuki/widgets/users-list}/src/utils/notifications/notification.component.scss +84 -84
  248. package/{users-list → projects/tuki/widgets/users-list}/src/utils/notifications/notification.component.ts +46 -46
  249. package/{user-manage → projects/tuki/widgets/users-list}/src/utils/pagination/pagination.component.html +26 -26
  250. package/{users-list → projects/tuki/widgets/users-list}/src/utils/pagination/pagination.component.scss +41 -41
  251. package/{users-list → projects/tuki/widgets/users-list}/src/utils/pagination/pagination.component.ts +41 -41
  252. package/{user-manage/src/services → projects/tuki/widgets/users-list/src/utils}/utils.service.ts +71 -71
  253. package/projects/widgets-playground/src/app/app.component.html +109 -0
  254. package/projects/widgets-playground/src/app/app.component.scss +15 -0
  255. package/projects/widgets-playground/src/app/app.component.spec.ts +31 -0
  256. package/projects/widgets-playground/src/app/app.component.ts +31 -0
  257. package/projects/widgets-playground/src/app/app.module.ts +43 -0
  258. package/projects/widgets-playground/src/assets/.gitkeep +0 -0
  259. package/projects/widgets-playground/src/assets/icons/already_upgraded.png +0 -0
  260. package/projects/widgets-playground/src/assets/icons/check2_icon.png +0 -0
  261. package/projects/widgets-playground/src/assets/icons/check_icon.png +0 -0
  262. package/projects/widgets-playground/src/assets/icons/expand_icon.png +0 -0
  263. package/projects/widgets-playground/src/assets/icons/issue_icon.png +0 -0
  264. package/projects/widgets-playground/src/assets/icons/menu_icon.png +0 -0
  265. package/projects/widgets-playground/src/assets/icons/ready_to_upgrade.png +0 -0
  266. package/projects/widgets-playground/src/assets/icons/search_icon.png +0 -0
  267. package/projects/widgets-playground/src/assets/icons/site.png +0 -0
  268. package/projects/widgets-playground/src/assets/icons/user.png +0 -0
  269. package/projects/widgets-playground/src/assets/icons/warning_icon.png +0 -0
  270. package/projects/widgets-playground/src/favicon.ico +0 -0
  271. package/projects/widgets-playground/src/index.html +13 -0
  272. package/projects/widgets-playground/src/main.ts +7 -0
  273. package/projects/widgets-playground/src/styles.scss +23 -0
  274. package/projects/widgets-playground/tsconfig.app.json +14 -0
  275. package/projects/widgets-playground/tsconfig.spec.json +14 -0
  276. package/proxy.conf.js +23 -0
  277. package/tsconfig.json +46 -0
  278. package/di2mt/api/api.endpoints.ts +0 -20
  279. package/di2mt/shared/components/table-filters/table-filters.component.scss +0 -52
  280. package/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.html +0 -92
  281. package/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.scss +0 -187
  282. package/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.ts +0 -205
  283. package/di2mt/widgets/site-upgrade/site-upgrade.module.ts +0 -24
  284. package/di2mt/widgets/site-upgrade/site-upgrade.service.ts +0 -45
  285. package/di2mt/widgets/site-upgrade/types/user-upgrade.ts +0 -15
  286. package/di2mt/widgets/user-upgrade/user-upgrade-data-table/user-upgrade-data-table.component.ts +0 -218
  287. package/di2mt/widgets/user-upgrade/user-upgrade.module.ts +0 -24
  288. package/di2mt/widgets/user-upgrade/user-upgrade.service.ts +0 -73
  289. /package/{di2mt → projects/tuki/widgets/di2mt}/README.md +0 -0
  290. /package/{di2mt → projects/tuki/widgets/di2mt}/assets/icons/already_upgraded.png +0 -0
  291. /package/{di2mt → projects/tuki/widgets/di2mt}/assets/icons/check2_icon.png +0 -0
  292. /package/{di2mt → projects/tuki/widgets/di2mt}/assets/icons/check_icon.png +0 -0
  293. /package/{di2mt → projects/tuki/widgets/di2mt}/assets/icons/expand_icon.png +0 -0
  294. /package/{di2mt → projects/tuki/widgets/di2mt}/assets/icons/issue_icon.png +0 -0
  295. /package/{di2mt → projects/tuki/widgets/di2mt}/assets/icons/menu_icon.png +0 -0
  296. /package/{di2mt → projects/tuki/widgets/di2mt}/assets/icons/ready_to_upgrade.png +0 -0
  297. /package/{di2mt → projects/tuki/widgets/di2mt}/assets/icons/search_icon.png +0 -0
  298. /package/{di2mt → projects/tuki/widgets/di2mt}/assets/icons/site.png +0 -0
  299. /package/{di2mt → projects/tuki/widgets/di2mt}/assets/icons/user.png +0 -0
  300. /package/{di2mt → projects/tuki/widgets/di2mt}/assets/icons/warning_icon.png +0 -0
  301. /package/{di2mt → projects/tuki/widgets/di2mt}/ng-package.json +0 -0
  302. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/card/card.component.html +0 -0
  303. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/card/card.component.scss +0 -0
  304. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/card/card.component.ts +0 -0
  305. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/chart-card/chart-card.component.html +0 -0
  306. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/chart-card/chart-card.component.scss +0 -0
  307. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/chart-card/chart-card.component.ts +0 -0
  308. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/index.ts +0 -0
  309. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/stat-card/stat-card.component.html +0 -0
  310. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/stat-card/stat-card.component.scss +0 -0
  311. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/stat-card/stat-card.component.ts +0 -0
  312. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/status-list-card/status-list-card.component.html +0 -0
  313. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/status-list-card/status-list-card.component.scss +0 -0
  314. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/status-list-card/status-list-card.component.ts +0 -0
  315. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/summary-card/summary-card.component.ts +0 -0
  316. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/components/table-filters/table-filters.component.ts +0 -0
  317. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/material.module.ts +0 -0
  318. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/services/api.service.ts +0 -0
  319. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/shared.module.ts +0 -0
  320. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/types/data-table.ts +0 -0
  321. /package/{di2mt → projects/tuki/widgets/di2mt}/shared/types/table/filter.ts +0 -0
  322. /package/{di2mt → projects/tuki/widgets/di2mt}/styles/tuki-widgets-theme.scss +0 -0
  323. /package/{di2mt → projects/tuki/widgets/di2mt}/styles/variables.scss +0 -0
  324. /package/{di2mt → projects/tuki/widgets/di2mt}/widgets/upgrade-overview/cards/already-upgraded-sites/already-upgraded-sites-card.component.ts +0 -0
  325. /package/{di2mt → projects/tuki/widgets/di2mt}/widgets/upgrade-overview/cards/already-upgraded-users/already-upgraded-users-card.component.ts +0 -0
  326. /package/{di2mt → projects/tuki/widgets/di2mt}/widgets/upgrade-overview/cards/preconditions-status-list/preconditions-status-list-card.component.ts +0 -0
  327. /package/{di2mt → projects/tuki/widgets/di2mt}/widgets/upgrade-overview/cards/ready-to-upgrade-sites/ready-to-upgrade-sites-card.component.html +0 -0
  328. /package/{di2mt → projects/tuki/widgets/di2mt}/widgets/upgrade-overview/cards/ready-to-upgrade-sites/ready-to-upgrade-sites-card.component.scss +0 -0
  329. /package/{di2mt → projects/tuki/widgets/di2mt}/widgets/upgrade-overview/cards/ready-to-upgrade-sites/ready-to-upgrade-sites-card.component.ts +0 -0
  330. /package/{di2mt → projects/tuki/widgets/di2mt}/widgets/upgrade-overview/cards/ready-to-upgrade-users/ready-to-upgrade-users-card.component.html +0 -0
  331. /package/{di2mt → projects/tuki/widgets/di2mt}/widgets/upgrade-overview/cards/ready-to-upgrade-users/ready-to-upgrade-users-card.component.scss +0 -0
  332. /package/{di2mt → projects/tuki/widgets/di2mt}/widgets/upgrade-overview/cards/ready-to-upgrade-users/ready-to-upgrade-users-card.component.ts +0 -0
  333. /package/{di2mt → projects/tuki/widgets/di2mt}/widgets/upgrade-overview/cards/site-infrastructure-status-list/site-infrastructure-status-list-card.component.ts +0 -0
  334. /package/{di2mt → projects/tuki/widgets/di2mt}/widgets/upgrade-overview/cards/upgrade-state-comparison-chart/upgrade-state-comparison-chart-card.component.ts +0 -0
  335. /package/{di2mt → projects/tuki/widgets/di2mt}/widgets/upgrade-overview/types/upgrade-overview.ts +0 -0
  336. /package/{di2mt → projects/tuki/widgets/di2mt}/widgets/upgrade-overview/upgrade-overview.module.ts +0 -0
  337. /package/{di2mt → projects/tuki/widgets/di2mt}/widgets/upgrade-overview/upgrade-overview.service.ts +0 -0
  338. /package/{ng-package.json → projects/tuki/widgets/ng-package.json} +0 -0
  339. /package/{user-device-manage → projects/tuki/widgets/user-device-manage}/ng-package.json +0 -0
  340. /package/{user-device-manage → projects/tuki/widgets/user-device-manage}/src/assets/icons/icon_user.svg +0 -0
  341. /package/{user-manage → projects/tuki/widgets/user-manage}/ng-package.json +0 -0
  342. /package/{user-manage → projects/tuki/widgets/user-manage}/src/assets/icons/icon_user.svg +0 -0
  343. /package/{users-list → projects/tuki/widgets/users-list}/ng-package.json +0 -0
  344. /package/{users-list → projects/tuki/widgets/users-list}/src/assets/icons/icon_user.svg +0 -0
  345. /package/{users-list → projects/tuki/widgets/users-list}/src/users-list.component.css +0 -0
  346. /package/{users-list → projects/tuki/widgets/users-list}/src/users-list.component.css.map +0 -0
  347. /package/{users-list → projects/tuki/widgets/users-list}/src/utils/app-loader/app-loader.component.css +0 -0
  348. /package/{users-list → projects/tuki/widgets/users-list}/src/utils/app-loader/app-loader.component.css.map +0 -0
  349. /package/{users-list → projects/tuki/widgets/users-list}/src/utils/pagination/pagination.component.css +0 -0
  350. /package/{users-list → projects/tuki/widgets/users-list}/src/utils/pagination/pagination.component.css.map +0 -0
@@ -1,829 +1,829 @@
1
- import { Injectable } from '@angular/core';
2
- import { SiteSettingsService } from './site-settings.service';
3
- import { DeviceTypes, MailboxQuotasType, SpeedDialType, VMNotificationsTypes } from './../classes/types';
4
- import { Device, DeviceKind } from './../classes/device';
5
-
6
- const speedDialRegex = new RegExp('^[^"]*$');
7
- const BLFRegex = new RegExp('^[^"><&%]*$');
8
- const timeRegex = new RegExp('^([0-1][0-9]|[2][0-3]):([0-5][0-9])$');
9
-
10
- @Injectable()
11
- export class ValidationService {
12
-
13
- constructor(
14
- private siteSettingsService: SiteSettingsService,
15
- ) {
16
- }
17
-
18
- e164MaskLabel(control: any) {
19
- const ruleText = `^[0-9*#+X]{0,24}$`;
20
- const rule = new RegExp(ruleText, 'g');
21
- if (control.value && rule && !rule.test(control.value)) {
22
- return {e164MaskRule: {rule: ruleText}};
23
- }
24
- return null;
25
- }
26
-
27
- index(control: any) {
28
- const value = parseInt(control.value);
29
- if (!value) {
30
- return null;
31
- }
32
- const pattern = '^[+0-9]*$';
33
- if (value && !Number.isInteger(value) || value < 1 || value > 199) {
34
- return {indexRule: true};
35
- }
36
- return null;
37
- }
38
-
39
- displayLabel(control: any) {
40
- const ruleText = `^[^""""%&<>]{0,30}$`;
41
- const rule = new RegExp(ruleText, 'g');
42
- if (rule && !rule.test(control.value)) {
43
- return {labelRule: {rule: ruleText, count: 30}};
44
- }
45
- return null;
46
- }
47
-
48
-
49
-
50
- displayLabelAscii(control: any) {
51
- const ruleText = '^[a-zA-Z0-9 !#$\'()*+,./:;=?@\\^_`}~-]{0,30}$';
52
- const rule = new RegExp(ruleText, 'g');
53
- if (rule && !rule.test(control.value)) {
54
- return {labelRule: {rule: ruleText, count: 30}};
55
- }
56
- return null;
57
- }
58
-
59
- requiredForSpeedDialPosition(type: string) {
60
-
61
- return (control: any) => {
62
- const parent = control.parent;
63
- if (type === SpeedDialType.slotBasic || !parent) {
64
- return null;
65
- }
66
- if (!control.value) {
67
- return {required: true};
68
- }
69
- return null;
70
- };
71
- }
72
-
73
- speedDialDestination() {
74
- return (control: any) => {
75
- if (!control || !control.value) {
76
- return null;
77
- }
78
- const numberOrHostNameIP = '' +
79
- '^([0-9\\*#+PpCcFf,]+)$' +
80
- '|' +
81
- '^(' +
82
- '([a-zA-Z0-9]){1,47}@' +
83
- '(' +
84
- '((?:[0-9]{1,3}\\.){3}[0-9]{1,3})' +
85
- '|' +
86
- '([a-zA-Z0-9][a-zA-Z0-9\\-]{1,61}[a-zA-Z0-9]\\.[a-zA-Z]{2,})' +
87
- ')' +
88
- ')$';
89
- const rule = new RegExp(numberOrHostNameIP, 'g');
90
- if (rule && !rule.test(control.value)) {
91
- return {pattern: true};
92
- }
93
- return null;
94
- };
95
-
96
- }
97
-
98
- requiredForSpeedDialDestination(type: string) {
99
-
100
- return (control: any) => {
101
- const parent = control.parent;
102
- if ((!parent || !parent.get('label')) || (type === SpeedDialType.slotBasic && !control.value && !parent.get('label').value)) {
103
- return null;
104
- }
105
- return null;
106
- };
107
- }
108
-
109
-
110
- labelPatternDependingOnType(control: any) {
111
- const parent = control?.parent;
112
- if (!parent || !parent.get('type') || !control.value) {
113
- return null;
114
- }
115
- const type = parent.get('type').value;
116
- if (!type && !speedDialRegex.test(control.value)) {
117
- return {labelRule: {wrong: '"'}};
118
- }
119
- if (type && !BLFRegex.test(control.value)) {
120
- return {labelRule: {wrong: '"><&%'}};
121
- }
122
- return null;
123
- }
124
-
125
- labelPatternBLF(control: any) {
126
- if (control.value && !BLFRegex.test(control.value)) {
127
- return {labelRule: {wrong: '"><&%'}};
128
- }
129
- return null;
130
- }
131
-
132
- labelPatternSpeedDial(control: any) {
133
- if (control?.value && !speedDialRegex.test(control.value)) {
134
- return {labelRule: {wrong: '"'}};
135
- }
136
- return null;
137
- }
138
-
139
- matchControl = (fieldName: string) => {
140
- return (control: any) => {
141
- if (!control?.parent) {
142
- return null;
143
- }
144
- const matchingControl = control.parent.get(fieldName);
145
- if (matchingControl.value && matchingControl.value !== control.value) {
146
- return {
147
- matchControl: true
148
- };
149
- }
150
- return null;
151
- };
152
- };
153
-
154
- matchLength = (fieldName: string) => {
155
- return (control: any) => {
156
- if (!control.parent || !control.value) {
157
- return null;
158
- }
159
- const matchingControl = control.parent.get(fieldName);
160
- if (((!control.value.startsWith('+') && !matchingControl.value.startsWith('+')) ||
161
- (control.value.startsWith('+') && matchingControl.value.startsWith('+'))) &&
162
- ((!control.value.startsWith('\\+') && !matchingControl.value.startsWith('\\+')) ||
163
- (control.value.startsWith('\\+') && matchingControl.value.startsWith('\\+'))) &&
164
- matchingControl.value.length !== control.value.length) {
165
- return {
166
- matchLength: true
167
- };
168
- }
169
- return null;
170
- };
171
- };
172
-
173
- dynamicMaxLength = (length1: number, length2: number) => {
174
- return (control: any) => {
175
- if (!control.parent || !control.value) {
176
- return null;
177
- }
178
- const maxLength = String(control.value).includes('[') ? length1 : length2;
179
- if (control.value.length > maxLength) {
180
- return {
181
- maxLength: true
182
- };
183
- }
184
- return null;
185
- };
186
- };
187
-
188
- biggerThan = (fieldName: string) => {
189
- return (control: any) => {
190
- if (!control.parent || !control.value) {
191
- return null;
192
- }
193
- const matchingControl = control.parent.get(fieldName);
194
- if (matchingControl.value.length === control.value.length && matchingControl.value && matchingControl.value > control.value) {
195
- return {
196
- biggerThan: true
197
- };
198
- }
199
- return null;
200
- };
201
- };
202
-
203
- requiredByType = (fieldName: string, type: string) => {
204
- return (control: any) => {
205
- if (
206
- fieldName === 'phoneSystem' && (type === VMNotificationsTypes['Phone Device'] || type === VMNotificationsTypes['Pager Device']) ||
207
- fieldName === 'htmlTemplate' && type === VMNotificationsTypes['HTML Device']
208
- ) {
209
- return {
210
- required: true
211
- };
212
- }
213
- return null;
214
- };
215
- };
216
-
217
- smallerThanQuota = (fieldName: string, quotaType: string, secondQuotaType: string) => {
218
- return (control: any) => {
219
- if (!control.parent) {
220
- return null;
221
- }
222
- const matchingControl = control.parent.get(fieldName);
223
- const quotaTypeControl = control.parent.get(quotaType);
224
- const secondQuotaTypeControl = control.parent.get(secondQuotaType);
225
-
226
- if (quotaTypeControl && secondQuotaTypeControl && secondQuotaTypeControl.value === MailboxQuotasType.system) {
227
- return null;
228
- }
229
-
230
- if (quotaTypeControl && quotaTypeControl.value === MailboxQuotasType.system || matchingControl && matchingControl.value && parseInt(matchingControl.value) < parseInt(control.value)) {
231
- return {
232
- smallerThan: true
233
- };
234
- }
235
- return null;
236
- };
237
- };
238
-
239
- biggerThanQuota = (fieldName: string, quotaType: string) => {
240
- return (control: any) => {
241
- if (!control?.parent) {
242
- return null;
243
- }
244
- const matchingControl = control.parent.get(fieldName);
245
- const quotaTypeControl = control.parent.get(quotaType);
246
-
247
- if (quotaTypeControl && quotaTypeControl.value === MailboxQuotasType.custom && matchingControl.value && parseInt(matchingControl.value) > parseInt(control.value)) {
248
- return {
249
- biggerThan: true
250
- };
251
- }
252
- return null;
253
- };
254
- };
255
-
256
- rangeLimit = (fieldName: string) => {
257
- return (control: any) => {
258
- if (!control?.parent || !control.value) {
259
- return null;
260
- }
261
- const matchingControl = control.parent.get(fieldName);
262
- if ((control.value - matchingControl.value) > 50000) {
263
- return {
264
- rangeLimit: true
265
- };
266
- }
267
- return null;
268
- };
269
- };
270
-
271
- comparepatternParts = (fieldName: string) => {
272
- return (control: any) => {
273
- if (!control?.value) {
274
- return null;
275
- }
276
- const matches = control.value.match(/\[(.*?)\]/);
277
- if (matches) {
278
- const submatch = matches[1];
279
- const submatchsplit: number[] = submatch.split('-');
280
- for (let i = 0; i < submatchsplit.length; i++) {
281
- if (submatchsplit[i] >= submatchsplit[i + 1]) {
282
- return {
283
- comparepatternParts: true
284
- };
285
- }
286
- }
287
- }
288
- return null;
289
- };
290
- };
291
-
292
- matchPrefix = (fieldName: string) => {
293
- return (control: any) => {
294
- if (!control?.parent || !control.value) {
295
- return null;
296
- }
297
- const matchingControl = control.parent.get(fieldName);
298
- if ((matchingControl.value.startsWith('+') || control.value.startsWith('+') || matchingControl.value.startsWith('\\+') || control.value.startsWith('\\+')) && (control.value.charAt(0) !== matchingControl.value.charAt(0))) {
299
- return {
300
- matchPrefix: true
301
- };
302
- }
303
- return null;
304
- };
305
- };
306
-
307
- deviceNameValidator = (device: Device) => {
308
- return (control: any) => {
309
- if (!control.value || device.deviceKind === DeviceKind.deviceProfile) {
310
- return;
311
- }
312
- if (device.isCtiRoutePoint) {
313
- let err = '';
314
- if (!control.value.match(/^[a-zA-Z0-9-_.]+$/)) {
315
- err = 'pattern';
316
- }
317
- if (control.value.trim().length > 15) {
318
- err = 'maxLength';
319
- }
320
- return err ? {nameRule: err} : null;
321
- }
322
- if (device.deviceDefaults && !device.isCtiRoutePoint) {
323
- const ruleText = device.deviceDefaults.deviceNameRegex;
324
- const rule = new RegExp(ruleText, 'g');
325
- const caption = device.deviceDefaults?.deviceNameExplained;
326
- const match = (control.value || '').match(rule) || [];
327
- const exactMatch = match && control.value === match[0];
328
- if (rule && !exactMatch) {
329
- return {nameRule: {caption}};
330
- }
331
- }
332
- return null;
333
- };
334
- };
335
-
336
- deviceNameValueValidator = (device: Device, deviceName: string) => {
337
- return (control: any) => {
338
- if (!control.value || device.deviceKind === DeviceKind.deviceProfile) {
339
- return;
340
- }
341
- if (device.name && device.alreadyUsedName && device.name === device.alreadyUsedName) {
342
- return {nameRule: 'alreadyUsedName'};
343
- }
344
- if (device.isCtiRoutePoint) {
345
- let err = '';
346
- if (!deviceName.match(/^[a-zA-Z0-9-_.]+$/)) {
347
- err = 'pattern';
348
- }
349
- if (deviceName.trim().length > 15) {
350
- err = 'maxLength';
351
- }
352
- return err ? {nameRule: err} : null;
353
- }
354
- if (device.deviceDefaults && !device.isCtiRoutePoint) {
355
- const ruleText = device.deviceDefaults.deviceNameRegex;
356
- // console.log('Dev name rule - ', ruleText);
357
- const rule = new RegExp(ruleText, 'g');
358
- let caption = device.deviceDefaults.deviceNameExplained;
359
- if (!caption) {
360
- caption = ruleText;
361
- }
362
- const match = (deviceName || '').match(rule) || [];
363
- const exactMatch = match && deviceName === match[0];
364
- if (rule && !exactMatch) {
365
- return {nameRule: {caption}};
366
- }
367
- }
368
- return null;
369
- };
370
- };
371
-
372
- deviceDuplicatingNameValidator = (user: any, pkid ?: string, prefix?: string) => {
373
- return (control: any) => {
374
- if (!control.value || !user || !user.devices || user.devices.length === 0) {
375
- return;
376
- }
377
- const deviceName = prefix ? `${prefix}${control.value}` : control.value;
378
- const devicesWithTheSameName = user.devices.filter((device: Device) => device.name === deviceName);
379
- if (devicesWithTheSameName.length > 0) {
380
- if (!pkid) { // For new device
381
- return {duplicateNameRule: true};
382
- } else if (pkid !== devicesWithTheSameName[0].pkid) { // For updating device, avoid validating with itself
383
- return {duplicateNameRule: true};
384
- }
385
- }
386
- return null;
387
- };
388
- };
389
-
390
- conditionalRequired = (fieldName: string, requiredConditionValues: any[]) => {
391
- return (control: any) => {
392
- const parent1 = control.parent;
393
- if (!parent1 || !parent1.get(fieldName) || !parent1.get(fieldName).value) {
394
- return;
395
- }
396
- if (requiredConditionValues.includes(parent1.get(fieldName).value) && !control.value) {
397
- return {
398
- required: true
399
- };
400
- }
401
- return null;
402
- };
403
- };
404
-
405
- conditionalRequiredForGroupAdmin = (fieldName: string, requiredConditionValues: any[]) => {
406
- return (control: any) => {
407
- const parent1 = control.parent;
408
- if (!parent1 || !parent1.get(fieldName) || !parent1.get(fieldName).value || !parent1.get(fieldName).value.type) {
409
- return;
410
- }
411
- if (requiredConditionValues.includes(parent1.get(fieldName).value.type) && !control.value) {
412
- return {
413
- required: true
414
- };
415
- }
416
- return null;
417
- };
418
- };
419
-
420
- conditionalSiteGroupCheckForGroupAdmin = (fieldName: string, requiredConditionValues: any[]) => {
421
- return (control: any) => {
422
- const parent1 = control.parent;
423
- if (!parent1 || !parent1.get(fieldName) || !parent1.get(fieldName).value || !parent1.get(fieldName).value.type) {
424
- return;
425
- }
426
- if (parent1.get(fieldName).value && requiredConditionValues.includes(parent1.get(fieldName).value.type) &&
427
- parent1.get('siteGroup') && parent1.get('siteGroup').value &&
428
- parent1.get('siteGroup').value.siteGroupMembers && parent1.get('siteGroup').value.siteGroupMembers.length < 1) {
429
- return {
430
- hasSiteGroupError: true
431
- };
432
- }
433
- return null;
434
- };
435
- };
436
-
437
- requiredIfFieldIsEmptyForBLF = (fieldName: any) => {
438
- const DATE_PATTERN = '^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d$';
439
- return (control: any) => {
440
- const parent = control.parent;
441
- if (!parent || !parent.get(fieldName)) {
442
- return null;
443
- }
444
- if (!parent.get(fieldName).value && !control.value) {
445
- return {
446
- requiredEither: true,
447
- requiredBLFDN: true
448
- };
449
- }
450
- return null;
451
- };
452
- };
453
-
454
-
455
- validDate = (fieldName: string) => {
456
-
457
- return (control: any) => {
458
- const parent = control.parent;
459
- const ruleText = '^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d$';
460
- const rule = new RegExp(ruleText, 'g');
461
- const val = control.value && control.value.getDate();
462
- if (rule && !rule.test(val)) {
463
- return {pattern: true};
464
- }
465
- return null;
466
- };
467
- };
468
-
469
-
470
- matchOption = (optionType: string, list?: any, isFullList?: boolean) => {
471
- return (control: any) => {
472
- if (!control.value || control.value === DeviceTypes.CTI_ROUTE_POINT) {
473
- return null;
474
- }
475
- let optionList = list || this.getOptionsList(optionType);
476
- if (optionList && optionList.length) {
477
- if (!isFullList && optionType === 'directoryNumbers') {
478
- optionList = optionList.map((str: string) => str.indexOf(' ') > -1 ? str.substring(0, str.indexOf(' ')) : str);
479
- }
480
- if (!optionList.includes(control.value)) {
481
- return {
482
- matchOptions: true
483
- };
484
- }
485
- }
486
- return null;
487
- };
488
- };
489
-
490
- confidentialAccessLevel = (confidentialAccessMode: string) => {
491
- return (control: any) => {
492
- if (!control.value && !confidentialAccessMode) {
493
- return null;
494
- }
495
- if (!control.value) {
496
- return {
497
- required: true
498
- };
499
- }
500
- return null;
501
- };
502
- };
503
-
504
- noResultDN = (optionType: string, list?: any) => {
505
- return (control: any) => {
506
- if (!control.value || list === null) {
507
- return null;
508
- }
509
- if (list && list.length === 0) {
510
- return {
511
- noResultDNs: true
512
- };
513
- }
514
- return null;
515
- };
516
- };
517
-
518
- matchExtensionOption = (optionType: string, optionList?: any) => {
519
- return (control: any) => {
520
- if (!control.value) {
521
- return control.value;
522
- }
523
- // @ts-ignore
524
- const newList = [];
525
- if (optionList && optionList.length) {
526
- optionList.forEach((list: any) => {
527
- const newOptionList = this.getMatchExistingVmLineValue(list);
528
- newList.push(newOptionList);
529
- });
530
- // @ts-ignore
531
- if (newList && !newList.includes(control.value)) {
532
- return {
533
- matchOptions: true
534
- };
535
- }
536
- } else if (!optionList || !optionList.length) {
537
- return {
538
- matchOptions: true
539
- };
540
- }
541
- return null;
542
- };
543
- };
544
-
545
- public getMatchExistingVmLineValue(dnWithType: string): string {
546
- const ind = dnWithType.indexOf('Type:');
547
- let dn = dnWithType;
548
- if (ind > -1) {
549
- dn = dnWithType.slice(0, ind);
550
- dn = dn.trim();
551
- }
552
- return dn;
553
- }
554
-
555
- requiredEitherForVmExtension = (fieldName1: string, fieldName2: string) => {
556
- return (control: any) => {
557
- if (!control.parent) {
558
- return null;
559
- }
560
- const matchControl1 = control.parent.get(fieldName1).value;
561
- const matchControl2 = control.parent.get(fieldName2).value;
562
- if (!matchControl1 && !matchControl2) {
563
- return {
564
- requiredEitherForVmExtension: true
565
- };
566
- }
567
- return null;
568
- };
569
- };
570
-
571
- requiredEitherOne = (fieldName1: string, fieldName2: string) => {
572
- return (control: any) => {
573
- if (!control.parent) {
574
- return null;
575
- }
576
- const matchControl1 = control.parent.get(fieldName1) && control.parent.get(fieldName1).value;
577
- const matchControl2 = control.parent.get(fieldName2) && control.parent.get(fieldName2).value;
578
- if (!matchControl1 && !matchControl2) {
579
- return {
580
- requiredEitherOne: true
581
- };
582
- }
583
- return null;
584
- };
585
- };
586
-
587
- requiredByValue = (fieldName: string, requestedFieldVal: any) => {
588
- return (control: any) => {
589
- if (!control || !control.parent) {
590
- return null;
591
- }
592
- const fieldVal = control.parent.get(fieldName) && control.parent.get(fieldName).value;
593
- if (fieldVal && fieldVal === requestedFieldVal && !control.value) {
594
- return {
595
- required: true
596
- };
597
- }
598
- return null;
599
- };
600
- };
601
-
602
- OneExtensionEmpty = (fieldName1: string, fieldName2: string) => {
603
- return (control: any) => {
604
- if (!control.parent) {
605
- return null;
606
- }
607
- const matchControl1 = control.parent.get(fieldName1).value;
608
- const matchControl2 = control.parent.get(fieldName2).value;
609
- if (matchControl1 && matchControl2) {
610
- return {
611
- OneExtensionIsEmpty: true
612
- };
613
- }
614
- return null;
615
- };
616
- };
617
-
618
- requiredByCondition = (requiredBy: string, fieldName: any) => {
619
- return (control: any) => {
620
- if (!control.parent) {
621
- return null;
622
- }
623
- const requiredByControl = control.parent.get(requiredBy).value;
624
- const requiredControl = control.parent.get(fieldName).value;
625
- if (requiredByControl && !requiredControl) {
626
- return {
627
- required: true
628
- };
629
- }
630
- return null;
631
- };
632
- };
633
-
634
- private getOptionsList(token: string): string[] {
635
- switch (token) {
636
- case 'css':
637
- case 'rerouteCss':
638
- case 'callingSearchSpace':
639
- return this.siteSettingsService.callingSearchSpaceTypes;
640
- case 'reroutingCss':
641
- return this.siteSettingsService.siteDefaults && this.siteSettingsService.siteDefaults.cssFilter;
642
- case 'deviceType':
643
- return this.siteSettingsService.deviceTypes;
644
- case 'routePartition':
645
- return this.siteSettingsService.routePartitionNames;
646
- case 'routePartitionFiltered':
647
- return this.siteSettingsService.filteredRoutePartitionNames;
648
- case 'devicePools':
649
- return this.siteSettingsService.devicePools;
650
- case 'allRoutePartitions':
651
- return this.siteSettingsService.allRoutePartitionNames;
652
- case 'directoryNumbers':
653
- return this.siteSettingsService.directoryNumbers;
654
- default:
655
- return [];
656
- }
657
- }
658
-
659
- autocompleteType(control: any) {
660
- if (!control.value) {
661
- return null;
662
- }
663
- if (typeof control.value !== 'object' && control.value !== '') {
664
- return {
665
- stringEntered: true
666
- };
667
- }
668
- return null;
669
- }
670
-
671
-
672
- password(control: any) {
673
- const ruleNumeric = new RegExp(/\d+/, 'g');
674
- const ruleCapitals = new RegExp(/[A-Z]+/, 'g');
675
- const ruleSmall = new RegExp(/[a-z]+/, 'g');
676
- const ruleSpecial = new RegExp(/[!@#$%&\/=\?_\.,:;\-\\+]+/, 'g');
677
-
678
- const hasNumeric = +ruleNumeric.test(control.value);
679
- const hasCapitals = +ruleCapitals.test(control.value);
680
- const hasSmall = +ruleSmall.test(control.value);
681
- const hasSpecial = +ruleSpecial.test(control.value);
682
-
683
- if (hasNumeric + hasCapitals + hasSmall + hasSpecial < 3) {
684
- return {
685
- weakPassword: true
686
- };
687
- }
688
-
689
- return null;
690
- }
691
-
692
- verifyAutoAnswer(control: any) {
693
- if (!control?.value || control.value.length === 0) {
694
- return null;
695
- }
696
- let autoAnswerErrorLine = null;
697
- if (control.parent && control.parent.parent && control.parent.parent.parent && control.parent.parent.parent.parent) {
698
- const controlSNR = control.parent;
699
- const controlUser = control.parent.parent.parent.parent;
700
- const lineAssociations = controlSNR.get('lineAssociations');
701
- const lines = controlUser.get('lines');
702
- if (lines) {
703
- lineAssociations.value.forEach((lineAssociation: any) => {
704
- const autoAnswerLine = lines.controls.find((line: any) => line.get('directoryNumber').value.directoryNumber === lineAssociation.directoryNumber && line.get('directoryNumber').value.routePartitionName === lineAssociation.routePartitionName
705
- && line.get('autoAnswer').value !== 'Auto Answer Off');
706
- if (autoAnswerLine) {
707
- autoAnswerErrorLine = {
708
- autoAnswerErrorLine: lineAssociation.directoryNumber
709
- };
710
- }
711
- });
712
- }
713
- }
714
-
715
- return autoAnswerErrorLine;
716
- }
717
-
718
- verifyBeginEndTime(control: any) {
719
- const parent = control.parent;
720
- if (!parent || !parent.get('isActive') || !parent.get('allDay') || !parent.get('from') || !parent.get('to')) {
721
- return null;
722
- }
723
-
724
- if (parent.get('isActive').value) {
725
- if (!parent.get('allDay').value) {
726
- if (!parent.get('from').value || parent.get('from').value === 'No Office Hours'
727
- || !parent.get('to').value || parent.get('to').value === 'No Office Hours'
728
- || parent.get('from').value > parent.get('to').value) {
729
- return {
730
- fromGreaterThanTo: true
731
- };
732
- }
733
- }
734
- }
735
-
736
- return null;
737
- }
738
-
739
- time(control: any) {
740
- if (control.value && !timeRegex.test(control.value)) {
741
- return {timeFormat: true};
742
- }
743
- return null;
744
- }
745
-
746
-
747
- pinMultiCharacterCheck = (fieldName: string) => {
748
- // @ts-ignore
749
- return (control: any) => {
750
- if (!control.parent) {
751
- return null;
752
- }
753
- const matchingControl = control.parent.get(fieldName);
754
- const ruleMultiCharacter = new RegExp('([0-9])\\1{2}');
755
- if (matchingControl.value) {
756
- const hasMultiCharacter = ruleMultiCharacter.test(matchingControl.value);
757
- if (hasMultiCharacter) {
758
- return {
759
- multiCharacter: true
760
- };
761
- }
762
- }
763
- };
764
- };
765
-
766
- pinConsecutiveNumberCheck = (fieldName: string) => {
767
- // @ts-ignore
768
- return (control: any) => {
769
- if (!control.parent) {
770
- return null;
771
- }
772
- const matchingControl = control.parent.get(fieldName);
773
- const strToCheck = matchingControl.value;
774
- if (strToCheck && strToCheck.length > 1) {
775
- const resAsc = this.pinOrderCheck(strToCheck);
776
- if (resAsc === true) {
777
- return {
778
- consecutiveNumbers: true
779
- };
780
- }
781
- }
782
- };
783
- };
784
-
785
-
786
- pinOrderCheck(str: string): any {
787
- if (str) {
788
- const arr_num = ('' + str).split('');
789
- for (let i = 0; i < arr_num.length - 2; i++) {
790
- const num1 = parseInt(arr_num[i]);
791
- const num2 = parseInt(arr_num[i + 1]);
792
- const num3 = parseInt(arr_num[i + 2]);
793
- if ((num2 - num1) === 1 && (num3 - num2 === num2 - num1)) {
794
- return true;
795
- }
796
- }
797
- return false;
798
- }
799
- }
800
-
801
-
802
- pinMailboxExtensionCheck = (fieldName: string, extension: string) => {
803
- return (control: any) => {
804
- if (!control.parent) {
805
- return null;
806
- }
807
- const matchingControl = control.parent.get(fieldName);
808
- const strToCheck = matchingControl.value;
809
- if (strToCheck === extension || strToCheck.includes(extension)) {
810
- return {
811
- mailboxExtension: true
812
- };
813
- }
814
- return null;
815
- };
816
- };
817
-
818
- isItemAlreadyInList(item: any, list: any): boolean {
819
- if (!item || !list || !list.length) {
820
- return false;
821
- }
822
- for (const listItem of list) {
823
- if (item.equals(listItem)) {
824
- return true;
825
- }
826
- }
827
- return false;
828
- }
829
- }
1
+ import { Injectable } from '@angular/core';
2
+ import { SiteSettingsService } from './site-settings.service';
3
+ import { DeviceTypes, MailboxQuotasType, SpeedDialType, VMNotificationsTypes } from './../classes/types';
4
+ import { Device, DeviceKind } from './../classes/device';
5
+
6
+ const speedDialRegex = new RegExp('^[^"]*$');
7
+ const BLFRegex = new RegExp('^[^"><&%]*$');
8
+ const timeRegex = new RegExp('^([0-1][0-9]|[2][0-3]):([0-5][0-9])$');
9
+
10
+ @Injectable()
11
+ export class ValidationService {
12
+
13
+ constructor(
14
+ private siteSettingsService: SiteSettingsService,
15
+ ) {
16
+ }
17
+
18
+ e164MaskLabel(control: any) {
19
+ const ruleText = `^[0-9*#+X]{0,24}$`;
20
+ const rule = new RegExp(ruleText, 'g');
21
+ if (control.value && rule && !rule.test(control.value)) {
22
+ return {e164MaskRule: {rule: ruleText}};
23
+ }
24
+ return null;
25
+ }
26
+
27
+ index(control: any) {
28
+ const value = parseInt(control.value);
29
+ if (!value) {
30
+ return null;
31
+ }
32
+ const pattern = '^[+0-9]*$';
33
+ if (value && !Number.isInteger(value) || value < 1 || value > 199) {
34
+ return {indexRule: true};
35
+ }
36
+ return null;
37
+ }
38
+
39
+ displayLabel(control: any) {
40
+ const ruleText = `^[^""""%&<>]{0,30}$`;
41
+ const rule = new RegExp(ruleText, 'g');
42
+ if (rule && !rule.test(control.value)) {
43
+ return {labelRule: {rule: ruleText, count: 30}};
44
+ }
45
+ return null;
46
+ }
47
+
48
+
49
+
50
+ displayLabelAscii(control: any) {
51
+ const ruleText = '^[a-zA-Z0-9 !#$\'()*+,./:;=?@\\^_`}~-]{0,30}$';
52
+ const rule = new RegExp(ruleText, 'g');
53
+ if (rule && !rule.test(control.value)) {
54
+ return {labelRule: {rule: ruleText, count: 30}};
55
+ }
56
+ return null;
57
+ }
58
+
59
+ requiredForSpeedDialPosition(type: string) {
60
+
61
+ return (control: any) => {
62
+ const parent = control.parent;
63
+ if (type === SpeedDialType.slotBasic || !parent) {
64
+ return null;
65
+ }
66
+ if (!control.value) {
67
+ return {required: true};
68
+ }
69
+ return null;
70
+ };
71
+ }
72
+
73
+ speedDialDestination() {
74
+ return (control: any) => {
75
+ if (!control || !control.value) {
76
+ return null;
77
+ }
78
+ const numberOrHostNameIP = '' +
79
+ '^([0-9\\*#+PpCcFf,]+)$' +
80
+ '|' +
81
+ '^(' +
82
+ '([a-zA-Z0-9]){1,47}@' +
83
+ '(' +
84
+ '((?:[0-9]{1,3}\\.){3}[0-9]{1,3})' +
85
+ '|' +
86
+ '([a-zA-Z0-9][a-zA-Z0-9\\-]{1,61}[a-zA-Z0-9]\\.[a-zA-Z]{2,})' +
87
+ ')' +
88
+ ')$';
89
+ const rule = new RegExp(numberOrHostNameIP, 'g');
90
+ if (rule && !rule.test(control.value)) {
91
+ return {pattern: true};
92
+ }
93
+ return null;
94
+ };
95
+
96
+ }
97
+
98
+ requiredForSpeedDialDestination(type: string) {
99
+
100
+ return (control: any) => {
101
+ const parent = control.parent;
102
+ if ((!parent || !parent.get('label')) || (type === SpeedDialType.slotBasic && !control.value && !parent.get('label').value)) {
103
+ return null;
104
+ }
105
+ return null;
106
+ };
107
+ }
108
+
109
+
110
+ labelPatternDependingOnType(control: any) {
111
+ const parent = control?.parent;
112
+ if (!parent || !parent.get('type') || !control.value) {
113
+ return null;
114
+ }
115
+ const type = parent.get('type').value;
116
+ if (!type && !speedDialRegex.test(control.value)) {
117
+ return {labelRule: {wrong: '"'}};
118
+ }
119
+ if (type && !BLFRegex.test(control.value)) {
120
+ return {labelRule: {wrong: '"><&%'}};
121
+ }
122
+ return null;
123
+ }
124
+
125
+ labelPatternBLF(control: any) {
126
+ if (control.value && !BLFRegex.test(control.value)) {
127
+ return {labelRule: {wrong: '"><&%'}};
128
+ }
129
+ return null;
130
+ }
131
+
132
+ labelPatternSpeedDial(control: any) {
133
+ if (control?.value && !speedDialRegex.test(control.value)) {
134
+ return {labelRule: {wrong: '"'}};
135
+ }
136
+ return null;
137
+ }
138
+
139
+ matchControl = (fieldName: string) => {
140
+ return (control: any) => {
141
+ if (!control?.parent) {
142
+ return null;
143
+ }
144
+ const matchingControl = control.parent.get(fieldName);
145
+ if (matchingControl.value && matchingControl.value !== control.value) {
146
+ return {
147
+ matchControl: true
148
+ };
149
+ }
150
+ return null;
151
+ };
152
+ };
153
+
154
+ matchLength = (fieldName: string) => {
155
+ return (control: any) => {
156
+ if (!control.parent || !control.value) {
157
+ return null;
158
+ }
159
+ const matchingControl = control.parent.get(fieldName);
160
+ if (((!control.value.startsWith('+') && !matchingControl.value.startsWith('+')) ||
161
+ (control.value.startsWith('+') && matchingControl.value.startsWith('+'))) &&
162
+ ((!control.value.startsWith('\\+') && !matchingControl.value.startsWith('\\+')) ||
163
+ (control.value.startsWith('\\+') && matchingControl.value.startsWith('\\+'))) &&
164
+ matchingControl.value.length !== control.value.length) {
165
+ return {
166
+ matchLength: true
167
+ };
168
+ }
169
+ return null;
170
+ };
171
+ };
172
+
173
+ dynamicMaxLength = (length1: number, length2: number) => {
174
+ return (control: any) => {
175
+ if (!control.parent || !control.value) {
176
+ return null;
177
+ }
178
+ const maxLength = String(control.value).includes('[') ? length1 : length2;
179
+ if (control.value.length > maxLength) {
180
+ return {
181
+ maxLength: true
182
+ };
183
+ }
184
+ return null;
185
+ };
186
+ };
187
+
188
+ biggerThan = (fieldName: string) => {
189
+ return (control: any) => {
190
+ if (!control.parent || !control.value) {
191
+ return null;
192
+ }
193
+ const matchingControl = control.parent.get(fieldName);
194
+ if (matchingControl.value.length === control.value.length && matchingControl.value && matchingControl.value > control.value) {
195
+ return {
196
+ biggerThan: true
197
+ };
198
+ }
199
+ return null;
200
+ };
201
+ };
202
+
203
+ requiredByType = (fieldName: string, type: string) => {
204
+ return (control: any) => {
205
+ if (
206
+ fieldName === 'phoneSystem' && (type === VMNotificationsTypes['Phone Device'] || type === VMNotificationsTypes['Pager Device']) ||
207
+ fieldName === 'htmlTemplate' && type === VMNotificationsTypes['HTML Device']
208
+ ) {
209
+ return {
210
+ required: true
211
+ };
212
+ }
213
+ return null;
214
+ };
215
+ };
216
+
217
+ smallerThanQuota = (fieldName: string, quotaType: string, secondQuotaType: string) => {
218
+ return (control: any) => {
219
+ if (!control.parent) {
220
+ return null;
221
+ }
222
+ const matchingControl = control.parent.get(fieldName);
223
+ const quotaTypeControl = control.parent.get(quotaType);
224
+ const secondQuotaTypeControl = control.parent.get(secondQuotaType);
225
+
226
+ if (quotaTypeControl && secondQuotaTypeControl && secondQuotaTypeControl.value === MailboxQuotasType.system) {
227
+ return null;
228
+ }
229
+
230
+ if (quotaTypeControl && quotaTypeControl.value === MailboxQuotasType.system || matchingControl && matchingControl.value && parseInt(matchingControl.value) < parseInt(control.value)) {
231
+ return {
232
+ smallerThan: true
233
+ };
234
+ }
235
+ return null;
236
+ };
237
+ };
238
+
239
+ biggerThanQuota = (fieldName: string, quotaType: string) => {
240
+ return (control: any) => {
241
+ if (!control?.parent) {
242
+ return null;
243
+ }
244
+ const matchingControl = control.parent.get(fieldName);
245
+ const quotaTypeControl = control.parent.get(quotaType);
246
+
247
+ if (quotaTypeControl && quotaTypeControl.value === MailboxQuotasType.custom && matchingControl.value && parseInt(matchingControl.value) > parseInt(control.value)) {
248
+ return {
249
+ biggerThan: true
250
+ };
251
+ }
252
+ return null;
253
+ };
254
+ };
255
+
256
+ rangeLimit = (fieldName: string) => {
257
+ return (control: any) => {
258
+ if (!control?.parent || !control.value) {
259
+ return null;
260
+ }
261
+ const matchingControl = control.parent.get(fieldName);
262
+ if ((control.value - matchingControl.value) > 50000) {
263
+ return {
264
+ rangeLimit: true
265
+ };
266
+ }
267
+ return null;
268
+ };
269
+ };
270
+
271
+ comparepatternParts = (fieldName: string) => {
272
+ return (control: any) => {
273
+ if (!control?.value) {
274
+ return null;
275
+ }
276
+ const matches = control.value.match(/\[(.*?)\]/);
277
+ if (matches) {
278
+ const submatch = matches[1];
279
+ const submatchsplit: number[] = submatch.split('-');
280
+ for (let i = 0; i < submatchsplit.length; i++) {
281
+ if (submatchsplit[i] >= submatchsplit[i + 1]) {
282
+ return {
283
+ comparepatternParts: true
284
+ };
285
+ }
286
+ }
287
+ }
288
+ return null;
289
+ };
290
+ };
291
+
292
+ matchPrefix = (fieldName: string) => {
293
+ return (control: any) => {
294
+ if (!control?.parent || !control.value) {
295
+ return null;
296
+ }
297
+ const matchingControl = control.parent.get(fieldName);
298
+ if ((matchingControl.value.startsWith('+') || control.value.startsWith('+') || matchingControl.value.startsWith('\\+') || control.value.startsWith('\\+')) && (control.value.charAt(0) !== matchingControl.value.charAt(0))) {
299
+ return {
300
+ matchPrefix: true
301
+ };
302
+ }
303
+ return null;
304
+ };
305
+ };
306
+
307
+ deviceNameValidator = (device: Device) => {
308
+ return (control: any) => {
309
+ if (!control.value || device.deviceKind === DeviceKind.deviceProfile) {
310
+ return;
311
+ }
312
+ if (device.isCtiRoutePoint) {
313
+ let err = '';
314
+ if (!control.value.match(/^[a-zA-Z0-9-_.]+$/)) {
315
+ err = 'pattern';
316
+ }
317
+ if (control.value.trim().length > 15) {
318
+ err = 'maxLength';
319
+ }
320
+ return err ? {nameRule: err} : null;
321
+ }
322
+ if (device.deviceDefaults && !device.isCtiRoutePoint) {
323
+ const ruleText = device.deviceDefaults.deviceNameRegex;
324
+ const rule = new RegExp(ruleText, 'g');
325
+ const caption = device.deviceDefaults?.deviceNameExplained;
326
+ const match = (control.value || '').match(rule) || [];
327
+ const exactMatch = match && control.value === match[0];
328
+ if (rule && !exactMatch) {
329
+ return {nameRule: {caption}};
330
+ }
331
+ }
332
+ return null;
333
+ };
334
+ };
335
+
336
+ deviceNameValueValidator = (device: Device, deviceName: string) => {
337
+ return (control: any) => {
338
+ if (!control.value || device.deviceKind === DeviceKind.deviceProfile) {
339
+ return;
340
+ }
341
+ if (device.name && device.alreadyUsedName && device.name === device.alreadyUsedName) {
342
+ return {nameRule: 'alreadyUsedName'};
343
+ }
344
+ if (device.isCtiRoutePoint) {
345
+ let err = '';
346
+ if (!deviceName.match(/^[a-zA-Z0-9-_.]+$/)) {
347
+ err = 'pattern';
348
+ }
349
+ if (deviceName.trim().length > 15) {
350
+ err = 'maxLength';
351
+ }
352
+ return err ? {nameRule: err} : null;
353
+ }
354
+ if (device.deviceDefaults && !device.isCtiRoutePoint) {
355
+ const ruleText = device.deviceDefaults.deviceNameRegex;
356
+ // console.log('Dev name rule - ', ruleText);
357
+ const rule = new RegExp(ruleText, 'g');
358
+ let caption = device.deviceDefaults.deviceNameExplained;
359
+ if (!caption) {
360
+ caption = ruleText;
361
+ }
362
+ const match = (deviceName || '').match(rule) || [];
363
+ const exactMatch = match && deviceName === match[0];
364
+ if (rule && !exactMatch) {
365
+ return {nameRule: {caption}};
366
+ }
367
+ }
368
+ return null;
369
+ };
370
+ };
371
+
372
+ deviceDuplicatingNameValidator = (user: any, pkid ?: string, prefix?: string) => {
373
+ return (control: any) => {
374
+ if (!control.value || !user || !user.devices || user.devices.length === 0) {
375
+ return;
376
+ }
377
+ const deviceName = prefix ? `${prefix}${control.value}` : control.value;
378
+ const devicesWithTheSameName = user.devices.filter((device: Device) => device.name === deviceName);
379
+ if (devicesWithTheSameName.length > 0) {
380
+ if (!pkid) { // For new device
381
+ return {duplicateNameRule: true};
382
+ } else if (pkid !== devicesWithTheSameName[0].pkid) { // For updating device, avoid validating with itself
383
+ return {duplicateNameRule: true};
384
+ }
385
+ }
386
+ return null;
387
+ };
388
+ };
389
+
390
+ conditionalRequired = (fieldName: string, requiredConditionValues: any[]) => {
391
+ return (control: any) => {
392
+ const parent1 = control.parent;
393
+ if (!parent1 || !parent1.get(fieldName) || !parent1.get(fieldName).value) {
394
+ return;
395
+ }
396
+ if (requiredConditionValues.includes(parent1.get(fieldName).value) && !control.value) {
397
+ return {
398
+ required: true
399
+ };
400
+ }
401
+ return null;
402
+ };
403
+ };
404
+
405
+ conditionalRequiredForGroupAdmin = (fieldName: string, requiredConditionValues: any[]) => {
406
+ return (control: any) => {
407
+ const parent1 = control.parent;
408
+ if (!parent1 || !parent1.get(fieldName) || !parent1.get(fieldName).value || !parent1.get(fieldName).value.type) {
409
+ return;
410
+ }
411
+ if (requiredConditionValues.includes(parent1.get(fieldName).value.type) && !control.value) {
412
+ return {
413
+ required: true
414
+ };
415
+ }
416
+ return null;
417
+ };
418
+ };
419
+
420
+ conditionalSiteGroupCheckForGroupAdmin = (fieldName: string, requiredConditionValues: any[]) => {
421
+ return (control: any) => {
422
+ const parent1 = control.parent;
423
+ if (!parent1 || !parent1.get(fieldName) || !parent1.get(fieldName).value || !parent1.get(fieldName).value.type) {
424
+ return;
425
+ }
426
+ if (parent1.get(fieldName).value && requiredConditionValues.includes(parent1.get(fieldName).value.type) &&
427
+ parent1.get('siteGroup') && parent1.get('siteGroup').value &&
428
+ parent1.get('siteGroup').value.siteGroupMembers && parent1.get('siteGroup').value.siteGroupMembers.length < 1) {
429
+ return {
430
+ hasSiteGroupError: true
431
+ };
432
+ }
433
+ return null;
434
+ };
435
+ };
436
+
437
+ requiredIfFieldIsEmptyForBLF = (fieldName: any) => {
438
+ const DATE_PATTERN = '^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d$';
439
+ return (control: any) => {
440
+ const parent = control.parent;
441
+ if (!parent || !parent.get(fieldName)) {
442
+ return null;
443
+ }
444
+ if (!parent.get(fieldName).value && !control.value) {
445
+ return {
446
+ requiredEither: true,
447
+ requiredBLFDN: true
448
+ };
449
+ }
450
+ return null;
451
+ };
452
+ };
453
+
454
+
455
+ validDate = (fieldName: string) => {
456
+
457
+ return (control: any) => {
458
+ const parent = control.parent;
459
+ const ruleText = '^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d$';
460
+ const rule = new RegExp(ruleText, 'g');
461
+ const val = control.value && control.value.getDate();
462
+ if (rule && !rule.test(val)) {
463
+ return {pattern: true};
464
+ }
465
+ return null;
466
+ };
467
+ };
468
+
469
+
470
+ matchOption = (optionType: string, list?: any, isFullList?: boolean) => {
471
+ return (control: any) => {
472
+ if (!control.value || control.value === DeviceTypes.CTI_ROUTE_POINT) {
473
+ return null;
474
+ }
475
+ let optionList = list || this.getOptionsList(optionType);
476
+ if (optionList && optionList.length) {
477
+ if (!isFullList && optionType === 'directoryNumbers') {
478
+ optionList = optionList.map((str: string) => str.indexOf(' ') > -1 ? str.substring(0, str.indexOf(' ')) : str);
479
+ }
480
+ if (!optionList.includes(control.value)) {
481
+ return {
482
+ matchOptions: true
483
+ };
484
+ }
485
+ }
486
+ return null;
487
+ };
488
+ };
489
+
490
+ confidentialAccessLevel = (confidentialAccessMode: string) => {
491
+ return (control: any) => {
492
+ if (!control.value && !confidentialAccessMode) {
493
+ return null;
494
+ }
495
+ if (!control.value) {
496
+ return {
497
+ required: true
498
+ };
499
+ }
500
+ return null;
501
+ };
502
+ };
503
+
504
+ noResultDN = (optionType: string, list?: any) => {
505
+ return (control: any) => {
506
+ if (!control.value || list === null) {
507
+ return null;
508
+ }
509
+ if (list && list.length === 0) {
510
+ return {
511
+ noResultDNs: true
512
+ };
513
+ }
514
+ return null;
515
+ };
516
+ };
517
+
518
+ matchExtensionOption = (optionType: string, optionList?: any) => {
519
+ return (control: any) => {
520
+ if (!control.value) {
521
+ return control.value;
522
+ }
523
+ // @ts-ignore
524
+ const newList = [];
525
+ if (optionList && optionList.length) {
526
+ optionList.forEach((list: any) => {
527
+ const newOptionList = this.getMatchExistingVmLineValue(list);
528
+ newList.push(newOptionList);
529
+ });
530
+ // @ts-ignore
531
+ if (newList && !newList.includes(control.value)) {
532
+ return {
533
+ matchOptions: true
534
+ };
535
+ }
536
+ } else if (!optionList || !optionList.length) {
537
+ return {
538
+ matchOptions: true
539
+ };
540
+ }
541
+ return null;
542
+ };
543
+ };
544
+
545
+ public getMatchExistingVmLineValue(dnWithType: string): string {
546
+ const ind = dnWithType.indexOf('Type:');
547
+ let dn = dnWithType;
548
+ if (ind > -1) {
549
+ dn = dnWithType.slice(0, ind);
550
+ dn = dn.trim();
551
+ }
552
+ return dn;
553
+ }
554
+
555
+ requiredEitherForVmExtension = (fieldName1: string, fieldName2: string) => {
556
+ return (control: any) => {
557
+ if (!control.parent) {
558
+ return null;
559
+ }
560
+ const matchControl1 = control.parent.get(fieldName1).value;
561
+ const matchControl2 = control.parent.get(fieldName2).value;
562
+ if (!matchControl1 && !matchControl2) {
563
+ return {
564
+ requiredEitherForVmExtension: true
565
+ };
566
+ }
567
+ return null;
568
+ };
569
+ };
570
+
571
+ requiredEitherOne = (fieldName1: string, fieldName2: string) => {
572
+ return (control: any) => {
573
+ if (!control.parent) {
574
+ return null;
575
+ }
576
+ const matchControl1 = control.parent.get(fieldName1) && control.parent.get(fieldName1).value;
577
+ const matchControl2 = control.parent.get(fieldName2) && control.parent.get(fieldName2).value;
578
+ if (!matchControl1 && !matchControl2) {
579
+ return {
580
+ requiredEitherOne: true
581
+ };
582
+ }
583
+ return null;
584
+ };
585
+ };
586
+
587
+ requiredByValue = (fieldName: string, requestedFieldVal: any) => {
588
+ return (control: any) => {
589
+ if (!control || !control.parent) {
590
+ return null;
591
+ }
592
+ const fieldVal = control.parent.get(fieldName) && control.parent.get(fieldName).value;
593
+ if (fieldVal && fieldVal === requestedFieldVal && !control.value) {
594
+ return {
595
+ required: true
596
+ };
597
+ }
598
+ return null;
599
+ };
600
+ };
601
+
602
+ OneExtensionEmpty = (fieldName1: string, fieldName2: string) => {
603
+ return (control: any) => {
604
+ if (!control.parent) {
605
+ return null;
606
+ }
607
+ const matchControl1 = control.parent.get(fieldName1).value;
608
+ const matchControl2 = control.parent.get(fieldName2).value;
609
+ if (matchControl1 && matchControl2) {
610
+ return {
611
+ OneExtensionIsEmpty: true
612
+ };
613
+ }
614
+ return null;
615
+ };
616
+ };
617
+
618
+ requiredByCondition = (requiredBy: string, fieldName: any) => {
619
+ return (control: any) => {
620
+ if (!control.parent) {
621
+ return null;
622
+ }
623
+ const requiredByControl = control.parent.get(requiredBy).value;
624
+ const requiredControl = control.parent.get(fieldName).value;
625
+ if (requiredByControl && !requiredControl) {
626
+ return {
627
+ required: true
628
+ };
629
+ }
630
+ return null;
631
+ };
632
+ };
633
+
634
+ private getOptionsList(token: string): string[] {
635
+ switch (token) {
636
+ case 'css':
637
+ case 'rerouteCss':
638
+ case 'callingSearchSpace':
639
+ return this.siteSettingsService.callingSearchSpaceTypes;
640
+ case 'reroutingCss':
641
+ return this.siteSettingsService.siteDefaults && this.siteSettingsService.siteDefaults.cssFilter;
642
+ case 'deviceType':
643
+ return this.siteSettingsService.deviceTypes;
644
+ case 'routePartition':
645
+ return this.siteSettingsService.routePartitionNames;
646
+ case 'routePartitionFiltered':
647
+ return this.siteSettingsService.filteredRoutePartitionNames;
648
+ case 'devicePools':
649
+ return this.siteSettingsService.devicePools;
650
+ case 'allRoutePartitions':
651
+ return this.siteSettingsService.allRoutePartitionNames;
652
+ case 'directoryNumbers':
653
+ return this.siteSettingsService.directoryNumbers;
654
+ default:
655
+ return [];
656
+ }
657
+ }
658
+
659
+ autocompleteType(control: any) {
660
+ if (!control.value) {
661
+ return null;
662
+ }
663
+ if (typeof control.value !== 'object' && control.value !== '') {
664
+ return {
665
+ stringEntered: true
666
+ };
667
+ }
668
+ return null;
669
+ }
670
+
671
+
672
+ password(control: any) {
673
+ const ruleNumeric = new RegExp(/\d+/, 'g');
674
+ const ruleCapitals = new RegExp(/[A-Z]+/, 'g');
675
+ const ruleSmall = new RegExp(/[a-z]+/, 'g');
676
+ const ruleSpecial = new RegExp(/[!@#$%&\/=\?_\.,:;\-\\+]+/, 'g');
677
+
678
+ const hasNumeric = +ruleNumeric.test(control.value);
679
+ const hasCapitals = +ruleCapitals.test(control.value);
680
+ const hasSmall = +ruleSmall.test(control.value);
681
+ const hasSpecial = +ruleSpecial.test(control.value);
682
+
683
+ if (hasNumeric + hasCapitals + hasSmall + hasSpecial < 3) {
684
+ return {
685
+ weakPassword: true
686
+ };
687
+ }
688
+
689
+ return null;
690
+ }
691
+
692
+ verifyAutoAnswer(control: any) {
693
+ if (!control?.value || control.value.length === 0) {
694
+ return null;
695
+ }
696
+ let autoAnswerErrorLine = null;
697
+ if (control.parent && control.parent.parent && control.parent.parent.parent && control.parent.parent.parent.parent) {
698
+ const controlSNR = control.parent;
699
+ const controlUser = control.parent.parent.parent.parent;
700
+ const lineAssociations = controlSNR.get('lineAssociations');
701
+ const lines = controlUser.get('lines');
702
+ if (lines) {
703
+ lineAssociations.value.forEach((lineAssociation: any) => {
704
+ const autoAnswerLine = lines.controls.find((line: any) => line.get('directoryNumber').value.directoryNumber === lineAssociation.directoryNumber && line.get('directoryNumber').value.routePartitionName === lineAssociation.routePartitionName
705
+ && line.get('autoAnswer').value !== 'Auto Answer Off');
706
+ if (autoAnswerLine) {
707
+ autoAnswerErrorLine = {
708
+ autoAnswerErrorLine: lineAssociation.directoryNumber
709
+ };
710
+ }
711
+ });
712
+ }
713
+ }
714
+
715
+ return autoAnswerErrorLine;
716
+ }
717
+
718
+ verifyBeginEndTime(control: any) {
719
+ const parent = control.parent;
720
+ if (!parent || !parent.get('isActive') || !parent.get('allDay') || !parent.get('from') || !parent.get('to')) {
721
+ return null;
722
+ }
723
+
724
+ if (parent.get('isActive').value) {
725
+ if (!parent.get('allDay').value) {
726
+ if (!parent.get('from').value || parent.get('from').value === 'No Office Hours'
727
+ || !parent.get('to').value || parent.get('to').value === 'No Office Hours'
728
+ || parent.get('from').value > parent.get('to').value) {
729
+ return {
730
+ fromGreaterThanTo: true
731
+ };
732
+ }
733
+ }
734
+ }
735
+
736
+ return null;
737
+ }
738
+
739
+ time(control: any) {
740
+ if (control.value && !timeRegex.test(control.value)) {
741
+ return {timeFormat: true};
742
+ }
743
+ return null;
744
+ }
745
+
746
+
747
+ pinMultiCharacterCheck = (fieldName: string) => {
748
+ // @ts-ignore
749
+ return (control: any) => {
750
+ if (!control.parent) {
751
+ return null;
752
+ }
753
+ const matchingControl = control.parent.get(fieldName);
754
+ const ruleMultiCharacter = new RegExp('([0-9])\\1{2}');
755
+ if (matchingControl.value) {
756
+ const hasMultiCharacter = ruleMultiCharacter.test(matchingControl.value);
757
+ if (hasMultiCharacter) {
758
+ return {
759
+ multiCharacter: true
760
+ };
761
+ }
762
+ }
763
+ };
764
+ };
765
+
766
+ pinConsecutiveNumberCheck = (fieldName: string) => {
767
+ // @ts-ignore
768
+ return (control: any) => {
769
+ if (!control.parent) {
770
+ return null;
771
+ }
772
+ const matchingControl = control.parent.get(fieldName);
773
+ const strToCheck = matchingControl.value;
774
+ if (strToCheck && strToCheck.length > 1) {
775
+ const resAsc = this.pinOrderCheck(strToCheck);
776
+ if (resAsc === true) {
777
+ return {
778
+ consecutiveNumbers: true
779
+ };
780
+ }
781
+ }
782
+ };
783
+ };
784
+
785
+
786
+ pinOrderCheck(str: string): any {
787
+ if (str) {
788
+ const arr_num = ('' + str).split('');
789
+ for (let i = 0; i < arr_num.length - 2; i++) {
790
+ const num1 = parseInt(arr_num[i]);
791
+ const num2 = parseInt(arr_num[i + 1]);
792
+ const num3 = parseInt(arr_num[i + 2]);
793
+ if ((num2 - num1) === 1 && (num3 - num2 === num2 - num1)) {
794
+ return true;
795
+ }
796
+ }
797
+ return false;
798
+ }
799
+ }
800
+
801
+
802
+ pinMailboxExtensionCheck = (fieldName: string, extension: string) => {
803
+ return (control: any) => {
804
+ if (!control.parent) {
805
+ return null;
806
+ }
807
+ const matchingControl = control.parent.get(fieldName);
808
+ const strToCheck = matchingControl.value;
809
+ if (strToCheck === extension || strToCheck.includes(extension)) {
810
+ return {
811
+ mailboxExtension: true
812
+ };
813
+ }
814
+ return null;
815
+ };
816
+ };
817
+
818
+ isItemAlreadyInList(item: any, list: any): boolean {
819
+ if (!item || !list || !list.length) {
820
+ return false;
821
+ }
822
+ for (const listItem of list) {
823
+ if (item.equals(listItem)) {
824
+ return true;
825
+ }
826
+ }
827
+ return false;
828
+ }
829
+ }