This commit is contained in:
Ling53666
2025-08-18 09:11:51 +08:00
commit 02554225da
2516 changed files with 133155 additions and 0 deletions

View File

@ -0,0 +1,50 @@
<view
class="ant-stepper {{className ? className : ''}}"
style="{{style}}"
>
<ant-button
className="ant-stepper-button ant-stepper-button-down {{disabled || mixin.value !== '' && mixin.value !== undefined && mixin.value <= min ? 'ant-stepper-button-disabled' : ''}}"
activeClassName="ant-stepper-button-hover"
icon="MinusOutline"
type="text"
data-mode="minus"
disabled="{{disabled || mixin.value !== '' && mixin.value !== undefined && mixin.value <= min}}"
onTap="onTap"
onDisabledTap="onDisabledTap"
></ant-button>
<view class="ant-stepper-input-wrap">
<view
a:if="{{inputReadOnly}}"
class="ant-stepper-input ant-stepper-input-readonly"
>
{{mixin.value}}
</view>
<ant-input
a:else
className="ant-stepper-input {{disabled ? 'ant-stepper-input-disabled' : ''}} {{inputClassName ? inputClassName : ''}}"
style="{{inputStyle}}"
type="{{type}}"
enableNative="{{enableNative}}"
alwaysSystem="{{alwaysSystem}}"
confirmType="{{confirmType}}"
confirmHold="{{confirmHold}}"
disabled="{{disabled}}"
focus="{{focus}}"
onChange="onChange"
onFocus="onFocus"
onBlur="onBlur"
onConfirm="onConfirm"
value="{{mixin.value}}"
></ant-input>
</view>
<ant-button
className="ant-stepper-button ant-stepper-button-up {{disabled || mixin.value !== '' && mixin.value !== undefined && mixin.value >= max ? 'ant-stepper-button-disabled' : ''}}"
activeClassName="ant-stepper-button-hover"
icon="AddOutline"
type="text"
data-mode="add"
disabled="{{disabled || mixin.value !== '' && mixin.value !== undefined && mixin.value >= max}}"
onTap="onTap"
onDisabledTap="onDisabledTap"
></ant-button>
</view>

View File

@ -0,0 +1 @@
export {};

View File

@ -0,0 +1,93 @@
import { Component, triggerEvent, getValueFromProps } from '../_util/simply';
import { StepperDefaultProps } from './props';
import { getPrecision, getValidNumber } from './utils';
import mixinValue from '../mixins/value';
Component(StepperDefaultProps, {
onFocus: function (e) {
var value = this.getValue();
triggerEvent(this, 'focus', value === '' ? null : Number(value), e);
},
onChange: function (val, e) {
var _a = this.update(val), needUpdate = _a.needUpdate, value = _a.value;
if (getValueFromProps(this, 'onChange') && needUpdate) {
triggerEvent(this, 'change', value === '' ? null : Number(value), e);
}
},
onConfirm: function (val, e) {
var value = this.getValue();
triggerEvent(this, 'confirm', value === '' ? null : Number(value), e);
},
onBlur: function (e) {
if (this.isControlled()) {
this.update(getValueFromProps(this, 'value'));
}
var value = this.getValue();
triggerEvent(this, 'blur', value === '' ? null : Number(value), e);
},
onDisabledTap: function (e) {
var onDisabledTap = getValueFromProps(this, 'onDisabledTap');
onDisabledTap && onDisabledTap(e);
},
onTap: function (e) {
var _a = getValueFromProps(this, [
'step',
'disabled',
'min',
'max',
'precision',
]), step = _a[0], disabled = _a[1], _b = _a[2], min = _b === void 0 ? -Infinity : _b, _c = _a[3], max = _c === void 0 ? Infinity : _c, precisionFormProps = _a[4];
var value = Number(this.getValue() || 0);
if (!disabled) {
var mode = e.currentTarget.dataset.mode;
var result = value;
var precision = precisionFormProps >= 0
? precisionFormProps
: Math.max(getPrecision(value), getPrecision(step));
if (mode === 'minus') {
// 【减】按钮的操作
result = value - step;
if (result < min) {
result = min;
}
}
else if (mode === 'add') {
// 【加】按钮的操作
result = value + step;
if (result > max) {
result = max;
}
}
if (!this.isControlled()) {
var needUpdate = this.update(result, {}, precision).needUpdate;
if (!needUpdate) {
return;
}
}
{
var value_1 = getValidNumber(result, min, max, step, precision).value;
triggerEvent(this, 'change', Number(value_1), e);
}
}
},
}, undefined, [
mixinValue({
transformValue: function (num, extra, precision) {
var _a = getValueFromProps(this, [
'min',
'max',
'step',
'precision',
]), min = _a[0], max = _a[1], step = _a[2], precisionFormProps = _a[3];
var _b = getValidNumber(num, min, max, step, precision >= 0 ? precision : precisionFormProps), valid = _b.valid, value = _b.value;
if (valid && this.getValue() !== value) {
return {
needUpdate: true,
value: value,
};
}
return {
needUpdate: false,
};
},
}),
]);

View File

@ -0,0 +1,7 @@
{
"component": true,
"usingComponents": {
"ant-button": "../Button/index",
"ant-input": "../Input/InputBlur/index"
}
}

View File

