94 lines
2.7 KiB
JavaScript
94 lines
2.7 KiB
JavaScript
// Utilities
|
|
import { computed } from 'vue';
|
|
import { deepEqual, getPropertyFromItem, omit, propsFactory } from "../util/index.mjs"; // Types
|
|
// Composables
|
|
export const makeItemsProps = propsFactory({
|
|
items: {
|
|
type: Array,
|
|
default: () => []
|
|
},
|
|
itemTitle: {
|
|
type: [String, Array, Function],
|
|
default: 'title'
|
|
},
|
|
itemValue: {
|
|
type: [String, Array, Function],
|
|
default: 'value'
|
|
},
|
|
itemChildren: {
|
|
type: [Boolean, String, Array, Function],
|
|
default: 'children'
|
|
},
|
|
itemProps: {
|
|
type: [Boolean, String, Array, Function],
|
|
default: 'props'
|
|
},
|
|
returnObject: Boolean,
|
|
valueComparator: {
|
|
type: Function,
|
|
default: deepEqual
|
|
}
|
|
}, 'list-items');
|
|
export function transformItem(props, item) {
|
|
const title = getPropertyFromItem(item, props.itemTitle, item);
|
|
const value = getPropertyFromItem(item, props.itemValue, title);
|
|
const children = getPropertyFromItem(item, props.itemChildren);
|
|
const itemProps = props.itemProps === true ? typeof item === 'object' && item != null && !Array.isArray(item) ? 'children' in item ? omit(item, ['children']) : item : undefined : getPropertyFromItem(item, props.itemProps);
|
|
const _props = {
|
|
title,
|
|
value,
|
|
...itemProps
|
|
};
|
|
return {
|
|
title: String(_props.title ?? ''),
|
|
value: _props.value,
|
|
props: _props,
|
|
children: Array.isArray(children) ? transformItems(props, children) : undefined,
|
|
raw: item
|
|
};
|
|
}
|
|
export function transformItems(props, items) {
|
|
const array = [];
|
|
for (const item of items) {
|
|
array.push(transformItem(props, item));
|
|
}
|
|
return array;
|
|
}
|
|
export function useItems(props) {
|
|
const items = computed(() => transformItems(props, props.items));
|
|
const hasNullItem = computed(() => items.value.some(item => item.value === null));
|
|
function transformIn(value) {
|
|
if (!hasNullItem.value) {
|
|
// When the model value is null, return an InternalItem
|
|
// based on null only if null is one of the items
|
|
value = value.filter(v => v !== null);
|
|
}
|
|
return value.map(v => {
|
|
if (props.returnObject && typeof v === 'string') {
|
|
// String model value means value is a custom input value from combobox
|
|
// Don't look up existing items if the model value is a string
|
|
return transformItem(props, v);
|
|
}
|
|
return items.value.find(item => props.valueComparator(v, item.value)) || transformItem(props, v);
|
|
});
|
|
}
|
|
function transformOut(value) {
|
|
return props.returnObject ? value.map(_ref => {
|
|
let {
|
|
raw
|
|
} = _ref;
|
|
return raw;
|
|
}) : value.map(_ref2 => {
|
|
let {
|
|
value
|
|
} = _ref2;
|
|
return value;
|
|
});
|
|
}
|
|
return {
|
|
items,
|
|
transformIn,
|
|
transformOut
|
|
};
|
|
}
|
|
//# sourceMappingURL=list-items.mjs.map
|