playbook_ui 14.18.0.pre.alpha.PLAY20787400 → 14.18.0.pre.alpha.dropdownautocomplete7493
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/_advanced_table.scss +304 -21
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +5 -1
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +6 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta.md +0 -6
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color.jsx +80 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color.md +3 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.html.erb +58 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.md +3 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows_rails.md +5 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.jsx → _advanced_table_selectable_rows_no_subrows_react.jsx} +2 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_rails.md +3 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +6 -5
- data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +3 -2
- data/app/pb_kits/playbook/pb_advanced_table/flat_advanced_table.js +106 -0
- data/app/pb_kits/playbook/pb_advanced_table/index.js +228 -11
- data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +9 -1
- data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +0 -3
- data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +1 -2
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.html.erb +2 -2
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.jsx +4 -1
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones.html.erb +43 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_colors.html.erb +55 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_colors_rails.md +1 -0
- data/app/pb_kits/playbook/pb_draggable/docs/example.yml +2 -1
- data/app/pb_kits/playbook/pb_draggable/draggable.rb +9 -1
- data/app/pb_kits/playbook/pb_draggable/index.js +139 -142
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +5 -0
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +5 -16
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.html.erb +5 -2
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.jsx +4 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.html.erb +28 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.jsx +17 -64
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.html.erb +58 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/{_dropdown_with_autocomplete_and_custom_display.jsx → _dropdown_with_autocomplete_with_subcomponents.jsx} +11 -25
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_external_control.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.jsx +61 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.md +2 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.html.erb +52 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.md +2 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +7 -4
- data/app/pb_kits/playbook/pb_dropdown/docs/index.js +2 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +2 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +4 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +45 -1
- data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +10 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown_container.rb +3 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +12 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +3 -1
- data/app/pb_kits/playbook/pb_dropdown/index.js +57 -0
- data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +26 -0
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +1 -2
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +4 -4
- data/app/pb_kits/playbook/pb_filter/docs/_filter_within_turbo_frames.html.erb +41 -0
- data/app/pb_kits/playbook/pb_filter/docs/_filter_within_turbo_frames.md +1 -0
- data/app/pb_kits/playbook/pb_filter/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_form_group/_error_state_mixin.scss +22 -18
- data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_pb_styles.jsx +52 -0
- data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_pb_styles.md +1 -0
- data/app/pb_kits/playbook/pb_line_graph/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_line_graph/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_line_graph/lineGraphTheme.ts +110 -0
- data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +13 -0
- data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +3 -1
- data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_country_search.html.erb +10 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_country_search.jsx +20 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_country_search.md +1 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_validation.jsx +8 -1
- data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +3 -0
- data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.test.js +19 -0
- data/app/pb_kits/playbook/pb_popover/docs/_popover_append_to.html.erb +46 -0
- data/app/pb_kits/playbook/pb_popover/docs/_popover_append_to.md +1 -0
- data/app/pb_kits/playbook/pb_popover/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_popover/index.ts +13 -1
- data/app/pb_kits/playbook/pb_popover/popover.rb +2 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_error.html.erb +1 -1
- data/app/pb_kits/playbook/pb_select/docs/_select_error.jsx +7 -2
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.html.erb +1 -1
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.jsx +9 -1
- data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.html.erb +5 -1
- data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.jsx +7 -1
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_error_state.html.erb +8 -1
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_error_state.jsx +6 -2
- data/dist/chunks/{_typeahead-BX8IifKY.js → _typeahead-D8CsVBZO.js} +2 -2
- data/dist/chunks/_weekday_stacked-Da8b-KUp.js +45 -0
- data/dist/chunks/{lib-96_ZmvAo.js → lib-BmTAc7Nc.js} +1 -1
- data/dist/chunks/{pb_form_validation-Vv2TqXVC.js → pb_form_validation-BWjy4bFn.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/playbook-doc.js +2 -2
- data/dist/playbook-rails-react-bindings.js +1 -1
- data/dist/playbook-rails.js +1 -1
- data/dist/playbook.css +1 -1
- data/lib/playbook/version.rb +1 -1
- metadata +39 -15
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_and_custom_display.md +0 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_hook.jsx +0 -79
- data/dist/chunks/_weekday_stacked-DfMD7HJz.js +0 -45
- /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_react.md → _advanced_table_selectable_rows.md} +0 -0
- /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.html.erb → _advanced_table_selectable_rows_no_subrows_rails.html.erb} +0 -0
- /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows.html.erb → _advanced_table_selectable_rows_rails.html.erb} +0 -0
- /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_drop_zones_colors.md → _draggable_drop_zones_colors_react.md} +0 -0
- /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_drop_zones.md → _draggable_drop_zones_react.md} +0 -0
@@ -1,24 +1,26 @@
|
|
1
1
|
import PbEnhancedElement from "../pb_enhanced_element";
|
2
2
|
|
3
|
-
const DRAGGABLE_SELECTOR
|
3
|
+
const DRAGGABLE_SELECTOR = "[data-pb-draggable]";
|
4
4
|
const DRAGGABLE_CONTAINER = ".pb_draggable_container";
|
5
|
+
const NEEDS_CLONE = ["shadow", "outline"]; // clone only for these types
|
5
6
|
|
6
7
|
export default class PbDraggable extends PbEnhancedElement {
|
7
|
-
static get selector() {
|
8
|
-
return DRAGGABLE_SELECTOR;
|
9
|
-
}
|
8
|
+
static get selector() { return DRAGGABLE_SELECTOR; }
|
10
9
|
|
11
10
|
connect() {
|
12
11
|
this.state = {
|
13
|
-
items:
|
14
|
-
dragData:
|
15
|
-
isDragging:
|
16
|
-
activeContainer: ""
|
12
|
+
items: [],
|
13
|
+
dragData: { id: "", initialGroup: "" },
|
14
|
+
isDragging: "",
|
15
|
+
activeContainer: "",
|
17
16
|
};
|
18
17
|
|
19
|
-
this.draggedItem
|
18
|
+
this.draggedItem = null;
|
20
19
|
this.draggedItemId = null;
|
20
|
+
this.dragGhost = null;
|
21
21
|
this.hasMultipleContainers = false;
|
22
|
+
this.dragZoneType = "";
|
23
|
+
this.dragZoneColor = "";
|
22
24
|
|
23
25
|
document.addEventListener("DOMContentLoaded", () => this.bindEventListeners());
|
24
26
|
}
|
@@ -26,13 +28,12 @@ export default class PbDraggable extends PbEnhancedElement {
|
|
26
28
|
setState(newState) {
|
27
29
|
this.state = { ...this.state, ...newState };
|
28
30
|
if (newState.items) {
|
29
|
-
|
31
|
+
this.element.dispatchEvent(new CustomEvent("pb-draggable-reorder", {
|
30
32
|
detail: {
|
31
33
|
reorderedItems: this.state.items,
|
32
|
-
containerId:
|
33
|
-
}
|
34
|
-
});
|
35
|
-
this.element.dispatchEvent(customEvent);
|
34
|
+
containerId: this.element.querySelector(DRAGGABLE_CONTAINER).id,
|
35
|
+
},
|
36
|
+
}));
|
36
37
|
}
|
37
38
|
}
|
38
39
|
|
@@ -43,71 +44,100 @@ export default class PbDraggable extends PbEnhancedElement {
|
|
43
44
|
|
44
45
|
// Needed to prevent images within draggable items from being independently draggable
|
45
46
|
// Needed if using Image kit in draggable items
|
46
|
-
this.element.querySelectorAll(".pb_draggable_item img")
|
47
|
-
img.setAttribute("draggable", "false");
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
47
|
+
this.element.querySelectorAll(".pb_draggable_item img")
|
48
|
+
.forEach(img => img.setAttribute("draggable", "false"));
|
49
|
+
|
50
|
+
this.element.querySelectorAll(".pb_draggable_item")
|
51
|
+
.forEach(item => {
|
52
|
+
item.addEventListener("dragstart", this.handleDragStart.bind(this));
|
53
|
+
item.addEventListener("dragend", this.handleDragEnd.bind(this));
|
54
|
+
item.addEventListener("dragenter", this.handleDragEnter.bind(this));
|
55
|
+
});
|
55
56
|
|
56
|
-
containers.forEach(
|
57
|
-
|
58
|
-
|
57
|
+
containers.forEach(c => {
|
58
|
+
c.addEventListener("dragover", this.handleDragOver.bind(this));
|
59
|
+
c.addEventListener("drop", this.handleDrop.bind(this));
|
59
60
|
});
|
60
61
|
}
|
61
62
|
|
63
|
+
/* ---------------- DRAG START ---------------- */
|
62
64
|
handleDragStart(event) {
|
63
65
|
// Needed to prevent images within draggable items from being independently draggable
|
64
66
|
// Needed if using Image kit in draggable items
|
65
|
-
if (event.target.tagName.toLowerCase() ===
|
67
|
+
if (event.target.tagName.toLowerCase() === "img") {
|
66
68
|
event.preventDefault();
|
67
69
|
return;
|
68
70
|
}
|
69
71
|
|
70
|
-
const container
|
71
|
-
this.draggedItem
|
72
|
+
const container = event.target.closest(DRAGGABLE_CONTAINER);
|
73
|
+
this.draggedItem = event.target;
|
72
74
|
this.draggedItemId = event.target.id;
|
75
|
+
this.dragZoneType = this.element.dataset.dropZoneType || "";
|
76
|
+
this.dragZoneColor = this.element.dataset.dropZoneColor || "";
|
73
77
|
|
74
78
|
this.setState({
|
75
|
-
dragData:
|
76
|
-
isDragging: this.draggedItemId
|
79
|
+
dragData: { id: this.draggedItemId, initialGroup: container.id },
|
80
|
+
isDragging: this.draggedItemId,
|
77
81
|
});
|
78
82
|
|
79
|
-
|
83
|
+
this.draggedItem.classList.add(
|
84
|
+
"is_dragging",
|
85
|
+
`drop_zone_${this.dragZoneType}`,
|
86
|
+
`drop_zone_color_${this.dragZoneColor}`,
|
87
|
+
);
|
88
|
+
|
80
89
|
if (event.dataTransfer) {
|
81
|
-
event.dataTransfer.effectAllowed =
|
82
|
-
event.dataTransfer.setData(
|
90
|
+
event.dataTransfer.effectAllowed = "move";
|
91
|
+
event.dataTransfer.setData("text/plain", this.draggedItemId);
|
92
|
+
|
93
|
+
/* ---------- custom ghost clone (shadow + outline only) ---------- */
|
94
|
+
if (NEEDS_CLONE.includes(this.dragZoneType)) {
|
95
|
+
const ghost = this.draggedItem.cloneNode(true);
|
96
|
+
ghost.classList.remove(
|
97
|
+
"is_dragging",
|
98
|
+
`drop_zone_${this.dragZoneType}`,
|
99
|
+
`drop_zone_color_${this.dragZoneColor}`,
|
100
|
+
);
|
101
|
+
const { width, height } = this.draggedItem.getBoundingClientRect();
|
102
|
+
Object.assign(ghost.style, {
|
103
|
+
border: "none",
|
104
|
+
width: `${width}px`,
|
105
|
+
height: `${height}px`,
|
106
|
+
position: "absolute",
|
107
|
+
top: "-9999px",
|
108
|
+
left: "-9999px",
|
109
|
+
boxSizing: "border-box",
|
110
|
+
zIndex: "9999",
|
111
|
+
});
|
112
|
+
document.body.appendChild(ghost);
|
113
|
+
this.dragGhost = ghost;
|
114
|
+
event.dataTransfer.setDragImage(ghost, width / 2, height / 2);
|
115
|
+
}
|
116
|
+
/* ---------------------------------------------------------------- */
|
83
117
|
}
|
84
118
|
|
85
|
-
|
86
|
-
event.target.style.opacity = '0.5';
|
87
|
-
}, 0);
|
119
|
+
requestAnimationFrame(() => (event.target.style.opacity = "0.5"));
|
88
120
|
}
|
89
121
|
|
122
|
+
/* ---------------- DRAG ENTER ---------------- */
|
90
123
|
handleDragEnter(event) {
|
91
124
|
if (!this.draggedItem || event.target === this.draggedItem) return;
|
92
|
-
|
93
|
-
|
94
|
-
this.
|
95
|
-
} else {
|
96
|
-
this.handleSingleContainerDragEnter(event);
|
97
|
-
}
|
125
|
+
this.hasMultipleContainers
|
126
|
+
? this.handleMultiContainerDragEnter(event)
|
127
|
+
: this.handleSingleContainerDragEnter(event);
|
98
128
|
}
|
99
129
|
|
100
130
|
handleSingleContainerDragEnter(event) {
|
101
|
-
const targetItem = event.target.closest(
|
131
|
+
const targetItem = event.target.closest(".pb_draggable_item");
|
132
|
+
// If we're entering a container directly or there's no target item
|
102
133
|
if (!targetItem) return;
|
103
134
|
|
104
135
|
const container = targetItem.parentNode;
|
105
|
-
const items
|
136
|
+
const items = Array.from(container.children);
|
137
|
+
const fromIdx = items.indexOf(this.draggedItem);
|
138
|
+
const toIdx = items.indexOf(targetItem);
|
106
139
|
|
107
|
-
|
108
|
-
const targetIndex = items.indexOf(targetItem);
|
109
|
-
|
110
|
-
if (draggedIndex > targetIndex) {
|
140
|
+
if (fromIdx > toIdx) {
|
111
141
|
container.insertBefore(this.draggedItem, targetItem);
|
112
142
|
} else {
|
113
143
|
container.insertBefore(this.draggedItem, targetItem.nextSibling);
|
@@ -116,146 +146,113 @@ export default class PbDraggable extends PbEnhancedElement {
|
|
116
146
|
|
117
147
|
handleMultiContainerDragEnter(event) {
|
118
148
|
const targetContainer = event.target.closest(DRAGGABLE_CONTAINER);
|
119
|
-
const targetItem
|
120
|
-
|
149
|
+
const targetItem = event.target.closest(".pb_draggable_item");
|
121
150
|
if (!targetContainer) return;
|
122
151
|
|
123
|
-
// If we're entering a container directly or there's no target item
|
124
152
|
if (!targetItem) {
|
125
|
-
const
|
126
|
-
|
127
|
-
targetContainer.insertBefore(this.draggedItem,
|
128
|
-
|
129
|
-
targetContainer.appendChild(this.draggedItem);
|
130
|
-
}
|
153
|
+
const last = targetContainer.querySelector(".pb_draggable_item:last-child");
|
154
|
+
last
|
155
|
+
? targetContainer.insertBefore(this.draggedItem, last.nextSibling)
|
156
|
+
: targetContainer.appendChild(this.draggedItem);
|
131
157
|
return;
|
132
158
|
}
|
133
159
|
|
134
|
-
const
|
135
|
-
|
136
|
-
|
137
|
-
const newItems = [...items].map(item => ({
|
138
|
-
id: item.id,
|
139
|
-
container: container.id
|
140
|
-
}));
|
141
|
-
|
142
|
-
this.setState({ items: newItems });
|
160
|
+
const items = Array.from(targetContainer.children);
|
161
|
+
this.setState({ items: items.map(i => ({ id: i.id, container: targetContainer.id })) });
|
143
162
|
|
144
|
-
const
|
145
|
-
|
163
|
+
const midY = targetItem.getBoundingClientRect().top +
|
164
|
+
targetItem.getBoundingClientRect().height / 2;
|
146
165
|
|
147
|
-
if (event.clientY <
|
148
|
-
|
166
|
+
if (event.clientY < midY) {
|
167
|
+
targetContainer.insertBefore(this.draggedItem, targetItem);
|
149
168
|
} else {
|
150
|
-
|
169
|
+
targetContainer.insertBefore(this.draggedItem, targetItem.nextSibling);
|
151
170
|
}
|
152
171
|
}
|
153
172
|
|
173
|
+
/* ---------------- DRAG OVER ---------------- */
|
154
174
|
handleDragOver(event) {
|
155
175
|
event.preventDefault();
|
156
176
|
event.stopPropagation();
|
157
|
-
|
158
|
-
|
159
|
-
this.
|
160
|
-
} else {
|
161
|
-
this.handleSingleContainerDragOver(event);
|
162
|
-
}
|
177
|
+
this.hasMultipleContainers
|
178
|
+
? this.handleMultiContainerDragOver(event)
|
179
|
+
: this.handleSingleContainerDragOver(event);
|
163
180
|
}
|
164
181
|
|
165
182
|
handleSingleContainerDragOver(event) {
|
166
183
|
const container = event.target.closest(DRAGGABLE_CONTAINER);
|
167
|
-
if (container)
|
168
|
-
container.classList.add("active_container");
|
169
|
-
}
|
184
|
+
if (container) container.classList.add("active_container");
|
170
185
|
}
|
171
186
|
|
172
187
|
handleMultiContainerDragOver(event) {
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
}
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
const lastItem = container.querySelector('.pb_draggable_item:last-child');
|
186
|
-
if (!lastItem || (lastItem && event.clientY > lastItem.getBoundingClientRect().bottom)) {
|
187
|
-
if (this.draggedItem && this.draggedItem.parentNode !== container) {
|
188
|
-
container.appendChild(this.draggedItem);
|
189
|
-
}
|
188
|
+
const container = event.target.matches(DRAGGABLE_CONTAINER)
|
189
|
+
? event.target
|
190
|
+
: event.target.closest(DRAGGABLE_CONTAINER);
|
191
|
+
if (!container) return;
|
192
|
+
|
193
|
+
this.setState({ activeContainer: container.id });
|
194
|
+
container.classList.add("active_container");
|
195
|
+
|
196
|
+
const last = container.querySelector(".pb_draggable_item:last-child");
|
197
|
+
if (!last || event.clientY > last.getBoundingClientRect().bottom) {
|
198
|
+
if (this.draggedItem && this.draggedItem.parentNode !== container) {
|
199
|
+
container.appendChild(this.draggedItem);
|
190
200
|
}
|
191
201
|
}
|
192
202
|
}
|
193
203
|
|
204
|
+
/* ---------------- DROP ---------------- */
|
194
205
|
handleDrop(event) {
|
195
206
|
event.preventDefault();
|
196
207
|
event.stopPropagation();
|
197
208
|
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
} else {
|
202
|
-
container = event.target.closest(DRAGGABLE_CONTAINER);
|
203
|
-
}
|
204
|
-
|
209
|
+
const container = event.target.matches(DRAGGABLE_CONTAINER)
|
210
|
+
? event.target
|
211
|
+
: event.target.closest(DRAGGABLE_CONTAINER);
|
205
212
|
if (!container || !this.draggedItem) return;
|
206
213
|
|
207
214
|
container.classList.remove("active_container");
|
208
|
-
this.draggedItem.style.opacity =
|
215
|
+
this.draggedItem.style.opacity = "1";
|
209
216
|
|
210
217
|
// Handle empty containers
|
211
|
-
if (this.hasMultipleContainers && !container.querySelector(
|
218
|
+
if (this.hasMultipleContainers && !container.querySelector(".pb_draggable_item")) {
|
212
219
|
container.appendChild(this.draggedItem);
|
213
220
|
}
|
214
221
|
|
215
222
|
// Updated order of items as an array of item IDs
|
216
|
-
const reorderedItems = Array.from(
|
217
|
-
|
218
|
-
).map(item => ({
|
219
|
-
id: item.id,
|
220
|
-
container: item.closest(DRAGGABLE_CONTAINER).id
|
221
|
-
}));
|
222
|
-
|
223
|
-
// Store reordered items in a data attribute on the container
|
224
|
-
container.setAttribute("data-reordered-items", JSON.stringify(reorderedItems));
|
225
|
-
|
226
|
-
const customEvent = new CustomEvent('pb-draggable-reorder', {
|
227
|
-
detail: {
|
228
|
-
reorderedItems,
|
229
|
-
containerId: container.id,
|
230
|
-
}
|
231
|
-
});
|
232
|
-
|
233
|
-
this.element.dispatchEvent(customEvent);
|
223
|
+
const reorderedItems = Array.from(this.element.querySelectorAll(".pb_draggable_item"))
|
224
|
+
.map(i => ({ id: i.id, container: i.closest(DRAGGABLE_CONTAINER).id }));
|
234
225
|
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
});
|
226
|
+
container.dataset.reorderedItems = JSON.stringify(reorderedItems);
|
227
|
+
this.element.dispatchEvent(new CustomEvent("pb-draggable-reorder", {
|
228
|
+
detail: { reorderedItems, containerId: container.id },
|
229
|
+
}));
|
240
230
|
|
241
|
-
this.
|
231
|
+
this.setState({ items: reorderedItems, isDragging: "", activeContainer: "" });
|
232
|
+
this.draggedItem = null;
|
242
233
|
this.draggedItemId = null;
|
243
234
|
}
|
244
235
|
|
236
|
+
/* ---------------- DRAG END ---------------- */
|
245
237
|
handleDragEnd(event) {
|
246
|
-
event.target.classList.remove(
|
247
|
-
|
238
|
+
event.target.classList.remove(
|
239
|
+
"is_dragging",
|
240
|
+
`drop_zone_${this.dragZoneType}`,
|
241
|
+
`drop_zone_color_${this.dragZoneColor}`,
|
242
|
+
);
|
243
|
+
event.target.style.opacity = "1";
|
244
|
+
|
245
|
+
if (this.dragGhost) {
|
246
|
+
document.body.removeChild(this.dragGhost);
|
247
|
+
this.dragGhost = null;
|
248
|
+
}
|
248
249
|
|
249
|
-
this.setState({
|
250
|
-
isDragging: "",
|
251
|
-
activeContainer: ""
|
252
|
-
});
|
250
|
+
this.setState({ isDragging: "", activeContainer: "" });
|
253
251
|
|
254
|
-
this.
|
255
|
-
|
252
|
+
this.element.querySelectorAll(DRAGGABLE_CONTAINER)
|
253
|
+
.forEach(c => c.classList.remove("active_container"));
|
256
254
|
|
257
|
-
this.
|
258
|
-
|
259
|
-
});
|
255
|
+
this.draggedItem = null;
|
256
|
+
this.draggedItemId = null;
|
260
257
|
}
|
261
258
|
}
|
@@ -41,6 +41,11 @@
|
|
41
41
|
outline: unset;
|
42
42
|
transition: box-shadow 0.15s ease-in-out;
|
43
43
|
}
|
44
|
+
&:focus-within {
|
45
|
+
box-shadow: 0px 0px 0 1px $primary !important;
|
46
|
+
outline: unset;
|
47
|
+
transition: box-shadow 0.15s ease-in-out;
|
48
|
+
}
|
44
49
|
|
45
50
|
&[class*="_select_only"] {
|
46
51
|
box-shadow: inset 0 -11px 20px rgba($primary, 0.05);
|
@@ -36,7 +36,6 @@ type DropdownProps = {
|
|
36
36
|
onSelect?: (arg: GenericObject) => null;
|
37
37
|
options: GenericObject;
|
38
38
|
separators?: boolean;
|
39
|
-
triggerRef?: any;
|
40
39
|
variant?: "default" | "subtle";
|
41
40
|
};
|
42
41
|
|
@@ -65,7 +64,6 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
65
64
|
onSelect,
|
66
65
|
options,
|
67
66
|
separators = true,
|
68
|
-
triggerRef,
|
69
67
|
variant = "default",
|
70
68
|
} = props;
|
71
69
|
|
@@ -91,7 +89,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
91
89
|
const [focusedOptionIndex, setFocusedOptionIndex] = useState(-1);
|
92
90
|
|
93
91
|
const dropdownRef = useRef(null);
|
94
|
-
const inputRef = useRef(null);
|
92
|
+
const inputRef = useRef<HTMLInputElement>(null);
|
95
93
|
const inputWrapperRef = useRef(null);
|
96
94
|
const dropdownContainerRef = useRef(null);
|
97
95
|
|
@@ -99,15 +97,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
99
97
|
separateChildComponents(children);
|
100
98
|
|
101
99
|
useEffect(() => {
|
102
|
-
|
103
|
-
//Only needed for when useDropdown hook used with external trigger
|
104
|
-
if (triggerRef?.current) {
|
105
|
-
const parentElement = triggerRef.current.parentNode;
|
106
|
-
if (parentElement) {
|
107
|
-
parentElement.style.position = 'relative';
|
108
|
-
}
|
109
|
-
}
|
110
|
-
// Handle clicks outside the dropdown
|
100
|
+
// Handle clicks outside the dropdown
|
111
101
|
const handleClick = handleClickOutside({
|
112
102
|
inputWrapperRef,
|
113
103
|
dropdownContainerRef,
|
@@ -167,7 +157,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
167
157
|
};
|
168
158
|
|
169
159
|
const handleWrapperClick = () => {
|
170
|
-
autocomplete && inputRef
|
160
|
+
autocomplete && inputRef?.current?.focus();
|
171
161
|
toggleDropdown();
|
172
162
|
};
|
173
163
|
|
@@ -202,7 +192,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
202
192
|
{...htmlProps}
|
203
193
|
className={classes}
|
204
194
|
id={id}
|
205
|
-
style={
|
195
|
+
style={{position: "relative"}}
|
206
196
|
>
|
207
197
|
<DropdownContext.Provider
|
208
198
|
value={{
|
@@ -225,8 +215,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
225
215
|
setIsDropDownClosed,
|
226
216
|
setIsInputFocused,
|
227
217
|
setSelected,
|
228
|
-
toggleDropdown
|
229
|
-
triggerRef
|
218
|
+
toggleDropdown
|
230
219
|
}}
|
231
220
|
>
|
232
221
|
{label &&
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<%
|
1
|
+
<%
|
2
2
|
options = [
|
3
3
|
{ label: 'United States', value: 'United States', id: 'us' },
|
4
4
|
{ label: 'Canada', value: 'Canada', id: 'ca' },
|
@@ -6,4 +6,7 @@
|
|
6
6
|
]
|
7
7
|
%>
|
8
8
|
|
9
|
-
<%= pb_rails("dropdown", props: {
|
9
|
+
<%= pb_rails("dropdown", props: {
|
10
|
+
error: raw(pb_rails("icon", props: { icon: "warning" }) + " Please make a valid selection"),
|
11
|
+
options: options
|
12
|
+
}) %>
|
@@ -1,9 +1,12 @@
|
|
1
1
|
import React, { useState } from 'react'
|
2
2
|
import Dropdown from '../../pb_dropdown/_dropdown'
|
3
|
+
import Icon from '../../pb_icon/_icon'
|
3
4
|
|
4
5
|
const DropdownError = (props) => {
|
5
6
|
const [selectedOption, setSelectedOption] = useState()
|
6
|
-
const error = selectedOption?.value ? null :
|
7
|
+
const error = selectedOption?.value ? null : (<>
|
8
|
+
<Icon icon="warning" /> Please make a valid selection
|
9
|
+
</>)
|
7
10
|
const options = [
|
8
11
|
{
|
9
12
|
label: "United States",
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<%
|
2
|
+
options = [
|
3
|
+
{
|
4
|
+
label: "United States",
|
5
|
+
value: "United States",
|
6
|
+
areaCode: "+1",
|
7
|
+
icon: "🇺🇸",
|
8
|
+
id: "us"
|
9
|
+
},
|
10
|
+
{
|
11
|
+
label: "United Kingdom",
|
12
|
+
value: "United Kingdom",
|
13
|
+
areaCode: "+44",
|
14
|
+
icon: "🇬🇧",
|
15
|
+
id: "gb"
|
16
|
+
},
|
17
|
+
{
|
18
|
+
label: "Pakistan",
|
19
|
+
value: "Pakistan",
|
20
|
+
areaCode: "+92",
|
21
|
+
icon: "🇵🇰",
|
22
|
+
id: "pk"
|
23
|
+
}
|
24
|
+
]
|
25
|
+
|
26
|
+
%>
|
27
|
+
|
28
|
+
<%= pb_rails("dropdown", props: {options: options, autocomplete: true}) %>
|
@@ -1,86 +1,39 @@
|
|
1
1
|
import React from 'react'
|
2
2
|
|
3
3
|
import Dropdown from '../../pb_dropdown/_dropdown'
|
4
|
-
import Badge from '../../pb_badge/_badge'
|
5
|
-
import FlexItem from '../../pb_flex/_flex_item'
|
6
|
-
import User from '../../pb_user/_user'
|
7
4
|
|
8
5
|
const DropdownWithAutocomplete = (props) => {
|
9
6
|
|
10
7
|
const options = [
|
11
8
|
{
|
12
|
-
label: "
|
13
|
-
value: "
|
14
|
-
|
15
|
-
|
16
|
-
id: "
|
17
|
-
status: "Offline"
|
9
|
+
label: "United States",
|
10
|
+
value: "United States",
|
11
|
+
areaCode: "+1",
|
12
|
+
icon: "🇺🇸",
|
13
|
+
id: "us"
|
18
14
|
},
|
19
15
|
{
|
20
|
-
label: "
|
21
|
-
value: "
|
22
|
-
|
23
|
-
|
24
|
-
id: "
|
25
|
-
status: "Away"
|
16
|
+
label: "United Kingdom",
|
17
|
+
value: "United Kingdom",
|
18
|
+
areaCode: "+44",
|
19
|
+
icon: "🇬🇧",
|
20
|
+
id: "gb"
|
26
21
|
},
|
27
22
|
{
|
28
|
-
label: "
|
29
|
-
value: "
|
30
|
-
|
31
|
-
|
32
|
-
id: "
|
33
|
-
status: "Online"
|
34
|
-
},
|
35
|
-
{
|
36
|
-
label: "Courtney Long",
|
37
|
-
value: "Courtney Long",
|
38
|
-
territory: "PHL",
|
39
|
-
title: "Lead UX Designer",
|
40
|
-
id: "courtney-long",
|
41
|
-
status: "Online"
|
23
|
+
label: "Pakistan",
|
24
|
+
value: "Pakistan",
|
25
|
+
areaCode: "+92",
|
26
|
+
icon: "🇵🇰",
|
27
|
+
id: "pk"
|
42
28
|
}
|
43
|
-
]
|
44
|
-
|
29
|
+
]
|
45
30
|
|
46
31
|
return (
|
47
32
|
<div>
|
48
33
|
<Dropdown autocomplete
|
49
34
|
options={options}
|
50
35
|
{...props}
|
51
|
-
|
52
|
-
{options.map((option) => (
|
53
|
-
<Dropdown.Option key={option.id}
|
54
|
-
option={option}
|
55
|
-
>
|
56
|
-
<>
|
57
|
-
<FlexItem>
|
58
|
-
<User
|
59
|
-
align="left"
|
60
|
-
avatar
|
61
|
-
name={option.label}
|
62
|
-
orientation="horizontal"
|
63
|
-
territory={option.territory}
|
64
|
-
title={option.title}
|
65
|
-
/>
|
66
|
-
</FlexItem>
|
67
|
-
<FlexItem>
|
68
|
-
<Badge
|
69
|
-
rounded
|
70
|
-
text={option.status}
|
71
|
-
variant={`${
|
72
|
-
option.status === "Offline"
|
73
|
-
? "neutral"
|
74
|
-
: option.status === "Online"
|
75
|
-
? "success"
|
76
|
-
: "warning"
|
77
|
-
}`}
|
78
|
-
/>
|
79
|
-
</FlexItem>
|
80
|
-
</>
|
81
|
-
</Dropdown.Option>
|
82
|
-
))}
|
83
|
-
</Dropdown>
|
36
|
+
/>
|
84
37
|
</div>
|
85
38
|
)
|
86
39
|
}
|