Recent

Custom Controls Using Angular Material

Git Repo:  https://github.com/yawahang/ohcontrols Features DatePicker (Date Picker, Time Picker, Date Time Picker, and many more) RatingPicker (Vertical, Horizontal, Custom Icons) Select (Single Select, MultiSelect, Single Column, MultiColumn) Recursive Treeview

Multiple Email tags, add multiple email using basic input, JQuery

// Implementation
$('#email').multiple_emails();

// Refresh the email input
$('.multiple_emails-container').find('.multiple_emails-ul').empty();
$('.multiple_emails-container').remove();
$('#email').multiple_emails();

// hide email remove tag
$('.multiple_emails-container').find('.glyphicon-remove').addClass('hidden');
$('.multiple_emails-container').css('background','#eee');

// validation
if($('#email').next('.multiple_emails-container').find('.multiple_emails-ul')
.find('li').length <= 0)
{
  $('#email').parent().find('.vld-email-mail').removeClass('hidden');
  //.vld-email-mail => validation text for email
}
multiple_email.js

(function ($) {

  $.fn.multiple_emails = function (options) {

    // Default options
    var defaults = {
      checkDupEmail: true,
      theme: "Bootstrap",
      position: "top"
    };

    // Merge send options with defaults
    var settings = $.extend({}, defaultsoptions);

    var deleteIconHTML = "";
    if (settings.theme.toLowerCase() == "Bootstrap".toLowerCase()) {
      deleteIconHTML = '<a href="#" class="multiple_emails-close icon-position" 
title="Remove"><span class="glyphicon glyphicon-remove"></span></a>';
    }
    else if (settings.theme.toLowerCase() == "SemanticUI".toLowerCase() 
|| settings.theme.toLowerCase() == "Semantic-UI".toLowerCase() 
|| settings.theme.toLowerCase() == "Semantic UI".toLowerCase()) {
      deleteIconHTML = '<a href="#" class="multiple_emails-close icon-position" 
title="Remove"><i class="remove icon"></i></a>';
    }
    else if (settings.theme.toLowerCase() == "Basic".toLowerCase()) {
      // Default which you should use if you don't use Bootstrap, SemanticUI, 
// or other CSS frameworks
      deleteIconHTML = '<a href="#" class="multiple_emails-close icon-position" 
title="Remove"><i class="basicdeleteicon">Remove</i></a>';
    }

    return this.each(function () {
      //$orig refers to the input HTML node
      var $orig = $(this);
// create html elements - list of email addresses as unordered list
      var $list = $('<ul class="multiple_emails-ul" />'); 

      if ($(this).val() != '' && IsJsonString($(this).val())) {
        $.each(jQuery.parseJSON($(this).val()), function (indexval) {
          $list.append($('<li class="multiple_emails-email">
<span class="email_name" data-email="' + val.toLowerCase() + '">' +
 val + '</span></li>')
            .prepend($(deleteIconHTML)
              .click(function (e) { $(this).parent().remove(); 
refresh_emails(); e.preventDefault(); })
            )
          );
        });
      }

      var $input = $('<input type="text" class="multiple_emails-input text-left" />')
.on('keyup'function (e) { // input
        // 
        $(this).removeClass('multiple_emails-error');
        var input_length = $(this).val().length;

        var keynum;
        if (window.event) { // IE         
          keynum = e.keyCode;
        }
        else if (e.which) { // Netscape/Firefox/Opera         
          keynum = e.which;
        }

        if (event.which == 8 && $list.find('li').last().length == 0) {
          $list.find('li').last().remove();
        } //Removes last item on backspace with no input

   // Supported key press is tab, enter, space or comma, 
// there is no support for semi-colon since the keyCode differs in various browsers
        if (keynum == 9 || keynum == 32 || keynum == 188) {
          display_email($(this), settings.checkDupEmail);

        }
        else if (keynum == 13) {
          display_email($(this), settings.checkDupEmail);
          //Prevents enter key default
          //This is to prevent the form from submitting with  the submit button
          //when you press enter in the email textbox
          e.preventDefault();
        }
      }).on('blur'function (event) {
        $('.invalid-email-block').addClass('hidden');
        if ($(this).val() != '') { display_email($(this), settings.checkDupEmail); }
      });
      var $container = $('<div class="multiple_emails-container" />')
.click(function () { $input.focus(); }); // container div

      // insert elements into DOM
      if (settings.position.toLowerCase() === "top")
        $container.append($list).append($input).insertAfter($(this));
      else
        $container.append($input).append($list).insertBefore($(this));
      /*
      t is the text input device.
      Value of the input could be a long line of copy-pasted emails, 
not just a single email.
      As such, the string is tokenized, with each token validated individually.
      
      If the dupEmailCheck variable is set to true, scans for duplicate emails, 
and invalidates input if found.
      Otherwise allows emails to have duplicated values if false.
      */
      function display_email(tdupEmailCheck) {
        $('.invalid-email-block').addClass('hidden');
        //Remove space, comma and semi-colon from beginning and end of string
        //Does not remove inside the string as the email will need to be 
tokenized using space, comma and semi-colon
        var arr = t.val().trim().replace(/^,|,$/g'').replace(/^;|;$/g'');
        //Remove the double quote
        arr = arr.replace(/"/g"");
        //Split the string into an array, with the space, comma, 
//and semi-colon as the separator
        arr = arr.split(/[\s,;]+/);

        var errorEmails = new Array(); //New array to contain the errors

        var pattern = new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]
|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d
|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)
|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]
|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])
|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))
*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-
\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])
*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-
\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])
*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i);

        for (var i = 0i < arr.lengthi++) {
          //  
          //Check if the email is already added, only if dupEmailCheck is set to true
          if (dupEmailCheck === true && $orig.val().indexOf(arr[i]) != -1) {
            if (arr[i] && arr[i].length > 0) {
              //new function () {
              //  var existingElement = $list.find('.email_name[data-email=' +
 arr[i].toLowerCase().replace('.', '\\.').replace('@', '\\@') + ']');
              //  existingElement.css('font-weight', 'bold');
              //  setTimeout(function() { existingElement.css('font-weight', ''); },
 1500);
              //}(); // Use a IIFE function to create a new scope so existingElement
 won't be overriden
              new function () {
                var item = $("span[data-email=" + "'" + arr[i] + "'" + "]");
                item.css('font-weight''bold');
                setTimeout(function () { item.css('font-weight'''); }, 1500);
                e.preventDefault();
              }();

            }
          }
          else if (pattern.test(arr[i]) == true) {
            $list.append($('<li class="multiple_emails-email"><span 
class="email_name" data-email="' + arr[i].toLowerCase() + '">' + arr[i] + '</span></li>')
              .prepend($(deleteIconHTML)
                .click(function (e) { $(this).parent().remove(); 
refresh_emails(); e.preventDefault(); })
              )
            );
          }
          else
            errorEmails.push(arr[i]);
        }
        // If erroneous emails found, or if duplicate email found
        if (errorEmails.length > 0) {
          t.val(errorEmails.join("; ")).addClass('multiple_emails-error');
          $('.multiple_emails-error').focus();
          var time = setInterval(function () {
            if ($('.multiple_emails-error').parent().parent()
.find('.invalid-email-block').length > 0) {
              $('.multiple_emails-error').parent().parent()
.find('.invalid-email-block').removeClass('hidden')
              clearInterval(time);
            }
          }, 100);

        }
        else
          t.val("");
        refresh_emails();
      }

      function refresh_emails() {
        var emails = new Array();
        var container = $orig.siblings('.multiple_emails-container');
        container.find('.multiple_emails-email span.email_name')
.each(function () { emails.push($(this).html()); });
        $orig.val(JSON.stringify(emails)).trigger('change');
      }

      function IsJsonString(str) {
        try { JSON.parse(str); }
        catch (e) { return false; }
        return true;
      }

      return $(this).hide();

    });

  };

})(jQuery);


