@planningcenter/tapestry 4.12.0-rc.0 → 4.12.0

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 (143) hide show
  1. package/dist/components/DataTable/CollectionEditorsLazy.js +2 -1
  2. package/dist/components/DataTable/CollectionEditorsLazy.js.map +1 -1
  3. package/dist/components/DataTable/DataTable.d.ts +5 -4
  4. package/dist/components/DataTable/DataTable.d.ts.map +1 -1
  5. package/dist/components/DataTable/DataTable.js +4 -2
  6. package/dist/components/DataTable/DataTable.js.map +1 -1
  7. package/dist/components/DataTable/ManageSavedViewsModal.d.ts +5 -2
  8. package/dist/components/DataTable/ManageSavedViewsModal.d.ts.map +1 -1
  9. package/dist/components/DataTable/ManageSavedViewsModal.js +167 -18
  10. package/dist/components/DataTable/ManageSavedViewsModal.js.map +1 -1
  11. package/dist/components/DataTable/ManageSavedViewsModal.module.css.js +1 -1
  12. package/dist/components/DataTable/SavedViewsBar.d.ts.map +1 -1
  13. package/dist/components/DataTable/SavedViewsBar.js +23 -9
  14. package/dist/components/DataTable/SavedViewsBar.js.map +1 -1
  15. package/dist/components/DataTable/savedViews.d.ts +24 -0
  16. package/dist/components/DataTable/savedViews.d.ts.map +1 -1
  17. package/dist/components/DataTable/savedViews.js +58 -1
  18. package/dist/components/DataTable/savedViews.js.map +1 -1
  19. package/dist/components/button/ActionsDropdownIconButton.d.ts +3 -2
  20. package/dist/components/button/ActionsDropdownIconButton.d.ts.map +1 -1
  21. package/dist/components/button/ActionsDropdownIconButton.js.map +1 -1
  22. package/dist/components/button/BaseButton.d.ts.map +1 -1
  23. package/dist/components/button/BaseButton.js +2 -1
  24. package/dist/components/button/BaseButton.js.map +1 -1
  25. package/dist/components/button/IconButton.d.ts +1 -3
  26. package/dist/components/button/IconButton.d.ts.map +1 -1
  27. package/dist/components/button/IconButton.js.map +1 -1
  28. package/dist/components/button/ToggleIconButton.d.ts +5 -2
  29. package/dist/components/button/ToggleIconButton.d.ts.map +1 -1
  30. package/dist/components/button/ToggleIconButton.js +1 -0
  31. package/dist/components/button/ToggleIconButton.js.map +1 -1
  32. package/dist/components/button/index.d.ts +1 -1
  33. package/dist/components/button/index.d.ts.map +1 -1
  34. package/dist/components/combo-box/ComboBox.d.ts +2 -0
  35. package/dist/components/combo-box/ComboBox.d.ts.map +1 -1
  36. package/dist/components/combo-box/ComboBox.js +31 -5
  37. package/dist/components/combo-box/ComboBox.js.map +1 -1
  38. package/dist/components/date-picker/DatePicker.d.ts.map +1 -1
  39. package/dist/components/date-picker/DatePicker.js +18 -14
  40. package/dist/components/date-picker/DatePicker.js.map +1 -1
  41. package/dist/components/internal/LoadingAnnouncement.d.ts +11 -0
  42. package/dist/components/internal/LoadingAnnouncement.d.ts.map +1 -0
  43. package/dist/components/internal/LoadingAnnouncement.js +21 -0
  44. package/dist/components/internal/LoadingAnnouncement.js.map +1 -0
  45. package/dist/components/internal/index.d.ts +1 -0
  46. package/dist/components/internal/index.d.ts.map +1 -1
  47. package/dist/components/internal/tooltip/Tooltip.d.ts +4 -2
  48. package/dist/components/internal/tooltip/Tooltip.d.ts.map +1 -1
  49. package/dist/components/internal/tooltip/Tooltip.js.map +1 -1
  50. package/dist/components/internal/tooltip/TooltipTriggerContext.d.ts +3 -3
  51. package/dist/components/internal/tooltip/TooltipTriggerContext.d.ts.map +1 -1
  52. package/dist/components/internal/tooltip/TooltipTriggerContext.js +1 -1
  53. package/dist/components/internal/tooltip/TooltipTriggerContext.js.map +1 -1
  54. package/dist/components/internal/tooltip/index.d.ts +1 -1
  55. package/dist/components/internal/tooltip/index.d.ts.map +1 -1
  56. package/dist/components/link/BaseLink.d.ts.map +1 -1
  57. package/dist/components/link/BaseLink.js +15 -3
  58. package/dist/components/link/BaseLink.js.map +1 -1
  59. package/dist/components/link/IconLink.d.ts +28 -290
  60. package/dist/components/link/IconLink.d.ts.map +1 -1
  61. package/dist/components/link/IconLink.js +9 -2
  62. package/dist/components/link/IconLink.js.map +1 -1
  63. package/dist/components/page-header/defineElements.js +1 -1
  64. package/dist/components/pane/Pane.d.ts +1 -1
  65. package/dist/components/pane/Pane.js +1 -1
  66. package/dist/components/pane/Pane.js.map +1 -1
  67. package/dist/components/pane/PaneBody.d.ts +1 -1
  68. package/dist/components/pane/PaneBody.js +1 -1
  69. package/dist/components/pane/PaneBody.js.map +1 -1
  70. package/dist/components/pane/PaneDivider.d.ts +1 -1
  71. package/dist/components/pane/PaneDivider.js +1 -1
  72. package/dist/components/pane/PaneDivider.js.map +1 -1
  73. package/dist/components/pane/PaneFooter.d.ts +1 -1
  74. package/dist/components/pane/PaneFooter.js +1 -1
  75. package/dist/components/pane/PaneFooter.js.map +1 -1
  76. package/dist/components/pane/PaneHeader.d.ts +1 -1
  77. package/dist/components/pane/PaneHeader.js +1 -1
  78. package/dist/components/pane/PaneHeader.js.map +1 -1
  79. package/dist/components/pane/PaneHeaderActions.d.ts +1 -1
  80. package/dist/components/pane/PaneHeaderActions.js +1 -1
  81. package/dist/components/pane/PaneHeaderActions.js.map +1 -1
  82. package/dist/components/sidenav/defineElements.js +1 -1
  83. package/dist/components/time-field/TimeField.d.ts.map +1 -1
  84. package/dist/components/time-field/TimeField.js +7 -3
  85. package/dist/components/time-field/TimeField.js.map +1 -1
  86. package/dist/index.css +142 -0
  87. package/dist/index.css.map +1 -1
  88. package/dist/index.d.ts +1 -0
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +6 -0
  91. package/dist/index.js.map +1 -1
  92. package/dist/packages/tapestry-wc/dist/components/{p-np7vhMVg.js → p-A1JK45WV.js} +3 -3
  93. package/dist/packages/tapestry-wc/dist/components/p-A1JK45WV.js.map +1 -0
  94. package/dist/packages/tapestry-wc/dist/components/{p-BVvtAaVT.js → p-BbuNAv9q.js} +3 -3
  95. package/dist/packages/tapestry-wc/dist/components/p-BbuNAv9q.js.map +1 -0
  96. package/dist/packages/tapestry-wc/dist/components/{p-B2xqMgNQ.js → p-CBFtMIxJ.js} +2 -2
  97. package/dist/packages/tapestry-wc/dist/components/p-CBFtMIxJ.js.map +1 -0
  98. package/dist/packages/tapestry-wc/dist/components/{p-Rn6lOB18.js → p-CY_DC4d_.js} +3 -3
  99. package/dist/packages/tapestry-wc/dist/components/p-CY_DC4d_.js.map +1 -0
  100. package/dist/packages/tapestry-wc/dist/components/{p-6NO22Vi_.js → p-DNHgMtxw.js} +2 -2
  101. package/dist/packages/tapestry-wc/dist/components/p-DNHgMtxw.js.map +1 -0
  102. package/dist/packages/tapestry-wc/dist/components/tds-page-header-nav.js +2 -2
  103. package/dist/packages/tapestry-wc/dist/components/tds-page-header-nav.js.map +1 -1
  104. package/dist/packages/tapestry-wc/dist/components/tds-page-header.js +3 -3
  105. package/dist/packages/tapestry-wc/dist/components/tds-page-header.js.map +1 -1
  106. package/dist/packages/tapestry-wc/dist/components/tds-sidenav-item.js +3 -3
  107. package/dist/packages/tapestry-wc/dist/components/tds-sidenav-item.js.map +1 -1
  108. package/dist/packages/tapestry-wc/dist/components/tds-sidenav-responsive-header.js +2 -2
  109. package/dist/packages/tapestry-wc/dist/components/tds-sidenav-responsive-header.js.map +1 -1
  110. package/dist/packages/tapestry-wc/dist/components/tds-sidenav-section.js +3 -3
  111. package/dist/packages/tapestry-wc/dist/components/tds-sidenav-section.js.map +1 -1
  112. package/dist/packages/tapestry-wc/dist/components/tds-sidenav.js +5 -5
  113. package/dist/packages/tapestry-wc/dist/components/tds-sidenav.js.map +1 -1
  114. package/dist/reactRender.css +1171 -1101
  115. package/dist/reactRender.css.map +1 -1
  116. package/dist/reactRenderLegacy.css +1171 -1101
  117. package/dist/reactRenderLegacy.css.map +1 -1
  118. package/dist/tapestryMount.css +1171 -1101
  119. package/dist/tapestryMount.css.map +1 -1
  120. package/dist/tapestryMountLegacy.css +1171 -1101
  121. package/dist/tapestryMountLegacy.css.map +1 -1
  122. package/dist/unstable.css +201 -131
  123. package/dist/unstable.css.map +1 -1
  124. package/dist/unstable.d.ts +0 -1
  125. package/dist/unstable.d.ts.map +1 -1
  126. package/dist/unstable.js +6 -6
  127. package/dist/utilities/dateFieldLocale.d.ts +2 -0
  128. package/dist/utilities/dateFieldLocale.d.ts.map +1 -0
  129. package/dist/utilities/dateFieldLocale.js +32 -0
  130. package/dist/utilities/dateFieldLocale.js.map +1 -0
  131. package/dist/utilities/useAnnounce.d.ts +8 -1
  132. package/dist/utilities/useAnnounce.d.ts.map +1 -1
  133. package/dist/utilities/useAnnounce.js.map +1 -1
  134. package/dist/utilities/useDateFieldLocale.d.ts +2 -0
  135. package/dist/utilities/useDateFieldLocale.d.ts.map +1 -0
  136. package/dist/utilities/useDateFieldLocale.js +11 -0
  137. package/dist/utilities/useDateFieldLocale.js.map +1 -0
  138. package/package.json +4 -3
  139. package/dist/packages/tapestry-wc/dist/components/p-6NO22Vi_.js.map +0 -1
  140. package/dist/packages/tapestry-wc/dist/components/p-B2xqMgNQ.js.map +0 -1
  141. package/dist/packages/tapestry-wc/dist/components/p-BVvtAaVT.js.map +0 -1
  142. package/dist/packages/tapestry-wc/dist/components/p-Rn6lOB18.js.map +0 -1
  143. package/dist/packages/tapestry-wc/dist/components/p-np7vhMVg.js.map +0 -1
@@ -5,6 +5,7 @@ import '../button/DropdownIconButton.js';
5
5
  import { IconButton } from '../button/IconButton.js';
6
6
  import '../button/LoadingButton.js';
7
7
  import '../button/PageHeaderActionsDropdownButton.js';
8
+ import { ToggleIconButton } from '../button/ToggleIconButton.js';
8
9
  import { Input } from '../input/Input.js';
9
10
  import { Modal } from '../modal/Modal.js';
10
11
  import { ModalBody } from '../modal/ModalBody.js';
@@ -12,11 +13,23 @@ import { ModalFooter } from '../modal/ModalFooter.js';
12
13
  import { ModalHeader } from '../modal/ModalHeader.js';
13
14
  import Icon from '../../utilities/Icon.js';
