playbook_ui 15.7.0.pre.rc.2 → 15.7.0.pre.rc.3

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.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +16 -4
  3. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range_pattern_rails.html.erb +23 -14
  4. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range_pattern_rails.md +1 -1
  5. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_overflow_visible.html.erb +71 -0
  6. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_overflow_visible.jsx +57 -0
  7. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_overflow_visible_rails.md +1 -0
  8. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_overflow_visible_react.md +1 -0
  9. data/app/pb_kits/playbook/pb_dialog/docs/example.yml +2 -0
  10. data/app/pb_kits/playbook/pb_dialog/docs/index.js +2 -1
  11. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.html.erb +7 -5
  12. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_default_dates.html.erb +19 -0
  13. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_rails.html.erb +12 -0
  14. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_rails.md +26 -0
  15. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_range_end_rails.html.erb +19 -0
  16. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_range_end_rails.md +1 -0
  17. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers_default_rails.html.erb +30 -0
  18. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers_default_rails.md +3 -0
  19. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers_rails.html.erb +29 -0
  20. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers_rails.md +13 -0
  21. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.html.erb +3 -1
  22. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +5 -0
  23. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +4 -0
  24. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +39 -5
  25. data/app/pb_kits/playbook/pb_dropdown/index.js +171 -3
  26. data/app/pb_kits/playbook/pb_dropdown/quickpick_helper.rb +75 -0
  27. data/dist/chunks/{_typeahead-CHwm9MTE.js → _typeahead-CbjBmIDu.js} +1 -1
  28. data/dist/chunks/{lib-Cugvy62C.js → lib-DxDBrGZX.js} +1 -1
  29. data/dist/chunks/vendor.js +1 -1
  30. data/dist/playbook-rails-react-bindings.js +1 -1
  31. data/dist/playbook-rails.js +1 -1
  32. data/lib/playbook/version.rb +1 -1
  33. metadata +18 -4
