@beppla/tapas-ui 1.5.2 → 1.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commonjs/Alert/README.md +75 -0
- package/commonjs/BarChart/README.md +172 -0
- package/commonjs/Button/README.md +108 -0
- package/commonjs/Calendar/Calendar.base.js +1 -1
- package/commonjs/Calendar/Calendar.base.js.map +1 -1
- package/commonjs/Calendar/README.md +410 -0
- package/commonjs/Card/README.md +126 -0
- package/commonjs/CheckBox/README.md +147 -0
- package/commonjs/CircularProgress/README.md +70 -0
- package/commonjs/Collapsible/README.md +140 -0
- package/commonjs/ComboChart/README.md +124 -0
- package/commonjs/DashboardCard/README.md +120 -0
- package/commonjs/DataTable/README.md +159 -0
- package/commonjs/DeviceSelectionModal/README.md +124 -0
- package/commonjs/DraggableFlatList/README.md +35 -0
- package/commonjs/Drawer/README.md +175 -0
- package/commonjs/Dropdown/Dropdown.js +60 -30
- package/commonjs/Dropdown/Dropdown.js.map +1 -1
- package/commonjs/Dropdown/README.md +230 -0
- package/commonjs/ExternalLink/README.md +81 -0
- package/commonjs/Gantt/README.md +155 -0
- package/commonjs/Grid/README.md +197 -0
- package/commonjs/Header/README.md +109 -0
- package/commonjs/HelloWave/README.md +28 -0
- package/commonjs/Hoverable/Hoverable.js.map +1 -1
- package/commonjs/IconText/README.md +99 -0
- package/commonjs/Image/PreviewImg/README.md +100 -0
- package/commonjs/Image/README.md +88 -0
- package/commonjs/Input/Input.js +60 -4
- package/commonjs/Input/Input.js.map +1 -1
- package/commonjs/Layout/README.md +174 -0
- package/commonjs/LineChart/README.md +181 -0
- package/commonjs/ListItem/README.md +122 -0
- package/commonjs/MessageBox/MessageBox.js +7 -1
- package/commonjs/MessageBox/MessageBox.js.map +1 -1
- package/commonjs/MessageBox/README.md +120 -0
- package/commonjs/Navigation/README.md +197 -0
- package/commonjs/NumericInput/README.md +95 -0
- package/commonjs/Overlay/README.md +84 -0
- package/commonjs/Pagination/README.md +106 -0
- package/commonjs/PieChart/README.md +212 -0
- package/commonjs/Popover/README.md +82 -0
- package/commonjs/Progress/README.md +106 -0
- package/commonjs/RadioButton/README.md +85 -0
- package/commonjs/ScanButton/README.md +72 -0
- package/commonjs/SearchInput/SearchInput.js.map +1 -1
- package/commonjs/SheetTitle/README.md +89 -0
- package/commonjs/Shell/README.md +152 -0
- package/commonjs/Shell/Shell.js.map +1 -1
- package/commonjs/StatisticCard/README.md +129 -0
- package/commonjs/Status/README.md +75 -0
- package/commonjs/Steps/README.md +76 -0
- package/commonjs/Switch/Switch.js +101 -0
- package/commonjs/Switch/Switch.js.map +1 -0
- package/commonjs/Tab/README.md +161 -0
- package/commonjs/Tag/README.md +93 -0
- package/commonjs/Task/README.md +110 -0
- package/commonjs/Text/README.md +97 -0
- package/commonjs/TextArea/README.md +127 -0
- package/commonjs/TextArea/TextArea.js +4 -2
- package/commonjs/TextArea/TextArea.js.map +1 -1
- package/commonjs/Theme/README.md +161 -0
- package/commonjs/Theme/makeStyles.js +30 -0
- package/commonjs/Theme/makeStyles.js.map +1 -0
- package/commonjs/Theme/withTheme.js +91 -0
- package/commonjs/Theme/withTheme.js.map +1 -0
- package/commonjs/Timeline/README.md +111 -0
- package/commonjs/Toast/README.md +96 -0
- package/commonjs/Upload/Upload.js +126 -0
- package/commonjs/Upload/Upload.js.map +1 -0
- package/commonjs/index.js +24 -4
- package/commonjs/index.js.map +1 -1
- package/module/Alert/README.md +75 -0
- package/module/BarChart/README.md +172 -0
- package/module/Button/README.md +108 -0
- package/module/Calendar/Calendar.base.js +1 -1
- package/module/Calendar/Calendar.base.js.map +1 -1
- package/module/Calendar/README.md +410 -0
- package/module/Card/README.md +126 -0
- package/module/CheckBox/README.md +147 -0
- package/module/CircularProgress/README.md +70 -0
- package/module/Collapsible/README.md +140 -0
- package/module/ComboChart/README.md +124 -0
- package/module/DashboardCard/README.md +120 -0
- package/module/DataTable/README.md +159 -0
- package/module/DeviceSelectionModal/README.md +124 -0
- package/module/DraggableFlatList/README.md +35 -0
- package/module/Drawer/README.md +175 -0
- package/module/Dropdown/Dropdown.js +60 -30
- package/module/Dropdown/Dropdown.js.map +1 -1
- package/module/Dropdown/README.md +230 -0
- package/module/ExternalLink/README.md +81 -0
- package/module/Gantt/README.md +155 -0
- package/module/Grid/README.md +197 -0
- package/module/Header/README.md +109 -0
- package/module/HelloWave/README.md +28 -0
- package/module/Hoverable/Hoverable.js.map +1 -1
- package/module/IconText/README.md +99 -0
- package/module/Image/PreviewImg/README.md +100 -0
- package/module/Image/README.md +88 -0
- package/module/Input/Input.js +60 -4
- package/module/Input/Input.js.map +1 -1
- package/module/Layout/README.md +174 -0
- package/module/LineChart/README.md +181 -0
- package/module/ListItem/README.md +122 -0
- package/module/MessageBox/MessageBox.js +8 -2
- package/module/MessageBox/MessageBox.js.map +1 -1
- package/module/MessageBox/README.md +120 -0
- package/module/Navigation/README.md +197 -0
- package/module/NumericInput/README.md +95 -0
- package/module/Overlay/README.md +84 -0
- package/module/Pagination/README.md +106 -0
- package/module/PieChart/README.md +212 -0
- package/module/Popover/README.md +82 -0
- package/module/Progress/README.md +106 -0
- package/module/RadioButton/README.md +85 -0
- package/module/ScanButton/README.md +72 -0
- package/module/SearchInput/SearchInput.js.map +1 -1
- package/module/SheetTitle/README.md +89 -0
- package/module/Shell/README.md +152 -0
- package/module/Shell/Shell.js.map +1 -1
- package/module/StatisticCard/README.md +129 -0
- package/module/Status/README.md +75 -0
- package/module/Steps/README.md +76 -0
- package/module/Switch/Switch.js +96 -0
- package/module/Switch/Switch.js.map +1 -0
- package/module/Tab/README.md +161 -0
- package/module/Tag/README.md +93 -0
- package/module/Task/README.md +110 -0
- package/module/Text/README.md +97 -0
- package/module/TextArea/README.md +127 -0
- package/module/TextArea/TextArea.js +4 -2
- package/module/TextArea/TextArea.js.map +1 -1
- package/module/Theme/README.md +161 -0
- package/module/Theme/makeStyles.js +24 -0
- package/module/Theme/makeStyles.js.map +1 -0
- package/module/Theme/withTheme.js +82 -0
- package/module/Theme/withTheme.js.map +1 -0
- package/module/Timeline/README.md +111 -0
- package/module/Toast/README.md +96 -0
- package/module/Upload/Upload.js +121 -0
- package/module/Upload/Upload.js.map +1 -0
- package/module/index.js +11 -3
- package/module/index.js.map +1 -1
- package/package.json +1 -1
- package/typescript/Dropdown/Dropdown.d.ts +20 -0
- package/typescript/Dropdown/Dropdown.d.ts.map +1 -1
- package/typescript/Grid/FixedSizeGrid.d.ts +1 -3
- package/typescript/Grid/FixedSizeGrid.d.ts.map +1 -1
- package/typescript/Grid/Grid.base.d.ts +1 -3
- package/typescript/Grid/Grid.base.d.ts.map +1 -1
- package/typescript/Grid/VariableSizeGrid.d.ts +1 -3
- package/typescript/Grid/VariableSizeGrid.d.ts.map +1 -1
- package/typescript/Input/Input.d.ts +5 -0
- package/typescript/Input/Input.d.ts.map +1 -1
- package/typescript/MessageBox/MessageBox.d.ts.map +1 -1
- package/typescript/SearchInput/SearchInput.d.ts +4 -0
- package/typescript/SearchInput/SearchInput.d.ts.map +1 -1
- package/typescript/Switch/Switch.d.ts +15 -0
- package/typescript/Switch/Switch.d.ts.map +1 -0
- package/typescript/TextArea/TextArea.d.ts +2 -0
- package/typescript/TextArea/TextArea.d.ts.map +1 -1
- package/typescript/Theme/makeStyles.d.ts +11 -0
- package/typescript/Theme/makeStyles.d.ts.map +1 -0
- package/typescript/Theme/withTheme.d.ts +12 -0
- package/typescript/Theme/withTheme.d.ts.map +1 -0
- package/typescript/Upload/Upload.d.ts +25 -0
- package/typescript/Upload/Upload.d.ts.map +1 -0
- package/typescript/WebViewBridge/useWebViewBridge.d.ts +1 -1
- package/typescript/WebViewBridge/useWebViewBridge.d.ts.map +1 -1
- package/typescript/common/hooks/useBridgelessFix.d.ts +1 -1
- package/typescript/index.d.ts +8 -2
- package/typescript/index.d.ts.map +1 -1
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
# Calendar
|
|
2
|
+
|
|
3
|
+
日历与时间选择器组件族,提供完整的日期时间选择能力。包含 Calendar(日历)、TimeSelector(时间段选择器)、ConcreteTimeSelector(精确时间选择器)、CustomRange(自定义日期范围)、DaySelector(日期选择器)、WeekDaySelector(星期选择器)、MonthSelector(月份选择器)共 7 个子组件。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- 支持单日选择和日期范围选择两种日历模式(`selectionMode`)
|
|
8
|
+
- 支持中文(zh)、英文(en)、西班牙语(es)三种语言国际化
|
|
9
|
+
- 内置自定义日期范围选择(年/月/日三列滚轮)
|
|
10
|
+
- 时间段选择器支持开始时间 + 持续时长的双滚轮模式
|
|
11
|
+
- 精确时间选择器支持小时/分钟独立滚轮选择(逐分钟精度)
|
|
12
|
+
- 日期选择器(1-31日)、星期选择器(周一-周日)、月份选择器(1-12月)均支持单选/多选
|
|
13
|
+
- 容器尺寸自适应(`autoSize`)或固定宽高模式
|
|
14
|
+
- 可配置时间范围(`minTime`/`maxTime`)和间隔(`interval`)
|
|
15
|
+
- 基于 `react-native-calendars` 的日历核心,支持滑动切月
|
|
16
|
+
- 虚拟滚动列表(FixedSizeGrid)保障大数据量流畅选择
|
|
17
|
+
- 支持 `@rneui/themed` 主题定制,所有子组件均通过 `withTheme` 包装
|
|
18
|
+
- 提供完善的工具函数(`formatDate`、`getTimes`、`getConcreteTimes` 等)
|
|
19
|
+
|
|
20
|
+
## 安装使用
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
import {
|
|
24
|
+
TapasCalendar,
|
|
25
|
+
TapasTimeSelector,
|
|
26
|
+
TapasConcreteTimeSelector,
|
|
27
|
+
TapasCustomRange,
|
|
28
|
+
TapasDaySelector,
|
|
29
|
+
TapasWeekDaySelector,
|
|
30
|
+
TapasMonthSelector,
|
|
31
|
+
} from '@beppla/tapas-ui';
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 类型定义
|
|
35
|
+
|
|
36
|
+
### CalendarMode 枚举
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
enum CalendarMode {
|
|
40
|
+
Month = 'month',
|
|
41
|
+
Week = 'week',
|
|
42
|
+
Day = 'day',
|
|
43
|
+
Range = 'range',
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### LanguageCode 类型
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
type LanguageCode = 'zh' | 'en' | 'es';
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### DateInfo 接口
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
interface DateInfo {
|
|
57
|
+
day?: number;
|
|
58
|
+
year?: number;
|
|
59
|
+
month?: number;
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Calendar(日历主组件)
|
|
66
|
+
|
|
67
|
+
主要的日历组件,提供基础日历选择和自定义范围选择两个 Tab 页面。
|
|
68
|
+
|
|
69
|
+
### Props
|
|
70
|
+
|
|
71
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
72
|
+
|------|------|--------|------|
|
|
73
|
+
| languageCode | `LanguageCode` | `'en'` | 语言代码,支持 zh/en/es |
|
|
74
|
+
| mode | `CalendarMode` | - | 日历模式(month/week/day/range) |
|
|
75
|
+
| current | `string` | 当前日期 | 初始显示日期,格式 `YYYY-MM-DD` |
|
|
76
|
+
| defaultSelectedDate | `string \| string[]` | - | 默认选中日期 |
|
|
77
|
+
| theme | `any` | - | 主题对象(自动注入) |
|
|
78
|
+
| autoSize | `boolean` | `true` | 是否自适应容器尺寸 |
|
|
79
|
+
| width | `number` | `360` | 固定宽度(autoSize=false 时生效) |
|
|
80
|
+
| height | `number` | `436` | 固定高度(autoSize=false 时生效) |
|
|
81
|
+
| hideDayNames | `boolean` | `false` | 是否隐藏星期名称行 |
|
|
82
|
+
| hideRange | `boolean` | `false` | 是否隐藏"自定义范围"按钮 |
|
|
83
|
+
| selectionMode | `'single' \| 'range'` | `'single'` | 选择模式:单日或范围 |
|
|
84
|
+
| attachSelectedDate | `(date: string \| string[]) => void` | - | 选中日期回调 |
|
|
85
|
+
| attachCancel | `() => void` | - | 取消/清除选择回调 |
|
|
86
|
+
|
|
87
|
+
> Calendar 继承 `react-native-calendars` 的 `CalendarProps`,支持所有原生日历属性。
|
|
88
|
+
|
|
89
|
+
### 使用示例
|
|
90
|
+
|
|
91
|
+
#### 基础日历(单日选择)
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
<TapasCalendar
|
|
95
|
+
languageCode="zh"
|
|
96
|
+
hideRange={true}
|
|
97
|
+
attachSelectedDate={(date) => alert(date)}
|
|
98
|
+
/>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
#### 固定尺寸 + 显示范围按钮
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
<TapasCalendar
|
|
105
|
+
languageCode="es"
|
|
106
|
+
autoSize={false}
|
|
107
|
+
width={400}
|
|
108
|
+
height={500}
|
|
109
|
+
hideRange={false}
|
|
110
|
+
attachSelectedDate={(date) => console.log(date)}
|
|
111
|
+
/>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
#### 范围选择模式
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
<TapasCalendar
|
|
118
|
+
languageCode="zh"
|
|
119
|
+
selectionMode="range"
|
|
120
|
+
defaultSelectedDate={['2026-04-01', '2026-04-07']}
|
|
121
|
+
attachSelectedDate={(dates) => console.log('选中范围:', dates)}
|
|
122
|
+
/>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## TimeSelector(时间段选择器)
|
|
128
|
+
|
|
129
|
+
通过开始时间和持续时长两个滚轮来选择时间段。
|
|
130
|
+
|
|
131
|
+
### Props
|
|
132
|
+
|
|
133
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
134
|
+
|------|------|--------|------|
|
|
135
|
+
| languageCode | `LanguageCode` | `'en'` | 语言代码 |
|
|
136
|
+
| rangeVal | `string[]` | - | 初始时间范围值(必填) |
|
|
137
|
+
| backFn | `() => void` | - | 返回按钮回调 |
|
|
138
|
+
| attachComplete | `(range: string[]) => void` | - | 完成选择回调,返回 `[开始时间, 结束时间]` |
|
|
139
|
+
| showCloseBtn | `boolean` | `false` | 是否显示关闭按钮 |
|
|
140
|
+
| closeBtnText | `string` | - | 关闭按钮文本 |
|
|
141
|
+
| attatchClose | `() => void` | - | 关闭按钮回调 |
|
|
142
|
+
| minTime | `string` | `'8:00'` | 最小可选时间 |
|
|
143
|
+
| maxTime | `string` | `'24:00'` | 最大可选时间 |
|
|
144
|
+
| interval | `number` | `30` | 时间间隔(分钟) |
|
|
145
|
+
| theme | `any` | - | 主题对象(自动注入) |
|
|
146
|
+
|
|
147
|
+
### 使用示例
|
|
148
|
+
|
|
149
|
+
```tsx
|
|
150
|
+
<TapasTimeSelector
|
|
151
|
+
languageCode="en"
|
|
152
|
+
rangeVal={[]}
|
|
153
|
+
minTime="8:00"
|
|
154
|
+
maxTime="22:00"
|
|
155
|
+
interval={30}
|
|
156
|
+
attachComplete={(range) => console.log('时间段:', range)}
|
|
157
|
+
/>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## ConcreteTimeSelector(精确时间选择器)
|
|
163
|
+
|
|
164
|
+
通过小时和分钟两个独立滚轮选择具体时间点,精度为逐分钟。
|
|
165
|
+
|
|
166
|
+
### Props
|
|
167
|
+
|
|
168
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
169
|
+
|------|------|--------|------|
|
|
170
|
+
| languageCode | `keyof typeof SupportLanguage` | `'en'` | 语言代码 |
|
|
171
|
+
| hour | `string` | - | 初始小时值,如 `'08'` |
|
|
172
|
+
| minute | `string` | - | 初始分钟值,如 `'30'` |
|
|
173
|
+
| backFn | `() => void` | - | 返回按钮回调 |
|
|
174
|
+
| attachComplete | `(range: string[]) => void` | - | 完成回调,返回 `[小时, 分钟]` |
|
|
175
|
+
| showCloseBtn | `boolean` | `false` | 是否显示关闭按钮 |
|
|
176
|
+
| closeBtnText | `string` | - | 关闭按钮文本 |
|
|
177
|
+
| attatchClose | `() => void` | - | 关闭按钮回调 |
|
|
178
|
+
| minTime | `string` | `'00:00'` | 最小可选时间 |
|
|
179
|
+
| maxTime | `string` | `'23:59'` | 最大可选时间 |
|
|
180
|
+
| theme | `any` | - | 主题对象(自动注入) |
|
|
181
|
+
|
|
182
|
+
### 使用示例
|
|
183
|
+
|
|
184
|
+
```tsx
|
|
185
|
+
<TapasConcreteTimeSelector
|
|
186
|
+
hour="08"
|
|
187
|
+
minute="30"
|
|
188
|
+
minTime="00:00"
|
|
189
|
+
maxTime="23:59"
|
|
190
|
+
languageCode="en"
|
|
191
|
+
showCloseBtn={true}
|
|
192
|
+
closeBtnText="Close"
|
|
193
|
+
attachComplete={([hour, minute]) => {
|
|
194
|
+
alert(`Selected Time: ${hour}:${minute}`);
|
|
195
|
+
}}
|
|
196
|
+
/>
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## CustomRange(自定义日期范围)
|
|
202
|
+
|
|
203
|
+
通过年/月/日三个滚轮选择日期范围的起止日期,分步操作(先选开始日期,再选结束日期)。
|
|
204
|
+
|
|
205
|
+
### Props
|
|
206
|
+
|
|
207
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
208
|
+
|------|------|--------|------|
|
|
209
|
+
| languageCode | `LanguageCode` | `'en'` | 语言代码 |
|
|
210
|
+
| backFn | `() => void` | - | 返回按钮回调(必填) |
|
|
211
|
+
| rangeVal | `string[]` | - | 初始范围值 |
|
|
212
|
+
| attachComplete | `(range: (DateInfo \| null)[]) => void` | - | 完成回调,返回 `[起始DateInfo, 结束DateInfo]` |
|
|
213
|
+
| theme | `any` | - | 主题对象(自动注入) |
|
|
214
|
+
|
|
215
|
+
### 使用示例
|
|
216
|
+
|
|
217
|
+
```tsx
|
|
218
|
+
<TapasCustomRange
|
|
219
|
+
languageCode="zh"
|
|
220
|
+
backFn={() => console.log('返回')}
|
|
221
|
+
rangeVal={[]}
|
|
222
|
+
attachComplete={(range) => {
|
|
223
|
+
const [start, end] = range;
|
|
224
|
+
console.log('起始:', start, '结束:', end);
|
|
225
|
+
}}
|
|
226
|
+
/>
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## DaySelector(日期选择器)
|
|
232
|
+
|
|
233
|
+
以网格形式展示 1-31 日,支持单选和多选。
|
|
234
|
+
|
|
235
|
+
### Props
|
|
236
|
+
|
|
237
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
238
|
+
|------|------|--------|------|
|
|
239
|
+
| selectMode | `'single' \| 'multi'` | `'single'` | 选择模式 |
|
|
240
|
+
| defaultSelected | `number \| number[]` | `-1` | 默认选中日期(single 为 number,multi 为 number[]) |
|
|
241
|
+
| attachComplete | `(selected: null \| number \| number[]) => void` | - | 完成选择回调 |
|
|
242
|
+
| languageCode | `LanguageCode` | - | 语言代码(必填) |
|
|
243
|
+
| theme | `any` | - | 主题对象(自动注入) |
|
|
244
|
+
|
|
245
|
+
### 使用示例
|
|
246
|
+
|
|
247
|
+
```tsx
|
|
248
|
+
// 多选模式
|
|
249
|
+
<TapasDaySelector
|
|
250
|
+
languageCode="en"
|
|
251
|
+
selectMode="multi"
|
|
252
|
+
defaultSelected={[2]}
|
|
253
|
+
attachComplete={(days) => console.log('选中日期:', days)}
|
|
254
|
+
/>
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## WeekDaySelector(星期选择器)
|
|
260
|
+
|
|
261
|
+
以列表形式展示星期一至星期日,支持单选和多选。
|
|
262
|
+
|
|
263
|
+
### Props
|
|
264
|
+
|
|
265
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
266
|
+
|------|------|--------|------|
|
|
267
|
+
| selectMode | `'single' \| 'multi'` | `'single'` | 选择模式 |
|
|
268
|
+
| defaultSelected | `number \| number[]` | `-1` | 默认选中(1=周一, 7=周日) |
|
|
269
|
+
| attachComplete | `(selected: null \| number \| number[]) => void` | - | 完成选择回调 |
|
|
270
|
+
| languageCode | `LanguageCode` | - | 语言代码(必填) |
|
|
271
|
+
| theme | `any` | - | 主题对象(自动注入) |
|
|
272
|
+
|
|
273
|
+
### 使用示例
|
|
274
|
+
|
|
275
|
+
```tsx
|
|
276
|
+
<TapasWeekDaySelector
|
|
277
|
+
languageCode="en"
|
|
278
|
+
selectMode="multi"
|
|
279
|
+
defaultSelected={[1, 2]}
|
|
280
|
+
attachComplete={(days) => console.log('选中星期:', days)}
|
|
281
|
+
/>
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## MonthSelector(月份选择器)
|
|
287
|
+
|
|
288
|
+
以网格形式展示 1-12 月,支持单选和多选。
|
|
289
|
+
|
|
290
|
+
### Props
|
|
291
|
+
|
|
292
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
293
|
+
|------|------|--------|------|
|
|
294
|
+
| selectMode | `'single' \| 'multi'` | `'single'` | 选择模式 |
|
|
295
|
+
| defaultSelected | `number \| number[]` | `-1` | 默认选中月份(1-12) |
|
|
296
|
+
| attachComplete | `(selected: null \| number \| number[]) => void` | - | 完成选择回调 |
|
|
297
|
+
| languageCode | `LanguageCode` | - | 语言代码(必填) |
|
|
298
|
+
| theme | `any` | - | 主题对象(自动注入) |
|
|
299
|
+
|
|
300
|
+
### 使用示例
|
|
301
|
+
|
|
302
|
+
```tsx
|
|
303
|
+
<TapasMonthSelector
|
|
304
|
+
languageCode="en"
|
|
305
|
+
selectMode="multi"
|
|
306
|
+
defaultSelected={[1, 2]}
|
|
307
|
+
attachComplete={(months) => console.log('选中月份:', months)}
|
|
308
|
+
/>
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## 综合使用示例
|
|
314
|
+
|
|
315
|
+
### 日历 + 时间选择组合
|
|
316
|
+
|
|
317
|
+
```tsx
|
|
318
|
+
import { useState } from 'react';
|
|
319
|
+
import { View } from 'react-native';
|
|
320
|
+
import TapasCalendar from './Calendar';
|
|
321
|
+
import TimeSelector from './TimeSelector';
|
|
322
|
+
|
|
323
|
+
export const DateTimePicker = () => {
|
|
324
|
+
const [date, setDate] = useState('');
|
|
325
|
+
const [timeRange, setTimeRange] = useState<string[]>([]);
|
|
326
|
+
|
|
327
|
+
return (
|
|
328
|
+
<View style={{ flex: 1 }}>
|
|
329
|
+
<View style={{ height: 400 }}>
|
|
330
|
+
<TapasCalendar
|
|
331
|
+
languageCode="zh"
|
|
332
|
+
hideRange={true}
|
|
333
|
+
attachSelectedDate={(d) => setDate(d as string)}
|
|
334
|
+
/>
|
|
335
|
+
</View>
|
|
336
|
+
<View style={{ height: 300 }}>
|
|
337
|
+
<TimeSelector
|
|
338
|
+
languageCode="zh"
|
|
339
|
+
rangeVal={[]}
|
|
340
|
+
minTime="8:00"
|
|
341
|
+
maxTime="22:00"
|
|
342
|
+
attachComplete={(range) => setTimeRange(range)}
|
|
343
|
+
/>
|
|
344
|
+
</View>
|
|
345
|
+
</View>
|
|
346
|
+
);
|
|
347
|
+
};
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### 工作排班选择器
|
|
351
|
+
|
|
352
|
+
```tsx
|
|
353
|
+
import { View } from 'react-native';
|
|
354
|
+
import WeekDaySelector from './WeekDaySelector';
|
|
355
|
+
import ConcreteTimeSelector from './ConcreteTimeSelector';
|
|
356
|
+
|
|
357
|
+
export const SchedulePicker = () => (
|
|
358
|
+
<View style={{ flex: 1 }}>
|
|
359
|
+
<WeekDaySelector
|
|
360
|
+
selectMode="multi"
|
|
361
|
+
defaultSelected={[1, 2, 3, 4, 5]}
|
|
362
|
+
languageCode="zh"
|
|
363
|
+
attachComplete={(days) => console.log('工作日:', days)}
|
|
364
|
+
/>
|
|
365
|
+
<ConcreteTimeSelector
|
|
366
|
+
hour="09"
|
|
367
|
+
minute="00"
|
|
368
|
+
languageCode="zh"
|
|
369
|
+
attachComplete={([h, m]) => console.log(`上班时间: ${h}:${m}`)}
|
|
370
|
+
/>
|
|
371
|
+
</View>
|
|
372
|
+
);
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
### 季度月份选择
|
|
376
|
+
|
|
377
|
+
```tsx
|
|
378
|
+
import MonthSelector from './MonthSelector';
|
|
379
|
+
|
|
380
|
+
<MonthSelector
|
|
381
|
+
selectMode="multi"
|
|
382
|
+
defaultSelected={[1, 4, 7, 10]}
|
|
383
|
+
languageCode="es"
|
|
384
|
+
attachComplete={(months) => console.log('Quarterly months:', months)}
|
|
385
|
+
/>
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
## 工具函数(helper.ts)
|
|
389
|
+
|
|
390
|
+
| 函数 | 签名 | 说明 |
|
|
391
|
+
|------|------|------|
|
|
392
|
+
| `formatDate` | `(date: Date) => string` | 格式化日期为 `YYYY-MM-DD` |
|
|
393
|
+
| `formatTitle` | `(dateStr: string, languageCode: LanguageCode) => string` | 格式化日历标题(如 `Jan 2026`) |
|
|
394
|
+
| `calcHeaderWidth` | `(width: number) => number` | 计算日历头部宽度 |
|
|
395
|
+
| `getTimes` | `(startTime: string, interval?: number) => string[]` | 生成时间列表 |
|
|
396
|
+
| `getConcreteTimes` | `(startTime: string, endTime: string, returnType?: string) => string[]` | 生成精确时间列表 |
|
|
397
|
+
| `getIntervalValues` | `(minTime: string, maxTime: string) => DurationItem[]` | 生成持续时长选项 |
|
|
398
|
+
| `getDays` | `(date: Date, languageCode: LanguageCode) => string[]` | 获取月份天数列表 |
|
|
399
|
+
| `getYears` | `(date: Date, languageCode: LanguageCode) => string[]` | 获取年份列表(1900至今) |
|
|
400
|
+
|
|
401
|
+
## 注意事项
|
|
402
|
+
|
|
403
|
+
- Calendar 组件依赖 `react-native-calendars`,需确保已安装
|
|
404
|
+
- 范围选择模式(`selectionMode='range'`)需选择两个日期后点击确认按钮才触发回调
|
|
405
|
+
- TimeSelector 的 `rangeVal` 为必填属性,初始值传空数组 `[]`
|
|
406
|
+
- ConcreteTimeSelector 的 `minTime`/`maxTime` 需符合 `HH:MM` 格式(24小时制),正则校验不通过会返回空数组
|
|
407
|
+
- 所有滚轮选择器使用虚拟滚动(FixedSizeGrid),中间行为当前选中项
|
|
408
|
+
- `TapasCustomRnageProps` 为已废弃的拼写错误别名,请使用 `TapasCustomRangeProps`
|
|
409
|
+
- CustomRange 的 reset 功能中滚动重置尚未完善(源码含 TODO 注释)
|
|
410
|
+
- 回调函数返回值类型各异:Calendar 返回 `string | string[]`,TimeSelector/ConcreteTimeSelector 返回 `string[]`,CustomRange 返回 `(DateInfo | null)[]`,Selector 系列返回 `number | number[]`
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Card
|
|
2
|
+
|
|
3
|
+
通用卡片组件,支持图标、状态指示、导航按钮和更多选项菜单,适用于仪表板入口、功能模块展示等场景。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 支持自定义图标显示(TapasIcon)
|
|
8
|
+
- ✅ 状态指示器(normal / warning / error / success),带对应颜色背景标签
|
|
9
|
+
- ✅ 可选的导航按钮(showNavBtn),带圆形边框样式
|
|
10
|
+
- ✅ 更多选项按钮(showMore),支持自定义图标
|
|
11
|
+
- ✅ 鼠标悬停阴影效果
|
|
12
|
+
- ✅ 自定义卡片宽度,固定高度 128px
|
|
13
|
+
- ✅ 标题与副标题显示,自动单行截断
|
|
14
|
+
- ✅ 点击事件回调,返回 `path--cardId` 格式
|
|
15
|
+
- ✅ 继承 ViewProps,支持自定义样式
|
|
16
|
+
- ✅ 基于 @rneui/themed 主题系统
|
|
17
|
+
|
|
18
|
+
## 安装使用
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
import Card from '@beppla/tapas-ui/components/Card/Card';
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Props
|
|
25
|
+
|
|
26
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
27
|
+
|------|------|--------|------|
|
|
28
|
+
| cardId | `string` | (必填) | 卡片唯一标识 |
|
|
29
|
+
| title | `string` | - | 卡片标题 |
|
|
30
|
+
| subTitle | `string` | - | 卡片副标题 |
|
|
31
|
+
| icon | `string` | - | 卡片图标名称(TapasIcon) |
|
|
32
|
+
| showMore | `boolean` | - | 是否显示更多选项按钮 |
|
|
33
|
+
| moreBtnIcon | `string` | `'more_vert'` | 更多按钮图标名称 |
|
|
34
|
+
| showMoreOptions | `(key: string) => void` | - | 更多选项按钮点击回调,参数为 cardId |
|
|
35
|
+
| path | `string` | - | 路径标识,拼接到 onPress 回调参数中 |
|
|
36
|
+
| showNavBtn | `boolean` | - | 是否显示导航按钮 |
|
|
37
|
+
| navBtnIcon | `string` | `'back'` | 导航按钮图标名称 |
|
|
38
|
+
| state | `'normal' \| 'warning' \| 'error' \| 'success'` | - | 卡片状态 |
|
|
39
|
+
| stateText | `string` | - | 状态指示文本 |
|
|
40
|
+
| width | `number` | `285` | 卡片宽度(像素) |
|
|
41
|
+
| onPress | `(key: string) => void` | - | 卡片点击回调,参数为 `${path}--${cardId}` |
|
|
42
|
+
| actions | `Action[]` | - | 操作按钮数组 |
|
|
43
|
+
| style | `ViewStyle` | - | 自定义样式(继承自 ViewProps) |
|
|
44
|
+
|
|
45
|
+
### Action 接口
|
|
46
|
+
|
|
47
|
+
| 属性 | 类型 | 说明 |
|
|
48
|
+
|------|------|------|
|
|
49
|
+
| key | `string` | 操作唯一标识 |
|
|
50
|
+
| name | `string` | 操作名称 |
|
|
51
|
+
| icon | `string` | 操作图标名称 |
|
|
52
|
+
|
|
53
|
+
## 使用示例
|
|
54
|
+
|
|
55
|
+
### 基础用法
|
|
56
|
+
|
|
57
|
+
```tsx
|
|
58
|
+
<Card
|
|
59
|
+
cardId="card-1"
|
|
60
|
+
title="示例卡片"
|
|
61
|
+
subTitle="这是一个示例卡片"
|
|
62
|
+
icon="dashboard"
|
|
63
|
+
showNavBtn
|
|
64
|
+
width={285}
|
|
65
|
+
/>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 带状态指示
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
<Card
|
|
72
|
+
cardId="card-2"
|
|
73
|
+
title="运行状态"
|
|
74
|
+
subTitle="服务器状态"
|
|
75
|
+
icon="dashboard"
|
|
76
|
+
state="success"
|
|
77
|
+
stateText="运行正常"
|
|
78
|
+
/>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 带更多选项
|
|
82
|
+
|
|
83
|
+
```tsx
|
|
84
|
+
<Card
|
|
85
|
+
cardId="card-3"
|
|
86
|
+
title="功能模块"
|
|
87
|
+
subTitle="点击查看更多"
|
|
88
|
+
icon="restaurant_menu"
|
|
89
|
+
showMore
|
|
90
|
+
showMoreOptions={(cardId) => console.log(`More: ${cardId}`)}
|
|
91
|
+
/>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### 不同尺寸
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
<Card cardId="small-card" width={200} title="小尺寸卡片" />
|
|
98
|
+
<Card cardId="standard-card" width={285} title="标准尺寸卡片" />
|
|
99
|
+
<Card cardId="large-card" width={350} title="大尺寸卡片" />
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 交互卡片
|
|
103
|
+
|
|
104
|
+
```tsx
|
|
105
|
+
<Card
|
|
106
|
+
cardId="card-4"
|
|
107
|
+
title="可点击卡片"
|
|
108
|
+
subTitle="点击触发事件"
|
|
109
|
+
icon="dashboard"
|
|
110
|
+
showMore
|
|
111
|
+
showNavBtn
|
|
112
|
+
state="warning"
|
|
113
|
+
stateText="需要注意"
|
|
114
|
+
onPress={(key) => console.log(`Pressed: ${key}`)}
|
|
115
|
+
showMoreOptions={(cardId) => console.log(`More: ${cardId}`)}
|
|
116
|
+
/>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## 注意事项
|
|
120
|
+
|
|
121
|
+
- `cardId` 属性是必填项,用于唯一标识卡片
|
|
122
|
+
- `onPress` 回调返回的 key 格式为 `${path}--${cardId}`
|
|
123
|
+
- `state` 和 `stateText` 需同时设置才会显示状态标签
|
|
124
|
+
- 卡片固定高度为 128px,宽度通过 `width` 属性控制,默认 285px
|
|
125
|
+
- 更多选项按钮点击事件通过 `stopPropagation` 阻止冒泡到卡片点击
|
|
126
|
+
- 组件使用 `@rneui/themed` 主题系统,需在 ThemeProvider 内使用
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# CheckBox / CheckBoxItem / GroupCheckBox
|
|
2
|
+
|
|
3
|
+
复选框组件系列,包含三个子组件:CheckBox(单个复选框)、CheckBoxItem(列表项复选框)、GroupCheckBox(分组复选框)。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ CheckBox 支持 light 和 dark 两种主题模式
|
|
8
|
+
- ✅ CheckBox 支持全选和半选(indeterminate)图标
|
|
9
|
+
- ✅ Web 端 hover 交互效果
|
|
10
|
+
- ✅ 支持禁用状态
|
|
11
|
+
- ✅ 受控模式,通过 checked 属性控制选中状态
|
|
12
|
+
- ✅ CheckBoxItem 适用于列表场景,带完整的列表项样式
|
|
13
|
+
- ✅ GroupCheckBox 支持分组展示,自动管理多选状态
|
|
14
|
+
- ✅ GroupCheckBox 支持分组名称显示
|
|
15
|
+
- ✅ 支持无障碍访问(accessibilityRole="checkbox")
|
|
16
|
+
- ✅ 使用 React.memo 优化渲染性能
|
|
17
|
+
|
|
18
|
+
## 安装使用
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
import CheckBox from '@beppla/tapas-ui/components/CheckBox/CheckBox';
|
|
22
|
+
import CheckBoxItem from '@beppla/tapas-ui/components/CheckBox/CheckBoxItem';
|
|
23
|
+
import GroupCheckBox from '@beppla/tapas-ui/components/CheckBox/GroupCheckBox';
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Props
|
|
27
|
+
|
|
28
|
+
### CheckBox Props
|
|
29
|
+
|
|
30
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
31
|
+
|------|------|--------|------|
|
|
32
|
+
| label | `string` | - | 复选框标签文字 |
|
|
33
|
+
| checked | `boolean` | `false` | 是否选中 |
|
|
34
|
+
| disabled | `boolean` | - | 是否禁用 |
|
|
35
|
+
| onPress | `() => void` | - | 点击回调 |
|
|
36
|
+
| hoverStyle | `StyleProp<ViewStyle>` | - | hover 时的自定义样式 |
|
|
37
|
+
| type | `'checkbox' \| 'radio'` | - | 复选框类型 |
|
|
38
|
+
| mode | `'dark' \| 'light'` | - | 主题模式 |
|
|
39
|
+
| full | `boolean` | `true` | 是否全选图标,false 时显示半选图标 |
|
|
40
|
+
| children | `React.ReactNode` | - | 子内容 |
|
|
41
|
+
| style | - | - | 自定义容器样式(继承自 TextProps) |
|
|
42
|
+
|
|
43
|
+
### CheckBoxItem Props
|
|
44
|
+
|
|
45
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
46
|
+
|------|------|--------|------|
|
|
47
|
+
| selected | `boolean` | - | 是否选中 |
|
|
48
|
+
| item | `CheckBoxItemProps` | - | 选项数据(含 value、title、disabled) |
|
|
49
|
+
| key | `number \| string` | - | 唯一标识 |
|
|
50
|
+
| onItemPress | `(item: { value: string; title: string; disabled?: boolean }) => void` | - | 点击回调 |
|
|
51
|
+
| disabled | `boolean` | - | 是否禁用 |
|
|
52
|
+
|
|
53
|
+
### CheckBoxItemProps 数据类型
|
|
54
|
+
|
|
55
|
+
| 属性 | 类型 | 说明 |
|
|
56
|
+
|------|------|------|
|
|
57
|
+
| value | `string` | 选项值 |
|
|
58
|
+
| title | `string` | 选项标题 |
|
|
59
|
+
| disabled | `boolean` | 是否禁用 |
|
|
60
|
+
|
|
61
|
+
### GroupCheckBox Props
|
|
62
|
+
|
|
63
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
64
|
+
|------|------|--------|------|
|
|
65
|
+
| options | `OptionItem[]` | - | 分组选项数据 |
|
|
66
|
+
| selectedValues | `string[]` | - | 已选中的值数组 |
|
|
67
|
+
| onChange | `(value: string[]) => void` | - | 选中值变化回调 |
|
|
68
|
+
|
|
69
|
+
### OptionItem / item 数据类型
|
|
70
|
+
|
|
71
|
+
| 属性 | 类型 | 说明 |
|
|
72
|
+
|------|------|------|
|
|
73
|
+
| groupName | `string` | 分组名称(可选) |
|
|
74
|
+
| items | `item[]` | 分组下的选项列表 |
|
|
75
|
+
|
|
76
|
+
## 使用示例
|
|
77
|
+
|
|
78
|
+
### 基础 CheckBox
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
<CheckBox label="Hello" checked={false} mode="light" onPress={() => {}} />
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 半选状态
|
|
85
|
+
|
|
86
|
+
```tsx
|
|
87
|
+
<CheckBox label="部分选中" checked={true} full={false} mode="light" />
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Dark 模式
|
|
91
|
+
|
|
92
|
+
```tsx
|
|
93
|
+
<CheckBox label="Dark Mode" checked={false} mode="dark" />
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### CheckBoxItem 列表
|
|
97
|
+
|
|
98
|
+
```tsx
|
|
99
|
+
const data = [
|
|
100
|
+
{ title: 'Jone', value: 'Jone', disabled: false },
|
|
101
|
+
{ title: 'Bob', value: 'Bob', disabled: true },
|
|
102
|
+
];
|
|
103
|
+
|
|
104
|
+
{data.map((item, index) => (
|
|
105
|
+
<CheckBoxItem
|
|
106
|
+
key={index}
|
|
107
|
+
item={item}
|
|
108
|
+
selected={selectedItems.includes(item.value)}
|
|
109
|
+
disabled={item.disabled}
|
|
110
|
+
onItemPress={(value) => handleSelect(value)}
|
|
111
|
+
/>
|
|
112
|
+
))}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 分组复选框
|
|
116
|
+
|
|
117
|
+
```tsx
|
|
118
|
+
const options = [
|
|
119
|
+
{
|
|
120
|
+
groupName: 'Group 1',
|
|
121
|
+
items: [
|
|
122
|
+
{ title: 'Jone', value: 'Jone', disabled: false, id: '1' },
|
|
123
|
+
{ title: 'Bob', value: 'Bob', disabled: true, id: '2' },
|
|
124
|
+
],
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
groupName: 'Group 2',
|
|
128
|
+
items: [
|
|
129
|
+
{ title: 'Anan', value: 'Anan', disabled: false, id: '3' },
|
|
130
|
+
],
|
|
131
|
+
},
|
|
132
|
+
];
|
|
133
|
+
|
|
134
|
+
<GroupCheckBox
|
|
135
|
+
options={options}
|
|
136
|
+
selectedValues={[]}
|
|
137
|
+
onChange={(selectedValues) => console.log(selectedValues)}
|
|
138
|
+
/>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## 注意事项
|
|
142
|
+
|
|
143
|
+
- CheckBox 的 hover 效果仅在 Web 平台生效
|
|
144
|
+
- GroupCheckBox 的 selectedValues 格式为 `groupName__value__id` 或 `value__id`
|
|
145
|
+
- CheckBoxItem 的 `selected` 属性为布尔值,需要外部管理选中状态
|
|
146
|
+
- GroupCheckBox 内置了选中状态管理,通过 onChange 回调通知外部
|
|
147
|
+
- item 数据类型中 `id` 字段在 GroupCheckBox 中是必须的
|