14
15
  import React__default, { useState, useRef, useEffect } from 'react';
16
+ import { ListDropTargetDelegate } from 'react-aria/ListDropTargetDelegate';
17
+ import { ListKeyboardDelegate } from 'react-aria/ListKeyboardDelegate';
18
+ import { mergeProps } from 'react-aria/mergeProps';
19
+ import { useButton } from 'react-aria/useButton';
20
+ import { useDraggableCollection, useDraggableItem } from 'react-aria/useDraggableCollection';
21
+ import { useDroppableCollection, useDropIndicator } from 'react-aria/useDroppableCollection';
22
+ import { useVisuallyHidden } from 'react-aria/VisuallyHidden';
23
+ import { Item } from 'react-stately/Item';
24
+ import { useDraggableCollectionState } from 'react-stately/useDraggableCollectionState';
25
+ import { useDroppableCollectionState } from 'react-stately/useDroppableCollectionState';
26
+ import { useListState } from 'react-stately/useListState';
15
27
  import { DeleteSavedViewAlertDialog } from './DeleteSavedViewAlertDialog.js';
16
28
  import styles from './ManageSavedViewsModal.module.css.js';
29
+ import { savedViewUpdatesForReorder } from './savedViews.js';
17
30
  import { useUpdateSavedViewName } from './useUpdateSavedViewName.js';
18
31
 
19
- function ManageSavedViewsModal({ onClose, onDelete, onUpdate, open, savedViews, staticViews, }) {
32
+ function ManageSavedViewsModal({ defaultViewId, onClose, onDelete, onSetDefault, onUpdate, open, savedViews, staticViews, }) {
20
33
  const updateSavedViewName = useUpdateSavedViewName(onUpdate);
21
34
  // Kept after the alert closes, so its text holds during the exit animation.
22
35
  const [viewToDelete, setViewToDelete] = useState(null);
@@ -28,33 +41,154 @@ function ManageSavedViewsModal({ onClose, onDelete, onUpdate, open, savedViews,
28
41
  setViewToDelete(view);
29
42
  setIsDeleteAlertOpen(true);
30
43
  };
44
+ // Deleting the default view hands the default back to "initial".
31
45
  const confirmDelete = () => {
32
46
  if (viewToDelete) {
33
47
  focusAfterDelete(viewToDelete);
34
48
  onDelete?.(viewToDelete);
49
+ if (viewToDelete.id === defaultViewId)
50
+ onSetDefault?.("initial");
35
51
  }
36
52
  setIsDeleteAlertOpen(false);
37
53
  };
54
+ // The default is matched by id, so an unsaved view can't be made the
55
+ // default. Unsetting the default hands it back to "initial".
56
+ const renderDefaultViewToggle = ({ id, name }) => onSetDefault && id !== undefined ? (React__default.createElement(DefaultViewToggle, { isDefault: id === defaultViewId, name: name, onChange: (isDefault) => onSetDefault(isDefault ? id : "initial") })) : null;
38
57
  return (React__default.createElement(Modal, { dismissible: true, open: open, onClose: onClose },
39
58
  React__default.createElement(ModalHeader, { title: "Manage views" }),
40
59
  React__default.createElement(ModalBody, null,
41
- React__default.createElement("ul", { ref: listRef, className: styles["views-list"] },
42
- staticViews.map((view) => (React__default.createElement("li", { key: view.id, className: styles["views-list-item--static"] }, view.name))),
43
- savedViews.map((view, index) => (React__default.createElement("li", { key: view.id ?? `unsaved-view-${index}`, className: styles["views-list-item"] },
44
- React__default.createElement(SavedViewRow
45
- // Updates and deletes are matched by id, so an unsaved view
46
- // can't be renamed or deleted.
47
- , {
48
- // Updates and deletes are matched by id, so an unsaved view
49
- // can't be renamed or deleted.
50
- readOnly: !onUpdate || view.id === undefined, view: view, onDelete: onDelete && view.id !== undefined
51
- ? (name) => requestDelete({ ...view, name })
52
- : undefined, onRename: (name) => updateSavedViewName(view, name) })))))),
60
+ React__default.createElement(SavedViewsList, { listRef: listRef, renderStaticViewActions: (view) => (React__default.createElement(React__default.Fragment, null,
61
+ renderDefaultViewToggle(view),
62
+ onDelete && React__default.createElement(DeleteViewButton, { disabled: true, name: view.name }))), savedViews: savedViews, staticViews: staticViews, onUpdate: onUpdate }, (view) => (React__default.createElement(SavedViewRow, { defaultViewToggle: renderDefaultViewToggle(view), hasDeleteButton: Boolean(onDelete),
63
+ // Updates and deletes are matched by id, so an unsaved view
64
+ // can't be renamed or deleted.
65
+ readOnly: !onUpdate || view.id === undefined, view: view, onDelete: onDelete && view.id !== undefined
66
+ ? (name) => requestDelete({ ...view, name })
67
+ : undefined, onRename: (name) => updateSavedViewName(view, name) })))),
53
68
  React__default.createElement(ModalFooter, null,
54
69
  React__default.createElement(Button, { ref: doneButtonRef, kind: "primary", label: "Done", onClick: onClose })),
55
70
  onDelete && (React__default.createElement(DeleteSavedViewAlertDialog, { open: isDeleteAlertOpen, view: viewToDelete, onCancel: () => setIsDeleteAlertOpen(false), onConfirm: confirmDelete }))));
56
71
  }
57
72
  ManageSavedViewsModal.displayName = "ManageSavedViewsModal";
73
+ /**
74
+ * The static views, then the saved views with drag handles. Mounts with the
75
+ * modal's content, since React Aria registers the list as a drop target when
76
+ * its hooks mount, and the modal stays mounted while closed.
77
+ */
78
+ function SavedViewsList({ children, listRef, onUpdate, renderStaticViewActions, savedViews, staticViews, }) {
79
+ const { collectionProps, dragState, dropState } = useSavedViewsDragAndDrop(savedViews, listRef, onUpdate);
80
+ return (React__default.createElement("ol", { ref: listRef, ...collectionProps, className: styles["views-list"] },
81
+ staticViews.map((view) => (React__default.createElement("li", { key: view.id, className: styles["views-list-item--static"] },
82
+ React__default.createElement("span", { className: styles["view-list-item-static-name"] }, view.name),
83
+ renderStaticViewActions(view)))),
84
+ savedViews.map((view, index) => {
85
+ const key = savedViewKey(view, index);
86
+ return (React__default.createElement("li", { key: key, className: styles["views-list-item"], "data-dragging": dragState.isDragging(key) || undefined, "data-key": key },
87
+ React__default.createElement(SavedViewDropIndicator, { dropState: dropState, target: { dropPosition: "before", key, type: "item" } }),
88
+ savedViews.length > 1 && onUpdate && view.id !== undefined && (React__default.createElement(SavedViewDragHandle, { dragState: dragState, itemKey: key, name: view.name })),
89
+ children(view),
90
+ index === savedViews.length - 1 && (React__default.createElement(SavedViewDropIndicator, { dropState: dropState, target: { dropPosition: "after", key, type: "item" } }))));
91
+ })));
92
+ }
93
+ /** A string, since React Aria's collection keys an `Item` by its React key. */
94
+ function savedViewKey(view, index) {
95
+ return String(view.id ?? `unsaved-view-${index}`);
96
+ }
97
+ /**
98
+ * Drag and drop for the saved views' rows, which React Aria finds by their
99
+ * `data-key`. A drop sends the views with new sort keys to `onUpdate`, and
100
+ * the row moves once they're passed back in.
101
+ */
102
+ function useSavedViewsDragAndDrop(savedViews, listRef, onUpdate) {
103
+ const { collection, selectionManager } = useListState({
104
+ children: savedViews.map((view, index) => (React__default.createElement(Item, { key: savedViewKey(view, index), textValue: view.name }, view.name))),
105
+ selectionMode: "none",
106
+ });
107
+ const dragState = useDraggableCollectionState({
108
+ collection,
109
+ getItems: (keys) => [...keys].map((key) => ({
110
+ "text/plain": collection.getItem(key)?.textValue ?? String(key),
111
+ })),
112
+ // A drop removes the drop target that had focus, and rows can't take
113
+ // focus, so it goes back to the handle that started the drag.
114
+ onDragEnd: ({ keys }) => {
115
+ const [key] = keys;
116
+ listRef.current
117
+ ?.querySelector(`[data-key="${CSS.escape(String(key))}"] .${styles["view-list-item-drag-handle"]}`)
118
+ ?.focus();
119
+ },
120
+ // A keyboard drag starts after the focused row, which the rows can't
121
+ // set themselves, since they can't take focus.
122
+ onDragStart: ({ keys }) => {
123
+ const [key] = keys;
124
+ selectionManager.setFocusedKey(key);
125
+ },
126
+ selectionManager,
127
+ });
128
+ useDraggableCollection({}, dragState, listRef);
129
+ const onReorder = ({ keys, target }) => {
130
+ const indexOf = (key) => savedViews.findIndex((view, index) => savedViewKey(view, index) === key);
131
+ // Rows only offer drop targets between them, not on them.
132
+ if (target.dropPosition === "on")
133
+ return;
134
+ const [key] = keys;
135
+ const updates = savedViewUpdatesForReorder(savedViews, indexOf(key), indexOf(target.key), target.dropPosition);
136
+ // Updates are matched by id, so a reorder that needs to update an unsaved
137
+ // view can't be saved in full. Saving part of it would leave the order
138
+ // unchanged anyway.
139
+ if (updates.some((view) => view.id === undefined))
140
+ return;
141
+ for (const view of updates)
142
+ onUpdate?.(view);
143
+ };
144
+ const dropState = useDroppableCollectionState({
145
+ collection,
146
+ onReorder,
147
+ selectionManager,
148
+ });
149
+ const { collectionProps } = useDroppableCollection({
150
+ dropTargetDelegate: new ListDropTargetDelegate(collection, listRef),
151
+ keyboardDelegate: new ListKeyboardDelegate({ collection, ref: listRef }),
152
+ onReorder,
153
+ }, dropState, listRef);
154
+ return { collectionProps, dragState, dropState };
155
+ }
156
+ /**
157
+ * Starts a drag with a pointer, or with Enter or Space. A pointer drag shows
158
+ * the whole row, held where the pointer grabbed it, rather than the handle.
159
+ */
160
+ function SavedViewDragHandle({ dragState, itemKey, name, }) {
161
+ const ref = useRef(null);
162
+ const { dragButtonProps, dragProps } = useDraggableItem({ hasDragButton: true, key: itemKey }, dragState);
163
+ const { buttonProps } = useButton(dragButtonProps, ref);
164
+ return (React__default.createElement(IconButton, { ref: ref, ...mergeProps(buttonProps, dragProps, {
165
+ onDragStart: (event) => {
166
+ const row = event.currentTarget.closest("li");
167
+ if (!row)
168
+ return;
169
+ const { left, top } = row.getBoundingClientRect();
170
+ // The browser snapshots the row once this handler returns, so the
171
+ // ghost styles apply only to the snapshot.
172
+ const className = styles["views-list-item--drag-ghost"];
173
+ row.classList.add(className);
174
+ requestAnimationFrame(() => row.classList.remove(className));
175
+ event.dataTransfer.setDragImage(row, event.clientX - left, event.clientY - top);
176
+ },
177
+ }), "aria-label": `Reorder ${name}`, className: styles["view-list-item-drag-handle"], icon: React__default.createElement(Icon, { "aria-hidden": true, symbol: "general#drag-handle" }), kind: "ghost" }));
178
+ }
179
+ /**
180
+ * A line at a row's edge while dragging. Screen readers reach the hidden
181
+ * button inside it as a drop target.
182
+ */
183
+ function SavedViewDropIndicator({ dropState, target, }) {
184
+ const ref = useRef(null);
185
+ const { dropIndicatorProps, isDropTarget, isHidden } = useDropIndicator({ target }, dropState, ref);
186
+ const { visuallyHiddenProps } = useVisuallyHidden();
187
+ if (isHidden)
188
+ return null;
189
+ return (React__default.createElement("div", { className: styles["view-list-drop-indicator"], "data-drop-position": target.type === "item" ? target.dropPosition : undefined, "data-drop-target": isDropTarget || undefined },
190
+ React__default.createElement("div", { ...visuallyHiddenProps, role: "button", ...dropIndicatorProps, ref: ref })));
191
+ }
58
192
  /**
59
193
  * Moves focus off a deleted view's row in two steps: `focusAfterDelete` picks
60
194
  * the target while the row is still there, and focus moves to it once the
@@ -70,8 +204,10 @@ function useFocusAfterDelete(savedViews, isDeleteAlertOpen) {
70
204
  const rows = listRef.current?.querySelectorAll(`.${styles["views-list-item"]}`) ?? [];
71
205
  const index = savedViews.findIndex(({ id }) => id === view.id);
72
206
  const row = rows[index + 1] ?? rows[index - 1];
207
+ // The row's last enabled button is its delete button, when it has one.
208
+ const buttons = row?.querySelectorAll(`button:not(.${styles["view-list-item-drag-handle"]}, :disabled)`);
73
209
  focusTargetRef.current =
74
- row?.querySelector("button") ??
210
+ buttons?.[buttons.length - 1] ??
75
211
  row?.querySelector("input") ??
76
212
  doneButtonRef.current;
77
213
  };
@@ -86,12 +222,12 @@ function useFocusAfterDelete(savedViews, isDeleteAlertOpen) {
86
222
  return { doneButtonRef, focusAfterDelete, listRef };
87
223
  }
88
224
  /**
89
- * A saved view's name field and delete button. Renames on blur or Enter. An
225
+ * A saved view's name field, default view toggle, and delete button. Renames on blur or Enter. An
90
226
  * empty name reverts to the current one. Tracks the last name it sent, so
91
227
  * Enter followed by blur renames once. Deleting sends a pending rename first,
92
228
  * then passes along the name, so the alert shows what the field does.
93
229
  */
94
- function SavedViewRow({ onDelete, onRename, readOnly, view, }) {
230
+ function SavedViewRow({ defaultViewToggle, hasDeleteButton, onDelete, onRename, readOnly, view, }) {
95
231
  const [name, setName] = useState(view.name);
96
232
  const committedName = useRef(view.name);
97
233
  // Picks up names changed outside this field, including once a rename saves,
@@ -122,14 +258,27 @@ function SavedViewRow({ onDelete, onRename, readOnly, view, }) {
122
258
  commit();
123
259
  }
124
260
  } }),
