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

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 (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;