mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-28 04:01:10 -04:00
182 lines
5.8 KiB
JavaScript
182 lines
5.8 KiB
JavaScript
import { computed, toRefs } from 'vue'
|
|
|
|
export default function useClasses(props, context, dependencies) {
|
|
const refs = toRefs(props)
|
|
const { disabled, openDirection, showOptions, invalid } = refs
|
|
|
|
// ============ DEPENDENCIES ============
|
|
|
|
const isOpen = dependencies.isOpen
|
|
const isPointed = dependencies.isPointed
|
|
const isSelected = dependencies.isSelected
|
|
const isDisabled = dependencies.isDisabled
|
|
const isActive = dependencies.isActive
|
|
const canPointGroups = dependencies.canPointGroups
|
|
const resolving = dependencies.resolving
|
|
const fo = dependencies.fo
|
|
const isInvalid = invalid
|
|
|
|
const classes = {
|
|
container: 'multiselect',
|
|
containerDisabled: 'is-disabled',
|
|
containerOpen: 'is-open',
|
|
containerOpenTop: 'is-open-top',
|
|
containerActive: 'is-active',
|
|
containerInvalid: 'is-invalid',
|
|
containerInvalidActive: 'is-invalid-active',
|
|
singleLabel: 'multiselect-single-label',
|
|
multipleLabel: 'multiselect-multiple-label',
|
|
search: 'multiselect-search',
|
|
tags: 'multiselect-tags',
|
|
tag: 'multiselect-tag',
|
|
tagDisabled: 'is-disabled',
|
|
tagRemove: 'multiselect-tag-remove',
|
|
tagRemoveIcon: 'multiselect-tag-remove-icon',
|
|
tagsSearchWrapper: 'multiselect-tags-search-wrapper',
|
|
tagsSearch: 'multiselect-tags-search',
|
|
tagsSearchCopy: 'multiselect-tags-search-copy',
|
|
placeholder: 'multiselect-placeholder',
|
|
caret: 'multiselect-caret',
|
|
caretOpen: 'is-open',
|
|
clear: 'multiselect-clear',
|
|
clearIcon: 'multiselect-clear-icon',
|
|
spinner: 'multiselect-spinner',
|
|
dropdown: 'multiselect-dropdown',
|
|
dropdownTop: 'is-top',
|
|
dropdownHidden: 'is-hidden',
|
|
options: 'multiselect-options',
|
|
optionsTop: 'is-top',
|
|
group: 'multiselect-group',
|
|
groupLabel: 'multiselect-group-label',
|
|
groupLabelPointable: 'is-pointable',
|
|
groupLabelPointed: 'is-pointed',
|
|
groupLabelSelected: 'is-selected',
|
|
groupLabelDisabled: 'is-disabled',
|
|
groupLabelSelectedPointed: 'is-selected is-pointed',
|
|
groupLabelSelectedDisabled: 'is-selected is-disabled',
|
|
groupOptions: 'multiselect-group-options',
|
|
option: 'multiselect-option',
|
|
optionPointed: 'is-pointed',
|
|
optionSelected: 'is-selected',
|
|
optionDisabled: 'is-disabled',
|
|
optionSelectedPointed: 'is-selected is-pointed',
|
|
optionSelectedDisabled: 'is-selected is-disabled',
|
|
noOptions: 'multiselect-no-options',
|
|
noResults: 'multiselect-no-results',
|
|
fakeInput: 'multiselect-fake-input',
|
|
spacer: 'multiselect-spacer',
|
|
...refs.classes.value,
|
|
}
|
|
|
|
// ============== COMPUTED ==============
|
|
|
|
const showDropdown = computed(() => {
|
|
return !!(
|
|
isOpen.value &&
|
|
showOptions.value &&
|
|
(!resolving.value || (resolving.value && fo.value.length))
|
|
)
|
|
})
|
|
|
|
const classList = computed(() => {
|
|
return {
|
|
container: [classes.container]
|
|
.concat(disabled.value ? classes.containerDisabled : [])
|
|
.concat(
|
|
showDropdown.value && openDirection.value === 'top'
|
|
? classes.containerOpenTop
|
|
: []
|
|
)
|
|
.concat(
|
|
showDropdown.value && openDirection.value !== 'top'
|
|
? classes.containerOpen
|
|
: []
|
|
)
|
|
.concat(isActive.value ? classes.containerActive : [])
|
|
.concat(invalid.value ? classes.containerInvalid : []),
|
|
spacer: classes.spacer,
|
|
singleLabel: classes.singleLabel,
|
|
multipleLabel: classes.multipleLabel,
|
|
search: classes.search,
|
|
tags: classes.tags,
|
|
tag: [classes.tag].concat(disabled.value ? classes.tagDisabled : []),
|
|
tagRemove: classes.tagRemove,
|
|
tagRemoveIcon: classes.tagRemoveIcon,
|
|
tagsSearchWrapper: classes.tagsSearchWrapper,
|
|
tagsSearch: classes.tagsSearch,
|
|
tagsSearchCopy: classes.tagsSearchCopy,
|
|
placeholder: classes.placeholder,
|
|
caret: [classes.caret].concat(isOpen.value ? classes.caretOpen : []),
|
|
clear: classes.clear,
|
|
clearIcon: classes.clearIcon,
|
|
spinner: classes.spinner,
|
|
dropdown: [classes.dropdown]
|
|
.concat(openDirection.value === 'top' ? classes.dropdownTop : [])
|
|
.concat(
|
|
!isOpen.value || !showOptions.value || !showDropdown.value
|
|
? classes.dropdownHidden
|
|
: []
|
|
),
|
|
options: [classes.options].concat(
|
|
openDirection.value === 'top' ? classes.optionsTop : []
|
|
),
|
|
group: classes.group,
|
|
groupLabel: (g) => {
|
|
let groupLabel = [classes.groupLabel]
|
|
|
|
if (isPointed(g)) {
|
|
groupLabel.push(
|
|
isSelected(g)
|
|
? classes.groupLabelSelectedPointed
|
|
: classes.groupLabelPointed
|
|
)
|
|
} else if (isSelected(g) && canPointGroups.value) {
|
|
groupLabel.push(
|
|
isDisabled(g)
|
|
? classes.groupLabelSelectedDisabled
|
|
: classes.groupLabelSelected
|
|
)
|
|
} else if (isDisabled(g)) {
|
|
groupLabel.push(classes.groupLabelDisabled)
|
|
}
|
|
|
|
if (canPointGroups.value) {
|
|
groupLabel.push(classes.groupLabelPointable)
|
|
}
|
|
|
|
return groupLabel
|
|
},
|
|
groupOptions: classes.groupOptions,
|
|
option: (o, g) => {
|
|
let option = [classes.option]
|
|
|
|
if (isPointed(o)) {
|
|
option.push(
|
|
isSelected(o)
|
|
? classes.optionSelectedPointed
|
|
: classes.optionPointed
|
|
)
|
|
} else if (isSelected(o)) {
|
|
option.push(
|
|
isDisabled(o)
|
|
? classes.optionSelectedDisabled
|
|
: classes.optionSelected
|
|
)
|
|
} else if (isDisabled(o) || (g && isDisabled(g))) {
|
|
option.push(classes.optionDisabled)
|
|
}
|
|
|
|
return option
|
|
},
|
|
noOptions: classes.noOptions,
|
|
noResults: classes.noResults,
|
|
fakeInput: classes.fakeInput,
|
|
}
|
|
})
|
|
|
|
return {
|
|
classList,
|
|
showDropdown,
|
|
}
|
|
}
|