92 lines
3.6 KiB
JavaScript
92 lines
3.6 KiB
JavaScript
import { Fragment as _Fragment, createVNode as _createVNode, mergeProps as _mergeProps } from "vue";
|
|
// Styles
|
|
import "./VTreeviewItem.css";
|
|
|
|
// Components
|
|
import { VBtn } from "../../components/VBtn/index.mjs";
|
|
import { VListItemAction } from "../../components/VList/index.mjs";
|
|
import { makeVListItemProps, VListItem } from "../../components/VList/VListItem.mjs";
|
|
import { VProgressCircular } from "../../components/VProgressCircular/index.mjs"; // Composables
|
|
import { IconValue } from "../../composables/icons.mjs"; // Utilities
|
|
import { computed, inject, ref, toRaw } from 'vue';
|
|
import { genericComponent, omit, propsFactory, useRender } from "../../util/index.mjs"; // Types
|
|
import { VTreeviewSymbol } from "./shared.mjs";
|
|
export const makeVTreeviewItemProps = propsFactory({
|
|
loading: Boolean,
|
|
toggleIcon: IconValue,
|
|
...makeVListItemProps({
|
|
slim: true
|
|
})
|
|
}, 'VTreeviewItem');
|
|
export const VTreeviewItem = genericComponent()({
|
|
name: 'VTreeviewItem',
|
|
props: makeVTreeviewItemProps(),
|
|
emits: {
|
|
toggleExpand: value => true
|
|
},
|
|
setup(props, _ref) {
|
|
let {
|
|
slots,
|
|
emit
|
|
} = _ref;
|
|
const visibleIds = inject(VTreeviewSymbol, {
|
|
visibleIds: ref()
|
|
}).visibleIds;
|
|
const vListItemRef = ref();
|
|
const isActivatableGroupActivator = computed(() => vListItemRef.value?.root.activatable.value && vListItemRef.value?.isGroupActivator);
|
|
const vListItemRefIsClickable = computed(() => vListItemRef.value?.link.isClickable.value || props.value != null && !!vListItemRef.value?.list);
|
|
const isClickable = computed(() => !props.disabled && props.link !== false && (props.link || vListItemRefIsClickable.value || isActivatableGroupActivator.value));
|
|
const isFiltered = computed(() => visibleIds.value && !visibleIds.value.has(toRaw(vListItemRef.value?.id)));
|
|
function activateGroupActivator(e) {
|
|
if (isClickable.value && isActivatableGroupActivator.value) {
|
|
vListItemRef.value?.activate(!vListItemRef.value?.isActivated, e);
|
|
}
|
|
}
|
|
function onClickAction(e) {
|
|
e.preventDefault();
|
|
emit('toggleExpand', e);
|
|
}
|
|
useRender(() => {
|
|
const listItemProps = omit(VListItem.filterProps(props), ['onClick']);
|
|
const hasPrepend = slots.prepend || props.toggleIcon;
|
|
return _createVNode(VListItem, _mergeProps({
|
|
"ref": vListItemRef
|
|
}, listItemProps, {
|
|
"active": vListItemRef.value?.isActivated,
|
|
"class": ['v-treeview-item', {
|
|
'v-treeview-item--activatable-group-activator': isActivatableGroupActivator.value,
|
|
'v-treeview-item--filtered': isFiltered.value
|
|
}, props.class],
|
|
"ripple": false,
|
|
"onClick": props.onClick ?? activateGroupActivator
|
|
}), {
|
|
...slots,
|
|
prepend: hasPrepend ? slotProps => {
|
|
return _createVNode(_Fragment, null, [_createVNode(VListItemAction, {
|
|
"start": false
|
|
}, {
|
|
default: () => [props.toggleIcon ? _createVNode(VBtn, {
|
|
"density": "compact",
|
|
"icon": props.toggleIcon,
|
|
"loading": props.loading,
|
|
"variant": "text",
|
|
"onClick": onClickAction
|
|
}, {
|
|
loader() {
|
|
return _createVNode(VProgressCircular, {
|
|
"indeterminate": "disable-shrink",
|
|
"size": "20",
|
|
"width": "2"
|
|
}, null);
|
|
}
|
|
}) : _createVNode("div", {
|
|
"class": "v-treeview-item__level"
|
|
}, null)]
|
|
}), slots.prepend?.(slotProps)]);
|
|
} : undefined
|
|
});
|
|
});
|
|
return {};
|
|
}
|
|
});
|
|
//# sourceMappingURL=VTreeviewItem.mjs.map
|