125
- onDelete && (React__default.createElement(IconButton, { "aria-label": `Delete ${view.name}`, icon: React__default.createElement(Icon, { "aria-hidden": true, symbol: "general#trash" }), kind: "ghost", tooltip: "Delete", onClick: (event) => {
261
+ defaultViewToggle,
262
+ hasDeleteButton && (React__default.createElement(DeleteViewButton, { disabled: !onDelete, name: view.name, onClick: (event) => {
126
263
  // Safari doesn't focus a button on click, and the alert returns
127
264
  // focus to whatever had it when it opened. Focusing also blurs
128
265
  // the field, which sends a pending rename.
129
266
  event.currentTarget.focus();
130
- onDelete(committedName.current);
267
+ onDelete?.(committedName.current);
131
268
  } }))));
132
269
  }
270
+ function DeleteViewButton({ disabled, name, onClick, }) {
271
+ return (React__default.createElement(IconButton, { "aria-label": `Delete ${name}`, disabled: disabled, icon: React__default.createElement(Icon, { "aria-hidden": true, symbol: "general#trash" }), kind: "ghost", tooltip: "Delete", onClick: onClick }));
272
+ }
273
+ /** Makes a view the default, or hands the default back to "initial". */
274
+ function DefaultViewToggle({ isDefault, name, onChange, }) {
275
+ return (React__default.createElement(ToggleIconButton
276
+ // Only one view is the default, so its label doesn't need the view's
277
+ // name to be unique.
278
+ , { "aria-label": isDefault ? "Default view" : `Set ${name} as default`, icon: React__default.createElement(Icon, { "aria-hidden": true, symbol: isDefault ? "general#pin" : "general#outlined-pin" }),
279
+ // Only the default's pin is blue.
280
+ kind: isDefault ? "ghost-interaction" : "ghost", pressed: isDefault, tooltip: isDefault ? "Default view" : "Set as default", onChange: onChange }));
281
+ }
133
282
 
134
283
  export { ManageSavedViewsModal };
135
284
  //# sourceMappingURL=ManageSavedViewsModal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ManageSavedViewsModal.js","sources":["../../../src/components/DataTable/ManageSavedViewsModal.tsx"],"sourcesContent":["import { Button, IconButton } from \"@components/button\"\nimport { Input } from \"@components/input\"\nimport { Modal, ModalBody, ModalFooter, ModalHeader } from \"@components/modal\"\nimport Icon from \"@utilities/Icon\"\nimport React, { useEffect, useRef, useState } from \"react\"\n\nimport { DeleteSavedViewAlertDialog } from \"./DeleteSavedViewAlertDialog\"\nimport styles from \"./ManageSavedViewsModal.module.css\"\nimport type { SavedView, StaticView } from \"./savedViews\"\nimport { useUpdateSavedViewName } from \"./useUpdateSavedViewName\"\n\nexport interface ManageSavedViewsModalProps {\n onClose: () => void\n /** Called once the user confirms. Omit to leave out the delete buttons. */\n onDelete?: (savedView: SavedView) => void\n onUpdate?: (savedView: SavedView) => Promise<SavedView> | SavedView\n open: boolean\n savedViews: SavedView[]\n /** Listed by name before `savedViews`, since they can't be renamed. */\n staticViews: StaticView[]\n}\n\nexport function ManageSavedViewsModal({\n onClose,\n onDelete,\n onUpdate,\n open,\n savedViews,\n staticViews,\n}: ManageSavedViewsModalProps) {\n const updateSavedViewName = useUpdateSavedViewName(onUpdate)\n // Kept after the alert closes, so its text holds during the exit animation.\n const [viewToDelete, setViewToDelete] = useState<SavedView | null>(null)\n const [isDeleteAlertOpen, setIsDeleteAlertOpen] = useState(false)\n // Without this, focus would go to the modal's close button, since the\n // alert returns it to the delete button, which is gone with its row.\n const { doneButtonRef, focusAfterDelete, listRef } = useFocusAfterDelete(\n savedViews,\n isDeleteAlertOpen\n )\n\n const requestDelete = (view: SavedView) => {\n setViewToDelete(view)\n setIsDeleteAlertOpen(true)\n }\n\n const confirmDelete = () => {\n if (viewToDelete) {\n focusAfterDelete(viewToDelete)\n onDelete?.(viewToDelete)\n }\n setIsDeleteAlertOpen(false)\n }\n\n return (\n <Modal dismissible open={open} onClose={onClose}>\n <ModalHeader title=\"Manage views\" />\n <ModalBody>\n <ul ref={listRef} className={styles[\"views-list\"]}>\n {staticViews.map((view) => (\n <li key={view.id} className={styles[\"views-list-item--static\"]}>\n {view.name}\n </li>\n ))}\n {savedViews.map((view, index) => (\n <li\n key={view.id ?? `unsaved-view-${index}`}\n className={styles[\"views-list-item\"]}\n >\n <SavedViewRow\n // Updates and deletes are matched by id, so an unsaved view\n // can't be renamed or deleted.\n readOnly={!onUpdate || view.id === undefined}\n view={view}\n onDelete={\n onDelete && view.id !== undefined\n ? (name) => requestDelete({ ...view, name })\n : undefined\n }\n onRename={(name) => updateSavedViewName(view, name)}\n />\n </li>\n ))}\n </ul>\n </ModalBody>\n <ModalFooter>\n <Button\n ref={doneButtonRef}\n kind=\"primary\"\n label=\"Done\"\n onClick={onClose}\n />\n </ModalFooter>\n {onDelete && (\n <DeleteSavedViewAlertDialog\n open={isDeleteAlertOpen}\n view={viewToDelete}\n onCancel={() => setIsDeleteAlertOpen(false)}\n onConfirm={confirmDelete}\n />\n )}\n </Modal>\n )\n}\n\nManageSavedViewsModal.displayName = \"ManageSavedViewsModal\"\n\n/**\n * Moves focus off a deleted view's row in two steps: `focusAfterDelete` picks\n * the target while the row is still there, and focus moves to it once the\n * alert starts closing.\n */\nfunction useFocusAfterDelete(\n savedViews: SavedView[],\n isDeleteAlertOpen: boolean\n) {\n const listRef = useRef<HTMLUListElement>(null)\n const doneButtonRef = useRef<HTMLButtonElement>(null)\n const focusTargetRef = useRef<HTMLElement | null>(null)\n\n // Step 1: the next view's row, or the previous one's if the deleted view is\n // last, or Done if it's the only one.\n const focusAfterDelete = (view: SavedView) => {\n const rows =\n listRef.current?.querySelectorAll(`.${styles[\"views-list-item\"]}`) ?? []\n const index = savedViews.findIndex(({ id }) => id === view.id)\n const row = rows[index + 1] ?? rows[index - 1]\n focusTargetRef.current =\n row?.querySelector(\"button\") ??\n row?.querySelector(\"input\") ??\n doneButtonRef.current\n }\n\n // Step 2: a closing alert no longer holds focus, and doesn't take it back\n // once focus is outside it.\n useEffect(() => {\n if (isDeleteAlertOpen) return\n focusTargetRef.current?.focus()\n focusTargetRef.current = null\n }, [isDeleteAlertOpen])\n\n return { doneButtonRef, focusAfterDelete, listRef }\n}\n\n/**\n * A saved view's name field and delete button. Renames on blur or Enter. An\n * empty name reverts to the current one. Tracks the last name it sent, so\n * Enter followed by blur renames once. Deleting sends a pending rename first,\n * then passes along the name, so the alert shows what the field does.\n */\nfunction SavedViewRow({\n onDelete,\n onRename,\n readOnly,\n view,\n}: {\n onDelete?: (name: string) => void\n onRename: (name: string) => void\n readOnly: boolean\n view: SavedView\n}) {\n const [name, setName] = useState(view.name)\n const committedName = useRef(view.name)\n\n // Picks up names changed outside this field, including once a rename saves,\n // unless the field has newer edits, which its next blur or Enter sends.\n useEffect(() => {\n const previousName = committedName.current\n committedName.current = view.name\n setName((currentName) =>\n currentName === previousName ? view.name : currentName\n )\n }, [view.name])\n\n const commit = () => {\n const trimmedName = name.trim()\n if (!trimmedName) {\n setName(committedName.current)\n return\n }\n setName(trimmedName)\n if (trimmedName === committedName.current) return\n committedName.current = trimmedName\n onRename(trimmedName)\n }\n\n return (\n <>\n <Input\n autoComplete=\"off\"\n className={styles[\"view-list-item-input\"]}\n hideLabel\n label={`Name for ${view.name}`}\n readOnly={readOnly}\n required={!readOnly}\n value={name}\n onBlur={readOnly ? undefined : commit}\n onChange={(event) => setName(event.target.value)}\n onKeyDown={(event) => {\n if (\n !readOnly &&\n event.key === \"Enter\" &&\n !event.repeat &&\n !event.nativeEvent.isComposing\n ) {\n commit()\n }\n }}\n />\n {onDelete && (\n <IconButton\n aria-label={`Delete ${view.name}`}\n icon={<Icon aria-hidden symbol=\"general#trash\" />}\n kind=\"ghost\"\n tooltip=\"Delete\"\n onClick={(event) => {\n // Safari doesn't focus a button on click, and the alert returns\n // focus to whatever had it when it opened. Focusing also blurs\n // the field, which sends a pending rename.\n event.currentTarget.focus()\n onDelete(committedName.current)\n }}\n />\n )}\n </>\n )\n}\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"ManageSavedViewsModal.js","sources":["../../../src/components/DataTable/ManageSavedViewsModal.tsx"],"sourcesContent":["import { Button, IconButton } from \"@components/button\"\nimport { ToggleIconButton } from \"@components/button/ToggleIconButton\"\nimport { Input } from \"@components/input\"\nimport { Modal, ModalBody, ModalFooter, ModalHeader } from \"@components/modal\"\nimport Icon from \"@utilities/Icon\"\nimport React, { type ReactNode, useEffect, useRef, useState } from \"react\"\nimport { ListDropTargetDelegate } from \"react-aria/ListDropTargetDelegate\"\nimport { ListKeyboardDelegate } from \"react-aria/ListKeyboardDelegate\"\nimport { mergeProps } from \"react-aria/mergeProps\"\nimport { useButton } from \"react-aria/useButton\"\nimport {\n useDraggableCollection,\n useDraggableItem,\n} from \"react-aria/useDraggableCollection\"\nimport {\n type DroppableCollectionReorderEvent,\n type DropTarget,\n useDropIndicator,\n useDroppableCollection,\n} from \"react-aria/useDroppableCollection\"\nimport { useVisuallyHidden } from \"react-aria/VisuallyHidden\"\nimport type { Key } from \"react-aria-components/ListBox\"\nimport { Item } from \"react-stately/Item\"\nimport {\n type DraggableCollectionState,\n useDraggableCollectionState,\n} from \"react-stately/useDraggableCollectionState\"\nimport {\n type DroppableCollectionState,\n useDroppableCollectionState,\n} from \"react-stately/useDroppableCollectionState\"\nimport { useListState } from \"react-stately/useListState\"\n\nimport { DeleteSavedViewAlertDialog } from \"./DeleteSavedViewAlertDialog\"\nimport styles from \"./ManageSavedViewsModal.module.css\"\nimport {\n type SavedView,\n savedViewUpdatesForReorder,\n type StaticView,\n} from \"./savedViews\"\nimport { useUpdateSavedViewName } from \"./useUpdateSavedViewName\"\n\nexport interface ManageSavedViewsModalProps {\n defaultViewId: NonNullable<SavedView[\"id\"]>\n onClose: () => void\n /** Called once the user confirms. Omit to leave out the delete buttons. */\n onDelete?: (savedView: SavedView) => void\n /** Omit to leave out the default view buttons. */\n onSetDefault?: (id: NonNullable<SavedView[\"id\"]>) => void\n onUpdate?: (savedView: SavedView) => Promise<SavedView> | SavedView\n open: boolean\n savedViews: SavedView[]\n /** Listed by name before `savedViews`, since they can't be renamed. */\n staticViews: StaticView[]\n}\n\nexport function ManageSavedViewsModal({\n defaultViewId,\n onClose,\n onDelete,\n onSetDefault,\n onUpdate,\n open,\n savedViews,\n staticViews,\n}: ManageSavedViewsModalProps) {\n const updateSavedViewName = useUpdateSavedViewName(onUpdate)\n // Kept after the alert closes, so its text holds during the exit animation.\n const [viewToDelete, setViewToDelete] = useState<SavedView | null>(null)\n const [isDeleteAlertOpen, setIsDeleteAlertOpen] = useState(false)\n // Without this, focus would go to the modal's close button, since the\n // alert returns it to the delete button, which is gone with its row.\n const { doneButtonRef, focusAfterDelete, listRef } = useFocusAfterDelete(\n savedViews,\n isDeleteAlertOpen\n )\n\n const requestDelete = (view: SavedView) => {\n setViewToDelete(view)\n setIsDeleteAlertOpen(true)\n }\n\n // Deleting the default view hands the default back to \"initial\".\n const confirmDelete = () => {\n if (viewToDelete) {\n focusAfterDelete(viewToDelete)\n onDelete?.(viewToDelete)\n if (viewToDelete.id === defaultViewId) onSetDefault?.(\"initial\")\n }\n setIsDeleteAlertOpen(false)\n }\n\n // The default is matched by id, so an unsaved view can't be made the\n // default. Unsetting the default hands it back to \"initial\".\n const renderDefaultViewToggle = ({ id, name }: SavedView) =>\n onSetDefault && id !== undefined ? (\n <DefaultViewToggle\n isDefault={id === defaultViewId}\n name={name}\n onChange={(isDefault) => onSetDefault(isDefault ? id : \"initial\")}\n />\n ) : null\n\n return (\n <Modal dismissible open={open} onClose={onClose}>\n <ModalHeader title=\"Manage views\" />\n <ModalBody>\n <SavedViewsList\n listRef={listRef}\n renderStaticViewActions={(view) => (\n <>\n {renderDefaultViewToggle(view)}\n {/* Static views can't be deleted, but keep the column lined up. */}\n {onDelete && <DeleteViewButton disabled name={view.name} />}\n </>\n )}\n savedViews={savedViews}\n staticViews={staticViews}\n onUpdate={onUpdate}\n >\n {(view) => (\n <SavedViewRow\n defaultViewToggle={renderDefaultViewToggle(view)}\n hasDeleteButton={Boolean(onDelete)}\n // Updates and deletes are matched by id, so an unsaved view\n // can't be renamed or deleted.\n readOnly={!onUpdate || view.id === undefined}\n view={view}\n onDelete={\n onDelete && view.id !== undefined\n ? (name) => requestDelete({ ...view, name })\n : undefined\n }\n onRename={(name) => updateSavedViewName(view, name)}\n />\n )}\n </SavedViewsList>\n </ModalBody>\n <ModalFooter>\n <Button\n ref={doneButtonRef}\n kind=\"primary\"\n label=\"Done\"\n onClick={onClose}\n />\n </ModalFooter>\n {onDelete && (\n <DeleteSavedViewAlertDialog\n open={isDeleteAlertOpen}\n view={viewToDelete}\n onCancel={() => setIsDeleteAlertOpen(false)}\n onConfirm={confirmDelete}\n />\n )}\n </Modal>\n )\n}\n\nManageSavedViewsModal.displayName = \"ManageSavedViewsModal\"\n\n/**\n * The static views, then the saved views with drag handles. Mounts with the\n * modal's content, since React Aria registers the list as a drop target when\n * its hooks mount, and the modal stays mounted while closed.\n */\nfunction SavedViewsList({\n children,\n listRef,\n onUpdate,\n renderStaticViewActions,\n savedViews,\n staticViews,\n}: {\n children: (view: SavedView) => ReactNode\n listRef: React.RefObject<HTMLOListElement>\n onUpdate?: ManageSavedViewsModalProps[\"onUpdate\"]\n renderStaticViewActions: (view: StaticView) => ReactNode\n savedViews: SavedView[]\n staticViews: StaticView[]\n}) {\n const { collectionProps, dragState, dropState } = useSavedViewsDragAndDrop(\n savedViews,\n listRef,\n onUpdate\n )\n\n return (\n <ol ref={listRef} {...collectionProps} className={styles[\"views-list\"]}>\n {staticViews.map((view) => (\n <li key={view.id} className={styles[\"views-list-item--static\"]}>\n <span className={styles[\"view-list-item-static-name\"]}>\n {view.name}\n </span>\n {renderStaticViewActions(view)}\n </li>\n ))}\n {savedViews.map((view, index) => {\n const key = savedViewKey(view, index)\n return (\n <li\n key={key}\n className={styles[\"views-list-item\"]}\n data-dragging={dragState.isDragging(key) || undefined}\n data-key={key}\n >\n <SavedViewDropIndicator\n dropState={dropState}\n target={{ dropPosition: \"before\", key, type: \"item\" }}\n />\n {/* A single view has no order to change, and updates are matched\n by id, so an unsaved view can't be reordered. */}\n {savedViews.length > 1 && onUpdate && view.id !== undefined && (\n <SavedViewDragHandle\n dragState={dragState}\n itemKey={key}\n name={view.name}\n />\n )}\n {children(view)}\n {index === savedViews.length - 1 && (\n <SavedViewDropIndicator\n dropState={dropState}\n target={{ dropPosition: \"after\", key, type: \"item\" }}\n />\n )}\n </li>\n )\n })}\n </ol>\n )\n}\n\n/** A string, since React Aria's collection keys an `Item` by its React key. */\nfunction savedViewKey(view: SavedView, index: number): Key {\n return String(view.id ?? `unsaved-view-${index}`)\n}\n\n/**\n * Drag and drop for the saved views' rows, which React Aria finds by their\n * `data-key`. A drop sends the views with new sort keys to `onUpdate`, and\n * the row moves once they're passed back in.\n */\nfunction useSavedViewsDragAndDrop(\n savedViews: SavedView[],\n listRef: React.RefObject<HTMLOListElement | null>,\n onUpdate?: ManageSavedViewsModalProps[\"onUpdate\"]\n) {\n const { collection, selectionManager } = useListState({\n children: savedViews.map((view, index) => (\n <Item key={savedViewKey(view, index)} textValue={view.name}>\n {view.name}\n </Item>\n )),\n selectionMode: \"none\",\n })\n\n const dragState = useDraggableCollectionState({\n collection,\n getItems: (keys) =>\n [...keys].map((key) => ({\n \"text/plain\": collection.getItem(key)?.textValue ?? String(key),\n })),\n\n // A drop removes the drop target that had focus, and rows can't take\n // focus, so it goes back to the handle that started the drag.\n onDragEnd: ({ keys }) => {\n const [key] = keys\n listRef.current\n ?.querySelector<HTMLElement>(\n `[data-key=\"${CSS.escape(String(key))}\"] .${styles[\"view-list-item-drag-handle\"]}`\n )\n ?.focus()\n },\n\n // A keyboard drag starts after the focused row, which the rows can't\n // set themselves, since they can't take focus.\n onDragStart: ({ keys }) => {\n const [key] = keys\n selectionManager.setFocusedKey(key)\n },\n selectionManager,\n })\n useDraggableCollection({}, dragState, listRef)\n\n const onReorder = ({ keys, target }: DroppableCollectionReorderEvent) => {\n const indexOf = (key: Key) =>\n savedViews.findIndex((view, index) => savedViewKey(view, index) === key)\n // Rows only offer drop targets between them, not on them.\n if (target.dropPosition === \"on\") return\n const [key] = keys\n const updates = savedViewUpdatesForReorder(\n savedViews,\n indexOf(key),\n indexOf(target.key),\n target.dropPosition\n )\n // Updates are matched by id, so a reorder that needs to update an unsaved\n // view can't be saved in full. Saving part of it would leave the order\n // unchanged anyway.\n if (updates.some((view) => view.id === undefined)) return\n for (const view of updates) onUpdate?.(view)\n }\n const dropState = useDroppableCollectionState({\n collection,\n onReorder,\n selectionManager,\n })\n const { collectionProps } = useDroppableCollection(\n {\n dropTargetDelegate: new ListDropTargetDelegate(collection, listRef),\n keyboardDelegate: new ListKeyboardDelegate({ collection, ref: listRef }),\n onReorder,\n },\n dropState,\n listRef\n )\n\n return { collectionProps, dragState, dropState }\n}\n\n/**\n * Starts a drag with a pointer, or with Enter or Space. A pointer drag shows\n * the whole row, held where the pointer grabbed it, rather than the handle.\n */\nfunction SavedViewDragHandle({\n dragState,\n itemKey,\n name,\n}: {\n dragState: DraggableCollectionState\n itemKey: Key\n name: string\n}) {\n const ref = useRef<HTMLButtonElement>(null)\n const { dragButtonProps, dragProps } = useDraggableItem(\n { hasDragButton: true, key: itemKey },\n dragState\n )\n const { buttonProps } = useButton(dragButtonProps, ref)\n\n return (\n <IconButton\n ref={ref}\n {...mergeProps(buttonProps, dragProps, {\n onDragStart: (event: React.DragEvent<HTMLButtonElement>) => {\n const row = event.currentTarget.closest(\"li\")\n if (!row) return\n const { left, top } = row.getBoundingClientRect()\n // The browser snapshots the row once this handler returns, so the\n // ghost styles apply only to the snapshot.\n const className = styles[\"views-list-item--drag-ghost\"]\n row.classList.add(className)\n requestAnimationFrame(() => row.classList.remove(className))\n event.dataTransfer.setDragImage(\n row,\n event.clientX - left,\n event.clientY - top\n )\n },\n })}\n aria-label={`Reorder ${name}`}\n className={styles[\"view-list-item-drag-handle\"]}\n icon={<Icon aria-hidden symbol=\"general#drag-handle\" />}\n kind=\"ghost\"\n />\n )\n}\n\n/**\n * A line at a row's edge while dragging. Screen readers reach the hidden\n * button inside it as a drop target.\n */\nfunction SavedViewDropIndicator({\n dropState,\n target,\n}: {\n dropState: DroppableCollectionState\n target: DropTarget\n}) {\n const ref = useRef<HTMLDivElement>(null)\n const { dropIndicatorProps, isDropTarget, isHidden } = useDropIndicator(\n { target },\n dropState,\n ref\n )\n const { visuallyHiddenProps } = useVisuallyHidden()\n if (isHidden) return null\n\n return (\n <div\n className={styles[\"view-list-drop-indicator\"]}\n data-drop-position={\n target.type === \"item\" ? target.dropPosition : undefined\n }\n data-drop-target={isDropTarget || undefined}\n >\n <div\n {...visuallyHiddenProps}\n role=\"button\"\n {...dropIndicatorProps}\n ref={ref}\n />\n </div>\n )\n}\n\n/**\n * Moves focus off a deleted view's row in two steps: `focusAfterDelete` picks\n * the target while the row is still there, and focus moves to it once the\n * alert starts closing.\n */\nfunction useFocusAfterDelete(\n savedViews: SavedView[],\n isDeleteAlertOpen: boolean\n) {\n const listRef = useRef<HTMLOListElement>(null)\n const doneButtonRef = useRef<HTMLButtonElement>(null)\n const focusTargetRef = useRef<HTMLElement | null>(null)\n\n // Step 1: the next view's row, or the previous one's if the deleted view is\n // last, or Done if it's the only one.\n const focusAfterDelete = (view: SavedView) => {\n const rows =\n listRef.current?.querySelectorAll(`.${styles[\"views-list-item\"]}`) ?? []\n const index = savedViews.findIndex(({ id }) => id === view.id)\n const row = rows[index + 1] ?? rows[index - 1]\n // The row's last enabled button is its delete button, when it has one.\n const buttons = row?.querySelectorAll<HTMLElement>(\n `button:not(.${styles[\"view-list-item-drag-handle\"]}, :disabled)`\n )\n focusTargetRef.current =\n buttons?.[buttons.length - 1] ??\n row?.querySelector(\"input\") ??\n doneButtonRef.current\n }\n\n // Step 2: a closing alert no longer holds focus, and doesn't take it back\n // once focus is outside it.\n useEffect(() => {\n if (isDeleteAlertOpen) return\n focusTargetRef.current?.focus()\n focusTargetRef.current = null\n }, [isDeleteAlertOpen])\n\n return { doneButtonRef, focusAfterDelete, listRef }\n}\n\n/**\n * A saved view's name field, default view toggle, and delete button. Renames on blur or Enter. An\n * empty name reverts to the current one. Tracks the last name it sent, so\n * Enter followed by blur renames once. Deleting sends a pending rename first,\n * then passes along the name, so the alert shows what the field does.\n */\nfunction SavedViewRow({\n defaultViewToggle,\n hasDeleteButton,\n onDelete,\n onRename,\n readOnly,\n view,\n}: {\n defaultViewToggle: ReactNode\n /** Shows the delete button, disabled without `onDelete`. */\n hasDeleteButton: boolean\n onDelete?: (name: string) => void\n onRename: (name: string) => void\n readOnly: boolean\n view: SavedView\n}) {\n const [name, setName] = useState(view.name)\n const committedName = useRef(view.name)\n\n // Picks up names changed outside this field, including once a rename saves,\n // unless the field has newer edits, which its next blur or Enter sends.\n useEffect(() => {\n const previousName = committedName.current\n committedName.current = view.name\n setName((currentName) =>\n currentName === previousName ? view.name : currentName\n )\n }, [view.name])\n\n const commit = () => {\n const trimmedName = name.trim()\n if (!trimmedName) {\n setName(committedName.current)\n return\n }\n setName(trimmedName)\n if (trimmedName === committedName.current) return\n committedName.current = trimmedName\n onRename(trimmedName)\n }\n\n return (\n <>\n <Input\n autoComplete=\"off\"\n className={styles[\"view-list-item-input\"]}\n hideLabel\n label={`Name for ${view.name}`}\n readOnly={readOnly}\n required={!readOnly}\n value={name}\n onBlur={readOnly ? undefined : commit}\n onChange={(event) => setName(event.target.value)}\n onKeyDown={(event) => {\n if (\n !readOnly &&\n event.key === \"Enter\" &&\n !event.repeat &&\n !event.nativeEvent.isComposing\n ) {\n commit()\n }\n }}\n />\n {defaultViewToggle}\n {hasDeleteButton && (\n <DeleteViewButton\n disabled={!onDelete}\n name={view.name}\n onClick={(event) => {\n // Safari doesn't focus a button on click, and the alert returns\n // focus to whatever had it when it opened. Focusing also blurs\n // the field, which sends a pending rename.\n event.currentTarget.focus()\n onDelete?.(committedName.current)\n }}\n />\n )}\n </>\n )\n}\n\nfunction DeleteViewButton({\n disabled,\n name,\n onClick,\n}: {\n disabled?: boolean\n name: string\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void\n}) {\n return (\n <IconButton\n aria-label={`Delete ${name}`}\n disabled={disabled}\n icon={<Icon aria-hidden symbol=\"general#trash\" />}\n kind=\"ghost\"\n tooltip=\"Delete\"\n onClick={onClick}\n />\n )\n}\n\n/** Makes a view the default, or hands the default back to \"initial\". */\nfunction DefaultViewToggle({\n isDefault,\n name,\n onChange,\n}: {\n isDefault: boolean\n name: string\n onChange: (isDefault: boolean) => void\n}) {\n return (\n <ToggleIconButton\n // Only one view is the default, so its label doesn't need the view's\n // name to be unique.\n aria-label={isDefault ? \"Default view\" : `Set ${name} as default`}\n icon={\n <Icon\n aria-hidden\n symbol={isDefault ? \"general#pin\" : \"general#outlined-pin\"}\n />\n }\n // Only the default's pin is blue.\n kind={isDefault ? \"ghost-interaction\" : \"ghost\"}\n pressed={isDefault}\n tooltip={isDefault ? \"Default view\" : \"Set as default\"}\n onChange={onChange}\n />\n )\n}\n"],"names":["React"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- var styles = {"views-list":"views-list-3AMVI","views-list-item":"views-list-item-cWGsC","view-list-item-input":"view-list-item-input-dowHY","views-list-item--static":"views-list-item--static-9zGpJ"};
1
+ var styles = {"views-list":"views-list-3AMVI","views-list-item":"views-list-item-cWGsC","view-list-drop-indicator":"view-list-drop-indicator-zyDIt","view-list-item-drag-handle":"view-list-item-drag-handle-fiO5Z","views-list-item--drag-ghost":"views-list-item--drag-ghost-zEVbL","view-list-item-input":"view-list-item-input-dowHY","views-list-item--static":"views-list-item--static-9zGpJ","view-list-item-static-name":"view-list-item-static-name-nxBiG"};
2
2
 
3
3
  export { styles as default };
4
4
  //# sourceMappingURL=ManageSavedViewsModal.module.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SavedViewsBar.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/SavedViewsBar.tsx"],"names":[],"mappings":"AAUA,OAAO,KAaN,MAAM,OAAO,CAAA;AAId,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAKjD,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,UAAU,EAChB,MAAM,cAAc,CAAA;AAUrB,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,YAAY,EAAE,CAAA;IAC7B,aAAa,EAAE,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3C,eAAe,EAAE,eAAe,EAAE,CAAA;IAClC,eAAe,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAA;IACrD,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAA;IACvC;;;OAGG;IACH,QAAQ,CAAC,EAAE,CACT,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAC7B,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;IACnC,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAA;IACzC,mDAAmD;IACnD,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAA;IACzD,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;IACnE,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,MAAM,EAAE,IAAI,GAAG,SAAS,CAAA;IACxB,sDAAsD;IACtD,WAAW,EAAE,UAAU,EAAE,CAAA;CAC1B;AAED,wBAAgB,aAAa,CAAC,EAC5B,aAAa,EACb,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,WAAW,EACX,aAAa,EACb,eAAe,EACf,eAAe,EACf,MAAM,GACP,EAAE,kBAAkB,qBAqQpB;yBAlRe,aAAa"}
1
+ {"version":3,"file":"SavedViewsBar.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/SavedViewsBar.tsx"],"names":[],"mappings":"AAWA,OAAO,KAaN,MAAM,OAAO,CAAA;AAId,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAKjD,OAAO,EAGL,KAAK,SAAS,EAEd,KAAK,UAAU,EAChB,MAAM,cAAc,CAAA;AAUrB,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,YAAY,EAAE,CAAA;IAC7B,aAAa,EAAE,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3C,eAAe,EAAE,eAAe,EAAE,CAAA;IAClC,eAAe,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAA;IACrD,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAA;IACvC;;;OAGG;IACH,QAAQ,CAAC,EAAE,CACT,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAC7B,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;IACnC,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAA;IACzC,mDAAmD;IACnD,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAA;IACzD,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;IACnE,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,MAAM,EAAE,IAAI,GAAG,SAAS,CAAA;IACxB,sDAAsD;IACtD,WAAW,EAAE,UAAU,EAAE,CAAA;CAC1B;AAED,wBAAgB,aAAa,CAAC,EAC5B,aAAa,EACb,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,WAAW,EACX,aAAa,EACb,eAAe,EACf,eAAe,EACf,MAAM,GACP,EAAE,kBAAkB,qBAiSpB;yBA9Se,aAAa"}
@@ -1,5 +1,6 @@
1
1
  import { DropdownMenu, DropdownAction, DropdownSeparator } from '../dropdown/Dropdown.js';