@@ -28,6 +28,9 @@ export default class PbDropdown extends PbEnhancedElement {
28
28
  clearBtn = null;
29
29
 
30
30
  connect() {
31
+ // Store instance on element for DatePicker sync
32
+ this.element._pbDropdownInstance = this;
33
+
31
34
  this.keyboardHandler = new PbDropdownKeyboard(this);
32
35
  this.isMultiSelect = this.element.dataset.pbDropdownMultiSelect === "true";
33
36
  this.formPillProps = this.element.dataset.formPillProps
@@ -252,6 +255,67 @@ export default class PbDropdown extends PbEnhancedElement {
252
255
  const selectedLabel = JSON.parse(value).label;
253
256
  triggerElement.textContent = selectedLabel;
254
257
  this.emitSelectionChange();
258
+
259
+ // Handle quickpick variant: populate start/end date hidden inputs
260
+ const optionData = JSON.parse(value);
261
+ const startDateId = this.element.dataset.startDateId;
262
+ const endDateId = this.element.dataset.endDateId;
263
+ const controlsStartId = this.element.dataset.controlsStartId;
264
+ const controlsEndId = this.element.dataset.controlsEndId;
265
+
266
+ if (optionData.formatted_start_date && optionData.formatted_end_date) {
267
+ // Populate date inputs when option has date fields
268
+ if (startDateId) {
269
+ const startDateInput = document.getElementById(startDateId);
270
+ if (startDateInput) startDateInput.value = optionData.formatted_start_date;
271
+ }
272
+
273
+ if (endDateId) {
274
+ const endDateInput = document.getElementById(endDateId);
275
+ if (endDateInput) endDateInput.value = optionData.formatted_end_date;
276
+ }
277
+
278
+ // Sync with DatePickers if controlsStartId/controlsEndId are present
279
+ if (controlsStartId) {
280
+ const startPicker = document.querySelector(`#${controlsStartId}`)?._flatpickr;
281
+ if (startPicker) {
282
+ startPicker.setDate(optionData.formatted_start_date, true, "m/d/Y");
283
+ }
284
+ }
285
+
286
+ if (controlsEndId) {
287
+ const endPicker = document.querySelector(`#${controlsEndId}`)?._flatpickr;
288
+ if (endPicker) {
289
+ endPicker.setDate(optionData.formatted_end_date, true, "m/d/Y");
290
+ }
291
+ }
292
+ } else if (startDateId || endDateId) {
293
+ // Clear date inputs when option doesn't have date fields (e.g., blank selection)
294
+ if (startDateId) {
295
+ const startDateInput = document.getElementById(startDateId);
296
+ if (startDateInput) startDateInput.value = "";
297
+ }
298
+
299
+ if (endDateId) {
300
+ const endDateInput = document.getElementById(endDateId);
301
+ if (endDateInput) endDateInput.value = "";
302
+ }
303
+
304
+ // Clear DatePickers as well
305
+ if (controlsStartId) {
306
+ const startPicker = document.querySelector(`#${controlsStartId}`)?._flatpickr;
307
+ if (startPicker) {
308
+ startPicker.clear();
309
+ }
310
+ }
311
+
312
+ if (controlsEndId) {
313
+ const endPicker = document.querySelector(`#${controlsEndId}`)?._flatpickr;
314
+ if (endPicker) {
315
+ endPicker.clear();
316
+ }
317
+ }
318
+ }
255
319
  }
256
320
  if (customDisplayElement) {
257
321
  triggerElement.textContent = "";
@@ -432,9 +496,50 @@ export default class PbDropdown extends PbEnhancedElement {
432
496
  if (!selectedOption) return;
433
497
 
434
498
  selectedOption.classList.add("pb_dropdown_option_selected");
435
- this.setTriggerElementText(
436
- JSON.parse(selectedOption.dataset.dropdownOptionLabel).label
437
- );
499
+ const optionData = JSON.parse(selectedOption.dataset.dropdownOptionLabel);
500
+ this.setTriggerElementText(optionData.label);
501
+
502
+ // Handle quickpick variant: populate start/end date hidden inputs and sync DatePickers
503
+ if (optionData.formatted_start_date && optionData.formatted_end_date) {
504
+ const startDateId = this.element.dataset.startDateId;
505
+ const endDateId = this.element.dataset.endDateId;
506
+ const controlsStartId = this.element.dataset.controlsStartId;
507
+ const controlsEndId = this.element.dataset.controlsEndId;
508
+
509
+ if (startDateId) {
510
+ const startDateInput = document.getElementById(startDateId);
511
+ if (startDateInput) startDateInput.value = optionData.formatted_start_date;
512
+ }
513
+
514
+ if (endDateId) {
515
+ const endDateInput = document.getElementById(endDateId);
516
+ if (endDateInput) endDateInput.value = optionData.formatted_end_date;
517
+ }
518
+
519
+ // Sync with DatePickers - retry with delays to ensure DatePickers are initialized
520
+ const syncDatePickers = () => {
521
+ if (controlsStartId) {
522
+ const startPicker = document.querySelector(`#${controlsStartId}`)?._flatpickr;
523
+ if (startPicker) {
524
+ startPicker.setDate(optionData.formatted_start_date, true, "m/d/Y");
525
+ }
526
+ }
527
+
528
+ if (controlsEndId) {
529
+ const endPicker = document.querySelector(`#${controlsEndId}`)?._flatpickr;
530
+ if (endPicker) {
531
+ endPicker.setDate(optionData.formatted_end_date, true, "m/d/Y");
532
+ }
533
+ }
534
+ };
535
+
536
+ // Try immediately
537
+ syncDatePickers();
538
+
539
+ // Retry after short delay in case DatePickers aren't ready yet
540
+ setTimeout(syncDatePickers, 100);
541
+ setTimeout(syncDatePickers, 300);
542
+ }
438
543
  }
439
544
  }
440
545
 
@@ -571,6 +676,37 @@ export default class PbDropdown extends PbEnhancedElement {
571
676
  if (customDisplay) {
572
677
  customDisplay.style.display = "none";
573
678
  }
679
+
680
+ // Clear quickpick hidden inputs
681
+ const startDateId = this.element.dataset.startDateId;
682
+ const endDateId = this.element.dataset.endDateId;
683
+ const controlsStartId = this.element.dataset.controlsStartId;
684
+ const controlsEndId = this.element.dataset.controlsEndId;
685
+
686
+ if (startDateId) {
687
+ const startDateInput = document.getElementById(startDateId);
688
+ if (startDateInput) startDateInput.value = "";
689
+ }
690
+ if (endDateId) {
691
+ const endDateInput = document.getElementById(endDateId);
692
+ if (endDateInput) endDateInput.value = "";
693
+ }
694
+
695
+ // Clear linked DatePickers if controlsStartId/controlsEndId are present
696
+ if (controlsStartId) {
697
+ const startPicker = document.querySelector(`#${controlsStartId}`)?._flatpickr;
698
+ if (startPicker) {
699
+ startPicker.clear();
700
+ }
701
+ }
702
+
703
+ if (controlsEndId) {
704
+ const endPicker = document.querySelector(`#${controlsEndId}`)?._flatpickr;
705
+ if (endPicker) {
706
+ endPicker.clear();
707
+ }
708
+ }
709
+
574
710
  this.resetDropdownValue();
575
711
  this.updatePills();
576
712
  this.updateClearButton();
@@ -578,6 +714,38 @@ export default class PbDropdown extends PbEnhancedElement {
578
714
  this.emitSelectionChange();
579
715
  }
580
716
 
717
+ // Method for DatePicker sync - only clears the dropdown, not the DatePickers
718
+ clearSelected() {
719
+ // Only clear if this is a single-select quickpick variant
720
+ if (this.element.dataset.pbDropdownVariant !== "quickpick" || this.isMultiSelect) {
721
+ return;
722
+ }
723
+
724
+ const customDisplay = this.element.querySelector(
725
+ "#dropdown_trigger_custom_display"
726
+ );
727
+ if (customDisplay) {
728
+ customDisplay.style.display = "none";
729
+ }
730
+
731
+ // Clear quickpick hidden inputs only (not the DatePickers)
732
+ const startDateId = this.element.dataset.startDateId;
733
+ const endDateId = this.element.dataset.endDateId;
734
+
735
+ if (startDateId) {
736
+ const startDateInput = document.getElementById(startDateId);
737
+ if (startDateInput) startDateInput.value = "";
738
+ }
739
+ if (endDateId) {
740
+ const endDateInput = document.getElementById(endDateId);
741
+ if (endDateInput) endDateInput.value = "";
742
+ }
743
+
744
+ this.resetDropdownValue();
745
+ this.updateClearButton();
746
+ this.emitSelectionChange();
747
+ }
748
+
581
749
  syncHiddenInputs() {
582
750
  if (!this.isMultiSelect) return;
583
751
  this.element
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbDropdown
5
+ module QuickpickHelper
6
+ class << self
7
+ def get_quickpick_options(range_ends_today: false)
8
+ today = Date.today
9
+ yesterday = today - 1.day
10
+
11
+ this_week_start_date = first_day_of_week(today)
12
+ this_week_end_date = range_ends_today ? today : last_day_of_week(today)
13
+ last_week_start_date = previous_week_start_date(today)
14
+ last_week_end_date = previous_week_end_date(today)
15
+
16
+ this_month_start_date = today.beginning_of_month
17
+ this_month_end_date = range_ends_today ? today : today.end_of_month
18
+ last_month_start_date = (today - 1.month).beginning_of_month
19
+ last_month_end_date = (today - 1.month).end_of_month
20
+
21
+ this_quarter_start_date = today.beginning_of_quarter
22
+ this_quarter_end_date = range_ends_today ? today : today.end_of_quarter
23
+ last_quarter_start_date = (today - 3.months).beginning_of_quarter
24
+ last_quarter_end_date = (today - 3.months).end_of_quarter
25
+
26
+ this_year_start_date = today.beginning_of_year
27
+ this_year_end_date = range_ends_today ? today : today.end_of_year
28
+ last_year_start_date = (today - 1.year).beginning_of_year
29
+ last_year_end_date = (today - 1.year).end_of_year
30
+
31
+ [
32
+ { id: "quickpick-today", label: "Today", value: [today.to_s, today.to_s], formatted_start_date: format_date(today), formatted_end_date: format_date(today) },
33
+ { id: "quickpick-yesterday", label: "Yesterday", value: [yesterday.to_s, yesterday.to_s], formatted_start_date: format_date(yesterday), formatted_end_date: format_date(yesterday) },
34
+ { id: "quickpick-this-week", label: "This Week", value: [this_week_start_date.to_s, this_week_end_date.to_s], formatted_start_date: format_date(this_week_start_date), formatted_end_date: format_date(this_week_end_date) },
35
+ { id: "quickpick-this-month", label: "This Month", value: [this_month_start_date.to_s, this_month_end_date.to_s], formatted_start_date: format_date(this_month_start_date), formatted_end_date: format_date(this_month_end_date) },
36
+ { id: "quickpick-this-quarter", label: "This Quarter", value: [this_quarter_start_date.to_s, this_quarter_end_date.to_s], formatted_start_date: format_date(this_quarter_start_date), formatted_end_date: format_date(this_quarter_end_date) },
37
+ { id: "quickpick-this-year", label: "This Year", value: [this_year_start_date.to_s, this_year_end_date.to_s], formatted_start_date: format_date(this_year_start_date), formatted_end_date: format_date(this_year_end_date) },
38
+ { id: "quickpick-last-week", label: "Last Week", value: [last_week_start_date.to_s, last_week_end_date.to_s], formatted_start_date: format_date(last_week_start_date), formatted_end_date: format_date(last_week_end_date) },
39
+ { id: "quickpick-last-month", label: "Last Month", value: [last_month_start_date.to_s, last_month_end_date.to_s], formatted_start_date: format_date(last_month_start_date), formatted_end_date: format_date(last_month_end_date) },
40
+ { id: "quickpick-last-quarter", label: "Last Quarter", value: [last_quarter_start_date.to_s, last_quarter_end_date.to_s], formatted_start_date: format_date(last_quarter_start_date), formatted_end_date: format_date(last_quarter_end_date) },
41
+ { id: "quickpick-last-year", label: "Last Year", value: [last_year_start_date.to_s, last_year_end_date.to_s], formatted_start_date: format_date(last_year_start_date), formatted_end_date: format_date(last_year_end_date) },
42
+ ]
43
+ end
44
+
45
+ private
46
+
47
+ def format_date(date)
48
+ date.strftime("%m/%d/%Y")
49
+ end
50
+
51
+ def format_date_range(start_date, end_date)
52
+ "#{format_date(start_date)} - #{format_date(end_date)}"
53
+ end
54
+
55
+ def first_day_of_week(date)
56
+ # Monday as first day of week
57
+ date.beginning_of_week(:monday)
58
+ end
59
+
60
+ def last_day_of_week(date)
61
+ # Sunday as last day of week
62
+ date.end_of_week(:monday)
63
+ end
64
+
65
+ def previous_week_start_date(date)
66
+ first_day_of_week(date) - 1.week
67
+ end
68
+
69
+ def previous_week_end_date(date)
70
+ last_day_of_week(date) - 1.week
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -1,4 +1,4 @@
1
- import{jsx as jsx$1,Fragment,jsxs}from"react/jsx-runtime";import*as React from"react";import React__default,{createContext,useReducer,useRef,useEffect,useMemo,useContext,createElement,useState,forwardRef,useLayoutEffect,useCallback,useImperativeHandle,Component,Fragment as Fragment$1}from"react";import{c as getDefaultExportFromCjs,S as filter,T as omit,n as noop$2,u as useCollapsible,U as get,g as getAllIcons,V as createPopper,W as uniqueId,X as flip$2,Y as offset$2,Z as shift$2,$ as arrow$3,a0 as computePosition$1,a1 as createCoords$1,a2 as round$1,a3 as max$1,a4 as min$1,a5 as rectToClientRect$1,h as colors$1,k as highchartsTheme,a6 as merge,l as highchartsDarkTheme,N as typography,a7 as cloneDeep,i as isEmpty$1,a8 as isString}from"./lib-Cugvy62C.js";import{TrixEditor}from"react-trix";import Trix from"trix";import*as ReactDOM from"react-dom";import ReactDOM__default,{createPortal}from"react-dom";import require$$0 from"react-is";const initialState={items:[],dragData:{id:"",initialGroup:"",originId:""},isDragging:"",activeContainer:""};const reducer=(state,action)=>{switch(action.type){case"SET_ITEMS":return{...state,items:action.payload};case"SET_DRAG_DATA":return{...state,dragData:action.payload};case"SET_IS_DRAGGING":return{...state,isDragging:action.payload};case"SET_ACTIVE_CONTAINER":return{...state,activeContainer:action.payload};case"CHANGE_CATEGORY":return{...state,items:state.items.map((item=>item.id===action.payload.itemId?{...item,container:action.payload.container}:item))};case"REORDER_ITEMS":{const{dragId:dragId,targetId:targetId}=action.payload;const newItems=[...state.items];const draggedItem=newItems.find((item=>item.id===dragId));const draggedIndex=newItems.indexOf(draggedItem);const targetIndex=newItems.findIndex((item=>item.id===targetId));newItems.splice(draggedIndex,1);newItems.splice(targetIndex,0,draggedItem);return{...state,items:newItems}}case"REORDER_ITEMS_CROSS_CONTAINER":{const{dragId:dragId,targetId:targetId,newContainer:newContainer}=action.payload;const newItems=[...state.items];const draggedItem=newItems.find((item=>item&&item.id===dragId));if(!draggedItem)return state;const draggedIndex=newItems.indexOf(draggedItem);const targetIndex=newItems.findIndex((item=>item&&item.id===targetId));if(draggedIndex===-1||targetIndex===-1)return state;const updatedItem={...draggedItem,container:newContainer};newItems.splice(draggedIndex,1);newItems.splice(targetIndex,0,updatedItem);return{...state,items:newItems}}case"MOVE_TO_CONTAINER_END":{const{dragId:dragId,newContainer:newContainer}=action.payload;const newItems=[...state.items];const draggedItem=newItems.find((item=>item&&item.id===dragId));if(!draggedItem)return state;const draggedIndex=newItems.indexOf(draggedItem);if(draggedIndex===-1)return state;const updatedItem={...draggedItem,container:newContainer};newItems.splice(draggedIndex,1);const lastIndexInContainer=newItems.map((item=>item&&item.container)).lastIndexOf(newContainer);if(lastIndexInContainer===-1){newItems.push(updatedItem)}else{newItems.splice(lastIndexInContainer+1,0,updatedItem)}return{...state,items:newItems}}case"RESET_DRAG_CONTAINER":{const{itemId:itemId,originalContainer:originalContainer,originalIndex:originalIndex}=action.payload;const newItems=[...state.items];const draggedItem=newItems.find((item=>item&&item.id===itemId));if(!draggedItem)return state;const currentIndex=newItems.indexOf(draggedItem);newItems.splice(currentIndex,1);const restoredItem={...draggedItem,container:originalContainer};if(originalIndex!==void 0&&originalIndex>=0){newItems.splice(originalIndex,0,restoredItem)}else{newItems.push(restoredItem)}return{...state,items:newItems}}default:return state}};const DragContext=createContext({});const DraggableContext=()=>useContext(DragContext);const DraggableProvider=({children:children,initialItems:initialItems,onReorder:onReorder,onDragStart:onDragStart,onDragEnter:onDragEnter,onDragEnd:onDragEnd,onDrop:onDrop,onDragOver:onDragOver,dropZone:dropZone={type:"ghost",color:"neutral",direction:"vertical"},providerId:providerId="default",enableCrossContainerPreview:enableCrossContainerPreview=false})=>{const[state,dispatch]=useReducer(reducer,initialState);const dragStateRef=useRef({isDragging:false,draggedItemId:"",originalContainer:"",originalIndex:-1,currentContainer:"",dropOccurred:false});const stateRef=useRef(state);useEffect((()=>{stateRef.current=state}),[state]);let dropZoneType="ghost";let dropZoneColor="neutral";let dropZoneDirection="vertical";if(typeof dropZone==="string"){dropZoneType=dropZone}else{dropZoneType=dropZone.type||"ghost";dropZoneColor=dropZone.type==="line"?dropZone.color||"primary":dropZone.color||"neutral";if(dropZoneType==="line"){dropZoneDirection=dropZone.direction||"vertical"}}useEffect((()=>{dispatch({type:"SET_ITEMS",payload:initialItems})}),[initialItems]);useEffect((()=>{onReorder(state.items)}),[state.items]);useEffect((()=>{if(!enableCrossContainerPreview)return;const handleGlobalDragOver=e=>{if(dragStateRef.current.isDragging){e.preventDefault()}};const handleGlobalDrop=e=>{if(!dragStateRef.current.isDragging)return;if(dragStateRef.current.dropOccurred)return;e.preventDefault();const originalContainer=dragStateRef.current.originalContainer;dispatch({type:"RESET_DRAG_CONTAINER",payload:{itemId:dragStateRef.current.draggedItemId,originalContainer:originalContainer,originalIndex:dragStateRef.current.originalIndex}});dispatch({type:"SET_IS_DRAGGING",payload:""});dispatch({type:"SET_ACTIVE_CONTAINER",payload:""});dispatch({type:"SET_DRAG_DATA",payload:{id:"",initialGroup:"",originId:""}});dragStateRef.current={isDragging:false,draggedItemId:"",originalContainer:"",originalIndex:-1,currentContainer:"",dropOccurred:false}};const handleGlobalMouseUp=()=>{if(dragStateRef.current.isDragging){setTimeout((()=>{const currentContainer=dragStateRef.current.currentContainer;if(dragStateRef.current.isDragging&&!dragStateRef.current.dropOccurred){if(currentContainer&&currentContainer!==dragStateRef.current.originalContainer){if(onDrop){const draggedItem=stateRef.current.items.find((item=>item&&item.id===dragStateRef.current.draggedItemId));const updatedItem=draggedItem?{...draggedItem,container:currentContainer}:null;const itemsInContainer=stateRef.current.items.filter((item=>item&&item.container===currentContainer));const indexInContainer=itemsInContainer.findIndex((item=>item&&item.id===dragStateRef.current.draggedItemId));const itemAbove=indexInContainer>0?itemsInContainer[indexInContainer-1]:null;const itemBelow=indexInContainer<itemsInContainer.length-1?itemsInContainer[indexInContainer+1]:null;onDrop(dragStateRef.current.draggedItemId,currentContainer,dragStateRef.current.originalContainer,updatedItem,itemAbove,itemBelow)}}else{dispatch({type:"RESET_DRAG_CONTAINER",payload:{itemId:dragStateRef.current.draggedItemId,originalContainer:dragStateRef.current.originalContainer,originalIndex:dragStateRef.current.originalIndex}})}dispatch({type:"SET_IS_DRAGGING",payload:""});dispatch({type:"SET_ACTIVE_CONTAINER",payload:""});dispatch({type:"SET_DRAG_DATA",payload:{id:"",initialGroup:"",originId:""}});dragStateRef.current={isDragging:false,draggedItemId:"",originalContainer:"",originalIndex:-1,currentContainer:"",dropOccurred:false}}}),50)}};const handleDragLeave=e=>{if(!e.relatedTarget&&dragStateRef.current.isDragging&&!dragStateRef.current.dropOccurred){dispatch({type:"RESET_DRAG_CONTAINER",payload:{itemId:dragStateRef.current.draggedItemId,originalContainer:dragStateRef.current.originalContainer,originalIndex:dragStateRef.current.originalIndex}});dispatch({type:"SET_IS_DRAGGING",payload:""});dispatch({type:"SET_ACTIVE_CONTAINER",payload:""});dispatch({type:"SET_DRAG_DATA",payload:{id:"",initialGroup:"",originId:""}});dragStateRef.current={isDragging:false,draggedItemId:"",originalContainer:"",originalIndex:-1,currentContainer:"",dropOccurred:false}}};document.addEventListener("dragover",handleGlobalDragOver);document.addEventListener("drop",handleGlobalDrop);document.addEventListener("dragleave",handleDragLeave);document.addEventListener("mouseup",handleGlobalMouseUp);document.addEventListener("pointerup",handleGlobalMouseUp);return()=>{document.removeEventListener("dragover",handleGlobalDragOver);document.removeEventListener("drop",handleGlobalDrop);document.removeEventListener("dragleave",handleDragLeave);document.removeEventListener("mouseup",handleGlobalMouseUp);document.removeEventListener("pointerup",handleGlobalMouseUp)}}),[enableCrossContainerPreview]);const prevIsDraggingRef=useRef(state.isDragging);useEffect((()=>{if(!enableCrossContainerPreview)return;const wasDragging=prevIsDraggingRef.current;const isNowDragging=state.isDragging;if(wasDragging&&!isNowDragging){if(!dragStateRef.current.dropOccurred&&dragStateRef.current.draggedItemId){dispatch({type:"RESET_DRAG_CONTAINER",payload:{itemId:dragStateRef.current.draggedItemId,originalContainer:dragStateRef.current.originalContainer,originalIndex:dragStateRef.current.originalIndex}})}dragStateRef.current={isDragging:false,draggedItemId:"",originalContainer:"",originalIndex:-1,currentContainer:"",dropOccurred:false}}prevIsDraggingRef.current=isNowDragging}),[state.isDragging,enableCrossContainerPreview]);const handleDragStart=(id,container)=>{if(enableCrossContainerPreview){const originalIndex=state.items.findIndex((item=>item&&item.id===id));dragStateRef.current={isDragging:true,draggedItemId:id,originalContainer:container,originalIndex:originalIndex,currentContainer:container,dropOccurred:false}}dispatch({type:"SET_DRAG_DATA",payload:{id:id,initialGroup:container,originId:providerId}});dispatch({type:"SET_IS_DRAGGING",payload:id});if(onDragStart)onDragStart(id,container)};const handleDragEnter=(id,container)=>{if(state.dragData.originId!==providerId)return;if(state.dragData.id!==id){if(enableCrossContainerPreview){const draggedItem=state.items.find((item=>item&&item.id===state.dragData.id));const currentContainer=draggedItem&&draggedItem.container?draggedItem.container:state.dragData.initialGroup;const isCrossContainer=currentContainer!==container&&(currentContainer!==void 0||container!==void 0);if(isCrossContainer){dispatch({type:"REORDER_ITEMS_CROSS_CONTAINER",payload:{dragId:state.dragData.id,targetId:id,newContainer:container}});if(enableCrossContainerPreview){dragStateRef.current.currentContainer=container}}else{dispatch({type:"REORDER_ITEMS",payload:{dragId:state.dragData.id,targetId:id}})}}else{dispatch({type:"REORDER_ITEMS",payload:{dragId:state.dragData.id,targetId:id}})}const newInitialGroup=enableCrossContainerPreview?state.dragData.initialGroup:container;dispatch({type:"SET_DRAG_DATA",payload:{id:state.dragData.id,initialGroup:newInitialGroup,originId:providerId}})}if(onDragEnter)onDragEnter(id,container)};const handleDragEnd=()=>{const draggedItemId=state.dragData.id;const originalContainer=state.dragData.initialGroup;if(enableCrossContainerPreview&&!dragStateRef.current.dropOccurred&&draggedItemId&&originalContainer){dispatch({type:"RESET_DRAG_CONTAINER",payload:{itemId:draggedItemId,originalContainer:originalContainer,originalIndex:dragStateRef.current.originalIndex}})}dispatch({type:"SET_IS_DRAGGING",payload:""});dispatch({type:"SET_ACTIVE_CONTAINER",payload:""});dispatch({type:"SET_DRAG_DATA",payload:{id:"",initialGroup:"",originId:""}});if(enableCrossContainerPreview&&dragStateRef.current.dropOccurred){return}if(onDragEnd){if(!enableCrossContainerPreview){onDragEnd()}else{const draggedItem=stateRef.current.items.find((item=>item&&item.id===draggedItemId));const finalContainer=draggedItem?draggedItem.container:originalContainer;const itemsInContainer=stateRef.current.items.filter((item=>item&&item.container===finalContainer));const indexInContainer=itemsInContainer.findIndex((item=>item&&item.id===draggedItemId));const itemAbove=indexInContainer>0?itemsInContainer[indexInContainer-1]:null;const itemBelow=indexInContainer<itemsInContainer.length-1?itemsInContainer[indexInContainer+1]:null;onDragEnd(draggedItemId,finalContainer,originalContainer,itemAbove,itemBelow)}}};const changeCategory=(itemId,container)=>{dispatch({type:"CHANGE_CATEGORY",payload:{itemId:itemId,container:container}})};const handleDrop=container=>{if(state.dragData.originId!==providerId)return;const draggedItemId=state.dragData.id;const originalContainer=state.dragData.initialGroup;if(enableCrossContainerPreview){dragStateRef.current.dropOccurred=true}const isCrossContainer=container!==originalContainer;let callbackData=null;if(enableCrossContainerPreview){const draggedItem=stateRef.current.items.find((item=>item&&item.id===draggedItemId));const updatedItem=draggedItem?{...draggedItem,container:container}:null;const itemsInContainer=stateRef.current.items.filter((item=>item&&item.container===container));const indexInContainer=itemsInContainer.findIndex((item=>item&&item.id===draggedItemId));const itemAbove=indexInContainer>0?itemsInContainer[indexInContainer-1]:null;const itemBelow=indexInContainer<itemsInContainer.length-1?itemsInContainer[indexInContainer+1]:null;callbackData={updatedItem:updatedItem,itemAbove:itemAbove,itemBelow:itemBelow}}dispatch({type:"SET_IS_DRAGGING",payload:""});dispatch({type:"SET_ACTIVE_CONTAINER",payload:""});dispatch({type:"SET_DRAG_DATA",payload:{id:"",initialGroup:"",originId:""}});changeCategory(state.dragData.id,container);if(onDrop){if(!enableCrossContainerPreview){onDrop(container)}else{onDrop(draggedItemId,container,originalContainer,callbackData.updatedItem,callbackData.itemAbove,callbackData.itemBelow)}}if(enableCrossContainerPreview&&isCrossContainer&&onDragEnd&&callbackData){onDragEnd(draggedItemId,container,originalContainer,callbackData.itemAbove,callbackData.itemBelow)}};const handleDragOver=(e,container)=>{if(state.dragData.originId!==providerId)return;e.preventDefault();dispatch({type:"SET_ACTIVE_CONTAINER",payload:container});if(enableCrossContainerPreview&&state.dragData.id){const draggedItem=state.items.find((item=>item&&item.id===state.dragData.id));if(draggedItem&&draggedItem.container!==container){dispatch({type:"MOVE_TO_CONTAINER_END",payload:{dragId:state.dragData.id,newContainer:container}});dragStateRef.current.currentContainer=container}}if(onDragOver)onDragOver(e,container)};const contextValue=useMemo((()=>({items:state.items,dragData:state.dragData,isDragging:state.isDragging,activeContainer:state.activeContainer,dropZone:dropZoneType,dropZoneColor:dropZoneColor,...dropZoneType==="line"?{direction:dropZoneDirection}:{},handleDragStart:handleDragStart,handleDragEnter:handleDragEnter,handleDragEnd:handleDragEnd,handleDrop:handleDrop,handleDragOver:handleDragOver})),[state,dropZoneType,dropZoneColor,dropZoneDirection]);return jsx$1(DragContext.Provider,{value:contextValue,children:children})};var classnames$1={exports:{}};
1
+ import{jsx as jsx$1,Fragment,jsxs}from"react/jsx-runtime";import*as React from"react";import React__default,{createContext,useReducer,useRef,useEffect,useMemo,useContext,createElement,useState,forwardRef,useLayoutEffect,useCallback,useImperativeHandle,Component,Fragment as Fragment$1}from"react";import{c as getDefaultExportFromCjs,S as filter,T as omit,n as noop$2,u as useCollapsible,U as get,g as getAllIcons,V as createPopper,W as uniqueId,X as flip$2,Y as offset$2,Z as shift$2,$ as arrow$3,a0 as computePosition$1,a1 as createCoords$1,a2 as round$1,a3 as max$1,a4 as min$1,a5 as rectToClientRect$1,h as colors$1,k as highchartsTheme,a6 as merge,l as highchartsDarkTheme,N as typography,a7 as cloneDeep,i as isEmpty$1,a8 as isString}from"./lib-DxDBrGZX.js";import{TrixEditor}from"react-trix";import Trix from"trix";import*as ReactDOM from"react-dom";import ReactDOM__default,{createPortal}from"react-dom";import require$$0 from"react-is";const initialState={items:[],dragData:{id:"",initialGroup:"",originId:""},isDragging:"",activeContainer:""};const reducer=(state,action)=>{switch(action.type){case"SET_ITEMS":return{...state,items:action.payload};case"SET_DRAG_DATA":return{...state,dragData:action.payload};case"SET_IS_DRAGGING":return{...state,isDragging:action.payload};case"SET_ACTIVE_CONTAINER":return{...state,activeContainer:action.payload};case"CHANGE_CATEGORY":return{...state,items:state.items.map((item=>item.id===action.payload.itemId?{...item,container:action.payload.container}:item))};case"REORDER_ITEMS":{const{dragId:dragId,targetId:targetId}=action.payload;const newItems=[...state.items];const draggedItem=newItems.find((item=>item.id===dragId));const draggedIndex=newItems.indexOf(draggedItem);const targetIndex=newItems.findIndex((item=>item.id===targetId));newItems.splice(draggedIndex,1);newItems.splice(targetIndex,0,draggedItem);return{...state,items:newItems}}case"REORDER_ITEMS_CROSS_CONTAINER":{const{dragId:dragId,targetId:targetId,newContainer:newContainer}=action.payload;const newItems=[...state.items];const draggedItem=newItems.find((item=>item&&item.id===dragId));if(!draggedItem)return state;const draggedIndex=newItems.indexOf(draggedItem);const targetIndex=newItems.findIndex((item=>item&&item.id===targetId));if(draggedIndex===-1||targetIndex===-1)return state;const updatedItem={...draggedItem,container:newContainer};newItems.splice(draggedIndex,1);newItems.splice(targetIndex,0,updatedItem);return{...state,items:newItems}}case"MOVE_TO_CONTAINER_END":{const{dragId:dragId,newContainer:newContainer}=action.payload;const newItems=[...state.items];const draggedItem=newItems.find((item=>item&&item.id===dragId));if(!draggedItem)return state;const draggedIndex=newItems.indexOf(draggedItem);if(draggedIndex===-1)return state;const updatedItem={...draggedItem,container:newContainer};newItems.splice(draggedIndex,1);const lastIndexInContainer=newItems.map((item=>item&&item.container)).lastIndexOf(newContainer);if(lastIndexInContainer===-1){newItems.push(updatedItem)}else{newItems.splice(lastIndexInContainer+1,0,updatedItem)}return{...state,items:newItems}}case"RESET_DRAG_CONTAINER":{const{itemId:itemId,originalContainer:originalContainer,originalIndex:originalIndex}=action.payload;const newItems=[...state.items];const draggedItem=newItems.find((item=>item&&item.id===itemId));if(!draggedItem)return state;const currentIndex=newItems.indexOf(draggedItem);newItems.splice(currentIndex,1);const restoredItem={...draggedItem,container:originalContainer};if(originalIndex!==void 0&&originalIndex>=0){newItems.splice(originalIndex,0,restoredItem)}else{newItems.push(restoredItem)}return{...state,items:newItems}}default:return state}};const DragContext=createContext({});const DraggableContext=()=>useContext(DragContext);const DraggableProvider=({children:children,initialItems:initialItems,onReorder:onReorder,onDragStart:onDragStart,onDragEnter:onDragEnter,onDragEnd:onDragEnd,onDrop:onDrop,onDragOver:onDragOver,dropZone:dropZone={type:"ghost",color:"neutral",direction:"vertical"},providerId:providerId="default",enableCrossContainerPreview:enableCrossContainerPreview=false})=>{const[state,dispatch]=useReducer(reducer,initialState);const dragStateRef=useRef({isDragging:false,draggedItemId:"",originalContainer:"",originalIndex:-1,currentContainer:"",dropOccurred:false});const stateRef=useRef(state);useEffect((()=>{stateRef.current=state}),[state]);let dropZoneType="ghost";let dropZoneColor="neutral";let dropZoneDirection="vertical";if(typeof dropZone==="string"){dropZoneType=dropZone}else{dropZoneType=dropZone.type||"ghost";dropZoneColor=dropZone.type==="line"?dropZone.color||"primary":dropZone.color||"neutral";if(dropZoneType==="line"){dropZoneDirection=dropZone.direction||"vertical"}}useEffect((()=>{dispatch({type:"SET_ITEMS",payload:initialItems})}),[initialItems]);useEffect((()=>{onReorder(state.items)}),[state.items]);useEffect((()=>{if(!enableCrossContainerPreview)return;const handleGlobalDragOver=e=>{if(dragStateRef.current.isDragging){e.preventDefault()}};const handleGlobalDrop=e=>{if(!dragStateRef.current.isDragging)return;if(dragStateRef.current.dropOccurred)return;e.preventDefault();const originalContainer=dragStateRef.current.originalContainer;dispatch({type:"RESET_DRAG_CONTAINER",payload:{itemId:dragStateRef.current.draggedItemId,originalContainer:originalContainer,originalIndex:dragStateRef.current.originalIndex}});dispatch({type:"SET_IS_DRAGGING",payload:""});dispatch({type:"SET_ACTIVE_CONTAINER",payload:""});dispatch({type:"SET_DRAG_DATA",payload:{id:"",initialGroup:"",originId:""}});dragStateRef.current={isDragging:false,draggedItemId:"",originalContainer:"",originalIndex:-1,currentContainer:"",dropOccurred:false}};const handleGlobalMouseUp=()=>{if(dragStateRef.current.isDragging){setTimeout((()=>{const currentContainer=dragStateRef.current.currentContainer;if(dragStateRef.current.isDragging&&!dragStateRef.current.dropOccurred){if(currentContainer&&currentContainer!==dragStateRef.current.originalContainer){if(onDrop){const draggedItem=stateRef.current.items.find((item=>item&&item.id===dragStateRef.current.draggedItemId));const updatedItem=draggedItem?{...draggedItem,container:currentContainer}:null;const itemsInContainer=stateRef.current.items.filter((item=>item&&item.container===currentContainer));const indexInContainer=itemsInContainer.findIndex((item=>item&&item.id===dragStateRef.current.draggedItemId));const itemAbove=indexInContainer>0?itemsInContainer[indexInContainer-1]:null;const itemBelow=indexInContainer<itemsInContainer.length-1?itemsInContainer[indexInContainer+1]:null;onDrop(dragStateRef.current.draggedItemId,currentContainer,dragStateRef.current.originalContainer,updatedItem,itemAbove,itemBelow)}}else{dispatch({type:"RESET_DRAG_CONTAINER",payload:{itemId:dragStateRef.current.draggedItemId,originalContainer:dragStateRef.current.originalContainer,originalIndex:dragStateRef.current.originalIndex}})}dispatch({type:"SET_IS_DRAGGING",payload:""});dispatch({type:"SET_ACTIVE_CONTAINER",payload:""});dispatch({type:"SET_DRAG_DATA",payload:{id:"",initialGroup:"",originId:""}});dragStateRef.current={isDragging:false,draggedItemId:"",originalContainer:"",originalIndex:-1,currentContainer:"",dropOccurred:false}}}),50)}};const handleDragLeave=e=>{if(!e.relatedTarget&&dragStateRef.current.isDragging&&!dragStateRef.current.dropOccurred){dispatch({type:"RESET_DRAG_CONTAINER",payload:{itemId:dragStateRef.current.draggedItemId,originalContainer:dragStateRef.current.originalContainer,originalIndex:dragStateRef.current.originalIndex}});dispatch({type:"SET_IS_DRAGGING",payload:""});dispatch({type:"SET_ACTIVE_CONTAINER",payload:""});dispatch({type:"SET_DRAG_DATA",payload:{id:"",initialGroup:"",originId:""}});dragStateRef.current={isDragging:false,draggedItemId:"",originalContainer:"",originalIndex:-1,currentContainer:"",dropOccurred:false}}};document.addEventListener("dragover",handleGlobalDragOver);document.addEventListener("drop",handleGlobalDrop);document.addEventListener("dragleave",handleDragLeave);document.addEventListener("mouseup",handleGlobalMouseUp);document.addEventListener("pointerup",handleGlobalMouseUp);return()=>{document.removeEventListener("dragover",handleGlobalDragOver);document.removeEventListener("drop",handleGlobalDrop);document.removeEventListener("dragleave",handleDragLeave);document.removeEventListener("mouseup",handleGlobalMouseUp);document.removeEventListener("pointerup",handleGlobalMouseUp)}}),[enableCrossContainerPreview]);const prevIsDraggingRef=useRef(state.isDragging);useEffect((()=>{if(!enableCrossContainerPreview)return;const wasDragging=prevIsDraggingRef.current;const isNowDragging=state.isDragging;if(wasDragging&&!isNowDragging){if(!dragStateRef.current.dropOccurred&&dragStateRef.current.draggedItemId){dispatch({type:"RESET_DRAG_CONTAINER",payload:{itemId:dragStateRef.current.draggedItemId,originalContainer:dragStateRef.current.originalContainer,originalIndex:dragStateRef.current.originalIndex}})}dragStateRef.current={isDragging:false,draggedItemId:"",originalContainer:"",originalIndex:-1,currentContainer:"",dropOccurred:false}}prevIsDraggingRef.current=isNowDragging}),[state.isDragging,enableCrossContainerPreview]);const handleDragStart=(id,container)=>{if(enableCrossContainerPreview){const originalIndex=state.items.findIndex((item=>item&&item.id===id));dragStateRef.current={isDragging:true,draggedItemId:id,originalContainer:container,originalIndex:originalIndex,currentContainer:container,dropOccurred:false}}dispatch({type:"SET_DRAG_DATA",payload:{id:id,initialGroup:container,originId:providerId}});dispatch({type:"SET_IS_DRAGGING",payload:id});if(onDragStart)onDragStart(id,container)};const handleDragEnter=(id,container)=>{if(state.dragData.originId!==providerId)return;if(state.dragData.id!==id){if(enableCrossContainerPreview){const draggedItem=state.items.find((item=>item&&item.id===state.dragData.id));const currentContainer=draggedItem&&draggedItem.container?draggedItem.container:state.dragData.initialGroup;const isCrossContainer=currentContainer!==container&&(currentContainer!==void 0||container!==void 0);if(isCrossContainer){dispatch({type:"REORDER_ITEMS_CROSS_CONTAINER",payload:{dragId:state.dragData.id,targetId:id,newContainer:container}});if(enableCrossContainerPreview){dragStateRef.current.currentContainer=container}}else{dispatch({type:"REORDER_ITEMS",payload:{dragId:state.dragData.id,targetId:id}})}}else{dispatch({type:"REORDER_ITEMS",payload:{dragId:state.dragData.id,targetId:id}})}const newInitialGroup=enableCrossContainerPreview?state.dragData.initialGroup:container;dispatch({type:"SET_DRAG_DATA",payload:{id:state.dragData.id,initialGroup:newInitialGroup,originId:providerId}})}if(onDragEnter)onDragEnter(id,container)};const handleDragEnd=()=>{const draggedItemId=state.dragData.id;const originalContainer=state.dragData.initialGroup;if(enableCrossContainerPreview&&!dragStateRef.current.dropOccurred&&draggedItemId&&originalContainer){dispatch({type:"RESET_DRAG_CONTAINER",payload:{itemId:draggedItemId,originalContainer:originalContainer,originalIndex:dragStateRef.current.originalIndex}})}dispatch({type:"SET_IS_DRAGGING",payload:""});dispatch({type:"SET_ACTIVE_CONTAINER",payload:""});dispatch({type:"SET_DRAG_DATA",payload:{id:"",initialGroup:"",originId:""}});if(enableCrossContainerPreview&&dragStateRef.current.dropOccurred){return}if(onDragEnd){if(!enableCrossContainerPreview){onDragEnd()}else{const draggedItem=stateRef.current.items.find((item=>item&&item.id===draggedItemId));const finalContainer=draggedItem?draggedItem.container:originalContainer;const itemsInContainer=stateRef.current.items.filter((item=>item&&item.container===finalContainer));const indexInContainer=itemsInContainer.findIndex((item=>item&&item.id===draggedItemId));const itemAbove=indexInContainer>0?itemsInContainer[indexInContainer-1]:null;const itemBelow=indexInContainer<itemsInContainer.length-1?itemsInContainer[indexInContainer+1]:null;onDragEnd(draggedItemId,finalContainer,originalContainer,itemAbove,itemBelow)}}};const changeCategory=(itemId,container)=>{dispatch({type:"CHANGE_CATEGORY",payload:{itemId:itemId,container:container}})};const handleDrop=container=>{if(state.dragData.originId!==providerId)return;const draggedItemId=state.dragData.id;const originalContainer=state.dragData.initialGroup;if(enableCrossContainerPreview){dragStateRef.current.dropOccurred=true}const isCrossContainer=container!==originalContainer;let callbackData=null;if(enableCrossContainerPreview){const draggedItem=stateRef.current.items.find((item=>item&&item.id===draggedItemId));const updatedItem=draggedItem?{...draggedItem,container:container}:null;const itemsInContainer=stateRef.current.items.filter((item=>item&&item.container===container));const indexInContainer=itemsInContainer.findIndex((item=>item&&item.id===draggedItemId));const itemAbove=indexInContainer>0?itemsInContainer[indexInContainer-1]:null;const itemBelow=indexInContainer<itemsInContainer.length-1?itemsInContainer[indexInContainer+1]:null;callbackData={updatedItem:updatedItem,itemAbove:itemAbove,itemBelow:itemBelow}}dispatch({type:"SET_IS_DRAGGING",payload:""});dispatch({type:"SET_ACTIVE_CONTAINER",payload:""});dispatch({type:"SET_DRAG_DATA",payload:{id:"",initialGroup:"",originId:""}});changeCategory(state.dragData.id,container);if(onDrop){if(!enableCrossContainerPreview){onDrop(container)}else{onDrop(draggedItemId,container,originalContainer,callbackData.updatedItem,callbackData.itemAbove,callbackData.itemBelow)}}if(enableCrossContainerPreview&&isCrossContainer&&onDragEnd&&callbackData){onDragEnd(draggedItemId,container,originalContainer,callbackData.itemAbove,callbackData.itemBelow)}};const handleDragOver=(e,container)=>{if(state.dragData.originId!==providerId)return;e.preventDefault();dispatch({type:"SET_ACTIVE_CONTAINER",payload:container});if(enableCrossContainerPreview&&state.dragData.id){const draggedItem=state.items.find((item=>item&&item.id===state.dragData.id));if(draggedItem&&draggedItem.container!==container){dispatch({type:"MOVE_TO_CONTAINER_END",payload:{dragId:state.dragData.id,newContainer:container}});dragStateRef.current.currentContainer=container}}if(onDragOver)onDragOver(e,container)};const contextValue=useMemo((()=>({items:state.items,dragData:state.dragData,isDragging:state.isDragging,activeContainer:state.activeContainer,dropZone:dropZoneType,dropZoneColor:dropZoneColor,...dropZoneType==="line"?{direction:dropZoneDirection}:{},handleDragStart:handleDragStart,handleDragEnter:handleDragEnter,handleDragEnd:handleDragEnd,handleDrop:handleDrop,handleDragOver:handleDragOver})),[state,dropZoneType,dropZoneColor,dropZoneDirection]);return jsx$1(DragContext.Provider,{value:contextValue,children:children})};var classnames$1={exports:{}};
2
2
  /*!
3
3
  Copyright (c) 2018 Jed Watson.
4
4
  Licensed under the MIT License (MIT), see