mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-11-03 14:03:18 -05: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,
 | 
						|
  }
 | 
						|
}
 |