Thursday, November 14, 2024
HomejQueryTiny Textual content Area Primarily based Tags Enter Plugin - Tagify

Tiny Textual content Area Primarily based Tags Enter Plugin – Tagify


Tagify is a robust and full-featued tags enter JavaScript library designed to create animated, editable, sortable, high-performance tags/tokens enter in your fashionable internet apps.

Please notice that this library has deprecated jQuery help ranging from v4.23.0, so now you can implement Tagify utilizing Vanilla JavaScript.

Highlighted Options:

  • Auto prevents duplicate tags.
  • Auto cut up enter textual content into tags by comma or Enter key.
  • Auto suggestion checklist.
  • Auto expands enter whereas typing.
  • Permits to edit tags on double-click.
  • Permits to resort tags with drag’n’drop.
  • Permits to set blacklist.
  • Works with textual content fields like enter, textarea, and so on.
  • Suitable with the newest Bootstrap framework.
  • Works with React, Angular, Vue.js, and Vanilla JS.
  • And extra…

Set up & obtain with NPM:


# NPM
$ npm i @yaireo/tagify

Find out how to use it:

1. Import the Tagify into your internet mission:


<!-- Core Stylesheet -->
<hyperlink href="/dist/tagify.css" rel="stylesheet" kind="textual content/css" />

<!-- Core JavaScript -->
<script src="/dist/tagify.min.js"></script>

<!-- Polyfills for IE -->
<script src="/dist/tagify.polyfills.min.js"></script>

// OR import it as a module
import Tagify from '@yaireo/tagify'

2. Create an enter or textarea ingredient for the tags enter.


<enter identify="input-example" worth="jQuery, Script" autofocus>

<textarea identify="textarea-example" placeholder="Web sites">
  [{"value":"jQuery"}, {"value":"Script"}]
</textarea>

3. Initialize the Tagify and completed.


var enter = doc.querySelector('enter[name=input-example]');
new Tagify(enter, {
    // choices right here
});

var textarea = doc.querySelector('textarea[name=textarea-example]'),
    tagify = new Tagify(textarea, {
    // choices right here
});

4. Out there configuration choices to customise the tags enter.


tagify(enter, {

  // [regex] cut up tags by any of those delimiters ("null" to cancel)
  delimiters: ",", 

  // regex sample to validate enter by. 
  sample: null, 

  // tag knowledge Object property which can be displayed because the tag's textual content
  tagTextProp: 'worth',

  // placeholder textual content
  placeholder: '',

  // most variety of tags
  maxTags: Infinity, 

  // use 'choose' for single-value dropdown-like choose field
  // use 'combine' as worth to permit mixed-content
  // use 'built-in' to skip the creation of the wrapper
  // the 'sample' setting should be set to some character.
  mode: null,

  // interpolation for combine mode
  // all the pieces between these will turn into a tag
  mixTagsInterpolator: ['[[', ']]'],

  // outline situations by which typed mix-tags content material is permitting a tag to be created after.
  mixTagsAllowedAfter: /,|.|:|s/,

  // permit tuplicate tags
  duplicates: false, 

  // trim the tag's worth
  trim: true,

  // ought to ONLY use tags allowed in whitelist
  enforceWhitelist: false, 

  // disable manually typing/pasting/enhancing tags
  userInput: true,

  // permit the element as a complete to recieve focus. 
  focusable: false,

  // tries to autocomplete the enter's worth whereas typing
  autoComplete: {
    enabled: true,
    rightKey: false, // If true, when → is pressed, use the instructed worth to create a tag, else simply 
    auto-completes the enter. In mixed-mode that is ignored and handled as "true"
    tabKey: false, // If true, urgent tab key would solely auto-complete (if a suggesiton is highlighted) however won't convert to a tag (like rightKey does) additionally, until clicked once more (contemplating the addTagOn setting).
  },

  // is that this checklist has any objects, then solely permit tags from this checklist
  whitelist: [], 

  // a listing of non-allowed tags
  blacklist: [], 

  // mechanically provides the textual content which was inputed as a tag when blur occasion occurs
  addTagOnBlur: true, 

  // if the tagify discipline (in a traditional mode) has any non-tag enter in it, convert it to a tag on any of those occasions: blur away from the sector, click on "tab"/"enter" key
  addTagOn: ['blur', 'tab', 'enter'],

  // by default, the native method of inputs' onChange occasions is stored, and it solely fires when the sector is blured.
  onChangeAfterBlur: true,

  // mechanically converts pasted textual content into tags
  pasteAsTags: true,

  // uncovered callbacks object to be triggered on occasions: 'add' / 'take away' tags
  callbacks: {}, 

  // false or null will disallow enhancing
  editTags: {{
    clicks: 2, // Variety of clicks to enter "edit-mode": 1 for single click on. Another worth is taken into account as double-click
    keepInvalid: true, // retains invalid edits as-is till esc is pressed whereas in focus
  }},

  // object consisting of features which return template strings
  templates: {wrapper, tag, dropdownItem},

  // if the sample setting doesn't meet your wants, use this operate, which recieves tag knowledge object as an argument and may return true if validaiton handed or false/string of not
  // a string could also be returned as the explanation of the validation failure.
  validate: operate(){},

  // take a tag enter as argument and returns a reworked worth
  transformTag: operate(){},

  // if true, don't take away tags which didn't cross validation
  keepInvalidTags: false,

  // skip invald tags
  skipInvalid: false,

  // if false, don't create invalid tags from invalid person enter
  createInvalidTags: true,

  // true - take away final tag; edit - edit final tag
  backspace: true,

  // if you want your unique enter/textarea worth property format to aside from the default (which I like to recommend maintaining) it's possible you'll use this and ensure it returns a string.
  originalInputValueFormat: operate(){},

  // node or string so as to add after a tag added
  mixMode: {
    insertAfterTag: 'u00A0',
  },

  // permits tags to get focus, and in addition to be deleted through Backspace
  a11y: {
    focusableTags: false,
  }

  // default classnames
  classNames: {
    namespace            : 'tagify',
    mixMode              : 'tagify--mix',
    selectMode           : 'tagify--select',
    enter                : 'tagify__input',
    focus                : 'tagify--focus',
    tagNoAnimation       : 'tagify--noAnim',
    tagInvalid           : 'tagify--invalid',
    tagNotAllowed        : 'tagify--notAllowed',
    scopeLoading         : 'tagify--loading',
    hasMaxTags           : 'tagify--hasMaxTags',
    hasNoTags            : 'tagify--noTags',
    empty                : 'tagify--empty',
    inputInvalid         : 'tagify__input--invalid',
    dropdown             : 'tagify__dropdown',
    dropdownWrapper      : 'tagify__dropdown__wrapper',
    dropdownHeader       : 'tagify__dropdown__header',
    dropdownFooter       : 'tagify__dropdown__footer',
    dropdownItem         : 'tagify__dropdown__item',
    dropdownItemActive   : 'tagify__dropdown__item--active',
    dropdownItemHidden   : 'tagify__dropdown__item--hidden',
    dropdownItemSelected : 'tagify__dropdown__item--selected',
    dropdownInital       : 'tagify__dropdown--initial',
    tag                  : 'tagify__tag',
    tagText              : 'tagify__tag-text',
    tagX                 : 'tagify__tag__removeBtn',
    tagLoading           : 'tagify__tag--loading',
    tagEditing           : 'tagify__tag--editable',
    tagFlash             : 'tagify__tag--flash',
    tagHide              : 'tagify__tag--hide',
  },

  dropdown: {
    classname: '',
    enabled: 2,      // minimal enter characters to be typed for the options dropdown to indicate
    maxItems: 10,
    searchKeys: ["value", "searchBy"],
    fuzzySearch: true,
    caseSensitive: false,
    accentedSearch: true,
    sortby: 'startsWith',  // If set as startsWith string, the options checklist can be sorted with matched objects which begins with the question proven first, and precise matches proven earlier than all. If this setting is outlined as a operate, it recieves two arguments: the array of filtered objects and the question and it should return an Array.
    includeSelectedTags: false,
    escapeHTML: true,
    highlightFirst: false,  // highlights first-matched merchandise within the checklist
    closeOnSelect: true,   // closes the dropdown after choosing an merchandise, if `enabled:0` (which suggests all the time present dropdown)
    clearOnSelect: true,   // after choosing a suggetion, ought to the typed textual content enter stay or be cleared
    place: 'all',  // 'guide' / 'textual content' / 'all' / 'enter'
    mapValueTo: // If whitelist is an Array of Objects: Ex. [{value:'foo', email:'[email protected]'},...]) this setting controlls which knowledge key can be printed within the dropdown. Ex.1: mapValueTo: knowledge => "To:" + knowledge.e-mail Ex.2: mapValueTo: "e-mail"
    appendTarget: null,   // defaults to doc.physique one DOM has been loaded
    placeAbove: null, // If outlined, will power the location of the dropdown in respect to the Boolean worth: true will all the time present the options dropdown above the enter discipline and false will all the time present it beneath. By default this setting it not outlined and the location of the dropdown is mechanically determined in response to the area availble, the place opening it beneath the enter is most well-liked.
  },

  hooks:{
    beforeRemoveTag: () => Promise.resolve(),
    beforePaste: () => Promise.resolve(),
    suggestionClick: () => Promise.resolve()
    beforeKeyDown: () => Promise.resolve()
  },

});