@ -0,0 +1,69 @@
@import (reference) './variable.less';
@stepperPrefix: ant-stepper;
.@{stepperPrefix} {
position: relative;
display: inline-flex;
flex-wrap: nowrap;
height: 56 * @rpx;
overflow: hidden;
box-sizing: border-box;
& &-button {
width: 56 * @rpx;
height: 56 * @rpx;
line-height: 56 * @rpx;
padding: 0;
color: @COLOR_BRAND1;
background-color: @COLOR_BACKGROUND;
}
& &-button-hover {
background-color: fade(@COLOR_BLACK_CHANGE, 8%);
}
& &-button-up {
border-top-left-radius: 0;
border-top-right-radius: 4 * @rpx;
border-bottom-left-radius: 0;
border-bottom-right-radius: 4 * @rpx;
}
& &-button-down {
border-top-right-radius: 0;
border-top-left-radius: 4 * @rpx;
border-bottom-right-radius: 0;
border-bottom-left-radius: 4 * @rpx;
}
& &-button-disabled {
color: @COLOR_TEXT_ASSIST;
}
&-input {
width: 88 * @rpx;
height: 56 * @rpx;
margin-left: 4 * @rpx;
margin-right: 4 * @rpx;
text-align: center;
line-height: normal;
font-size: 30 * @rpx;
color: @COLOR_TEXT_PRIMARY;
box-sizing: border-box;
background-color: @COLOR_BACKGROUND;
// 在微信会导致 input 显示不居中
padding: 7 * @rpx 14 * @rpx;
caret-color: @COLOR_BRAND1;
&-disabled {
opacity: 0.4;
}
}
&-input-readonly {
line-height: 56 * @rpx;
padding: 0;
}
}

View File

@ -0,0 +1,78 @@
import { IBaseProps } from '../_util/base';
/**
* @description 步进器,用作增加或者减少当前数值。
*/
export interface IStepperProps extends IBaseProps {
/**
* @description 输入框的值
*/
value: number;
/**
* @description 最小值
*/
min: number;
/**
* @description 最大值
*/
max: number;
/**
* @description 每次加减的值
* @default 1
*/
step: number;
/**
* @description 输入框唤起键盘类型
*/
type: 'number' | 'digit';
/**
* @description 计算精度,保留几位小数
* https://github.com/ant-design/ant-design/issues/5998
*/
precision: number;
/**
* @description 输入框类名
*/
inputClassName: string;
/**
* @description 输入框样式
*/
inputStyle: string;
/**
* @description 是否禁用
* @default false
*/
disabled?: boolean;
/**
* @description 输入框是否只读
* @default false
*/
inputReadOnly?: boolean;
/**
* @description 输入框初始值
*/
defaultValue: number;
focus?: boolean;
/**
*
* @description onChange
*/
onChange?: (value: number, e: any) => void;
/**
*
* @description onConfirm
*/
onConfirm?: (value: number, e: any) => void;
/**
* @description onFocus
*/
onFocus?: (value: number, e: any) => void;
/**
* @description onBlur
*/
onBlur?: (value: number, e: any) => void;
/**
* @description onDisabledTap
*/
onDisabledTap?: (e: any) => void;
}
export declare const StepperDefaultProps: Partial<IStepperProps>;

View File

@ -0,0 +1,13 @@
export var StepperDefaultProps = {
value: null,
defaultValue: null,
precision: -1,
min: Number.MIN_SAFE_INTEGER,
max: Number.MAX_SAFE_INTEGER,
step: 1,
type: 'digit',
inputClassName: '',
inputStyle: '',
disabled: false,
inputReadOnly: false,
};

View File

@ -0,0 +1,8 @@
export declare function getPrecision(value: number): number;
export declare function getValidNumber(value: any, min: number, max: number, step: number, precision?: number): {
valid: boolean;
value: string;
} | {
valid: boolean;
value?: undefined;
};

View File

@ -0,0 +1,58 @@
export function getPrecision(value) {
var valueString = String(value);
if (valueString.indexOf('e-') >= 0) {
return parseInt(valueString.slice(valueString.indexOf('e-') + 2), 10);
}
var p = 0;
if (valueString.indexOf('.') >= 0) {
p = valueString.length - valueString.indexOf('.') - 1;
}
return p;
}
export function getValidNumber(value, min, max, step, precision) {
if (min === void 0) { min = -Infinity; }
if (max === void 0) { max = Infinity; }
if (typeof value === 'undefined' || value === null) {
return {
valid: true,
value: '',
};
}
var num;
if (typeof value === 'string') {
if (/^\s*$/.test(value)) {
return {
valid: true,
value: '',
};
}
if (!isNaN(Number(value))) {
num = Number(value);
}
}
else {
num = value;
}
if (num > max) {
num = max;
}
else if (num < min) {
num = min;
}
if (typeof num === 'number' && !isNaN(num)) {
if (typeof precision === 'number' && precision >= 0) {
return {
valid: true,
value: num.toFixed(precision),
};
}
precision = Math.max(getPrecision(num), getPrecision(step));
return {
valid: true,
value: num.toFixed(precision),
};
}
return {
valid: false,
};
}

View File

@ -0,0 +1,11 @@
@import (reference) '../style/themes/index.less';
// 字体大小
@stepper-font-size: 30 * @rpx;
// 加减边框
@stepper-handler-border-width: 2 * @rpx;
@stepper-handler-border-radius: 4.4 * @rpx;
@stepper-handler-border-color: @COLOR_GREY_2;
// 加减点击背景
@stepper-handler-tap-background-color: #ddd;
@stepper-handler-size: 40 * @rpx;