@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
|
@@ -1,118 +1,77 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useEffect, useState } from "react";
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
3
3
|
import { deleteObject } from "../api/objects.js";
|
|
4
|
-
import { useDownloadUrl } from "../hooks/useDownloadUrl.js";
|
|
5
4
|
import { useMediaObjects } from "../hooks/useMediaObjects.js";
|
|
5
|
+
import { MediaUploadDropzone } from "./MediaUploadDropzone.js";
|
|
6
|
+
import { MediaCategoryTreePane } from "./MediaCategoryTreePane.js";
|
|
7
|
+
import { MediaObjectActions, MediaObjectMeta, MediaObjectName, MediaObjectPreview, MediaObjectTable } from "./MediaObjectViews.js";
|
|
8
|
+
import { MediaTransferPanel } from "./MediaTransferPanel.js";
|
|
9
|
+
import { branchListParams, exportBranchLabel, initialBranchSelection } from "./categoryBranch.js";
|
|
10
|
+
import { DEFAULT_LABELS } from "./mediaLibraryLabels.js";
|
|
11
|
+
import { activeViewButtonStyle, buttonClassName, cardBodyClassName, cardClassName, cardMetaClassName, cardTitleClassName, filterRowClassName, gridClassName, inputClassName, masonryClassName, titleRowClassName, toolbarActionsClassName, treeLayoutClassName, treeResultsClassName, viewButtonClassName, viewSwitcherClassName } from "./mediaLibraryStyles.js";
|
|
6
12
|
const STATUS_OPTIONS = [
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
"pending_upload",
|
|
14
|
+
"uploaded",
|
|
15
|
+
"processing",
|
|
16
|
+
"ready",
|
|
17
|
+
"failed",
|
|
18
|
+
"deleted",
|
|
19
|
+
"rejected"
|
|
14
20
|
];
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const cardBodyClassName = "fa-media-card-body grid gap-2 p-3";
|
|
32
|
-
const cardTitleClassName = "m-0 truncate text-sm font-medium leading-5";
|
|
33
|
-
const cardMetaClassName = "fa-media-card-meta flex flex-wrap items-center gap-2 text-xs text-muted-foreground";
|
|
34
|
-
const itemActionsClassName = "fa-media-item-actions flex flex-wrap items-center gap-2";
|
|
35
|
-
const actionLinkClassName = "fa-media-action-link inline-flex min-h-8 items-center rounded-lg border px-3 py-1 text-sm font-medium";
|
|
36
|
-
const listPreviewStyle = {
|
|
37
|
-
aspectRatio: "1 / 1",
|
|
38
|
-
borderRadius: "0.375rem",
|
|
39
|
-
height: "clamp(4rem, 12vw, 8rem)",
|
|
40
|
-
maxHeight: "8rem",
|
|
41
|
-
maxWidth: "8rem",
|
|
42
|
-
objectFit: "cover",
|
|
43
|
-
width: "clamp(4rem, 12vw, 8rem)"
|
|
44
|
-
};
|
|
45
|
-
const activeViewButtonStyle = {
|
|
46
|
-
background: "var(--fa-media-active-bg, var(--foreground, CanvasText))",
|
|
47
|
-
borderColor: "var(--fa-media-active-bg, var(--foreground, CanvasText))",
|
|
48
|
-
color: "var(--fa-media-active-fg, var(--background, Canvas))"
|
|
49
|
-
};
|
|
50
|
-
function isImage(object) {
|
|
51
|
-
return object.mime_type.toLowerCase().startsWith("image/");
|
|
52
|
-
}
|
|
53
|
-
function previewLoadingFor(view, index) {
|
|
54
|
-
if (view === "list")
|
|
55
|
-
return { loading: "lazy", fetchPriority: "low" };
|
|
56
|
-
if (view === "grid" && index < 6)
|
|
57
|
-
return { loading: "eager", fetchPriority: "high" };
|
|
58
|
-
if (view === "masonry" && index < 4)
|
|
59
|
-
return { loading: "eager", fetchPriority: "high" };
|
|
60
|
-
return { loading: "lazy", fetchPriority: "low" };
|
|
61
|
-
}
|
|
62
|
-
function objectLabel(object) {
|
|
63
|
-
return object.original_filename ?? object.id;
|
|
64
|
-
}
|
|
65
|
-
function humanizeBytes(bytes) {
|
|
66
|
-
if (!Number.isFinite(bytes) || bytes < 0)
|
|
67
|
-
return "0 B";
|
|
68
|
-
if (bytes < 1024)
|
|
69
|
-
return `${bytes} B`;
|
|
70
|
-
const units = ["KB", "MB", "GB", "TB"];
|
|
71
|
-
let value = bytes / 1024;
|
|
72
|
-
let unitIndex = 0;
|
|
73
|
-
while (value >= 1024 && unitIndex < units.length - 1) {
|
|
74
|
-
value /= 1024;
|
|
75
|
-
unitIndex += 1;
|
|
76
|
-
}
|
|
77
|
-
return `${value.toFixed(value >= 10 ? 0 : 1)} ${units.at(unitIndex) ?? "TB"}`;
|
|
78
|
-
}
|
|
79
|
-
function statusLabel(status) {
|
|
80
|
-
return STATUS_OPTIONS.find((option) => option.value === status)?.label ?? status;
|
|
81
|
-
}
|
|
82
|
-
function MediaObjectPreview({ object, view, index }) {
|
|
83
|
-
const { data, loading, error, request } = useDownloadUrl(isImage(object) ? object.id : null);
|
|
84
|
-
const loadingMode = previewLoadingFor(view, index);
|
|
85
|
-
useEffect(() => {
|
|
86
|
-
if (!isImage(object) || data || loading || error)
|
|
87
|
-
return;
|
|
88
|
-
void request();
|
|
89
|
-
}, [data, error, loading, object, request]);
|
|
90
|
-
if (!isImage(object)) {
|
|
91
|
-
return (_jsx("span", { className: `${previewPlaceholderClassName} fa-media-preview--file`, style: view === "list" ? listPreviewStyle : undefined, "aria-hidden": "true", children: object.extension ?? "file" }));
|
|
92
|
-
}
|
|
93
|
-
if (!data) {
|
|
94
|
-
return (_jsx("span", { className: `${previewPlaceholderClassName} fa-media-preview--loading`, style: view === "list" ? listPreviewStyle : undefined, "aria-label": `${objectLabel(object)} preview loading`, children: loading ? "Loading" : "Preview" }));
|
|
95
|
-
}
|
|
96
|
-
return (_jsx("img", { className: view === "list" ? previewClassName : `${previewClassName} ${cardPreviewClassName}`, src: data.url, alt: objectLabel(object), style: view === "list" ? listPreviewStyle : undefined, width: view === "list" ? 128 : undefined, height: view === "list" ? 128 : undefined, loading: loadingMode.loading, decoding: "async", fetchPriority: loadingMode.fetchPriority }));
|
|
97
|
-
}
|
|
98
|
-
function MediaObjectName({ object, objectHref }) {
|
|
99
|
-
const label = objectLabel(object);
|
|
100
|
-
return objectHref ? _jsx("a", { href: objectHref(object.id), children: label }) : label;
|
|
101
|
-
}
|
|
102
|
-
function MediaObjectMeta({ object }) {
|
|
103
|
-
return (_jsxs(_Fragment, { children: [_jsx("span", { children: object.category }), _jsx("span", { className: `fa-media-badge fa-media-badge--${object.status}`, children: statusLabel(object.status) }), _jsx("span", { children: humanizeBytes(object.size_bytes) })] }));
|
|
104
|
-
}
|
|
105
|
-
function MediaObjectActions({ object, objectHref, deletingId, onDelete }) {
|
|
106
|
-
const label = objectLabel(object);
|
|
107
|
-
const href = objectHref?.(object.id);
|
|
108
|
-
return (_jsxs("div", { className: itemActionsClassName, children: [href ? (_jsx("a", { className: actionLinkClassName, href: href, "aria-label": `View ${label}`, children: "View" })) : null, _jsx("button", { type: "button", className: "fa-media-danger", disabled: deletingId === object.id, onClick: () => void onDelete(object), children: "Delete" })] }));
|
|
109
|
-
}
|
|
110
|
-
export function MediaLibrary({ objectHref, initial = {} }) {
|
|
21
|
+
const VIEW_OPTIONS = ["list", "grid", "masonry", "tree"];
|
|
22
|
+
export function MediaLibrary({ objectHref, initial = {}, initialUploadOpen = false, labels: labelOverrides }) {
|
|
23
|
+
const labels = useMemo(() => ({
|
|
24
|
+
...DEFAULT_LABELS,
|
|
25
|
+
...labelOverrides,
|
|
26
|
+
views: { ...DEFAULT_LABELS.views, ...labelOverrides?.views },
|
|
27
|
+
categories: { ...DEFAULT_LABELS.categories, ...labelOverrides?.categories },
|
|
28
|
+
statuses: { ...DEFAULT_LABELS.statuses, ...labelOverrides?.statuses },
|
|
29
|
+
tree: { ...DEFAULT_LABELS.tree, ...labelOverrides?.tree },
|
|
30
|
+
transfer: { ...DEFAULT_LABELS.transfer, ...labelOverrides?.transfer },
|
|
31
|
+
upload: {
|
|
32
|
+
...DEFAULT_LABELS.upload,
|
|
33
|
+
...labelOverrides?.upload,
|
|
34
|
+
form: { ...DEFAULT_LABELS.upload.form, ...labelOverrides?.upload?.form }
|
|
35
|
+
}
|
|
36
|
+
}), [labelOverrides]);
|
|
111
37
|
const [query, setQuery] = useState(initial);
|
|
112
38
|
const [view, setView] = useState("list");
|
|
39
|
+
// Which branch the tree pane has selected. It is kept beside `query` rather
|
|
40
|
+
// than derived from it because "all" and an absent branch filter are the same
|
|
41
|
+
// params but not the same pane state.
|
|
42
|
+
const [branchSelection, setBranchSelection] = useState(() => initialBranchSelection(initial));
|
|
113
43
|
const [deletingId, setDeletingId] = useState(null);
|
|
114
44
|
const [actionError, setActionError] = useState(null);
|
|
45
|
+
const [transferOpen, setTransferOpen] = useState(false);
|
|
46
|
+
const [uploadOpen, setUploadOpen] = useState(initialUploadOpen);
|
|
47
|
+
const uploadCloseRef = useRef(null);
|
|
115
48
|
const { items, count, loading, error, hasMore, refresh, loadMore } = useMediaObjects(query);
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
if (!uploadOpen)
|
|
51
|
+
return;
|
|
52
|
+
const previousActive = document.activeElement instanceof HTMLElement ? document.activeElement : null;
|
|
53
|
+
uploadCloseRef.current?.focus();
|
|
54
|
+
const closeOnEscape = (event) => {
|
|
55
|
+
if (event.key !== "Escape")
|
|
56
|
+
return;
|
|
57
|
+
event.preventDefault();
|
|
58
|
+
setUploadOpen(false);
|
|
59
|
+
};
|
|
60
|
+
document.addEventListener("keydown", closeOnEscape);
|
|
61
|
+
return () => {
|
|
62
|
+
document.removeEventListener("keydown", closeOnEscape);
|
|
63
|
+
previousActive?.focus();
|
|
64
|
+
};
|
|
65
|
+
}, [uploadOpen]);
|
|
66
|
+
/**
|
|
67
|
+
* Patches the branch params onto `query` rather than replacing it, so the
|
|
68
|
+
* toolbar's search / enum category / status filters stay live and compose
|
|
69
|
+
* with the selected branch.
|
|
70
|
+
*/
|
|
71
|
+
function handleBranchSelect(selection) {
|
|
72
|
+
setBranchSelection(selection);
|
|
73
|
+
setQuery((prev) => ({ ...prev, ...branchListParams(selection) }));
|
|
74
|
+
}
|
|
116
75
|
async function handleDelete(object) {
|
|
117
76
|
setActionError(null);
|
|
118
77
|
setDeletingId(object.id);
|
|
@@ -121,21 +80,27 @@ export function MediaLibrary({ objectHref, initial = {} }) {
|
|
|
121
80
|
await refresh();
|
|
122
81
|
}
|
|
123
82
|
catch {
|
|
124
|
-
setActionError(
|
|
83
|
+
setActionError(labels.deleteError);
|
|
125
84
|
}
|
|
126
85
|
finally {
|
|
127
86
|
setDeletingId(null);
|
|
128
87
|
}
|
|
129
88
|
}
|
|
130
|
-
return (_jsxs("section", { className: "not-content fa-media-panel", children: [_jsxs("header", { className: "fa-media-toolbar", children: [_jsxs("div", { className: titleRowClassName, children: [_jsxs("h2", { children: ["
|
|
89
|
+
return (_jsxs("section", { className: "not-content fa-media-panel", children: [_jsxs("header", { className: "fa-media-toolbar", children: [_jsxs("div", { className: titleRowClassName, children: [_jsxs("h2", { children: [labels.title, " (", count, ")"] }), _jsxs("div", { className: toolbarActionsClassName, children: [_jsx("div", { className: viewSwitcherClassName, "aria-label": labels.viewLabel, children: VIEW_OPTIONS.map((value) => (_jsx("button", { type: "button", "aria-pressed": view === value, className: viewButtonClassName, style: view === value ? activeViewButtonStyle : undefined, onClick: () => setView(value), children: labels.views[value] }, value))) }), _jsx("button", { type: "button", className: buttonClassName, "aria-pressed": transferOpen, "aria-expanded": transferOpen, "aria-controls": "fa-media-transfer-panel", onClick: () => setTransferOpen((open) => !open), children: labels.importExport }), _jsx("button", { type: "button", className: buttonClassName, onClick: () => setUploadOpen(true), children: labels.uploadMedia })] })] }), _jsxs("div", { className: filterRowClassName, children: [_jsx("input", { className: inputClassName, type: "search", "aria-label": labels.searchLabel, placeholder: labels.searchPlaceholder, onChange: (event) => {
|
|
131
90
|
const q = event.currentTarget.value || undefined;
|
|
132
91
|
setQuery((prev) => ({ ...prev, q }));
|
|
133
92
|
} }), _jsxs("select", { className: inputClassName, onChange: (event) => {
|
|
134
93
|
const category = (event.currentTarget.value || undefined);
|
|
135
94
|
setQuery((prev) => ({ ...prev, category }));
|
|
136
|
-
}, children: [_jsx("option", { value: "", children:
|
|
95
|
+
}, children: [_jsx("option", { value: "", children: labels.allCategories }), ["avatar", "document", "asset", "chat_attachment", "export", "receipt"].map((value) => (_jsx("option", { value: value, children: labels.categories[value] }, value)))] }), _jsxs("select", { className: inputClassName, onChange: (event) => {
|
|
137
96
|
const status = (event.currentTarget.value || undefined);
|
|
138
97
|
setQuery((prev) => ({ ...prev, status }));
|
|
139
|
-
}, children: [_jsx("option", { value: "", children:
|
|
98
|
+
}, children: [_jsx("option", { value: "", children: labels.allStatuses }), STATUS_OPTIONS.map((value) => (_jsx("option", { value: value, children: labels.statuses[value] }, value)))] })] })] }), transferOpen ? (_jsx("div", { id: "fa-media-transfer-panel", children: _jsx(MediaTransferPanel, { filters: query, exportScopeLabel: view === "tree" ? exportBranchLabel(branchSelection, labels.tree) : undefined, labels: labels.transfer }) })) : null, uploadOpen ? (_jsx("div", { className: "fa-media-dialog-backdrop", onMouseDown: (event) => {
|
|
99
|
+
if (event.target === event.currentTarget)
|
|
100
|
+
setUploadOpen(false);
|
|
101
|
+
}, children: _jsxs("div", { className: "fa-media-dialog", role: "dialog", "aria-modal": "true", "aria-labelledby": "fa-media-upload-dialog-title", children: [_jsxs("header", { className: "fa-media-dialog-header", children: [_jsx("h2", { id: "fa-media-upload-dialog-title", children: labels.upload.title }), _jsx("button", { ref: uploadCloseRef, type: "button", "aria-label": labels.upload.closeLabel, onClick: () => setUploadOpen(false), children: labels.upload.close })] }), _jsx(MediaUploadDropzone, { heading: false, labels: labels.upload.form, onUploaded: () => {
|
|
102
|
+
setUploadOpen(false);
|
|
103
|
+
void refresh();
|
|
104
|
+
} })] }) })) : null, error ? _jsx("p", { role: "alert", children: labels.loadError }) : null, actionError ? _jsx("p", { role: "alert", children: actionError }) : null, view === "tree" ? (_jsxs("div", { className: treeLayoutClassName, children: [_jsx(MediaCategoryTreePane, { selection: branchSelection, onSelect: handleBranchSelect, labels: labels.tree }), _jsx("div", { className: treeResultsClassName, children: _jsx(MediaObjectTable, { items: items, view: view, objectHref: objectHref, deletingId: deletingId, onDelete: handleDelete, labels: labels }) })] })) : view === "list" ? (_jsx(MediaObjectTable, { items: items, view: view, objectHref: objectHref, deletingId: deletingId, onDelete: handleDelete, labels: labels })) : (_jsx("div", { className: view === "grid" ? gridClassName : masonryClassName, children: items.map((object, index) => (_jsxs("article", { className: cardClassName, children: [_jsx(MediaObjectPreview, { object: object, view: view, index: index, labels: labels }), _jsxs("div", { className: cardBodyClassName, children: [_jsx("h3", { className: cardTitleClassName, children: _jsx(MediaObjectName, { object: object, objectHref: objectHref }) }), _jsx("div", { className: cardMetaClassName, children: _jsx(MediaObjectMeta, { object: object, labels: labels }) }), _jsx(MediaObjectActions, { object: object, objectHref: objectHref, deletingId: deletingId, onDelete: handleDelete, labels: labels })] })] }, object.id))) })), loading ? _jsx("p", { children: labels.loading }) : null, hasMore ? (_jsx("button", { type: "button", disabled: loading, onClick: () => void loadMore(), children: labels.loadMore })) : null] }));
|
|
140
105
|
}
|
|
141
106
|
//# sourceMappingURL=MediaLibrary.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaLibrary.js","sourceRoot":"","sources":["../../../../src/runtime/react/MediaLibrary.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"MediaLibrary.js","sourceRoot":"","sources":["../../../../src/runtime/react/MediaLibrary.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { MediaLibraryLabels, MediaLibraryView } from "./mediaLibraryLabels.js";
|
|
2
|
+
import type { MediaObjectPublic, MediaObjectStatus } from "../schemas.js";
|
|
3
|
+
/**
|
|
4
|
+
* `tree` renders the **same** table body as `list` in its right pane, so every
|
|
5
|
+
* "is this the list layout?" branch (preview sizing, `<img>` classes) has to
|
|
6
|
+
* answer yes for it too. Forking a second table — and a second set of preview
|
|
7
|
+
* rules — is exactly what this predicate exists to prevent.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isListLayout(view: MediaLibraryView): boolean;
|
|
10
|
+
export declare function objectLabel(object: MediaObjectPublic): string;
|
|
11
|
+
export declare function humanizeBytes(bytes: number): string;
|
|
12
|
+
export declare function statusLabel(status: MediaObjectStatus, labels: MediaLibraryLabels): string;
|
|
13
|
+
export declare function MediaObjectPreview({ object, view, index, labels }: {
|
|
14
|
+
object: MediaObjectPublic;
|
|
15
|
+
view: MediaLibraryView;
|
|
16
|
+
index: number;
|
|
17
|
+
labels: MediaLibraryLabels;
|
|
18
|
+
}): import("react").JSX.Element;
|
|
19
|
+
export declare function MediaObjectName({ object, objectHref }: {
|
|
20
|
+
object: MediaObjectPublic;
|
|
21
|
+
objectHref?: (id: string) => string;
|
|
22
|
+
}): string | import("react").JSX.Element;
|
|
23
|
+
export declare function MediaObjectMeta({ object, labels }: {
|
|
24
|
+
object: MediaObjectPublic;
|
|
25
|
+
labels: MediaLibraryLabels;
|
|
26
|
+
}): import("react").JSX.Element;
|
|
27
|
+
export declare function MediaObjectActions({ object, objectHref, deletingId, onDelete, labels }: {
|
|
28
|
+
object: MediaObjectPublic;
|
|
29
|
+
objectHref?: (id: string) => string;
|
|
30
|
+
deletingId: string | null;
|
|
31
|
+
onDelete: (object: MediaObjectPublic) => Promise<void>;
|
|
32
|
+
labels: MediaLibraryLabels;
|
|
33
|
+
}): import("react").JSX.Element;
|
|
34
|
+
/**
|
|
35
|
+
* The list body, extracted verbatim so `view === "tree"` can render **this**
|
|
36
|
+
* table in its right pane instead of forking a second one. `view` still rides
|
|
37
|
+
* along untouched because `MediaObjectPreview` keys its sizing off it.
|
|
38
|
+
*/
|
|
39
|
+
export declare function MediaObjectTable({ items, view, objectHref, deletingId, onDelete, labels }: {
|
|
40
|
+
items: readonly MediaObjectPublic[];
|
|
41
|
+
view: MediaLibraryView;
|
|
42
|
+
objectHref?: (id: string) => string;
|
|
43
|
+
deletingId: string | null;
|
|
44
|
+
onDelete: (object: MediaObjectPublic) => Promise<void>;
|
|
45
|
+
labels: MediaLibraryLabels;
|
|
46
|
+
}): import("react").JSX.Element;
|
|
47
|
+
//# sourceMappingURL=MediaObjectViews.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaObjectViews.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/MediaObjectViews.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAY1E;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAE5D;AAeD,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAE7D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAcnD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAEzF;AAkED,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,IAAI,EACJ,KAAK,EACL,MAAM,EACP,EAAE;IACD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,kBAAkB,CAAC;CAC5B,+BAuCA;AAED,wBAAgB,eAAe,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,wCAGzH;AAED,wBAAgB,eAAe,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,+BAS5G;AAED,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,UAAU,EACV,UAAU,EACV,QAAQ,EACR,MAAM,EACP,EAAE;IACD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,EAAE,kBAAkB,CAAC;CAC5B,+BAgBA;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,IAAI,EACJ,UAAU,EACV,UAAU,EACV,QAAQ,EACR,MAAM,EACP,EAAE;IACD,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACpC,IAAI,EAAE,gBAAgB,CAAC;IACvB,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,EAAE,kBAAkB,CAAC;CAC5B,+BA0CA"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* How one media object is drawn: its preview, name, metadata, row actions, and
|
|
4
|
+
* the results table the list and tree views share.
|
|
5
|
+
*
|
|
6
|
+
* Split out of `MediaLibrary` so the library module is the view state, the
|
|
7
|
+
* filters and the toolbar — not also every cell of the table it renders.
|
|
8
|
+
*/
|
|
9
|
+
import { useEffect } from "react";
|
|
10
|
+
import { useDownloadUrl } from "../hooks/useDownloadUrl.js";
|
|
11
|
+
import { actionLinkClassName, cardPreviewClassName, itemActionsClassName, listPreviewStyle, previewClassName, previewPlaceholderClassName } from "./mediaLibraryStyles.js";
|
|
12
|
+
function isImage(object) {
|
|
13
|
+
return object.mime_type.toLowerCase().startsWith("image/");
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* `tree` renders the **same** table body as `list` in its right pane, so every
|
|
17
|
+
* "is this the list layout?" branch (preview sizing, `<img>` classes) has to
|
|
18
|
+
* answer yes for it too. Forking a second table — and a second set of preview
|
|
19
|
+
* rules — is exactly what this predicate exists to prevent.
|
|
20
|
+
*/
|
|
21
|
+
export function isListLayout(view) {
|
|
22
|
+
return view === "list" || view === "tree";
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* `tree`'s right pane renders the same table as `list` (`isListLayout`), so it
|
|
26
|
+
* gets the same lazy/low preview loading — spelled out explicitly rather than
|
|
27
|
+
* left to the trailing fallback, so a future view added to the fallthrough
|
|
28
|
+
* cannot silently inherit `tree`'s eager-loading exemption by accident.
|
|
29
|
+
*/
|
|
30
|
+
function previewLoadingFor(view, index) {
|
|
31
|
+
if (view === "list" || view === "tree")
|
|
32
|
+
return { loading: "lazy", fetchPriority: "low" };
|
|
33
|
+
if (view === "grid" && index < 6)
|
|
34
|
+
return { loading: "eager", fetchPriority: "high" };
|
|
35
|
+
if (view === "masonry" && index < 4)
|
|
36
|
+
return { loading: "eager", fetchPriority: "high" };
|
|
37
|
+
return { loading: "lazy", fetchPriority: "low" };
|
|
38
|
+
}
|
|
39
|
+
export function objectLabel(object) {
|
|
40
|
+
return object.original_filename ?? object.id;
|
|
41
|
+
}
|
|
42
|
+
export function humanizeBytes(bytes) {
|
|
43
|
+
if (!Number.isFinite(bytes) || bytes < 0)
|
|
44
|
+
return "0 B";
|
|
45
|
+
if (bytes < 1024)
|
|
46
|
+
return `${bytes} B`;
|
|
47
|
+
const units = ["KB", "MB", "GB", "TB"];
|
|
48
|
+
let value = bytes / 1024;
|
|
49
|
+
let unitIndex = 0;
|
|
50
|
+
while (value >= 1024 && unitIndex < units.length - 1) {
|
|
51
|
+
value /= 1024;
|
|
52
|
+
unitIndex += 1;
|
|
53
|
+
}
|
|
54
|
+
return `${value.toFixed(value >= 10 ? 0 : 1)} ${units.at(unitIndex) ?? "TB"}`;
|
|
55
|
+
}
|
|
56
|
+
export function statusLabel(status, labels) {
|
|
57
|
+
return labels.statuses[status] ?? status;
|
|
58
|
+
}
|
|
59
|
+
const FAILED_SCAN_STATUSES = new Set(["infected", "quarantined"]);
|
|
60
|
+
/**
|
|
61
|
+
* `scan_status` is a field distinct from `status` (an object can be
|
|
62
|
+
* `status: "ready"` yet `scan_status: "infected"` before the guard catches
|
|
63
|
+
* up), so this is a second badge beside the existing status one, not an edit
|
|
64
|
+
* to `STATUS_OPTIONS`/`statusLabel`.
|
|
65
|
+
*/
|
|
66
|
+
function ScanStatusBadge({ object, labels }) {
|
|
67
|
+
if (!FAILED_SCAN_STATUSES.has(object.scan_status))
|
|
68
|
+
return null;
|
|
69
|
+
return (_jsx("span", { className: "fa-media-badge fa-media-badge--scan-failed", title: labels.failedScanTitle(object.scan_status), children: labels.failedScan }));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The square that stands in for the object while (or instead of) an image:
|
|
73
|
+
* the extension for a non-image, the loading/placeholder copy for an image
|
|
74
|
+
* whose signed URL has not arrived.
|
|
75
|
+
*/
|
|
76
|
+
function PreviewPlaceholder({ view, modifier, ariaLabel, children }) {
|
|
77
|
+
return (_jsx("span", { className: `${previewPlaceholderClassName} ${modifier}`, style: isListLayout(view) ? listPreviewStyle : undefined, "aria-hidden": ariaLabel === undefined ? true : undefined, "aria-label": ariaLabel, children: children }));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The object's signed download URL, requested once and only for an image. A
|
|
81
|
+
* non-image never asks for one: its preview is the extension, and a request
|
|
82
|
+
* per row would be a signature the UI throws away.
|
|
83
|
+
*/
|
|
84
|
+
function usePreviewUrl(object, isImageObject) {
|
|
85
|
+
const { data, loading, error, request } = useDownloadUrl(isImageObject ? object.id : null);
|
|
86
|
+
useEffect(() => {
|
|
87
|
+
if (!isImageObject || data || loading || error)
|
|
88
|
+
return;
|
|
89
|
+
void request();
|
|
90
|
+
}, [data, error, isImageObject, loading, request]);
|
|
91
|
+
return { data, loading };
|
|
92
|
+
}
|
|
93
|
+
export function MediaObjectPreview({ object, view, index, labels }) {
|
|
94
|
+
const isImageObject = isImage(object);
|
|
95
|
+
const { data, loading } = usePreviewUrl(object, isImageObject);
|
|
96
|
+
const loadingMode = previewLoadingFor(view, index);
|
|
97
|
+
const listLayout = isListLayout(view);
|
|
98
|
+
if (!isImageObject) {
|
|
99
|
+
return (_jsx(PreviewPlaceholder, { view: view, modifier: "fa-media-preview--file", children: object.extension ?? "file" }));
|
|
100
|
+
}
|
|
101
|
+
if (!data) {
|
|
102
|
+
return (_jsx(PreviewPlaceholder, { view: view, modifier: "fa-media-preview--loading", ariaLabel: `${objectLabel(object)} ${labels.previewLoading}`, children: loading ? labels.previewLoading : labels.previewPlaceholder }));
|
|
103
|
+
}
|
|
104
|
+
return (_jsx("img", { className: listLayout ? previewClassName : `${previewClassName} ${cardPreviewClassName}`, src: data.url, alt: objectLabel(object), style: listLayout ? listPreviewStyle : undefined, width: listLayout ? 128 : undefined, height: listLayout ? 128 : undefined, loading: loadingMode.loading, decoding: "async", fetchPriority: loadingMode.fetchPriority }));
|
|
105
|
+
}
|
|
106
|
+
export function MediaObjectName({ object, objectHref }) {
|
|
107
|
+
const label = objectLabel(object);
|
|
108
|
+
return objectHref ? _jsx("a", { href: objectHref(object.id), children: label }) : label;
|
|
109
|
+
}
|
|
110
|
+
export function MediaObjectMeta({ object, labels }) {
|
|
111
|
+
return (_jsxs(_Fragment, { children: [_jsx("span", { children: labels.categories[object.category] }), _jsx("span", { className: `fa-media-badge fa-media-badge--${object.status}`, children: statusLabel(object.status, labels) }), _jsx(ScanStatusBadge, { object: object, labels: labels }), _jsx("span", { children: humanizeBytes(object.size_bytes) })] }));
|
|
112
|
+
}
|
|
113
|
+
export function MediaObjectActions({ object, objectHref, deletingId, onDelete, labels }) {
|
|
114
|
+
const label = objectLabel(object);
|
|
115
|
+
const href = objectHref?.(object.id);
|
|
116
|
+
return (_jsxs("div", { className: itemActionsClassName, children: [href ? (_jsx("a", { className: actionLinkClassName, href: href, "aria-label": `${labels.view} ${label}`, children: labels.view })) : null, _jsx("button", { type: "button", className: "fa-media-danger", disabled: deletingId === object.id, onClick: () => void onDelete(object), children: labels.delete })] }));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* The list body, extracted verbatim so `view === "tree"` can render **this**
|
|
120
|
+
* table in its right pane instead of forking a second one. `view` still rides
|
|
121
|
+
* along untouched because `MediaObjectPreview` keys its sizing off it.
|
|
122
|
+
*/
|
|
123
|
+
export function MediaObjectTable({ items, view, objectHref, deletingId, onDelete, labels }) {
|
|
124
|
+
return (
|
|
125
|
+
// A six-column table has no readable narrow form, so it scrolls inside its
|
|
126
|
+
// own box rather than squashing its cells or forcing the whole page
|
|
127
|
+
// sideways. `min-w-[34rem]` is what gives the bar something to reveal: the
|
|
128
|
+
// table is `width: 100%`, which on its own can never exceed the wrapper.
|
|
129
|
+
_jsx("div", { className: "fa-media-table-scroll w-full overflow-x-auto", children: _jsxs("table", { className: "fa-media-table min-w-[34rem]", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: labels.preview }), _jsx("th", { children: labels.filename }), _jsx("th", { children: labels.actions }), _jsx("th", { children: labels.category }), _jsx("th", { children: labels.status }), _jsx("th", { children: labels.size })] }) }), _jsx("tbody", { children: items.map((object, index) => (_jsxs("tr", { children: [_jsx("td", { children: _jsx(MediaObjectPreview, { object: object, view: view, index: index, labels: labels }) }), _jsx("td", { children: _jsx(MediaObjectName, { object: object, objectHref: objectHref }) }), _jsx("td", { children: _jsx(MediaObjectActions, { object: object, objectHref: objectHref, deletingId: deletingId, onDelete: onDelete, labels: labels }) }), _jsx("td", { children: labels.categories[object.category] }), _jsxs("td", { children: [_jsx("span", { className: `fa-media-badge fa-media-badge--${object.status}`, children: statusLabel(object.status, labels) }), _jsx(ScanStatusBadge, { object: object, labels: labels })] }), _jsx("td", { children: humanizeBytes(object.size_bytes) })] }, object.id))) })] }) }));
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=MediaObjectViews.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaObjectViews.js","sourceRoot":"","sources":["../../../../src/runtime/react/MediaObjectViews.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { MediaLibraryLabels } from "./mediaLibraryLabels.js";
|
|
2
|
+
import type { ObjectListParams } from "../schemas.js";
|
|
3
|
+
/**
|
|
4
|
+
* Import/export control (`U10`). A single toggled panel rather than a modal
|
|
5
|
+
* dialog — this package hand-rolls Tailwind token classes in `src/runtime`
|
|
6
|
+
* rather than importing `astro-ui-m8` components here (`D11`; the
|
|
7
|
+
* `dialog-form`/`data-table` composition is a separate registry skin, not
|
|
8
|
+
* this runtime component). Export reuses the caller's live `filters`
|
|
9
|
+
* (`ObjectListParams`) so exporting the selected tree branch (`U10`'s branch
|
|
10
|
+
* bullet) falls out of passing the library's own `query` through unchanged.
|
|
11
|
+
*/
|
|
12
|
+
export declare function MediaTransferPanel({ filters, exportScopeLabel, labels }: {
|
|
13
|
+
filters: ObjectListParams;
|
|
14
|
+
exportScopeLabel?: string;
|
|
15
|
+
labels: MediaLibraryLabels["transfer"];
|
|
16
|
+
}): import("react").JSX.Element;
|
|
17
|
+
//# sourceMappingURL=MediaTransferPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaTransferPanel.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/MediaTransferPanel.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAkD,gBAAgB,EAAE,MAAM,eAAe,CAAC;AA8PtG;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,OAAO,EACP,gBAAgB,EAChB,MAAM,EACP,EAAE;IACD,OAAO,EAAE,gBAAgB,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;CACxC,+BAcA"}
|