8. API strategies.


var myInput = new Tagify(enter);

// provides new tag
// String (phrase, single or a number of with a delimiter), an Array of Objects, or Strings
// e.g. addTags(["banana", "orange", "apple"])
// or addTags([{value:"banana", color:"yellow"}, {value:"apple", color:"red"}, {value:"watermelon", color:"green"}])
// clearInputAfterAdding: true or false
// skipAddingInvalids: true or false
myInput.addTags(tags, clearInputAfterAdding, skipAddingInvalids);

// Bypasses the normalization course of in addTags, forcefully including tags on the final caret location or on the finish, if there isn't any final caret location saved
// tags: Array/String
myInput.addMixTags(tags);

// create an empty tag (optionally with pre-defined knowledge) and enters "edit" mode straight
// tagData: Object
myInput.addEmptyTag(tagData);

// removes a selected tag
// Array/HTMLElement/String tag(s) to take away
// silent: doesn't replace the element's worth
// tranDuration: transition length in ms
myInput.removeTags(tags, silent, tranDuration);

// removes all tags
myInput.removeAllTags();

// destroy the plugin
myInput.destroy();

// converts the enter's worth into tags. This technique will get referred to as mechanically when instansiating Tagify. Additionally works for mixed-tags
myInput.loadOriginalValues(String/Array);

// returns an Array of discovered matching objects (case-insensitive)
myInput.getWhitelistItemsByValue(Object);

// returns the index of a selected tag, by worth
myInput.getTagIndexByValue();

// returns the primary matched tag node, if discovered
myInput.getTagElmByValue();

// returns what number of tags already exists with that worth
myInput.isTagDuplicate();

// converts a String argument ([[foo]] and [[bar]] are..) into HTML with blended tags & texts
myInput.parseMixTags();

// returns a DOM nodes checklist of all of the tags
myInput.getTagElms();    

// returns a selected tag DOM node by worth
myInput.getTagElmByValue();

// set/get tag knowledge on a tag ingredient
myInput.getSetTagData(HTMLElement, Object);

// goes to edit-mode in a selected tag
myInput.editTag(HTMLElement); 

// get the node which has the precise tag's content material
myInput.getTagTextNode(HTMLElement); 

// set the textual content of a tag (DOM solely, doesn't have an effect on precise knowledge)
myInput.setTagTextNode(HTMLElement); 

// exit a tag's edit-mode. if "tagData" exists, exchange the tag ingredient with new knowledge and replace Tagify worth
myInput.replaceTag(tagElm, Object (tagData));

// toogle loading state on/off (Ex. AJAX whitelist pulling)
myInput.loading();

// identical as above however for a selected tag ingredient
myInput.tagLoading(HTMLElement, Boolean);

// returns a tag ingredient from the equipped tag knowledge
myInput.createTagElem(Object (tagData));

// injects textual content or HTML node eventually caret place. vary parameter is elective
myInput.injectAtCaret(HTMLElement (injectedNode), Object (vary)); 

// locations the caret after a given node
myInput.placeCaretAfterNode(HTMLElement);

// locations the caret at first or the tip of a node
myInput.setRangeAtStartEnd(Boolean, HTMLElement);

// no matter to insert after
myInput.insertAfterTag(HTMLElement (tag ingredient), HTMLElement/String);

// toggles class on the primary tagify container
myInput.toggleClass(true/false);

