@planningcenter/react-beautiful-dnd 13.2.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 (243) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/LICENSE +13 -0
  3. package/README.md +178 -0
  4. package/dist/react-beautiful-dnd.cjs.js +8728 -0
  5. package/dist/react-beautiful-dnd.cjs.js.flow +3 -0
  6. package/dist/react-beautiful-dnd.esm.js +8715 -0
  7. package/dist/react-beautiful-dnd.js +11726 -0
  8. package/dist/react-beautiful-dnd.min.js +1 -0
  9. package/package.json +155 -0
  10. package/src/animation.js +75 -0
  11. package/src/debug/middleware/action-timing-average.js +52 -0
  12. package/src/debug/middleware/action-timing.js +16 -0
  13. package/src/debug/middleware/log.js +26 -0
  14. package/src/debug/middleware/user-timing.js +16 -0
  15. package/src/debug/timings.js +86 -0
  16. package/src/dev-warning.js +50 -0
  17. package/src/empty.js +6 -0
  18. package/src/index.js +67 -0
  19. package/src/invariant.js +33 -0
  20. package/src/native-with-fallback.js +69 -0
  21. package/src/screen-reader-message-preset.js +134 -0
  22. package/src/state/action-creators.js +328 -0
  23. package/src/state/auto-scroller/auto-scroller-types.js +8 -0
  24. package/src/state/auto-scroller/can-scroll.js +160 -0
  25. package/src/state/auto-scroller/fluid-scroller/config.js +25 -0
  26. package/src/state/auto-scroller/fluid-scroller/did-start-in-scrollable-area.js +1 -0
  27. package/src/state/auto-scroller/fluid-scroller/get-best-scrollable-droppable.js +77 -0
  28. package/src/state/auto-scroller/fluid-scroller/get-droppable-scroll-change.js +50 -0
  29. package/src/state/auto-scroller/fluid-scroller/get-percentage.js +25 -0
  30. package/src/state/auto-scroller/fluid-scroller/get-scroll/adjust-for-size-limits.js +30 -0
  31. package/src/state/auto-scroller/fluid-scroller/get-scroll/buffer-thresholds/calc-axis-scroll-conditions.js +68 -0
  32. package/src/state/auto-scroller/fluid-scroller/get-scroll/buffer-thresholds/get-scroll-conditions.js +56 -0
  33. package/src/state/auto-scroller/fluid-scroller/get-scroll/buffer-thresholds/index.js +66 -0
  34. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/dampen-value-by-time.js +48 -0
  35. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/get-distance-thresholds.js +31 -0
  36. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/get-value-from-distance.js +67 -0
  37. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/get-value.js +51 -0
  38. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/index.js +50 -0
  39. package/src/state/auto-scroller/fluid-scroller/get-scroll/get-scroll-on-axis/min-scroll.js +4 -0
  40. package/src/state/auto-scroller/fluid-scroller/get-scroll/index.js +139 -0
  41. package/src/state/auto-scroller/fluid-scroller/get-window-scroll-change.js +43 -0
  42. package/src/state/auto-scroller/fluid-scroller/index.js +99 -0
  43. package/src/state/auto-scroller/fluid-scroller/scroll.js +80 -0
  44. package/src/state/auto-scroller/index.js +59 -0
  45. package/src/state/auto-scroller/jump-scroller.js +139 -0
  46. package/src/state/axis.js +26 -0
  47. package/src/state/calculate-drag-impact/calculate-reorder-impact.js +136 -0
  48. package/src/state/can-start-drag.js +29 -0
  49. package/src/state/create-store.js +97 -0
  50. package/src/state/did-start-after-critical.js +9 -0
  51. package/src/state/dimension-marshal/dimension-marshal-types.js +46 -0
  52. package/src/state/dimension-marshal/dimension-marshal.js +218 -0
  53. package/src/state/dimension-marshal/get-initial-publish.js +66 -0
  54. package/src/state/dimension-marshal/while-dragging-publisher.js +146 -0
  55. package/src/state/dimension-structures.js +35 -0
  56. package/src/state/droppable/get-droppable.js +101 -0
  57. package/src/state/droppable/is-home-of.js +7 -0
  58. package/src/state/droppable/scroll-droppable.js +53 -0
  59. package/src/state/droppable/should-use-placeholder.js +7 -0
  60. package/src/state/droppable/util/clip.js +17 -0
  61. package/src/state/droppable/util/get-subject.js +63 -0
  62. package/src/state/droppable/what-is-dragged-over-from-result.js +16 -0
  63. package/src/state/droppable/what-is-dragged-over.js +16 -0
  64. package/src/state/droppable/with-placeholder.js +174 -0
  65. package/src/state/get-center-from-impact/get-client-border-box-center/get-client-from-page-border-box-center.js +29 -0
  66. package/src/state/get-center-from-impact/get-client-border-box-center/index.js +44 -0
  67. package/src/state/get-center-from-impact/get-page-border-box-center/index.js +70 -0
  68. package/src/state/get-center-from-impact/get-page-border-box-center/when-combining.js +39 -0
  69. package/src/state/get-center-from-impact/get-page-border-box-center/when-reordering.js +112 -0
  70. package/src/state/get-center-from-impact/move-relative-to.js +66 -0
  71. package/src/state/get-combined-item-displacement.js +34 -0
  72. package/src/state/get-displaced-by.js +17 -0
  73. package/src/state/get-displacement-groups.js +130 -0
  74. package/src/state/get-drag-impact/get-combine-impact.js +130 -0
  75. package/src/state/get-drag-impact/get-reorder-impact.js +143 -0
  76. package/src/state/get-drag-impact/index.js +93 -0
  77. package/src/state/get-draggables-inside-droppable.js +31 -0
  78. package/src/state/get-droppable-over.js +158 -0
  79. package/src/state/get-frame.js +10 -0
  80. package/src/state/get-home-location.js +7 -0
  81. package/src/state/get-impact-location.js +16 -0
  82. package/src/state/get-is-displaced.js +11 -0
  83. package/src/state/get-lift-effect.js +82 -0
  84. package/src/state/get-max-scroll.js +30 -0
  85. package/src/state/is-movement-allowed.js +6 -0
  86. package/src/state/is-within.js +9 -0
  87. package/src/state/middleware/auto-scroll.js +38 -0
  88. package/src/state/middleware/dimension-marshal-stopper.js +20 -0
  89. package/src/state/middleware/drop/drop-animation-finish-middleware.js +21 -0
  90. package/src/state/middleware/drop/drop-animation-flush-on-scroll-middleware.js +63 -0
  91. package/src/state/middleware/drop/drop-middleware.js +146 -0
  92. package/src/state/middleware/drop/get-drop-duration.js +47 -0
  93. package/src/state/middleware/drop/get-drop-impact.js +77 -0
  94. package/src/state/middleware/drop/get-new-home-client-offset.js +54 -0
  95. package/src/state/middleware/drop/index.js +2 -0
  96. package/src/state/middleware/focus.js +42 -0
  97. package/src/state/middleware/lift.js +66 -0
  98. package/src/state/middleware/pending-drop.js +37 -0
  99. package/src/state/middleware/responders/async-marshal.js +55 -0
  100. package/src/state/middleware/responders/expiring-announce.js +44 -0
  101. package/src/state/middleware/responders/index.js +2 -0
  102. package/src/state/middleware/responders/is-equal.js +57 -0
  103. package/src/state/middleware/responders/publisher.js +253 -0
  104. package/src/state/middleware/responders/responders-middleware.js +75 -0
  105. package/src/state/middleware/scroll-listener.js +31 -0
  106. package/src/state/middleware/style.js +22 -0
  107. package/src/state/middleware/util/validate-dimensions.js +71 -0
  108. package/src/state/move-in-direction/index.js +84 -0
  109. package/src/state/move-in-direction/move-cross-axis/get-best-cross-axis-droppable.js +168 -0
  110. package/src/state/move-in-direction/move-cross-axis/get-closest-draggable.js +79 -0
  111. package/src/state/move-in-direction/move-cross-axis/index.js +109 -0
  112. package/src/state/move-in-direction/move-cross-axis/move-to-new-droppable.js +121 -0
  113. package/src/state/move-in-direction/move-cross-axis/without-starting-displacement.js +31 -0
  114. package/src/state/move-in-direction/move-in-direction-types.js +9 -0
  115. package/src/state/move-in-direction/move-to-next-place/index.js +132 -0
  116. package/src/state/move-in-direction/move-to-next-place/is-totally-visible-in-new-location.js +52 -0
  117. package/src/state/move-in-direction/move-to-next-place/move-to-next-combine/index.js +97 -0
  118. package/src/state/move-in-direction/move-to-next-place/move-to-next-index/from-combine.js +52 -0
  119. package/src/state/move-in-direction/move-to-next-place/move-to-next-index/from-reorder.js +43 -0
  120. package/src/state/move-in-direction/move-to-next-place/move-to-next-index/index.js +86 -0
  121. package/src/state/no-impact.js +33 -0
  122. package/src/state/patch-dimension-map.js +11 -0
  123. package/src/state/patch-droppable-map.js +10 -0
  124. package/src/state/position.js +58 -0
  125. package/src/state/post-reducer/when-moving/refresh-snap.js +67 -0
  126. package/src/state/post-reducer/when-moving/update.js +120 -0
  127. package/src/state/publish-while-dragging-in-virtual/adjust-additions-for-scroll-changes.js +58 -0
  128. package/src/state/publish-while-dragging-in-virtual/index.js +158 -0
  129. package/src/state/publish-while-dragging-in-virtual/offset-draggable.js +35 -0
  130. package/src/state/recompute-placeholders.js +99 -0
  131. package/src/state/rect.js +7 -0
  132. package/src/state/reducer.js +457 -0
  133. package/src/state/registry/create-registry.js +162 -0
  134. package/src/state/registry/registry-types.js +98 -0
  135. package/src/state/registry/use-registry.js +20 -0
  136. package/src/state/remove-draggable-from-list.js +13 -0
  137. package/src/state/scroll-viewport.js +34 -0
  138. package/src/state/spacing.js +45 -0
  139. package/src/state/store-types.js +16 -0
  140. package/src/state/update-displacement-visibility/recompute.js +54 -0
  141. package/src/state/update-displacement-visibility/speculatively-increase.js +111 -0
  142. package/src/state/visibility/is-partially-visible-through-frame.js +60 -0
  143. package/src/state/visibility/is-position-in-frame.js +12 -0
  144. package/src/state/visibility/is-totally-visible-through-frame-on-axis.js +19 -0
  145. package/src/state/visibility/is-totally-visible-through-frame.js +18 -0
  146. package/src/state/visibility/is-visible.js +102 -0
  147. package/src/state/with-scroll-change/with-all-displacement.js +15 -0
  148. package/src/state/with-scroll-change/with-droppable-displacement.js +13 -0
  149. package/src/state/with-scroll-change/with-droppable-scroll.js +13 -0
  150. package/src/state/with-scroll-change/with-viewport-displacement.js +7 -0
  151. package/src/types.js +542 -0
  152. package/src/view/animate-in-out/animate-in-out.jsx +95 -0
  153. package/src/view/animate-in-out/index.js +2 -0
  154. package/src/view/check-is-valid-inner-ref.js +15 -0
  155. package/src/view/context/app-context.js +19 -0
  156. package/src/view/context/droppable-context.js +11 -0
  157. package/src/view/context/store-context.js +5 -0
  158. package/src/view/data-attributes.js +37 -0
  159. package/src/view/drag-drop-context/app.jsx +273 -0
  160. package/src/view/drag-drop-context/check-doctype.js +39 -0
  161. package/src/view/drag-drop-context/check-react-version.js +71 -0
  162. package/src/view/drag-drop-context/drag-drop-context-types.js +7 -0
  163. package/src/view/drag-drop-context/drag-drop-context.jsx +68 -0
  164. package/src/view/drag-drop-context/error-boundary.jsx +88 -0
  165. package/src/view/drag-drop-context/index.js +2 -0
  166. package/src/view/drag-drop-context/use-startup-validation.js +13 -0
  167. package/src/view/drag-drop-context/use-unique-context-id.js +13 -0
  168. package/src/view/draggable/connected-draggable.js +372 -0
  169. package/src/view/draggable/draggable-api.jsx +48 -0
  170. package/src/view/draggable/draggable-types.js +191 -0
  171. package/src/view/draggable/draggable.jsx +171 -0
  172. package/src/view/draggable/get-style.js +109 -0
  173. package/src/view/draggable/index.js +2 -0
  174. package/src/view/draggable/use-validation.js +70 -0
  175. package/src/view/droppable/connected-droppable.js +280 -0
  176. package/src/view/droppable/droppable-types.js +91 -0
  177. package/src/view/droppable/droppable.jsx +167 -0
  178. package/src/view/droppable/index.js +2 -0
  179. package/src/view/droppable/use-validation.js +101 -0
  180. package/src/view/event-bindings/bind-events.js +39 -0
  181. package/src/view/event-bindings/event-types.js +14 -0
  182. package/src/view/get-body-element.js +8 -0
  183. package/src/view/get-border-box-center-position.js +5 -0
  184. package/src/view/get-document-element.js +8 -0
  185. package/src/view/get-elements/find-drag-handle.js +38 -0
  186. package/src/view/get-elements/find-draggable.js +30 -0
  187. package/src/view/is-strict-equal.js +2 -0
  188. package/src/view/is-type-of-element/is-element.js +6 -0
  189. package/src/view/is-type-of-element/is-html-element.js +6 -0
  190. package/src/view/is-type-of-element/is-svg-element.js +12 -0
  191. package/src/view/key-codes.js +13 -0
  192. package/src/view/placeholder/index.js +2 -0
  193. package/src/view/placeholder/placeholder-types.js +16 -0
  194. package/src/view/placeholder/placeholder.jsx +198 -0
  195. package/src/view/scroll-listener.js +72 -0
  196. package/src/view/throw-if-invalid-inner-ref.js +15 -0
  197. package/src/view/use-announcer/index.js +2 -0
  198. package/src/view/use-announcer/use-announcer.js +80 -0
  199. package/src/view/use-dev-setup-warning.js +22 -0
  200. package/src/view/use-dev.js +9 -0
  201. package/src/view/use-draggable-publisher/get-dimension.js +44 -0
  202. package/src/view/use-draggable-publisher/index.js +2 -0
  203. package/src/view/use-draggable-publisher/use-draggable-publisher.js +87 -0
  204. package/src/view/use-droppable-publisher/check-for-nested-scroll-container.js +27 -0
  205. package/src/view/use-droppable-publisher/get-closest-scrollable.js +95 -0
  206. package/src/view/use-droppable-publisher/get-dimension.js +139 -0
  207. package/src/view/use-droppable-publisher/get-env.js +31 -0
  208. package/src/view/use-droppable-publisher/get-listener-options.js +12 -0
  209. package/src/view/use-droppable-publisher/get-scroll.js +7 -0
  210. package/src/view/use-droppable-publisher/index.js +2 -0
  211. package/src/view/use-droppable-publisher/is-in-fixed-container.js +21 -0
  212. package/src/view/use-droppable-publisher/use-droppable-publisher.js +283 -0
  213. package/src/view/use-focus-marshal/focus-marshal-types.js +13 -0
  214. package/src/view/use-focus-marshal/index.js +2 -0
  215. package/src/view/use-focus-marshal/use-focus-marshal.js +129 -0
  216. package/src/view/use-hidden-text-element/index.js +2 -0
  217. package/src/view/use-hidden-text-element/use-hidden-text-element.js +60 -0
  218. package/src/view/use-isomorphic-layout-effect.js +18 -0
  219. package/src/view/use-previous-ref.js +14 -0
  220. package/src/view/use-required-context.js +9 -0
  221. package/src/view/use-sensor-marshal/closest.js +50 -0
  222. package/src/view/use-sensor-marshal/find-closest-draggable-id-from-event.js +50 -0
  223. package/src/view/use-sensor-marshal/index.js +5 -0
  224. package/src/view/use-sensor-marshal/is-event-in-interactive-element.js +66 -0
  225. package/src/view/use-sensor-marshal/lock.js +48 -0
  226. package/src/view/use-sensor-marshal/sensors/use-keyboard-sensor.js +243 -0
  227. package/src/view/use-sensor-marshal/sensors/use-mouse-sensor.js +386 -0
  228. package/src/view/use-sensor-marshal/sensors/use-touch-sensor.js +461 -0
  229. package/src/view/use-sensor-marshal/sensors/util/prevent-standard-key-events.js +19 -0
  230. package/src/view/use-sensor-marshal/sensors/util/supported-page-visibility-event-name.js +29 -0
  231. package/src/view/use-sensor-marshal/use-sensor-marshal.js +495 -0
  232. package/src/view/use-sensor-marshal/use-validate-sensor-hooks.js +20 -0
  233. package/src/view/use-style-marshal/get-styles.js +170 -0
  234. package/src/view/use-style-marshal/index.js +2 -0
  235. package/src/view/use-style-marshal/style-marshal-types.js +8 -0
  236. package/src/view/use-style-marshal/use-style-marshal.js +126 -0
  237. package/src/view/use-unique-id.js +25 -0
  238. package/src/view/visually-hidden-style.js +16 -0
  239. package/src/view/window/get-max-window-scroll.js +19 -0
  240. package/src/view/window/get-viewport.js +49 -0
  241. package/src/view/window/get-window-from-el.js +3 -0
  242. package/src/view/window/get-window-scroll.js +30 -0
  243. package/src/view/window/scroll-window.js +7 -0
