playbook_ui 14.12.0.pre.alpha.PBNTR779railsdraggablecrosscontainer5863 → 14.12.0.pre.alpha.PBNTR8335887
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.
- 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
|
|