sard-uniapp
Version:
sard-uniapp 是一套基于 Uniapp + Vue3 框架开发的兼容多端的 UI 组件库
113 lines (112 loc) • 3.89 kB
JavaScript
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];
}
}
}