zent
Version:
一套前端设计语言和基于React的实现
140 lines (129 loc) • 3 kB
text/typescript
import { INumberInputIntegerProps } from './NumberInput';
import utilsIsInteger from '../utils/isInteger';
import { warning } from '../utils/warning';
function withinRange(min: number, max: number, num: number) {
if (min >= num) {
return min;
}
if (max <= num) {
return max;
}
return num;
}
function getMax(max: number | undefined) {
return typeof max === 'number' && !Number.isNaN(max)
? withinRange(Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, max)
: Number.MAX_SAFE_INTEGER;
}
function getMin(min: number | undefined) {
return typeof min === 'number' && !Number.isNaN(min)
? withinRange(Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, min)
: Number.MIN_SAFE_INTEGER;
}
export function normalizeMinMax(props: INumberInputIntegerProps) {
const max = getMax(props.max);
const min = getMin(props.min);
if (min > max) {
warning(false, 'max is smaller than min');
return {
min: max,
max: min,
};
}
return {
min,
max,
};
}
export function isPotentialValue(value: string) {
return value === '' || value === '-' || value === '+';
}
export const isInteger = utilsIsInteger;
export function normalizeValue(
potential: number | undefined | null,
min: number,
max: number,
showTooltip?: boolean
): {
input: string;
value: number | null;
pop?: { visible: boolean; text: string; type: string };
} {
let value: number | null;
let input: string | null = null;
let pop;
if (potential === null || potential === undefined) {
value = null;
input = '';
} else if (typeof potential === 'string') {
/**
* NaN || 0 -> 0
* 不需要处理 Infinity,下面的 min max 会处理
*/
value = parseInt(potential, 10) || 0;
} else if (Number.isNaN(potential)) {
value = 0;
input = '';
} else {
value = Math.floor(potential);
}
if (value !== null) {
// 判断是否需要显示pop提示
if (value < min) {
showTooltip &&
(pop = {
visible: true,
type: 'min',
text: String(min),
});
} else if (value > max) {
showTooltip &&
(pop = {
visible: true,
text: String(max),
type: 'max',
});
}
value = Math.min(max, value);
value = Math.max(min, value);
}
if (input === null) {
input = String(value);
}
const popState = pop && showTooltip ? { pop } : {};
return {
...popState,
value,
input,
};
}
export function calculateLimit(
value: number | null,
min: number,
max: number
): { canInc: boolean; canDec: boolean } {
if (value === null) {
return {
canDec: false,
canInc: false,
};
}
let canDec = true;
let canInc = true;
if (min >= value) {
canDec = false;
}
if (max <= value) {
canInc = false;
}
return {
canDec,
canInc,
};
}
export function getDelta(step?: number) {
if (Number.isFinite(step)) {
return Math.round(step);
}
return 1;
}