Implemented Chips Component
parent
42c3b9d0a5
commit
84bc9b7759
|
@ -9,6 +9,7 @@
|
|||
<div :class="{'submenuhide': activeMenuIndex !== 0, 'submenushow': activeMenuIndex === 0}">
|
||||
<div>
|
||||
<router-link to="/checkbox">● Checkbox</router-link>
|
||||
<router-link to="/chips">● Chips</router-link>
|
||||
<router-link to="/inputswitch">● InputSwitch</router-link>
|
||||
<router-link to="/inputtext">● InputText</router-link>
|
||||
<router-link to="/listbox">● Listbox</router-link>
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
@import '../../components/button/Button.css';
|
||||
@import '../../components/card/Card.css';
|
||||
@import '../../components/checkbox/Checkbox.css';
|
||||
@import '../../components/chips/Chips.css';
|
||||
@import '../../components/fieldset/Fieldset.css';
|
||||
@import '../../components/inputtext/InputText.css';
|
||||
@import '../../components/inputswitch/InputSwitch.css';
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
.p-chips > ul.p-inputtext {
|
||||
clear: left;
|
||||
cursor: text;
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
padding: 0 .25em;
|
||||
}
|
||||
|
||||
.p-chips-token {
|
||||
cursor: default;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
overflow: hidden;
|
||||
padding: .125em .5em;
|
||||
white-space: nowrap;
|
||||
position: relative;
|
||||
margin-right: .125em;
|
||||
border: 0 none;
|
||||
font-size: .9em;
|
||||
}
|
||||
|
||||
.p-chips-token .p-chips-token-label {
|
||||
display: block;
|
||||
margin-right: 2em;
|
||||
}
|
||||
|
||||
.p-chips > .p-disabled .p-chips-token-label {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.p-chips-token .p-chips-token-icon {
|
||||
margin-top: -.5em;
|
||||
position: absolute;
|
||||
right: 0.2em;
|
||||
top: 50%;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.p-chips-input-token {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
list-style-type: none;
|
||||
margin: 0 0 0 .125em;
|
||||
padding: .25em .25em .25em 0;
|
||||
}
|
||||
|
||||
.p-chips-input-token .p-inputtext {
|
||||
border: 0 none;
|
||||
width: 10em;
|
||||
outline: medium none;
|
||||
background-color: transparent;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-shadow: none;
|
||||
-moz-border-radius: 0;
|
||||
-webkit-border-radius: 0;
|
||||
border-radius: 0;
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
<template>
|
||||
<div class="p-chips p-component">
|
||||
<ul :class="['p-inputtext', {'p-disabled': disabled, 'p-focus': focused}]" @click="onWrapperClick($event)">
|
||||
<li v-for="(val,i) of value" :key="val" class="p-chips-token p-highlight">
|
||||
<slot :value="val">
|
||||
<span class="p-chips-token-icon pi pi-fw pi-times" @click="removeItem($event, i)"></span>
|
||||
<span class="p-chips-token-label">{{val}}</span>
|
||||
</slot>
|
||||
</li>
|
||||
<li class="p-chips-input-token">
|
||||
<input ref="input" type="text" class="p-inputtext p-component" @focus="onFocus($event)" @blur="onBlur($event)" @keydown="onKeyDown($event)" :disabled="disabled || maxedOut">
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
value: Array,
|
||||
disabled: Boolean,
|
||||
max: Number
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
focused: false
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
onWrapperClick(event) {
|
||||
this.$refs.input.focus();
|
||||
},
|
||||
onFocus(event) {
|
||||
this.focused = true;
|
||||
this.$emit('focus', event);
|
||||
},
|
||||
onBlur() {
|
||||
this.focused = false;
|
||||
this.$emit('blur', event);
|
||||
},
|
||||
onKeyDown(event) {
|
||||
const inputValue = event.target.value;
|
||||
|
||||
switch(event.which) {
|
||||
//backspace
|
||||
case 8:
|
||||
if (inputValue.length === 0 && this.value && this.value.length > 0) {
|
||||
this.removeItem(event, this.value.length - 1);
|
||||
}
|
||||
break;
|
||||
|
||||
//enter
|
||||
case 13:
|
||||
if (inputValue && inputValue.trim().length && (!this.max || this.max > this.value.length)) {
|
||||
let values = this.value ? [...this.value]: [];
|
||||
values.push(inputValue);
|
||||
this.$emit('input', values);
|
||||
this.$emit('add', {
|
||||
originalEvent: event,
|
||||
value: values
|
||||
});
|
||||
}
|
||||
|
||||
this.$refs.input.value = '';
|
||||
event.preventDefault();
|
||||
break;
|
||||
}
|
||||
},
|
||||
removeItem(event, index) {
|
||||
if (this.disabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
let values = [...this.value];
|
||||
const removedItem = values.splice(index, 1);
|
||||
this.$emit('input', values);
|
||||
this.$emit('remove', {
|
||||
originalEvent: event,
|
||||
value: removedItem
|
||||
});
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
maxedOut() {
|
||||
return this.max && this.value && this.max === this.value.length;
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
</style>
|
|
@ -6,6 +6,7 @@ import AccordionTab from './components/accordion/AccordionTab';
|
|||
import Button from './components/button/Button';
|
||||
import Card from './components/card/Card';
|
||||
import Checkbox from './components/checkbox/Checkbox';
|
||||
import Chips from './components/chips/Chips';
|
||||
import InputSwitch from './components/inputswitch/InputSwitch';
|
||||
import InputText from './components/inputtext/InputText';
|
||||
import Fieldset from './components/fieldset/Fieldset';
|
||||
|
@ -32,6 +33,7 @@ Vue.component('p-accordionTab', AccordionTab);
|
|||
Vue.component('p-button', Button);
|
||||
Vue.component('p-card', Card);
|
||||
Vue.component('p-checkbox', Checkbox);
|
||||
Vue.component('p-chips', Chips);
|
||||
Vue.component('p-inputSwitch', InputSwitch);
|
||||
Vue.component('p-inputtext', InputText);
|
||||
Vue.component('p-listbox', Listbox);
|
||||
|
|
|
@ -31,6 +31,11 @@ export default new Router({
|
|||
name: 'checkbox',
|
||||
component: () => import('./views/checkbox/CheckboxDemo.vue')
|
||||
},
|
||||
{
|
||||
path: '/chips',
|
||||
name: 'chips',
|
||||
component: () => import('./views/chips/ChipsDemo.vue')
|
||||
},
|
||||
{
|
||||
path: '/fieldset',
|
||||
name: 'fieldset',
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
<template>
|
||||
<div>
|
||||
<div class="content-section introduction">
|
||||
<div class="feature-intro">
|
||||
<h1>Chips</h1>
|
||||
<p>Chips is used to enter multiple values on an input field.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="content-section implementation">
|
||||
<h3 class="first">Basic</h3>
|
||||
<p-chips v-model="value1" />
|
||||
|
||||
<h3>Template</h3>
|
||||
<p-chips v-model="value2">
|
||||
<template slot-scope="{value}">
|
||||
<div>
|
||||
<span>{{value}} - (active) </span>
|
||||
<i class="pi pi-user-plus" style="font-size: 14px"></i>
|
||||
</div>
|
||||
</template>
|
||||
</p-chips>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
value1: null,
|
||||
value2: null
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.p-chips .p-inputtext {
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
|
@ -15,7 +15,7 @@
|
|||
<p-rating v-model="val2" :cancel="false" />
|
||||
|
||||
<h3>ReadOnly</h3>
|
||||
<p-rating :value="5" readonly={true} :stars="10" :cancel="false" />
|
||||
<p-rating :value="5" :readonly="true" :stars="10" :cancel="false" />
|
||||
|
||||
<h3>Disabled</h3>
|
||||
<p-rating :value="8" :disabled="true" :stars="10" />
|
||||
|
|
Loading…
Reference in New Issue