// provides all whitelist objects as tags and shut the suggestion dropdown
myInput.dropdown.selectAll();

// reveals the sugegstions checklist dropdown
// the string paramater permits filtering the outcomes
myInput.dropdown.present(string);

// hides the options checklist dropdown
myInput.dropdown.cover(true/false);

// Toggles dropdown present/cover
myInput.dropdown.toggle(true/false);

// iterates tag DOM nodes and re-build the tagify.worth array (name this if tags get sorted manually)
myInput.updateValueByDOMTags(); 

// converts a template string (by choosing one from the settings.templates by identify or supplying a template operate which returns a String) right into a DOM node
myInput.parseTemplate(String/Perform (template identify or operate), Array (knowledge));

// set readonly mode
myInput.setReadonly(true/false);

// set disabled mode
myInput.setDisabled(true/false);

// get knowledge for the precise occasion by parameter
myInput.getPersistedData(string);

// set knowledge for the precise occasion. Should provide a second parameter which would be the key to save lots of the information within the localstorage (below the tagify namespace)
myInput.setPersistedData(*, String);

// clear knowledge for the precise occasion, by parameter. If the parameter is ommited, clears all persevered knowledge associated to this occasion (by its id which was set within the occasion's settings)
myInput.clearPersistedData(string);

// Units the placeholder's worth
myInput.setPlaceholder(string);

9. Occasions.


var myInput = new Tagify(enter);

// e.kind, e.element, ...
myInput
.on('add', operate(e){
  // on add
})

.on('take away', operate(e){
  // on take away
})

.on('change', operate(e){
  // on change
})

.on('invalid', operate(e){
  // on invalid
})

.on('enter', operate(e){
  // on enter
})

.on('paste', operate(e){
  // on click on
})

.on('click on', operate(e){
  // on click on
})

.on('dblclick', operate(e){
  // on dblclick
})

.on('keydown', operate(e){
  // on keydown
})

.on('focus', operate(e){
  // on focus
})

.on('blur', operate(e){
  // on blur
})

.on('edit:enter', operate(e){
  // on enter
})

.on('edit:beforeUpdate', operate(e){
  // earlier than replace
})

.on('edit:up to date', operate(e){
  // on up to date
})

.on('edit:begin', operate(e){
  // on begin
})

.on('edit:keydown', operate(e){
  // on keydown
})

.on('dropdown:present', operate(e){
  // on present
})

.on('dropdown:cover', operate(e){
  // on cover
})

.on('dropdown:choose', operate(e){
  // on choose
})

.on('dropdown:scroll', operate(e){
  // tells the proportion scrolled. (occasion.element.proportion)
})

.on('dropdown:noMatch', operate(e){
  // when no whitelist suggestion merchandise matched for the the typed enter
})

.on('dropdown:up to date', operate(e){
  // when the dropdown checklist is re-filtered whereas options checklist is seen and a tag was eliminated so it was re-added as a suggestion
})

Changelog:

v4.31.4 (2024-10-25)

v4.31.3 (2024-08-31)

v4.31.2 (2024-08-29)

  • add occasion ought to hearth ASAP with none delay. Additionally ought to embrace invalid added tags

v4.31.1 (2024-08-26)

v4.31.0 (2024-08-24)

v4.27.0 (2024-06-23)

  • added a div wrapper to stop bug
  • bugfix – clicking the × (clear chosen tag) button in select-mode, the element shouldn’t get centered
  • added tagify-dd-text-color to Knobs within the examples html web page
  • minor refactor
  • added class identify this.settings.classNames.dropdownItemSelected (tagify__dropdown__item–selected) for chosen dropdown objects
  • added new CSS variable –tagify-dd-text-color
  • added CSS for suggestion objects that are presently already chosen (as tags)

v4.26.6 (2024-06-12)

  • chore: added a updatePlaceholderByTagsCount funciton to the advance-options demo to showcase the tagify.setPlaceholder technique
  • chore: added 2 strategies to the desk of accessible tagify strategies within the README: setRangeAtStartEnd & setPlaceholder
  • bugfixes

v4.26.5 (2024-05-14)

  • bugfixes
  • small CSS change relating to tags’ appeared line-height

v4.26.4 (2024-05-11)

v4.26.3 (2024-05-09)

  • clicking wherever inside an occasion’s dropdown shouldn’t cover it
  • add a customized property to the dropdown node so or not it’s linked to which tagify occasion it belongs to
  • bugfixes

v4.26.2 (2024-05-07)

  • ought to discard tags added as objects with an empty text-prop worth
  • refactored the “bindOriginaInputListener” interval so it will likely be restarted each time Tagify will get up to date so the comparability of the unique worth will solely occur after Tagify was up to date for sure
  • When the trim setting is true, tags added as objects ought to be trimmed as nicely
  • normalizeTags() technique ought to remove empty array objects
  • bugfixes

v4.26.1 (2024-05-02)

v4.25.1 (2024-04-25)

  • Refactored wrapper HTML template by extracting the enter into its personal template operate

v4.25.0 (2024-04-25)

  • Refactored wrapper HTML template by extracting the enter into its personal template operate
  • Added keyboard ENTER help for deleting chosen tag utilizing TAB navigation when in select-mode
  • Mounted bugs

2024-04-15

  • Up to date doc
  • Up to date demos

v4.23.0 (2024-04-09)

  • Minor CSS change to tag’s max width
  • Added a brand new setting – focusable
  • Simplified the situation as a result of dropdown.enabled is modified to 0 mechanically if userInput is ready to false by the applySettings technique
  • cursor: textual content CSS property ought to solely be utilized if Tagify has an editable node inside
  • Added a this.removeAllCustomListeners as a cleanup stage contained in the destroy technique
  • Added means to take away all of the occasions listeners for a selected kind of an occasion, with out specifying the callbacks as they’re saves internally – Added means to take away all of the occasions assigned on the occasion
  • Bugfixes

v4.22.2 (2024-03-19)

v4.22.0 (2024-03-17)

  • minor code adjustment for choose mode
  • modified the main target and blur occasions for the enter ingredient to world focusin & focusout occasions as a result of they are often propagated, and extra versatile to work with as a result of it does not resrict working solely with the enter ingredient
  • dropdown.present() technique ought to do nothing if this.state.dropdown.seen is true
  • choose mode shouldn’t auto-complete when urgent the TAB button as a result of the autocomplete technique can’t presently work for choose mode because it solely works for the enter ingredient which is hidden in choose mode 10078f1
  • added new helper technique isWithinNodeTag to check if a sure node is nested inside a tag ingredient
  • fastened bugs

