mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-28 12:11:08 -04:00
57 lines
1.3 KiB
JavaScript
57 lines
1.3 KiB
JavaScript
import { toRefs } from 'vue'
|
|
import isNullish from './../utils/isNullish'
|
|
|
|
export default function useData(props, context, dep) {
|
|
const { object, valueProp, mode } = toRefs(props)
|
|
|
|
// ============ DEPENDENCIES ============
|
|
|
|
const iv = dep.iv
|
|
|
|
// =============== METHODS ==============
|
|
|
|
const update = (val) => {
|
|
// Setting object(s) as internal value
|
|
iv.value = makeInternal(val)
|
|
|
|
// Setting object(s) or plain value as external
|
|
// value based on `option` setting
|
|
const externalVal = makeExternal(val)
|
|
|
|
context.emit('change', externalVal)
|
|
context.emit('input', externalVal)
|
|
context.emit('update:modelValue', externalVal)
|
|
}
|
|
|
|
// no export
|
|
const makeExternal = (val) => {
|
|
// If external value should be object
|
|
// no transformation is required
|
|
if (object.value) {
|
|
return val
|
|
}
|
|
|
|
// No need to transform if empty value
|
|
if (isNullish(val)) {
|
|
return val
|
|
}
|
|
|
|
// If external should be plain transform
|
|
// value object to plain values
|
|
return !Array.isArray(val) ? val[valueProp.value] : val.map(v => v[valueProp.value])
|
|
}
|
|
|
|
// no export
|
|
const makeInternal = (val) => {
|
|
if (isNullish(val)) {
|
|
return mode.value === 'single' ? {} : []
|
|
}
|
|
|
|
return val
|
|
}
|
|
|
|
return {
|
|
update,
|
|
}
|
|
}
|