@seafile/seafile-calendar 1.0.21 → 1.0.23-avb.71

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.
@@ -1,3 +1,4 @@
1
+ import _extends from 'babel-runtime/helpers/extends';
1
2
  import _classCallCheck from 'babel-runtime/helpers/classCallCheck';
2
3
  import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';
3
4
  import _inherits from 'babel-runtime/helpers/inherits';
@@ -5,6 +6,8 @@ import React from 'react';
5
6
  import PropTypes from 'prop-types';
6
7
  import dayjs from 'dayjs';
7
8
 
9
+ var MIN_SCROLLBAR_THUMB_HEIGHT = 24;
10
+
8
11
  var CalendarRightPanel = function (_React$Component) {
9
12
  _inherits(CalendarRightPanel, _React$Component);
10
13
 
@@ -13,6 +16,90 @@ var CalendarRightPanel = function (_React$Component) {
13
16
 
14
17
  var _this = _possibleConstructorReturn(this, _React$Component.call(this, props));
15
18
 
19
+ _this.getTimeColumnContainer = function (type) {
20
+ return type === 'hour' ? _this.hoursRef.current : _this.minutesRef.current;
21
+ };
22
+
23
+ _this.onTimeColumnScroll = function (type, container) {
24
+ var clientHeight = container.clientHeight,
25
+ scrollHeight = container.scrollHeight,
26
+ scrollTop = container.scrollTop;
27
+
28
+ if (scrollHeight <= clientHeight) return;
29
+
30
+ var trackHeight = clientHeight;
31
+ var height = Math.min(trackHeight, Math.max(MIN_SCROLLBAR_THUMB_HEIGHT, clientHeight / scrollHeight * trackHeight));
32
+ var maxTop = trackHeight - height;
33
+ var maxScrollTop = scrollHeight - clientHeight;
34
+ var top = maxScrollTop > 0 ? scrollTop / maxScrollTop * maxTop : 0;
35
+
36
+ clearTimeout(_this.scrollbarTimeouts[type]);
37
+ _this.setState(function (prevState) {
38
+ var _extends2;
39
+
40
+ return {
41
+ scrollbars: _extends({}, prevState.scrollbars, (_extends2 = {}, _extends2[type] = { visible: true, top: top, height: height }, _extends2))
42
+ };
43
+ });
44
+ _this.scrollbarTimeouts[type] = setTimeout(function () {
45
+ _this.setState(function (prevState) {
46
+ var _extends3;
47
+
48
+ return {
49
+ scrollbars: _extends({}, prevState.scrollbars, (_extends3 = {}, _extends3[type] = _extends({}, prevState.scrollbars[type], { visible: false }), _extends3))
50
+ };
51
+ });
52
+ }, 800);
53
+ };
54
+
55
+ _this.onScrollbarThumbMouseDown = function (type, event) {
56
+ var container = _this.getTimeColumnContainer(type);
57
+ var _this$state$scrollbar = _this.state.scrollbars[type],
58
+ top = _this$state$scrollbar.top,
59
+ height = _this$state$scrollbar.height;
60
+
61
+ if (!container || !height) return;
62
+
63
+ event.preventDefault();
64
+ _this.draggingScrollbar = {
65
+ type: type,
66
+ startClientY: event.clientY,
67
+ startTop: top
68
+ };
69
+ window.addEventListener('mousemove', _this.onScrollbarThumbMouseMove);
70
+ window.addEventListener('mouseup', _this.onScrollbarThumbMouseUp);
71
+ };
72
+
73
+ _this.onScrollbarThumbMouseMove = function (event) {
74
+ if (!_this.draggingScrollbar) return;
75
+
76
+ var _this$draggingScrollb = _this.draggingScrollbar,
77
+ type = _this$draggingScrollb.type,
78
+ startClientY = _this$draggingScrollb.startClientY,
79
+ startTop = _this$draggingScrollb.startTop;
80
+
81
+ var container = _this.getTimeColumnContainer(type);
82
+ var height = _this.state.scrollbars[type].height;
83
+
84
+ if (!container) return;
85
+
86
+ var maxTop = Math.max(0, container.clientHeight - height);
87
+ var top = Math.max(0, Math.min(maxTop, startTop + event.clientY - startClientY));
88
+ var maxScrollTop = container.scrollHeight - container.clientHeight;
89
+ container.scrollTop = maxTop > 0 ? top / maxTop * maxScrollTop : 0;
90
+ _this.onTimeColumnScroll(type, container);
91
+ };
92
+
93
+ _this.onScrollbarThumbMouseUp = function () {
94
+ _this.draggingScrollbar = null;
95
+ _this.removeScrollbarDragListeners();
96
+ };
97
+
98
+ _this.removeScrollbarDragListeners = function () {
99
+ window.removeEventListener('mousemove', _this.onScrollbarThumbMouseMove);
100
+ window.removeEventListener('mouseup', _this.onScrollbarThumbMouseUp);
101
+ };
102
+
16
103
  _this.centerScroll = function (container, index) {
17
104
  if (!container || index < 0) return;
18
105
  var firstItem = container.querySelector('li');
@@ -78,10 +165,35 @@ var CalendarRightPanel = function (_React$Component) {
78
165
  return v ? v.format('mm') : null;
79
166
  };
80
167
 
168
+ _this.renderScrollbar = function (type, prefixCls) {
169
+ var _this$state$scrollbar2 = _this.state.scrollbars[type],
170
+ visible = _this$state$scrollbar2.visible,
171
+ top = _this$state$scrollbar2.top,
172
+ height = _this$state$scrollbar2.height;
173
+
174
+ var visibleClassName = prefixCls + '-right-panel-scrollbar-visible';
175
+ var className = prefixCls + '-right-panel-scrollbar' + (visible ? ' ' + visibleClassName : '');
176
+ return React.createElement(
177
+ 'div',
178
+ { className: className, 'aria-hidden': 'true' },
179
+ React.createElement('div', {
180
+ className: prefixCls + '-right-panel-scrollbar-thumb',
181
+ style: { height: height, transform: 'translateY(' + top + 'px)' },
182
+ onMouseDown: function onMouseDown(event) {
183
+ return _this.onScrollbarThumbMouseDown(type, event);
184
+ }
185
+ })
186
+ );
187
+ };
188
+
81
189
  var format = Array.isArray(_this.props.format) ? _this.props.format[0] : _this.props.format;
82
190
  _this.state = {
83
191
  highlightTime: _this.props.selectedValue || null,
84
- localeFormat: format
192
+ localeFormat: format,
193
+ scrollbars: {
194
+ hour: { visible: false, top: 0, height: 0 },
195
+ minute: { visible: false, top: 0, height: 0 }
196
+ }
85
197
  };
86
198
 
87
199
  _this.hoursRef = React.createRef();
@@ -90,6 +202,8 @@ var CalendarRightPanel = function (_React$Component) {
90
202
  _this.minutes = _this.getMinutes();
91
203
 
92
204
  _this.skipScrollUpdates = 0;
205
+ _this.scrollbarTimeouts = {};
206
+ _this.draggingScrollbar = null;
93
207
  return _this;
94
208
  }
95
209
 
@@ -174,88 +288,118 @@ var CalendarRightPanel = function (_React$Component) {
174
288
  }
175
289
  };
176
290
 
177
- CalendarRightPanel.prototype.render = function render() {
291
+ CalendarRightPanel.prototype.componentWillUnmount = function componentWillUnmount() {
178
292
  var _this4 = this;
179
293
 
294
+ Object.keys(this.scrollbarTimeouts).forEach(function (type) {
295
+ clearTimeout(_this4.scrollbarTimeouts[type]);
296
+ });
297
+ this.removeScrollbarDragListeners();
298
+ };
299
+
300
+ CalendarRightPanel.prototype.render = function render() {
301
+ var _this5 = this;
302
+
180
303
  var prefixCls = this.props.prefixCls;
181
304
 
182
305
  var selectedHour = this.getSelectedHour();
183
306
  var selectedMinute = this.getSelectedMinute();
184
307
  var currentHour = dayjs().format('HH');
185
308
  var currentMinute = dayjs().format('mm');
186
- var displayHour = selectedHour || currentHour;
187
- var displayMinute = selectedMinute || currentMinute;
188
309
 
189
310
  return React.createElement(
190
311
  'div',
191
312
  { className: prefixCls + '-right-panel' },
192
- React.createElement(
193
- 'div',
194
- { className: prefixCls + '-right-panel-header ' + prefixCls + '-header' },
195
- displayHour,
196
- ':',
197
- displayMinute
198
- ),
199
313
  React.createElement(
200
314
  'div',
201
315
  { className: prefixCls + '-right-panel-body' },
202
316
  React.createElement(
203
317
  'div',
204
- { className: prefixCls + '-right-panel-col', ref: this.hoursRef },
318
+ { className: prefixCls + '-right-panel-col-wrap ' + prefixCls + '-right-panel-col-hour' },
205
319
  React.createElement(
206
- 'ul',
207
- null,
208
- this.hours.map(function (h) {
209
- var isSelected = selectedHour && h === selectedHour;
210
- var isCurrent = !selectedHour && h === currentHour;
211
- var className = prefixCls + '-right-panel-item-text ' + (isSelected ? prefixCls + '-right-panel-item-selected' : '') + ' ' + (isCurrent ? prefixCls + '-right-panel-item-current' : '');
212
- return React.createElement(
213
- 'li',
214
- {
215
- key: h,
216
- onClick: function onClick() {
217
- return _this4.onSelectHour(h);
218
- },
219
- className: prefixCls + '-right-panel-item',
220
- title: h
221
- },
222
- React.createElement(
223
- 'span',
224
- { className: className },
225
- h
226
- )
227
- );
228
- })
229
- )
320
+ 'div',
321
+ {
322
+ className: prefixCls + '-right-panel-col',
323
+ ref: this.hoursRef,
324
+ onScroll: function onScroll(event) {
325
+ return _this5.onTimeColumnScroll('hour', event.currentTarget);
326
+ }
327
+ },
328
+ React.createElement(
329
+ 'div',
330
+ { className: prefixCls + '-right-panel-col-item' },
331
+ React.createElement(
332
+ 'ul',
333
+ null,
334
+ this.hours.map(function (h) {
335
+ var isSelected = selectedHour && h === selectedHour;
336
+ var isCurrent = !selectedHour && h === currentHour;
337
+ var className = prefixCls + '-right-panel-item-text ' + (isSelected ? prefixCls + '-right-panel-item-selected' : '') + ' ' + (isCurrent ? prefixCls + '-right-panel-item-current' : '');
338
+ return React.createElement(
339
+ 'li',
340
+ {
341
+ key: h,
342
+ onClick: function onClick() {
343
+ return _this5.onSelectHour(h);
344
+ },
345
+ className: prefixCls + '-right-panel-item',
346
+ title: h
347
+ },
348
+ React.createElement(
349
+ 'span',
350
+ { className: className },
351
+ h
352
+ )
353
+ );
354
+ })
355
+ )
356
+ )
357
+ ),
358
+ this.renderScrollbar('hour', prefixCls)
230
359
  ),
231
360
  React.createElement(
232
361
  'div',
233
- { className: prefixCls + '-right-panel-col', ref: this.minutesRef },
362
+ { className: prefixCls + '-right-panel-col-wrap' },
234
363
  React.createElement(
235
- 'ul',
236
- null,
237
- this.minutes.map(function (m) {
238
- var isSelected = selectedMinute && m === selectedMinute;
239
- var isCurrent = !selectedMinute && m === currentMinute;
240
- var className = prefixCls + '-right-panel-item-text ' + (isSelected ? prefixCls + '-right-panel-item-selected' : '') + ' ' + (isCurrent ? prefixCls + '-right-panel-item-current' : '');
241
- return React.createElement(
242
- 'li',
243
- {
244
- key: m,
245
- onClick: function onClick() {
246
- return _this4.onSelectMinute(m);
247
- },
248
- className: prefixCls + '-right-panel-item',
249
- title: m
250
- },
251
- React.createElement(
252
- 'span',
253
- { className: className },
254
- m
255
- )
256
- );
257
- })
258
- )
364
+ 'div',
365
+ {
366
+ className: prefixCls + '-right-panel-col',
367
+ ref: this.minutesRef,
368
+ onScroll: function onScroll(event) {
369
+ return _this5.onTimeColumnScroll('minute', event.currentTarget);
370
+ }
371
+ },
372
+ React.createElement(
373
+ 'div',
374
+ { className: prefixCls + '-right-panel-col-item' },
375
+ React.createElement(
376
+ 'ul',
377
+ null,
378
+ this.minutes.map(function (m) {
379
+ var isSelected = selectedMinute && m === selectedMinute;
380
+ var isCurrent = !selectedMinute && m === currentMinute;
381
+ var className = prefixCls + '-right-panel-item-text ' + (isSelected ? prefixCls + '-right-panel-item-selected' : '') + ' ' + (isCurrent ? prefixCls + '-right-panel-item-current' : '');
382
+ return React.createElement(
383
+ 'li',
384
+ {
385
+ key: m,
386
+ onClick: function onClick() {
387
+ return _this5.onSelectMinute(m);
388
+ },
389
+ className: prefixCls + '-right-panel-item',
390
+ title: m
391
+ },
392
+ React.createElement(
393
+ 'span',
394
+ { className: className },
395
+ m
396
+ )
397
+ );
398
+ })
399
+ )
400
+ )
401
+ ),
402
+ this.renderScrollbar('minute', prefixCls)
259
403
  )
260
404
  )
261
405
  );
@@ -73,7 +73,7 @@ var DateTHead = function (_React$Component) {
73
73
  null,
74
74
  React.createElement(
75
75
  'tr',
76
- { role: 'row' },
76
+ { role: 'row', className: prefixCls + '-week-date-header' },
77
77
  showWeekNumberEl,
78
78
  weekDaysEls
79
79
  )
@@ -116,8 +116,8 @@ var TimeInput = function (_React$Component) {
116
116
  TimeInput.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, state) {
117
117
  var newState = null;
118
118
  if (!state.hasFocus) {
119
- var base = nextProps.selectedValue || null;
120
- newState = { str: base ? formatTime(base, nextProps.format) : '' };
119
+ var base = nextProps.selectedValue || dayjs();
120
+ newState = { str: formatTime(base, nextProps.format) };
121
121
  }
122
122
  return newState;
123
123
  };
package/lib/Calendar.js CHANGED
@@ -229,79 +229,81 @@ var Calendar = function (_React$Component) {
229
229
  }
230
230
 
231
231
  var showTimeControls = showHourAndMinute && mode === 'date';
232
-
233
- children.push(_react2['default'].createElement(
232
+ var dateInputColumnElement = _react2['default'].createElement(
234
233
  'div',
235
- { className: prefixCls + '-panel', key: 'panel' },
234
+ { className: prefixCls + '-date-input-col' },
236
235
  _react2['default'].createElement(
237
236
  'div',
238
- { className: prefixCls + '-inputs' },
237
+ { className: prefixCls + '-date-input' },
238
+ dateInputElement
239
+ )
240
+ );
241
+ var datePanelElement = _react2['default'].createElement(
242
+ 'div',
243
+ {
244
+ tabIndex: this.props.focusablePanel ? 0 : undefined,
245
+ className: prefixCls + '-date-panel'
246
+ },
247
+ _react2['default'].createElement(_CalendarHeader2['default'], {
248
+ locale: locale,
249
+ mode: mode,
250
+ value: value,
251
+ onValueChange: this.setValue,
252
+ onPanelChange: this.onPanelChange,
253
+ renderFooter: renderFooter,
254
+ showTimePicker: showTimePicker,
255
+ prefixCls: prefixCls,
256
+ showHourAndMinute: showHourAndMinute
257
+ }),
258
+ timePicker && showTimePicker ? _react2['default'].createElement(
259
+ 'div',
260
+ { className: prefixCls + '-time-picker' },
239
261
  _react2['default'].createElement(
240
262
  'div',
241
- { className: prefixCls + '-date-input-col' },
242
- _react2['default'].createElement(
243
- 'div',
244
- { className: prefixCls + '-date-input' },
245
- dateInputElement
246
- )
247
- ),
248
- showTimeControls && _react2['default'].createElement(
249
- 'div',
250
- { className: prefixCls + '-time-input-col' },
251
- _react2['default'].createElement(
252
- 'div',
253
- { className: prefixCls + '-time-input' },
254
- timeInputTopElement
255
- )
263
+ { className: prefixCls + '-time-picker-panel' },
264
+ timePickerEle
256
265
  )
266
+ ) : null,
267
+ _react2['default'].createElement(
268
+ 'div',
269
+ { className: prefixCls + '-body' },
270
+ _react2['default'].createElement(_DateTable2['default'], {
271
+ locale: locale,
272
+ value: value,
273
+ selectedValue: selectedValue,
274
+ prefixCls: prefixCls,
275
+ dateRender: props.dateRender,
276
+ onSelect: this.onDateTableSelect,
277
+ disabledDate: disabledDate,
278
+ showWeekNumber: showWeekNumber,
279
+ firstDayOfWeek: firstDayOfWeek,
280
+ currentStatus: currentStatus
281
+ })
282
+ )
283
+ );
284
+
285
+ var dateTimePanelElement = showTimeControls ? _react2['default'].createElement(
286
+ 'div',
287
+ { className: prefixCls + '-date-time-panel' },
288
+ _react2['default'].createElement(
289
+ 'div',
290
+ { className: prefixCls + '-date-panel-column' },
291
+ dateInputColumnElement,
292
+ datePanelElement
257
293
  ),
258
294
  _react2['default'].createElement(
259
295
  'div',
260
- { className: prefixCls + '-date-panel-container' },
296
+ { className: prefixCls + '-time-panel-column' },
261
297
  _react2['default'].createElement(
262
298
  'div',
263
- {
264
- tabIndex: this.props.focusablePanel ? 0 : undefined,
265
- className: prefixCls + '-date-panel'
266
- },
267
- _react2['default'].createElement(_CalendarHeader2['default'], {
268
- locale: locale,
269
- mode: mode,
270
- value: value,
271
- onValueChange: this.setValue,
272
- onPanelChange: this.onPanelChange,
273
- renderFooter: renderFooter,
274
- showTimePicker: showTimePicker,
275
- prefixCls: prefixCls,
276
- showHourAndMinute: showHourAndMinute
277
- }),
278
- timePicker && showTimePicker ? _react2['default'].createElement(
279
- 'div',
280
- { className: prefixCls + '-time-picker' },
281
- _react2['default'].createElement(
282
- 'div',
283
- { className: prefixCls + '-time-picker-panel' },
284
- timePickerEle
285
- )
286
- ) : null,
299
+ { className: prefixCls + '-time-input-col' },
287
300
  _react2['default'].createElement(
288
301
  'div',
289
- { className: prefixCls + '-body' },
290
- _react2['default'].createElement(_DateTable2['default'], {
291
- locale: locale,
292
- value: value,
293
- selectedValue: selectedValue,
294
- prefixCls: prefixCls,
295
- dateRender: props.dateRender,
296
- onSelect: this.onDateTableSelect,
297
- disabledDate: disabledDate,
298
- showWeekNumber: showWeekNumber,
299
- firstDayOfWeek: firstDayOfWeek,
300
- currentStatus: currentStatus
301
- })
302
+ { className: prefixCls + '-time-input' },
303
+ timeInputTopElement
302
304
  )
303
305
  ),
304
- showTimeControls && _react2['default'].createElement(_CalendarRightPanel2['default'], {
306
+ _react2['default'].createElement(_CalendarRightPanel2['default'], {
305
307
  prefixCls: prefixCls,
306
308
  value: value,
307
309
  selectedValue: selectedValue,
@@ -311,7 +313,26 @@ var Calendar = function (_React$Component) {
311
313
  defaultMinutesTime: this.props.defaultMinutesTime,
312
314
  format: inputFormat
313
315
  })
316
+ )
317
+ ) : _react2['default'].createElement(
318
+ _react2['default'].Fragment,
319
+ null,
320
+ _react2['default'].createElement(
321
+ 'div',
322
+ { className: prefixCls + '-inputs' },
323
+ dateInputColumnElement
314
324
  ),
325
+ _react2['default'].createElement(
326
+ 'div',
327
+ { className: prefixCls + '-date-panel-container' },
328
+ datePanelElement
329
+ )
330
+ );
331
+
332
+ children.push(_react2['default'].createElement(
333
+ 'div',
334
+ { className: prefixCls + '-panel', key: 'panel' },
335
+ dateTimePanelElement,
315
336
  _react2['default'].createElement(_CalendarFooter2['default'], {
316
337
  showOk: props.showOk,
317
338
  mode: mode,