vuetify
Version:
Vue Material Component Framework
1 lines • 8.43 kB
Source Map (JSON)
{"version":3,"file":"sort.mjs","names":["useProxiedModel","computed","inject","provide","getObjectValueByPath","propsFactory","makeDataTableSortProps","sortBy","type","Array","default","multiSort","Boolean","mustSort","VDataTableSortSymbol","Symbol","for","createSort","props","toggleSort","key","newSortBy","value","map","x","item","find","order","filter","data","useSort","Error","useSortedItems","items","columns","customSorters","reduce","obj","sort","sortedItems","length","sortItems","sortByItems","locale","stringCollator","Intl","Collator","sensitivity","usage","a","b","i","sortKey","sortOrder","sortA","raw","sortB","customResult","Date","getTime","s","toString","toLocaleLowerCase","isNaN","Number","compare"],"sources":["../../../../src/labs/VDataTable/composables/sort.ts"],"sourcesContent":["// Composables\nimport { useProxiedModel } from '@/composables/proxiedModel'\n\n// Utilities\nimport { computed, inject, provide } from 'vue'\nimport { getObjectValueByPath, propsFactory } from '@/util'\n\n// Types\nimport type { InjectionKey, PropType, Ref } from 'vue'\nimport type { InternalItem } from '@/composables/items'\nimport type { DataTableCompareFunction, DataTableItem, InternalDataTableHeader } from '../types'\n\nexport const makeDataTableSortProps = propsFactory({\n sortBy: {\n type: Array as PropType<SortItem[]>,\n default: () => ([]),\n },\n multiSort: Boolean,\n mustSort: Boolean,\n}, 'v-data-table-sort')\n\nconst VDataTableSortSymbol: InjectionKey<{\n sortBy: Ref<readonly SortItem[]>\n toggleSort: (key: string) => void\n}> = Symbol.for('vuetify:data-table-sort')\n\nexport type SortItem = { key: string, order?: boolean | 'asc' | 'desc' }\n\nexport function createSort (props: {\n sortBy: SortItem[]\n 'onUpdate:sortBy': ((value: any) => void) | undefined\n mustSort: boolean\n multiSort: boolean\n}) {\n const sortBy = useProxiedModel(props, 'sortBy')\n\n const toggleSort = (key: string) => {\n let newSortBy = sortBy.value.map(x => ({ ...x })) ?? []\n const item = newSortBy.find(x => x.key === key)\n\n if (!item) {\n if (props.multiSort) newSortBy = [...newSortBy, { key, order: 'asc' }]\n else newSortBy = [{ key, order: 'asc' }]\n } else if (item.order === 'desc') {\n if (props.mustSort) {\n item.order = 'asc'\n } else {\n newSortBy = newSortBy.filter(x => x.key !== key)\n }\n } else {\n item.order = 'desc'\n }\n\n sortBy.value = newSortBy\n }\n\n const data = { sortBy, toggleSort }\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\nexport function useSortedItems (items: Ref<DataTableItem[]>, sortBy: Ref<readonly SortItem[]>, columns: Ref<InternalDataTableHeader[]>) {\n // TODO: Put this in separate prop customKeySort to match filter composable?\n const customSorters = computed(() => {\n return columns.value.reduce<Record<string, DataTableCompareFunction>>((obj, item) => {\n if (item.sort) obj[item.key] = item.sort\n\n return obj\n }, {})\n })\n\n const sortedItems = computed(() => {\n if (!sortBy.value.length) return items.value\n\n return sortItems(items.value, sortBy.value, 'en', customSorters.value)\n })\n\n return { sortedItems }\n}\n\nexport function sortItems<T extends InternalItem> (\n items: T[],\n sortByItems: readonly SortItem[],\n locale: string,\n customSorters?: 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\n\n if (sortOrder === false) continue\n\n let sortA = getObjectValueByPath(a.raw, sortKey)\n let sortB = getObjectValueByPath(b.raw, sortKey)\n\n if (sortOrder === 'desc') {\n [sortA, sortB] = [sortB, sortA]\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 // Check if both cannot be evaluated\n if (sortA == null || sortB == null) {\n continue\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 || '').toString().toLocaleLowerCase())\n\n if (sortA !== sortB) {\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":"AAAA;AAAA,SACSA,eAAe,iDAExB;AACA,SAASC,QAAQ,EAAEC,MAAM,EAAEC,OAAO,QAAQ,KAAK;AAAA,SACtCC,oBAAoB,EAAEC,YAAY,mCAE3C;AAKA,OAAO,MAAMC,sBAAsB,GAAGD,YAAY,CAAC;EACjDE,MAAM,EAAE;IACNC,IAAI,EAAEC,KAA6B;IACnCC,OAAO,EAAE,MAAO;EAClB,CAAC;EACDC,SAAS,EAAEC,OAAO;EAClBC,QAAQ,EAAED;AACZ,CAAC,EAAE,mBAAmB,CAAC;AAEvB,MAAME,oBAGJ,GAAGC,MAAM,CAACC,GAAG,CAAC,yBAAyB,CAAC;AAI1C,OAAO,SAASC,UAAU,CAAEC,KAK3B,EAAE;EACD,MAAMX,MAAM,GAAGP,eAAe,CAACkB,KAAK,EAAE,QAAQ,CAAC;EAE/C,MAAMC,UAAU,GAAIC,GAAW,IAAK;IAClC,IAAIC,SAAS,GAAGd,MAAM,CAACe,KAAK,CAACC,GAAG,CAACC,CAAC,KAAK;MAAE,GAAGA;IAAE,CAAC,CAAC,CAAC,IAAI,EAAE;IACvD,MAAMC,IAAI,GAAGJ,SAAS,CAACK,IAAI,CAACF,CAAC,IAAIA,CAAC,CAACJ,GAAG,KAAKA,GAAG,CAAC;IAE/C,IAAI,CAACK,IAAI,EAAE;MACT,IAAIP,KAAK,CAACP,SAAS,EAAEU,SAAS,GAAG,CAAC,GAAGA,SAAS,EAAE;QAAED,GAAG;QAAEO,KAAK,EAAE;MAAM,CAAC,CAAC,MACjEN,SAAS,GAAG,CAAC;QAAED,GAAG;QAAEO,KAAK,EAAE;MAAM,CAAC,CAAC;IAC1C,CAAC,MAAM,IAAIF,IAAI,CAACE,KAAK,KAAK,MAAM,EAAE;MAChC,IAAIT,KAAK,CAACL,QAAQ,EAAE;QAClBY,IAAI,CAACE,KAAK,GAAG,KAAK;MACpB,CAAC,MAAM;QACLN,SAAS,GAAGA,SAAS,CAACO,MAAM,CAACJ,CAAC,IAAIA,CAAC,CAACJ,GAAG,KAAKA,GAAG,CAAC;MAClD;IACF,CAAC,MAAM;MACLK,IAAI,CAACE,KAAK,GAAG,MAAM;IACrB;IAEApB,MAAM,CAACe,KAAK,GAAGD,SAAS;EAC1B,CAAC;EAED,MAAMQ,IAAI,GAAG;IAAEtB,MAAM;IAAEY;EAAW,CAAC;EAEnChB,OAAO,CAACW,oBAAoB,EAAEe,IAAI,CAAC;EAEnC,OAAOA,IAAI;AACb;AAEA,OAAO,SAASC,OAAO,GAAI;EACzB,MAAMD,IAAI,GAAG3B,MAAM,CAACY,oBAAoB,CAAC;EAEzC,IAAI,CAACe,IAAI,EAAE,MAAM,IAAIE,KAAK,CAAC,eAAe,CAAC;EAE3C,OAAOF,IAAI;AACb;AAEA,OAAO,SAASG,cAAc,CAAEC,KAA2B,EAAE1B,MAAgC,EAAE2B,OAAuC,EAAE;EACtI;EACA,MAAMC,aAAa,GAAGlC,QAAQ,CAAC,MAAM;IACnC,OAAOiC,OAAO,CAACZ,KAAK,CAACc,MAAM,CAA2C,CAACC,GAAG,EAAEZ,IAAI,KAAK;MACnF,IAAIA,IAAI,CAACa,IAAI,EAAED,GAAG,CAACZ,IAAI,CAACL,GAAG,CAAC,GAAGK,IAAI,CAACa,IAAI;MAExC,OAAOD,GAAG;IACZ,CAAC,EAAE,CAAC,CAAC,CAAC;EACR,CAAC,CAAC;EAEF,MAAME,WAAW,GAAGtC,QAAQ,CAAC,MAAM;IACjC,IAAI,CAACM,MAAM,CAACe,KAAK,CAACkB,MAAM,EAAE,OAAOP,KAAK,CAACX,KAAK;IAE5C,OAAOmB,SAAS,CAACR,KAAK,CAACX,KAAK,EAAEf,MAAM,CAACe,KAAK,EAAE,IAAI,EAAEa,aAAa,CAACb,KAAK,CAAC;EACxE,CAAC,CAAC;EAEF,OAAO;IAAEiB;EAAY,CAAC;AACxB;AAEA,OAAO,SAASE,SAAS,CACvBR,KAAU,EACVS,WAAgC,EAChCC,MAAc,EACdR,aAAwD,EACnD;EACL,MAAMS,cAAc,GAAG,IAAIC,IAAI,CAACC,QAAQ,CAACH,MAAM,EAAE;IAAEI,WAAW,EAAE,QAAQ;IAAEC,KAAK,EAAE;EAAO,CAAC,CAAC;EAE1F,OAAO,CAAC,GAAGf,KAAK,CAAC,CAACK,IAAI,CAAC,CAACW,CAAC,EAAEC,CAAC,KAAK;IAC/B,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGT,WAAW,CAACF,MAAM,EAAEW,CAAC,EAAE,EAAE;MAC3C,MAAMC,OAAO,GAAGV,WAAW,CAACS,CAAC,CAAC,CAAC/B,GAAG;MAClC,MAAMiC,SAAS,GAAGX,WAAW,CAACS,CAAC,CAAC,CAACxB,KAAK;MAEtC,IAAI0B,SAAS,KAAK,KAAK,EAAE;MAEzB,IAAIC,KAAK,GAAGlD,oBAAoB,CAAC6C,CAAC,CAACM,GAAG,EAAEH,OAAO,CAAC;MAChD,IAAII,KAAK,GAAGpD,oBAAoB,CAAC8C,CAAC,CAACK,GAAG,EAAEH,OAAO,CAAC;MAEhD,IAAIC,SAAS,KAAK,MAAM,EAAE;QACxB,CAACC,KAAK,EAAEE,KAAK,CAAC,GAAG,CAACA,KAAK,EAAEF,KAAK,CAAC;MACjC;MAEA,IAAInB,aAAa,GAAGiB,OAAO,CAAC,EAAE;QAC5B,MAAMK,YAAY,GAAGtB,aAAa,CAACiB,OAAO,CAAC,CAACE,KAAK,EAAEE,KAAK,CAAC;QAEzD,IAAI,CAACC,YAAY,EAAE;QAEnB,OAAOA,YAAY;MACrB;;MAEA;MACA,IAAIH,KAAK,IAAI,IAAI,IAAIE,KAAK,IAAI,IAAI,EAAE;QAClC;MACF;;MAEA;MACA,IAAIF,KAAK,YAAYI,IAAI,IAAIF,KAAK,YAAYE,IAAI,EAAE;QAClD,OAAOJ,KAAK,CAACK,OAAO,EAAE,GAAGH,KAAK,CAACG,OAAO,EAAE;MAC1C;MAEA,CAACL,KAAK,EAAEE,KAAK,CAAC,GAAG,CAACF,KAAK,EAAEE,KAAK,CAAC,CAACjC,GAAG,CAACqC,CAAC,IAAI,CAACA,CAAC,IAAI,EAAE,EAAEC,QAAQ,EAAE,CAACC,iBAAiB,EAAE,CAAC;MAElF,IAAIR,KAAK,KAAKE,KAAK,EAAE;QACnB,IAAI,CAACO,KAAK,CAACT,KAAK,CAAC,IAAI,CAACS,KAAK,CAACP,KAAK,CAAC,EAAE,OAAOQ,MAAM,CAACV,KAAK,CAAC,GAAGU,MAAM,CAACR,KAAK,CAAC;QACxE,OAAOZ,cAAc,CAACqB,OAAO,CAACX,KAAK,EAAEE,KAAK,CAAC;MAC7C;IACF;IAEA,OAAO,CAAC;EACV,CAAC,CAAC;AACJ"}