iss-ctrl 0.0.5 → 0.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 (462) hide show
  1. package/.claude/settings.local.json +8 -0
  2. package/.editorconfig +13 -0
  3. package/.eslintrc.json +90 -0
  4. package/README.md +17 -16
  5. package/angular.json +190 -0
  6. package/bun.lock +1866 -0
  7. package/package.json +47 -21
  8. package/projects/iss/.eslintrc.json +37 -0
  9. package/projects/iss/README.md +24 -0
  10. package/projects/iss/ng-package.json +11 -0
  11. package/projects/iss/package.json +17 -0
  12. package/projects/iss/src/components/controls/base/control-base.ts +75 -0
  13. package/projects/iss/src/components/controls/base/field-base.ts +84 -0
  14. package/projects/iss/src/components/controls/base/viewer-base.ts +6 -0
  15. package/projects/iss/src/components/controls/checkbox/checkbox.control.ts +90 -0
  16. package/projects/iss/src/components/controls/checkbox/checkbox.field.ts +34 -0
  17. package/projects/iss/src/components/controls/checkbox/checkbox.viewer.ts +15 -0
  18. package/projects/iss/src/components/controls/chips/chips.control.ts +99 -0
  19. package/projects/iss/src/components/controls/chips/chips.field.ts +26 -0
  20. package/projects/iss/src/components/controls/chips/chips.viewer.ts +23 -0
  21. package/projects/iss/src/components/controls/date-picker/date-picker.control.ts +85 -0
  22. package/projects/iss/src/components/controls/date-picker/date-picker.field.ts +28 -0
  23. package/projects/iss/src/components/controls/date-picker/date-picker.viewer.ts +14 -0
  24. package/projects/iss/src/components/controls/date-range-picker/date-range-emission.ts +5 -0
  25. package/projects/iss/src/components/controls/date-range-picker/date-range-picker.control.ts +143 -0
  26. package/projects/iss/src/components/controls/date-range-picker/date-range-picker.field.ts +28 -0
  27. package/projects/iss/src/components/controls/date-range-picker/date-range-picker.viewer.ts +22 -0
  28. package/projects/iss/src/components/controls/datetime-picker/datetime-picker.control.ts +109 -0
  29. package/projects/iss/src/components/controls/datetime-picker/datetime-picker.field.ts +31 -0
  30. package/projects/iss/src/components/controls/datetime-picker/datetime-picker.viewer.ts +17 -0
  31. package/projects/iss/src/components/controls/file-picker/attachment.ts +6 -0
  32. package/projects/iss/src/components/controls/file-picker/attachment.viewer.ts +165 -0
  33. package/projects/iss/src/components/controls/file-picker/droppable.ts +25 -0
  34. package/projects/iss/src/components/controls/file-picker/file-handler.ts +109 -0
  35. package/projects/iss/src/components/controls/file-picker/file-picker.control.ts +189 -0
  36. package/projects/iss/src/components/controls/file-picker/file-picker.field.ts +117 -0
  37. package/projects/iss/src/components/controls/file-picker/file.ts +9 -0
  38. package/projects/iss/src/components/controls/file-picker/format-file-size.util.ts +9 -0
  39. package/projects/iss/src/components/controls/input/input.control.ts +95 -0
  40. package/projects/iss/src/components/controls/input/input.field.ts +31 -0
  41. package/projects/iss/src/components/controls/input/input.viewer.ts +10 -0
  42. package/projects/iss/src/components/controls/mobile/countries.const.ts +2051 -0
  43. package/projects/iss/src/components/controls/mobile/country.ts +11 -0
  44. package/projects/iss/src/components/controls/mobile/iso2.type.ts +244 -0
  45. package/projects/iss/src/components/controls/mobile/mobile.control.ts +222 -0
  46. package/projects/iss/src/components/controls/mobile/mobile.field.ts +28 -0
  47. package/projects/iss/src/components/controls/mobile/mobile.ts +12 -0
  48. package/projects/iss/src/components/controls/mobile/mobile.viewer.ts +10 -0
  49. package/projects/iss/src/components/controls/mobile/phone.ts +96 -0
  50. package/projects/iss/src/components/controls/note/note.field.ts +25 -0
  51. package/projects/iss/src/components/controls/plate/plate-letter.pipe.ts +14 -0
  52. package/projects/iss/src/components/controls/plate/plate-letter.ts +7 -0
  53. package/projects/iss/src/components/controls/plate/plate-letters.const.ts +21 -0
  54. package/projects/iss/src/components/controls/plate/plate.control.ts +481 -0
  55. package/projects/iss/src/components/controls/plate/plate.field.ts +36 -0
  56. package/projects/iss/src/components/controls/plate/plate.viewer.ts +289 -0
  57. package/projects/iss/src/components/controls/radio/radio.control.ts +48 -0
  58. package/projects/iss/src/components/controls/radio/radio.field.ts +38 -0
  59. package/projects/iss/src/components/controls/radio/radio.viewer.ts +14 -0
  60. package/projects/iss/src/components/controls/select/select.control.ts +242 -0
  61. package/projects/iss/src/components/controls/select/select.field.ts +32 -0
  62. package/projects/iss/src/components/controls/select/select.viewer.ts +14 -0
  63. package/projects/iss/src/components/controls/slide-toggle/slide-toggle.control.ts +24 -0
  64. package/projects/iss/src/components/controls/slide-toggle/slide-toggle.field.ts +31 -0
  65. package/projects/iss/src/components/controls/slide-toggle/slide-toggle.viewer.ts +14 -0
  66. package/projects/iss/src/components/controls/table/field.viewer.ts +23 -0
  67. package/projects/iss/src/components/controls/table/table.field.ts +233 -0
  68. package/projects/iss/src/components/controls/textarea/textarea.control.ts +54 -0
  69. package/projects/iss/src/components/controls/textarea/textarea.field.ts +31 -0
  70. package/projects/iss/src/components/controls/textarea/textarea.viewer.ts +11 -0
  71. package/projects/iss/src/components/controls/time-picker/time-picker.control.ts +86 -0
  72. package/projects/iss/src/components/controls/time-picker/time-picker.field.ts +28 -0
  73. package/projects/iss/src/components/controls/time-picker/time-picker.viewer.ts +10 -0
  74. package/projects/iss/src/components/controls/toggle-button/toggle-button.control.ts +105 -0
  75. package/projects/iss/src/components/controls/toggle-button/toggle-button.field.ts +40 -0
  76. package/projects/iss/src/components/controls/toggle-button/toggle-button.viewer.ts +14 -0
  77. package/projects/iss/src/components/controls/user-picker/employee.ts +73 -0
  78. package/projects/iss/src/components/controls/user-picker/user-picker.field.ts +124 -0
  79. package/projects/iss/src/components/outlet/component-outlet.ts +8 -0
  80. package/projects/iss/src/components/outlet/field-data-injector.ts +20 -0
  81. package/projects/iss/src/components/outlet/iss-form-group.ts +5 -0
  82. package/projects/iss/src/components/outlet/outlet.ts +154 -0
  83. package/projects/iss/src/components/shared/hints.component.ts +38 -0
  84. package/projects/iss/src/components/shared/validation-message.component.ts +36 -0
  85. package/projects/iss/src/events/event-handler.ts +47 -0
  86. package/projects/iss/src/events/load/after-fetch.ts +29 -0
  87. package/projects/iss/src/events/load/load-event.ts +26 -0
  88. package/projects/iss/src/events/load/load-options-event.ts +49 -0
  89. package/projects/iss/src/events/load/load-value-event.ts +50 -0
  90. package/projects/iss/src/events/load/replace-api-keys.ts +55 -0
  91. package/projects/iss/src/events/set-value/get-value-to-set.ts +29 -0
  92. package/projects/iss/src/events/set-value/set-value-event.ts +33 -0
  93. package/projects/iss/src/events/show/show-event.ts +11 -0
  94. package/projects/iss/src/events/triggers/event-trigger-manager.ts +51 -0
  95. package/projects/iss/src/events/triggers/event-trigger.ts +30 -0
  96. package/projects/iss/src/events/triggers/trigger-based-on-json-value.ts +19 -0
  97. package/projects/iss/src/public-api.ts +131 -0
  98. package/projects/iss/src/shared/classes/field-action-config.ts +56 -0
  99. package/projects/iss/src/shared/classes/field-async-validation.ts +7 -0
  100. package/projects/iss/src/shared/classes/field-config.ts +58 -0
  101. package/projects/iss/src/shared/classes/field-event.ts +28 -0
  102. package/projects/iss/src/shared/classes/field-option.ts +9 -0
  103. package/projects/iss/src/shared/classes/field-validation.ts +15 -0
  104. package/projects/iss/src/shared/classes/iss-field.ts +102 -0
  105. package/projects/iss/src/shared/constants/date-format.const.ts +18 -0
  106. package/projects/iss/src/shared/constants/placeholder-regex.const.ts +1 -0
  107. package/projects/iss/src/shared/constants/validation.const.ts +115 -0
  108. package/projects/iss/src/shared/constants/view-provider.const.ts +7 -0
  109. package/projects/iss/src/shared/indexes/components.index.ts +27 -0
  110. package/projects/iss/src/shared/indexes/services.index.ts +11 -0
  111. package/projects/iss/src/shared/indexes/validators.index.ts +21 -0
  112. package/projects/iss/src/shared/interfaces/dto.ts +12 -0
  113. package/projects/iss/src/shared/interfaces/event-strategy.ts +27 -0
  114. package/projects/iss/src/shared/interfaces/event-trigger-fn.ts +7 -0
  115. package/projects/iss/src/shared/interfaces/hint.ts +8 -0
  116. package/projects/iss/src/shared/interfaces/i18n.ts +4 -0
  117. package/projects/iss/src/shared/interfaces/import.ts +3 -0
  118. package/projects/iss/src/shared/interfaces/option.ts +4 -0
  119. package/projects/iss/src/shared/interfaces/validation.ts +5 -0
  120. package/projects/iss/src/shared/pipes/arabic-number.pipe.ts +14 -0
  121. package/projects/iss/src/shared/pipes/select-status.pipe.ts +10 -0
  122. package/projects/iss/src/shared/pipes/translate.pipe.ts +20 -0
  123. package/projects/iss/src/shared/services/form-engine.ts +130 -0
  124. package/projects/iss/src/shared/services/loader.ts +51 -0
  125. package/projects/iss/src/shared/tokens/api-response-mapper.token.ts +4 -0
  126. package/projects/iss/src/shared/tokens/attachment.token.ts +6 -0
  127. package/projects/iss/src/shared/tokens/field.token.ts +4 -0
  128. package/projects/iss/src/shared/tokens/host.token.ts +3 -0
  129. package/projects/iss/src/shared/tokens/language.token.ts +3 -0
  130. package/projects/iss/src/shared/tokens/user-search-api.token.ts +3 -0
  131. package/projects/iss/src/shared/types/validation.type.ts +3 -0
  132. package/projects/iss/src/shared/utilities/array-from.util.ts +7 -0
  133. package/projects/iss/src/shared/utilities/get-property-by-path.util.ts +30 -0
  134. package/projects/iss/src/shared/utilities/http.util.service.ts +19 -0
  135. package/projects/iss/src/shared/utilities/is-valid-api.util.ts +8 -0
  136. package/projects/iss/src/shared/utilities/replace-placeholder.util.ts +12 -0
  137. package/projects/iss/src/validators/core.validator.ts +39 -0
  138. package/projects/iss/src/validators/file.validator.ts +100 -0
  139. package/projects/iss/src/validators/time.validator.ts +31 -0
  140. package/projects/iss/tsconfig.lib.json +13 -0
  141. package/projects/iss/tsconfig.lib.prod.json +9 -0
  142. package/projects/iss/tsconfig.spec.json +13 -0
  143. package/tsconfig.json +31 -0
  144. package/fesm2022/iss-ctrl-checkbox.wrapper-BVw3Pu1B.mjs +0 -81
  145. package/fesm2022/iss-ctrl-checkbox.wrapper-BVw3Pu1B.mjs.map +0 -1
  146. package/fesm2022/iss-ctrl-chips.wrapper-FY02vbu1.mjs +0 -83
  147. package/fesm2022/iss-ctrl-chips.wrapper-FY02vbu1.mjs.map +0 -1
  148. package/fesm2022/iss-ctrl-date-picker.wrapper-BTyZyhiU.mjs +0 -79
  149. package/fesm2022/iss-ctrl-date-picker.wrapper-BTyZyhiU.mjs.map +0 -1
  150. package/fesm2022/iss-ctrl-date-range-picker.wrapper-BW1pwRKg.mjs +0 -87
  151. package/fesm2022/iss-ctrl-date-range-picker.wrapper-BW1pwRKg.mjs.map +0 -1
  152. package/fesm2022/iss-ctrl-datetime-picker.wrapper-h0P56I6e.mjs +0 -83
  153. package/fesm2022/iss-ctrl-datetime-picker.wrapper-h0P56I6e.mjs.map +0 -1
  154. package/fesm2022/iss-ctrl-file-picker.wrapper-D_4dLsqz.mjs +0 -245
  155. package/fesm2022/iss-ctrl-file-picker.wrapper-D_4dLsqz.mjs.map +0 -1
  156. package/fesm2022/iss-ctrl-input.wrapper-dK79kSim.mjs +0 -83
  157. package/fesm2022/iss-ctrl-input.wrapper-dK79kSim.mjs.map +0 -1
  158. package/fesm2022/iss-ctrl-iss-ctrl-BhZGHw0A.mjs +0 -6024
  159. package/fesm2022/iss-ctrl-iss-ctrl-BhZGHw0A.mjs.map +0 -1
  160. package/fesm2022/iss-ctrl-load-event.service-D_O5gUmg.mjs +0 -62
  161. package/fesm2022/iss-ctrl-load-event.service-D_O5gUmg.mjs.map +0 -1
  162. package/fesm2022/iss-ctrl-load-options-event.service-CylOcoz4.mjs +0 -51
  163. package/fesm2022/iss-ctrl-load-options-event.service-CylOcoz4.mjs.map +0 -1
  164. package/fesm2022/iss-ctrl-load-value-event.service-BRz28bIm.mjs +0 -52
  165. package/fesm2022/iss-ctrl-load-value-event.service-BRz28bIm.mjs.map +0 -1
  166. package/fesm2022/iss-ctrl-mobile.wrapper-DOvO-cRi.mjs +0 -70
  167. package/fesm2022/iss-ctrl-mobile.wrapper-DOvO-cRi.mjs.map +0 -1
  168. package/fesm2022/iss-ctrl-note.wrapper-BW6WOulk.mjs +0 -43
  169. package/fesm2022/iss-ctrl-note.wrapper-BW6WOulk.mjs.map +0 -1
  170. package/fesm2022/iss-ctrl-plate-number.wrapper-B_NXePR_.mjs +0 -228
  171. package/fesm2022/iss-ctrl-plate-number.wrapper-B_NXePR_.mjs.map +0 -1
  172. package/fesm2022/iss-ctrl-radio.wrapper-BHXkIyX9.mjs +0 -84
  173. package/fesm2022/iss-ctrl-radio.wrapper-BHXkIyX9.mjs.map +0 -1
  174. package/fesm2022/iss-ctrl-replace-api-keys.service-DNns4c2U.mjs +0 -57
  175. package/fesm2022/iss-ctrl-replace-api-keys.service-DNns4c2U.mjs.map +0 -1
  176. package/fesm2022/iss-ctrl-select.viewer-Bd4flLOk.mjs +0 -30
  177. package/fesm2022/iss-ctrl-select.viewer-Bd4flLOk.mjs.map +0 -1
  178. package/fesm2022/iss-ctrl-select.wrapper-B78Aap__.mjs +0 -66
  179. package/fesm2022/iss-ctrl-select.wrapper-B78Aap__.mjs.map +0 -1
  180. package/fesm2022/iss-ctrl-set-value-event.service-Dc4bcaTp.mjs +0 -61
  181. package/fesm2022/iss-ctrl-set-value-event.service-Dc4bcaTp.mjs.map +0 -1
  182. package/fesm2022/iss-ctrl-show-event.service-Bg9VNotN.mjs +0 -18
  183. package/fesm2022/iss-ctrl-show-event.service-Bg9VNotN.mjs.map +0 -1
  184. package/fesm2022/iss-ctrl-slide-toggle.wrapper-CRTpag4Q.mjs +0 -75
  185. package/fesm2022/iss-ctrl-slide-toggle.wrapper-CRTpag4Q.mjs.map +0 -1
  186. package/fesm2022/iss-ctrl-table.wrapper-B1q8mXCB.mjs +0 -312
  187. package/fesm2022/iss-ctrl-table.wrapper-B1q8mXCB.mjs.map +0 -1
  188. package/fesm2022/iss-ctrl-textarea.wrapper-LR5_KMxK.mjs +0 -70
  189. package/fesm2022/iss-ctrl-textarea.wrapper-LR5_KMxK.mjs.map +0 -1
  190. package/fesm2022/iss-ctrl-time-picker.wrapper-D_td2M3Z.mjs +0 -67
  191. package/fesm2022/iss-ctrl-time-picker.wrapper-D_td2M3Z.mjs.map +0 -1
  192. package/fesm2022/iss-ctrl-toggle-button.wrapper-DxA2jL1S.mjs +0 -89
  193. package/fesm2022/iss-ctrl-toggle-button.wrapper-DxA2jL1S.mjs.map +0 -1
  194. package/fesm2022/iss-ctrl-trigger-based-on-json-value.service-CAnJWl6G.mjs +0 -24
  195. package/fesm2022/iss-ctrl-trigger-based-on-json-value.service-CAnJWl6G.mjs.map +0 -1
  196. package/fesm2022/iss-ctrl-user-picker.wrapper-UeA0dCqd.mjs +0 -190
  197. package/fesm2022/iss-ctrl-user-picker.wrapper-UeA0dCqd.mjs.map +0 -1
  198. package/fesm2022/iss-ctrl-viewer.base-BCFfZsDG.mjs +0 -17
  199. package/fesm2022/iss-ctrl-viewer.base-BCFfZsDG.mjs.map +0 -1
  200. package/fesm2022/iss-ctrl.mjs +0 -2
  201. package/fesm2022/iss-ctrl.mjs.map +0 -1
  202. package/types/iss-ctrl.d.ts +0 -712
  203. /package/{src → projects/iss/src}/components/controls/mobile/flags/ad.svg +0 -0
  204. /package/{src → projects/iss/src}/components/controls/mobile/flags/ae.svg +0 -0
  205. /package/{src → projects/iss/src}/components/controls/mobile/flags/af.svg +0 -0
  206. /package/{src → projects/iss/src}/components/controls/mobile/flags/ag.svg +0 -0
  207. /package/{src → projects/iss/src}/components/controls/mobile/flags/ai.svg +0 -0
  208. /package/{src → projects/iss/src}/components/controls/mobile/flags/al.svg +0 -0
  209. /package/{src → projects/iss/src}/components/controls/mobile/flags/am.svg +0 -0
  210. /package/{src → projects/iss/src}/components/controls/mobile/flags/ao.svg +0 -0
  211. /package/{src → projects/iss/src}/components/controls/mobile/flags/aq.svg +0 -0
  212. /package/{src → projects/iss/src}/components/controls/mobile/flags/ar.svg +0 -0
  213. /package/{src → projects/iss/src}/components/controls/mobile/flags/as.svg +0 -0
  214. /package/{src → projects/iss/src}/components/controls/mobile/flags/at.svg +0 -0
  215. /package/{src → projects/iss/src}/components/controls/mobile/flags/au.svg +0 -0
  216. /package/{src → projects/iss/src}/components/controls/mobile/flags/aw.svg +0 -0
  217. /package/{src → projects/iss/src}/components/controls/mobile/flags/ax.svg +0 -0
  218. /package/{src → projects/iss/src}/components/controls/mobile/flags/az.svg +0 -0
  219. /package/{src → projects/iss/src}/components/controls/mobile/flags/ba.svg +0 -0
  220. /package/{src → projects/iss/src}/components/controls/mobile/flags/bb.svg +0 -0
  221. /package/{src → projects/iss/src}/components/controls/mobile/flags/bd.svg +0 -0
  222. /package/{src → projects/iss/src}/components/controls/mobile/flags/be.svg +0 -0
  223. /package/{src → projects/iss/src}/components/controls/mobile/flags/bf.svg +0 -0
  224. /package/{src → projects/iss/src}/components/controls/mobile/flags/bg.svg +0 -0
  225. /package/{src → projects/iss/src}/components/controls/mobile/flags/bh.svg +0 -0
  226. /package/{src → projects/iss/src}/components/controls/mobile/flags/bi.svg +0 -0
  227. /package/{src → projects/iss/src}/components/controls/mobile/flags/bj.svg +0 -0
  228. /package/{src → projects/iss/src}/components/controls/mobile/flags/bl.svg +0 -0
  229. /package/{src → projects/iss/src}/components/controls/mobile/flags/bm.svg +0 -0
  230. /package/{src → projects/iss/src}/components/controls/mobile/flags/bn.svg +0 -0
  231. /package/{src → projects/iss/src}/components/controls/mobile/flags/bo.svg +0 -0
  232. /package/{src → projects/iss/src}/components/controls/mobile/flags/bq.svg +0 -0
  233. /package/{src → projects/iss/src}/components/controls/mobile/flags/br.svg +0 -0
  234. /package/{src → projects/iss/src}/components/controls/mobile/flags/bs.svg +0 -0
  235. /package/{src → projects/iss/src}/components/controls/mobile/flags/bt.svg +0 -0
  236. /package/{src → projects/iss/src}/components/controls/mobile/flags/bv.svg +0 -0
  237. /package/{src → projects/iss/src}/components/controls/mobile/flags/bw.svg +0 -0
  238. /package/{src → projects/iss/src}/components/controls/mobile/flags/by.svg +0 -0
  239. /package/{src → projects/iss/src}/components/controls/mobile/flags/bz.svg +0 -0
  240. /package/{src → projects/iss/src}/components/controls/mobile/flags/ca.svg +0 -0
  241. /package/{src → projects/iss/src}/components/controls/mobile/flags/cc.svg +0 -0
  242. /package/{src → projects/iss/src}/components/controls/mobile/flags/cd.svg +0 -0
  243. /package/{src → projects/iss/src}/components/controls/mobile/flags/cf.svg +0 -0
  244. /package/{src → projects/iss/src}/components/controls/mobile/flags/cg.svg +0 -0
  245. /package/{src → projects/iss/src}/components/controls/mobile/flags/ch.svg +0 -0
  246. /package/{src → projects/iss/src}/components/controls/mobile/flags/ci.svg +0 -0
  247. /package/{src → projects/iss/src}/components/controls/mobile/flags/ck.svg +0 -0
  248. /package/{src → projects/iss/src}/components/controls/mobile/flags/cl.svg +0 -0
  249. /package/{src → projects/iss/src}/components/controls/mobile/flags/cm.svg +0 -0
  250. /package/{src → projects/iss/src}/components/controls/mobile/flags/cn.svg +0 -0
  251. /package/{src → projects/iss/src}/components/controls/mobile/flags/co.svg +0 -0
  252. /package/{src → projects/iss/src}/components/controls/mobile/flags/cr.svg +0 -0
  253. /package/{src → projects/iss/src}/components/controls/mobile/flags/cu.svg +0 -0
  254. /package/{src → projects/iss/src}/components/controls/mobile/flags/cv.svg +0 -0
  255. /package/{src → projects/iss/src}/components/controls/mobile/flags/cw.svg +0 -0
  256. /package/{src → projects/iss/src}/components/controls/mobile/flags/cx.svg +0 -0
  257. /package/{src → projects/iss/src}/components/controls/mobile/flags/cy.svg +0 -0
  258. /package/{src → projects/iss/src}/components/controls/mobile/flags/cz.svg +0 -0
  259. /package/{src → projects/iss/src}/components/controls/mobile/flags/de.svg +0 -0
  260. /package/{src → projects/iss/src}/components/controls/mobile/flags/dj.svg +0 -0
  261. /package/{src → projects/iss/src}/components/controls/mobile/flags/dk.svg +0 -0
  262. /package/{src → projects/iss/src}/components/controls/mobile/flags/dm.svg +0 -0
  263. /package/{src → projects/iss/src}/components/controls/mobile/flags/do.svg +0 -0
  264. /package/{src → projects/iss/src}/components/controls/mobile/flags/dz.svg +0 -0
  265. /package/{src → projects/iss/src}/components/controls/mobile/flags/ec.svg +0 -0
  266. /package/{src → projects/iss/src}/components/controls/mobile/flags/ee.svg +0 -0
  267. /package/{src → projects/iss/src}/components/controls/mobile/flags/eg.svg +0 -0
  268. /package/{src → projects/iss/src}/components/controls/mobile/flags/eh.svg +0 -0
  269. /package/{src → projects/iss/src}/components/controls/mobile/flags/er.svg +0 -0
  270. /package/{src → projects/iss/src}/components/controls/mobile/flags/es.svg +0 -0
  271. /package/{src → projects/iss/src}/components/controls/mobile/flags/et.svg +0 -0
  272. /package/{src → projects/iss/src}/components/controls/mobile/flags/eu.svg +0 -0
  273. /package/{src → projects/iss/src}/components/controls/mobile/flags/fi.svg +0 -0
  274. /package/{src → projects/iss/src}/components/controls/mobile/flags/fj.svg +0 -0
  275. /package/{src → projects/iss/src}/components/controls/mobile/flags/fk.svg +0 -0
  276. /package/{src → projects/iss/src}/components/controls/mobile/flags/flags.png +0 -0
  277. /package/{src → projects/iss/src}/components/controls/mobile/flags/flags@2x.png +0 -0
  278. /package/{src → projects/iss/src}/components/controls/mobile/flags/fm.svg +0 -0
  279. /package/{src → projects/iss/src}/components/controls/mobile/flags/fo.svg +0 -0
  280. /package/{src → projects/iss/src}/components/controls/mobile/flags/fonts.css +0 -0
  281. /package/{src → projects/iss/src}/components/controls/mobile/flags/fr.svg +0 -0
  282. /package/{src → projects/iss/src}/components/controls/mobile/flags/ga.svg +0 -0
  283. /package/{src → projects/iss/src}/components/controls/mobile/flags/gb-eng.svg +0 -0
  284. /package/{src → projects/iss/src}/components/controls/mobile/flags/gb-nir.svg +0 -0
  285. /package/{src → projects/iss/src}/components/controls/mobile/flags/gb-sct.svg +0 -0
  286. /package/{src → projects/iss/src}/components/controls/mobile/flags/gb-wls.svg +0 -0
  287. /package/{src → projects/iss/src}/components/controls/mobile/flags/gb.svg +0 -0
  288. /package/{src → projects/iss/src}/components/controls/mobile/flags/gd.svg +0 -0
  289. /package/{src → projects/iss/src}/components/controls/mobile/flags/ge.svg +0 -0
  290. /package/{src → projects/iss/src}/components/controls/mobile/flags/gf.svg +0 -0
  291. /package/{src → projects/iss/src}/components/controls/mobile/flags/gg.svg +0 -0
  292. /package/{src → projects/iss/src}/components/controls/mobile/flags/gh.svg +0 -0
  293. /package/{src → projects/iss/src}/components/controls/mobile/flags/gi.svg +0 -0
  294. /package/{src → projects/iss/src}/components/controls/mobile/flags/gl.svg +0 -0
  295. /package/{src → projects/iss/src}/components/controls/mobile/flags/gm.svg +0 -0
  296. /package/{src → projects/iss/src}/components/controls/mobile/flags/gn.svg +0 -0
  297. /package/{src → projects/iss/src}/components/controls/mobile/flags/gp.svg +0 -0
  298. /package/{src → projects/iss/src}/components/controls/mobile/flags/gq.svg +0 -0
  299. /package/{src → projects/iss/src}/components/controls/mobile/flags/gr.svg +0 -0
  300. /package/{src → projects/iss/src}/components/controls/mobile/flags/gs.svg +0 -0
  301. /package/{src → projects/iss/src}/components/controls/mobile/flags/gt.svg +0 -0
  302. /package/{src → projects/iss/src}/components/controls/mobile/flags/gu.svg +0 -0
  303. /package/{src → projects/iss/src}/components/controls/mobile/flags/gw.svg +0 -0
  304. /package/{src → projects/iss/src}/components/controls/mobile/flags/gy.svg +0 -0
  305. /package/{src → projects/iss/src}/components/controls/mobile/flags/hk.svg +0 -0
  306. /package/{src → projects/iss/src}/components/controls/mobile/flags/hm.svg +0 -0
  307. /package/{src → projects/iss/src}/components/controls/mobile/flags/hn.svg +0 -0
  308. /package/{src → projects/iss/src}/components/controls/mobile/flags/hr.svg +0 -0
  309. /package/{src → projects/iss/src}/components/controls/mobile/flags/ht.svg +0 -0
  310. /package/{src → projects/iss/src}/components/controls/mobile/flags/hu.svg +0 -0
  311. /package/{src → projects/iss/src}/components/controls/mobile/flags/id.svg +0 -0
  312. /package/{src → projects/iss/src}/components/controls/mobile/flags/ie.svg +0 -0
  313. /package/{src → projects/iss/src}/components/controls/mobile/flags/il.svg +0 -0
  314. /package/{src → projects/iss/src}/components/controls/mobile/flags/im.svg +0 -0
  315. /package/{src → projects/iss/src}/components/controls/mobile/flags/in.svg +0 -0
  316. /package/{src → projects/iss/src}/components/controls/mobile/flags/io.svg +0 -0
  317. /package/{src → projects/iss/src}/components/controls/mobile/flags/iq.svg +0 -0
  318. /package/{src → projects/iss/src}/components/controls/mobile/flags/ir.svg +0 -0
  319. /package/{src → projects/iss/src}/components/controls/mobile/flags/is.svg +0 -0
  320. /package/{src → projects/iss/src}/components/controls/mobile/flags/it.svg +0 -0
  321. /package/{src → projects/iss/src}/components/controls/mobile/flags/je.svg +0 -0
  322. /package/{src → projects/iss/src}/components/controls/mobile/flags/jm.svg +0 -0
  323. /package/{src → projects/iss/src}/components/controls/mobile/flags/jo.svg +0 -0
  324. /package/{src → projects/iss/src}/components/controls/mobile/flags/jp.svg +0 -0
  325. /package/{src → projects/iss/src}/components/controls/mobile/flags/ke.svg +0 -0
  326. /package/{src → projects/iss/src}/components/controls/mobile/flags/kg.svg +0 -0
  327. /package/{src → projects/iss/src}/components/controls/mobile/flags/kh.svg +0 -0
  328. /package/{src → projects/iss/src}/components/controls/mobile/flags/ki.svg +0 -0
  329. /package/{src → projects/iss/src}/components/controls/mobile/flags/km.svg +0 -0
  330. /package/{src → projects/iss/src}/components/controls/mobile/flags/kn.svg +0 -0
  331. /package/{src → projects/iss/src}/components/controls/mobile/flags/kp.svg +0 -0
  332. /package/{src → projects/iss/src}/components/controls/mobile/flags/kr.svg +0 -0
  333. /package/{src → projects/iss/src}/components/controls/mobile/flags/kw.svg +0 -0
  334. /package/{src → projects/iss/src}/components/controls/mobile/flags/ky.svg +0 -0
  335. /package/{src → projects/iss/src}/components/controls/mobile/flags/kz.svg +0 -0
  336. /package/{src → projects/iss/src}/components/controls/mobile/flags/la.svg +0 -0
  337. /package/{src → projects/iss/src}/components/controls/mobile/flags/lb.svg +0 -0
  338. /package/{src → projects/iss/src}/components/controls/mobile/flags/lc.svg +0 -0
  339. /package/{src → projects/iss/src}/components/controls/mobile/flags/li.svg +0 -0
  340. /package/{src → projects/iss/src}/components/controls/mobile/flags/lk.svg +0 -0
  341. /package/{src → projects/iss/src}/components/controls/mobile/flags/lr.svg +0 -0
  342. /package/{src → projects/iss/src}/components/controls/mobile/flags/ls.svg +0 -0
  343. /package/{src → projects/iss/src}/components/controls/mobile/flags/lt.svg +0 -0
  344. /package/{src → projects/iss/src}/components/controls/mobile/flags/lu.svg +0 -0
  345. /package/{src → projects/iss/src}/components/controls/mobile/flags/lv.svg +0 -0
  346. /package/{src → projects/iss/src}/components/controls/mobile/flags/ly.svg +0 -0
  347. /package/{src → projects/iss/src}/components/controls/mobile/flags/ma.svg +0 -0
  348. /package/{src → projects/iss/src}/components/controls/mobile/flags/mc.svg +0 -0
  349. /package/{src → projects/iss/src}/components/controls/mobile/flags/md.svg +0 -0
  350. /package/{src → projects/iss/src}/components/controls/mobile/flags/me.svg +0 -0
  351. /package/{src → projects/iss/src}/components/controls/mobile/flags/mf.svg +0 -0
  352. /package/{src → projects/iss/src}/components/controls/mobile/flags/mg.svg +0 -0
  353. /package/{src → projects/iss/src}/components/controls/mobile/flags/mh.svg +0 -0
  354. /package/{src → projects/iss/src}/components/controls/mobile/flags/mk.svg +0 -0
  355. /package/{src → projects/iss/src}/components/controls/mobile/flags/ml.svg +0 -0
  356. /package/{src → projects/iss/src}/components/controls/mobile/flags/mm.svg +0 -0
  357. /package/{src → projects/iss/src}/components/controls/mobile/flags/mn.svg +0 -0
  358. /package/{src → projects/iss/src}/components/controls/mobile/flags/mo.svg +0 -0
  359. /package/{src → projects/iss/src}/components/controls/mobile/flags/mp.svg +0 -0
  360. /package/{src → projects/iss/src}/components/controls/mobile/flags/mq.svg +0 -0
  361. /package/{src → projects/iss/src}/components/controls/mobile/flags/mr.svg +0 -0
  362. /package/{src → projects/iss/src}/components/controls/mobile/flags/ms.svg +0 -0
  363. /package/{src → projects/iss/src}/components/controls/mobile/flags/mt.svg +0 -0
  364. /package/{src → projects/iss/src}/components/controls/mobile/flags/mu.svg +0 -0
  365. /package/{src → projects/iss/src}/components/controls/mobile/flags/mv.svg +0 -0
  366. /package/{src → projects/iss/src}/components/controls/mobile/flags/mw.svg +0 -0
  367. /package/{src → projects/iss/src}/components/controls/mobile/flags/mx.svg +0 -0
  368. /package/{src → projects/iss/src}/components/controls/mobile/flags/my.svg +0 -0
  369. /package/{src → projects/iss/src}/components/controls/mobile/flags/mz.svg +0 -0
  370. /package/{src → projects/iss/src}/components/controls/mobile/flags/na.svg +0 -0
  371. /package/{src → projects/iss/src}/components/controls/mobile/flags/nc.svg +0 -0
  372. /package/{src → projects/iss/src}/components/controls/mobile/flags/ne.svg +0 -0
  373. /package/{src → projects/iss/src}/components/controls/mobile/flags/nf.svg +0 -0
  374. /package/{src → projects/iss/src}/components/controls/mobile/flags/ng.svg +0 -0
  375. /package/{src → projects/iss/src}/components/controls/mobile/flags/ni.svg +0 -0
  376. /package/{src → projects/iss/src}/components/controls/mobile/flags/nl.svg +0 -0
  377. /package/{src → projects/iss/src}/components/controls/mobile/flags/no.svg +0 -0
  378. /package/{src → projects/iss/src}/components/controls/mobile/flags/np.svg +0 -0
  379. /package/{src → projects/iss/src}/components/controls/mobile/flags/nr.svg +0 -0
  380. /package/{src → projects/iss/src}/components/controls/mobile/flags/nu.svg +0 -0
  381. /package/{src → projects/iss/src}/components/controls/mobile/flags/nz.svg +0 -0
  382. /package/{src → projects/iss/src}/components/controls/mobile/flags/om.svg +0 -0
  383. /package/{src → projects/iss/src}/components/controls/mobile/flags/pa.svg +0 -0
  384. /package/{src → projects/iss/src}/components/controls/mobile/flags/pe.svg +0 -0
  385. /package/{src → projects/iss/src}/components/controls/mobile/flags/pf.svg +0 -0
  386. /package/{src → projects/iss/src}/components/controls/mobile/flags/pg.svg +0 -0
  387. /package/{src → projects/iss/src}/components/controls/mobile/flags/ph.svg +0 -0
  388. /package/{src → projects/iss/src}/components/controls/mobile/flags/pk.svg +0 -0
  389. /package/{src → projects/iss/src}/components/controls/mobile/flags/pl.svg +0 -0
  390. /package/{src → projects/iss/src}/components/controls/mobile/flags/pm.svg +0 -0
  391. /package/{src → projects/iss/src}/components/controls/mobile/flags/pn.svg +0 -0
  392. /package/{src → projects/iss/src}/components/controls/mobile/flags/pr.svg +0 -0
  393. /package/{src → projects/iss/src}/components/controls/mobile/flags/ps.svg +0 -0
  394. /package/{src → projects/iss/src}/components/controls/mobile/flags/pt.svg +0 -0
  395. /package/{src → projects/iss/src}/components/controls/mobile/flags/pw.svg +0 -0
  396. /package/{src → projects/iss/src}/components/controls/mobile/flags/py.svg +0 -0
  397. /package/{src → projects/iss/src}/components/controls/mobile/flags/qa.svg +0 -0
  398. /package/{src → projects/iss/src}/components/controls/mobile/flags/re.svg +0 -0
  399. /package/{src → projects/iss/src}/components/controls/mobile/flags/ro.svg +0 -0
  400. /package/{src → projects/iss/src}/components/controls/mobile/flags/rs.svg +0 -0
  401. /package/{src → projects/iss/src}/components/controls/mobile/flags/ru.svg +0 -0
  402. /package/{src → projects/iss/src}/components/controls/mobile/flags/rw.svg +0 -0
  403. /package/{src → projects/iss/src}/components/controls/mobile/flags/sa.svg +0 -0
  404. /package/{src → projects/iss/src}/components/controls/mobile/flags/sb.svg +0 -0
  405. /package/{src → projects/iss/src}/components/controls/mobile/flags/sc.svg +0 -0
  406. /package/{src → projects/iss/src}/components/controls/mobile/flags/sd.svg +0 -0
  407. /package/{src → projects/iss/src}/components/controls/mobile/flags/se.svg +0 -0
  408. /package/{src → projects/iss/src}/components/controls/mobile/flags/sg.svg +0 -0
  409. /package/{src → projects/iss/src}/components/controls/mobile/flags/sh.svg +0 -0
  410. /package/{src → projects/iss/src}/components/controls/mobile/flags/si.svg +0 -0
  411. /package/{src → projects/iss/src}/components/controls/mobile/flags/sj.svg +0 -0
  412. /package/{src → projects/iss/src}/components/controls/mobile/flags/sk.svg +0 -0
  413. /package/{src → projects/iss/src}/components/controls/mobile/flags/sl.svg +0 -0
  414. /package/{src → projects/iss/src}/components/controls/mobile/flags/sm.svg +0 -0
  415. /package/{src → projects/iss/src}/components/controls/mobile/flags/sn.svg +0 -0
  416. /package/{src → projects/iss/src}/components/controls/mobile/flags/so.svg +0 -0
  417. /package/{src → projects/iss/src}/components/controls/mobile/flags/sr.svg +0 -0
  418. /package/{src → projects/iss/src}/components/controls/mobile/flags/ss.svg +0 -0
  419. /package/{src → projects/iss/src}/components/controls/mobile/flags/st.svg +0 -0
  420. /package/{src → projects/iss/src}/components/controls/mobile/flags/stc-icons.css +0 -0
  421. /package/{src → projects/iss/src}/components/controls/mobile/flags/sv.svg +0 -0
  422. /package/{src → projects/iss/src}/components/controls/mobile/flags/sx.svg +0 -0
  423. /package/{src → projects/iss/src}/components/controls/mobile/flags/sy.svg +0 -0
  424. /package/{src → projects/iss/src}/components/controls/mobile/flags/sz.svg +0 -0
  425. /package/{src → projects/iss/src}/components/controls/mobile/flags/tc.svg +0 -0
  426. /package/{src → projects/iss/src}/components/controls/mobile/flags/td.svg +0 -0
  427. /package/{src → projects/iss/src}/components/controls/mobile/flags/tf.svg +0 -0
  428. /package/{src → projects/iss/src}/components/controls/mobile/flags/tg.svg +0 -0
  429. /package/{src → projects/iss/src}/components/controls/mobile/flags/th.svg +0 -0
  430. /package/{src → projects/iss/src}/components/controls/mobile/flags/tj.svg +0 -0
  431. /package/{src → projects/iss/src}/components/controls/mobile/flags/tk.svg +0 -0
  432. /package/{src → projects/iss/src}/components/controls/mobile/flags/tl.svg +0 -0
  433. /package/{src → projects/iss/src}/components/controls/mobile/flags/tm.svg +0 -0
  434. /package/{src → projects/iss/src}/components/controls/mobile/flags/tn.svg +0 -0
  435. /package/{src → projects/iss/src}/components/controls/mobile/flags/to.svg +0 -0
  436. /package/{src → projects/iss/src}/components/controls/mobile/flags/tr.svg +0 -0
  437. /package/{src → projects/iss/src}/components/controls/mobile/flags/tt.svg +0 -0
  438. /package/{src → projects/iss/src}/components/controls/mobile/flags/tv.svg +0 -0
  439. /package/{src → projects/iss/src}/components/controls/mobile/flags/tw.svg +0 -0
  440. /package/{src → projects/iss/src}/components/controls/mobile/flags/tz.svg +0 -0
  441. /package/{src → projects/iss/src}/components/controls/mobile/flags/ua.svg +0 -0
  442. /package/{src → projects/iss/src}/components/controls/mobile/flags/ug.svg +0 -0
  443. /package/{src → projects/iss/src}/components/controls/mobile/flags/um.svg +0 -0
  444. /package/{src → projects/iss/src}/components/controls/mobile/flags/us.svg +0 -0
  445. /package/{src → projects/iss/src}/components/controls/mobile/flags/uy.svg +0 -0
  446. /package/{src → projects/iss/src}/components/controls/mobile/flags/uz.svg +0 -0
  447. /package/{src → projects/iss/src}/components/controls/mobile/flags/va.svg +0 -0
  448. /package/{src → projects/iss/src}/components/controls/mobile/flags/vc.svg +0 -0
  449. /package/{src → projects/iss/src}/components/controls/mobile/flags/ve.svg +0 -0
  450. /package/{src → projects/iss/src}/components/controls/mobile/flags/vg.svg +0 -0
  451. /package/{src → projects/iss/src}/components/controls/mobile/flags/vi.svg +0 -0
  452. /package/{src → projects/iss/src}/components/controls/mobile/flags/vn.svg +0 -0
  453. /package/{src → projects/iss/src}/components/controls/mobile/flags/vu.svg +0 -0
  454. /package/{src → projects/iss/src}/components/controls/mobile/flags/wf.svg +0 -0
  455. /package/{src → projects/iss/src}/components/controls/mobile/flags/ws.svg +0 -0
  456. /package/{src → projects/iss/src}/components/controls/mobile/flags/xk.svg +0 -0
  457. /package/{src → projects/iss/src}/components/controls/mobile/flags/ye.svg +0 -0
  458. /package/{src → projects/iss/src}/components/controls/mobile/flags/yt.svg +0 -0
  459. /package/{src → projects/iss/src}/components/controls/mobile/flags/za.svg +0 -0
  460. /package/{src → projects/iss/src}/components/controls/mobile/flags/zm.svg +0 -0
  461. /package/{src → projects/iss/src}/components/controls/mobile/flags/zw.svg +0 -0
  462. /package/{src → projects/iss/src}/upgrade.scss +0 -0
