UNPKG

sard-uniapp

Version:

sard-uniapp 是一套基于 Uniapp + Vue3 框架开发的兼容多端的 UI 组件库

113 lines (112 loc) 3.89 kB
import { defaultConfig } from '../config'; export const defaultPickerProps = () => ({ immediateChange: false, ...defaultConfig.picker, columns: () => [], }); export function getColumnsType(columns, { getChildren }) { const firstColumn = columns[0]; if (Array.isArray(firstColumn)) { return 'multi'; } if (firstColumn && typeof firstColumn === 'object' && Array.isArray(getChildren(firstColumn))) { return 'cascader'; } return 'single'; } export function getOptionsByIndexes(indexes, columns, useOptionKeysReturn) { const { getChildren } = useOptionKeysReturn; function recurse(columns, i = 0) { const index = Math.min(indexes[i], columns.length - 1); const option = columns[index]; const nextColumn = getChildren(option); if (Array.isArray(nextColumn)) { return [option, ...recurse(nextColumn, ++i)]; } return [option]; } switch (getColumnsType(columns, useOptionKeysReturn)) { case 'single': return [columns[indexes[0]]]; case 'multi': return columns.map((column, i) => column[indexes[i]]); case 'cascader': return recurse(columns); } } export function getCascaderValidIndexes(indexes, columns, { getChildren }) { function recurse(columns, i = 0) { let index = Math.min(indexes[i], columns.length - 1); const option = columns[index]; if (!option) { index = 0; } const nextColumn = getChildren(option); if (Array.isArray(nextColumn)) { return [index, ...recurse(nextColumn, ++i)]; } return [index]; } return recurse(columns); } export function getMaySingleValueByOptions(options, useOptionKeysReturn, columns) { const { getValue } = useOptionKeysReturn; const values = options.map((option) => getValue(option)); return getColumnsType(columns, useOptionKeysReturn) === 'single' ? values[0] : values; } export function getIndexesByValue(value, columns, useOptionKeysReturn) { const { getValue, getChildren } = useOptionKeysReturn; const type = getColumnsType(columns, useOptionKeysReturn); function recurse(columns, i = 0) { let index = columns.findIndex((option) => getValue(option) === value[i]); if (index === -1) { index = 0; } const option = columns[index]; const nextColumn = getChildren(option); if (Array.isArray(nextColumn)) { return [index, ...recurse(nextColumn, ++i)]; } return [index]; } if (type === 'cascader') { return recurse(columns); } if (type === 'single') { columns = [columns]; } return columns.map((column, index) => { const optionIndex = column.findIndex((option) => getValue(option) === value[index]); return Math.max(optionIndex, 0); }); } export function getInitialValue(columns, useOptionKeysReturn) { const { getChildren, getValue } = useOptionKeysReturn; function recurse(columns, options) { const option = columns[0]; options.push(option); const nextColumn = getChildren(option); if (Array.isArray(nextColumn) && nextColumn.length > 0) { return recurse(nextColumn, options); } return option; } switch (getColumnsType(columns, useOptionKeysReturn)) { case 'single': return [getValue(columns[0]), [columns[0]]]; case 'multi': return [ columns.map((column) => getValue(column[0])), columns.map((column) => column[0]), ]; case 'cascader': { const options = []; recurse(columns, options); return [options.map((option) => getValue(option)), options]; } } }