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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 765d089ccf2865b636f00f2731f259d3251554090ba8cf345d1b96c887af523a
4
- data.tar.gz: d2027d84bedb2da3000a272b5c85e8c108dbf4fac0c612653a8ce7f943924f51
3
+ metadata.gz: 465ee51ff2dbb2af50cc37ab1410fcc232cd40a299ef118c417233501dc228b4
4
+ data.tar.gz: d24d893f196fdb17bd2ac9de0c675fe94f75f96ffe22e40fac1b50291175b25a
5
5
  SHA512:
6
- metadata.gz: 5927b36c0974b0d951da24d21a0afbae2f1e4949ec0e73e299491f7bb33e378b6be3eb573c0e090edc94efb924753b9117a310d12c6ff43da62c79cd21edbc17
7
- data.tar.gz: 123324d5d23872521397b16043be4df25028beb28731e8cf7e2a79ff4c49058aa4a902a1908677d0533163256ea5860861d2cdb629971be3599a61b55192c95d
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 { sortControl, responsive, selectableRows, hasAnySubRows, showActionsBar, inlineRowLoading } =
43
- useContext(AdvancedTableContext);
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
- .row-selection-actions-card {
35
- border-bottom-right-radius: 0px !important;
36
- border-bottom-left-radius: 0px !important;
37
- border-bottom-color: transparent;
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
- selectableRows && showActionsBar && (
338
- <Card className="row-selection-actions-card"
339
- padding="xs"
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
- <Flex alignItems="center"
342
- justify="between"
343
- >
344
- <Caption color="light"
345
- paddingLeft="xs"
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
- <%= content.presence %>
3
- <% end %>
2
+ <%= content.presence %>
3
+ <% end %>
@@ -3,9 +3,6 @@
3
3
  module Playbook
4
4
  module PbDraggable
5
5
  class DraggableContainer < ::Playbook::KitBase
6
- prop :container, type: Playbook::Props::String,
7
- default: ""
8
-
9
6
  def data
10
7
  Hash(prop(:data)).merge(pb_draggable_container: true)
11
8
  end
@@ -5,8 +5,6 @@ module Playbook
5
5
  class DraggableItem < ::Playbook::KitBase
6
6
  prop :drag_id, type: Playbook::Props::String,
7
7
  default: ""
8
- prop :container, type: Playbook::Props::String,
9
- default: ""
10
8
 
11
9
  def data
12
10
  Hash(prop(:data)).merge(pb_draggable_item: true)
@@ -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 containers = this.element.querySelectorAll(DRAGGABLE_CONTAINER);
52
- containers.forEach(container => {
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.stopPropagation();
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.stopPropagation();
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
- this.element.querySelectorAll('.pb_draggable_item')
154
- ).map(item => ({
155
- id: item.id,
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