playbook_ui 13.28.0.pre.alpha.play829selectablecardalignment2978 → 13.29.0.pre.alpha.PBNTR329draggablev33059

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +2 -3
  3. data/app/pb_kits/playbook/index.js +2 -0
  4. data/app/pb_kits/playbook/pb_bar_graph/_bar_graph.tsx +4 -1
  5. data/app/pb_kits/playbook/pb_bar_graph/barGraph.test.js +31 -0
  6. data/app/pb_kits/playbook/pb_bar_graph/bar_graph.rb +16 -0
  7. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_custom.md +2 -1
  8. data/app/pb_kits/playbook/pb_bar_graph/docs/{_bar_graph_custom.html.erb → _bar_graph_custom_rails.html.erb} +3 -3
  9. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_custom_rails.md +2 -0
  10. data/app/pb_kits/playbook/pb_bar_graph/docs/example.yml +1 -1
  11. data/app/pb_kits/playbook/pb_card/_card.scss +5 -0
  12. data/app/pb_kits/playbook/pb_card/_card.tsx +56 -9
  13. data/app/pb_kits/playbook/pb_circle_chart/_circle_chart.tsx +9 -3
  14. data/app/pb_kits/playbook/pb_circle_chart/circleChart.test.js +45 -0
  15. data/app/pb_kits/playbook/pb_circle_chart/circle_chart.rb +24 -1
  16. data/app/pb_kits/playbook/pb_collapsible/__snapshots__/collapsible.test.js.snap +53 -0
  17. data/app/pb_kits/playbook/pb_collapsible/_collapsible.tsx +14 -8
  18. data/app/pb_kits/playbook/pb_collapsible/collapsible.test.js +24 -0
  19. data/app/pb_kits/playbook/pb_dashboard/pbChartsDarkTheme.ts +7 -1
  20. data/app/pb_kits/playbook/pb_dashboard/pbChartsLightTheme.ts +9 -1
  21. data/app/pb_kits/playbook/pb_draggable/_draggable.scss +13 -0
  22. data/app/pb_kits/playbook/pb_draggable/_draggable.tsx +53 -0
  23. data/app/pb_kits/playbook/pb_draggable/context/index.tsx +92 -0
  24. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_default.jsx +53 -0
  25. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_default.md +4 -0
  26. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_multiple_containers.jsx +158 -0
  27. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_cards.jsx +101 -0
  28. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list.jsx +50 -0
  29. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list.md +1 -0
  30. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_selectable_list.jsx +51 -0
  31. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +11 -0
  32. data/app/pb_kits/playbook/pb_draggable/docs/index.js +5 -0
  33. data/app/pb_kits/playbook/pb_draggable/draggable.test.jsx +63 -0
  34. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableContainer.tsx +54 -0
  35. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +57 -0
  36. data/app/pb_kits/playbook/pb_form_group/_form_group.scss +2 -2
  37. data/app/pb_kits/playbook/pb_gauge/_gauge.tsx +4 -1
  38. data/app/pb_kits/playbook/pb_gauge/gauge.rb +6 -1
  39. data/app/pb_kits/playbook/pb_gauge/gauge.test.js +35 -0
  40. data/app/pb_kits/playbook/pb_icon/icon.rb +3 -2
  41. data/app/pb_kits/playbook/pb_line_graph/_line_graph.tsx +8 -2
  42. data/app/pb_kits/playbook/pb_line_graph/lineGraph.test.js +52 -0
  43. data/app/pb_kits/playbook/pb_line_graph/line_graph.rb +22 -1
  44. data/app/pb_kits/playbook/pb_list/_list.tsx +43 -2
  45. data/app/pb_kits/playbook/pb_list/_list_item.tsx +46 -10
  46. data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.scss +1 -1
  47. data/app/pb_kits/playbook/pb_selectable_list/_item.tsx +35 -28
  48. data/app/pb_kits/playbook/pb_selectable_list/_selectable_list.tsx +5 -1
  49. data/app/pb_kits/playbook/pb_table/_table.tsx +5 -0
  50. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_column.jsx +33 -32
  51. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_column.md +1 -1
  52. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_column_rails.md +2 -0
  53. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_row.jsx +33 -33
  54. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_row.md +1 -1
  55. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_row_rails.html.erb +34 -0
  56. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_row_rails.md +2 -0
  57. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data.jsx +51 -50
  58. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data.md +1 -1
  59. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data_rails.html.erb +54 -0
  60. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data_rails.md +2 -0
  61. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.jsx +37 -38
  62. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.md +1 -0
  63. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row_rails.html.erb +53 -0
  64. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row_rails.md +1 -0
  65. data/app/pb_kits/playbook/pb_table/docs/{_table_alignment_row.html.erb → _table_outer_padding.html.erb} +7 -7
  66. data/app/pb_kits/playbook/pb_table/docs/_table_outer_padding.jsx +76 -0
  67. data/app/pb_kits/playbook/pb_table/docs/_table_outer_padding.md +1 -0
  68. data/app/pb_kits/playbook/pb_table/docs/example.yml +9 -9
  69. data/app/pb_kits/playbook/pb_table/docs/index.js +1 -0
  70. data/app/pb_kits/playbook/pb_table/styles/_all.scss +1 -0
  71. data/app/pb_kits/playbook/pb_table/styles/_outer_padding.scss +21 -0
  72. data/app/pb_kits/playbook/pb_table/table.rb +14 -1
  73. data/app/pb_kits/playbook/pb_table/table.test.js +5 -1
  74. data/app/pb_kits/playbook/pb_treemap_chart/_treemap_chart.tsx +12 -9
  75. data/app/pb_kits/playbook/pb_treemap_chart/treemapChart.test.js +61 -0
  76. data/app/pb_kits/playbook/pb_treemap_chart/treemap_chart.rb +6 -1
  77. data/app/pb_kits/playbook/playbook-doc.js +2 -0
  78. data/app/pb_kits/playbook/tokens/_vertical_align.scss +18 -0
  79. data/app/pb_kits/playbook/utilities/_vertical_align.scss +16 -0
  80. data/app/pb_kits/playbook/utilities/globalProps.ts +12 -1
  81. data/dist/menu.yml +5 -2
  82. data/dist/playbook-rails.js +7 -7
  83. data/lib/playbook/classnames.rb +1 -0
  84. data/lib/playbook/kit_base.rb +2 -0
  85. data/lib/playbook/version.rb +2 -2
  86. data/lib/playbook/vertical_align.rb +37 -0
  87. metadata +41 -7
  88. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data.html.erb +0 -63
  89. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.html.erb +0 -52
  90. /data/app/pb_kits/playbook/pb_table/docs/{_table_alignment_column.html.erb → _table_alignment_column_rails.html.erb} +0 -0
