vuetify
Version:
Vue Material Component Framework
128 lines • 4.77 kB
JavaScript
import { mergeProps as _mergeProps, resolveDirective as _resolveDirective, createVNode as _createVNode, Fragment as _Fragment } from "vue";
// Components
import { VTreeviewGroup } from "./VTreeviewGroup.mjs";
import { VTreeviewItem } from "./VTreeviewItem.mjs";
import { VCheckboxBtn } from "../../components/VCheckbox/index.mjs"; // Composables
import { IconValue } from "../../composables/icons.mjs"; // Utilities
import { computed, shallowRef, toRaw, withModifiers } from 'vue';
import { genericComponent, propsFactory } from "../../util/index.mjs"; // Types
export const makeVTreeviewChildrenProps = propsFactory({
loadChildren: Function,
loadingIcon: {
type: String,
default: '$loading'
},
items: Array,
openOnClick: {
type: Boolean,
default: undefined
},
indeterminateIcon: {
type: IconValue,
default: '$checkboxIndeterminate'
},
falseIcon: IconValue,
trueIcon: IconValue,
returnObject: Boolean,
selectable: Boolean,
selectedColor: String,
selectStrategy: [String, Function, Object]
}, 'VTreeviewChildren');
export const VTreeviewChildren = genericComponent()({
name: 'VTreeviewChildren',
props: makeVTreeviewChildrenProps(),
setup(props, _ref) {
let {
emit,
slots
} = _ref;
const isLoading = shallowRef(null);
const isClickOnOpen = computed(() => props.openOnClick != null ? props.openOnClick : props.selectable);
function checkChildren(item) {
return new Promise(resolve => {
if (!props.items?.length || !props.loadChildren) return resolve();
if (item?.children?.length === 0) {
isLoading.value = item.value;
props.loadChildren(item).then(resolve);
return;
}
resolve();
}).finally(() => {
isLoading.value = null;
});
}
function selectItem(select, isSelected) {
if (props.selectable) {
select(!isSelected);
}
}
return () => slots.default?.() ?? props.items?.map(_ref2 => {
let {
children,
props: itemProps,
raw: item
} = _ref2;
const loading = isLoading.value === item.value;
const slotsWithItem = {
prepend: slotProps => _createVNode(_Fragment, null, [props.selectable && (!children || children && !['leaf', 'single-leaf'].includes(props.selectStrategy)) && _createVNode("div", null, [_createVNode(VCheckboxBtn, {
"key": item.value,
"modelValue": slotProps.isSelected,
"loading": loading,
"color": props.selectedColor,
"indeterminate": slotProps.isIndeterminate,
"indeterminateIcon": props.indeterminateIcon,
"falseIcon": props.falseIcon,
"trueIcon": props.trueIcon,
"onClick": withModifiers(() => selectItem(slotProps.select, slotProps.isSelected), ['stop']),
"onKeydown": e => {
if (!['Enter', 'Space'].includes(e.key)) return;
e.stopPropagation();
selectItem(slotProps.select, slotProps.isSelected);
}
}, null)]), slots.prepend?.({
...slotProps,
item
})]),
append: slots.append ? slotProps => slots.append?.({
...slotProps,
item
}) : undefined,
title: slots.title ? slotProps => slots.title?.({
...slotProps,
item
}) : undefined
};
const treeviewGroupProps = VTreeviewGroup.filterProps(itemProps);
const treeviewChildrenProps = VTreeviewChildren.filterProps(props);
return children ? _createVNode(VTreeviewGroup, _mergeProps(treeviewGroupProps, {
"value": props.returnObject ? item : treeviewGroupProps?.value
}), {
activator: _ref3 => {
let {
props: activatorProps
} = _ref3;
const listItemProps = {
...itemProps,
...activatorProps,
value: itemProps?.value,
onToggleExpand: activatorProps.onClick,
onClick: isClickOnOpen.value ? [() => checkChildren(item), activatorProps.onClick] : undefined
};
return _createVNode(VTreeviewItem, _mergeProps(listItemProps, {
"value": props.returnObject ? toRaw(item) : itemProps.value,
"loading": loading
}), slotsWithItem);
},
default: () => _createVNode(VTreeviewChildren, _mergeProps(treeviewChildrenProps, {
"items": children,
"returnObject": props.returnObject
}), slots)
}) : slots.item?.({
props: itemProps
}) ?? _createVNode(VTreeviewItem, _mergeProps(itemProps, {
"value": props.returnObject ? toRaw(item) : itemProps.value
}), slotsWithItem);
});
}
});
//# sourceMappingURL=VTreeviewChildren.mjs.map