multiple_email.css
.multiple_emails-container {
  border1px #ccc solid;
  box-shadowinset 0 1px 1px rgba(0000.075);
  cursortext;
  width100%;
  backgroundwhite;
  min-height32px;
  heightauto;
  padding2px;
}
.multiple_emails-container input {
  clearboth;
  width30%;
  border0;
  outlinenone;
  margin3px;
  padding2px;
  box-sizingborder-box;
}
.multiple_emails-container input {
  border0 !important;
}
.multiple_emails-container input.multiple_emails-error {
  box-shadow0 0px 0px rgba(0000.075), 0 0 2px red;
  outlinethin auto rgb(1993523!important;
}
.multiple_emails-container ul {
  list-style-typenone;
  padding-left0;
}
.multiple_emails-email {
  margin2px;
  padding1px;
  border1px #ccc solid;
  border-radius3px;
  background#f5f5f5;
  widthauto;
  displayinline-block;
  floatleft;
}
li.multiple_emails-email:nth-child(4):after {
  content"\A";
  white-spacepre;
}
.multiple_emails-close {
  floatleft;
  margin0 3px;
}
.icon-position {
  floatright;
  margin-left6px;
  top2px;
}
.multiple_emails-ul {
  marginauto;
}

Comments

Top Posts

SQL Server Symmetric Key & Certificate based Encryption With AES_256 Algorithm

Kendo Grid Angular Column Width, minResizableWidth dynamic

Kendo Grid AutoFit Columns