@@ -0,0 +1,91 @@
1
+ // @flow
2
+ import { type Node } from 'react';
3
+ import type {
4
+ DraggableId,
5
+ DroppableId,
6
+ TypeId,
7
+ Direction,
8
+ Placeholder,
9
+ State,
10
+ ContextId,
11
+ DraggableRubric,
12
+ DroppableMode,
13
+ } from '../../types';
14
+ import type { ChildrenFn } from '../draggable/draggable-types';
15
+ import { updateViewportMaxScroll } from '../../state/action-creators';
16
+
17
+ export type DraggableChildrenFn = ChildrenFn;
18
+
19
+ export type DroppableProps = {|
20
+ // used for shared global styles
21
+ 'data-rbd-droppable-context-id': ContextId,
22
+ // Used to lookup. Currently not used for drag and drop lifecycle
23
+ 'data-rbd-droppable-id': DroppableId,
24
+ |};
25
+
26
+ export type Provided = {|
27
+ innerRef: (?HTMLElement) => void,
28
+ placeholder: ?Node,
29
+ droppableProps: DroppableProps,
30
+ |};
31
+
32
+ export type UseClone = {|
33
+ dragging: DraggableRubric,
34
+ render: DraggableChildrenFn,
35
+ |};
36
+
37
+ export type StateSnapshot = {|
38
+ // Is the Droppable being dragged over?
39
+ isDraggingOver: boolean,
40
+ // What is the id of the draggable that is dragging over the Droppable?
41
+ draggingOverWith: ?DraggableId,
42
+ // What is the id of the draggable that is dragging from this list?
43
+ // Useful for styling the home list when not being dragged over
44
+ draggingFromThisWith: ?DraggableId,
45
+ // Whether or not the placeholder is actively being used.
46
+ // This is useful information when working with virtual lists
47
+ isUsingPlaceholder: boolean,
48
+ |};
49
+
50
+ export type MapProps = {|
51
+ // placeholder:
52
+ // - used to keep space in the home list during the whole drag and drop
53
+ // - used to make space in foreign lists during a drag
54
+ placeholder: ?Placeholder,
55
+ shouldAnimatePlaceholder: boolean,
56
+ // snapshot based on redux state to be provided to consumers
57
+ snapshot: StateSnapshot,
58
+ useClone: ?UseClone,
59
+ |};
60
+
61
+ export type DefaultProps = {|
62
+ mode: DroppableMode,
63
+ type: TypeId,
64
+ isDropDisabled: boolean,
65
+ isCombineEnabled: boolean,
66
+ direction: Direction,
67
+ renderClone: ?DraggableChildrenFn,
68
+ ignoreContainerClipping: boolean,
69
+ getContainerForClone: () => HTMLElement,
70
+ |};
71
+
72
+ export type DispatchProps = {|
73
+ updateViewportMaxScroll: typeof updateViewportMaxScroll,
74
+ |};
75
+
76
+ export type OwnProps = {|
77
+ ...DefaultProps,
78
+ children: (Provided, StateSnapshot) => Node,
79
+ droppableId: DroppableId,
80
+ renderClone: ?DraggableChildrenFn,
81
+ |};
82
+
83
+ export type Props = {|
84
+ ...MapProps,
85
+ ...DispatchProps,
86
+ ...OwnProps,
87
+ |};
88
+
89
+ // Having issues getting the correct type
90
+ // export type Selector = OutputSelector<State, OwnProps, MapProps>;
91
+ export type Selector = (state: State, ownProps: OwnProps) => MapProps;
@@ -0,0 +1,167 @@
1
+ // @flow
2
+ import ReactDOM from 'react-dom';
3
+ import { useMemo, useCallback } from 'use-memo-one';
4
+ import React, { useRef, useContext, type Node } from 'react';
5
+ import { invariant } from '../../invariant';
6
+ import type { DraggableId } from '../../types';
7
+ import type { Props, Provided } from './droppable-types';
8
+ import useDroppablePublisher from '../use-droppable-publisher';
9
+ import Placeholder from '../placeholder';
10
+ import AppContext, { type AppContextValue } from '../context/app-context';
11
+ import DroppableContext, {
12
+ type DroppableContextValue,
13
+ } from '../context/droppable-context';
14
+ // import useAnimateInOut from '../use-animate-in-out/use-animate-in-out';
15
+ import getMaxWindowScroll from '../window/get-max-window-scroll';
16
+ import useValidation from './use-validation';
17
+ import type {
18
+ StateSnapshot as DraggableStateSnapshot,
19
+ Provided as DraggableProvided,
20
+ } from '../draggable/draggable-types';
21
+ import AnimateInOut, {
22
+ type AnimateProvided,
23
+ } from '../animate-in-out/animate-in-out';
24
+ import { PrivateDraggable } from '../draggable/draggable-api';
25
+
26
+ export default function Droppable(props: Props) {
27
+ const appContext: ?AppContextValue = useContext<?AppContextValue>(AppContext);
28
+ invariant(appContext, 'Could not find app context');
29
+ const { contextId, isMovementAllowed } = appContext;
30
+ const droppableRef = useRef<?HTMLElement>(null);
31
+ const placeholderRef = useRef<?HTMLElement>(null);
32
+
33
+ const {
34
+ // own props
35
+ children,
36
+ droppableId,
37
+ type,
38
+ mode,
39
+ direction,
40
+ ignoreContainerClipping,
41
+ isDropDisabled,
42
+ isCombineEnabled,
43
+ // map props
44
+ snapshot,
45
+ useClone,
46
+ // dispatch props
47
+ updateViewportMaxScroll,
48
+
49
+ // clone (ownProps)
50
+ getContainerForClone,
51
+ } = props;
52
+
53
+ const getDroppableRef = useCallback(
54
+ (): ?HTMLElement => droppableRef.current,
55
+ [],
56
+ );
57
+ const setDroppableRef = useCallback((value: ?HTMLElement) => {
58
+ droppableRef.current = value;
59
+ }, []);
60
+ const getPlaceholderRef = useCallback(
61
+ (): ?HTMLElement => placeholderRef.current,
62
+ [],
63
+ );
64
+ const setPlaceholderRef = useCallback((value: ?HTMLElement) => {
65
+ placeholderRef.current = value;
66
+ }, []);
67
+
68
+ useValidation({
69
+ props,
70
+ getDroppableRef,
71
+ getPlaceholderRef,
72
+ });
73
+
74
+ const onPlaceholderTransitionEnd = useCallback(() => {
75
+ // A placeholder change can impact the window's max scroll
76
+ if (isMovementAllowed()) {
77
+ updateViewportMaxScroll({ maxScroll: getMaxWindowScroll() });
78
+ }
79
+ }, [isMovementAllowed, updateViewportMaxScroll]);
80
+
81
+ useDroppablePublisher({
82
+ droppableId,
83
+ type,
84
+ mode,
85
+ direction,
86
+ isDropDisabled,
87
+ isCombineEnabled,
88
+ ignoreContainerClipping,
89
+ getDroppableRef,
90
+ });
91
+
92
+ const placeholder: Node = (
93
+ <AnimateInOut
94
+ on={props.placeholder}
95
+ shouldAnimate={props.shouldAnimatePlaceholder}
96
+ >
97
+ {({ onClose, data, animate }: AnimateProvided) => (
98
+ <Placeholder
99
+ placeholder={(data: any)}
100
+ onClose={onClose}
101
+ innerRef={setPlaceholderRef}
102
+ animate={animate}
103
+ contextId={contextId}
104
+ onTransitionEnd={onPlaceholderTransitionEnd}
105
+ />
106
+ )}
107
+ </AnimateInOut>
108
+ );
109
+
110
+ const provided: Provided = useMemo(
111
+ (): Provided => ({
112
+ innerRef: setDroppableRef,
113
+ placeholder,
114
+ droppableProps: {
115
+ 'data-rbd-droppable-id': droppableId,
116
+ 'data-rbd-droppable-context-id': contextId,
117
+ },
118
+ }),
119
+ [contextId, droppableId, placeholder, setDroppableRef],
120
+ );
121
+
122
+ const isUsingCloneFor: ?DraggableId = useClone
123
+ ? useClone.dragging.draggableId
124
+ : null;
125
+
126
+ const droppableContext: ?DroppableContextValue = useMemo(
127
+ () => ({
128
+ droppableId,
129
+ type,
130
+ isUsingCloneFor,
131
+ }),
132
+ [droppableId, isUsingCloneFor, type],
133
+ );
134
+
135
+ function getClone(): ?Node {
136
+ if (!useClone) {
137
+ return null;
138
+ }
139
+ const { dragging, render } = useClone;
140
+
141
+ const node: Node = (
142
+ <PrivateDraggable
143
+ draggableId={dragging.draggableId}
144
+ index={dragging.source.index}
145
+ isClone
146
+ isEnabled
147
+ // not important as drag has already started
148
+ shouldRespectForcePress={false}
149
+ canDragInteractiveElements
150
+ >
151
+ {(
152
+ draggableProvided: DraggableProvided,
153
+ draggableSnapshot: DraggableStateSnapshot,
154
+ ) => render(draggableProvided, draggableSnapshot, dragging)}
155
+ </PrivateDraggable>
156
+ );
157
+
158
+ return ReactDOM.createPortal(node, getContainerForClone());
159
+ }
160
+
161
+ return (
162
+ <DroppableContext.Provider value={droppableContext}>
163
+ {children(provided, snapshot)}
164
+ {getClone()}
165
+ </DroppableContext.Provider>
166
+ );
167
+ }
@@ -0,0 +1,2 @@
1
+ // @flow
2
+ export { default } from './connected-droppable';
@@ -0,0 +1,101 @@
1
+ // @flow
2
+ import { invariant } from '../../invariant';
3
+ import type { Props } from './droppable-types';
4
+ import { warning } from '../../dev-warning';
5
+ import checkIsValidInnerRef from '../check-is-valid-inner-ref';
6
+ import useDevSetupWarning from '../use-dev-setup-warning';
7
+
8
+ type Args = {|
9
+ props: Props,
10
+ getDroppableRef: () => ?HTMLElement,
11
+ getPlaceholderRef: () => ?HTMLElement,
12
+ |};
13
+
14
+ type CheckFn = (args: Args) => void;
15
+
16
+ function isBoolean(value: mixed): boolean {
17
+ return typeof value === 'boolean';
18
+ }
19
+
20
+ function runChecks(args: Args, checks: CheckFn[]) {
21
+ checks.forEach((check: CheckFn) => check(args));
22
+ }
23
+
24
+ const shared: CheckFn[] = [
25
+ function required({ props }: Args) {
26
+ invariant(props.droppableId, 'A Droppable requires a droppableId prop');
27
+ invariant(
28
+ typeof props.droppableId === 'string',
29
+ `A Droppable requires a [string] droppableId. Provided: [${typeof props.droppableId}]`,
30
+ );
31
+ },
32
+ function boolean({ props }: Args) {
33
+ invariant(
34
+ isBoolean(props.isDropDisabled),
35
+ 'isDropDisabled must be a boolean',
36
+ );
37
+ invariant(
38
+ isBoolean(props.isCombineEnabled),
39
+ 'isCombineEnabled must be a boolean',
40
+ );
41
+ invariant(
42
+ isBoolean(props.ignoreContainerClipping),
43
+ 'ignoreContainerClipping must be a boolean',
44
+ );
45
+ },
46
+ function ref({ getDroppableRef }: Args) {
47
+ checkIsValidInnerRef(getDroppableRef());
48
+ },
49
+ ];
50
+
51
+ const standard: CheckFn[] = [
52
+ function placeholder({ props, getPlaceholderRef }: Args) {
53
+ if (!props.placeholder) {
54
+ return;
55
+ }
56
+
57
+ const ref: ?HTMLElement = getPlaceholderRef();
58
+
59
+ if (ref) {
60
+ return;
61
+ }
62
+
63
+ warning(`
64
+ Droppable setup issue [droppableId: "${props.droppableId}"]:
65
+ DroppableProvided > placeholder could not be found.
66
+
67
+ Please be sure to add the {provided.placeholder} React Node as a child of your Droppable.
68
+ More information: https://github.com/atlassian/react-beautiful-dnd/blob/master/docs/api/droppable.md
69
+ `);
70
+ },
71
+ ];
72
+
73
+ const virtual: CheckFn[] = [
74
+ function hasClone({ props }: Args) {
75
+ invariant(
76
+ props.renderClone,
77
+ 'Must provide a clone render function (renderClone) for virtual lists',
78
+ );
79
+ },
80
+ function hasNoPlaceholder({ getPlaceholderRef }: Args) {
81
+ invariant(
82
+ !getPlaceholderRef(),
83
+ 'Expected virtual list to not have a placeholder',
84
+ );
85
+ },
86
+ ];
87
+
88
+ export default function useValidation(args: Args) {
89
+ useDevSetupWarning(() => {
90
+ // wrapping entire block for better minification
91
+ runChecks(args, shared);
92
+
93
+ if (args.props.mode === 'standard') {
94
+ runChecks(args, standard);
95
+ }
96
+
97
+ if (args.props.mode === 'virtual') {
98
+ runChecks(args, virtual);
99
+ }
100
+ });
101
+ }
@@ -0,0 +1,39 @@
1
+ // @flow
2
+ import type { EventBinding, EventOptions } from './event-types';
3
+
4
+ type UnbindFn = () => void;
5
+
6
+ function getOptions(
7
+ shared?: EventOptions,
8
+ fromBinding: ?EventOptions,
9
+ ): EventOptions {
10
+ return {
11
+ ...shared,
12
+ ...fromBinding,
13
+ };
14
+ }
15
+
16
+ export default function bindEvents(
17
+ el: HTMLElement,
18
+ bindings: EventBinding[],
19
+ sharedOptions?: EventOptions,
20
+ ): Function {
21
+ const unbindings: UnbindFn[] = bindings.map(
22
+ (binding: EventBinding): UnbindFn => {
23
+ const options: Object = getOptions(sharedOptions, binding.options);
24
+
25
+ el.addEventListener(binding.eventName, binding.fn, options);
26
+
27
+ return function unbind() {
28
+ el.removeEventListener(binding.eventName, binding.fn, options);
29
+ };
30
+ },
31
+ );
32
+
33
+ // Return a function to unbind events
34
+ return function unbindAll() {
35
+ unbindings.forEach((unbind: UnbindFn) => {
36
+ unbind();
37
+ });
38
+ };
39
+ }
@@ -0,0 +1,14 @@
1
+ // @flow
2
+
3
+ export type EventOptions = {|
4
+ passive?: boolean,
5
+ capture?: boolean,
6
+ // sometimes an event might only event want to be bound once
7
+ once?: boolean,
8
+ |};
9
+
10
+ export type EventBinding = {|
11
+ eventName: string,
12
+ fn: Function,
13
+ options?: EventOptions,
14
+ |};
@@ -0,0 +1,8 @@
1
+ // @flow
2
+ import { invariant } from '../invariant';
3
+
4
+ export default (): HTMLBodyElement => {
5
+ const body: ?HTMLBodyElement = document.body;
6
+ invariant(body, 'Cannot find document.body');
7
+ return body;
8
+ };
@@ -0,0 +1,5 @@
1
+ // @flow
2
+ import { getRect, type Position } from 'css-box-model';
3
+
4
+ export default (el: HTMLElement): Position =>
5
+ getRect(el.getBoundingClientRect()).center;
@@ -0,0 +1,8 @@
1
+ // @flow
2
+ import { invariant } from '../invariant';
3
+
4
+ export default (): HTMLElement => {
5
+ const doc: ?HTMLElement = document.documentElement;
6
+ invariant(doc, 'Cannot find document.documentElement');
7
+ return doc;
8
+ };
@@ -0,0 +1,38 @@
1
+ // @flow
2
+ import type { DraggableId, ContextId } from '../../types';
3
+ import { dragHandle as dragHandleAttr } from '../data-attributes';
4
+ import { warning } from '../../dev-warning';
5
+ import { find, toArray } from '../../native-with-fallback';
6
+ import isHtmlElement from '../is-type-of-element/is-html-element';
7
+
8
+ export default function findDragHandle(
9
+ contextId: ContextId,
10
+ draggableId: DraggableId,
11
+ ): ?HTMLElement {
12
+ // cannot create a selector with the draggable id as it might not be a valid attribute selector
13
+ const selector: string = `[${dragHandleAttr.contextId}="${contextId}"]`;
14
+ const possible: Element[] = toArray(document.querySelectorAll(selector));
15
+
16
+ if (!possible.length) {
17
+ warning(`Unable to find any drag handles in the context "${contextId}"`);
18
+ return null;
19
+ }
20
+
21
+ const handle: ?Element = find(possible, (el: Element): boolean => {
22
+ return el.getAttribute(dragHandleAttr.draggableId) === draggableId;
23
+ });
24
+
25
+ if (!handle) {
26
+ warning(
27
+ `Unable to find drag handle with id "${draggableId}" as no handle with a matching id was found`,
28
+ );
29
+ return null;
30
+ }
31
+
32
+ if (!isHtmlElement(handle)) {
33
+ warning('drag handle needs to be a HTMLElement');
34
+ return null;
35
+ }
36
+
37
+ return handle;
38
+ }
@@ -0,0 +1,30 @@
1
+ // @flow
2
+ import type { DraggableId, ContextId } from '../../types';
3
+ import * as attributes from '../data-attributes';
4
+ import { find, toArray } from '../../native-with-fallback';
5
+ import { warning } from '../../dev-warning';
6
+ import isHtmlElement from '../is-type-of-element/is-html-element';
7
+
8
+ export default function findDraggable(
9
+ contextId: ContextId,
10
+ draggableId: DraggableId,
11
+ ): ?HTMLElement {
12
+ // cannot create a selector with the draggable id as it might not be a valid attribute selector
13
+ const selector: string = `[${attributes.draggable.contextId}="${contextId}"]`;
14
+ const possible: Element[] = toArray(document.querySelectorAll(selector));
15
+
16
+ const draggable: ?Element = find(possible, (el: Element): boolean => {
17
+ return el.getAttribute(attributes.draggable.id) === draggableId;
18
+ });
19
+
20
+ if (!draggable) {
21
+ return null;
22
+ }
23
+
24
+ if (!isHtmlElement(draggable)) {
25
+ warning('Draggable element is not a HTMLElement');
26
+ return null;
27
+ }
28
+
29
+ return draggable;
30
+ }
@@ -0,0 +1,2 @@
1
+ // @flow
2
+ export default (a: mixed, b: mixed): boolean => a === b;
@@ -0,0 +1,6 @@
1
+ // @flow
2
+ import getWindowFromEl from '../window/get-window-from-el';
3
+
4
+ export default function isElement(el: Object): boolean %checks {
5
+ return el instanceof getWindowFromEl(el).Element;
6
+ }
@@ -0,0 +1,6 @@
1
+ // @flow
2
+ import getWindowFromEl from '../window/get-window-from-el';
3
+
4
+ export default function isHtmlElement(el: Object): boolean %checks {
5
+ return el instanceof getWindowFromEl(el).HTMLElement;
6
+ }
@@ -0,0 +1,12 @@
1
+ // @flow
2
+ import getWindowFromEl from '../window/get-window-from-el';
3
+
4
+ export default function isSvgElement(el: Object): boolean %checks {
5
+ // Some environments do not support SVGElement
6
+ // Doing a double lookup rather than storing the window
7
+ // as a %checks function can only be a 'simple predicate'
8
+ return (
9
+ Boolean(getWindowFromEl(el).SVGElement) &&
10
+ el instanceof getWindowFromEl(el).SVGElement
11
+ );
12
+ }
@@ -0,0 +1,13 @@
1
+ // @flow
2
+ export const tab: number = 9;
3
+ export const enter: number = 13;
4
+ export const escape: number = 27;
5
+ export const space: number = 32;
6
+ export const pageUp: number = 33;
7
+ export const pageDown: number = 34;
8
+ export const end: number = 35;
9
+ export const home: number = 36;
10
+ export const arrowLeft: number = 37;
11
+ export const arrowUp: number = 38;
12
+ export const arrowRight: number = 39;
13
+ export const arrowDown: number = 40;
@@ -0,0 +1,2 @@
1
+ // @flow
2
+ export { default } from './placeholder';
@@ -0,0 +1,16 @@
1
+ // @flow
2
+
3
+ export type PlaceholderStyle = {|
4
+ display: string,
5
+ boxSizing: 'border-box',
6
+ width: number,
7
+ height: number,
8
+ marginTop: number,
9
+ marginRight: number,
10
+ marginBottom: number,
11
+ marginLeft: number,
12
+ flexShrink: '0',
13
+ flexGrow: '0',
14
+ pointerEvents: 'none',
15
+ transition: string,
16
+ |};