@@ -0,0 +1,92 @@
1
+ import React, { createContext, useState, useContext, useEffect } from "react";
2
+
3
+ const DragContext = createContext<any>({});
4
+
5
+ export const DraggableContext = () => {
6
+ return useContext(DragContext);
7
+ };
8
+
9
+ export const DraggableProvider = ({ children, initialItems, onReorder }: any) => {
10
+ const [items, setItems] = useState([]);
11
+ const [dragData, setDragData] = useState<{ [key: string]: any }>({});
12
+ const [isDragging, setIsDragging] = useState("");
13
+ const [activeContainer, setActiveContainer] = useState("");
14
+
15
+ useEffect(() => {
16
+ setItems(initialItems);
17
+ }, [initialItems]);
18
+
19
+ useEffect(() => {
20
+ onReorder(items);
21
+ }, [items]);
22
+
23
+ const handleDragStart = (id: string, container: string) => {
24
+ setDragData({ id: id, initialGroup: container });
25
+ setIsDragging(id);
26
+ };
27
+
28
+ const handleDragEnter = (id: string, container: string) => {
29
+ if (dragData?.id !== id) {
30
+ const newItems = [...items];
31
+ const draggedItem = newItems.find((item) => item.id === dragData.id);
32
+ const draggedIndex = newItems.indexOf(draggedItem);
33
+ const targetIndex = newItems.findIndex((item) => item.id === id);
34
+
35
+ newItems.splice(draggedIndex, 1);
36
+ newItems.splice(targetIndex, 0, draggedItem);
37
+
38
+ setItems(newItems);
39
+ setDragData({ id: dragData.id, initialGroup: container });
40
+ }
41
+ };
42
+
43
+ const handleDragEnd = () => {
44
+ setIsDragging("");
45
+ setActiveContainer("");
46
+ };
47
+
48
+ const changeCategory = (itemId: string, container: string) => {
49
+ const updatedItems = items.map((item) => {
50
+ if (item.id === itemId) {
51
+ return { ...item, container: container };
52
+ }
53
+ return item;
54
+ });
55
+
56
+ setItems(updatedItems);
57
+ };
58
+
59
+ const handleDrop = (container: string) => {
60
+ setIsDragging("");
61
+ setActiveContainer("");
62
+ const selected = dragData.id;
63
+ changeCategory(selected, container);
64
+ };
65
+
66
+ const handleDragOver = (e: Event, container: string) => {
67
+ e.preventDefault();
68
+ setActiveContainer(container);
69
+ };
70
+
71
+
72
+
73
+ const contextValue = {
74
+ items,
75
+ setItems,
76
+ dragData,
77
+ setDragData,
78
+ isDragging,
79
+ setIsDragging,
80
+ activeContainer,
81
+ setActiveContainer,
82
+ handleDragStart,
83
+ handleDragEnter,
84
+ handleDragEnd,
85
+ handleDrop,
86
+ handleDragOver,
87
+ };
88
+
89
+ return (
90
+ <DragContext.Provider value={contextValue}>{children}</DragContext.Provider>
91
+ );
92
+ };
@@ -0,0 +1,53 @@
1
+ import React, { useState } from "react";
2
+ import { SelectableList, Draggable, DraggableProvider } from "../../";
3
+
4
+ // Initial items to be dragged
5
+ const data = [
6
+ {
7
+ id: "1",
8
+ text: "Task 1",
9
+ },
10
+ {
11
+ id: "2",
12
+ text: "Task 2",
13
+ },
14
+ {
15
+ id: "3",
16
+ text: "Task 3",
17
+ },
18
+ {
19
+ id: "4",
20
+ text: "Task 4",
21
+ },
22
+ ];
23
+
24
+ const DraggableDefault = (props) => {
25
+ const [initialState, setInitialState] = useState(data);
26
+
27
+ return (
28
+ <>
29
+ <DraggableProvider initialItems={data}
30
+ onReorder={(items) => setInitialState(items)}
31
+ >
32
+ <Draggable.Container {...props}>
33
+ <SelectableList variant="checkbox">
34
+ {initialState.map(({ id, text }) => (
35
+ <Draggable.Item id={id}
36
+ key={id}
37
+ >
38
+ <SelectableList.Item
39
+ label={text}
40
+ name={id}
41
+ value={id}
42
+ />
43
+ </Draggable.Item>
44
+ ))}
45
+ </SelectableList>
46
+ </Draggable.Container>
47
+ </DraggableProvider>
48
+ </>
49
+
50
+ );
51
+ };
52
+
53
+ export default DraggableDefault;
@@ -0,0 +1,4 @@
1
+ To use the Draggable kit, you must use the DraggableProvider and pass in `initialItems`. The `onReorder` is a function that returns the data as it changes as items are reordered. Use this to manage state as shown.
2
+
3
+ The `Draggable.Container` specifies the container within which items can be dropped.
4
+ The `Draggable.Item` specifies the items that can be dragged and dropped. `Draggable.Item` requires `id` to be passed in as shown.
@@ -0,0 +1,158 @@
1
+ import React, { useState } from "react";
2
+ import {
3
+ Flex,
4
+ Caption,
5
+ Card,
6
+ FlexItem,
7
+ Badge,
8
+ Avatar,
9
+ Title,
10
+ Body,
11
+ Draggable,
12
+ DraggableProvider,
13
+ } from "../../";
14
+
15
+ // Initial groups to drag between
16
+ const containers = ["To Do", "In Progress", "Done"];
17
+
18
+ // Initial items to be dragged
19
+ const data = [
20
+ {
21
+ id: "11",
22
+ container: "To Do",
23
+ title: "Task 1",
24
+ description: "Bug fixes",
25
+ assignee_name: "Terry Miles",
26
+ assignee_img: "https://randomuser.me/api/portraits/men/44.jpg",
27
+ },
28
+ {
29
+ id: "12",
30
+ container: "To Do",
31
+ title: "Task 2",
32
+ description: "Documentation",
33
+ assignee_name: "Sophia Miles",
34
+ assignee_img: "https://randomuser.me/api/portraits/women/8.jpg",
35
+ },
36
+ {
37
+ id: "13",
38
+ container: "In Progress",
39
+ title: "Task 3",
40
+ description: "Add a variant",
41
+ assignee_name: "Alice Jones",
42
+ assignee_img: "https://randomuser.me/api/portraits/women/10.jpg",
43
+ },
44
+ {
45
+ id: "14",
46
+ container: "To Do",
47
+ title: "Task 4",
48
+ description: "Add jest tests",
49
+ assignee_name: "Mike James",
50
+ assignee_img: "https://randomuser.me/api/portraits/men/8.jpg",
51
+ },
52
+ {
53
+ id: "15",
54
+ container: "Done",
55
+ title: "Task 5",
56
+ description: "Alpha testing",
57
+ assignee_name: "James Guy",
58
+ assignee_img: "https://randomuser.me/api/portraits/men/18.jpg",
59
+ },
60
+ {
61
+ id: "16",
62
+ container: "In Progress",
63
+ title: "Task 6",
64
+ description: "Release",
65
+ assignee_name: "Sally Jones",
66
+ assignee_img: "https://randomuser.me/api/portraits/women/28.jpg",
67
+ },
68
+ ];
69
+
70
+ const DraggableMultipleContainer = (props) => {
71
+ const [initialState, setInitialState] = useState(data);
72
+
73
+ const badgeProperties = (container) => {
74
+ switch (container) {
75
+ case "To Do":
76
+ return { text: "queue", color: "warning" };
77
+ case "In Progress":
78
+ return { text: "progress", color: "primary" };
79
+ default:
80
+ return { text: "done", color: "success" };
81
+ }
82
+ };
83
+
84
+ return (
85
+ <DraggableProvider initialItems={data}
86
+ onReorder={(items) => setInitialState(items)}
87
+ >
88
+ <Flex
89
+ justifyContent="center"
90
+ {...props}
91
+ >
92
+ {containers?.map((container) => (
93
+ <Draggable.Container
94
+ container={container}
95
+ key={container}
96
+ padding="sm"
97
+ >
98
+ <Caption textAlign="center">{container}</Caption>
99
+ <Flex
100
+ alignItems="stretch"
101
+ orientation="column"
102
+ >
103
+ {initialState
104
+ .filter((item) => item.container === container)
105
+ .map(
106
+ ({
107
+ assignee_img,
108
+ assignee_name,
109
+ description,
110
+ id,
111
+ title,
112
+ }) => (
113
+ <Draggable.Item
114
+ container={container}
115
+ id={id}
116
+ key={id}
117
+ >
118
+ <Card
119
+ marginBottom="sm"
120
+ padding="sm"
121
+ >
122
+ <Flex justify="between">
123
+ <FlexItem>
124
+ <Flex>
125
+ <Avatar
126
+ imageUrl={assignee_img}
127
+ name={assignee_name}
128
+ size="xxs"
129
+ />
130
+ <Title paddingLeft="xs"
131
+ size={4}
132
+ text={title}
133
+ />
134
+ </Flex>
135
+ </FlexItem>
136
+ <Badge
137
+ marginLeft="sm"
138
+ rounded
139
+ text={badgeProperties(container).text}
140
+ variant={badgeProperties(container).color}
141
+ />
142
+ </Flex>
143
+ <Body paddingTop="xs"
144
+ text={description}
145
+ />
146
+ </Card>
147
+ </Draggable.Item>
148
+ )
149
+ )}
150
+ </Flex>
151
+ </Draggable.Container>
152
+ ))}
153
+ </Flex>
154
+ </DraggableProvider>
155
+ );
156
+ };
157
+
158
+ export default DraggableMultipleContainer;
@@ -0,0 +1,101 @@
1
+ import React, { useState } from "react";
2
+ import {
3
+ Flex,
4
+ Badge,
5
+ Title,
6
+ Icon,
7
+ Draggable,
8
+ DraggableProvider,
9
+ Card,
10
+ Caption,
11
+ } from "../../";
12
+
13
+ // Initial items to be dragged
14
+ const data = [
15
+ {
16
+ id: "21",
17
+ text: "Joe Black",
18
+ },
19
+ {
20
+ id: "22",
21
+ text: "Nancy White",
22
+ },
23
+ {
24
+ id: "23",
25
+ text: "Bill Green",
26
+ },
27
+ ];
28
+
29
+ const DraggableWithCards = (props) => {
30
+ const [initialState, setInitialState] = useState(data);
31
+
32
+ return (
33
+ <DraggableProvider
34
+ initialItems={data}
35
+ onReorder={(items) => setInitialState(items)}
36
+ >
37
+ <Draggable.Container {...props}>
38
+ {initialState.map(({ id, text }) => (
39
+ <Card
40
+ dragHandle
41
+ draggableItem
42
+ highlight={{ color: "primary", position: "side" }}
43
+ id={id}
44
+ key={id}
45
+ marginBottom="xs"
46
+ padding="xs"
47
+ >
48
+ <Flex alignItems="stretch"
49
+ flexDirection="column"
50
+ >
51
+ <Flex gap="xs">
52
+ <Title size={4}
53
+ text={text}
54
+ />
55
+ <Badge
56
+ text="35-12345"
57
+ variant="primary"
58
+ />
59
+ </Flex>
60
+ <Caption
61
+ size="xs"
62
+ text="8:00A • Township Name • 90210"
63
+ />
64
+ <Flex gap="xxs"
65
+ spacing="between"
66
+ >
67
+ <Flex gap="xxs">
68
+ <Caption color="error"
69
+ size="xs"
70
+ >
71
+ <Icon icon="house-circle-exclamation" />
72
+ </Caption>
73
+ <Caption color="success"
74
+ size="xs">
75
+ <Icon icon="file-circle-check" />
76
+ </Caption>
77
+ </Flex>
78
+ <Flex>
79
+ <Badge rounded
80
+ text="Schedule QA"
81
+ variant="warning"
82
+ />
83
+ <Badge rounded
84
+ text="Flex"
85
+ variant="primary"
86
+ />
87
+ <Badge rounded
88
+ text="R99"
89
+ variant="primary"
90
+ />
91
+ </Flex>
92
+ </Flex>
93
+ </Flex>
94
+ </Card>
95
+ ))}
96
+ </Draggable.Container>
97
+ </DraggableProvider>
98
+ );
99
+ };
100
+
101
+ export default DraggableWithCards;
@@ -0,0 +1,50 @@
1
+ import React, { useState } from "react";
2
+ import { DraggableProvider, List, ListItem } from "../../";
3
+
4
+ // Initial items to be dragged
5
+ const data = [
6
+ {
7
+ id: "31",
8
+ text: "Philadelphia",
9
+ },
10
+ {
11
+ id: "32",
12
+ text: "New Jersey",
13
+ },
14
+ {
15
+ id: "33",
16
+ text: "Maryland",
17
+ },
18
+ {
19
+ id: "34",
20
+ text: "Connecticut",
21
+ },
22
+ ];
23
+
24
+ const DraggableWithList = (props) => {
25
+ const [initialState, setInitialState] = useState(data);
26
+
27
+
28
+ return (
29
+ <>
30
+ <DraggableProvider initialItems={data}
31
+ onReorder={(items) => setInitialState(items)}
32
+ >
33
+ <List draggable
34
+ {...props}
35
+ >
36
+ {initialState.map(({ id, text }) => (
37
+ <ListItem id={id}
38
+ key={id}
39
+ >
40
+ {text}
41
+ </ListItem>
42
+ ))}
43
+ </List>
44
+ </DraggableProvider>
45
+ </>
46
+
47
+ );
48
+ };
49
+
50
+ export default DraggableWithList;
@@ -0,0 +1 @@
1
+ For a simplified version of the Draggable API for the List kit, use the DraggableProvider to wrap the List kit and use the `draggable` prop on List. The dev must manage state as shown and pass in id to the ListItem.
@@ -0,0 +1,51 @@
1
+ import React, { useState } from "react";
2
+ import { SelectableList, DraggableProvider } from "../../";
3
+
4
+ // Initial items to be dragged
5
+ const data = [
6
+ {
7
+ id: "41",
8
+ text: "Task 1",
9
+ },
10
+ {
11
+ id: "42",
12
+ text: "Task 2",
13
+ },
14
+ {
15
+ id: "43",
16
+ text: "Task 3",
17
+ },
18
+ {
19
+ id: "44",
20
+ text: "Task 4",
21
+ },
22
+ ];
23
+
24
+ const DraggableWithSelectableList = (props) => {
25
+ const [initialState, setInitialState] = useState(data);
26
+
27
+ return (
28
+ <>
29
+ <DraggableProvider initialItems={data}
30
+ onReorder={(items) => setInitialState(items)}
31
+ >
32
+ <SelectableList draggable
33
+ variant="checkbox"
34
+ {...props}
35
+ >
36
+ {initialState.map(({ id, text }) => (
37
+ <SelectableList.Item id={id}
38
+ key={id}
39
+ label={text}
40
+ name={id}
41
+ value={id}
42
+ />
43
+ ))}
44
+ </SelectableList>
45
+ </DraggableProvider>
46
+ </>
47
+
48
+ );
49
+ };
50
+
51
+ export default DraggableWithSelectableList
@@ -0,0 +1,11 @@
1
+ examples:
2
+
3
+
4
+ react:
5
+ - draggable_default: Default
6
+ - draggable_with_list: Draggable with List Kit
7
+ - draggable_with_selectable_list: Draggable with SelectableList Kit
8
+ - draggable_with_cards: Draggable with Cards
9
+ - draggable_multiple_containers: Dragging Across Multiple Containers
10
+
11
+
@@ -0,0 +1,5 @@
1
+ export { default as DraggableDefault } from './_draggable_default.jsx'
2
+ export { default as DraggableWithCards } from './_draggable_with_cards.jsx'
3
+ export { default as DraggableWithList } from './_draggable_with_list.jsx'
4
+ export { default as DraggableWithSelectableList } from './_draggable_with_selectable_list.jsx'
5
+ export { default as DraggableMultipleContainers } from './_draggable_multiple_containers.jsx'
@@ -0,0 +1,63 @@
1
+ import React, {useState} from "react"
2
+ import { render, screen } from "../utilities/test-utils"
3
+
4
+ import { Draggable, DraggableProvider, SelectableList } from '../'
5
+
6
+ const testId = 'draggable'
7
+
8
+ const data = [
9
+ {
10
+ id: "1",
11
+ text: "Task 1",
12
+ },
13
+ {
14
+ id: "2",
15
+ text: "Task 2",
16
+ },
17
+ {
18
+ id: "3",
19
+ text: "Task 3",
20
+ },
21
+ {
22
+ id: "4",
23
+ text: "Task 4",
24
+ },
25
+ ];
26
+
27
+
28
+ const DefaultDraggableKit = () => {
29
+ const [initialState, setInitialState] = useState(data);
30
+
31
+ return (
32
+ <DraggableProvider
33
+ initialItems={data}
34
+ onReorder={(items) => setInitialState(items)}
35
+ >
36
+ <Draggable
37
+ data={{ testid: testId }}
38
+ >
39
+ <Draggable.Container>
40
+ <SelectableList variant="checkbox">
41
+ {initialState.map(({ id, text }) => (
42
+ <Draggable.Item id={id}
43
+ key={id}
44
+ >
45
+ <SelectableList.Item label={text}
46
+ name={id}
47
+ value={id}
48
+ />
49
+ </Draggable.Item>
50
+ ))}
51
+ </SelectableList>
52
+ </Draggable.Container>
53
+ </Draggable>
54
+ </DraggableProvider>
55
+ );
56
+ };
57
+
58
+ test('generated default kit and classname', () => {
59
+ render(<DefaultDraggableKit/>)
60
+ const kit = screen.getByTestId(testId)
61
+ expect(kit).toBeInTheDocument()
62
+ expect(kit).toHaveClass('pb_draggable')
63
+ })
@@ -0,0 +1,54 @@
1
+ import React from "react";
2
+ import classnames from "classnames";
3
+ import {
4
+ buildAriaProps,
5
+ buildCss,
6
+ buildDataProps,
7
+ buildHtmlProps
8
+ } from "../../utilities/props";
9
+ import { globalProps } from "../../utilities/globalProps";
10
+ import { DraggableContext } from "../context";
11
+
12
+ type DraggableContainerProps = {
13
+ aria?: { [key: string]: string };
14
+ children?: React.ReactNode;
15
+ className?: string;
16
+ container?: any;
17
+ data?: { [key: string]: string };
18
+ htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
19
+ id?: string;
20
+ };
21
+
22
+ const DraggableContainer = (props: DraggableContainerProps) => {
23
+ const { aria = {}, children, className, container, data = {}, htmlOptions = {}, id } = props;
24
+
25
+ const { handleDragOver, handleDrop, activeContainer } = DraggableContext();
26
+
27
+ const ariaProps = buildAriaProps(aria);
28
+ const dataProps = buildDataProps(data);
29
+ const htmlProps = buildHtmlProps(htmlOptions);
30
+
31
+ const classes = classnames(
32
+ buildCss("pb_draggable_container"),
33
+ `${activeContainer === container ? "active" : ""}`,
34
+ globalProps(props),
35
+ className
36
+ );
37
+
38
+ return (
39
+ <div
40
+ {...ariaProps}
41
+ {...dataProps}
42
+ {...htmlProps}
43
+ className={classes}
44
+ id={id}
45
+ key={container}
46
+ onDragOver={(e) => handleDragOver(e, container)}
47
+ onDrop={() => handleDrop(container)}
48
+ >
49
+ {children}
50
+ </div>
51
+ );
52
+ };
53
+
54
+ export default DraggableContainer;