2
2
  import { ReorderableListBox, ReorderableListBoxItem } from '../internal/reorderable-list-box/ReorderableListBox.js';
3
+ import Icon from '../../utilities/Icon.js';
3
4
  import classNames from 'classnames';
4
5
  import React__default, { createContext, useRef, useState, useEffect, useContext, useCallback, Fragment } from 'react';
5
6
  import { mergeProps } from 'react-aria/mergeProps';
@@ -9,7 +10,7 @@ import { ManageSavedViewsButton } from './ManageSavedViewsButton.js';
9
10
  import { ManageSavedViewsModal } from './ManageSavedViewsModal.js';
10
11
  import { NewSavedViewButton } from './NewSavedViewButton.js';
11
12
  import { NewSavedViewModal } from './NewSavedViewModal.js';
12
- import { initialView, findActiveSavedView } from './savedViews.js';
13
+ import { initialView, findActiveSavedView, sortKeyAfter } from './savedViews.js';
13
14
  import { useActiveSavedView } from './useActiveSavedView.js';
14
15
  import { useUpdateSavedViewName } from './useUpdateSavedViewName.js';
15
16
 
@@ -57,8 +58,10 @@ function SavedViewsBar({ defaultViewId, onApply, onCreate, onDelete, onSetDefaul
57
58
  setIsDraftOpen(true);
58
59
  };
59
60
  const createSavedView = (view) => {
60
- if (onCreate)
61
- selectWhenSaved(onCreate(view));
61
+ const sortKey = sortKeyAfter(savedViews);
62
+ if (onCreate) {
63
+ selectWhenSaved(onCreate({ ...view, ...(sortKey && { sortKey }) }));
64
+ }
62
65
  };
63
66
  const openNewSavedView = () => {
64
67
  openDraft("New view", "", (name) => createSavedView({
@@ -68,8 +71,9 @@ function SavedViewsBar({ defaultViewId, onApply, onCreate, onDelete, onSetDefaul
68
71
  ...(sortBy && { sort: sortBy }),
69
72
  }));
70
73
  };
71
- // The copy is a new view, so it doesn't keep the original's id.
72
- const duplicateSavedView = ({ id: _id, ...view }) => {
74
+ // The copy is a new view, so it doesn't keep the original's id or place in
75
+ // the order.
76
+ const duplicateSavedView = ({ id: _id, sortKey: _sortKey, ...view }) => {
73
77
  openDraft("Duplicate view", `${view.name} copy`, (name) => createSavedView({ ...view, name }));
74
78
  };
75
79
  const renameSavedView = (view) => {
@@ -150,16 +154,26 @@ function SavedViewsBar({ defaultViewId, onApply, onCreate, onDelete, onSetDefaul
150
154
  onApply(view);
151
155
  } }, ({ id, view }) => {
152
156
  const menu = renderContextMenu(view);
157
+ // The first view is the default unless another is marked.
158
+ const pin = view.id === defaultViewId && id !== items[0].id && (React__default.createElement(Icon, { "aria-hidden": true, className: "tds-data-table-saved-view-default-indicator", symbol: "general#pin" }));
153
159
  return (React__default.createElement(ReorderableListBoxItem, { className: classNames("tds-data-table-saved-view-list-item", {
154
160
  "tds-data-table-saved-view-list-item--default": view.id === defaultViewId,
155
- }), id: id, render: menu
156
- ? (props) => (React__default.createElement(ContextMenuTrigger, { id: view.id, closeOpenContextMenuRef: closeOpenContextMenuRef, menu: menu, optionProps: props }))
157
- : undefined }, view.name));
161
+ }), id: id,
162
+ // The list item only takes text, so the pin goes in here.
163
+ render: (props) => {
164
+ const optionProps = {
165
+ ...props,
166
+ children: (React__default.createElement(React__default.Fragment, null,
167
+ view.name,
168
+ pin)),
169
+ };
170
+ return menu ? (React__default.createElement(ContextMenuTrigger, { id: view.id, closeOpenContextMenuRef: closeOpenContextMenuRef, menu: menu, optionProps: optionProps })) : (React__default.createElement("div", { ...optionProps }));
171
+ } }, view.name));
158
172
  })),
