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