Fixed #1239 - Add selectionLimit to MultiSelect

pull/1196/head^2
Cagatay Civici 2021-05-12 13:49:50 +03:00
parent 3ac89d0b9a
commit f9604c5d86
3 changed files with 33 additions and 3 deletions

View File

@ -25,6 +25,8 @@ interface MultiSelectProps {
emptyMessage?: string; emptyMessage?: string;
display?: string; display?: string;
panelClass?: string; panelClass?: string;
selectionLimit?: number;
showToggleAll?: boolean;
} }
declare class MultiSelect { declare class MultiSelect {

View File

@ -27,8 +27,8 @@
<transition name="p-connected-overlay" @enter="onOverlayEnter" @leave="onOverlayLeave" @after-leave="onOverlayAfterLeave"> <transition name="p-connected-overlay" @enter="onOverlayEnter" @leave="onOverlayLeave" @after-leave="onOverlayAfterLeave">
<div :ref="overlayRef" :class="panelStyleClass" v-if="overlayVisible" @click="onOverlayClick"> <div :ref="overlayRef" :class="panelStyleClass" v-if="overlayVisible" @click="onOverlayClick">
<slot name="header" :value="modelValue" :options="visibleOptions"></slot> <slot name="header" :value="modelValue" :options="visibleOptions"></slot>
<div class="p-multiselect-header"> <div class="p-multiselect-header" v-if="(showToggleAll && selectionLimit == null) || filter">
<div class="p-checkbox p-component" @click="onToggleAll" role="checkbox" :aria-checked="allSelected"> <div class="p-checkbox p-component" @click="onToggleAll" role="checkbox" :aria-checked="allSelected" v-if="showToggleAll && selectionLimit == null">
<div class="p-hidden-accessible"> <div class="p-hidden-accessible">
<input type="checkbox" readonly @focus="onHeaderCheckboxFocus" @blur="onHeaderCheckboxBlur"> <input type="checkbox" readonly @focus="onHeaderCheckboxFocus" @blur="onHeaderCheckboxBlur">
</div> </div>
@ -146,7 +146,15 @@ export default {
type: String, type: String,
default: 'comma' default: 'comma'
}, },
panelClass: null panelClass: null,
selectionLimit: {
type: Number,
default: null
},
showToggleAll: {
type: Boolean,
default: true
}
}, },
data() { data() {
return { return {
@ -194,6 +202,10 @@ export default {
return ObjectUtils.resolveFieldData(optionGroup, this.optionGroupChildren); return ObjectUtils.resolveFieldData(optionGroup, this.optionGroupChildren);
}, },
isOptionDisabled(option) { isOptionDisabled(option) {
if (this.maxSelectionLimitReached && !this.isSelected(option)) {
return true;
}
return this.optionDisabled ? ObjectUtils.resolveFieldData(option, this.optionDisabled) : false; return this.optionDisabled ? ObjectUtils.resolveFieldData(option, this.optionDisabled) : false;
}, },
isSelected(option) { isSelected(option) {
@ -616,6 +628,9 @@ export default {
}, },
appendTarget() { appendTarget() {
return this.appendDisabled ? null : this.appendTo; return this.appendDisabled ? null : this.appendTo;
},
maxSelectionLimitReached() {
return this.selectionLimit && (this.modelValue && this.modelValue.length === this.selectionLimit);
} }
}, },
directives: { directives: {
@ -729,6 +744,7 @@ export default {
flex-shrink: 0; flex-shrink: 0;
overflow: hidden; overflow: hidden;
position: relative; position: relative;
margin-left: auto;
} }
.p-fluid .p-multiselect { .p-fluid .p-multiselect {

View File

@ -277,6 +277,18 @@ export default {
<td>string</td> <td>string</td>
<td>null</td> <td>null</td>
<td>Style class of the overlay panel.</td> <td>Style class of the overlay panel.</td>
</tr>
<tr>
<td>selectionLimit</td>
<td>number</td>
<td>null</td>
<td>Maximum number of selectable items.</td>
</tr>
<tr>
<td>showToggleAll</td>
<td>boolean</td>
<td>true</td>
<td>Whether to show the header checkbox to toggle the selection of all items at once.</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>