{"id":1472,"date":"2023-09-19T05:00:00","date_gmt":"2023-09-19T12:00:00","guid":{"rendered":"https:\/\/www.angulartraining.com\/daily-newsletter\/?p=1472"},"modified":"2023-09-14T15:14:08","modified_gmt":"2023-09-14T22:14:08","slug":"ngx-mask-for-user-input-masking","status":"publish","type":"post","link":"https:\/\/www.angulartraining.com\/daily-newsletter\/ngx-mask-for-user-input-masking\/","title":{"rendered":"ngx-mask for user input masking"},"content":{"rendered":"\n<p>HTML forms are evolving but still lacking a little in masking, which really means &#8220;suggesting the proper format to the user.<\/p>\n\n\n\n<p>For instance, if I need to capture a US phone number in a specific format, I&#8217;d like to use a mask that looks like this:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"382\" height=\"41\" src=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-24.png\" alt=\"\" class=\"wp-image-1475\" srcset=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-24.png 382w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-24-300x32.png 300w\" sizes=\"auto, (max-width: 382px) 100vw, 382px\" \/><\/figure>\n<\/div>\n\n\n<p>We could use a placeholder, but the placeholder disappears as soon as we start typing, whereas a mask should remain visible and try to make the user input fit into that format. For instance:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"385\" height=\"42\" src=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-25.png\" alt=\"\" class=\"wp-image-1476\" srcset=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-25.png 385w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-25-300x33.png 300w\" sizes=\"auto, (max-width: 385px) 100vw, 385px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>This is where <a href=\"https:\/\/www.npmjs.com\/package\/ngx-mask\" target=\"_blank\" rel=\"noopener\" title=\"\">ngx-mask<\/a> helps. It&#8217;s a third-party <a href=\"https:\/\/blog.angulartraining.com\/how-to-pick-the-right-dependencies-for-your-angular-application-328ce637b982\" target=\"_blank\" rel=\"noopener\" title=\"\">library that passes my acceptance criteria for dependencies<\/a>. ngx-mask comes with directives and pipes to implement customizable masks. <\/p>\n\n\n\n<p>To install it: <code>npm install ngx-mask<\/code><\/p>\n\n\n\n<p>You can find out <a href=\"https:\/\/www.npmjs.com\/package\/ngx-mask#:~:text=With%20default%20config%20options%20application%20level\" target=\"_blank\" rel=\"noopener\" title=\"\">how to configure the library here<\/a>. Here is an example of the mask directive used for a US phone number:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"794\" height=\"64\" src=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-26.png\" alt=\"\" class=\"wp-image-1477\" srcset=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-26.png 794w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-26-300x24.png 300w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-26-768x62.png 768w\" sizes=\"auto, (max-width: 794px) 100vw, 794px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>And another one for a French phone number that doesn&#8217;t show the mask as we type but still enforces it:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"535\" height=\"54\" src=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-27.png\" alt=\"\" class=\"wp-image-1478\" srcset=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-27.png 535w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-27-300x30.png 300w\" sizes=\"auto, (max-width: 535px) 100vw, 535px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>The result looks like this:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"383\" height=\"93\" src=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-28.png\" alt=\"\" class=\"wp-image-1479\" srcset=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-28.png 383w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-28-300x73.png 300w\" sizes=\"auto, (max-width: 383px) 100vw, 383px\" \/><\/figure>\n<\/div>\n\n\n<p>Here is a <a href=\"https:\/\/stackblitz.com\/edit\/stackblitz-starters-ztxgpn\" target=\"_blank\" rel=\"noopener\" title=\"\">link to my example on Stackblitz<\/a>.<\/p>\n\n\n\n<p>You can try <a href=\"https:\/\/jsdaddy.github.io\/ngx-mask\/\" target=\"_blank\" rel=\"noopener\" title=\"\">many different demos on this website<\/a>. The library supports regular expressions and lots of other options, such as a <code>validation<\/code> attribute to invalidate the form when the input is invalid:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"899\" height=\"303\" src=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-29.png\" alt=\"\" class=\"wp-image-1480\" srcset=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-29.png 899w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-29-300x101.png 300w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-29-768x259.png 768w\" sizes=\"auto, (max-width: 899px) 100vw, 899px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>And it&#8217;s possible to have multiple different acceptable formats on a mask, too:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"732\" height=\"63\" src=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-30.png\" alt=\"\" class=\"wp-image-1481\" srcset=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-30.png 732w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/09\/image-30-300x26.png 300w\" sizes=\"auto, (max-width: 732px) 100vw, 732px\" \/><\/figure>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>HTML forms are evolving but still lacking a little in masking, which really means &#8220;suggesting the proper format to the user. For instance, if I need to capture a US phone number in a specific format, I&#8217;d like to use a mask that looks like this: We could use a placeholder, but the placeholder disappears [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,22],"tags":[],"class_list":["post-1472","post","type-post","status-publish","format-standard","hentry","category-angular","category-forms"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/posts\/1472","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/comments?post=1472"}],"version-history":[{"count":5,"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/posts\/1472\/revisions"}],"predecessor-version":[{"id":1484,"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/posts\/1472\/revisions\/1484"}],"wp:attachment":[{"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/media?parent=1472"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/categories?post=1472"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/tags?post=1472"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}