intelicoreact 0.0.94 → 0.0.95

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 (38) hide show
  1. package/dist/Atomic/FormElements/InputCalendar/InputCalendar.js +23 -4
  2. package/dist/Atomic/FormElements/InputCalendar/InputCalendar.stories.js +3 -3
  3. package/dist/Atomic/FormElements/InputDateRange/InputDateRange.js +20 -9
  4. package/dist/Atomic/FormElements/InputDateRange/InputDateRange.stories.js +7 -5
  5. package/dist/Atomic/FormElements/InputDateRange/components/Datepicker.js +29 -24
  6. package/dist/Atomic/FormElements/InputDateRange/components/OpenedPart.js +13 -7
  7. package/dist/Atomic/FormElements/MobileCalendar/MobileCalendar.js +427 -0
  8. package/dist/Atomic/FormElements/MobileCalendar/MobileCalendar.scss +120 -0
  9. package/dist/{Molecular/Datepicker/Datepicker.stories.js → Atomic/FormElements/MobileCalendar/MobileCalendar.stories.js} +33 -21
  10. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.js +11 -8
  11. package/dist/Atomic/UI/Calendar/Calendar.js +13 -12
  12. package/dist/Functions/customEventListener.js +66 -0
  13. package/package.json +1 -1
  14. package/src/Atomic/FormElements/InputCalendar/InputCalendar.js +34 -3
  15. package/src/Atomic/FormElements/InputCalendar/InputCalendar.stories.js +4 -4
  16. package/src/Atomic/FormElements/InputDateRange/InputDateRange.js +57 -22
  17. package/src/Atomic/FormElements/InputDateRange/InputDateRange.stories.js +10 -8
  18. package/src/Atomic/FormElements/InputDateRange/components/Datepicker.js +391 -392
  19. package/src/Atomic/FormElements/InputDateRange/components/OpenedPart.js +11 -3
  20. package/src/Atomic/FormElements/MobileCalendar/MobileCalendar.js +315 -0
  21. package/src/Atomic/FormElements/MobileCalendar/MobileCalendar.scss +120 -0
  22. package/src/Atomic/FormElements/MobileCalendar/MobileCalendar.stories.js +30 -0
  23. package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.js +132 -126
  24. package/src/Atomic/UI/Calendar/Calendar.js +21 -11
  25. package/src/Functions/customEventListener.js +58 -0
  26. package/src/Functions/useMouseUpOutside.js +14 -0
  27. package/dist/Functions/useToggle.js +0 -40
  28. package/dist/Functions/utils.js +0 -66
  29. package/dist/Molecular/Datepicker/Datepicker.js +0 -451
  30. package/dist/Molecular/Datepicker/Datepicker.scss +0 -8
  31. package/dist/Molecular/Datepicker/components/Calendar.js +0 -156
  32. package/dist/Molecular/FormElements/FormElement.js +0 -40
  33. package/dist/Molecular/FormElements/FormElement.scss +0 -8
  34. package/dist/Molecular/FormElements/FormElement.stories.js +0 -73
  35. package/dist/index.js +0 -15
  36. package/dist/scss/_fonts.scss +0 -109
  37. package/dist/scss/_vars.scss +0 -48
  38. package/dist/scss/main.scss +0 -40