159
173
  onCreate && React__default.createElement(NewSavedViewButton, { onClick: openNewSavedView }),
160
174
  React__default.createElement(NewSavedViewModal, { defaultName: draft?.defaultName, open: isDraftOpen, title: draft?.title, onClose: () => setIsDraftOpen(false), onSave: saveDraft })),
161
175
  views.length > 1 && (React__default.createElement(ManageSavedViewsButton, { onClick: () => setIsManageOpen(true) })),
162
- React__default.createElement(ManageSavedViewsModal, { open: isManageOpen, savedViews: savedViews, staticViews: staticViewsWithInitial, onClose: closeManageViews, onDelete: onDelete, onUpdate: onUpdate }),
176
+ React__default.createElement(ManageSavedViewsModal, { defaultViewId: defaultViewId, open: isManageOpen, savedViews: savedViews, staticViews: staticViewsWithInitial, onClose: closeManageViews, onDelete: onDelete, onSetDefault: onSetDefault, onUpdate: onUpdate }),
163
177
  onDelete && (React__default.createElement(DeleteSavedViewAlertDialog, { open: isDeleteAlertOpen, view: viewToDelete, onCancel: () => setIsDeleteAlertOpen(false), onConfirm: confirmDelete }))));
164
178
  }
165
179
  SavedViewsBar.displayName = "SavedViewsBar";
