@voerro/vue-tagsinput
Version:
A simple tags input with typeahead made with Vue.js 2
395 lines (338 loc) • 16.3 kB
HTML
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=2.0, user-scalable=yes">
<title>@voerro/vue-tagsinput</title>
<link rel="stylesheet" href="dist/style.css">
<link rel="stylesheet" href="demo/css/bulma.min.css">
<style>
.mb-1 {
margin-bottom: 1rem;
}
.tags-input-root .typeahead-dropdown .row {
display: flex;
padding: .25rem 0;
}
.tags-input-root .typeahead-dropdown .row > .icon {
width: 3rem;
height: 3rem;
border-radius: 100%;
font-size: 1.5rem;
background: #ffffff;
color: #000000;
margin-right: 1rem;
}
.tags-input-root .typeahead-dropdown .row > .text {
flex: 1;
}
.tags-input-root .typeahead-dropdown .row > .text > .name {
font-weight: 600;
}
.tags-input-root .typeahead-dropdown .row > .text > .address {
font-size: .8rem;
}
</style>
</head>
<body>
<section class="hero is-info">
<div class="hero-body">
<div class="container">
<h1 class="title">@voerro/vue-tagsinput</h1>
<h2 class="subtitle">
Tags input for Vue.js 2 by
<a href="http://voerro.com">Voerro</a>
</h2>
</div>
</div>
</section>
<div id="voerro-tags-input-demo-vqk6etkfjrcpsjg5">
<div style="padding: 2rem;">
<div class="columns">
<div class="column is-3">
<h2 class="is-size-4" style="margin-bottom: 1rem;">
<a href="https://github.com/voerro/vue-tagsinput" target="_blank">Documentation</a>
</h2>
<h2 class="is-size-4" style="margin-bottom: 1rem;">Options</h2>
<div class="field">
<label class="label">Placeholder</label>
<div class="control">
<input class="input" type="text" v-model="placeholder">
</div>
</div>
<div class="field">
<label class="label">Limit</label>
<div class="control">
<input class="input" type="text" v-model="limit">
</div>
</div>
<div class="field">
<div class="control">
<label class="checkbox">
<input type="checkbox" v-model="hideInputOnLimit">
Hide Input on Limit
</label>
</div>
</div>
<div class="field">
<div class="control">
<label class="checkbox">
<input type="checkbox" v-model="typeahead"> Typeahead/autocomplete on
</label>
</div>
</div>
<div v-show="typeahead" class="field">
<div class="control">
<label class="checkbox">
<input type="checkbox" v-model="typeheadAlwaysShow">
Always show Typeahead
</label>
</div>
</div>
<div v-show="typeahead" class="field">
<div class="control">
<label class="checkbox">
<input type="checkbox" v-model="typeaheadShowOnFocus">
Show Typeahead on focus
</label>
</div>
</div>
<div v-show="typeahead" class="field">
<div class="control">
<label class="checkbox">
<input type="checkbox" v-model="typeaheadHideDiscard">
Hide 'Discard Search Results' button
</label>
</div>
</div>
<div v-show="typeahead" style="margin-bottom: 1rem;">
<div class="field">
<label class="label">Typeahead Style</label>
<div class="control">
<select class="input" type="text" v-model="typeaheadStyle">
<option value="badges">Badges</option>
<option value="dropdown">Dropdown</option>
</select>
</div>
</div>
<div class="field">
<label class="label">Typeahead Max Results</label>
<div class="control">
<input class="input" type="text" v-model="typeaheadMaxResults">
</div>
</div>
<div class="field">
<label class="label">Typeahead Activation Threshold</label>
<div class="control">
<input class="input" type="text" v-model="typeaheadActivationThreshold">
</div>
</div>
</div>
<div class="field">
<div class="control">
<label class="checkbox">
<input type="checkbox" v-model="onlyExistingTags">
Allow to add only existing tags
</label>
</div>
</div>
<div class="field">
<div class="control">
<label class="checkbox">
<input type="checkbox" v-model="caseSensitiveTags">
Tags are case sensitive
</label>
</div>
</div>
<div class="field">
<div class="control">
<label class="checkbox">
<input type="checkbox" v-model="deleteOnBackspace">
Delete on Backspace
</label>
</div>
</div>
<div class="field">
<div class="control">
<label class="checkbox">
<input type="checkbox" v-model="allowDuplicates">
Allow Duplicates
</label>
</div>
</div>
<div class="field">
<div class="control">
<label class="checkbox">
<input type="checkbox" v-model="addTagsOnComma">
Add Tags on Comma
</label>
</div>
</div>
<div class="field">
<div class="control">
<label class="checkbox">
<input type="checkbox" v-model="addTagsOnSpace">
Add Tags on Space
</label>
</div>
</div>
<div class="field">
<div class="control">
<label class="checkbox">
<input type="checkbox" v-model="addTagsOnBlur">
Add Tags on Blur
</label>
</div>
</div>
<div class="field">
<div class="control">
<label class="checkbox">
<input type="checkbox" v-model="logChangeEvents">
Log Change Events
</label>
</div>
</div>
</div>
<div class="column is-9">
<voerro-tags-input
v-model="selectedTags"
element-id="tags"
:existing-tags="[
{ key: 'children-of-bodom', value: 'Children of Bodom' },
{ key: 'epica', value: 'Epica' },
{ key: 'emperor', value: 'Emperor' },
{ key: 'shape-of-despair', value: 'Shape of Despair' },
{ key: 'protest-the-hero', value: 'Protest the Hero' },
{ key: 'my-dying-bride', value: 'My Dying Bride' },
{ key: 'ne-obliviscaris', value: 'Ne Obliviscaris' },
{ key: 'belakor', value: 'Be\'lakor' },
{ key: 'dark-lunacy', value: 'Dark Lunacy' },
{ key: 'dominia', value: 'Dominia' },
{ key: 'jason-becker', value: 'Jason Becker' },
{ key: 'jeff-loomis', value: 'Jeff Loomis' },
{ key: 'persefone', value: 'Persefone' },
]"
:typeahead="typeahead"
:typeahead-style="typeaheadStyle"
:typeahead-max-results="typeaheadMaxResults"
:typeahead-activation-threshold="typeaheadActivationThreshold"
:typeahead-always-show="typeheadAlwaysShow"
:typeahead-show-on-focus="typeaheadShowOnFocus"
:typeahead-hide-discard="typeaheadHideDiscard"
:placeholder="placeholder"
:limit="limit"
:only-existing-tags="onlyExistingTags"
:case-sensitive-tags="caseSensitiveTags"
:delete-on-backspace="deleteOnBackspace"
:allow-duplicates="allowDuplicates"
:add-tags-on-comma="addTagsOnComma"
:add-tags-on-space="addTagsOnSpace"
:add-tags-on-blur="addTagsOnBlur"
:hide-input-on-limit="hideInputOnLimit"
@initialized="onInitialized"
@tag-added="onTagAdded"
@tag-removed="onTagRemoved"
@tags-updated="onTagsUpdated"
@change="onChange"
discard-search-text="Add New Tag"
></voerro-tags-input>
<hr>
<h2 class="is-size-5">Selected tags (via v-model):</h2>
<p v-text="selectedTags"></p>
<h2 class="is-size-5" style="margin-top: 1rem;">Data Events (new at the top)</h2>
<pre v-text="eventLog"></pre>
<hr>
<h2 class="is-size-3 mb-1">Custom Display Field for the Dropdown</h2>
<p class="mb-1">
The `display-field` prop in action. You can provide any custom HTML for your dropdown rows and style them any way you want.
</p>
<voerro-tags-input
v-model="selectedTags2"
element-id="tags2"
:existing-tags="[
{ key: 'microsoft', value: 'Microsoft', display: '<div class=row><div class=icon>MS</div><div class=text><div class=name>Microsoft</div><div class=address>One Microsoft Way, Redmond, WA 98052-6399, USA</div></div></div>' },
{ key: 'google', value: 'Google', display: '<div class=row><div class=icon>GL</div><div class=text><div class=name>Google</div><div class=address>1600 Amphitheatre Parkway, Mountain View, California, USA</div></div></div>' },
{ key: 'facebook', value: 'Facebook', display: '<div class=row><div class=icon>FB</div><div class=text><div class=name>Facebook</div><div class=address>1 Hacker Way, Menlo Park, 94025, California, USA</div></div></div>' },
{ key: 'apple', value: 'Apple', display: '<div class=row><div class=icon>AP</div><div class=text><div class=name>Apple</div><div class=address>One Apple Park Way, Cupertino, California, USA</div></div></div>' },
]"
:typeahead="true"
typeahead-style="dropdown"
:typeahead-show-on-focus="true"
placeholder="Enter a company name"
:only-existing-tags="true"
:case-sensitive-tags="false"
display-field="display"
></voerro-tags-input>
</div>
</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.12/vue.min.js"></script>
<script src="dist/voerro-vue-tagsinput.js"></script>
<script>
new Vue({
el: '#voerro-tags-input-demo-vqk6etkfjrcpsjg5',
components: { VoerroTagsInput },
data: {
selectedTags: [
{
key: 'ne-obliviscaris',
value: 'Ne Obliviscaris'
},
{
key: 'epica',
value: 'Epica'
},
{
key: 'shape-of-despair',
value: 'Shape of Despair'
},
],
typeahead: true,
typeaheadStyle: 'badges',
placeholder: 'Customizable placeholder',
limit: 0,
onlyExistingTags: false,
caseSensitiveTags: false,
deleteOnBackspace: true,
allowDuplicates: false,
addTagsOnComma: false,
addTagsOnSpace: false,
addTagsOnBlur: false,
hideInputOnLimit: false,
typeaheadHideDiscard: false,
typeaheadMaxResults: 20,
typeaheadActivationThreshold: 1,
typeheadAlwaysShow: false,
typeaheadShowOnFocus: true,
logChangeEvents: false,
eventLog: '',
// Display fields demo
selectedTags2: [],
},
methods: {
logEvent(text) {
this.eventLog = text + this.eventLog;
},
onInitialized() {
this.logEvent('Initialized\n');
},
onTagAdded(tag) {
this.logEvent(`Tag added: "${JSON.stringify(tag)}"\n`);
},
onTagRemoved(tag) {
this.logEvent(`Tag removed: "${JSON.stringify(tag)}"\n`);
},
onTagsUpdated() {
this.logEvent('Tags updated\n');
},
onChange(evt) {
if (this.logChangeEvents) {
this.logEvent(`Changed ${JSON.stringify(evt)}\n`);
}
},
}
});
</script>
</body>
</html>