@@ -39,11 +39,14 @@ function _default(props) {
39
39
  allowNext = _props$allowNext === void 0 ? true : _props$allowNext,
40
40
  params = props.params,
41
41
  className = props.className,
42
- isDontLimitFuture = props.isDontLimitFuture,
43
42
  isListTop = props.isListTop; // const { minDate = '01/01/1900', maxDate = moment().format('MM/DD/YYYY') } = params;
44
43
 
45
- var minDate = params.minDate,
46
- maxDate = params.maxDate;
44
+ var format = params.format,
45
+ minDate = params.minDate,
46
+ maxDate = params.maxDate,
47
+ momentMinDate = params.momentMinDate,
48
+ momentMaxDate = params.momentMaxDate,
49
+ isDontLimitFuture = params.isDontLimitFuture;
47
50
 
48
51
  var _useState = (0, _react.useState)({}),
49
52
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -67,17 +70,15 @@ function _default(props) {
67
70
 
68
71
  var yearInputRef = (0, _react.useRef)(null);
69
72
  var selectedDay = (0, _moment.default)(showDate);
70
- var isError = 'Invalid date'; // const title = useMemo(
71
- // () => (selectedDay.format('MMM') === isError ? isError : `${selectedDay.format('MMM')} ${moment(showDate).format('YYYY')}`),
72
- // [date, showDate]
73
- // );
74
-
73
+ var isError = 'Invalid date';
75
74
  var showMonth = (0, _react.useMemo)(function () {
76
75
  return (0, _moment.default)(showDate).format('MMM');
77
76
  }, [date, showDate]);
78
77
  var showYear = (0, _react.useMemo)(function () {
79
78
  return (0, _moment.default)(showDate).format('YYYY');
80
79
  }, [date, showDate]);
80
+ var isShovPrevArrow = allowPrev && !(minDate && (0, _moment.default)(showDate).startOf('month').isSameOrBefore(momentMinDate, 'months'));
81
+ var isShovNextArrow = allowNext && (isDontLimitFuture || !(0, _moment.default)(showDate).startOf('month').isSameOrAfter(maxDate ? momentMaxDate : (0, _moment.default)().add(1, 'day').startOf('day'), 'months'));
81
82
  (0, _react.useEffect)(function () {
82
83
  var result = {};
83
84
  var day = selectedDay.startOf('month');
@@ -106,8 +107,8 @@ function _default(props) {
106
107
  if (!day) return /*#__PURE__*/_react.default.createElement("div", {
107
108
  className: "calendar__day"
108
109
  });
109
- var isFutureDay = day && maxDate ? (0, _moment.default)(day.date).isAfter((0, _moment.default)(maxDate || ''), 'day') : (0, _moment.default)(day.date).isAfter((0, _moment.default)(), 'day');
110
- var isBeforeDay = day && (0, _moment.default)(day.date).isBefore((0, _moment.default)(minDate || ''), 'day');
110
+ var isFutureDay = day && !isDontLimitFuture && maxDate ? (0, _moment.default)(day.date).isAfter(momentMaxDate || (0, _moment.default)().add(1, 'days'), 'day') : (0, _moment.default)(day.date).isAfter((0, _moment.default)(), 'day');
111
+ var isBeforeDay = day && (0, _moment.default)(day.date).isBefore(momentMinDate || '', 'day');
111
112
  var classNames = (0, _classnames.default)('calendar__day', {
112
113
  'calendar__day--clickable': day
113
114
  }, {
@@ -170,7 +171,7 @@ function _default(props) {
170
171
  className: "calendar-header"
171
172
  }, /*#__PURE__*/_react.default.createElement("div", {
172
173
  className: "calendar-header__prev"
173
- }, allowPrev && /*#__PURE__*/_react.default.createElement("div", {
174
+ }, isShovPrevArrow && /*#__PURE__*/_react.default.createElement("div", {
174
175
  onClick: handlePrev
175
176
  }, /*#__PURE__*/_react.default.createElement(_reactFeather.ChevronLeft, null))), /*#__PURE__*/_react.default.createElement("div", {
176
177
  className: (0, _classnames.default)('calendar-header__title'),
@@ -200,7 +201,7 @@ function _default(props) {
200
201
  }
201
202
  }) : "".concat(showYear))), /*#__PURE__*/_react.default.createElement("div", {
202
203
  className: "calendar-header__next"
203
- }, allowNext && /*#__PURE__*/_react.default.createElement("div", {
204
+ }, isShovNextArrow && /*#__PURE__*/_react.default.createElement("div", {
204
205
  onClick: handleNext
205
206
  }, /*#__PURE__*/_react.default.createElement(_reactFeather.ChevronRight, null)))), /*#__PURE__*/_react.default.createElement("div", {
206
207
  className: "calendar__week"
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+
3
+ (function () {
4
+ Element.prototype._addEventListener = Element.prototype.addEventListener;
5
+
6
+ Element.prototype.addEventListener = function (a, b, c) {
7
+ if (c == undefined) c = false;
8
+
9
+ this._addEventListener(a, b, c);
10
+
11
+ if (!this.eventListenerList) this.eventListenerList = {};
12
+ if (!this.eventListenerList[a]) this.eventListenerList[a] = []; //this.removeEventListener(a,b,c); // TODO - handle duplicates..
13
+
14
+ this.eventListenerList[a].push({
15
+ listener: b,
16
+ useCapture: c
17
+ });
18
+ };
19
+
20
+ Element.prototype.getEventListeners = function (a) {
21
+ if (!this.eventListenerList) this.eventListenerList = {};
22
+ if (a == undefined) return this.eventListenerList;
23
+ return this.eventListenerList[a];
24
+ };
25
+
26
+ Element.prototype.clearEventListeners = function (a) {
27
+ if (!this.eventListenerList) this.eventListenerList = {};
28
+
29
+ if (a == undefined) {
30
+ for (var x in this.getEventListeners()) {
31
+ this.clearEventListeners(x);
32
+ }
33
+
34
+ return;
35
+ }
36
+
37
+ var el = this.getEventListeners(a);
38
+ if (el == undefined) return;
39
+
40
+ for (var i = el.length - 1; i >= 0; --i) {
41
+ var ev = el[i];
42
+ this.removeEventListener(a, ev.listener, ev.useCapture);
43
+ }
44
+ };
45
+
46
+ Element.prototype._removeEventListener = Element.prototype.removeEventListener;
47
+
48
+ Element.prototype.removeEventListener = function (a, b, c) {
49
+ if (c == undefined) c = false;
50
+
51
+ this._removeEventListener(a, b, c);
52
+
53
+ if (!this.eventListenerList) this.eventListenerList = {};
54
+ if (!this.eventListenerList[a]) this.eventListenerList[a] = []; // Find the event in the list
55
+
56
+ for (var i = 0; i < this.eventListenerList[a].length; i++) {
57
+ if (this.eventListenerList[a][i].listener == b, this.eventListenerList[a][i].useCapture == c) {
58
+ // Hmm..
59
+ this.eventListenerList[a].splice(i, 1);
60
+ break;
61
+ }
62
+ }
63
+
64
+ if (this.eventListenerList[a].length == 0) delete this.eventListenerList[a];
65
+ };
66
+ })();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "intelicoreact",
3
- "version": "0.0.94",
3
+ "version": "0.0.95",
4
4
  "description": "fix input-calendar",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -12,17 +12,29 @@ const InputCalendar = ({
12
12
  value,
13
13
  minDate,
14
14
  maxDate,
15
+ format = 'MM/DD/YYYY',
16
+ isDontLimitFuture,
15
17
  onChange,
16
18
  className = '',
17
19
  placeholder = 'mm/dd/yyyy',
18
20
  mask = '99/99/9999',
19
- isDontLimitFuture,
20
21
  isListTop,
21
22
  disabled,
22
23
  }) => {
23
24
  const [isOpened, setIsOpened] = useState(false);
24
25
  const calendarRef = useRef(null);
25
26
 
27
+ const formatedMinDate = moment(minDate).format(format) !== 'Invalid date'
28
+ ? moment(minDate).format(format)
29
+ : null;
30
+
31
+ const formatedMaxDate = moment(maxDate).format(format) !== 'Invalid date'
32
+ ? moment(maxDate).format(format)
33
+ : null;
34
+
35
+ const momentMinDate = moment(formatedMinDate, format).startOf('day');
36
+ const momentMaxDate = moment(formatedMaxDate, format).startOf('day');
37
+
26
38
  useClickOutside(calendarRef, () => setIsOpened(false));
27
39
 
28
40
  const changeInputValue = (val) => {
@@ -41,6 +53,14 @@ const InputCalendar = ({
41
53
  return moment(new Date()).format('L');
42
54
  };
43
55
 
56
+ const handleBlur = (e) => {
57
+ const value = e.target.value;
58
+ if (moment(value).format(format) === 'Invalid date') onChange('');
59
+ else if (moment(value).startOf('day').isBefore(momentMinDate, 'days')) onChange(formatedMinDate);
60
+ else if (moment(value).endOf('day').isAfter(momentMaxDate, 'days')) onChange(formatedMaxDate);
61
+ else onChange(moment(value).format(format));
62
+ };
63
+
44
64
  return (
45
65
  <div
46
66
  className={cn('input__wrap calendar-container', className, {
@@ -55,13 +75,24 @@ const InputCalendar = ({
55
75
  onChange={(e) => changeInputValue(e.target.value)}
56
76
  className="calendar-dropdown"
57
77
  onFocus={() => setIsOpened(true)}
78
+ onBlur={!isOpened ? handleBlur : () => {}}
79
+ onKeyUp={e => {
80
+ if (e.key === 'Enter') e.target.blur();
81
+ setIsOpened(false);
82
+ }}
58
83
  />
59
84
  {isOpened ? (
60
85
  <Calendar
61
86
  date={getCalendarValue(value)}
62
87
  setDate={(newDate) => changeCalendarDay(newDate)}
63
- params={{ minDate, maxDate }}
64
- isDontLimitFuture={isDontLimitFuture}
88
+ params={{
89
+ format,
90
+ minDate: formatedMinDate,
91
+ maxDate: formatedMaxDate,
92
+ momentMinDate,
93
+ momentMaxDate,
94
+ isDontLimitFuture
95
+ }}
65
96
  isListTop={isListTop}
66
97
  setIsOpened={setIsOpened}
67
98
  />
@@ -1,4 +1,4 @@
1
- import React, { useState } from 'react';
1
+ import React, { useEffect, useState } from 'react';
2
2
  import InputCalendar from './InputCalendar';
3
3
 
4
4
  global.lng = 'en';
@@ -32,8 +32,8 @@ const Template = (args) => {
32
32
  export const CalendarTemplate = Template.bind({});
33
33
 
34
34
  CalendarTemplate.args = {
35
- minDate: '01/01/1900',
36
- maxDate: '01/01/2100',
37
- isDontLimitFuture: true,
35
+ minDate: '01/10/2022',
36
+ maxDate: '04/20/2022',
37
+ // isDontLimitFuture: true,
38
38
  // isListTop: true,
39
39
  };
@@ -9,7 +9,7 @@ import Arrow from '../../UI/Arrow/Arrow';
9
9
 
10
10
  import './InputDateRange.scss';
11
11
 
12
- const InputDateRange = props => {
12
+ const InputDateRange = (props) => {
13
13
  const {
14
14
  txt,
15
15
  id,
@@ -26,8 +26,21 @@ const InputDateRange = props => {
26
26
  isUseAbs,
27
27
  minDate = null,
28
28
  maxDate = null,
29
+ format = 'MM/DD/YYYY',
30
+ isDontLimitFuture,
29
31
  } = props;
30
32
 
33
+ const formatedMinDate = moment(minDate).format(format) !== 'Invalid date'
34
+ ? moment(minDate).format(format)
35
+ : null;
36
+
37
+ const formatedMaxDate = moment(maxDate).format(format) !== 'Invalid date'
38
+ ? moment(maxDate).format(format)
39
+ : null;
40
+
41
+ const momentMinDate = moment(formatedMinDate, format).startOf('day');
42
+ const momentMaxDate = moment(formatedMaxDate, format).startOf('day');
43
+
31
44
  const actualValues = getActualDateRange(value);
32
45
  const { isToggled, toggle, toggleOn, toggleOff } = useToggle(false);
33
46
  const [current, setCurrent] = useState(actualValues?.intervalKey);
@@ -36,16 +49,15 @@ const InputDateRange = props => {
36
49
  const ref = !isUseAbs ? useClickOutside(toggleOff) : useRef(null);
37
50
  const internalContainerRef = useRef(null);
38
51
 
39
- const handleChange = input => {
40
-
52
+ const handleChange = (input) => {
41
53
  const newValue = getActualDateRange(input);
42
54
  const formatedValue = {
43
55
  intervalKey: newValue.intervalKey,
44
- start: newValue.start ? moment(newValue.start).format('YYYY-MM-DDTHH:mm') : newValue.start,
45
- end: newValue.end ? moment(newValue.end).format('YYYY-MM-DDTHH:mm') : newValue.end,
56
+ start: newValue.start ? moment(newValue.start).format(format || 'YYYY-MM-DDTHH:mm') : newValue.start,
57
+ end: newValue.end ? moment(newValue.end).format(format || 'YYYY-MM-DDTHH:mm') : newValue.end,
46
58
  ...(newValue.compare ? { compare: newValue.compare } : {}),
47
- ...(newValue.startPrevDate ? { startPrevDate: moment(newValue.startPrevDate).format('YYYY-MM-DDTHH:mm') } : {}),
48
- ...(newValue.endPrevDate ? { endPrevDate: moment(newValue.endPrevDate).format('YYYY-MM-DDTHH:mm') } : {})
59
+ ...(newValue.startPrevDate ? { startPrevDate: moment(newValue.startPrevDate).format(format || 'YYYY-MM-DDTHH:mm') } : {}),
60
+ ...(newValue.endPrevDate ? { endPrevDate: moment(newValue.endPrevDate).format(format || 'YYYY-MM-DDTHH:mm') } : {}),
49
61
  };
50
62
 
51
63
  onChange(formatedValue);
@@ -69,9 +81,9 @@ const InputDateRange = props => {
69
81
  endTime !== '00:00' ? `(${endTime})` : ''
70
82
  }`;
71
83
 
72
- const getClasses = base =>
84
+ const getClasses = (base) =>
73
85
  cn('date-range-input__range-text', {
74
- 'date-range-input__range-text_little': base.length > SYMBOLS_QUANTITY_IF_TIME_ADDED
86
+ 'date-range-input__range-text_little': base.length > SYMBOLS_QUANTITY_IF_TIME_ADDED,
75
87
  });
76
88
 
77
89
  return (
@@ -113,16 +125,16 @@ const InputDateRange = props => {
113
125
  ...value,
114
126
  intervalKey: getActualDateRange({
115
127
  start: newStart,
116
- end: newEnd
128
+ end: newEnd,
117
129
  })?.intervalKey,
118
130
  start: newStart,
119
131
  end: newEnd,
120
132
  startPrevDate,
121
- endPrevDate
133
+ endPrevDate,
122
134
  });
123
135
  };
124
136
 
125
- const handleArrowClick = type => {
137
+ const handleArrowClick = (type) => {
126
138
  slideInterval(type === 'right' ? 'forward' : 'back');
127
139
  toggleOff();
128
140
  };
@@ -135,7 +147,7 @@ const InputDateRange = props => {
135
147
  'date-range-input_hide-arrows': hideArrows,
136
148
  'date-range-input_focused': isToggled,
137
149
  'date-range-input_error': error,
138
- 'date-range-input_disabled': disabled
150
+ 'date-range-input_disabled': disabled,
139
151
  })}
140
152
  >
141
153
  <span className="date-range-input__label">{label}</span>
@@ -147,7 +159,7 @@ const InputDateRange = props => {
147
159
  >
148
160
  <div
149
161
  className={cn('date-range-input__absolut-wraper', {
150
- 'date-range-input__absolut-wraper_right-position': isOptionsRight
162
+ 'date-range-input__absolut-wraper_right-position': isOptionsRight,
151
163
  })}
152
164
  >
153
165
  <div className={cn('date-range-input__static-part')}>
@@ -160,7 +172,7 @@ const InputDateRange = props => {
160
172
  <div className="date-range-input__interval-key">
161
173
  <span>
162
174
  {(txt?.labels && txt.labels[actualValues?.intervalKey]) ??
163
- (INTERVALS[actualValues?.intervalKey]?.label || CUSTOM_INTERVAL_KEY_TEXT)}
175
+ (INTERVALS[actualValues?.intervalKey]?.label || CUSTOM_INTERVAL_KEY_TEXT)}
164
176
  </span>
165
177
  {current !== ALL_TIME_KEY && <span>:</span>}
166
178
  </div>
@@ -176,7 +188,15 @@ const InputDateRange = props => {
176
188
  type="left"
177
189
  className="date-range-input__arrow"
178
190
  onClick={() => handleArrowClick('left')}
179
- disabled={disabled || actualValues?.intervalKey === ALL_TIME_KEY}
191
+ disabled={
192
+ disabled ||
193
+ actualValues?.intervalKey === ALL_TIME_KEY ||
194
+ (formatedMinDate &&
195
+ moment(actualValues?.start)
196
+ .subtract(moment(actualValues?.end).diff(actualValues?.start, 'hours'), 'hours')
197
+ .isBefore(momentMinDate)
198
+ )
199
+ }
180
200
  />
181
201
  <Arrow
182
202
  type="right"
@@ -185,10 +205,21 @@ const InputDateRange = props => {
185
205
  disabled={
186
206
  disabled ||
187
207
  actualValues?.intervalKey === ALL_TIME_KEY ||
188
- actualValues?.intervalKey === 'today' ||
189
- moment(actualValues?.end)
190
- .add(moment(actualValues?.end).diff(actualValues?.start, 'hours'), 'hours')
191
- .isAfter(moment().add(1, 'day').startOf('day'))
208
+ (!isDontLimitFuture &&
209
+ (formatedMaxDate
210
+ ? (
211
+ moment(actualValues?.end)
212
+ .endOf('day')
213
+ .subtract(moment(actualValues?.end).diff(actualValues?.start, 'hours'), 'hours')
214
+ .isAfter(momentMaxDate.startOf('day'))
215
+ )
216
+ : (
217
+ moment(actualValues?.end)
218
+ .add(moment(actualValues?.end).diff(actualValues?.start, 'hours'), 'hours')
219
+ .isAfter(moment().add(1, 'day').startOf('day'))
220
+ )
221
+ )
222
+ )
192
223
  }
193
224
  />
194
225
  </div>
@@ -205,8 +236,12 @@ const InputDateRange = props => {
205
236
  setIsCompare={setIsCompare}
206
237
  toggleOff={toggleOff}
207
238
  onChange={handleChange}
208
- minDate={minDate ? moment(minDate) : null}
209
- maxDate={maxDate ? moment(maxDate) : null}
239
+ minDate={formatedMinDate}
240
+ maxDate={formatedMaxDate}
241
+ format={format}
242
+ momentMinDate={momentMinDate}
243
+ momentMaxDate={momentMaxDate}
244
+ isDontLimitFuture={isDontLimitFuture}
210
245
  />
211
246
  )}
212
247
  </div>
@@ -1,4 +1,6 @@
1
1
  import React, { /* useEffect, */ useState } from 'react';
2
+ import moment from 'moment-timezone';
3
+
2
4
  import InputDateRange from './InputDateRange';
3
5
  import Table from '../Table/Table';
4
6
 
@@ -14,15 +16,13 @@ export default {
14
16
  // options: ['admin', 'user']
15
17
  // }
16
18
  // }
17
- }
19
+ },
18
20
  };
19
21
 
20
- const Template = args => {
22
+ const Template = (args) => {
21
23
  const { dateRange, ...restOfProps } = args;
22
24
  const [value, setValue] = useState(dateRange);
23
- // useEffect(() => console.log(value), [value]);
24
25
 
25
- // return <InputDateRange {...restOfProps} value={value} onChange={setValue} />;
26
26
  return (
27
27
  <div>
28
28
  <div className="mb20">
@@ -38,7 +38,7 @@ InputDateRangeTemplate.args = {
38
38
  txt: {},
39
39
  buttonsTypes: {
40
40
  // apply: 'ellipse-apply',
41
- cancel: 'bark-outline'
41
+ cancel: 'bark-outline',
42
42
  },
43
43
  label: 'Date Range',
44
44
  dateRange: { intervalKey: 'today' },
@@ -47,8 +47,10 @@ InputDateRangeTemplate.args = {
47
47
  error: false,
48
48
  disabled: false,
49
49
  isHoverable: false,
50
- minDate: "",
51
- maxDate: "",
50
+ // format: 'DD/MM/YYYY',
51
+ minDate: '01/10/2022',
52
+ maxDate: '04/20/2022',
53
+ // isDontLimitFuture: true,
52
54
  // short: true,
53
55
  isCompact: false,
54
56
  // isFocused: true,
@@ -56,7 +58,7 @@ InputDateRangeTemplate.args = {
56
58
  isCompareHidden: true,
57
59
  hideArrows: false,
58
60
  isOptionsRight: false,
59
- isShortWeekNames: false
61
+ isShortWeekNames: false,
60
62
  // limitRange,
61
63
  // isUseAbs,
62
64
  // absTooltip