@nutui/nutui-react-taro 1.5.2 → 1.5.3-beta.0

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.
Files changed (232) hide show
  1. package/CHANGELOG.md +0 -1
  2. package/dist/esm/ActionSheet.js +14 -90
  3. package/dist/esm/Address.js +21 -620
  4. package/dist/esm/Animate.js +7 -53
  5. package/dist/esm/AnimatingNumbers.js +7 -125
  6. package/dist/esm/Audio.js +19 -264
  7. package/dist/esm/Avatar.js +11 -130
  8. package/dist/esm/{AvatarContext-15733596.js → AvatarContext-c96afdcc.js} +3 -1
  9. package/dist/esm/AvatarGroup.js +11 -41
  10. package/dist/esm/BackTop.js +10 -138
  11. package/dist/esm/Badge.js +9 -71
  12. package/dist/esm/Barrage.js +8 -97
  13. package/dist/esm/Button.js +9 -108
  14. package/dist/esm/Calendar.js +20 -128
  15. package/dist/esm/CalendarItem.js +12 -674
  16. package/dist/esm/Card.js +11 -61
  17. package/dist/esm/Cascader.js +16 -671
  18. package/dist/esm/Cell.js +9 -101
  19. package/dist/esm/CellGroup.js +5 -2
  20. package/dist/esm/Checkbox.js +7 -5
  21. package/dist/esm/CheckboxGroup.js +8 -111
  22. package/dist/esm/CircleProgress.js +8 -114
  23. package/dist/esm/Col.js +7 -57
  24. package/dist/esm/Collapse.js +7 -97
  25. package/dist/esm/CollapseItem.js +8 -146
  26. package/dist/esm/ConfigProvider.js +8 -187
  27. package/dist/esm/CountDown.js +9 -247
  28. package/dist/esm/DatePicker.js +25 -309
  29. package/dist/esm/Dialog.js +17 -296
  30. package/dist/esm/Divider.js +7 -34
  31. package/dist/esm/Drag.js +7 -118
  32. package/dist/esm/Elevator.js +8 -234
  33. package/dist/esm/Ellipsis.js +10 -176
  34. package/dist/esm/Empty.js +8 -79
  35. package/dist/esm/FixedNav.js +14 -103
  36. package/dist/esm/Form.js +10 -215
  37. package/dist/esm/FormItem.js +10 -3
  38. package/dist/esm/Grid.js +11 -81
  39. package/dist/esm/GridItem.js +13 -123
  40. package/dist/esm/Icon.js +5 -2
  41. package/dist/esm/Image.js +11 -169
  42. package/dist/esm/ImagePreview.js +19 -225
  43. package/dist/esm/Indicator.js +7 -50
  44. package/dist/esm/Infiniteloading.js +14 -215
  45. package/dist/esm/Input.js +12 -362
  46. package/dist/esm/InputNumber.js +9 -275
  47. package/dist/esm/Layout.js +5 -13
  48. package/dist/esm/Menu.js +10 -153
  49. package/dist/esm/MenuItem.js +15 -175
  50. package/dist/esm/NavBar.js +9 -114
  51. package/dist/esm/NoticeBar.js +10 -568
  52. package/dist/esm/Notify.js +8 -234
  53. package/dist/esm/NumberKeyboard.js +17 -247
  54. package/dist/esm/Overlay.js +6 -2
  55. package/dist/esm/Pagination.js +9 -168
  56. package/dist/esm/Picker.js +22 -494
  57. package/dist/esm/Popover.js +12 -223
  58. package/dist/esm/Popup.js +13 -193
  59. package/dist/esm/Price.js +6 -84
  60. package/dist/esm/Progress.js +9 -122
  61. package/dist/esm/PullToRefresh.js +13 -276
  62. package/dist/esm/Radio.js +8 -4
  63. package/dist/esm/RadioGroup.js +7 -120
  64. package/dist/esm/Range.js +15 -406
  65. package/dist/esm/Rate.js +9 -121
  66. package/dist/esm/Row.js +7 -49
  67. package/dist/esm/SearchBar.js +12 -235
  68. package/dist/esm/ShortPassword.js +17 -191
  69. package/dist/esm/SideNavBar.js +19 -57
  70. package/dist/esm/SideNavBarItem.js +5 -24
  71. package/dist/esm/Signature.js +13 -153
  72. package/dist/esm/Skeleton.js +12 -98
  73. package/dist/esm/Step.js +10 -87
  74. package/dist/esm/Steps.js +8 -38
  75. package/dist/esm/Sticky.js +11 -190
  76. package/dist/esm/SubSideNavBar.js +6 -78
  77. package/dist/esm/Swipe.js +10 -230
  78. package/dist/esm/Swiper.js +9 -490
  79. package/dist/esm/SwiperItem.js +8 -36
  80. package/dist/esm/Switch.js +6 -71
  81. package/dist/esm/TabPane.js +5 -2
  82. package/dist/esm/Tabbar.js +6 -68
  83. package/dist/esm/TabbarItem.js +9 -78
  84. package/dist/esm/Table.js +12 -140
  85. package/dist/esm/Tabs.js +8 -5
  86. package/dist/esm/Tag.js +10 -110
  87. package/dist/esm/TextArea.js +9 -148
  88. package/dist/esm/TimeDetail.js +9 -67
  89. package/dist/esm/TimePannel.js +9 -29
  90. package/dist/esm/TimeSelect.js +19 -171
  91. package/dist/esm/Toast.js +7 -268
  92. package/dist/esm/TrendArrow.js +7 -99
  93. package/dist/esm/Uploader.js +17 -566
  94. package/dist/esm/{UserContext-101ad4a4.js → UserContext-0aac9a82.js} +3 -1
  95. package/dist/esm/{UserContext-2629d479.js → UserContext-e402e1a6.js} +3 -1
  96. package/dist/esm/{UserContext-b33bcf21.js → UserContext-e8176108.js} +3 -1
  97. package/dist/esm/Video.js +7 -90
  98. package/dist/esm/VirtualList.js +9 -313
  99. package/dist/esm/WaterMark.js +11 -111
  100. package/dist/esm/actionsheet.taro-e6a51446.js +53 -0
  101. package/dist/esm/address.taro-3a9b6396.js +461 -0
  102. package/dist/esm/animate.taro-fb7986d6.js +40 -0
  103. package/dist/esm/animatingnumbers.taro-03e5d61d.js +104 -0
  104. package/dist/esm/audio.taro-87ec8bf2.js +161 -0
  105. package/dist/esm/avatar.taro-3676f38f.js +103 -0
  106. package/dist/esm/avatargroup-f3574510.js +34 -0
  107. package/dist/esm/backtop.taro-66394a36.js +48 -0
  108. package/dist/esm/badge.taro-a4e59c11.js +52 -0
  109. package/dist/esm/barrage.taro-0495a1b2.js +94 -0
  110. package/dist/esm/{bem-3b438e61.js → bem-350c1702.js} +3 -6
  111. package/dist/esm/button.taro-9244d065.js +100 -0
  112. package/dist/esm/calendar.taro-670842ea.js +65 -0
  113. package/dist/esm/calendaritem.taro-2a603571.js +787 -0
  114. package/dist/esm/can-use-dom-3eeb5af4.js +6 -0
  115. package/dist/esm/card.taro-e4c76dad.js +33 -0
  116. package/dist/esm/cascader.taro-eb1fb011.js +438 -0
  117. package/dist/esm/cell.taro-a10a74d3.js +64 -0
  118. package/dist/esm/cellgroup.taro-abe501bc.js +25 -0
  119. package/dist/esm/checkbox.taro-6120e3e3.js +171 -0
  120. package/dist/esm/circleprogress.taro-79854448.js +109 -0
  121. package/dist/esm/col.taro-53eed3cc.js +41 -0
  122. package/dist/esm/collapse.taro-1a9e4ba2.js +83 -0
  123. package/dist/esm/collapseitem-4d0bc55d.js +83 -0
  124. package/dist/esm/configprovider-67d19d3a.js +19 -0
  125. package/dist/esm/configprovider.taro-8d71eb49.js +42 -0
  126. package/dist/esm/countdown.taro-5b17c607.js +226 -0
  127. package/dist/esm/datepicker.taro-6e9b4b8f.js +275 -0
  128. package/dist/esm/dialog.taro-a3267d29.js +118 -0
  129. package/dist/esm/divider.taro-26d1d8b4.js +35 -0
  130. package/dist/esm/drag.taro-79bb8744.js +110 -0
  131. package/dist/esm/elevator.taro-6019669e.js +178 -0
  132. package/dist/esm/ellipsis.taro-f15f26da.js +241 -0
  133. package/dist/esm/empty.taro-04ae4389.js +62 -0
  134. package/dist/esm/fixednav.taro-1f05acaf.js +53 -0
  135. package/dist/esm/form.taro-0c8e7a39.js +179 -0
  136. package/dist/esm/formitem.taro-190a3326.js +89 -0
  137. package/dist/esm/get-scroll-parent-b4a07e65.js +25 -0
  138. package/dist/esm/grid.taro-3503b82c.js +61 -0
  139. package/dist/esm/{grid.context-2ee27d95.js → grid.taro.context-c2bbfb4f.js} +4 -2
  140. package/dist/esm/griditem.taro-cdb3f119.js +98 -0
  141. package/dist/esm/icon-296a1bec.js +63 -0
  142. package/dist/esm/icon.taro-296a1bec.js +63 -0
  143. package/dist/esm/image.taro-142cf512.js +64 -0
  144. package/dist/esm/imagepreview.taro-c50bb0a3.js +167 -0
  145. package/dist/esm/index-5bcb0ff8.js +7 -0
  146. package/dist/esm/indicator.taro-cba8b010.js +37 -0
  147. package/dist/esm/infiniteloading.taro-183bccbf.js +144 -0
  148. package/dist/esm/input.taro-97af6c96.js +240 -0
  149. package/dist/esm/inputnumber.taro-91f65d17.js +130 -0
  150. package/dist/esm/layout.taro-9046d093.js +11 -0
  151. package/dist/esm/menu.taro-7e4038a1.js +99 -0
  152. package/dist/esm/menuitem.taro-96cc4f15.js +130 -0
  153. package/dist/esm/navbar.taro-777c4705.js +79 -0
  154. package/dist/esm/noticebar.taro-4a23cdee.js +448 -0
  155. package/dist/esm/notify.taro-e17c6f82.js +75 -0
  156. package/dist/esm/numberkeyboard.taro-1bc24744.js +159 -0
  157. package/dist/esm/nutui-react.es.js +119 -94
  158. package/dist/esm/offsetContext-c2a746fa.js +5 -0
  159. package/dist/esm/overlay.taro-21e87fb1.js +69 -0
  160. package/dist/esm/pagination.taro-715a173b.js +124 -0
  161. package/dist/esm/picker.taro-9ad1b7c5.js +473 -0
  162. package/dist/esm/popover.taro-ad5e76ea.js +156 -0
  163. package/dist/esm/popup.taro-01676bff.js +137 -0
  164. package/dist/esm/price.taro-776ed16e.js +83 -0
  165. package/dist/esm/progress.taro-f0ce38e9.js +90 -0
  166. package/dist/esm/pulltorefresh.taro-a294f656.js +181 -0
  167. package/dist/esm/radio.taro-a6eff96c.js +168 -0
  168. package/dist/esm/range.taro-d8fc7656.js +332 -0
  169. package/dist/esm/rate.taro-6cdf03bd.js +75 -0
  170. package/dist/esm/row.taro-f64d4a13.js +46 -0
  171. package/dist/esm/searchbar.taro-0c25927b.js +152 -0
  172. package/dist/esm/shortpassword.taro-9ee034f7.js +111 -0
  173. package/dist/esm/sidenavbar.taro-c307b35e.js +35 -0
  174. package/dist/esm/sidenavbaritem.taro-5a7965d0.js +12 -0
  175. package/dist/esm/signature.taro-ec4e713b.js +143 -0
  176. package/dist/esm/skeleton.taro-76faf63f.js +62 -0
  177. package/dist/esm/step.taro-b7903e8c.js +59 -0
  178. package/dist/esm/steps.taro-c82d2252.js +30 -0
  179. package/dist/esm/sticky.taro-218bda37.js +138 -0
  180. package/dist/esm/subsidenavbar.taro-69cb9752.js +63 -0
  181. package/dist/esm/supports-passive-c85ef996.js +18 -0
  182. package/dist/esm/swipe.taro-ea35f07f.js +177 -0
  183. package/dist/esm/swiper.taro-7a94e211.js +451 -0
  184. package/dist/esm/swiperitem-c9e3d0d5.js +29 -0
  185. package/dist/esm/switch.taro-34ca8228.js +50 -0
  186. package/dist/esm/tabbar.taro-9acfc2fa.js +59 -0
  187. package/dist/esm/tabbaritem.taro-bf517487.js +58 -0
  188. package/dist/esm/table.taro-91fc0c01.js +93 -0
  189. package/dist/esm/tabpane.taro-4ca340ef.js +23 -0
  190. package/dist/esm/tabs.taro-6a7524a4.js +140 -0
  191. package/dist/esm/tag.taro-23ba0834.js +92 -0
  192. package/dist/esm/textarea.taro-442e7350.js +94 -0
  193. package/dist/esm/timedetail.taro-5b2f2269.js +44 -0
  194. package/dist/esm/timepannel.taro-d6e40180.js +22 -0
  195. package/dist/esm/timeselect.taro-a07036f4.js +133 -0
  196. package/dist/esm/toast.taro-d6c14811.js +109 -0
  197. package/dist/esm/trendarrow.taro-b8c5ccd9.js +73 -0
  198. package/dist/esm/typings-b9828dba.js +9 -0
  199. package/dist/esm/uploader.taro-587e6bf3.js +492 -0
  200. package/dist/esm/useClientRect-1f8ed1fe.js +18 -0
  201. package/dist/esm/useTouch-db24bb5c.js +69 -0
  202. package/dist/esm/video-f1be8a91.js +67 -0
  203. package/dist/esm/virtuallist.taro-f0b0270d.js +214 -0
  204. package/dist/esm/watermark.taro-9ce2ae37.js +114 -0
  205. package/dist/esm/zh-CN-c779e6c1.js +131 -0
  206. package/dist/locales/base.js +1 -1
  207. package/dist/locales/en-US.js +1 -1
  208. package/dist/locales/id-ID.js +1 -1
  209. package/dist/locales/zh-CN.js +1 -1
  210. package/dist/locales/zh-TW.js +1 -1
  211. package/dist/locales/zh-UG.js +1 -1
  212. package/dist/nutui.react.mjs +13030 -14863
  213. package/dist/nutui.react.umd.js +13029 -14864
  214. package/dist/style.mjs +1 -1
  215. package/dist/types/index.d.ts +176 -183
  216. package/package.json +1 -1
  217. package/dist/esm/cellgroup-fcc72767.js +0 -34
  218. package/dist/esm/checkbox-44e13cd0.js +0 -137
  219. package/dist/esm/date-c7aad4c0.js +0 -97
  220. package/dist/esm/formitem-8a73a5fb.js +0 -157
  221. package/dist/esm/get-scroll-parent-5f85dee8.js +0 -24
  222. package/dist/esm/icon-4ef1581c.js +0 -70
  223. package/dist/esm/index-030b7245.js +0 -11
  224. package/dist/esm/offsetContext-3ab00d40.js +0 -16
  225. package/dist/esm/overlay-de6c79d5.js +0 -83
  226. package/dist/esm/radio-9f141e6b.js +0 -118
  227. package/dist/esm/render-bbebb760.js +0 -79
  228. package/dist/esm/tabpane-01075e6c.js +0 -29
  229. package/dist/esm/tabs-e1b4e4b1.js +0 -181
  230. package/dist/esm/typings-f27b58f4.js +0 -8
  231. package/dist/esm/useClientRect-56bb675b.js +0 -39
  232. package/dist/esm/useTouch-cf73a407.js +0 -99