@@ -1 +1 @@
1
- {"version":3,"file":"SavedViewsBar.js","sources":["../../../src/components/DataTable/SavedViewsBar.tsx"],"sourcesContent":["import {\n DropdownAction,\n DropdownMenu,\n DropdownSeparator,\n} from \"@components/dropdown\"\nimport {\n ReorderableListBox,\n ReorderableListBoxItem,\n} from \"@components/internal/reorderable-list-box\"\nimport classNames from \"classnames\"\nimport React, {\n type ComponentProps,\n createContext,\n Fragment,\n type KeyboardEvent,\n type MutableRefObject,\n type ReactElement,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\"\nimport { mergeProps } from \"react-aria/mergeProps\"\nimport { MenuTrigger, Pressable } from \"react-aria-components/Menu\"\n\nimport type { Sort } from \"./DataTable\"\nimport type { DataTableColumn } from \"./DataTableColumn\"\nimport { DeleteSavedViewAlertDialog } from \"./DeleteSavedViewAlertDialog\"\nimport type { ActiveFilter } from \"./FilterTypes\"\nimport { ManageSavedViewsButton } from \"./ManageSavedViewsButton\"\nimport { ManageSavedViewsModal } from \"./ManageSavedViewsModal\"\nimport { NewSavedViewButton } from \"./NewSavedViewButton\"\nimport { NewSavedViewModal } from \"./NewSavedViewModal\"\nimport {\n findActiveSavedView,\n initialView,\n type SavedView,\n type StaticView,\n} from \"./savedViews\"\nimport { useActiveSavedView } from \"./useActiveSavedView\"\nimport { useUpdateSavedViewName } from \"./useUpdateSavedViewName\"\n\n/**\n * The id of the view the delete alert returns focus to. Read through context\n * so the list's cached items see it without rebuilding the collection.\n */\nconst ReturningFocusViewIdContext = createContext<SavedView[\"id\"] | null>(null)\n\nexport interface SavedViewsBarProps {\n activeFilters: ActiveFilter[]\n defaultViewId: NonNullable<SavedView[\"id\"]>\n hideableColumns: DataTableColumn[]\n isColumnVisible: (column: DataTableColumn) => boolean\n onApply: (savedView: SavedView) => void\n /**\n * Returns the saved view with its new id. Omit to hide the new view button\n * and the Duplicate action.\n */\n onCreate?: (\n savedView: Omit<SavedView, \"id\">\n ) => Promise<SavedView> | SavedView\n /** Called once the user confirms. Omit to leave out the Delete action. */\n onDelete?: (savedView: SavedView) => void\n /** Omit to leave out the Set as default action. */\n onSetDefault?: (id: NonNullable<SavedView[\"id\"]>) => void\n /** Omit to leave out the Rename action. */\n onUpdate?: (savedView: SavedView) => Promise<SavedView> | SavedView\n savedViews: SavedView[]\n sortBy: Sort | undefined\n /** Listed before `savedViews` and can't be edited. */\n staticViews: StaticView[]\n}\n\nexport function SavedViewsBar({\n defaultViewId,\n onApply,\n onCreate,\n onDelete,\n onSetDefault,\n onUpdate,\n savedViews,\n staticViews,\n activeFilters,\n hideableColumns,\n isColumnVisible,\n sortBy,\n}: SavedViewsBarProps) {\n const closeOpenContextMenuRef = useRef<(() => void) | null>(null)\n const hasInitialView = staticViews.some(({ id }) => id === initialView.id)\n const staticViewsWithInitial = hasInitialView\n ? staticViews\n : [initialView, ...staticViews]\n const views = [...staticViewsWithInitial, ...savedViews]\n // The list needs a key for every view, including ones not yet saved.\n const items = views.map((view, index) => ({\n id: view.id ?? `unsaved-view-${index}`,\n view,\n }))\n // What the name modal saves, under the name entered there: a new view, a\n // duplicate, or a rename. It outlives the modal's open state so the title\n // holds while the modal fades out.\n const [draft, setDraft] = useState<{\n defaultName: string\n save: (name: string) => void\n title: string\n }>()\n const [isDraftOpen, setIsDraftOpen] = useState(false)\n const [isManageOpen, setIsManageOpen] = useState(false)\n const barRef = useRef<HTMLDivElement>(null)\n // Kept after the alert closes, so its text holds during the exit animation,\n // and its view keeps the tab stop until focus returns to it on cancel.\n const [viewToDelete, setViewToDelete] = useState<SavedView | null>(null)\n const [isDeleteAlertOpen, setIsDeleteAlertOpen] = useState(false)\n const [isReturningFocus, setIsReturningFocus] = useState(false)\n const hiddenColumnNames = hideableColumns\n .filter((column) => !isColumnVisible(column))\n .map(({ name }) => name)\n // Static views come first, so they win ties with saved views.\n const { activeSavedView, select, selectWhenSaved } = useActiveSavedView(\n views,\n () =>\n findActiveSavedView(views, {\n activeFilters,\n hiddenColumnNames,\n sort: sortBy,\n })\n )\n\n const updateSavedViewName = useUpdateSavedViewName(onUpdate)\n\n const openDraft = (\n title: string,\n defaultName: string,\n save: (name: string) => void\n ) => {\n setDraft({ defaultName, save, title })\n setIsDraftOpen(true)\n }\n\n const createSavedView = (view: Omit<SavedView, \"id\">) => {\n if (onCreate) selectWhenSaved(onCreate(view))\n }\n\n const openNewSavedView = () => {\n openDraft(\"New view\", \"\", (name) =>\n createSavedView({\n activeFilters,\n name,\n ...(hideableColumns.length > 0 && { hiddenColumnNames }),\n ...(sortBy && { sort: sortBy }),\n })\n )\n }\n\n // The copy is a new view, so it doesn't keep the original's id.\n const duplicateSavedView = ({ id: _id, ...view }: SavedView) => {\n openDraft(\"Duplicate view\", `${view.name} copy`, (name) =>\n createSavedView({ ...view, name })\n )\n }\n\n const renameSavedView = (view: SavedView) => {\n openDraft(\"Rename view\", view.name, (name) => {\n if (name !== view.name) updateSavedViewName(view, name)\n })\n }\n\n const saveDraft = (name: string) => {\n setIsDraftOpen(false)\n draft?.save(name)\n }\n\n // Updates and deletes are matched by id, so an unsaved view can't be\n // renamed or deleted. Static views can't be edited at all.\n const isEditable = (view: SavedView) =>\n view.id !== undefined && savedViews.includes(view)\n\n // The menu item Delete was chosen from is gone by now, so the view takes\n // focus first for the alert to return it to on cancel.\n const requestDelete = (view: SavedView) => {\n barRef.current\n ?.querySelector<HTMLElement>(\n `[role=\"option\"][data-key=\"${CSS.escape(String(view.id))}\"]`\n )\n ?.focus()\n setViewToDelete(view)\n setIsDeleteAlertOpen(true)\n setIsReturningFocus(true)\n }\n\n // Lets the tab stop go back to the selected view, where focus lands.\n // Deleting the default view hands the default back to \"initial\".\n const confirmDelete = () => {\n if (viewToDelete) {\n onDelete?.(viewToDelete)\n if (viewToDelete.id === defaultViewId) onSetDefault?.(\"initial\")\n }\n setIsDeleteAlertOpen(false)\n setIsReturningFocus(false)\n }\n\n const focusSelectedViewAfterClose = useFocusSelectedViewAfterClose(\n barRef,\n isManageOpen\n )\n\n // Deleting down to one view hides the button the modal returns focus to.\n const closeManageViews = () => {\n if (views.length <= 1) focusSelectedViewAfterClose()\n setIsManageOpen(false)\n }\n\n // Focus from inside the open alert reaches here too, through the portal.\n const handleFocus = () => {\n if (!isDeleteAlertOpen) setIsReturningFocus(false)\n }\n\n const renderContextMenu = (view: SavedView) => {\n const canRename = onUpdate && isEditable(view)\n const canDelete = onDelete && isEditable(view)\n // The default is matched by id, so an unsaved view can't be made the\n // default. Static views can.\n const { id } = view\n const canSetDefault = onSetDefault && id !== undefined\n const isDefault = id === defaultViewId\n const hasActions = canRename || onCreate || canSetDefault\n if (!hasActions && !canDelete) return null\n return (\n <DropdownMenu>\n {canRename && (\n <DropdownAction id=\"rename\" onAction={() => renameSavedView(view)}>\n Rename\n </DropdownAction>\n )}\n {onCreate && (\n <DropdownAction\n id=\"duplicate\"\n onAction={() => duplicateSavedView(view)}\n >\n Duplicate\n </DropdownAction>\n )}\n {canSetDefault && (\n // Stays in the menu for the default view, disabled, so the user can\n // see which view is the default.\n <DropdownAction\n disabled={isDefault}\n id=\"set-default\"\n onAction={() => onSetDefault(id)}\n >\n {isDefault ? \"Default view\" : \"Set as default\"}\n </DropdownAction>\n )}\n {hasActions && canDelete && <DropdownSeparator />}\n {canDelete && (\n <DropdownAction\n destructive\n id=\"delete\"\n onAction={() => queueMicrotask(() => requestDelete(view))}\n >\n Delete\n </DropdownAction>\n )}\n </DropdownMenu>\n )\n }\n\n return (\n <div\n ref={barRef}\n className=\"tds-data-table-saved-views\"\n onFocus={isReturningFocus ? handleFocus : undefined}\n >\n <div className=\"tds-data-table-saved-views-list\">\n <ReturningFocusViewIdContext.Provider\n value={isReturningFocus ? (viewToDelete?.id ?? null) : null}\n >\n <ReorderableListBox\n items={items}\n label=\"Views\"\n selectedKey={activeSavedView?.id ?? null}\n onSelectionChange={(key) => {\n const view = items.find(({ id }) => id === key)?.view\n if (!view) return\n select(view)\n onApply(view)\n }}\n >\n {({ id, view }) => {\n const menu = renderContextMenu(view)\n return (\n <ReorderableListBoxItem\n className={classNames(\"tds-data-table-saved-view-list-item\", {\n \"tds-data-table-saved-view-list-item--default\":\n view.id === defaultViewId,\n })}\n id={id}\n render={\n menu\n ? (props) => (\n <ContextMenuTrigger\n id={view.id}\n closeOpenContextMenuRef={closeOpenContextMenuRef}\n menu={menu}\n optionProps={props as ComponentProps<\"div\">}\n />\n )\n : undefined\n }\n >\n {view.name}\n </ReorderableListBoxItem>\n )\n }}\n </ReorderableListBox>\n </ReturningFocusViewIdContext.Provider>\n {onCreate && <NewSavedViewButton onClick={openNewSavedView} />}\n <NewSavedViewModal\n defaultName={draft?.defaultName}\n open={isDraftOpen}\n title={draft?.title}\n onClose={() => setIsDraftOpen(false)}\n onSave={saveDraft}\n />\n </div>\n {views.length > 1 && (\n <ManageSavedViewsButton onClick={() => setIsManageOpen(true)} />\n )}\n {/* Rendered apart from the button, so a delete that hides the button doesn't remove the open modal. */}\n <ManageSavedViewsModal\n open={isManageOpen}\n savedViews={savedViews}\n staticViews={staticViewsWithInitial}\n onClose={closeManageViews}\n onDelete={onDelete}\n onUpdate={onUpdate}\n />\n {onDelete && (\n <DeleteSavedViewAlertDialog\n open={isDeleteAlertOpen}\n view={viewToDelete}\n onCancel={() => setIsDeleteAlertOpen(false)}\n onConfirm={confirmDelete}\n />\n )}\n </div>\n )\n}\n\nSavedViewsBar.displayName = \"SavedViewsBar\"\n\n/**\n * Once the manage views modal starts closing, focuses the selected view, or\n * the first one.\n */\nfunction useFocusSelectedViewAfterClose(\n barRef: RefObject<HTMLDivElement>,\n isManageOpen: boolean\n) {\n const shouldFocusRef = useRef(false)\n\n useEffect(() => {\n if (isManageOpen || !shouldFocusRef.current) return\n shouldFocusRef.current = false\n const bar = barRef.current\n ;(\n bar?.querySelector<HTMLElement>(\n '[role=\"option\"][aria-selected=\"true\"]'\n ) ?? bar?.querySelector<HTMLElement>('[role=\"option\"]')\n )?.focus()\n }, [barRef, isManageOpen])\n\n return () => {\n shouldFocusRef.current = true\n }\n}\n\n/**\n * Makes a saved view's option element itself the context menu trigger, so\n * the menu opens by right click, long press, or the keyboard context menu\n * shortcut (Shift+F10, the Menu key, or Ctrl+Enter on macOS), is named by\n * the view, and returns focus to it on close. `Pressable` hands the trigger's\n * handlers to the option element. The option ignores Ctrl+Enter, so the\n * macOS shortcut opens the menu without also selecting the view. The\n * `data-popup-open` attribute keeps the list from moving its tab\n * stop to the selected view while the menu is open. Opening the menu closes\n * any other view's menu, since a right click elsewhere in the list doesn't\n * count as an outside interaction. The open state stays here rather than in\n * the bar, because re-rendering the bar rebuilds the list's collection and\n * moves its tab stop before focus can return to this view. Each\n * `contextmenu` event remounts the menu, because React Aria only positions\n * an open menu once and would leave it at the first click point.\n */\nfunction ContextMenuTrigger({\n closeOpenContextMenuRef,\n id,\n menu,\n optionProps,\n}: {\n closeOpenContextMenuRef: MutableRefObject<(() => void) | null>\n id: SavedView[\"id\"]\n menu: ReactElement\n optionProps: ComponentProps<\"div\">\n}) {\n const { onKeyDown, ...restOptionProps } = optionProps\n const [isOpen, setIsOpen] = useState(false)\n // Such as the delete alert, which returns focus to this view on cancel.\n const hasOtherPopup = useContext(ReturningFocusViewIdContext) === id\n const [menuKey, setMenuKey] = useState(0)\n\n const close = useCallback(() => setIsOpen(false), [])\n const handleOpenChange = (nextIsOpen: boolean) => {\n setIsOpen(nextIsOpen)\n if (nextIsOpen) {\n closeOpenContextMenuRef.current?.()\n closeOpenContextMenuRef.current = close\n } else if (closeOpenContextMenuRef.current === close) {\n closeOpenContextMenuRef.current = null\n }\n }\n\n return (\n <MenuTrigger\n isOpen={isOpen}\n onOpenChange={handleOpenChange}\n trigger=\"contextMenu\"\n >\n <Pressable>\n <div\n {...mergeProps(restOptionProps, {\n \"data-popup-open\": isOpen || hasOtherPopup || undefined,\n onContextMenu: () => setMenuKey((key) => key + 1),\n onKeyDown: (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.ctrlKey && event.key === \"Enter\") return\n onKeyDown?.(event)\n },\n })}\n />\n </Pressable>\n <Fragment key={menuKey}>{menu}</Fragment>\n </MenuTrigger>\n )\n}\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"SavedViewsBar.js","sources":["../../../src/components/DataTable/SavedViewsBar.tsx"],"sourcesContent":["import {\n DropdownAction,\n DropdownMenu,\n DropdownSeparator,\n} from \"@components/dropdown\"\nimport {\n ReorderableListBox,\n ReorderableListBoxItem,\n} from \"@components/internal/reorderable-list-box\"\nimport Icon from \"@utilities/Icon\"\nimport classNames from \"classnames\"\nimport React, {\n type ComponentProps,\n createContext,\n Fragment,\n type KeyboardEvent,\n type MutableRefObject,\n type ReactElement,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\"\nimport { mergeProps } from \"react-aria/mergeProps\"\nimport { MenuTrigger, Pressable } from \"react-aria-components/Menu\"\n\nimport type { Sort } from \"./DataTable\"\nimport type { DataTableColumn } from \"./DataTableColumn\"\nimport { DeleteSavedViewAlertDialog } from \"./DeleteSavedViewAlertDialog\"\nimport type { ActiveFilter } from \"./FilterTypes\"\nimport { ManageSavedViewsButton } from \"./ManageSavedViewsButton\"\nimport { ManageSavedViewsModal } from \"./ManageSavedViewsModal\"\nimport { NewSavedViewButton } from \"./NewSavedViewButton\"\nimport { NewSavedViewModal } from \"./NewSavedViewModal\"\nimport {\n findActiveSavedView,\n initialView,\n type SavedView,\n sortKeyAfter,\n type StaticView,\n} from \"./savedViews\"\nimport { useActiveSavedView } from \"./useActiveSavedView\"\nimport { useUpdateSavedViewName } from \"./useUpdateSavedViewName\"\n\n/**\n * The id of the view the delete alert returns focus to. Read through context\n * so the list's cached items see it without rebuilding the collection.\n */\nconst ReturningFocusViewIdContext = createContext<SavedView[\"id\"] | null>(null)\n\nexport interface SavedViewsBarProps {\n activeFilters: ActiveFilter[]\n defaultViewId: NonNullable<SavedView[\"id\"]>\n hideableColumns: DataTableColumn[]\n isColumnVisible: (column: DataTableColumn) => boolean\n onApply: (savedView: SavedView) => void\n /**\n * Returns the saved view with its new id. Omit to hide the new view button\n * and the Duplicate action.\n */\n onCreate?: (\n savedView: Omit<SavedView, \"id\">\n ) => Promise<SavedView> | SavedView\n /** Called once the user confirms. Omit to leave out the Delete action. */\n onDelete?: (savedView: SavedView) => void\n /** Omit to leave out the Set as default action. */\n onSetDefault?: (id: NonNullable<SavedView[\"id\"]>) => void\n /** Omit to leave out the Rename action. */\n onUpdate?: (savedView: SavedView) => Promise<SavedView> | SavedView\n savedViews: SavedView[]\n sortBy: Sort | undefined\n /** Listed before `savedViews` and can't be edited. */\n staticViews: StaticView[]\n}\n\nexport function SavedViewsBar({\n defaultViewId,\n onApply,\n onCreate,\n onDelete,\n onSetDefault,\n onUpdate,\n savedViews,\n staticViews,\n activeFilters,\n hideableColumns,\n isColumnVisible,\n sortBy,\n}: SavedViewsBarProps) {\n const closeOpenContextMenuRef = useRef<(() => void) | null>(null)\n const hasInitialView = staticViews.some(({ id }) => id === initialView.id)\n const staticViewsWithInitial = hasInitialView\n ? staticViews\n : [initialView, ...staticViews]\n const views = [...staticViewsWithInitial, ...savedViews]\n // The list needs a key for every view, including ones not yet saved.\n const items = views.map((view, index) => ({\n id: view.id ?? `unsaved-view-${index}`,\n view,\n }))\n // What the name modal saves, under the name entered there: a new view, a\n // duplicate, or a rename. It outlives the modal's open state so the title\n // holds while the modal fades out.\n const [draft, setDraft] = useState<{\n defaultName: string\n save: (name: string) => void\n title: string\n }>()\n const [isDraftOpen, setIsDraftOpen] = useState(false)\n const [isManageOpen, setIsManageOpen] = useState(false)\n const barRef = useRef<HTMLDivElement>(null)\n // Kept after the alert closes, so its text holds during the exit animation,\n // and its view keeps the tab stop until focus returns to it on cancel.\n const [viewToDelete, setViewToDelete] = useState<SavedView | null>(null)\n const [isDeleteAlertOpen, setIsDeleteAlertOpen] = useState(false)\n const [isReturningFocus, setIsReturningFocus] = useState(false)\n const hiddenColumnNames = hideableColumns\n .filter((column) => !isColumnVisible(column))\n .map(({ name }) => name)\n // Static views come first, so they win ties with saved views.\n const { activeSavedView, select, selectWhenSaved } = useActiveSavedView(\n views,\n () =>\n findActiveSavedView(views, {\n activeFilters,\n hiddenColumnNames,\n sort: sortBy,\n })\n )\n\n const updateSavedViewName = useUpdateSavedViewName(onUpdate)\n\n const openDraft = (\n title: string,\n defaultName: string,\n save: (name: string) => void\n ) => {\n setDraft({ defaultName, save, title })\n setIsDraftOpen(true)\n }\n\n const createSavedView = (view: Omit<SavedView, \"id\">) => {\n const sortKey = sortKeyAfter(savedViews)\n if (onCreate) {\n selectWhenSaved(onCreate({ ...view, ...(sortKey && { sortKey }) }))\n }\n }\n\n const openNewSavedView = () => {\n openDraft(\"New view\", \"\", (name) =>\n createSavedView({\n activeFilters,\n name,\n ...(hideableColumns.length > 0 && { hiddenColumnNames }),\n ...(sortBy && { sort: sortBy }),\n })\n )\n }\n\n // The copy is a new view, so it doesn't keep the original's id or place in\n // the order.\n const duplicateSavedView = ({\n id: _id,\n sortKey: _sortKey,\n ...view\n }: SavedView) => {\n openDraft(\"Duplicate view\", `${view.name} copy`, (name) =>\n createSavedView({ ...view, name })\n )\n }\n\n const renameSavedView = (view: SavedView) => {\n openDraft(\"Rename view\", view.name, (name) => {\n if (name !== view.name) updateSavedViewName(view, name)\n })\n }\n\n const saveDraft = (name: string) => {\n setIsDraftOpen(false)\n draft?.save(name)\n }\n\n // Updates and deletes are matched by id, so an unsaved view can't be\n // renamed or deleted. Static views can't be edited at all.\n const isEditable = (view: SavedView) =>\n view.id !== undefined && savedViews.includes(view)\n\n // The menu item Delete was chosen from is gone by now, so the view takes\n // focus first for the alert to return it to on cancel.\n const requestDelete = (view: SavedView) => {\n barRef.current\n ?.querySelector<HTMLElement>(\n `[role=\"option\"][data-key=\"${CSS.escape(String(view.id))}\"]`\n )\n ?.focus()\n setViewToDelete(view)\n setIsDeleteAlertOpen(true)\n setIsReturningFocus(true)\n }\n\n // Lets the tab stop go back to the selected view, where focus lands.\n // Deleting the default view hands the default back to \"initial\".\n const confirmDelete = () => {\n if (viewToDelete) {\n onDelete?.(viewToDelete)\n if (viewToDelete.id === defaultViewId) onSetDefault?.(\"initial\")\n }\n setIsDeleteAlertOpen(false)\n setIsReturningFocus(false)\n }\n\n const focusSelectedViewAfterClose = useFocusSelectedViewAfterClose(\n barRef,\n isManageOpen\n )\n\n // Deleting down to one view hides the button the modal returns focus to.\n const closeManageViews = () => {\n if (views.length <= 1) focusSelectedViewAfterClose()\n setIsManageOpen(false)\n }\n\n // Focus from inside the open alert reaches here too, through the portal.\n const handleFocus = () => {\n if (!isDeleteAlertOpen) setIsReturningFocus(false)\n }\n\n const renderContextMenu = (view: SavedView) => {\n const canRename = onUpdate && isEditable(view)\n const canDelete = onDelete && isEditable(view)\n // The default is matched by id, so an unsaved view can't be made the\n // default. Static views can.\n const { id } = view\n const canSetDefault = onSetDefault && id !== undefined\n const isDefault = id === defaultViewId\n const hasActions = canRename || onCreate || canSetDefault\n if (!hasActions && !canDelete) return null\n return (\n <DropdownMenu>\n {canRename && (\n <DropdownAction id=\"rename\" onAction={() => renameSavedView(view)}>\n Rename\n </DropdownAction>\n )}\n {onCreate && (\n <DropdownAction\n id=\"duplicate\"\n onAction={() => duplicateSavedView(view)}\n >\n Duplicate\n </DropdownAction>\n )}\n {canSetDefault && (\n // Stays in the menu for the default view, disabled, so the user can\n // see which view is the default.\n <DropdownAction\n disabled={isDefault}\n id=\"set-default\"\n onAction={() => onSetDefault(id)}\n >\n {isDefault ? \"Default view\" : \"Set as default\"}\n </DropdownAction>\n )}\n {hasActions && canDelete && <DropdownSeparator />}\n {canDelete && (\n <DropdownAction\n destructive\n id=\"delete\"\n onAction={() => queueMicrotask(() => requestDelete(view))}\n >\n Delete\n </DropdownAction>\n )}\n </DropdownMenu>\n )\n }\n\n return (\n <div\n ref={barRef}\n className=\"tds-data-table-saved-views\"\n onFocus={isReturningFocus ? handleFocus : undefined}\n >\n <div className=\"tds-data-table-saved-views-list\">\n <ReturningFocusViewIdContext.Provider\n value={isReturningFocus ? (viewToDelete?.id ?? null) : null}\n >\n <ReorderableListBox\n items={items}\n label=\"Views\"\n selectedKey={activeSavedView?.id ?? null}\n onSelectionChange={(key) => {\n const view = items.find(({ id }) => id === key)?.view\n if (!view) return\n select(view)\n onApply(view)\n }}\n >\n {({ id, view }) => {\n const menu = renderContextMenu(view)\n // The first view is the default unless another is marked.\n const pin = view.id === defaultViewId && id !== items[0].id && (\n <Icon\n aria-hidden\n className=\"tds-data-table-saved-view-default-indicator\"\n symbol=\"general#pin\"\n />\n )\n return (\n <ReorderableListBoxItem\n className={classNames(\"tds-data-table-saved-view-list-item\", {\n \"tds-data-table-saved-view-list-item--default\":\n view.id === defaultViewId,\n })}\n id={id}\n // The list item only takes text, so the pin goes in here.\n render={(props) => {\n const optionProps = {\n ...(props as ComponentProps<\"div\">),\n children: (\n <>\n {view.name}\n {pin}\n </>\n ),\n }\n return menu ? (\n <ContextMenuTrigger\n id={view.id}\n closeOpenContextMenuRef={closeOpenContextMenuRef}\n menu={menu}\n optionProps={optionProps}\n />\n ) : (\n <div {...optionProps} />\n )\n }}\n >\n {view.name}\n </ReorderableListBoxItem>\n )\n }}\n </ReorderableListBox>\n </ReturningFocusViewIdContext.Provider>\n {onCreate && <NewSavedViewButton onClick={openNewSavedView} />}\n <NewSavedViewModal\n defaultName={draft?.defaultName}\n open={isDraftOpen}\n title={draft?.title}\n onClose={() => setIsDraftOpen(false)}\n onSave={saveDraft}\n />\n </div>\n {views.length > 1 && (\n <ManageSavedViewsButton onClick={() => setIsManageOpen(true)} />\n )}\n {/* Rendered apart from the button, so a delete that hides the button doesn't remove the open modal. */}\n <ManageSavedViewsModal\n defaultViewId={defaultViewId}\n open={isManageOpen}\n savedViews={savedViews}\n staticViews={staticViewsWithInitial}\n onClose={closeManageViews}\n onDelete={onDelete}\n onSetDefault={onSetDefault}\n onUpdate={onUpdate}\n />\n {onDelete && (\n <DeleteSavedViewAlertDialog\n open={isDeleteAlertOpen}\n view={viewToDelete}\n onCancel={() => setIsDeleteAlertOpen(false)}\n onConfirm={confirmDelete}\n />\n )}\n </div>\n )\n}\n\nSavedViewsBar.displayName = \"SavedViewsBar\"\n\n/**\n * Once the manage views modal starts closing, focuses the selected view, or\n * the first one.\n */\nfunction useFocusSelectedViewAfterClose(\n barRef: RefObject<HTMLDivElement>,\n isManageOpen: boolean\n) {\n const shouldFocusRef = useRef(false)\n\n useEffect(() => {\n if (isManageOpen || !shouldFocusRef.current) return\n shouldFocusRef.current = false\n const bar = barRef.current\n ;(\n bar?.querySelector<HTMLElement>(\n '[role=\"option\"][aria-selected=\"true\"]'\n ) ?? bar?.querySelector<HTMLElement>('[role=\"option\"]')\n )?.focus()\n }, [barRef, isManageOpen])\n\n return () => {\n shouldFocusRef.current = true\n }\n}\n\n/**\n * Makes a saved view's option element itself the context menu trigger, so\n * the menu opens by right click, long press, or the keyboard context menu\n * shortcut (Shift+F10, the Menu key, or Ctrl+Enter on macOS), is named by\n * the view, and returns focus to it on close. `Pressable` hands the trigger's\n * handlers to the option element. The option ignores Ctrl+Enter, so the\n * macOS shortcut opens the menu without also selecting the view. The\n * `data-popup-open` attribute keeps the list from moving its tab\n * stop to the selected view while the menu is open. Opening the menu closes\n * any other view's menu, since a right click elsewhere in the list doesn't\n * count as an outside interaction. The open state stays here rather than in\n * the bar, because re-rendering the bar rebuilds the list's collection and\n * moves its tab stop before focus can return to this view. Each\n * `contextmenu` event remounts the menu, because React Aria only positions\n * an open menu once and would leave it at the first click point.\n */\nfunction ContextMenuTrigger({\n closeOpenContextMenuRef,\n id,\n menu,\n optionProps,\n}: {\n closeOpenContextMenuRef: MutableRefObject<(() => void) | null>\n id: SavedView[\"id\"]\n menu: ReactElement\n optionProps: ComponentProps<\"div\">\n}) {\n const { onKeyDown, ...restOptionProps } = optionProps\n const [isOpen, setIsOpen] = useState(false)\n // Such as the delete alert, which returns focus to this view on cancel.\n const hasOtherPopup = useContext(ReturningFocusViewIdContext) === id\n const [menuKey, setMenuKey] = useState(0)\n\n const close = useCallback(() => setIsOpen(false), [])\n const handleOpenChange = (nextIsOpen: boolean) => {\n setIsOpen(nextIsOpen)\n if (nextIsOpen) {\n closeOpenContextMenuRef.current?.()\n closeOpenContextMenuRef.current = close\n } else if (closeOpenContextMenuRef.current === close) {\n closeOpenContextMenuRef.current = null\n }\n }\n\n return (\n <MenuTrigger\n isOpen={isOpen}\n onOpenChange={handleOpenChange}\n trigger=\"contextMenu\"\n >\n <Pressable>\n <div\n {...mergeProps(restOptionProps, {\n \"data-popup-open\": isOpen || hasOtherPopup || undefined,\n onContextMenu: () => setMenuKey((key) => key + 1),\n onKeyDown: (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.ctrlKey && event.key === \"Enter\") return\n onKeyDown?.(event)\n },\n })}\n />\n </Pressable>\n <Fragment key={menuKey}>{menu}</Fragment>\n </MenuTrigger>\n )\n}\n"],"names":["React"],"mappings":"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"}
@@ -9,6 +9,11 @@ export interface SavedView {
9
9
  name: string;
10
10
  /** Omit to leave the current sort unchanged when applied. */
11
11
  sort?: Sort;
12
+ /**
13
+ * The view's position, as a fractional index. Views without one are listed
14
+ * after those with one.
15
+ */
16
+ sortKey?: string;
12
17
  }
