playbook_ui 14.12.0.pre.alpha.PBNTR779railsdraggablecrosscontainer5863 → 14.12.0.pre.alpha.PBNTR8335887
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +10 -3
- data/app/pb_kits/playbook/pb_advanced_table/Utilities/ActionBarAnimationHelper.ts +26 -0
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +6 -6
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +34 -21
- data/app/pb_kits/playbook/pb_draggable/docs/example.yml +5 -1
- data/app/pb_kits/playbook/pb_draggable/draggable_container.html.erb +2 -2
- data/app/pb_kits/playbook/pb_draggable/draggable_container.rb +0 -3
- data/app/pb_kits/playbook/pb_draggable/draggable_item.rb +0 -2
- data/app/pb_kits/playbook/pb_draggable/index.js +16 -88
- data/dist/chunks/_weekday_stacked-Be4uzzgn.js +45 -0
- data/dist/chunks/vendor.js +1 -1
- data/dist/playbook-doc.js +1 -1
- data/dist/playbook-rails.js +1 -1
- data/dist/playbook.css +1 -1
- data/lib/playbook/version.rb +1 -1
- metadata +4 -5
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_multiple_containers_rails.html.erb +0 -193
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_multiple_containers_rails.md +0 -1
- data/dist/chunks/_weekday_stacked-C98LOqgG.js +0 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 465ee51ff2dbb2af50cc37ab1410fcc232cd40a299ef118c417233501dc228b4
|
4
|
+
data.tar.gz: d24d893f196fdb17bd2ac9de0c675fe94f75f96ffe22e40fac1b50291175b25a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c93b1222544a679b63d47c822e178f791bc5dc9c62b766d2b56343baab2ae44bb237cc821d70ffa6fe14c35a8b77aa277b17c2da02c0915b7f44764ddddf9d1
|
7
|
+
data.tar.gz: f20faea4116796dde581972cf1e1ab25e60470e4ecbc5fb51b59161f9593bbf17b24b501d4e6f351add749ce87f85d9389d49740cc66055c8cf3c50386f8337f
|
@@ -39,8 +39,15 @@ export const TableHeaderCell = ({
|
|
39
39
|
sortIcon,
|
40
40
|
table
|
41
41
|
}: TableHeaderCellProps) => {
|
42
|
-
const {
|
43
|
-
|
42
|
+
const {
|
43
|
+
sortControl,
|
44
|
+
responsive,
|
45
|
+
selectableRows,
|
46
|
+
hasAnySubRows,
|
47
|
+
showActionsBar,
|
48
|
+
inlineRowLoading,
|
49
|
+
isActionBarVisible,
|
50
|
+
} = useContext(AdvancedTableContext);
|
44
51
|
|
45
52
|
type justifyTypes = "none" | "center" | "start" | "end" | "between" | "around" | "evenly"
|
46
53
|
|
@@ -65,7 +72,7 @@ export const TableHeaderCell = ({
|
|
65
72
|
|
66
73
|
const cellClassName = classnames(
|
67
74
|
"table-header-cells",
|
68
|
-
`${showActionsBar && "header-cells-with-actions"}`,
|
75
|
+
`${showActionsBar && isActionBarVisible && "header-cells-with-actions"}`,
|
69
76
|
`${isChrome() ? "chrome-styles" : ""}`,
|
70
77
|
`${enableSorting ? "table-header-cells-active" : ""}`,
|
71
78
|
{ "pinned-left": responsive === "scroll" && isPinnedLeft },
|
@@ -0,0 +1,26 @@
|
|
1
|
+
export const showActionBar = (elem: HTMLElement) => {
|
2
|
+
elem.style.display = "block";
|
3
|
+
const height = elem.scrollHeight + "px";
|
4
|
+
elem.style.height = height;
|
5
|
+
elem.classList.add("is-visible");
|
6
|
+
elem.style.overflow = "hidden";
|
7
|
+
|
8
|
+
window.setTimeout(() => {
|
9
|
+
if (elem.classList.contains("is-visible")) {
|
10
|
+
elem.style.height = "";
|
11
|
+
elem.style.overflow = "visible";
|
12
|
+
}
|
13
|
+
}, 300);
|
14
|
+
};
|
15
|
+
|
16
|
+
export const hideActionBar = (elem: HTMLElement) => {
|
17
|
+
elem.style.height = elem.scrollHeight + "px";
|
18
|
+
elem.offsetHeight;
|
19
|
+
window.setTimeout(() => {
|
20
|
+
elem.style.height = "0";
|
21
|
+
elem.style.overflow = "hidden";
|
22
|
+
}, 10);
|
23
|
+
window.setTimeout(() => {
|
24
|
+
elem.classList.remove("is-visible");
|
25
|
+
}, 300);
|
26
|
+
};
|
@@ -31,12 +31,12 @@
|
|
31
31
|
width: 100%;
|
32
32
|
}
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
34
|
+
.row-selection-actions-card {
|
35
|
+
border-bottom-right-radius: 0px !important;
|
36
|
+
border-bottom-left-radius: 0px !important;
|
37
|
+
border-bottom-color: transparent;
|
38
|
+
transition: height 300ms ease;
|
39
|
+
}
|
40
40
|
.table-header-cells:first-child {
|
41
41
|
min-width: 180px;
|
42
42
|
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import React, { useState, useEffect, useCallback } from "react"
|
1
|
+
import React, { useState, useEffect, useCallback, useRef } from "react"
|
2
2
|
import classnames from "classnames"
|
3
3
|
|
4
4
|
import { GenericObject } from "../types"
|
@@ -27,6 +27,7 @@ import FlexItem from "../pb_flex/_flex_item"
|
|
27
27
|
import AdvancedTableContext from "./Context/AdvancedTableContext"
|
28
28
|
|
29
29
|
import { updateExpandAndCollapseState } from "./Utilities/ExpansionControlHelpers"
|
30
|
+
import { showActionBar, hideActionBar } from "./Utilities/ActionBarAnimationHelper"
|
30
31
|
|
31
32
|
import { CustomCell } from "./Components/CustomCell"
|
32
33
|
import { TableHeader } from "./SubKits/TableHeader"
|
@@ -295,6 +296,20 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
295
296
|
const onPageChange = (page: number) => {
|
296
297
|
table.setPageIndex(page - 1)
|
297
298
|
}
|
299
|
+
//When to show the actions bar as a whole
|
300
|
+
const isActionBarVisible = selectableRows && showActionsBar && selectedRowsLength > 0
|
301
|
+
|
302
|
+
//Ref and useEffect for animating the actions bar
|
303
|
+
const cardRef = useRef(null);
|
304
|
+
useEffect(() => {
|
305
|
+
if (cardRef.current) {
|
306
|
+
if (isActionBarVisible) {
|
307
|
+
showActionBar(cardRef.current);
|
308
|
+
} else {
|
309
|
+
hideActionBar(cardRef.current);
|
310
|
+
}
|
311
|
+
}
|
312
|
+
}, [isActionBarVisible]);
|
298
313
|
|
299
314
|
return (
|
300
315
|
<div {...ariaProps}
|
@@ -311,6 +326,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
311
326
|
expandedControl,
|
312
327
|
handleExpandOrCollapse,
|
313
328
|
inlineRowLoading,
|
329
|
+
isActionBarVisible,
|
314
330
|
loading,
|
315
331
|
responsive,
|
316
332
|
setExpanded,
|
@@ -333,27 +349,24 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
333
349
|
total={table.getPageCount()}
|
334
350
|
/>
|
335
351
|
}
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
352
|
+
<Card
|
353
|
+
borderNone={!isActionBarVisible}
|
354
|
+
className={`${isActionBarVisible && "show-action-card row-selection-actions-card"}`}
|
355
|
+
htmlOptions={{ ref: cardRef as any }}
|
356
|
+
padding={`${isActionBarVisible ? "xs" : "none"}`}
|
357
|
+
>
|
358
|
+
<Flex alignItems="center"
|
359
|
+
justify="between"
|
360
|
+
>
|
361
|
+
<Caption color="light"
|
362
|
+
paddingLeft="xs"
|
363
|
+
size="xs"
|
340
364
|
>
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
size="xs"
|
347
|
-
>
|
348
|
-
{selectedRowsLength} Selected
|
349
|
-
</Caption>
|
350
|
-
<FlexItem>
|
351
|
-
{actions}
|
352
|
-
</FlexItem>
|
353
|
-
</Flex>
|
354
|
-
</Card>
|
355
|
-
)
|
356
|
-
}
|
365
|
+
{selectedRowsLength} Selected
|
366
|
+
</Caption>
|
367
|
+
<FlexItem>{actions}</FlexItem>
|
368
|
+
</Flex>
|
369
|
+
</Card>
|
357
370
|
<Table
|
358
371
|
className={`${loading ? "content-loading" : ""}`}
|
359
372
|
dark={dark}
|
@@ -1,14 +1,18 @@
|
|
1
1
|
examples:
|
2
|
+
|
3
|
+
|
2
4
|
react:
|
3
5
|
- draggable_default: Default
|
4
6
|
- draggable_with_list: Draggable with List Kit
|
5
7
|
- draggable_with_selectable_list: Draggable with SelectableList Kit
|
6
8
|
- draggable_with_cards: Draggable with Cards
|
7
9
|
- draggable_multiple_containers: Dragging Across Multiple Containers
|
10
|
+
|
8
11
|
rails:
|
9
12
|
- draggable_default_rails: Default
|
10
13
|
- draggable_with_list_rails: Draggable with List Kit
|
11
14
|
- draggable_with_selectable_list_rails: Draggable with SelectableList Kit
|
12
15
|
- draggable_with_cards_rails: Draggable with Cards
|
13
|
-
- draggable_multiple_containers_rails: Dragging Across Multiple Containers
|
14
16
|
|
17
|
+
|
18
|
+
|
@@ -1,3 +1,3 @@
|
|
1
1
|
<%= pb_content_tag do %>
|
2
|
-
|
3
|
-
<% end %>
|
2
|
+
<%= content.presence %>
|
3
|
+
<% end %>
|
@@ -9,32 +9,11 @@ export default class PbDraggable extends PbEnhancedElement {
|
|
9
9
|
}
|
10
10
|
|
11
11
|
connect() {
|
12
|
-
this.state = {
|
13
|
-
items: [],
|
14
|
-
dragData: { id: "", initialGroup: "" },
|
15
|
-
isDragging: "",
|
16
|
-
activeContainer: ""
|
17
|
-
};
|
18
|
-
|
19
12
|
this.draggedItem = null;
|
20
13
|
this.draggedItemId = null;
|
21
|
-
|
22
14
|
document.addEventListener("DOMContentLoaded", () => this.bindEventListeners());
|
23
15
|
}
|
24
16
|
|
25
|
-
setState(newState) {
|
26
|
-
this.state = { ...this.state, ...newState };
|
27
|
-
if (newState.items) {
|
28
|
-
const customEvent = new CustomEvent('pb-draggable-reorder', {
|
29
|
-
detail: {
|
30
|
-
reorderedItems: this.state.items,
|
31
|
-
containerId: this.element.querySelector(DRAGGABLE_CONTAINER).id
|
32
|
-
}
|
33
|
-
});
|
34
|
-
this.element.dispatchEvent(customEvent);
|
35
|
-
}
|
36
|
-
}
|
37
|
-
|
38
17
|
bindEventListeners() {
|
39
18
|
// Needed to prevent images within draggable items from being independently draggable
|
40
19
|
// Needed if using Image kit in draggable items
|
@@ -48,11 +27,11 @@ export default class PbDraggable extends PbEnhancedElement {
|
|
48
27
|
item.addEventListener("dragenter", this.handleDragEnter.bind(this));
|
49
28
|
});
|
50
29
|
|
51
|
-
const
|
52
|
-
|
30
|
+
const container = this.element.querySelector(DRAGGABLE_CONTAINER);
|
31
|
+
if (container) {
|
53
32
|
container.addEventListener("dragover", this.handleDragOver.bind(this));
|
54
33
|
container.addEventListener("drop", this.handleDrop.bind(this));
|
55
|
-
}
|
34
|
+
}
|
56
35
|
}
|
57
36
|
|
58
37
|
handleDragStart(event) {
|
@@ -62,17 +41,11 @@ export default class PbDraggable extends PbEnhancedElement {
|
|
62
41
|
event.preventDefault();
|
63
42
|
return;
|
64
43
|
}
|
65
|
-
|
66
|
-
const container = event.target.closest(DRAGGABLE_CONTAINER);
|
44
|
+
|
67
45
|
this.draggedItem = event.target;
|
68
46
|
this.draggedItemId = event.target.id;
|
69
|
-
|
70
|
-
this.setState({
|
71
|
-
dragData: { id: this.draggedItemId, initialGroup: container.id },
|
72
|
-
isDragging: this.draggedItemId
|
73
|
-
});
|
74
|
-
|
75
47
|
event.target.classList.add("is_dragging");
|
48
|
+
|
76
49
|
if (event.dataTransfer) {
|
77
50
|
event.dataTransfer.effectAllowed = 'move';
|
78
51
|
event.dataTransfer.setData('text/plain', this.draggedItemId);
|
@@ -91,14 +64,6 @@ export default class PbDraggable extends PbEnhancedElement {
|
|
91
64
|
|
92
65
|
const container = targetItem.parentNode;
|
93
66
|
const items = Array.from(container.children);
|
94
|
-
|
95
|
-
const newItems = [...items].map(item => ({
|
96
|
-
id: item.id,
|
97
|
-
container: container.id
|
98
|
-
}));
|
99
|
-
|
100
|
-
this.setState({ items: newItems });
|
101
|
-
|
102
67
|
const draggedIndex = items.indexOf(this.draggedItem);
|
103
68
|
const targetIndex = items.indexOf(targetItem);
|
104
69
|
|
@@ -111,82 +76,45 @@ export default class PbDraggable extends PbEnhancedElement {
|
|
111
76
|
|
112
77
|
handleDragOver(event) {
|
113
78
|
event.preventDefault();
|
114
|
-
event.
|
115
|
-
|
116
|
-
let container;
|
117
|
-
if (event.target.matches(DRAGGABLE_CONTAINER)) {
|
118
|
-
container = event.target;
|
119
|
-
} else {
|
120
|
-
container = event.target.closest(DRAGGABLE_CONTAINER);
|
121
|
-
}
|
79
|
+
const container = event.target.closest(DRAGGABLE_CONTAINER);
|
122
80
|
|
123
81
|
if (container) {
|
124
|
-
this.setState({ activeContainer: container.id });
|
125
82
|
container.classList.add("active_container");
|
126
83
|
}
|
127
84
|
}
|
128
85
|
|
129
86
|
handleDrop(event) {
|
130
87
|
event.preventDefault();
|
131
|
-
event.
|
132
|
-
|
133
|
-
let container;
|
134
|
-
|
135
|
-
if (event.target.matches(DRAGGABLE_CONTAINER)) {
|
136
|
-
container = event.target;
|
137
|
-
} else {
|
138
|
-
container = event.target.closest(DRAGGABLE_CONTAINER);
|
139
|
-
}
|
140
|
-
|
88
|
+
const container = event.target.closest(DRAGGABLE_CONTAINER);
|
141
89
|
if (!container || !this.draggedItem) return;
|
142
|
-
|
90
|
+
|
143
91
|
container.classList.remove("active_container");
|
144
92
|
this.draggedItem.style.opacity = '1';
|
145
|
-
|
146
|
-
// Handle empty containers
|
147
|
-
if (!container.querySelector('.pb_draggable_item')) {
|
148
|
-
container.appendChild(this.draggedItem);
|
149
|
-
}
|
150
|
-
|
93
|
+
|
151
94
|
// Updated order of items as an array of item IDs
|
152
|
-
const reorderedItems = Array.from(
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
container: item.closest(DRAGGABLE_CONTAINER).id
|
157
|
-
}));
|
158
|
-
|
95
|
+
const reorderedItems = Array.from(container.children)
|
96
|
+
.filter(item => item.classList.contains("pb_draggable_item"))
|
97
|
+
.map(item => item.id.replace("item_", ""));
|
98
|
+
|
159
99
|
// Store reordered items in a data attribute on the container
|
160
100
|
container.setAttribute("data-reordered-items", JSON.stringify(reorderedItems));
|
161
|
-
|
101
|
+
|
162
102
|
const customEvent = new CustomEvent('pb-draggable-reorder', {
|
163
103
|
detail: {
|
164
104
|
reorderedItems,
|
165
105
|
containerId: container.id,
|
166
106
|
}
|
167
107
|
});
|
168
|
-
|
169
108
|
this.element.dispatchEvent(customEvent);
|
170
|
-
|
171
|
-
this.setState({
|
172
|
-
items: reorderedItems, // Changed from reorderedItems to items to match setState
|
173
|
-
isDragging: "",
|
174
|
-
activeContainer: ""
|
175
|
-
});
|
176
|
-
|
109
|
+
|
177
110
|
this.draggedItem = null;
|
178
111
|
this.draggedItemId = null;
|
179
112
|
}
|
113
|
+
|
180
114
|
|
181
115
|
handleDragEnd(event) {
|
182
116
|
event.target.classList.remove("is_dragging");
|
183
117
|
event.target.style.opacity = '1';
|
184
|
-
|
185
|
-
this.setState({
|
186
|
-
isDragging: "",
|
187
|
-
activeContainer: ""
|
188
|
-
});
|
189
|
-
|
190
118
|
this.draggedItem = null;
|
191
119
|
this.draggedItemId = null;
|
192
120
|
|