@@ -0,0 +1,787 @@
1
+ import React__default, { useState, useRef, useEffect } from 'react';
2
+ import classNames from 'classnames';
3
+ import { ScrollView } from '@tarojs/components';
4
+ import { c as cn } from './bem-350c1702.js';
5
+ import { u as useConfig } from './configprovider.taro-8d71eb49.js';
6
+ import { nextTick } from '@tarojs/taro';
7
+
8
+ const Utils = {
9
+ /**
10
+ * 是否为闫年
11
+ * @return {Boolse} true|false
12
+ */
13
+ isLeapYear(y) {
14
+ return (y % 4 == 0 && y % 100 != 0) || y % 400 == 0;
15
+ },
16
+ /**
17
+ * 返回星期数
18
+ * @return {String}
19
+ */
20
+ getWhatDay(year, month, day) {
21
+ const date = new Date(`${year}/${month}/${day}`);
22
+ const index = date.getDay();
23
+ const dayNames = [
24
+ '星期日',
25
+ '星期一',
26
+ '星期二',
27
+ '星期三',
28
+ '星期四',
29
+ '星期五',
30
+ '星期六',
31
+ ];
32
+ return dayNames[index];
33
+ },
34
+ /**
35
+ * 返回星期数
36
+ * @return {Number}
37
+ */
38
+ getMonthPreDay(year, month) {
39
+ const date = new Date(`${year}/${month}/01`);
40
+ let day = date.getDay();
41
+ if (day == 0) {
42
+ day = 7;
43
+ }
44
+ return day;
45
+ },
46
+ /**
47
+ * 返回月份天数
48
+ * @return {Number}
49
+ */
50
+ getMonthDays(year, month) {
51
+ if (/^0/.test(month)) {
52
+ month = month.split('')[1];
53
+ }
54
+ return [
55
+ 0,
56
+ 31,
57
+ this.isLeapYear(Number(year)) ? 29 : 28,
58
+ 31,
59
+ 30,
60
+ 31,
61
+ 30,
62
+ 31,
63
+ 31,
64
+ 30,
65
+ 31,
66
+ 30,
67
+ 31,
68
+ ][month];
69
+ },
70
+ /**
71
+ * 补齐数字位数
72
+ * @return {string}
73
+ */
74
+ getNumTwoBit(n) {
75
+ n = Number(n);
76
+ return (n > 9 ? '' : '0') + n;
77
+ },
78
+ /**
79
+ * 日期对象转成字符串
80
+ * @return {string}
81
+ */
82
+ date2Str(date, split) {
83
+ split = split || '-';
84
+ const y = date.getFullYear();
85
+ const m = this.getNumTwoBit(date.getMonth() + 1);
86
+ const d = this.getNumTwoBit(date.getDate());
87
+ return [y, m, d].join(split);
88
+ },
89
+ /**
90
+ * 返回日期格式字符串
91
+ * @param {Number} 0返回今天的日期、1返回明天的日期,2返回后天得日期,依次类推
92
+ * @return {string} '2014-12-31'
93
+ */
94
+ getDay(i) {
95
+ i = i || 0;
96
+ let date = new Date();
97
+ const diff = i * (1000 * 60 * 60 * 24);
98
+ date = new Date(date.getTime() + diff);
99
+ return this.date2Str(date);
100
+ },
101
+ /**
102
+ * 时间比较
103
+ * @return {Boolean}
104
+ */
105
+ compareDate(date1, date2) {
106
+ const startTime = new Date(date1.replace('-', '/').replace('-', '/'));
107
+ const endTime = new Date(date2.replace('-', '/').replace('-', '/'));
108
+ if (startTime >= endTime) {
109
+ return false;
110
+ }
111
+ return true;
112
+ },
113
+ /**
114
+ * 时间是否相等
115
+ * @return {Boolean}
116
+ */
117
+ isEqual(date1, date2) {
118
+ const startTime = new Date(date1).getTime();
119
+ const endTime = new Date(date2).getTime();
120
+ if (startTime == endTime) {
121
+ return true;
122
+ }
123
+ return false;
124
+ },
125
+ };
126
+
127
+ function requestAniFrame() {
128
+ if (typeof window !== 'undefined') {
129
+ return (window.requestAnimationFrame ||
130
+ function (callback) {
131
+ window.setTimeout(callback, 1000 / 60);
132
+ });
133
+ }
134
+ return function (callback) {
135
+ setTimeout(callback, 1000 / 60);
136
+ };
137
+ }
138
+ var requestAniFrame$1 = requestAniFrame();
139
+
140
+ const defaultProps = {
141
+ type: 'one',
142
+ isAutoBackFill: false,
143
+ poppable: true,
144
+ visible: false,
145
+ title: '日历选择',
146
+ defaultValue: '',
147
+ startDate: Utils.getDay(0),
148
+ endDate: Utils.getDay(365),
149
+ showToday: true,
150
+ startText: '开始',
151
+ endText: '结束',
152
+ confirmText: '确认',
153
+ showTitle: true,
154
+ showSubTitle: true,
155
+ toDateAnimation: true,
156
+ onBtn: undefined,
157
+ onDay: undefined,
158
+ onTopInfo: undefined,
159
+ onBottomInfo: undefined,
160
+ onChoose: (data) => { },
161
+ onUpdate: () => { },
162
+ onSelected: (data) => { },
163
+ onYearMonthChange: (data) => { },
164
+ };
165
+ const CalendarItem = React__default.forwardRef((props, ref) => {
166
+ const { locale } = useConfig();
167
+ const { type, isAutoBackFill, poppable, title, defaultValue, showToday, startText, endText, confirmText, showTitle, showSubTitle, toDateAnimation, onBtn, onDay, onTopInfo, onBottomInfo, onChoose, onUpdate, onSelected, onYearMonthChange, } = { ...defaultProps, ...props };
168
+ const weeks = locale.calendaritem.weekdays;
169
+ const [yearMonthTitle, setYearMonthTitle] = useState('');
170
+ const [monthsData, setMonthsData] = useState([]);
171
+ const [translateY, setTranslateY] = useState(0);
172
+ const [monthDefaultRange, setMonthDefaultRange] = useState([]);
173
+ const [scrollTop, setScrollTop] = useState(0);
174
+ const [scrollWithAnimation, setScrollWithAnimation] = useState(false);
175
+ const [state] = useState({
176
+ currDate: '',
177
+ propStartDate: '',
178
+ propEndDate: '',
179
+ unLoadPrev: false,
180
+ touchParams: {
181
+ startY: 0,
182
+ endY: 0,
183
+ startTime: 0,
184
+ endTime: 0,
185
+ lastY: 0,
186
+ lastTime: 0,
187
+ },
188
+ transformY: 0,
189
+ scrollDistance: 0,
190
+ defaultData: [],
191
+ chooseData: [],
192
+ monthsData: [],
193
+ dayPrefix: 'calendar-month-day',
194
+ startData: '',
195
+ endData: '',
196
+ isRange: props.type === 'range',
197
+ timer: 0,
198
+ currentIndex: 0,
199
+ avgHeight: 0,
200
+ monthsNum: 0,
201
+ });
202
+ const weeksPanel = useRef(null);
203
+ const months = useRef(null);
204
+ const monthsPanel = useRef(null);
205
+ const viewArea = useRef(null);
206
+ let viewHeight = 0;
207
+ const b = cn('calendar');
208
+ const classes = classNames({
209
+ [`${b('')}-tile`]: !poppable,
210
+ [`${b('')}-nofooter`]: !!isAutoBackFill,
211
+ }, b(''));
212
+ const headerClasses = classNames({
213
+ [`${b('')}-header`]: true,
214
+ [`${b('')}-header-tile`]: !poppable,
215
+ });
216
+ const monthitemclasses = classNames({
217
+ 'calendar-month-item': true,
218
+ [`${type === 'range' ? 'month-item-range' : ''}`]: true,
219
+ });
220
+ const splitDate = (date) => {
221
+ return date.split('-');
222
+ };
223
+ const isStart = (currDate) => {
224
+ return Utils.isEqual(state.currDate[0], currDate);
225
+ };
226
+ const isEnd = (currDate) => {
227
+ return Utils.isEqual(state.currDate[1], currDate);
228
+ };
229
+ const isMultiple = (currDate) => {
230
+ if (state.currDate.length > 0) {
231
+ return state.currDate.some((item) => {
232
+ return Utils.isEqual(item, currDate);
233
+ });
234
+ }
235
+ return false;
236
+ };
237
+ const getCurrDate = (day, month) => {
238
+ return `${month.curData[0]}-${month.curData[1]}-${Utils.getNumTwoBit(+day.day)}`;
239
+ };
240
+ const getClass = (day, month) => {
241
+ const currDate = getCurrDate(day, month);
242
+ if (day.type === 'curr') {
243
+ if (Utils.isEqual(state.currDate, currDate) ||
244
+ (type === 'range' && (isStart(currDate) || isEnd(currDate))) ||
245
+ (type === 'multiple' && isMultiple(currDate))) {
246
+ return `${state.dayPrefix}-active`;
247
+ }
248
+ if ((state.propStartDate &&
249
+ Utils.compareDate(currDate, state.propStartDate)) ||
250
+ (state.propEndDate && Utils.compareDate(state.propEndDate, currDate))) {
251
+ return `${state.dayPrefix}-disabled`;
252
+ }
253
+ if (type === 'range' &&
254
+ Array.isArray(state.currDate) &&
255
+ Object.values(state.currDate).length === 2 &&
256
+ Utils.compareDate(state.currDate[0], currDate) &&
257
+ Utils.compareDate(currDate, state.currDate[1])) {
258
+ return `${state.dayPrefix}-choose`;
259
+ }
260
+ return null;
261
+ }
262
+ return `${state.dayPrefix}-disabled`;
263
+ };
264
+ const isActive = (day, month) => {
265
+ return (state.isRange &&
266
+ day.type === 'curr' &&
267
+ getClass(day, month) === 'calendar-month-day-active');
268
+ };
269
+ const isCurrDay = (month, day) => {
270
+ const date = `${month.curData[0]}-${month.curData[1]}-${day}`;
271
+ return Utils.isEqual(date, Utils.date2Str(new Date()));
272
+ };
273
+ const confirm = () => {
274
+ const { type } = props;
275
+ if ((type === 'range' && state.chooseData.length === 2) ||
276
+ type !== 'range') {
277
+ const chooseData = state.chooseData.slice(0);
278
+ onChoose && onChoose(chooseData);
279
+ if (poppable) {
280
+ onUpdate && onUpdate();
281
+ }
282
+ }
283
+ };
284
+ const chooseDay = (day, month, isFirst) => {
285
+ if (getClass(day, month) !== `${state.dayPrefix}-disabled`) {
286
+ const { type } = props;
287
+ const days = [...month.curData];
288
+ days[2] =
289
+ typeof day.day === 'number' ? Utils.getNumTwoBit(day.day) : day.day;
290
+ days[3] = `${days[0]}-${days[1]}-${days[2]}`;
291
+ days[4] = Utils.getWhatDay(+days[0], +days[1], +days[2]);
292
+ if (type === 'multiple') {
293
+ if (state.currDate.length > 0) {
294
+ let hasIndex = '';
295
+ state.currDate.forEach((item, index) => {
296
+ if (item === days[3]) {
297
+ hasIndex = index;
298
+ }
299
+ });
300
+ if (isFirst) {
301
+ state.chooseData.push([...days]);
302
+ }
303
+ else if (hasIndex !== '') {
304
+ state.currDate.splice(hasIndex, 1);
305
+ state.chooseData.splice(hasIndex, 1);
306
+ }
307
+ else {
308
+ state.currDate.push(days[3]);
309
+ state.chooseData.push([...days]);
310
+ }
311
+ }
312
+ else {
313
+ state.currDate = [days[3]];
314
+ state.chooseData = [[...days]];
315
+ }
316
+ }
317
+ else if (type === 'range') {
318
+ const curDataLength = Object.values(state.currDate).length;
319
+ if (curDataLength === 2 || curDataLength === 0) {
320
+ state.currDate = [days[3]];
321
+ }
322
+ else if (Utils.compareDate(state.currDate[0], days[3])) {
323
+ Array.isArray(state.currDate) && state.currDate.push(days[3]);
324
+ }
325
+ else {
326
+ Array.isArray(state.currDate) && state.currDate.unshift(days[3]);
327
+ }
328
+ if (state.chooseData.length === 2 || !state.chooseData.length) {
329
+ state.chooseData = [[...days]];
330
+ }
331
+ else if (Utils.compareDate(state.chooseData[0][3], days[3])) {
332
+ state.chooseData = [...state.chooseData, [...days]];
333
+ }
334
+ else {
335
+ state.chooseData = [[...days], ...state.chooseData];
336
+ }
337
+ }
338
+ else {
339
+ state.currDate = days[3];
340
+ state.chooseData = [...days];
341
+ }
342
+ if (!isFirst) {
343
+ // 点击日期 触发
344
+ onSelected && onSelected(state.chooseData);
345
+ if (isAutoBackFill || !poppable) {
346
+ confirm();
347
+ }
348
+ }
349
+ setMonthsData(state.monthsData.slice());
350
+ }
351
+ };
352
+ const isStartTip = (day, month) => {
353
+ return isActive(day, month) && isStart(getCurrDate(day, month));
354
+ };
355
+ // 是否有结束提示
356
+ const isEndTip = (day, month) => {
357
+ if (state.currDate.length >= 2 && isEnd(getCurrDate(day, month))) {
358
+ return isActive(day, month);
359
+ }
360
+ return false;
361
+ };
362
+ // 开始结束时间是否相等
363
+ const rangeTip = () => {
364
+ if (state.currDate.length >= 2) {
365
+ return Utils.isEqual(state.currDate[0], state.currDate[1]);
366
+ }
367
+ return false;
368
+ };
369
+ // 获取当前月数据
370
+ const getCurrData = (type) => {
371
+ const monthData = type === 'prev'
372
+ ? state.monthsData[0]
373
+ : state.monthsData[state.monthsData.length - 1];
374
+ let year = parseInt(monthData.curData[0]);
375
+ let month = parseInt(monthData.curData[1].toString().replace(/^0/, ''));
376
+ switch (type) {
377
+ case 'prev':
378
+ month === 1 && (year -= 1);
379
+ month = month === 1 ? 12 : --month;
380
+ break;
381
+ case 'next':
382
+ month === 12 && (year += 1);
383
+ month = month === 12 ? 1 : ++month;
384
+ break;
385
+ }
386
+ return [
387
+ year,
388
+ Utils.getNumTwoBit(month),
389
+ Utils.getMonthDays(String(year), String(month)),
390
+ ];
391
+ };
392
+ // 获取日期状态
393
+ const getDaysStatus = (days, type, dateInfo) => {
394
+ // 修复:当某个月的1号是周日时,月份下方会空出来一行
395
+ const { year, month } = dateInfo;
396
+ if (type === 'prev' && days >= 7) {
397
+ days -= 7;
398
+ }
399
+ return Array.from(Array(days), (v, k) => {
400
+ return {
401
+ day: k + 1,
402
+ type,
403
+ year,
404
+ month,
405
+ };
406
+ });
407
+ };
408
+ // 获取上一个月的最后一周天数,填充当月空白
409
+ const getPreDaysStatus = (days, type, dateInfo, preCurrMonthDays) => {
410
+ // 修复:当某个月的1号是周日时,月份下方会空出来一行
411
+ const { year, month } = dateInfo;
412
+ if (type === 'prev' && days >= 7) {
413
+ days -= 7;
414
+ }
415
+ const months = Array.from(Array(preCurrMonthDays), (v, k) => {
416
+ return {
417
+ day: k + 1,
418
+ type,
419
+ year,
420
+ month,
421
+ };
422
+ });
423
+ return months.slice(preCurrMonthDays - days);
424
+ };
425
+ // 获取月数据
426
+ const getMonth = (curData, type) => {
427
+ const preMonthDays = Utils.getMonthPreDay(+curData[0], +curData[1]);
428
+ let preMonth = +curData[1] - 1;
429
+ let preYear = curData[0];
430
+ if (preMonth <= 0) {
431
+ preMonth = 12;
432
+ preYear += 1;
433
+ }
434
+ const currMonthDays = Utils.getMonthDays(curData[0], curData[1]);
435
+ const preCurrMonthDays = Utils.getMonthDays(`${preYear}`, `${preMonth}`);
436
+ const title = {
437
+ year: curData[0],
438
+ month: curData[1],
439
+ };
440
+ const monthInfo = {
441
+ curData,
442
+ title: locale.calendaritem.monthTitle(title.year, title.month),
443
+ monthData: [
444
+ ...getPreDaysStatus(preMonthDays, 'prev', { month: preMonth, year: preYear }, preCurrMonthDays),
445
+ ...getDaysStatus(currMonthDays, 'curr', title),
446
+ ],
447
+ };
448
+ monthInfo.cssHeight = 39 + (monthInfo.monthData.length > 35 ? 384 : 320);
449
+ let cssScrollHeight = 0;
450
+ if (state.monthsData.length > 0) {
451
+ cssScrollHeight =
452
+ state.monthsData[state.monthsData.length - 1].cssScrollHeight +
453
+ state.monthsData[state.monthsData.length - 1].cssHeight;
454
+ }
455
+ monthInfo.cssScrollHeight = cssScrollHeight;
456
+ if (type === 'next') {
457
+ if (!state.endData ||
458
+ !Utils.compareDate(`${state.endData[0]}-${state.endData[1]}-${Utils.getMonthDays(state.endData[0], state.endData[1])}`, `${curData[0]}-${curData[1]}-${curData[2]}`)) {
459
+ state.monthsData.push(monthInfo);
460
+ }
461
+ }
462
+ else if (!state.startData ||
463
+ !Utils.compareDate(`${curData[0]}-${curData[1]}-${curData[2]}`, `${state.startData[0]}-${state.startData[1]}-01`)) {
464
+ state.monthsData.unshift(monthInfo);
465
+ }
466
+ setMonthsData(state.monthsData);
467
+ };
468
+ const setReachedYearMonthInfo = () => {
469
+ const currentMonthsData = state.monthsData[state.currentIndex];
470
+ const [year, month] = currentMonthsData.curData;
471
+ if (currentMonthsData.title === yearMonthTitle)
472
+ return;
473
+ onYearMonthChange && onYearMonthChange([year, month, `${year}-${month}`]);
474
+ setYearMonthTitle(currentMonthsData.title);
475
+ };
476
+ const setDefaultRange = (monthsNum, current) => {
477
+ let start = 0;
478
+ let end = 0;
479
+ if (monthsNum >= 3) {
480
+ if (current > 0 && current < monthsNum) {
481
+ start = current - 1;
482
+ end = current + 3;
483
+ }
484
+ else if (current === 0) {
485
+ start = current;
486
+ end = current + 4;
487
+ }
488
+ else if (current === monthsNum) {
489
+ start = current - 2;
490
+ end = current + 2;
491
+ }
492
+ }
493
+ else {
494
+ start = 0;
495
+ end = monthsNum + 2;
496
+ }
497
+ setMonthDefaultRange([start, end]);
498
+ setTranslateY(state.monthsData[start].cssScrollHeight);
499
+ };
500
+ const monthsViewScroll = (e) => {
501
+ if (state.monthsData.length <= 1) {
502
+ return;
503
+ }
504
+ const target = e.target;
505
+ const currentScrollTop = target.scrollTop;
506
+ let current = Math.floor(currentScrollTop / state.avgHeight);
507
+ if (current === 0) {
508
+ if (currentScrollTop >= state.monthsData[current + 1].cssScrollHeight) {
509
+ current += 1;
510
+ }
511
+ }
512
+ else if (current > 0 && current < state.monthsNum - 1) {
513
+ if (currentScrollTop >= state.monthsData[current + 1].cssScrollHeight) {
514
+ current += 1;
515
+ }
516
+ if (currentScrollTop < state.monthsData[current].cssScrollHeight) {
517
+ current -= 1;
518
+ }
519
+ }
520
+ else {
521
+ const viewPosition = Math.round(currentScrollTop + viewHeight);
522
+ if (viewPosition <
523
+ state.monthsData[current].cssScrollHeight +
524
+ state.monthsData[current].cssHeight &&
525
+ currentScrollTop > state.monthsData[current - 1].cssScrollHeight) {
526
+ current -= 1;
527
+ }
528
+ if (current + 1 <= state.monthsNum &&
529
+ viewPosition >=
530
+ state.monthsData[current + 1].cssScrollHeight +
531
+ state.monthsData[current + 1].cssHeight) {
532
+ current += 1;
533
+ }
534
+ if (current >= 1 &&
535
+ currentScrollTop < state.monthsData[current - 1].cssScrollHeight) {
536
+ current -= 1;
537
+ }
538
+ }
539
+ if (state.currentIndex !== current) {
540
+ state.currentIndex = current;
541
+ setDefaultRange(state.monthsNum, current);
542
+ }
543
+ setReachedYearMonthInfo();
544
+ };
545
+ const initData = () => {
546
+ // 初始化开始结束数据
547
+ const propStartDate = props.startDate ? props.startDate : Utils.getDay(0);
548
+ const propEndDate = props.endDate ? props.endDate : Utils.getDay(365);
549
+ state.propStartDate = propStartDate;
550
+ state.propEndDate = propEndDate;
551
+ state.startData = splitDate(propStartDate);
552
+ state.endData = splitDate(propEndDate);
553
+ // 根据是否存在默认时间,初始化当前日期
554
+ if (defaultValue ||
555
+ (Array.isArray(defaultValue) && defaultValue.length > 0)) {
556
+ state.currDate =
557
+ props.type !== 'one'
558
+ ? [...props.defaultValue]
559
+ : props.defaultValue;
560
+ }
561
+ // 判断时间范围内存在多少个月
562
+ const startDate = {
563
+ year: Number(state.startData[0]),
564
+ month: Number(state.startData[1]),
565
+ };
566
+ const endDate = {
567
+ year: Number(state.endData[0]),
568
+ month: Number(state.endData[1]),
569
+ };
570
+ let monthsNum = endDate.month - startDate.month;
571
+ if (endDate.year - startDate.year > 0) {
572
+ monthsNum += 12 * (endDate.year - startDate.year);
573
+ }
574
+ if (monthsNum <= 0) {
575
+ monthsNum = 1;
576
+ }
577
+ // 设置月份数据
578
+ getMonth(state.startData, 'next');
579
+ let i = 1;
580
+ do {
581
+ getMonth(getCurrData('next'), 'next');
582
+ } while (i++ < monthsNum);
583
+ state.monthsNum = monthsNum;
584
+ // 日期转化为数组,限制初始日期。判断时间范围
585
+ if (type === 'range' && Array.isArray(state.currDate)) {
586
+ if (state.currDate.length > 0) {
587
+ if (propStartDate &&
588
+ Utils.compareDate(state.currDate[0], propStartDate)) {
589
+ state.currDate.splice(0, 1, propStartDate);
590
+ }
591
+ if (propEndDate &&
592
+ Utils.compareDate(propEndDate, state.currDate[1])) {
593
+ state.currDate.splice(1, 1, propEndDate);
594
+ }
595
+ state.defaultData = [
596
+ ...splitDate(state.currDate[0]),
597
+ ...splitDate(state.currDate[1]),
598
+ ];
599
+ }
600
+ }
601
+ else if (props.type === 'multiple' && Array.isArray(state.currDate)) {
602
+ if (state.currDate.length > 0) {
603
+ const defaultArr = [];
604
+ const obj = {};
605
+ state.currDate.forEach((item) => {
606
+ if (propStartDate &&
607
+ !Utils.compareDate(item, propStartDate) &&
608
+ propEndDate &&
609
+ !Utils.compareDate(propEndDate, item)) {
610
+ if (!Object.hasOwnProperty.call(obj, item)) {
611
+ defaultArr.push(item);
612
+ obj[item] = item;
613
+ }
614
+ }
615
+ });
616
+ state.currDate = [...defaultArr];
617
+ state.defaultData = [...splitDate(defaultArr[0])];
618
+ }
619
+ }
620
+ else if (state.currDate) {
621
+ if (propStartDate &&
622
+ Utils.compareDate(state.currDate, propStartDate)) {
623
+ state.currDate = propStartDate;
624
+ }
625
+ else if (propEndDate &&
626
+ !Utils.compareDate(state.currDate, propEndDate)) {
627
+ state.currDate = propEndDate;
628
+ }
629
+ state.defaultData = [...splitDate(state.currDate)];
630
+ }
631
+ // 设置默认可见区域
632
+ let current = 0;
633
+ let lastCurrent = 0;
634
+ if (state.defaultData.length > 0) {
635
+ state.monthsData.forEach((item, index) => {
636
+ if (item.title ===
637
+ locale.calendaritem.monthTitle(state.defaultData[0], state.defaultData[1])) {
638
+ current = index;
639
+ }
640
+ if (props.type === 'range') {
641
+ if (item.title ===
642
+ locale.calendaritem.monthTitle(state.defaultData[3], state.defaultData[4])) {
643
+ lastCurrent = index;
644
+ }
645
+ }
646
+ });
647
+ }
648
+ else {
649
+ // 当 defaultValue 为空时,如果月份列表包含当月,则默认定位到当月
650
+ const currentYear = new Date().getFullYear();
651
+ const currentMonth = new Date().getMonth() + 1;
652
+ const currentYearMonthIndex = state.monthsData.findIndex((item) => {
653
+ return (+item.curData[0] === currentYear && +item.curData[1] === currentMonth);
654
+ });
655
+ if (currentYearMonthIndex > -1) {
656
+ current = currentYearMonthIndex;
657
+ }
658
+ }
659
+ setDefaultRange(monthsNum, current);
660
+ state.currentIndex = current;
661
+ setReachedYearMonthInfo();
662
+ if (state.defaultData.length > 0) {
663
+ // 设置当前选中日期
664
+ if (type === 'range') {
665
+ chooseDay({ day: state.defaultData[2], type: 'curr' }, state.monthsData[state.currentIndex], true);
666
+ chooseDay({ day: state.defaultData[5], type: 'curr' }, state.monthsData[lastCurrent], true);
667
+ }
668
+ else if (type === 'multiple') {
669
+ [...state.currDate].forEach((item) => {
670
+ const dateArr = splitDate(item);
671
+ let current = state.currentIndex;
672
+ state.monthsData.forEach((item, index) => {
673
+ if (item.title ===
674
+ locale.calendaritem.monthTitle(dateArr[0], dateArr[1])) {
675
+ current = index;
676
+ }
677
+ });
678
+ chooseDay({ day: dateArr[2], type: 'curr' }, state.monthsData[current], true);
679
+ });
680
+ }
681
+ else {
682
+ chooseDay({ day: state.defaultData[2], type: 'curr' }, state.monthsData[state.currentIndex], true);
683
+ }
684
+ }
685
+ const lastItem = state.monthsData[state.monthsData.length - 1];
686
+ const containerHeight = lastItem.cssHeight + lastItem.cssScrollHeight;
687
+ requestAniFrame$1(() => {
688
+ // 初始化 日历位置
689
+ if (months && monthsPanel && viewArea) {
690
+ viewHeight = months.current.clientHeight;
691
+ monthsPanel.current.style.height = `${containerHeight}px`;
692
+ setScrollTop(state.monthsData[state.currentIndex].cssScrollHeight);
693
+ nextTick(() => setScrollWithAnimation(true));
694
+ }
695
+ });
696
+ state.avgHeight = Math.floor(containerHeight / (monthsNum + 1));
697
+ };
698
+ const resetRender = () => {
699
+ state.chooseData.splice(0);
700
+ state.monthsData.splice(0);
701
+ initData();
702
+ };
703
+ // 暴露出的API
704
+ const scrollToDate = (date) => {
705
+ if (Utils.compareDate(date, state.propStartDate)) {
706
+ date = state.propStartDate;
707
+ }
708
+ else if (!Utils.compareDate(date, state.propEndDate)) {
709
+ date = state.propEndDate;
710
+ }
711
+ const dateArr = splitDate(date);
712
+ state.monthsData.forEach((item, index) => {
713
+ if (item.title === locale.calendaritem.monthTitle(dateArr[0], dateArr[1])) {
714
+ if (months.current) {
715
+ const distance = state.monthsData[index].cssScrollHeight - months.current.scrollTop;
716
+ if (toDateAnimation) {
717
+ let flag = 0;
718
+ const interval = setInterval(() => {
719
+ flag++;
720
+ if (months.current) {
721
+ const offset = distance / 10;
722
+ months.current.scrollTop += offset;
723
+ }
724
+ if (flag >= 10) {
725
+ clearInterval(interval);
726
+ if (months.current) {
727
+ months.current.scrollTop =
728
+ state.monthsData[index].cssScrollHeight;
729
+ setScrollTop(months.current.scrollTop);
730
+ }
731
+ }
732
+ }, 40);
733
+ }
734
+ else {
735
+ months.current.scrollTop = state.monthsData[index].cssScrollHeight;
736
+ setScrollTop(months.current.scrollTop);
737
+ }
738
+ }
739
+ }
740
+ });
741
+ };
742
+ useEffect(() => {
743
+ initData();
744
+ }, []);
745
+ useEffect(() => {
746
+ poppable && resetRender();
747
+ }, [defaultValue]);
748
+ React__default.useImperativeHandle(ref, () => ({
749
+ scrollToDate,
750
+ }));
751
+ return (React__default.createElement(React__default.Fragment, null,
752
+ React__default.createElement("div", { className: classes },
753
+ React__default.createElement("div", { className: headerClasses },
754
+ showTitle && (React__default.createElement("div", { className: "calendar-title" }, title || locale.calendaritem.title)),
755
+ onBtn && React__default.createElement("div", { className: "calendar-top-slot" }, onBtn()),
756
+ showSubTitle && (React__default.createElement("div", { className: "calendar-curr-month" }, yearMonthTitle)),
757
+ React__default.createElement("div", { className: "calendar-weeks", ref: weeksPanel }, weeks.map((item) => (React__default.createElement("div", { className: "calendar-week-item", key: item }, item))))),
758
+ React__default.createElement(ScrollView, { scrollTop: scrollTop, scrollY: true, scrollWithAnimation: scrollWithAnimation, className: "nut-calendar-content", onScroll: monthsViewScroll, ref: months },
759
+ React__default.createElement("div", { className: "calendar-months-panel", ref: monthsPanel },
760
+ React__default.createElement("div", { className: "viewArea", ref: viewArea, style: { transform: `translateY(${translateY}px)` } }, state.monthsData
761
+ .slice(monthDefaultRange[0], monthDefaultRange[1])
762
+ .map((month, key) => {
763
+ return (React__default.createElement("div", { className: "calendar-month", key: key },
764
+ React__default.createElement("div", { className: "calendar-month-title" }, month.title),
765
+ React__default.createElement("div", { className: "calendar-month-con" },
766
+ React__default.createElement("div", { className: monthitemclasses }, month.monthData.map((day, i) => (React__default.createElement("div", { className: [
767
+ 'calendar-month-day',
768
+ getClass(day, month),
769
+ ].join(' '), onClick: () => {
770
+ chooseDay(day, month);
771
+ }, key: i },
772
+ React__default.createElement("div", { className: "calendar-day" }, onDay ? onDay(day) : day.day),
773
+ onTopInfo && (React__default.createElement("div", { className: "calendar-curr-tips calendar-curr-tips-top" }, onTopInfo(day))),
774
+ onBottomInfo && (React__default.createElement("div", { className: "calendar-curr-tips calendar-curr-tips-bottom" }, onBottomInfo(day))),
775
+ !onBottomInfo &&
776
+ showToday &&
777
+ isCurrDay(month, day.day) && (React__default.createElement("div", { className: "calendar-curr-tip-curr" }, locale.calendaritem.today)),
778
+ isStartTip(day, month) && (React__default.createElement("div", { className: `calendar-day-tip ${rangeTip() ? 'calendar-curr-tips-top' : ''}` }, startText || locale.calendaritem.start)),
779
+ isEndTip(day, month) && (React__default.createElement("div", { className: "calendar-day-tip" }, endText || locale.calendaritem.end)))))))));
780
+ })))),
781
+ poppable && !isAutoBackFill ? (React__default.createElement("div", { className: "nut-calendar-footer" },
782
+ React__default.createElement("div", { className: "calendar-confirm-btn", onClick: confirm }, confirmText || locale.confirm))) : (''))));
783
+ });
784
+ CalendarItem.defaultProps = defaultProps;
785
+ CalendarItem.displayName = 'NutCalendarItem';
786
+
787
+ export { CalendarItem as C, Utils as U };