13
18
  /** An app-provided view. Read-only. */
14
19
  export type StaticView = SavedView & {
@@ -19,6 +24,25 @@ export type StaticView = SavedView & {
19
24
  * views unless one of them uses its id, which replaces it.
20
25
  */
21
26
  export declare const initialView: StaticView;
27
+ /**
28
+ * Views by `sortKey`, then views without one, each in array order. Compares
29
+ * by code unit rather than locale, since keys mix upper and lower case.
30
+ */
31
+ export declare function sortSavedViews(savedViews: SavedView[]): SavedView[];
32
+ /**
33
+ * A `sortKey` after every view's, for a view added at the end. Undefined
34
+ * while any view has no key, since those are listed last, so a view added
35
+ * without one stays at the end.
36
+ */
37
+ export declare function sortKeyAfter(savedViews: SavedView[]): string | undefined;
38
+ /**
39
+ * The views to update so the view at `from` is dropped before or after the
40
+ * view at `target`, both positions in the order. Usually just the dropped
41
+ * view, with a key between its new neighbors'. Dropping among views without
42
+ * a key also gives a key to those before it, since they come after every
43
+ * view with one.
44
+ */
45
+ export declare function savedViewUpdatesForReorder(savedViews: SavedView[], from: number, target: number, dropPosition: "after" | "before"): SavedView[];
22
46
  interface SavedViewState {
23
47
  activeFilters: ActiveFilter[];
24
48
  hiddenColumnNames: string[];