v4.21.2 (2024-03-08)

v4.21.1 (2024-02-13)

  • dropdownItemNoMatch content material shouldn’t have empty areas as it’s going to present up within the HTML when injected.
  • refactored logic for post-processing a tag node which was simply added to the DOM.

v4.21.0 (2024-02-13)

  • prepareNewTagNode technique ought to return the modified tagData which incorporates the __isValid property
  • [refactor] moved suggestions-related strategies exterior of dropdown.js into a brand new file: options.js for seperation between the dropdown which is only a container and the precise options and their logic code
  • fastened banner points
  • added a README part for the bundle’s output recordsdata
  • refactored comparable user-input-to-tag preparation logic into a brand new technique prepareNewTagNode which is named by addTags, addMixedTags & prefixedTextToTag
  • determined it is higher to have the dropdown.highlightFirst setting set to true by default
  • selectOption dropdown technique shouldn’t return on mix-mode when this.DOM.enter.parentNode doesn’t exists
  • [Chore] Added javascript sourcemaps help which required changing rollup-plugin-banner with rollup-plugin-banner2 which does helps sourcemaps. Additionally fastened the banner remark which appears to haven’t been right for a very long time

v4.20.0 (2024-02-11)

  • Mounted numbers-only whilelist not displaying with userInput:false setting
  • Added paste occasion listener
  • The worldwide onClickAnywhere occasion ought to be of kind seize to ensure it’s going to hearth earlier than some other occasion so to not mess state.hasFocus)
  • Fixes – Tagify inside a label ingredient cannot get centered as the main target it shifted to the hidden unique discipline
  • select-mode can solely have one tag, so changed block margin (up/down) with padding so the tag will occuy the entire area of the container and have a bigger clicking space 
  • Prevented dblclick occasion from being listened to in choose mode, since there is no such thing as a want for it.
  • In `choose mode, clicking on the icon which toggles the dropdown ought to toggle it when it’s already open. refactored that half. 
  • Take away console.log name

v4.19.1 (2024-01-30)

v4.19.0 (2024-01-28)

  • improved the customers checklist demo in the primary demos web page
  • moved final commented change this.state.hasFocus to a greater location within the code
  • improved README with a greater “primary instance” part
  • re-made how “choose” mode works so as an alternative of the enter being editable, the precise tag is now seen and goes into edit-mode and the enter is hidden
  • eliminated a console.log
  • when calling addEmptyTag technique, the Tagify discipline ought to be centered
  • in case the options DropDown is positioned contained in the tagify.DOM.scope node, it shouldn’t inherit its line-height fashion
  • dropdown.appendTarget setting can now be a operate as nicely, which ought to return a DOM node
  • repair – calling addEmptyTag() with dropdown.enabled: 0 setting ought to create an empty tag with a dropdown of options 

v4.18.3 (2024-01-18)

  • Bugfixed
  • Do not cover dropdown throughout whitelist fetch
  • re-expose placeCaretAfterNode which was disregarded after previous refactoing. devs ought to have entry to this technique
  • Cease logging enter keystrokes

v4.18.2 (2024-01-12)

v4.18.1 (2024-01-08)

v4.18.0 (2024-01-05)

  • Added escapeHTML dropdown setting which optionally permits HTML to be rendered inside the worth of every suggestion merchandise
  • The positioning code now takes into concerns the RTL dropdown setting which rendered the options dropdown as if it sticks to the suitable aspect of the Tagify.
  • Added conditional class identify tagify__dropdown–RTL to the dropdown wrapper
  • added cx helper operate for working with advanced class names
  • Added –tagify-dd-item-pad world CSS description
  • Changed margins at a number of locations with logical margins, for RTL help
  • Added –tagify-dd-max-height as world variable for a better management over it – Added RTL help for the options dropdown, but it surely solely is smart if the max-width of the dropdown is ready to none or some other worth better than the Tagify width
  • Re-instated minification for the jQuery-wrapper output file
  • Random minor CSS refactor

v4.17.9 (2023-08-20)

v4.17.8 (2023-04-13)

v4.17.7 (2023-01-17)

v4.17.5 (2022-12-04)

  • adjustments React file from js to jsx
  • mix-mode is best initialized by default with dropdown.place as textual content
  • bugfixes

v4.17.4 (2022-11-20)

v4.17.3 (2022-11-18)

v4.17.2 (2022-11-16)

v4.17.1 (2022-11-16)

  • eliminated exports from package deal.json because it appeared to have prompted issues with importing the package deal because of misconfiguration. Will work on that extra. 
  • moved tagData from the prototype to the “helpers” file, and renamed it getSetTagData

v4.17.0 (2022-11-13)

v4.16.4 (2022-09-04)

v4.16.3 (2022-09-01)

v4.16.2 (2022-08-20)

v4.16.0 (2022-08-15)

v4.15.4 (2022-08-14)

  • Bugfixed
  • Renamed originalEvent to occasion in a number of occasions – eliminated cloneEvent in EventDispatcher.js because it was already outlined apparently in tagify.js

v4.15.3 (2022-08-06)

v4.15.2 (2022-07-31)

v4.15.1 (2022-07-31)

v4.15.0 (2022-07-30)

  • added help for sending the unique occasion to the “set off” occasions technique
  • added help for transitioning-out the chosen suggestion merchandise
  • when eradicating all tags, the dropdown ought to re-filter, as a result of that motion might need been triggered from contained in the dropdown, and it’d nonetheless be open
  • added dropdown variables to knobs within the examples web page
  • refactored users-list CSS instance to make use of –tagify-dd-item-pad variable as an alternative of hard-coded property setter
  • minor enhancements to the horizontal tags hidden transition
  • connect a customized property __tagify“ reference to the Tagify occasion on the unique enter and is now returning that occasion if the identical unique enter is re-tagified (for some purpose)
  • chore – added README data for some new CSS variables + ones which weren’t talked about earlier than relating to the options dropdown
  • fixes – underlying Tagify shoud not get centered when choosing a suggestion from a Tagify sugegstion dropdown which is rendered over it.
  • fixes – don’t create tags from invalid enter. Added the brand new createInvalidTags setting
  • fixes – add a simple was to set tags border-radius utilizing CSS variables

v4.14.1 (2022-07-26)

v4.14.0 (2022-07-21)

  • improved the explenation for the Tags with properties part within the examples web page
  • fastened bugs

v4.13.3 (2022-07-14)

v4.13.2 (2022-07-12)

  • Mounted flawed duplicate tag with capital letter

v4.13.1 (2022-07-10)

  • added the this occasion scope because the second parameter to the tag template react

v4.13.0 (2022-07-10)

  • Filter solely the dropdown-item components (not header/footer/customized ones) when shifting with up/down arrows
  • Refactored and stuck the escape situation when enhancing tags, so the unique tag is now being changed again appropriately
  • Modified “__originalHTML” to level to a cloned ingredient as an alternative of innerHTML, so when urgent escape, it will likely be changed again to that, as-is
  • Fixes – Chosen tag disappears after the enter loses focus when in choose mode. 
  • Replace templates.js 
  • Replace tagify.take a look at.js
  • Improved users-list demo
  • Added operate remark
  • Added some new strategies
  • Refactored editTag technique and added 3 new strategies: editTagChangeDetected, getTagTextNode & setTagTextNode
  • Fixes – add lacking css shade variable to the instructed textual content
  • Talked about extra templates not too long ago added 
  • Fixes – Tag does not get added on choosing worth from customized template dropdownItemNoMatch
  • Mounted typo
  • Mounted some typos and added async validation instance
  • Fixes – clicking an uneditable tag when the editTags settings is ready to clicks: 1 provides focus to the Tagify discipline which can’t be unfocused by clicking exterior
  • Eliminated data-editable attribute for tags completed in earlier commit. higher its added by the developer and never mechanically by Tagify
  • Refactored. eliminated all CSS variables fallbacks to SCSS variables as a result of they have already got fallbacks…
  • Added “data-editable” for tags (default is undefined which suggests “true”) 
  • Eliminated unneeded left-trim as a result of the the returned worth is already trimmed 
  • Up to date eslintrc file
  • Eliminated unused package deal gulp-eslint
  • Up to date eslintrc file
  • Fixes – help originalInputValueFormat setting in mix-mode
  • Mounted some mix-mode points with new line earlier than/after tags in FF/Chrome. Nonetheless a bug for brand new line earlier than a tag in FF causes double BRs
  • Mounted placeCaretAfterNode after final change within the operate
  • Fixes – Modifying a tag, means that you can have duplicated tags (case insenstitve)
  • Eliminated the repair completed for #653 because it appears fastened in Chrome
  • Fixes – injecting a tag node utilizing injectAtCaret with out prior focus ends in an error
  • Repair Modified order of if clauses in iterateChildren operate
  • Fixing typo

v4.12.0 (2022-04-26)

  • enhancing present legitimate tag by including areas earlier than or after, shouldn’t have an effect on validation, until the trim setting is fake
  • fastened – transformTag setting could make a tag invalid when enhancing
  • uncovered the helpers for outdoor utilization
  • added a remark 381ee1d
  • fastened – dropdownFooter reveals “Refine your search” when maxItems = 0 (which reveals all objects)

v4.11.0 (2022-04-11)

  • improved the instance for the users-list. it now makes use of the brand new dropdown header template as an alternative of the hacky method it used to work 
  • cease including a tag when blured in select-mode – when typing a tag and blurring, if the typed textual content shouldn’t be included within the whitelist, it will likely be cleared
  • don’t render the dropdown header template if there’s nothing in it
  • added 2 new templates for dropdown header & footer
  • fixes – keyboard shortcut for daring and italic intervene with mix-mode output
  • for “choose” mode – if textual content worth shouldn’t be within the whitelist, clear it as soon as the enter is blured
  • fixes – Tagify can change a tag worth to its tagTextProp below mysterious circumstances
  • fixes – destroy() technique throws DOM not outlined exception

v4.10.0 (2022-04-06)

  • now identical kinds as utilized for “readonly” will even apply to “disabled”, primarily so the X button won’t be rendered
  • bugfixes

v4.9.8 (2022-02-18)

  • eliminated unneeded line after current change which moved this to a different onEditDone
  • fastened plenty of bugs

v4.9.7 (2022-02-14)

  • fastened: “strim” setting has no have an effect on on “loadOriginalValues” when in mix-mode

v4.9.6 (2022-02-07)

  • minor syntax and feedback adjustments
  • added “assist with one thing” concern templates
  • fixes – Unable to edit tags once they reached to maxTags
  • fixes – make the striped background on readonly an opt-out function
  • re-ordered classNames
  • added “readonly” to have the ability to be configured from the settings and never solely as an attribute on the unique enter
  • fixes – dropdown.enabled:false has no impact
  • Repair typo

v4.9.5 (2022-01-25)

v4.9.2 (2021-11-28)

  • add callback moved to be triggered after DOM has been modified
  • tag is ready as readonly though tagData has key readonly:false

v4.9.1 (2021-11-20)

  • fastened: readonly tag could also be deleted in *mix-mode *

v4.9.0 (2021-11-14)

  • React: switched to utilizing the unminified Tagify for simpler debugging 
  • fixes – [feat] added ther means to persist knowledge on localstorage mechanically utilizing a singular id per-instance
  • no want to put loadOriginalValues inside a setTimeout as a result of it is mechanically fired from “observeOriginalInputValue”
  • fixes- Distribute non-minified code on NPM
  • fixes – Dropdown choice in edited tag with emptied worth fails
  • fixes – transfer transformTag callback to be referred to as earlier than valitation occurs
  • fixes – Enter is enabled in disabled mode
  • minor repair for some random console error
  • fixes – Placeholder textual content solely reveals when the web page first masses

v4.8.1 (2021-09-25)

v4.8.0 (2021-09-22)

  • Fixes numerous bugs relating to mix-mode backspace & ENTER each in Chrome & FF.

v4.7.2 (2021-08-23)

  • Bugfix: Further newlines added on double Enter

v4.7.1 (2021-08-22)

  • Added dropdown.toggle technique
  • Fixes a problem with “userInput” setting – when a tag is chosen the dropdown is closed bu the element nonetheless has focus so clicking it once more won’t re-open then dropdown. Should power enabled to 0 to unravel this.

v4.7.0 (2021-08-21)

  • fastened: mix-mode with tags, when caret on the finish and pessing Delete a number of occasions, tags shouldn’t be eliminated
  • fastened: mix-mode with easy whitelist & “dropdown.enabled = 0” setting couldn’t choose options after solely typing the sample
  • fastened: added “userInput” setting (“true” by default) which permits typing/pasting/enhancing tags
  • up to date Codepen CSS for toggling unique enter visibility
  • fastened: eliminated IE help
  • fastened: when permitting duplicates, duplicates will not be matched with the filtered whitelist
  • fastened: permits Choose mode to not be editable if “enforceWhitelist” setting is ready, and in addition permits backspace to take away chosen tag
  • select-mode with “enforceWhitelist” setting shouldn’t be editable
  • improved “superior choices” instance so a single click on will change to a random tag shade

v4.6.0 (2021-07-29)

  • Add mechanism to unbind all world occasion listeners of an occasion
  • Refactored “texts” for simpler customization from “settings”
  • Mounted bugs.

v4.5.0 (2021-07-14)

  • Briefly present knobs earlier than closing it
  • Improved the “straightforward to customise” part within the demo web page with hyperlink to CSS variables
  • fastened lacking components in code examples syntax highlighter within the demo web page
  • R efactored code for higher supporting React parts as templates

v4.4.0 (2021-07-04)

v4.3.1 (2021-06-16)

  • Minor bugfix for invalid edited tags’ title tooltip

v4.3.0 (2021-06-13)

  • fastened: backspace in ‘combine’ mode with a number of strains Earlier strains are being hidden and faraway from the textual content space
  • [chore] refactored dropdown strategies so they would not want binding with “bind” or “name”
  • [feature] added “whitelist” getter and setter straight on the occasion
  • fastened tags validation when edited/eliminated
  • improved “isSameDeep” to not stringify if already is a string
  • refactored “defaultValue” logic associated to “worth” adjustments
  • small basic refactor for all occasions binding

v4.2.0 (2021-06-07)

v4.1.4 (2021-05-31)

  • restored lacking header remark in minified recordsdata
  • options dropdown checklist now has scrollbar proven by default and no solely on hover, for contact display screen points the place “hover” can’t be utilized
  • fastened: revalidate max tags after tags are eliminated

v4.1.3 (2021-05-24)

  • fixes – onInput occasion is fired too early, earlier than a tag was added, so “tagify.worth” shouldn’t be up-to-date
  • fixes – Re-validation on edit/delete tags

v4.1.2 (2021-05-16)

  • fastened: retain invalid tags (together with from web page load) however shade them crimson

v4.1.1 (2021-04-25)

  • [feat] when “a11y.focusableTags” setting is true, permits enhancing tags by urgent “enter” key

v4.1.0 (2021-04-25)

v4.0.5 (2021-04-16)

  • fastened: combine mode now help loading animation
  • improved “combine mode” part with settings instance
  • cleaned undesirable props additionally in mix-mode when updating unique discipline’s worth

v4.0.4 (2021-04-11)

  • fastened: apparently with out the setTimeout, if one other Tagify was “below” the chosen suggestion, it’s going to achieve focus 46ad4e5
  • fastened: added __tagId property to every knowledge merchandise on the this.worth and in addition on the tag components themselves, in order that they may very well be matched to the proper merchandise within the this.worth

v4.0.3 (2021-04-06)

  • added dropdown:up to date help within the React Wrapper

v4.0.2 (2021-04-05)

  • fastened: modified the propTypes for “youngsters” within the React Wrapper
  • fastened: added all lacking customized occasion listeners to the React wrapper
  • fastened: React wrapper now exports MixedTags appropriately

v4.0.1 (2021-04-03)

  • fixesed: up to date addTags to make use of DOM fragment for higher efficiency when including tons of tags at-once (copy=paste)
  • improved filtering options for “choose” mode: if a tag was chosen, don’t filter by worth till the tag is erased or was edited. if tag is edited so all characters eliminated, then the sector blured – the tag is now eliminated. Additionally when enhancing the textual content and bluring, the tag is up to date.
  • improved demo for “choose” mode
  • makes extra sense to make use of “auto” for the reason that X button ought to be to the suitable (in LTR)
  • fixesed: Cannot make tagTextProp work when mode choose is ready

v4.0 (2021-03-30)

  • improved controlled-component means by higher evaluating between present worth and new worth
  • modified how the unique enter is un-hidden
  • fastened: Browser reveals console error when submitting a type with a “required” tagified enter ingredient which is empty

v3.25.0 (2021-03-30)

  • improved controlled-component means by higher evaluating between present worth and new worth
  • modified how the unique enter is un-hidden
  • fixes: Browser reveals console error when submitting a type with a “required” tagified enter ingredient which is empty

v3.25.0 (2021-03-29)

  • fastened: Earlier tag is deleted when rapidly urgent backspace and typing new textual content
  • fastened: added “suggestionClick” hook to the “enter” key down occasion, whereas sending the tag’s knowledge to the hook’s operate
  • fastened: added deep examine to the React wrapper when the “worth” adjustments (AKA “managed”)
  • fastened: in “choose” mode, when choosing an choice, the dropdown will now not present any of the opposite choices

v3.23.1 (2021-03-08)

  • fastened: line-height clipped sure fonts glyphs
  • fastened: Technique removeAllTags ignores the handed choice withoutChangeEvent
  • fastened:  tag someplace in the course of textarea after which put cursor to the tip and press “DEL” then tag can be deleted
  • fastened: Caret stretch to full dad or mum top in contenteditable inline with inline first little one ingredient

v3.22.3 (2021-02-26)

  • fixes when typing and bluring the textual content shouldn’t be changing into crimson after which deletced after some time (if whilist is objects and enforceWhitelist is true)
  • [FEAT] power dropdown to all the time open (be positioned) above or beneath the enter
  • eliminated Angular port from repo and linked to a devoted repo made by one other developer
  • fixes “navigator” not accessible in SSR
  • [CHORE] up to date dependencies

v3.22.3 (2021-02-14)

  • fastened: when enhancing a tag, the “edit:beforeUpdate” shouldn’t deep-clone the information, so the developer may modify it on the occasion callback whether it is wished to take away/add different properties to the edited tag earlier than the tag is changed, subsequently added a 3rd choice to the “set off” occasion technique
  • fastened: when enhancing a tag which has different properties than “worth” they need to be persevered after enhancing
  • Added a lacking customized occasion
  • fastened: Can’t learn property ‘withoutChangeEvent’ of undefined
  • fastened: typo 

v3.22.2 (2021-02-14)

  • when filtering dropdown objects, in case whitelist objects don’t comprise any of the customized “mapValueTo” array strings, then use worth as an alternative 
  • repair for whitelist of numbers a(not strings)
  • fixes When utilizing objects with “mapValueTo”, typing tab to insert tag inserts worth
  • fixes Unable to insert tag containing “<x>” with tab key
  • fixes dropdown border backside in chrome
  • fixes Clicking on The Drop-Down Scroll Closes the Dropdown 
  • help for a number of class names in settings.classNames properties
  • fixes loadOriginalValues triggers a number of change occasion
  • fixes final ingredient stays in dropdown (when dropdown.place is “guide”) 

v3.22.1 (2021-01-18)

  • [FEAT] add choose & combine namespace classnames to the settings.classNames object
  • [BUGFIX] TAB key does nothing in single-value mode with textual content entered
  • [BUGFIX] Can’t learn property ‘insertBefore’ of null
  • [BUGFIX] when utilizing “tagTextProp” setting, and typing a tag, with out a whitelist, “worth” property is ready to “undefined”

v3.22.0 (2020-12-27)

  • [FEAT] Programmatically including tags in mix-mode
  • In Combine mode, newly created tags are deleted when urgent backspace at first of textbox
  • [CHORE] added an merchandise to the FAQ checklist after any individual requested a query
  • [BUGFIX] autofocus React Part
  • [BUGFIX] [React – Mixed mode] take away tag after beginning in read-only
  • [BUGFIX] Setting non-default mixTagsInterpolator fails to parse out tags
  • [BUGFIX] Programmatically including tags in mix-mode throws an error
  • [BUGFIX] Verify native help for guarantees in polyfill
  • add “np” package deal to streamline publishing 0d1a8cd
  • demo web page minor adjustments to go tag youngsters
  • [BUGFIX] if “dropdownItemNoMatch” template is used, and the merchandise is clicked, the dropdown will not shut even when clicked exterior afterwards
  • Changed demo settings with Knobs – modified H2 titles shade to match the emblem shade
  • [BUGFIX] relating to mix-mode customized whitelist textual content prop (not “worth”)
  • [BUGFIX] mix-mode fixes for advanced whiteilst the place values are ids and one other property is used because the textual content of the tags/options
  • [BUGFIX] – minor repair associated to “sameStr” helper operate
  • [BUGFIX] [Chrome Android] can’t delete mix-mode tags utilizing the keyboard “backspace” key
  • [BUGFIX] If tag worth ends with area whitelist not working
  • added new “validate” operate to settings, for extra advanced validations which sample can’t resolve
  • [BUGFIX] When utilizing dropdown.mapValueTo choice the unique whitelist knowledge construction adjustments

v3.21.3 (2020-11-23)

  • [BUGFIX] if “dropdownItemNoMatch” template is used, and the merchandise is clicked, the dropdown will not shut even when clicked exterior afterwards

v3.21.3 (2020-11-11)

  • made “this.trim” error-proof for “undefined” values

v3.21.0 (2020-11-06)

  • when enhancing, on blur, add an additional parameter to “transformTag” with the preivous knowledge object

v3.20.3 (2020-10-25)

  • fastened can’t create mix-text tags

v3.20.2 (2020-10-25)

  • fastened mix-mode readonly didn’t cover tags (x) button

v3.20.1 (2020-10-24)

  • fastened a TON of mix-mode delete/backspace points, many with readonly-tags
  • eliminated empty textnodes inside tag template, which affected caret placement at some conditions
  • added “removeTextChildNodes” & “getfirstTextNode” helpers
  • fastened a problem with restoring a number of readonly tags which had been deleted by the browser (range-selection)

v3.20.0 (2020-10-08)

v3.19.7 (2020-10-06)

  • Mounted edited tag with customized template to have the ability to revert again

v3.19.5 (2020-10-05)

  • pasting textual content in non-empty enter ought to use all textual content and never simply the pasted half

v3.19.4 (2020-10-01)

  • “onEditTagBlur” ought to preserve any pre-defined properties of the tag’s knowledge

v3.19.2 (2020-09-28)

  • fastened: whitelist objects with commas ought to’t be splitted to seperate tags

v3.19.1 (2020-09-26)

  • fastened: Combined mode – Backspace concern

v3.19.0 (2020-09-22)

  • added “built-in” mode which skips the creation of the wrapper

v3.18.1 (2020-09-06)

  • Mounted JS error when coming into particular characters
  • Mounted: Make the tag search work with key phrases, fairly than a steady string

v3.17.10 (2020-09-06)

  • fuzzy-search refactored utilizing Regex

v3.17.10 (2020-08-29)

  • Mounted: when the dropdown is seen, with no merchandise chosen, and “tab” key’s pressed & whitelist has objects, the primary one is added.

v3.17.9 (2020-08-28)

v3.17.3 (2020-08-11)

  • Mounted: Modifying tags with dropdown enabled shouldn’t be saving the brand new worth

v3.17.2 (2020-08-09)

v3.17.1 (2020-08-06)

v3.16.3 (2020-07-29)

  • Mounted: Each tag entered provides &nbsp;

v3.16.2 (2020-07-28)

v3.15.4 (2020-07-20)

  • dropdown place is now an attribute by itself and never part of the category identify
  • dropdown place defaults to “all” if the viewport width is much less, or equal, to 480px

v3.15.3 (2020-07-15)

  • Mounted Tagify suggests undefined

v3.15.1 (2020-07-14)

  • modified “dropdownItemNoMatch” template prop to be an Object as an alternative of a String

v3.14.3 (2020-07-09)

  • Mounted: Routinely shut dropdown shouldn’t be working

v3.14.2 (2020-07-07)

v3.13.0 (2020-07-03)

v3.12.0 (2020-06-28)

  • Enable whitelist objects to have a `worth` kind `Quantity` 

v3.11.3 (2020-06-22)

v3.11.2 (2020-06-21)

  • Mounted onChange shouldn’t be referred to as when clearing the final tag

v3.11.0 (2020-06-13)

  • Add motion button in options dropdown objects

v3.10.2 (2020-06-02)

  • Allowed putting action-buttons contained in the “dropdownItem” template so something with a category “tagify__dropdown__item__action” can be ignored when clicking, and won’t choose that suggestion (however will set off a “blur” occasion which is able to shut the options dropdown)

v3.9.2 (2020-05-19)

  • Mounted: Combine textual content & tags – error when add a tag after deleted one other one – IndexSizeError

v3.9.1 (2020-05-17)

v3.8.0 (2020-05-09)

  • Mounted flawed worth when paste the textual content in to enter (Combine-mode)

v3.7.3 (2020-05-02)

v3.7.2 (2020-04-28)

  • Mounted Combined Mode – Tags are in flawed order

v3.7.1 (2020-04-26)

  • eliminated ARIA attributes from element wrapper ingredient

v3.6.10 (2020-04-06)

v3.6.6 (2020-04-04)

v3.6.3 (2020-03-18)

v3.6.1 (2020-03-05)

v3.5.1 (2020-02-26)

v3.4.1 (2020-02-08)

v3.3.1 (2020-02-05)

v3.3.0 (2020-01-26)

v3.2.6 (2020-01-07)

v3.2.3 (2019-12-23)

  • Improper worth after edit/replace a tag

v3.2.2 (2019-12-21)

v3.2.0 (2019-12-19)

v3.0.0 (2019-12-13)

v2.31.6 (2019-11-21)

v2.31.4 (2019-11-16)

  • Mounted Callback when eradicating a tag with backspace

v2.31.3 (2019-11-04)

  • Mounted Callback when eradicating a tag with backspace

v2.31.2 (2019-10-14)

v2.31.1 (2019-10-14)

  • Combine Mode Cursor Place on making an attempt to delete a Tag utilizing Backspace key.

v2.29.1 (2019-10-07)

  • Don’t normalize enter worth in “blended” mode, to permit full management over the textarea to the developer, if anybody needs their customers to have the ability to do something inside the textarea or to regulate it exterior of tagify.

v2.29.0 (2019-09-24)

v2.28.2 (2019-09-14)

v2.28.0 (2019-09-12)

v2.26.3 (2019-09-02)

  • Mounted: Empty tag (through enhancing) *is* invalid, however stays, even with `keepInvalidTags: false`

v2.26.2 (2019-08-31)

  • Mounted: Safari (11.1.2): Cannot edit tags (consists of proposed repair)

v2.26.1 (2019-08-31)

  • Cleanup annoying “[addTags] no tags so as to add: Array []” console warning

v2.26.0 (2019-08-29)

  • Mounted Syntax error in React wrapper compilation

v2.25.3 (2019-08-28)

  • bugfix: when clicking wherever on the display screen there was an error within the console

v2.25.2 (2019-08-24)

  • Mounted: battle “RENDER SUGGESTIONS LIST MANUALLY” Property with “TEXTAREA”
  • Mounted: Pasted textual content separated with new line image does not course of right

v2.24.0 (2019-08-18)

  • Take away “hasMaxTags” class when restrict shouldn’t be reached anymore

v2.23.1 (2019-07-30)

  • Take away “hasMaxTags” class when restrict shouldn’t be reached anymore

v2.22.3 (2019-06-19)

  • Mounted Urgent Enter whereas Suggestion Checklist is open

v2.22.2 (2019-06-16)

v2.22.1 (2019-06-06)

  • “removeTag” with out an argument now removes final tag mechanically
  • fastened Enter worth despatched modified 

v2.21.0 (2019-05-29)

v2.19.0 (2019-05-15)

v2.19.0 (2019-05-15)

v2.18.2 (2019-05-02)

v2.18.1 (2019-04-27)

  • minor insignificant adjustments in code

v2.17.0 (2019-04-14)

  • fastened a minor bug from earlier commit

v2.16.0 (2019-04-11)

  • Mounted: Incorrect interplay between enabled and maxItems for dropdown

v2.15.2 (2019-04-06)

  • Repair exception when enter preliminary worth is an empty json checklist

v2.15.1 (2019-03-26)

  • fixes dropdown mouse click on to scroll
  • fixes whitelist of strings options checklist HTML
  • fixes focus after clicking a suggestion merchandise with the mouse
  • added “searchBy” property help for whitelist alias filtering

v2.15.0 (2019-03-27)

v2.14.0 (2019-02-27)

  • fastened removeTag shouldn’t be working.

v2.13.0 (2019-02-26)

  • Deleting (backspacing) present tag enter to the tip, makes subsequent enter become tag instantly

v2.12.6 (2019-02-24)

v2.12.1 (2019-02-15)

  • Add duplicates in combine mode if duplicates setting false.

v2.11.1 (2019-01-27)

  • Add duplicates in combine mode if duplicates setting false.
  • Mounted placeholder doesn’t replace when altering dropdown energetic merchandise utilizing down arrow

v2.10.1 (2019-01-03)

  • Make blacklist works case-insensitive

v2.9.7 (2018-12-30)

  • Mounted Error when clicking exterior of dropdown 

v2.9.1 (2018-12-17)

  • Modified the “enter” occasion parameter to be a string (worth) as an alternative of an Object {worth:worth}

v2.9.0 (2018-12-16)

  • added customized “click on” occasion

v2.8.6 (2018-12-14)

v2.8.5 (2018-12-10)

  • minor repair for editable tags blur occasion not working property

v2.8.4 (2018-12-09)

  • fastened: edit tag not operating tag validation

v2.8.2 (2018-11-18)

  • Mounted a problem whereas pre-populating an distinctive numeric tag

v2.7.6 (2018-11-18)

v2.6.5 (2018-11-03)

  • Mounted: Duplicates tag in Web Explorer if tag has “@” image and delimiter is area bar.

v2.6.3 (2018-10-27)

  • “enter” occasion wasn’t triggered within the optimum place. ought to be triggered after this.enter.set
  • “filterListItems” technique shouldn’t strip whitespaces

v2.6.0 (2018-10-12)

v2.5.1 (2018-10-06)

v2.2.10 (2018-09-24)

v2.1.9 (2018-09-08)

v2.1.4 (2018-08-18)

  • Tiny bug repair in “normalizeTags” the place Tagify situations with advanced whitelist did not permit coming into some other tags besides the whitelist’s ones

v2.1.1 (2018-08-12)

  • You may add Tags within the readonly mode

v2.1.0 (2018-07-08)

2018-06-24

  • Mounted for key/worth tags

2018-03-28


This superior jQuery plugin is developed by yairEO. For extra Superior Usages, please examine the demo web page or go to the official web site.

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments