dootask/resources/assets/js/pages/manage/components/ProjectTableGroupDropdown.vue
kuaifan 2ace89fce8 feat(project): 列表模式分组选择下拉显示各分组任务数
- 分组下拉每项右侧显示任务数,与分组标题旁数量一致,未勾选显示的分组同样计算
- 数量仅在下拉打开时计算,避免已逾期分组随每秒时间刷新持续重算
- 同步 ai-kb 列表视图说明
2026-10-01 01:31:51 +00:00

59 lines
2.0 KiB
Vue

<template>
<Dropdown
:visible="open"
@on-visible-change="open = $event"
:trigger="touch ? 'click' : 'hover'"
:placement="placement"
transfer
transfer-class-name="project-table-groups-dropdown">
<div
@keydown.enter.prevent="open = true"
@keydown.space.prevent="open = true"
@keydown.esc="open = false">
<slot/>
</div>
<div slot="list" class="project-table-group-options" @click.stop @keydown.esc="open = false">
<Checkbox
v-for="group in groups"
:key="group.key"
class="ivu-dropdown-item"
:class="{'ivu-dropdown-item-disabled': selected.length === 1 && selected.includes(group.key)}"
:value="selected.includes(group.key)"
:disabled="selected.length === 1 && selected.includes(group.key)"
:title="selected.length === 1 && selected.includes(group.key) ? $L('至少保留一项') : ''"
@on-change="$emit('change', group, $event)">
<span class="project-table-group-name">{{$L(group.title)}}</span>
<span v-if="counts" class="project-table-group-num">{{counts[group.key] || 0}}</span>
</Checkbox>
</div>
</Dropdown>
</template>
<script>
import {projectTableGroups} from "../../../utils/projectTableGroups";
export default {
name: 'ProjectTableGroupDropdown',
props: {
value: {type: Boolean, default: false},
touch: {type: Boolean, default: false},
selected: {type: Array, required: true},
counts: {type: Object, default: null},
placement: {type: String, default: 'bottom-start'},
},
computed: {
groups() {
return projectTableGroups;
},
open: {
get() {
return this.value;
},
set(value) {
this.$emit('input', value);
},
},
},
};
</script>