{"version":3,"file":"sort.mjs","names":["useLocale","useProxiedModel","computed","inject","provide","toRef","getObjectValueByPath","isEmpty","propsFactory","makeDataTableSortProps","sortBy","type","Array","default","customKeySort","Object","multiSort","Boolean","mustSort","VDataTableSortSymbol","Symbol","for","createSort","props","provideSort","options","page","toggleSort","column","key","newSortBy","value","map","x","item","find","order","filter","isSorted","data","useSort","Error","useSortedItems","items","sortFunctions","sortRawFunctions","locale","sortedItems","length","sortItems","current","sortByItems","customSorters","customRawSorters","stringCollator","Intl","Collator","sensitivity","usage","sort","a","b","i","sortKey","sortOrder","sortA","raw","sortB","sortARaw","sortBRaw","customResult","Date","getTime","s","toString","toLocaleLowerCase","isNaN","Number","compare"],"sources":["../../../../src/components/VDataTable/composables/sort.ts"],"sourcesContent":["// Composables\nimport { useLocale } from '@/composables'\nimport { useProxiedModel } from '@/composables/proxiedModel'\n\n// Utilities\nimport { computed, inject, provide, toRef } from 'vue'\nimport { getObjectValueByPath, isEmpty, propsFactory } from '@/util'\n\n// Types\nimport type { InjectionKey, PropType, Ref } from 'vue'\nimport type { DataTableCompareFunction, InternalDataTableHeader } from '../types'\n\nexport const makeDataTableSortProps = propsFactory({\n  sortBy: {\n    type: Array as PropType<readonly SortItem[]>,\n    default: () => ([]),\n  },\n  customKeySort: Object as PropType<Record<string, DataTableCompareFunction>>,\n  multiSort: Boolean,\n  mustSort: Boolean,\n}, 'DataTable-sort')\n\nconst VDataTableSortSymbol: InjectionKey<{\n  sortBy: Ref<readonly SortItem[]>\n  toggleSort: (column: InternalDataTableHeader) => void\n  isSorted: (column: InternalDataTableHeader) => boolean\n}> = Symbol.for('vuetify:data-table-sort')\n\nexport type SortItem = { key: string, order?: boolean | 'asc' | 'desc' }\n\ntype SortProps = {\n  sortBy: readonly SortItem[]\n  'onUpdate:sortBy': ((value: any) => void) | undefined\n  mustSort: boolean\n  multiSort: boolean\n}\n\nexport function createSort (props: SortProps) {\n  const sortBy = useProxiedModel(props, 'sortBy')\n  const mustSort = toRef(props, 'mustSort')\n  const multiSort = toRef(props, 'multiSort')\n\n  return { sortBy, mustSort, multiSort }\n}\n\nexport function provideSort (options: {\n  sortBy: Ref<readonly SortItem[]>\n  mustSort: Ref<boolean>\n  multiSort: Ref<boolean>\n  page?: Ref<number>\n}) {\n  const { sortBy, mustSort, multiSort, page } = options\n\n  const toggleSort = (column: InternalDataTableHeader) => {\n    if (column.key == null) return\n\n    let newSortBy = sortBy.value.map(x => ({ ...x })) ?? []\n    const item = newSortBy.find(x => x.key === column.key)\n\n    if (!item) {\n      if (multiSort.value) newSortBy = [...newSortBy, { key: column.key, order: 'asc' }]\n      else newSortBy = [{ key: column.key, order: 'asc' }]\n    } else if (item.order === 'desc') {\n      if (mustSort.value) {\n        item.order = 'asc'\n      } else {\n        newSortBy = newSortBy.filter(x => x.key !== column.key)\n      }\n    } else {\n      item.order = 'desc'\n    }\n\n    sortBy.value = newSortBy\n    if (page) page.value = 1\n  }\n\n  function isSorted (column: InternalDataTableHeader) {\n    return !!sortBy.value.find(item => item.key === column.key)\n  }\n\n  const data = { sortBy, toggleSort, isSorted }\n\n  provide(VDataTableSortSymbol, data)\n\n  return data\n}\n\nexport function useSort () {\n  const data = inject(VDataTableSortSymbol)\n\n  if (!data) throw new Error('Missing sort!')\n\n  return data\n}\n\n// TODO: abstract into project composable\nexport function useSortedItems <T extends Record<string, any>> (\n  props: { customKeySort: Record<string, DataTableCompareFunction> | undefined },\n  items: Ref<T[]>,\n  sortBy: Ref<readonly SortItem[]>,\n  sortFunctions?: Ref<Record<string, DataTableCompareFunction> | undefined>,\n  sortRawFunctions?: Ref<Record<string, DataTableCompareFunction> | undefined>,\n) {\n  const locale = useLocale()\n  const sortedItems = computed(() => {\n    if (!sortBy.value.length) return items.value\n\n    return sortItems(items.value, sortBy.value, locale.current.value, {\n      ...props.customKeySort,\n      ...sortFunctions?.value,\n    }, sortRawFunctions?.value)\n  })\n\n  return { sortedItems }\n}\n\nexport function sortItems<T extends Record<string, any>> (\n  items: T[],\n  sortByItems: readonly SortItem[],\n  locale: string,\n  customSorters?: Record<string, DataTableCompareFunction>,\n  customRawSorters?: Record<string, DataTableCompareFunction>,\n): T[] {\n  const stringCollator = new Intl.Collator(locale, { sensitivity: 'accent', usage: 'sort' })\n\n  return [...items].sort((a, b) => {\n    for (let i = 0; i < sortByItems.length; i++) {\n      const sortKey = sortByItems[i].key\n      const sortOrder = sortByItems[i].order ?? 'asc'\n\n      if (sortOrder === false) continue\n\n      let sortA = getObjectValueByPath(a.raw, sortKey)\n      let sortB = getObjectValueByPath(b.raw, sortKey)\n      let sortARaw = a.raw\n      let sortBRaw = b.raw\n\n      if (sortOrder === 'desc') {\n        [sortA, sortB] = [sortB, sortA]\n        ;[sortARaw, sortBRaw] = [sortBRaw, sortARaw]\n      }\n\n      if (customRawSorters?.[sortKey]) {\n        const customResult = customRawSorters[sortKey](sortARaw, sortBRaw)\n\n        if (!customResult) continue\n\n        return customResult\n      }\n\n      if (customSorters?.[sortKey]) {\n        const customResult = customSorters[sortKey](sortA, sortB)\n\n        if (!customResult) continue\n\n        return customResult\n      }\n\n      // Dates should be compared numerically\n      if (sortA instanceof Date && sortB instanceof Date) {\n        return sortA.getTime() - sortB.getTime()\n      }\n\n      [sortA, sortB] = [sortA, sortB].map(s => s != null ? s.toString().toLocaleLowerCase() : s)\n\n      if (sortA !== sortB) {\n        if (isEmpty(sortA) && isEmpty(sortB)) return 0\n        if (isEmpty(sortA)) return -1\n        if (isEmpty(sortB)) return 1\n        if (!isNaN(sortA) && !isNaN(sortB)) return Number(sortA) - Number(sortB)\n        return stringCollator.compare(sortA, sortB)\n      }\n    }\n\n    return 0\n  })\n}\n"],"mappings":"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"}