@@ -0,0 +1,481 @@
1
+ import { Component, signal } from "@angular/core";
2
+ import { NG_VALUE_ACCESSOR, ReactiveFormsModule } from "@angular/forms";
3
+ import { ControlBase } from "../base/control-base";
4
+ import { PLATE_LETTERS } from "./plate-letters.const";
5
+
6
+ @Component({
7
+ selector: "iss-ctrl-plate-number",
8
+ imports: [
9
+ ReactiveFormsModule
10
+ ],
11
+ providers: [
12
+ {provide: NG_VALUE_ACCESSOR, useExisting: PlateControl, multi: true}
13
+ ],
14
+ template: `
15
+ <div class="plate-container">
16
+ <div class="section numbers-section">
17
+ <div class="digit-row">
18
+ @for (num of numbersAr(); track $index) {
19
+ <input
20
+ type="text"
21
+ class="plate-input number-input"
22
+ maxlength="1"
23
+ [id]="'num-ar-' + $index"
24
+ [value]="num"
25
+ placeholder="١"
26
+ (keydown)="preventNonDigits($event, 'ar')"
27
+ (keyup)="preventNonDigits($event, 'ar')"
28
+ (input)="onNumberInput($index, $event, 'ar')"
29
+ />
30
+ }
31
+ </div>
32
+
33
+ <div class="digit-row">
34
+ @for (num of numbersEn(); track $index) {
35
+ <input
36
+ type="text"
37
+ class="plate-input number-input"
38
+ maxlength="1"
39
+ [id]="'num-en-' + $index"
40
+ [value]="num"
41
+ placeholder="1"
42
+ (keydown)="preventNonDigits($event, 'en')"
43
+ (keyup)="preventNonDigits($event, 'en')"
44
+ (input)="onNumberInput($index, $event, 'en')"
45
+ />
46
+ }
47
+ </div>
48
+ </div>
49
+
50
+ <div class="section emblem-section">
51
+ <svg class="emblem-svg" viewBox="0 0 17 19" fill="none" xmlns="http://www.w3.org/2000/svg">
52
+ <path
53
+ fill-rule="evenodd"
54
+ clip-rule="evenodd"
55
+ d="M10.8072 16.8744C11.4633 16.178 11.3244 15.3914 10.7996 15.3825C10.9872 15.9606 10.5562 16.3344 10.3922 16.5266C9.97894 16.1712 9.55086 15.7761 9.10778 15.3694C11.2695 13.5812 13.6354 11.995 16.7263 11.9452C13.3983 10.7499 10.7417 12.7815 8.4925 14.8084C6.24308 12.7815 3.58672 10.7499 0.257812 11.9452C3.34944 11.995 5.71507 13.581 7.87722 15.3694C7.43329 15.7761 7.00564 16.1712 6.59172 16.5266C6.42902 16.3344 5.99777 15.9606 6.18435 15.3825C5.65992 15.3914 5.52089 16.178 6.17758 16.8744C5.91495 17.0931 5.48962 17.4631 5.15113 17.5518C4.89082 17.6199 4.68185 17.4846 4.63473 17.2026C4.53542 16.6069 3.61271 16.6959 3.72554 17.5372C3.82907 18.3044 4.76066 18.6391 5.55892 18.2837C5.87565 18.1424 6.3107 17.7413 6.66778 17.45C6.83111 17.641 7.26215 18.0145 7.07494 18.5935C7.59979 18.5838 7.7384 17.798 7.08234 17.1005C7.54845 16.7028 8.01625 16.2927 8.4925 15.887C8.96833 16.2925 9.43634 16.7028 9.90288 17.1005C9.24639 17.798 9.385 18.5838 9.91006 18.5935C9.72285 18.0145 10.1539 17.6414 10.3168 17.45C10.6745 17.7413 11.1091 18.1424 11.4263 18.2837C12.2246 18.6391 13.1555 18.3044 13.259 17.5372C13.3719 16.6959 12.4496 16.6069 12.3494 17.2026C12.3023 17.4846 12.094 17.6196 11.8332 17.5518C11.4948 17.4631 11.0696 17.0931 10.8072 16.8744ZM6.72504 5.72093C6.22365 7.04637 6.19597 8.53894 6.9169 10.1805C6.80195 8.47576 7.17594 7.06771 7.8713 6.0066L8.01815 7.46832H7.84679L8.01815 9.17958H7.84679L8.01815 10.8904H7.84679L8.01794 12.5991L7.53366 13.0819H8.4925H9.45156L8.96685 12.5991L9.13842 10.8904H8.96685L9.13842 9.17958H8.96685L9.13842 7.46832H8.96685L9.11391 6.0066C9.80906 7.06771 10.1833 8.47682 10.0683 10.1805C10.7886 8.53894 10.7616 7.047 10.2602 5.72093C11.1115 6.72478 11.7701 7.89851 12.0661 9.36572C12.3733 7.50466 11.848 5.98568 10.8852 4.8071C11.8174 5.47943 12.6184 6.33157 13.1785 7.48396C13.048 5.72072 12.1559 4.57742 10.927 3.75824C11.989 4.1054 12.8561 4.68645 13.6343 5.71798C13.1139 3.8884 11.9801 3.15564 10.575 2.74362C11.5332 2.67368 12.4386 2.78165 13.3347 3.33988C12.3621 2.02839 11.0565 1.81055 9.73257 1.95634C10.2893 1.67279 10.9158 1.53101 11.5888 1.63137C10.8302 1.07187 9.81836 1.01651 8.95227 1.48812L8.4925 0.328125L8.0321 1.48749C7.1658 1.01651 6.15476 1.07166 5.39623 1.63137C6.06877 1.53122 6.69483 1.67279 7.25179 1.95634C5.92826 1.81055 4.62311 2.0286 3.6499 3.33988C4.54662 2.78165 5.45137 2.67368 6.41001 2.74362C5.00534 3.15564 3.87112 3.8884 3.35113 5.71798C4.12868 4.68666 4.99625 4.1054 6.05842 3.75824C4.8287 4.57721 3.93704 5.72072 3.80625 7.48396C4.36618 6.33157 5.16782 5.47943 6.09962 4.8071C5.13676 5.98568 4.61149 7.50466 4.91871 9.36572C5.21494 7.89851 5.87354 6.72478 6.72504 5.72093Z"
56
+ fill="#1D252D"
57
+ />
58
+ </svg>
59
+ </div>
60
+
61
+ <div class="section letters-section">
62
+ <div class="arabic-row" dir="rtl">
63
+ @for (letter of lettersAr(); track $index) {
64
+ <div class="input-wrapper">
65
+ <input
66
+ type="text"
67
+ class="plate-input letter-input"
68
+ maxlength="1"
69
+ [id]="'let-ar-' + $index"
70
+ [class.invalid]="letterErrors()[$index]"
71
+ [value]="letter"
72
+ placeholder="س"
73
+ (input)="onLetterInput($index, $event, 'ar')"
74
+ />
75
+ @if (letterErrors()[$index]) {
76
+ <span class="error-tooltip">Invalid</span>
77
+ }
78
+ </div>
79
+ }
80
+ </div>
81
+
82
+ <div class="english-row" dir="rtl">
83
+ @for (letter of lettersEn(); track $index) {
84
+ <div class="input-wrapper">
85
+ <input
86
+ type="text"
87
+ class="plate-input letter-input"
88
+ maxlength="1"
89
+ [id]="'let-en-' + $index"
90
+ [class.invalid]="letterErrors()[$index]"
91
+ [value]="letter"
92
+ placeholder="S"
93
+ (input)="onLetterInput($index, $event, 'en')"
94
+ />
95
+ </div>
96
+ }
97
+ </div>
98
+ </div>
99
+
100
+ <div class="ksa-strip">
101
+ <svg class="mini-emblem" viewBox="0 0 17 19" fill="none" xmlns="http://www.w3.org/2000/svg">
102
+ <path
103
+ fill-rule="evenodd"
104
+ clip-rule="evenodd"
105
+ d="M10.8072 16.8744C11.4633 16.178 11.3244 15.3914 10.7996 15.3825C10.9872 15.9606 10.5562 16.3344 10.3922 16.5266C9.97894 16.1712 9.55086 15.7761 9.10778 15.3694C11.2695 13.5812 13.6354 11.995 16.7263 11.9452C13.3983 10.7499 10.7417 12.7815 8.4925 14.8084C6.24308 12.7815 3.58672 10.7499 0.257812 11.9452C3.34944 11.995 5.71507 13.581 7.87722 15.3694C7.43329 15.7761 7.00564 16.1712 6.59172 16.5266C6.42902 16.3344 5.99777 15.9606 6.18435 15.3825C5.65992 15.3914 5.52089 16.178 6.17758 16.8744C5.91495 17.0931 5.48962 17.4631 5.15113 17.5518C4.89082 17.6199 4.68185 17.4846 4.63473 17.2026C4.53542 16.6069 3.61271 16.6959 3.72554 17.5372C3.82907 18.3044 4.76066 18.6391 5.55892 18.2837C5.87565 18.1424 6.3107 17.7413 6.66778 17.45C6.83111 17.641 7.26215 18.0145 7.07494 18.5935C7.59979 18.5838 7.7384 17.798 7.08234 17.1005C7.54845 16.7028 8.01625 16.2927 8.4925 15.887C8.96833 16.2925 9.43634 16.7028 9.90288 17.1005C9.24639 17.798 9.385 18.5838 9.91006 18.5935C9.72285 18.0145 10.1539 17.6414 10.3168 17.45C10.6745 17.7413 11.1091 18.1424 11.4263 18.2837C12.2246 18.6391 13.1555 18.3044 13.259 17.5372C13.3719 16.6959 12.4496 16.6069 12.3494 17.2026C12.3023 17.4846 12.094 17.6196 11.8332 17.5518C11.4948 17.4631 11.0696 17.0931 10.8072 16.8744ZM6.72504 5.72093C6.22365 7.04637 6.19597 8.53894 6.9169 10.1805C6.80195 8.47576 7.17594 7.06771 7.8713 6.0066L8.01815 7.46832H7.84679L8.01815 9.17958H7.84679L8.01815 10.8904H7.84679L8.01794 12.5991L7.53366 13.0819H8.4925H9.45156L8.96685 12.5991L9.13842 10.8904H8.96685L9.13842 9.17958H8.96685L9.13842 7.46832H8.96685L9.11391 6.0066C9.80906 7.06771 10.1833 8.47682 10.0683 10.1805C10.7886 8.53894 10.7616 7.047 10.2602 5.72093C11.1115 6.72478 11.7701 7.89851 12.0661 9.36572C12.3733 7.50466 11.848 5.98568 10.8852 4.8071C11.8174 5.47943 12.6184 6.33157 13.1785 7.48396C13.048 5.72072 12.1559 4.57742 10.927 3.75824C11.989 4.1054 12.8561 4.68645 13.6343 5.71798C13.1139 3.8884 11.9801 3.15564 10.575 2.74362C11.5332 2.67368 12.4386 2.78165 13.3347 3.33988C12.3621 2.02839 11.0565 1.81055 9.73257 1.95634C10.2893 1.67279 10.9158 1.53101 11.5888 1.63137C10.8302 1.07187 9.81836 1.01651 8.95227 1.48812L8.4925 0.328125L8.0321 1.48749C7.1658 1.01651 6.15476 1.07166 5.39623 1.63137C6.06877 1.53122 6.69483 1.67279 7.25179 1.95634C5.92826 1.81055 4.62311 2.0286 3.6499 3.33988C4.54662 2.78165 5.45137 2.67368 6.41001 2.74362C5.00534 3.15564 3.87112 3.8884 3.35113 5.71798C4.12868 4.68666 4.99625 4.1054 6.05842 3.75824C4.8287 4.57721 3.93704 5.72072 3.80625 7.48396C4.36618 6.33157 5.16782 5.47943 6.09962 4.8071C5.13676 5.98568 4.61149 7.50466 4.91871 9.36572C5.21494 7.89851 5.87354 6.72478 6.72504 5.72093Z"
106
+ fill="#1D252D"
107
+ />
108
+ </svg>
109
+ <span class="ksa-text">KSA</span>
110
+ </div>
111
+ </div>
112
+ `,
113
+ styles: `
114
+ .plate-container {
115
+ width: 600px;
116
+ height: 130px;
117
+ border: 4px solid #1D252D;
118
+ border-radius: 10px;
119
+ background: white;
120
+ display: flex;
121
+ box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
122
+ overflow: hidden;
123
+ position: relative;
124
+ }
125
+
126
+ /* General Section Styling */
127
+ .section {
128
+ display: flex;
129
+ flex-direction: column;
130
+ justify-content: center;
131
+ align-items: center;
132
+ }
133
+
134
+ /* Left Section: Numbers/Asterisks */
135
+ .numbers-section {
136
+ flex: 2;
137
+ padding: 0 10px;
138
+ }
139
+
140
+ .digit-row {
141
+ display: flex;
142
+ justify-content: space-between;
143
+ width: 80%;
144
+ font-size: 38px;
145
+ line-height: 1;
146
+ color: #1D252D;
147
+ margin: 2px 0;
148
+ }
149
+
150
+ /* Middle Section: Emblem */
151
+ .emblem-section {
152
+ flex: 1.2;
153
+ padding: 10px;
154
+ }
155
+
156
+ .emblem-svg {
157
+ width: 100%;
158
+ height: 100%;
159
+ max-height: 90px;
160
+ }
161
+
162
+ /* Right Section: Letters */
163
+ .letters-section {
164
+ flex: 1.8;
165
+ border-right: 2px solid #1D252D;
166
+ padding: 0 10px;
167
+ }
168
+
169
+ .arabic-row {
170
+ font-family: 'Noto Sans Arabic', sans-serif;
171
+ font-size: 32px;
172
+ display: flex;
173
+ justify-content: space-around;
174
+ width: 100%;
175
+ margin-bottom: 5px;
176
+ color: #1D252D;
177
+ }
178
+
179
+ .english-row {
180
+ font-size: 38px;
181
+ display: flex;
182
+ justify-content: space-around;
183
+ width: 100%;
184
+ color: #1D252D;
185
+ }
186
+
187
+ /* Far Right: KSA Strip */
188
+ .ksa-strip {
189
+ width: 50px;
190
+ display: flex;
191
+ flex-direction: column;
192
+ justify-content: space-between;
193
+ align-items: center;
194
+ padding: 10px 0;
195
+ background-color: #fff; /* or specific reflective white */
196
+ }
197
+
198
+ .mini-emblem {
199
+ width: 25px;
200
+ height: auto;
201
+ }
202
+
203
+ .ksa-text {
204
+ writing-mode: vertical-rl;
205
+ text-orientation: upright;
206
+ font-weight: 900;
207
+ font-size: 16px;
208
+ letter-spacing: 2px;
209
+ color: #1D252D;
210
+ margin-top: auto;
211
+ margin-bottom: 5px;
212
+ }
213
+
214
+ .plate-input {
215
+ background: transparent;
216
+ border: none;
217
+ text-align: center;
218
+ font-family: inherit;
219
+ font-size: inherit;
220
+ font-weight: bold;
221
+ color: #1D252D;
222
+ width: 100%; /* Fill the flex/grid item */
223
+ padding: 0;
224
+ margin: 0;
225
+ outline: none; /* Remove blue outline on focus */
226
+ }
227
+
228
+ /* Optional: Add a subtle underline or color change when user clicks the input */
229
+ .plate-input:focus {
230
+ border-bottom: 2px solid #1D252D;
231
+ }
232
+
233
+ /* Adjusting the container flex settings to ensure inputs fit */
234
+ .digit-row, .arabic-row, .english-row {
235
+ display: flex;
236
+ justify-content: space-between;
237
+ width: 100%;
238
+ }
239
+
240
+ /* Specific sizing for numbers to ensure they match plate proportions */
241
+ .number-input {
242
+ /* Adjust width based on your container size, roughly 20-25% */
243
+ flex: 1;
244
+ }
245
+
246
+ /* Specific sizing for letters */
247
+ .letter-input {
248
+ flex: 1;
249
+ }
250
+
251
+ /* Placeholder styling to look like a ghost plate */
252
+ .plate-input::placeholder {
253
+ color: #ccc;
254
+ opacity: 1;
255
+ }
256
+
257
+ .input-wrapper {
258
+ position: relative;
259
+ display: flex;
260
+ flex-direction: column;
261
+ align-items: center;
262
+ flex: 1;
263
+ }
264
+
265
+ .error-tooltip {
266
+ position: absolute;
267
+ bottom: -15px;
268
+ font-size: 10px;
269
+ color: red;
270
+ white-space: nowrap;
271
+ }
272
+
273
+ .plate-input.invalid {
274
+ color: red;
275
+ }
276
+ `,
277
+ })
278
+ export class PlateControl extends ControlBase {
279
+ numbersAr = signal<string[]>(Array(4).fill(""));
280
+ numbersEn = signal<string[]>(Array(4).fill(""));
281
+ lettersAr = signal<string[]>(Array(3).fill(""));
282
+ lettersEn = signal<string[]>(Array(3).fill(""));
283
+ letterErrors = signal<boolean[]>(Array(3).fill(false));
284
+
285
+ override writeValue(value: string) {
286
+ const val = value;
287
+ if (val) {
288
+ const parts = val.split("-");
289
+ const letters = parts[0]?.split("") || [];
290
+ const numbers = parts[1]?.split("") || [];
291
+
292
+ // Initialize letters
293
+ const lAr: string[] = [];
294
+ const lEn: string[] = [];
295
+ for (let i = 0; i < 3; i++) {
296
+ const char = letters[i] || "";
297
+ if (char) {
298
+ const plateLetter = PLATE_LETTERS.find(l => l.value === char || l.label.en === char || l.label.ar === char);
299
+ if (plateLetter) {
300
+ lAr.push(plateLetter.label.ar);
301
+ lEn.push(plateLetter.label.en);
302
+ } else {
303
+ lAr.push("");
304
+ lEn.push("");
305
+ }
306
+ } else {
307
+ lAr.push("");
308
+ lEn.push("");
309
+ }
310
+ }
311
+ this.lettersAr.set(lAr);
312
+ this.lettersEn.set(lEn);
313
+
314
+ // Initialize numbers
315
+ const nAr: string[] = [];
316
+ const nEn: string[] = [];
317
+ for (let i = 0; i < 4; i++) {
318
+ const char = numbers[i] || "";
319
+ if (char) {
320
+ nAr.push(this.convertDigit(char, "ar"));
321
+ nEn.push(this.convertDigit(char, "en"));
322
+ } else {
323
+ nAr.push("");
324
+ nEn.push("");
325
+ }
326
+ }
327
+ this.numbersAr.set(nAr);
328
+ this.numbersEn.set(nEn);
329
+ }
330
+ }
331
+
332
+ onNumberInput(index: number, event: Event, lang: "ar" | "en") {
333
+ const input = event.target as HTMLInputElement;
334
+ let value = input.value;
335
+
336
+ // Allow only numbers
337
+ if (!/^[0-9\u0660-\u0669]*$/.test(value)) {
338
+ return;
339
+ }
340
+
341
+ input.value = lang === "ar" ? this.numbersAr()[index] : this.numbersEn()[index];
342
+
343
+ // Take only the last character if multiple characters are entered
344
+ if (value.length > 1) {
345
+ value = value.slice(-1);
346
+ input.value = value;
347
+ }
348
+
349
+ if (!value) {
350
+ const newAr = [...this.numbersAr()];
351
+ const newEn = [...this.numbersEn()];
352
+ newAr[index] = "";
353
+ newEn[index] = "";
354
+ this.numbersAr.set(newAr);
355
+ this.numbersEn.set(newEn);
356
+ return;
357
+ }
358
+
359
+ const arDigits = ["٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"];
360
+ const enDigits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
361
+
362
+ let digitIndex = enDigits.indexOf(value);
363
+
364
+ if (digitIndex === -1) {
365
+ digitIndex = arDigits.indexOf(value);
366
+ }
367
+
368
+ const newAr = [...this.numbersAr()];
369
+ const newEn = [...this.numbersEn()];
370
+
371
+ if (digitIndex !== -1) {
372
+ newAr[index] = arDigits[digitIndex];
373
+ newEn[index] = enDigits[digitIndex];
374
+
375
+ // Focus next
376
+ if (index < 3) {
377
+ this.focusInput(`num-${lang}-${index + 1}`);
378
+ } else {
379
+ this.focusInput(`let-${lang}-0`);
380
+ }
381
+ } else {
382
+ // Should not happen due to regex check, but safe fallback
383
+ newAr[index] = "";
384
+ newEn[index] = "";
385
+ }
386
+
387
+ this.numbersAr.set(newAr);
388
+ this.numbersEn.set(newEn);
389
+ }
390
+
391
+ onLetterInput(index: number, event: Event, lang: "ar" | "en") {
392
+ const input = event.target as HTMLInputElement;
393
+ let value = input.value;
394
+
395
+ if (!value) {
396
+ const newAr = [...this.lettersAr()];
397
+ const newEn = [...this.lettersEn()];
398
+ const newErrors = [...this.letterErrors()];
399
+ newAr[index] = "";
400
+ newEn[index] = "";
401
+ newErrors[index] = false;
402
+ this.lettersAr.set(newAr);
403
+ this.lettersEn.set(newEn);
404
+ this.letterErrors.set(newErrors);
405
+ return;
406
+ }
407
+
408
+ // Take only the last character
409
+ if (value.length > 1) {
410
+ value = value.slice(-1);
411
+ input.value = value;
412
+ }
413
+
414
+ const plateLetter = PLATE_LETTERS.find(l =>
415
+ l.value === value.toUpperCase() ||
416
+ l.label.en === value.toUpperCase() ||
417
+ l.label.ar === value
418
+ );
419
+
420
+ const newAr = [...this.lettersAr()];
421
+ const newEn = [...this.lettersEn()];
422
+ const newErrors = [...this.letterErrors()];
423
+
424
+ if (plateLetter) {
425
+ newAr[index] = plateLetter.label.ar;
426
+ newEn[index] = plateLetter.label.en;
427
+ newErrors[index] = false;
428
+
429
+ // Focus next
430
+ if (index < 2) {
431
+ this.focusInput(`let-${lang}-${index + 1}`);
432
+ } else {
433
+ this.focusInput(`num-${lang}-0`);
434
+ }
435
+ } else {
436
+ // Show error
437
+ if (lang === "ar") {
438
+ newAr[index] = value;
439
+ newEn[index] = ""; // Or keep previous?
440
+ } else {
441
+ newEn[index] = value;
442
+ newAr[index] = "";
443
+ }
444
+ newErrors[index] = true;
445
+ }
446
+
447
+ this.lettersAr.set(newAr);
448
+ this.lettersEn.set(newEn);
449
+ this.letterErrors.set(newErrors);
450
+ }
451
+
452
+ protected preventNonDigits($event: KeyboardEvent, ar: string) {
453
+ if ($event.key.length === 1 && !/^[0-9\u0660-\u0669]$/.test($event.key)) {
454
+ $event.preventDefault();
455
+ }
456
+ }
457
+
458
+ private focusInput(id: string) {
459
+ setTimeout(() => {
460
+ const element = document.getElementById(id);
461
+ if (element) {
462
+ element.focus();
463
+ // Optional: Select text so user can overwrite easily if they cycle back
464
+ (element as HTMLInputElement).select();
465
+ }
466
+ }, 0);
467
+ }
468
+
469
+ private convertDigit(digit: string, toLang: "ar" | "en"): string {
470
+ const arDigits = ["٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"];
471
+ const enDigits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
472
+
473
+ if (toLang === "ar") {
474
+ const index = enDigits.indexOf(digit);
475
+ return index !== -1 ? arDigits[index] : digit;
476
+ } else {
477
+ const index = arDigits.indexOf(digit);
478
+ return index !== -1 ? enDigits[index] : digit;
479
+ }
480
+ }
481
+ }
@@ -0,0 +1,36 @@
1
+ import { Component } from "@angular/core";
2
+ import { ReactiveFormsModule } from "@angular/forms";
3
+ import { MatLabel } from "@angular/material/form-field";
4
+ import { VIEW_PROVIDER } from "../../../shared/constants/view-provider.const";
5
+ import { FieldBase } from "../base/field-base";
6
+ import { PlateControl } from "./plate.control";
7
+ import { PlateViewer } from "./plate.viewer";
8
+
9
+ @Component({
10
+ selector: "iss-field-plate-number",
11
+ viewProviders: [VIEW_PROVIDER],
12
+ imports: [
13
+ ReactiveFormsModule,
14
+ PlateControl,
15
+ MatLabel,
16
+ PlateViewer
17
+ ],
18
+ template: `
19
+ @if (field.visible()) {
20
+ @if (!(field.config.hideLabel)) {
21
+ <mat-label>{{ field.label() }}</mat-label>
22
+ }
23
+
24
+ @if (field.mode() === "edit") {
25
+ <iss-ctrl-plate-number [formControlName]="field.name" (onChange)="updateField($event)" />
26
+ } @else {
27
+ <iss-viewer-plate [field]="field" />
28
+ }
29
+ }
30
+ `
31
+ })
32
+ export class PlateField extends FieldBase {
33
+ updateField($event: any) {
34
+ this.field.ctrlJsonValue.set($event);
35
+ }
36
+ }