Skip to content

Commit

Permalink
Feature, limit props added
Browse files Browse the repository at this point in the history
  • Loading branch information
Gautam committed Mar 5, 2024
1 parent 8577536 commit cd7d4dc
Show file tree
Hide file tree
Showing 6 changed files with 168 additions and 30 deletions.
2 changes: 1 addition & 1 deletion dev/Dev.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<template>
<div id="app">
<v-select v-model="selected" v-bind="config" />
<v-select v-model="selected" v-bind="config"/>
</div>
</template>

Expand Down
51 changes: 51 additions & 0 deletions docs/.vuepress/components/SlotLimit.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<template>
<div>
<v-select
v-model="selected"
:options="books"
:limit="2"
multiple
label="title"
>
<template #option="{ title, author }">
<h3 style="margin: 0">{{ title }}</h3>
<em>{{ author.firstName }} {{ author.lastName }}</em>
</template>
<template #limit="{ length }">
<span>and {{ length }} more</span>
</template>
</v-select>
</div>
</template>
<script>
const books = [
{
title: "Old Man's War",
author: {
firstName: 'John',
lastName: 'Scalzi',
},
},
{
title: 'To Kill a Mockingbird',
author: {
firstName: 'Harper',
lastName: 'Lee',
},
},
{
title: 'The Great Gatsby',
author: {
firstName: 'F. Scott',
lastName: 'Fitzgerald',
},
},
]
export default {
data: () => ({
books: books,
selected: books,
}),
}
</script>
10 changes: 10 additions & 0 deletions docs/api/props.md
Original file line number Diff line number Diff line change
Expand Up @@ -605,3 +605,13 @@ value: {
default: null
},
```

## limit

It will limit the display of selected options. The rest will be hidden. only work when multiple selections are made.

```js
limit: {
default: 0
},
```
7 changes: 7 additions & 0 deletions docs/api/slots.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,4 +185,11 @@ or have fine grain control over the markup.
<SlotSpinner />
<<< @/.vuepress/components/SlotSpinner.vue

## `limit`

- `limit {Number}` - if the limit props is provided

<SlotLimit />
<<< @/.vuepress/components/SlotLimit.vue

</div>
119 changes: 90 additions & 29 deletions src/components/Select.vue
Original file line number Diff line number Diff line change
Expand Up @@ -16,36 +16,85 @@
@mousedown="toggleDropdown($event)"
>
<div ref="selectedOptions" class="vs__selected-options">
<slot
v-for="option in selectedValue"
name="selected-option-container"
:option="normalizeOptionForSlot(option)"
:deselect="deselect"
:multiple="multiple"
:disabled="disabled"
>
<span :key="getOptionKey(option)" class="vs__selected">
<slot
name="selected-option"
v-bind="normalizeOptionForSlot(option)"
>
{{ getOptionLabel(option) }}
</slot>
<button
v-if="multiple"
ref="deselectButtons"
:disabled="disabled"
type="button"
class="vs__deselect"
:title="`Deselect ${getOptionLabel(option)}`"
:aria-label="`Deselect ${getOptionLabel(option)}`"
@click="deselect(option)"
>
<component :is="childComponents.Deselect" />
</button>
</span>
</slot>
<template v-if="multiple">
<slot
v-for="option in selectedValue.slice(0, limit > 0 ? limit : selectedValue.length)"
name="selected-option-container"
:option="normalizeOptionForSlot(option)"
:deselect="deselect"
:multiple="multiple"
:disabled="disabled"
>
<span :key="getOptionKey(option)" class="vs__selected">
<slot
name="selected-option"
v-bind="normalizeOptionForSlot(option)"
>
{{ getOptionLabel(option) }}
</slot>
<button
v-if="multiple"
ref="deselectButtons"
:disabled="disabled"
type="button"
class="vs__deselect"
:title="`Deselect ${getOptionLabel(option)}`"
:aria-label="`Deselect ${getOptionLabel(option)}`"
@click="deselect(option)"
>
<component :is="childComponents.Deselect" />
</button>
</span>
</slot>

<template v-if="selectedValue.length > limit && limit > 0">
<span class="vs__limit-label">
<slot
v-if="$slots.limit"
name="limit"
:length="scope.limit.length"
>
<template #default="{ length }">
{{ selectedValue.length - length }} more
</template>
</slot>
<template v-else>
{{ selectedValue.length - limit }} more
</template>
</span>
</template>
</template>
<template v-else>
<slot
v-for="option in selectedValue"
name="selected-option-container"
:option="normalizeOptionForSlot(option)"
:deselect="deselect"
:multiple="multiple"
:disabled="disabled"
>
<span :key="getOptionKey(option)" class="vs__selected">
<slot
name="selected-option"
v-bind="normalizeOptionForSlot(option)"
>
{{ getOptionLabel(option) }}
</slot>
<button
v-if="multiple"
ref="deselectButtons"
:disabled="disabled"
type="button"
class="vs__deselect"
:title="`Deselect ${getOptionLabel(option)}`"
:aria-label="`Deselect ${getOptionLabel(option)}`"
@click="deselect(option)"
>
<component :is="childComponents.Deselect" />
</button>
</span>
</slot>
</template>
<slot name="search" v-bind="scope.search">
<input
class="vs__search"
Expand Down Expand Up @@ -668,6 +717,15 @@ export default {
type: [String, Number],
default: () => uniqueId(),
},
/**
* To limit the visibility with multiple options.
* @type {Number}
*/
limit: {
type: Number,
default: 0,
},
},
data() {
Expand Down Expand Up @@ -780,6 +838,9 @@ export default {
spinner: {
loading: this.mutableLoading,
},
limit: {
length: this.selectedValue.length,
},
noOptions: {
search: this.search,
loading: this.mutableLoading,
Expand Down
9 changes: 9 additions & 0 deletions src/css/modules/selected.css
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,12 @@
display: none;
}
}

.vs__limit-label {
display: flex;
align-items: center;
color: var(--vs-selected-color);
line-height: var(--vs-line-height);
padding: 0 0.25em;
z-index: 0;
}

0 comments on commit cd7d4dc

Please sign in to comment.