@mano8/astro-media-m8 1.1.0 → 2.0.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.
- package/README.md +54 -11
- package/dist/src/integration.d.ts.map +1 -1
- package/dist/src/integration.js +1 -0
- package/dist/src/integration.js.map +1 -1
- package/dist/src/runtime/api/categories.d.ts +14 -8
- package/dist/src/runtime/api/categories.d.ts.map +1 -1
- package/dist/src/runtime/api/categories.js +21 -8
- package/dist/src/runtime/api/categories.js.map +1 -1
- package/dist/src/runtime/api/index.d.ts +8 -0
- package/dist/src/runtime/api/index.d.ts.map +1 -1
- package/dist/src/runtime/api/index.js +8 -0
- package/dist/src/runtime/api/index.js.map +1 -1
- package/dist/src/runtime/api/transfer.d.ts +19 -0
- package/dist/src/runtime/api/transfer.d.ts.map +1 -0
- package/dist/src/runtime/api/transfer.js +48 -0
- package/dist/src/runtime/api/transfer.js.map +1 -0
- package/dist/src/runtime/client.d.ts.map +1 -1
- package/dist/src/runtime/client.js +7 -1
- package/dist/src/runtime/client.js.map +1 -1
- package/dist/src/runtime/compatibility.d.ts +6 -6
- package/dist/src/runtime/compatibility.d.ts.map +1 -1
- package/dist/src/runtime/compatibility.js +59 -7
- package/dist/src/runtime/compatibility.js.map +1 -1
- package/dist/src/runtime/errors.d.ts +20 -2
- package/dist/src/runtime/errors.d.ts.map +1 -1
- package/dist/src/runtime/errors.js +53 -2
- package/dist/src/runtime/errors.js.map +1 -1
- package/dist/src/runtime/hooks/index.d.ts +2 -0
- package/dist/src/runtime/hooks/index.d.ts.map +1 -1
- package/dist/src/runtime/hooks/index.js +2 -0
- package/dist/src/runtime/hooks/index.js.map +1 -1
- package/dist/src/runtime/hooks/useMediaCategories.d.ts +30 -0
- package/dist/src/runtime/hooks/useMediaCategories.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaCategories.js +56 -0
- package/dist/src/runtime/hooks/useMediaCategories.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaObjects.d.ts.map +1 -1
- package/dist/src/runtime/hooks/useMediaObjects.js +14 -2
- package/dist/src/runtime/hooks/useMediaObjects.js.map +1 -1
- package/dist/src/runtime/hooks/useMediaTransfer.d.ts +42 -0
- package/dist/src/runtime/hooks/useMediaTransfer.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaTransfer.js +106 -0
- package/dist/src/runtime/hooks/useMediaTransfer.js.map +1 -0
- package/dist/src/runtime/queryKeys.d.ts +2 -0
- package/dist/src/runtime/queryKeys.d.ts.map +1 -1
- package/dist/src/runtime/queryKeys.js +2 -0
- package/dist/src/runtime/queryKeys.js.map +1 -1
- package/dist/src/runtime/react/CategoryManager.d.ts +10 -0
- package/dist/src/runtime/react/CategoryManager.d.ts.map +1 -0
- package/dist/src/runtime/react/CategoryManager.js +194 -0
- package/dist/src/runtime/react/CategoryManager.js.map +1 -0
- package/dist/src/runtime/react/CategoryMultiSelect.d.ts +73 -0
- package/dist/src/runtime/react/CategoryMultiSelect.d.ts.map +1 -0
- package/dist/src/runtime/react/CategoryMultiSelect.js +179 -0
- package/dist/src/runtime/react/CategoryMultiSelect.js.map +1 -0
- package/dist/src/runtime/react/MediaCategoryTreePane.d.ts +22 -0
- package/dist/src/runtime/react/MediaCategoryTreePane.d.ts.map +1 -0
- package/dist/src/runtime/react/MediaCategoryTreePane.js +244 -0
- package/dist/src/runtime/react/MediaCategoryTreePane.js.map +1 -0
- package/dist/src/runtime/react/MediaErrorBoundary.d.ts +53 -0
- package/dist/src/runtime/react/MediaErrorBoundary.d.ts.map +1 -0
- package/dist/src/runtime/react/MediaErrorBoundary.js +58 -0
- package/dist/src/runtime/react/MediaErrorBoundary.js.map +1 -0
- package/dist/src/runtime/react/MediaLibrary.d.ts +16 -1
- package/dist/src/runtime/react/MediaLibrary.d.ts.map +1 -1
- package/dist/src/runtime/react/MediaLibrary.js +75 -110
- package/dist/src/runtime/react/MediaLibrary.js.map +1 -1
- package/dist/src/runtime/react/MediaObjectViews.d.ts +47 -0
- package/dist/src/runtime/react/MediaObjectViews.d.ts.map +1 -0
- package/dist/src/runtime/react/MediaObjectViews.js +131 -0
- package/dist/src/runtime/react/MediaObjectViews.js.map +1 -0
- package/dist/src/runtime/react/MediaTransferPanel.d.ts +17 -0
- package/dist/src/runtime/react/MediaTransferPanel.d.ts.map +1 -0
- package/dist/src/runtime/react/MediaTransferPanel.js +93 -0
- package/dist/src/runtime/react/MediaTransferPanel.js.map +1 -0
- package/dist/src/runtime/react/MediaUploadDropzone.d.ts +36 -1
- package/dist/src/runtime/react/MediaUploadDropzone.d.ts.map +1 -1
- package/dist/src/runtime/react/MediaUploadDropzone.js +63 -3
- package/dist/src/runtime/react/MediaUploadDropzone.js.map +1 -1
- package/dist/src/runtime/react/ObjectDetail.d.ts.map +1 -1
- package/dist/src/runtime/react/ObjectDetail.js +51 -1
- package/dist/src/runtime/react/ObjectDetail.js.map +1 -1
- package/dist/src/runtime/react/categoryBranch.d.ts +38 -0
- package/dist/src/runtime/react/categoryBranch.d.ts.map +1 -0
- package/dist/src/runtime/react/categoryBranch.js +37 -0
- package/dist/src/runtime/react/categoryBranch.js.map +1 -0
- package/dist/src/runtime/react/default-ui/index.d.ts +6 -2
- package/dist/src/runtime/react/default-ui/index.d.ts.map +1 -1
- package/dist/src/runtime/react/default-ui/index.js +14 -9
- package/dist/src/runtime/react/default-ui/index.js.map +1 -1
- package/dist/src/runtime/react/index.d.ts +5 -2
- package/dist/src/runtime/react/index.d.ts.map +1 -1
- package/dist/src/runtime/react/index.js +3 -0
- package/dist/src/runtime/react/index.js.map +1 -1
- package/dist/src/runtime/react/mediaLibraryLabels.d.ts +93 -0
- package/dist/src/runtime/react/mediaLibraryLabels.d.ts.map +1 -0
- package/dist/src/runtime/react/mediaLibraryLabels.js +100 -0
- package/dist/src/runtime/react/mediaLibraryLabels.js.map +1 -0
- package/dist/src/runtime/react/mediaLibraryStyles.d.ts +44 -0
- package/dist/src/runtime/react/mediaLibraryStyles.d.ts.map +1 -0
- package/dist/src/runtime/react/mediaLibraryStyles.js +82 -0
- package/dist/src/runtime/react/mediaLibraryStyles.js.map +1 -0
- package/dist/src/runtime/routes.d.ts +2 -0
- package/dist/src/runtime/routes.d.ts.map +1 -1
- package/dist/src/runtime/routes.js +2 -0
- package/dist/src/runtime/routes.js.map +1 -1
- package/dist/src/runtime/schemas.d.ts +265 -0
- package/dist/src/runtime/schemas.d.ts.map +1 -1
- package/dist/src/runtime/schemas.js +173 -6
- package/dist/src/runtime/schemas.js.map +1 -1
- package/dist/src/runtime/upload/uploadController.d.ts +7 -0
- package/dist/src/runtime/upload/uploadController.d.ts.map +1 -1
- package/dist/src/runtime/upload/uploadController.js +10 -5
- package/dist/src/runtime/upload/uploadController.js.map +1 -1
- package/package.json +37 -30
- package/registry/r/media-category-tree.json +21 -0
- package/registry/r/media-dashboard-overview.json +1 -1
- package/registry/r/media-library-tree.json +25 -0
- package/registry/r/media-maintenance-panel.json +3 -2
- package/registry/r/media-transfer-dialog.json +26 -0
- package/registry/r/registry.json +18 -0
- package/registry.json +61 -1
- package/src/routes/categories.astro +12 -0
- package/src/scaffold/styles/media.css +395 -5
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The tree view's left pane: the caller's nested user categories, their counts,
|
|
4
|
+
* and the full `role="tree"` keyboard contract (`U7`).
|
|
5
|
+
*/
|
|
6
|
+
import { useId, useMemo, useRef, useState } from "react";
|
|
7
|
+
import { useCategoryTree } from "../hooks/useMediaCategories.js";
|
|
8
|
+
import { selectedTreeNodeStyle, treeNodeRowClassName, treePaneClassName, treeToggleClassName, treeToggleSpacerClassName } from "./mediaLibraryStyles.js";
|
|
9
|
+
/**
|
|
10
|
+
* Stable pane key for a selection. It addresses the rows for keyboard
|
|
11
|
+
* navigation and seeds each row's generated `aria` ids, so it is derived from
|
|
12
|
+
* the selection rather than taken from the server node.
|
|
13
|
+
*/
|
|
14
|
+
function branchKey(selection) {
|
|
15
|
+
return selection.kind === "category" ? `category-${selection.id}` : selection.kind;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* "All media" / "Uncategorized": the two rows in the pane that are not a
|
|
19
|
+
* server category. They are plain level-1 treeitems with no count badge — the
|
|
20
|
+
* server node counts are per-category, and inventing a total here would be a
|
|
21
|
+
* second, unverifiable source for a number the tree already owns.
|
|
22
|
+
*/
|
|
23
|
+
const PSEUDO_ROWS = [
|
|
24
|
+
{ selection: { kind: "all" } },
|
|
25
|
+
{ selection: { kind: "uncategorized" } }
|
|
26
|
+
];
|
|
27
|
+
function collectBranchRows(nodes, expandedIds, level, parentKey, out) {
|
|
28
|
+
for (const node of nodes) {
|
|
29
|
+
const key = `category-${node.id}`;
|
|
30
|
+
const hasChildren = node.children.length > 0;
|
|
31
|
+
const expanded = hasChildren && expandedIds.has(node.id);
|
|
32
|
+
out.push({
|
|
33
|
+
key,
|
|
34
|
+
selection: { kind: "category", id: node.id },
|
|
35
|
+
level,
|
|
36
|
+
parentKey,
|
|
37
|
+
hasChildren,
|
|
38
|
+
expanded
|
|
39
|
+
});
|
|
40
|
+
if (expanded)
|
|
41
|
+
collectBranchRows(node.children, expandedIds, level + 1, key, out);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function flattenPaneRows(tree, expandedIds) {
|
|
45
|
+
const rows = PSEUDO_ROWS.map(({ selection }) => ({
|
|
46
|
+
key: branchKey(selection),
|
|
47
|
+
selection,
|
|
48
|
+
level: 1,
|
|
49
|
+
parentKey: null,
|
|
50
|
+
hasChildren: false,
|
|
51
|
+
expanded: false
|
|
52
|
+
}));
|
|
53
|
+
collectBranchRows(tree, expandedIds, 1, null, rows);
|
|
54
|
+
return rows;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* One `role="treeitem"` row — a pseudo-row or a category — plus, when it is an
|
|
58
|
+
* expanded branch, the `role="group"` holding its children.
|
|
59
|
+
*
|
|
60
|
+
* The `<li>` carries the tab stop, not the row inside it: a treeitem must not
|
|
61
|
+
* hold its own focusable descendants, so the row that used to be a `<button>`
|
|
62
|
+
* is a non-focusable `<span>` and the pane's keyboard contract covers what the
|
|
63
|
+
* button did. The focus ring is drawn on that row rather than on the `<li>` so
|
|
64
|
+
* it does not wrap the whole subtree.
|
|
65
|
+
*/
|
|
66
|
+
function MediaCategoryTreeItem({ controller, selection, label, level, count, countTitle, hasChildren, expanded, children }) {
|
|
67
|
+
const key = branchKey(selection);
|
|
68
|
+
const isSelected = branchKey(controller.selection) === key;
|
|
69
|
+
const labelId = `${controller.baseId}-${key}-label`;
|
|
70
|
+
const countId = `${controller.baseId}-${key}-count`;
|
|
71
|
+
const modifier = selection.kind === "category" ? "" : ` fa-media-tree-node--${selection.kind}`;
|
|
72
|
+
// Read out of the union once, into a `const`, so the toggle handler keeps a
|
|
73
|
+
// narrowing that a closure over the parameter itself would lose.
|
|
74
|
+
const categoryId = selection.kind === "category" ? selection.id : null;
|
|
75
|
+
return (_jsxs("li", { ref: (element) => {
|
|
76
|
+
controller.registerItem(key, element);
|
|
77
|
+
}, className: `fa-media-tree-node${modifier} rounded-md outline-none`, role: "treeitem", tabIndex: controller.activeKey === key ? 0 : -1, "aria-level": level, "aria-selected": isSelected, "aria-expanded": hasChildren ? expanded : undefined, "aria-labelledby": count === undefined ? labelId : `${labelId} ${countId}`, onKeyDown: (event) => controller.onItemKeyDown(event, key), onFocus: (event) => controller.onItemFocus(event, key), children: [_jsxs("span", { className: treeNodeRowClassName, style: isSelected ? selectedTreeNodeStyle : undefined, onPointerDown: () => controller.onItemPointerDown(key), onClick: () => controller.select(selection), children: [hasChildren && categoryId !== null ? (_jsx("span", { className: treeToggleClassName, "aria-hidden": "true", title: expanded ? controller.labels.collapse(label) : controller.labels.expand(label), onClick: (event) => {
|
|
78
|
+
event.stopPropagation();
|
|
79
|
+
controller.toggle(categoryId);
|
|
80
|
+
}, children: expanded ? "▾" : "▸" })) : (_jsx("span", { className: treeToggleSpacerClassName, "aria-hidden": "true" })), _jsx("span", { id: labelId, className: "fa-media-tree-name whitespace-nowrap", children: label }), count === undefined ? null : (_jsx("span", { id: countId, className: "fa-media-badge fa-media-category-count ml-auto shrink-0", title: countTitle, children: count }))] }), hasChildren && expanded ? (_jsx("ul", { role: "group", className: "fa-media-tree-children m-0 ml-1 list-none border-l border-border p-0 pl-3", children: children })) : null] }));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* One category row plus its subtree in the browse pane.
|
|
84
|
+
*
|
|
85
|
+
* Counts come straight from the server node: the badge shows
|
|
86
|
+
* `total_object_count` (this branch including everything under it) and names
|
|
87
|
+
* both numbers in its `title`, since a parent whose own `object_count` is 0
|
|
88
|
+
* still browses to a non-empty branch.
|
|
89
|
+
*/
|
|
90
|
+
function MediaCategoryBranch({ node, depth, controller }) {
|
|
91
|
+
const hasChildren = node.children.length > 0;
|
|
92
|
+
const expanded = hasChildren && controller.expandedIds.has(node.id);
|
|
93
|
+
return (_jsx(MediaCategoryTreeItem, { controller: controller, selection: { kind: "category", id: node.id }, label: node.name, level: depth, count: node.total_object_count, countTitle: controller.labels.countTitle(node.object_count, node.total_object_count, node.name), hasChildren: hasChildren, expanded: expanded, children: expanded
|
|
94
|
+
? node.children.map((child) => (_jsx(MediaCategoryBranch, { node: child, depth: depth + 1, controller: controller }, child.id)))
|
|
95
|
+
: null }));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The left pane of the tree view: the caller's nested user categories with
|
|
99
|
+
* their counts.
|
|
100
|
+
*
|
|
101
|
+
* `useCategoryTree()` lives **here** rather than in `MediaLibrary` so the
|
|
102
|
+
* category request is only issued once the user actually opens the tree view —
|
|
103
|
+
* the list/grid/masonry views must not pay for a fetch they never render.
|
|
104
|
+
*
|
|
105
|
+
* The a11y contract matches `astro-ui-m8`'s `tree-view` registry block so the
|
|
106
|
+
* runtime pane and the registry skin do not diverge: `role="tree"` /
|
|
107
|
+
* `role="group"` / `role="treeitem"`, `aria-level`, `aria-selected`,
|
|
108
|
+
* `aria-expanded` on parents, a roving tabindex holding exactly one tab stop,
|
|
109
|
+
* and ArrowUp/ArrowDown/Home/End/ArrowRight/ArrowLeft/Enter/Space.
|
|
110
|
+
*/
|
|
111
|
+
export function MediaCategoryTreePane({ selection, onSelect, labels }) {
|
|
112
|
+
const { tree, loading, error } = useCategoryTree();
|
|
113
|
+
const baseId = useId();
|
|
114
|
+
const headingId = `${baseId}-heading`;
|
|
115
|
+
// Expanded ids, not collapsed ones: the pane opens with every branch shut,
|
|
116
|
+
// so a deep tree presents its roots rather than its whole depth at once and
|
|
117
|
+
// the pane starts at the width it can actually show. An empty set is the
|
|
118
|
+
// honest seed for that — the inverted `collapsed` set this replaced could
|
|
119
|
+
// only mean "all open" on first render, because the ids it would have to
|
|
120
|
+
// hold are not known until the tree resolves.
|
|
121
|
+
const [expandedIds, setExpandedIds] = useState(() => new Set());
|
|
122
|
+
const [focusedKey, setFocusedKey] = useState(null);
|
|
123
|
+
const itemsRef = useRef(new Map());
|
|
124
|
+
const rows = useMemo(() => flattenPaneRows(tree, expandedIds), [tree, expandedIds]);
|
|
125
|
+
// Roving tabindex: exactly one treeitem is tabbable — the last focused row
|
|
126
|
+
// while it stays visible, else the selected row, else the first row.
|
|
127
|
+
const selectedKey = branchKey(selection);
|
|
128
|
+
const isVisible = (key) => key !== null && rows.some((row) => row.key === key);
|
|
129
|
+
let activeKey = rows[0]?.key ?? null;
|
|
130
|
+
if (isVisible(focusedKey))
|
|
131
|
+
activeKey = focusedKey;
|
|
132
|
+
else if (isVisible(selectedKey))
|
|
133
|
+
activeKey = selectedKey;
|
|
134
|
+
function registerItem(key, element) {
|
|
135
|
+
if (element === null)
|
|
136
|
+
itemsRef.current.delete(key);
|
|
137
|
+
else
|
|
138
|
+
itemsRef.current.set(key, element);
|
|
139
|
+
}
|
|
140
|
+
function focusItem(key) {
|
|
141
|
+
setFocusedKey(key);
|
|
142
|
+
itemsRef.current.get(key)?.focus();
|
|
143
|
+
}
|
|
144
|
+
// `.at()` rather than an index read, and a negative guard because `.at(-1)`
|
|
145
|
+
// wraps to the end of the list — ArrowUp on the first row must stay put, not
|
|
146
|
+
// jump to the last one.
|
|
147
|
+
function focusAt(index) {
|
|
148
|
+
if (index < 0)
|
|
149
|
+
return;
|
|
150
|
+
const row = rows.at(index);
|
|
151
|
+
if (row !== undefined)
|
|
152
|
+
focusItem(row.key);
|
|
153
|
+
}
|
|
154
|
+
function setExpansion(id, expand) {
|
|
155
|
+
setExpandedIds((previous) => {
|
|
156
|
+
if (previous.has(id) === expand)
|
|
157
|
+
return previous;
|
|
158
|
+
const next = new Set(previous);
|
|
159
|
+
if (expand)
|
|
160
|
+
next.add(id);
|
|
161
|
+
else
|
|
162
|
+
next.delete(id);
|
|
163
|
+
return next;
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
// ArrowRight opens a closed branch, then steps into it; a leaf is a no-op.
|
|
167
|
+
function expandOrEnter(row, index) {
|
|
168
|
+
if (!row.hasChildren || row.selection.kind !== "category")
|
|
169
|
+
return false;
|
|
170
|
+
if (row.expanded)
|
|
171
|
+
focusAt(index + 1);
|
|
172
|
+
else
|
|
173
|
+
setExpansion(row.selection.id, true);
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
// ArrowLeft closes an open branch, else steps out to the parent.
|
|
177
|
+
function collapseOrLeave(row) {
|
|
178
|
+
if (row.hasChildren && row.expanded && row.selection.kind === "category") {
|
|
179
|
+
setExpansion(row.selection.id, false);
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
if (row.parentKey === null)
|
|
183
|
+
return false;
|
|
184
|
+
focusItem(row.parentKey);
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
function applyKey(key, row, index) {
|
|
188
|
+
switch (key) {
|
|
189
|
+
case "ArrowDown":
|
|
190
|
+
focusAt(index + 1);
|
|
191
|
+
return true;
|
|
192
|
+
case "ArrowUp":
|
|
193
|
+
focusAt(index - 1);
|
|
194
|
+
return true;
|
|
195
|
+
case "Home":
|
|
196
|
+
focusAt(0);
|
|
197
|
+
return true;
|
|
198
|
+
case "End":
|
|
199
|
+
focusAt(rows.length - 1);
|
|
200
|
+
return true;
|
|
201
|
+
case "ArrowRight":
|
|
202
|
+
return expandOrEnter(row, index);
|
|
203
|
+
case "ArrowLeft":
|
|
204
|
+
return collapseOrLeave(row);
|
|
205
|
+
case "Enter":
|
|
206
|
+
case " ":
|
|
207
|
+
onSelect(row.selection);
|
|
208
|
+
return true;
|
|
209
|
+
default:
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
const controller = {
|
|
214
|
+
baseId,
|
|
215
|
+
labels,
|
|
216
|
+
selection,
|
|
217
|
+
activeKey,
|
|
218
|
+
expandedIds,
|
|
219
|
+
registerItem,
|
|
220
|
+
select: onSelect,
|
|
221
|
+
toggle: (id) => setExpansion(id, !expandedIds.has(id)),
|
|
222
|
+
onItemKeyDown: (event, key) => {
|
|
223
|
+
// Only the treeitem that actually holds focus reacts; the event bubbles
|
|
224
|
+
// through every ancestor treeitem on its way out.
|
|
225
|
+
if (event.target !== event.currentTarget)
|
|
226
|
+
return;
|
|
227
|
+
const index = rows.findIndex((row) => row.key === key);
|
|
228
|
+
const row = rows.at(index);
|
|
229
|
+
if (index === -1 || row === undefined)
|
|
230
|
+
return;
|
|
231
|
+
if (applyKey(event.key, row, index))
|
|
232
|
+
event.preventDefault();
|
|
233
|
+
},
|
|
234
|
+
onItemFocus: (event, key) => {
|
|
235
|
+
if (event.target === event.currentTarget)
|
|
236
|
+
setFocusedKey(key);
|
|
237
|
+
},
|
|
238
|
+
// A pointer press moves the roving tabindex with it, so a later Tab leaves
|
|
239
|
+
// the pane from the row the user last touched.
|
|
240
|
+
onItemPointerDown: (key) => focusItem(key)
|
|
241
|
+
};
|
|
242
|
+
return (_jsxs("aside", { className: treePaneClassName, "aria-label": labels.regionLabel, children: [_jsx("h3", { id: headingId, children: labels.title }), error ? (_jsx("p", { role: "alert", className: "fa-media-tree-error", children: labels.loadError })) : null, loading && tree.length === 0 ? _jsx("p", { className: "fa-media-category-hint", children: labels.loading }) : null, !loading && !error && tree.length === 0 ? (_jsx("p", { className: "fa-media-category-hint", children: labels.empty })) : null, _jsxs("ul", { role: "tree", "aria-labelledby": headingId, className: "fa-media-tree-nodes m-0 min-w-max list-none p-0", children: [PSEUDO_ROWS.map((row) => (_jsx(MediaCategoryTreeItem, { controller: controller, selection: row.selection, label: row.selection.kind === "all" ? labels.allMedia : labels.uncategorized, level: 1, hasChildren: false, expanded: false }, branchKey(row.selection)))), tree.map((node) => (_jsx(MediaCategoryBranch, { node: node, depth: 1, controller: controller }, node.id)))] })] }));
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=MediaCategoryTreePane.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaCategoryTreePane.js","sourceRoot":"","sources":["../../../../src/runtime/react/MediaCategoryTreePane.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAgG,MAAM,OAAO,CAAC;AACvJ,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AAKjC;;;;GAIG;AACH,SAAS,SAAS,CAAC,SAAkC;IACnD,OAAO,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;AACrF,CAAC;AAED;;;;;GAKG;AACH,MAAM,WAAW,GAA0D;IACzE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;IAC9B,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE;CACzC,CAAC;AAkBF,SAAS,iBAAiB,CACxB,KAA8B,EAC9B,WAAgC,EAChC,KAAa,EACb,SAAwB,EACxB,GAAkB;IAElB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,YAAY,IAAI,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,WAAW,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzD,GAAG,CAAC,IAAI,CAAC;YACP,GAAG;YACH,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE;YAC5C,KAAK;YACL,SAAS;YACT,WAAW;YACX,QAAQ;SACT,CAAC,CAAC;QACH,IAAI,QAAQ;YAAE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAA6B,EAAE,WAAgC;IACtF,MAAM,IAAI,GAAkB,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9D,GAAG,EAAE,SAAS,CAAC,SAAS,CAAC;QACzB,SAAS;QACT,KAAK,EAAE,CAAC;QACR,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,KAAK;QAClB,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC,CAAC;IACJ,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC;AACd,CAAC;AAqBD;;;;;;;;;GASG;AACH,SAAS,qBAAqB,CAAC,EAC7B,UAAU,EACV,SAAS,EACT,KAAK,EACL,KAAK,EACL,KAAK,EACL,UAAU,EACV,WAAW,EACX,QAAQ,EACR,QAAQ,EAWT;IACC,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC;IAC3D,MAAM,OAAO,GAAG,GAAG,UAAU,CAAC,MAAM,IAAI,GAAG,QAAQ,CAAC;IACpD,MAAM,OAAO,GAAG,GAAG,UAAU,CAAC,MAAM,IAAI,GAAG,QAAQ,CAAC;IACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB,SAAS,CAAC,IAAI,EAAE,CAAC;IAC/F,4EAA4E;IAC5E,iEAAiE;IACjE,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAEvE,OAAO,CACL,cACE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE;YACf,UAAU,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC,EACD,SAAS,EAAE,qBAAqB,QAAQ,0BAA0B,EAClE,IAAI,EAAC,UAAU,EACf,QAAQ,EAAE,UAAU,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBACnC,KAAK,mBACF,UAAU,mBACV,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,qBAGhC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,EAAE,EACxE,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,EAC1D,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,aAEtD,gBACE,SAAS,EAAE,oBAAoB,EAC/B,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,EACrD,aAAa,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,EACtD,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,aAE1C,WAAW,IAAI,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,CACpC,eACE,SAAS,EAAE,mBAAmB,iBAClB,MAAM,EAClB,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EACrF,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;4BACjB,KAAK,CAAC,eAAe,EAAE,CAAC;4BACxB,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;wBAChC,CAAC,YAEA,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAChB,CACR,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAE,yBAAyB,iBAAc,MAAM,GAAG,CAClE,EACD,eAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAC,sCAAsC,YAChE,KAAK,GACD,EACN,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC5B,eAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAC,yDAAyD,EAAC,KAAK,EAAE,UAAU,YACrG,KAAK,GACD,CACR,IACI,EACN,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,CACzB,aAAI,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,2EAA2E,YACnG,QAAQ,GACN,CACN,CAAC,CAAC,CAAC,IAAI,IACL,CACN,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,mBAAmB,CAAC,EAC3B,IAAI,EACJ,KAAK,EACL,UAAU,EAKX;IACC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,WAAW,IAAI,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEpE,OAAO,CACL,KAAC,qBAAqB,IACpB,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAC5C,KAAK,EAAE,IAAI,CAAC,IAAI,EAChB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAC9B,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,EAC/F,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,YAEjB,QAAQ;YACP,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC3B,KAAC,mBAAmB,IAAgB,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,UAAU,EAAE,UAAU,IAA/D,KAAK,CAAC,EAAE,CAA2D,CAC9F,CAAC;YACJ,CAAC,CAAC,IAAI,GACc,CACzB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,qBAAqB,CAAC,EACpC,SAAS,EACT,QAAQ,EACR,MAAM,EAKP;IACC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;IACnD,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,GAAG,MAAM,UAAU,CAAC;IACtC,2EAA2E;IAC3E,4EAA4E;IAC5E,yEAAyE;IACzE,0EAA0E;IAC1E,yEAAyE;IACzE,8CAA8C;IAC9C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAsB,GAAG,EAAE,CAAC,IAAI,GAAG,EAAU,CAAC,CAAC;IAC7F,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,GAAG,EAAyB,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IAEpF,2EAA2E;IAC3E,qEAAqE;IACrE,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,CAAC,GAAkB,EAAiB,EAAE,CACtD,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IACtD,IAAI,SAAS,GAAkB,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC;IACpD,IAAI,SAAS,CAAC,UAAU,CAAC;QAAE,SAAS,GAAG,UAAU,CAAC;SAC7C,IAAI,SAAS,CAAC,WAAW,CAAC;QAAE,SAAS,GAAG,WAAW,CAAC;IAEzD,SAAS,YAAY,CAAC,GAAW,EAAE,OAA6B;QAC9D,IAAI,OAAO,KAAK,IAAI;YAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;;YAC9C,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,SAAS,SAAS,CAAC,GAAW;QAC5B,aAAa,CAAC,GAAG,CAAC,CAAC;QACnB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IAED,4EAA4E;IAC5E,6EAA6E;IAC7E,wBAAwB;IACxB,SAAS,OAAO,CAAC,KAAa;QAC5B,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,GAAG,KAAK,SAAS;YAAE,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,SAAS,YAAY,CAAC,EAAU,EAAE,MAAe;QAC/C,cAAc,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC1B,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,MAAM;gBAAE,OAAO,QAAQ,CAAC;YACjD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC/B,IAAI,MAAM;gBAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;gBACpB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,2EAA2E;IAC3E,SAAS,aAAa,CAAC,GAAgB,EAAE,KAAa;QACpD,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QACxE,IAAI,GAAG,CAAC,QAAQ;YAAE,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;;YAChC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iEAAiE;IACjE,SAAS,eAAe,CAAC,GAAgB;QACvC,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACzE,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACzC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,QAAQ,CAAC,GAAW,EAAE,GAAgB,EAAE,KAAa;QAC5D,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,WAAW;gBACd,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,KAAK,SAAS;gBACZ,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,KAAK,MAAM;gBACT,OAAO,CAAC,CAAC,CAAC,CAAC;gBACX,OAAO,IAAI,CAAC;YACd,KAAK,KAAK;gBACR,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACzB,OAAO,IAAI,CAAC;YACd,KAAK,YAAY;gBACf,OAAO,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACnC,KAAK,WAAW;gBACd,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;YAC9B,KAAK,OAAO,CAAC;YACb,KAAK,GAAG;gBACN,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACxB,OAAO,IAAI,CAAC;YACd;gBACE,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAuB;QACrC,MAAM;QACN,MAAM;QACN,SAAS;QACT,SAAS;QACT,WAAW;QACX,YAAY;QACZ,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtD,aAAa,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC5B,wEAAwE;YACxE,kDAAkD;YAClD,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa;gBAAE,OAAO;YACjD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;YACvD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO;YAC9C,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;gBAAE,KAAK,CAAC,cAAc,EAAE,CAAC;QAC9D,CAAC;QACD,WAAW,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC1B,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa;gBAAE,aAAa,CAAC,GAAG,CAAC,CAAC;QAC/D,CAAC;QACD,2EAA2E;QAC3E,+CAA+C;QAC/C,iBAAiB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC;KAC3C,CAAC;IAEF,OAAO,CACL,iBAAO,SAAS,EAAE,iBAAiB,gBAAc,MAAM,CAAC,WAAW,aACjE,aAAI,EAAE,EAAE,SAAS,YAAG,MAAM,CAAC,KAAK,GAAM,EACrC,KAAK,CAAC,CAAC,CAAC,CACP,YAAG,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,qBAAqB,YAC5C,MAAM,CAAC,SAAS,GACf,CACL,CAAC,CAAC,CAAC,IAAI,EACP,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,wBAAwB,YAAE,MAAM,CAAC,OAAO,GAAK,CAAC,CAAC,CAAC,IAAI,EAChG,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACzC,YAAG,SAAS,EAAC,wBAAwB,YAClC,MAAM,CAAC,KAAK,GACX,CACL,CAAC,CAAC,CAAC,IAAI,EACR,cAAI,IAAI,EAAC,MAAM,qBAAkB,SAAS,EAAE,SAAS,EAAC,iDAAiD,aACpG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACxB,KAAC,qBAAqB,IAEpB,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,GAAG,CAAC,SAAS,EACxB,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,EAC5E,KAAK,EAAE,CAAC,EACR,WAAW,EAAE,KAAK,EAClB,QAAQ,EAAE,KAAK,IANV,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAO7B,CACH,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAClB,KAAC,mBAAmB,IAAe,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,UAAU,IAArD,IAAI,CAAC,EAAE,CAAkD,CACpF,CAAC,IACC,IACC,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Island-root error boundary for the media plugin (`A-C3`).
|
|
4
|
+
*
|
|
5
|
+
* Every media view is mounted as an Astro island. A render throw anywhere
|
|
6
|
+
* inside one unmounts the entire island tree, so the route is left with a blank
|
|
7
|
+
* region and a console trace — the same failure the plugin already handles
|
|
8
|
+
* gracefully when a *request* fails, and handled not at all when a *render*
|
|
9
|
+
* fails. This boundary closes that gap.
|
|
10
|
+
*
|
|
11
|
+
* A class on purpose: `getDerivedStateFromError`/`componentDidCatch` still have
|
|
12
|
+
* no hook equivalent.
|
|
13
|
+
*
|
|
14
|
+
* The prop contract mirrors `@mano8/astro-ui-m8`'s canonical `error-boundary`
|
|
15
|
+
* registry block deliberately, so the two can be collapsed onto one
|
|
16
|
+
* implementation once that block is reachable from this package. It is not
|
|
17
|
+
* reachable today: the block ships in an unpublished `astro-ui-m8`, and copied
|
|
18
|
+
* registry items are consumer-side artifacts rather than package runtime.
|
|
19
|
+
*/
|
|
20
|
+
export interface MediaErrorBoundaryFallbackProps {
|
|
21
|
+
error: Error;
|
|
22
|
+
reset: () => void;
|
|
23
|
+
}
|
|
24
|
+
export interface MediaErrorBoundaryLabels {
|
|
25
|
+
title: string;
|
|
26
|
+
description: string;
|
|
27
|
+
retry: string;
|
|
28
|
+
}
|
|
29
|
+
export interface MediaErrorBoundaryProps {
|
|
30
|
+
children: React.ReactNode;
|
|
31
|
+
/** Replaces the default surface. Receives the error and a `reset`. */
|
|
32
|
+
fallback?: (props: MediaErrorBoundaryFallbackProps) => React.ReactNode;
|
|
33
|
+
/** Reporting hook. The boundary never logs on its own. */
|
|
34
|
+
onError?: (error: Error, info: {
|
|
35
|
+
componentStack: string;
|
|
36
|
+
}) => void;
|
|
37
|
+
/** Clears the boundary when any member changes, compared by `Object.is`. */
|
|
38
|
+
resetKeys?: readonly unknown[];
|
|
39
|
+
labels?: Partial<MediaErrorBoundaryLabels>;
|
|
40
|
+
}
|
|
41
|
+
interface MediaErrorBoundaryState {
|
|
42
|
+
error: Error | null;
|
|
43
|
+
}
|
|
44
|
+
export declare class MediaErrorBoundary extends React.Component<MediaErrorBoundaryProps, MediaErrorBoundaryState> {
|
|
45
|
+
state: MediaErrorBoundaryState;
|
|
46
|
+
static getDerivedStateFromError(thrown: unknown): MediaErrorBoundaryState;
|
|
47
|
+
componentDidCatch(thrown: unknown, info: React.ErrorInfo): void;
|
|
48
|
+
componentDidUpdate(previous: MediaErrorBoundaryProps): void;
|
|
49
|
+
reset: () => void;
|
|
50
|
+
render(): React.ReactNode;
|
|
51
|
+
}
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=MediaErrorBoundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaErrorBoundary.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/MediaErrorBoundary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAQD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,+BAA+B,KAAK,KAAK,CAAC,SAAS,CAAC;IACvE,0DAA0D;IAC1D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACnE,4EAA4E;IAC5E,SAAS,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAC5C;AAED,UAAU,uBAAuB;IAC/B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAkBD,qBAAa,kBAAmB,SAAQ,KAAK,CAAC,SAAS,CACrD,uBAAuB,EACvB,uBAAuB,CACxB;IACU,KAAK,EAAE,uBAAuB,CAAmB;IAE1D,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,OAAO,GAAG,uBAAuB;IAIhE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,GAAG,IAAI;IAM/D,kBAAkB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI;IAMpE,KAAK,QAAO,IAAI,CAEd;IAEO,MAAM,IAAI,KAAK,CAAC,SAAS;CA4BnC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
const DEFAULT_LABELS = {
|
|
4
|
+
title: "This view stopped responding",
|
|
5
|
+
description: "The page hit an unexpected error and could not finish rendering.",
|
|
6
|
+
retry: "Reload this view"
|
|
7
|
+
};
|
|
8
|
+
/** `throw "boom"` is legal, so normalize before handing anything on. */
|
|
9
|
+
function toError(thrown) {
|
|
10
|
+
if (thrown instanceof Error)
|
|
11
|
+
return thrown;
|
|
12
|
+
if (typeof thrown === "string")
|
|
13
|
+
return new Error(thrown);
|
|
14
|
+
return new Error("The view failed to render.");
|
|
15
|
+
}
|
|
16
|
+
function resetKeysChanged(previous, next) {
|
|
17
|
+
if (previous === undefined || next === undefined)
|
|
18
|
+
return false;
|
|
19
|
+
if (previous.length !== next.length)
|
|
20
|
+
return true;
|
|
21
|
+
return previous.some((value, index) => !Object.is(value, next[index]));
|
|
22
|
+
}
|
|
23
|
+
export class MediaErrorBoundary extends React.Component {
|
|
24
|
+
state = { error: null };
|
|
25
|
+
static getDerivedStateFromError(thrown) {
|
|
26
|
+
return { error: toError(thrown) };
|
|
27
|
+
}
|
|
28
|
+
componentDidCatch(thrown, info) {
|
|
29
|
+
this.props.onError?.(toError(thrown), {
|
|
30
|
+
componentStack: info.componentStack ?? ""
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
componentDidUpdate(previous) {
|
|
34
|
+
if (this.state.error === null)
|
|
35
|
+
return;
|
|
36
|
+
if (!resetKeysChanged(previous.resetKeys, this.props.resetKeys))
|
|
37
|
+
return;
|
|
38
|
+
this.reset();
|
|
39
|
+
}
|
|
40
|
+
reset = () => {
|
|
41
|
+
this.setState({ error: null });
|
|
42
|
+
};
|
|
43
|
+
render() {
|
|
44
|
+
const { error } = this.state;
|
|
45
|
+
if (error === null)
|
|
46
|
+
return this.props.children;
|
|
47
|
+
if (this.props.fallback) {
|
|
48
|
+
return this.props.fallback({ error, reset: this.reset });
|
|
49
|
+
}
|
|
50
|
+
const labels = { ...DEFAULT_LABELS, ...this.props.labels };
|
|
51
|
+
// The caught message is deliberately not rendered: a render throw carries
|
|
52
|
+
// whatever the failing code put in it — an object key, a URL, a parse
|
|
53
|
+
// fragment — and this is a user-facing surface. A host that wants the
|
|
54
|
+
// detail reads it from `onError` or passes its own `fallback`.
|
|
55
|
+
return (_jsxs("section", { className: "fa-media-panel", "data-media-error-boundary": "fallback", children: [_jsx("h2", { children: labels.title }), _jsx("p", { role: "alert", children: labels.description }), _jsx("button", { type: "button", "data-media-error-boundary-retry": "", onClick: this.reset, children: labels.retry })] }));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=MediaErrorBoundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaErrorBoundary.js","sourceRoot":"","sources":["../../../../src/runtime/react/MediaErrorBoundary.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,21 @@
|
|
|
1
|
+
import { type MediaUploadDropzoneLabels } from "./MediaUploadDropzone.js";
|
|
2
|
+
import { type MediaLibraryLabels } from "./mediaLibraryLabels.js";
|
|
1
3
|
import type { ObjectListParams } from "../schemas.js";
|
|
2
|
-
export
|
|
4
|
+
export type { MediaLibraryLabels };
|
|
5
|
+
export declare function MediaLibrary({ objectHref, initial, initialUploadOpen, labels: labelOverrides }: {
|
|
3
6
|
objectHref?: (id: string) => string;
|
|
4
7
|
initial?: ObjectListParams;
|
|
8
|
+
/** Open the library's upload dialog on first render (legacy upload routes). */
|
|
9
|
+
initialUploadOpen?: boolean;
|
|
10
|
+
labels?: Partial<Omit<MediaLibraryLabels, "views" | "categories" | "statuses" | "tree" | "transfer" | "upload">> & {
|
|
11
|
+
views?: Partial<MediaLibraryLabels["views"]>;
|
|
12
|
+
categories?: Partial<MediaLibraryLabels["categories"]>;
|
|
13
|
+
statuses?: Partial<MediaLibraryLabels["statuses"]>;
|
|
14
|
+
tree?: Partial<MediaLibraryLabels["tree"]>;
|
|
15
|
+
transfer?: Partial<MediaLibraryLabels["transfer"]>;
|
|
16
|
+
upload?: Partial<Omit<MediaLibraryLabels["upload"], "form">> & {
|
|
17
|
+
form?: Partial<MediaUploadDropzoneLabels>;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
5
20
|
}): import("react").JSX.Element;
|
|
6
21
|
//# sourceMappingURL=MediaLibrary.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaLibrary.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/MediaLibrary.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MediaLibrary.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/MediaLibrary.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAgB/F,OAAO,EAAkB,KAAK,kBAAkB,EAAyB,MAAM,yBAAyB,CAAC;AAmBzG,OAAO,KAAK,EAAuD,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAE3G,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAanC,wBAAgB,YAAY,CAAC,EAC3B,UAAU,EACV,OAAY,EACZ,iBAAyB,EACzB,MAAM,EAAE,cAAc,EACvB,EAAE;IACD,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,GAAG,YAAY,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC,CAAC,GAAG;QACjH,KAAK,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7C,UAAU,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC;QACvD,QAAQ,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG;YAC7D,IAAI,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;SAC3C,CAAC;KACH,CAAC;CACH,+BA+OA"}
|