You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TimeGrid.js 12 KiB

3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. "use strict";
  2. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
  3. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  4. exports.__esModule = true;
  5. exports.default = void 0;
  6. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  7. var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
  8. var _propTypes = _interopRequireDefault(require("prop-types"));
  9. var _clsx = _interopRequireDefault(require("clsx"));
  10. var animationFrame = _interopRequireWildcard(require("dom-helpers/animationFrame"));
  11. var _react = _interopRequireWildcard(require("react"));
  12. var _reactDom = require("react-dom");
  13. var _memoizeOne = _interopRequireDefault(require("memoize-one"));
  14. var dates = _interopRequireWildcard(require("./utils/dates"));
  15. var _DayColumn = _interopRequireDefault(require("./DayColumn"));
  16. var _TimeGutter = _interopRequireDefault(require("./TimeGutter"));
  17. var _width = _interopRequireDefault(require("dom-helpers/width"));
  18. var _TimeGridHeader = _interopRequireDefault(require("./TimeGridHeader"));
  19. var _helpers = require("./utils/helpers");
  20. var _eventLevels = require("./utils/eventLevels");
  21. var _Resources = _interopRequireDefault(require("./utils/Resources"));
  22. var TimeGrid =
  23. /*#__PURE__*/
  24. function (_Component) {
  25. (0, _inheritsLoose2.default)(TimeGrid, _Component);
  26. function TimeGrid(props) {
  27. var _this;
  28. _this = _Component.call(this, props) || this;
  29. _this.handleScroll = function (e) {
  30. if (_this.scrollRef.current) {
  31. _this.scrollRef.current.scrollLeft = e.target.scrollLeft;
  32. }
  33. };
  34. _this.handleResize = function () {
  35. animationFrame.cancel(_this.rafHandle);
  36. _this.rafHandle = animationFrame.request(_this.checkOverflow);
  37. };
  38. _this.gutterRef = function (ref) {
  39. _this.gutter = ref && (0, _reactDom.findDOMNode)(ref);
  40. };
  41. _this.handleSelectAlldayEvent = function () {
  42. //cancel any pending selections so only the event click goes through.
  43. _this.clearSelection();
  44. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  45. args[_key] = arguments[_key];
  46. }
  47. (0, _helpers.notify)(_this.props.onSelectEvent, args);
  48. };
  49. _this.handleSelectAllDaySlot = function (slots, slotInfo) {
  50. var onSelectSlot = _this.props.onSelectSlot;
  51. (0, _helpers.notify)(onSelectSlot, {
  52. slots: slots,
  53. start: slots[0],
  54. end: slots[slots.length - 1],
  55. action: slotInfo.action
  56. });
  57. };
  58. _this.checkOverflow = function () {
  59. if (_this._updatingOverflow) return;
  60. var content = _this.contentRef.current;
  61. var isOverflowing = content.scrollHeight > content.clientHeight;
  62. if (_this.state.isOverflowing !== isOverflowing) {
  63. _this._updatingOverflow = true;
  64. _this.setState({
  65. isOverflowing: isOverflowing
  66. }, function () {
  67. _this._updatingOverflow = false;
  68. });
  69. }
  70. };
  71. _this.memoizedResources = (0, _memoizeOne.default)(function (resources, accessors) {
  72. return (0, _Resources.default)(resources, accessors);
  73. });
  74. _this.state = {
  75. gutterWidth: undefined,
  76. isOverflowing: null
  77. };
  78. _this.scrollRef = _react.default.createRef();
  79. _this.contentRef = _react.default.createRef();
  80. return _this;
  81. }
  82. var _proto = TimeGrid.prototype;
  83. _proto.componentWillMount = function componentWillMount() {
  84. this.calculateScroll();
  85. };
  86. _proto.componentDidMount = function componentDidMount() {
  87. this.checkOverflow();
  88. if (this.props.width == null) {
  89. this.measureGutter();
  90. }
  91. this.applyScroll();
  92. window.addEventListener('resize', this.handleResize);
  93. };
  94. _proto.componentWillUnmount = function componentWillUnmount() {
  95. window.removeEventListener('resize', this.handleResize);
  96. animationFrame.cancel(this.rafHandle);
  97. if (this.measureGutterAnimationFrameRequest) {
  98. window.cancelAnimationFrame(this.measureGutterAnimationFrameRequest);
  99. }
  100. };
  101. _proto.componentDidUpdate = function componentDidUpdate() {
  102. if (this.props.width == null) {
  103. this.measureGutter();
  104. }
  105. this.applyScroll(); //this.checkOverflow()
  106. };
  107. _proto.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
  108. var _this$props = this.props,
  109. range = _this$props.range,
  110. scrollToTime = _this$props.scrollToTime; // When paginating, reset scroll
  111. if (!dates.eq(nextProps.range[0], range[0], 'minute') || !dates.eq(nextProps.scrollToTime, scrollToTime, 'minute')) {
  112. this.calculateScroll(nextProps);
  113. }
  114. };
  115. _proto.renderEvents = function renderEvents(range, events, now) {
  116. var _this2 = this;
  117. var _this$props2 = this.props,
  118. min = _this$props2.min,
  119. max = _this$props2.max,
  120. components = _this$props2.components,
  121. accessors = _this$props2.accessors,
  122. localizer = _this$props2.localizer;
  123. var resources = this.memoizedResources(this.props.resources, accessors);
  124. var groupedEvents = resources.groupEvents(events);
  125. return resources.map(function (_ref, i) {
  126. var id = _ref[0],
  127. resource = _ref[1];
  128. return range.map(function (date, jj) {
  129. var daysEvents = (groupedEvents.get(id) || []).filter(function (event) {
  130. return dates.inRange(date, accessors.start(event), accessors.end(event), 'day');
  131. });
  132. return _react.default.createElement(_DayColumn.default, (0, _extends2.default)({}, _this2.props, {
  133. localizer: localizer,
  134. min: dates.merge(date, min),
  135. max: dates.merge(date, max),
  136. resource: resource && id,
  137. components: components,
  138. isNow: dates.eq(date, now, 'day'),
  139. key: i + '-' + jj,
  140. date: date,
  141. events: daysEvents
  142. }));
  143. });
  144. });
  145. };
  146. _proto.render = function render() {
  147. var _this$props3 = this.props,
  148. events = _this$props3.events,
  149. range = _this$props3.range,
  150. width = _this$props3.width,
  151. rtl = _this$props3.rtl,
  152. selected = _this$props3.selected,
  153. getNow = _this$props3.getNow,
  154. resources = _this$props3.resources,
  155. components = _this$props3.components,
  156. accessors = _this$props3.accessors,
  157. getters = _this$props3.getters,
  158. localizer = _this$props3.localizer,
  159. min = _this$props3.min,
  160. max = _this$props3.max,
  161. showMultiDayTimes = _this$props3.showMultiDayTimes,
  162. longPressThreshold = _this$props3.longPressThreshold;
  163. width = width || this.state.gutterWidth;
  164. var start = range[0],
  165. end = range[range.length - 1];
  166. this.slots = range.length;
  167. var allDayEvents = [],
  168. rangeEvents = [];
  169. events.forEach(function (event) {
  170. if ((0, _eventLevels.inRange)(event, start, end, accessors)) {
  171. var eStart = accessors.start(event),
  172. eEnd = accessors.end(event);
  173. if (accessors.allDay(event) || dates.isJustDate(eStart) && dates.isJustDate(eEnd) || !showMultiDayTimes && !dates.eq(eStart, eEnd, 'day')) {
  174. allDayEvents.push(event);
  175. } else {
  176. rangeEvents.push(event);
  177. }
  178. }
  179. });
  180. allDayEvents.sort(function (a, b) {
  181. return (0, _eventLevels.sortEvents)(a, b, accessors);
  182. });
  183. return _react.default.createElement("div", {
  184. className: (0, _clsx.default)('rbc-time-view', resources && 'rbc-time-view-resources')
  185. }, _react.default.createElement(_TimeGridHeader.default, {
  186. range: range,
  187. events: allDayEvents,
  188. width: width,
  189. rtl: rtl,
  190. getNow: getNow,
  191. localizer: localizer,
  192. selected: selected,
  193. resources: this.memoizedResources(resources, accessors),
  194. selectable: this.props.selectable,
  195. accessors: accessors,
  196. getters: getters,
  197. components: components,
  198. scrollRef: this.scrollRef,
  199. isOverflowing: this.state.isOverflowing,
  200. longPressThreshold: longPressThreshold,
  201. onSelectSlot: this.handleSelectAllDaySlot,
  202. onSelectEvent: this.handleSelectAlldayEvent,
  203. onDoubleClickEvent: this.props.onDoubleClickEvent,
  204. onDrillDown: this.props.onDrillDown,
  205. getDrilldownView: this.props.getDrilldownView
  206. }), _react.default.createElement("div", {
  207. ref: this.contentRef,
  208. className: "rbc-time-content",
  209. onScroll: this.handleScroll
  210. }, _react.default.createElement(_TimeGutter.default, {
  211. date: start,
  212. ref: this.gutterRef,
  213. localizer: localizer,
  214. min: dates.merge(start, min),
  215. max: dates.merge(start, max),
  216. step: this.props.step,
  217. getNow: this.props.getNow,
  218. timeslots: this.props.timeslots,
  219. components: components,
  220. className: "rbc-time-gutter"
  221. }), this.renderEvents(range, rangeEvents, getNow())));
  222. };
  223. _proto.clearSelection = function clearSelection() {
  224. clearTimeout(this._selectTimer);
  225. this._pendingSelection = [];
  226. };
  227. _proto.measureGutter = function measureGutter() {
  228. var _this3 = this;
  229. if (this.measureGutterAnimationFrameRequest) {
  230. window.cancelAnimationFrame(this.measureGutterAnimationFrameRequest);
  231. }
  232. this.measureGutterAnimationFrameRequest = window.requestAnimationFrame(function () {
  233. var width = (0, _width.default)(_this3.gutter);
  234. if (width && _this3.state.gutterWidth !== width) {
  235. _this3.setState({
  236. gutterWidth: width
  237. });
  238. }
  239. });
  240. };
  241. _proto.applyScroll = function applyScroll() {
  242. if (this._scrollRatio) {
  243. var content = this.contentRef.current;
  244. content.scrollTop = content.scrollHeight * this._scrollRatio; // Only do this once
  245. this._scrollRatio = null;
  246. }
  247. };
  248. _proto.calculateScroll = function calculateScroll(props) {
  249. if (props === void 0) {
  250. props = this.props;
  251. }
  252. var _props = props,
  253. min = _props.min,
  254. max = _props.max,
  255. scrollToTime = _props.scrollToTime;
  256. var diffMillis = scrollToTime - dates.startOf(scrollToTime, 'day');
  257. var totalMillis = dates.diff(max, min);
  258. this._scrollRatio = diffMillis / totalMillis;
  259. };
  260. return TimeGrid;
  261. }(_react.Component);
  262. exports.default = TimeGrid;
  263. TimeGrid.propTypes = process.env.NODE_ENV !== "production" ? {
  264. events: _propTypes.default.array.isRequired,
  265. resources: _propTypes.default.array,
  266. step: _propTypes.default.number,
  267. timeslots: _propTypes.default.number,
  268. range: _propTypes.default.arrayOf(_propTypes.default.instanceOf(Date)),
  269. min: _propTypes.default.instanceOf(Date),
  270. max: _propTypes.default.instanceOf(Date),
  271. getNow: _propTypes.default.func.isRequired,
  272. scrollToTime: _propTypes.default.instanceOf(Date),
  273. showMultiDayTimes: _propTypes.default.bool,
  274. rtl: _propTypes.default.bool,
  275. width: _propTypes.default.number,
  276. accessors: _propTypes.default.object.isRequired,
  277. components: _propTypes.default.object.isRequired,
  278. getters: _propTypes.default.object.isRequired,
  279. localizer: _propTypes.default.object.isRequired,
  280. selected: _propTypes.default.object,
  281. selectable: _propTypes.default.oneOf([true, false, 'ignoreEvents']),
  282. longPressThreshold: _propTypes.default.number,
  283. onNavigate: _propTypes.default.func,
  284. onSelectSlot: _propTypes.default.func,
  285. onSelectEnd: _propTypes.default.func,
  286. onSelectStart: _propTypes.default.func,
  287. onSelectEvent: _propTypes.default.func,
  288. onDoubleClickEvent: _propTypes.default.func,
  289. onDrillDown: _propTypes.default.func,
  290. getDrilldownView: _propTypes.default.func.isRequired
  291. } : {};
  292. TimeGrid.defaultProps = {
  293. step: 30,
  294. timeslots: 2,
  295. min: dates.startOf(new Date(), 'day'),
  296. max: dates.endOf(new Date(), 'day'),
  297. scrollToTime: dates.startOf(new Date(), 'day')
  298. };
  299. module.exports = exports["default"];