@mano8/astro-media-m8 0.1.0-alpha.1
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/LICENSE +201 -0
- package/README.md +203 -0
- package/dist/src/integration.d.ts +57 -0
- package/dist/src/integration.d.ts.map +1 -0
- package/dist/src/integration.js +87 -0
- package/dist/src/integration.js.map +1 -0
- package/dist/src/lib/csp.d.ts +27 -0
- package/dist/src/lib/csp.d.ts.map +1 -0
- package/dist/src/lib/csp.js +54 -0
- package/dist/src/lib/csp.js.map +1 -0
- package/dist/src/middleware.d.ts +4 -0
- package/dist/src/middleware.d.ts.map +1 -0
- package/dist/src/middleware.js +24 -0
- package/dist/src/middleware.js.map +1 -0
- package/dist/src/runtime/api/admin.d.ts +22 -0
- package/dist/src/runtime/api/admin.d.ts.map +1 -0
- package/dist/src/runtime/api/admin.js +115 -0
- package/dist/src/runtime/api/admin.js.map +1 -0
- package/dist/src/runtime/api/categories.d.ts +12 -0
- package/dist/src/runtime/api/categories.d.ts.map +1 -0
- package/dist/src/runtime/api/categories.js +56 -0
- package/dist/src/runtime/api/categories.js.map +1 -0
- package/dist/src/runtime/api/dashboard.d.ts +5 -0
- package/dist/src/runtime/api/dashboard.d.ts.map +1 -0
- package/dist/src/runtime/api/dashboard.js +22 -0
- package/dist/src/runtime/api/dashboard.js.map +1 -0
- package/dist/src/runtime/api/index.d.ts +72 -0
- package/dist/src/runtime/api/index.d.ts.map +1 -0
- package/dist/src/runtime/api/index.js +74 -0
- package/dist/src/runtime/api/index.js.map +1 -0
- package/dist/src/runtime/api/internal.server.d.ts +19 -0
- package/dist/src/runtime/api/internal.server.d.ts.map +1 -0
- package/dist/src/runtime/api/internal.server.js +64 -0
- package/dist/src/runtime/api/internal.server.js.map +1 -0
- package/dist/src/runtime/api/objects.d.ts +7 -0
- package/dist/src/runtime/api/objects.d.ts.map +1 -0
- package/dist/src/runtime/api/objects.js +71 -0
- package/dist/src/runtime/api/objects.js.map +1 -0
- package/dist/src/runtime/api/presets.d.ts +6 -0
- package/dist/src/runtime/api/presets.d.ts.map +1 -0
- package/dist/src/runtime/api/presets.js +31 -0
- package/dist/src/runtime/api/presets.js.map +1 -0
- package/dist/src/runtime/api/shares.d.ts +10 -0
- package/dist/src/runtime/api/shares.d.ts.map +1 -0
- package/dist/src/runtime/api/shares.js +38 -0
- package/dist/src/runtime/api/shares.js.map +1 -0
- package/dist/src/runtime/api/uploads.d.ts +5 -0
- package/dist/src/runtime/api/uploads.d.ts.map +1 -0
- package/dist/src/runtime/api/uploads.js +28 -0
- package/dist/src/runtime/api/uploads.js.map +1 -0
- package/dist/src/runtime/api/variants.d.ts +18 -0
- package/dist/src/runtime/api/variants.d.ts.map +1 -0
- package/dist/src/runtime/api/variants.js +61 -0
- package/dist/src/runtime/api/variants.js.map +1 -0
- package/dist/src/runtime/authAdapter.d.ts +48 -0
- package/dist/src/runtime/authAdapter.d.ts.map +1 -0
- package/dist/src/runtime/authAdapter.js +62 -0
- package/dist/src/runtime/authAdapter.js.map +1 -0
- package/dist/src/runtime/client.d.ts +24 -0
- package/dist/src/runtime/client.d.ts.map +1 -0
- package/dist/src/runtime/client.js +87 -0
- package/dist/src/runtime/client.js.map +1 -0
- package/dist/src/runtime/compatibility.d.ts +32 -0
- package/dist/src/runtime/compatibility.d.ts.map +1 -0
- package/dist/src/runtime/compatibility.js +101 -0
- package/dist/src/runtime/compatibility.js.map +1 -0
- package/dist/src/runtime/config.d.ts +27 -0
- package/dist/src/runtime/config.d.ts.map +1 -0
- package/dist/src/runtime/config.js +32 -0
- package/dist/src/runtime/config.js.map +1 -0
- package/dist/src/runtime/errors.d.ts +23 -0
- package/dist/src/runtime/errors.d.ts.map +1 -0
- package/dist/src/runtime/errors.js +50 -0
- package/dist/src/runtime/errors.js.map +1 -0
- package/dist/src/runtime/hooks/index.d.ts +8 -0
- package/dist/src/runtime/hooks/index.d.ts.map +1 -0
- package/dist/src/runtime/hooks/index.js +8 -0
- package/dist/src/runtime/hooks/index.js.map +1 -0
- package/dist/src/runtime/hooks/useDownloadUrl.d.ts +12 -0
- package/dist/src/runtime/hooks/useDownloadUrl.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useDownloadUrl.js +40 -0
- package/dist/src/runtime/hooks/useDownloadUrl.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaAdmin.d.ts +30 -0
- package/dist/src/runtime/hooks/useMediaAdmin.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaAdmin.js +145 -0
- package/dist/src/runtime/hooks/useMediaAdmin.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaObject.d.ts +17 -0
- package/dist/src/runtime/hooks/useMediaObject.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaObject.js +62 -0
- package/dist/src/runtime/hooks/useMediaObject.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaObjects.d.ts +12 -0
- package/dist/src/runtime/hooks/useMediaObjects.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaObjects.js +76 -0
- package/dist/src/runtime/hooks/useMediaObjects.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaPresets.d.ts +24 -0
- package/dist/src/runtime/hooks/useMediaPresets.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaPresets.js +55 -0
- package/dist/src/runtime/hooks/useMediaPresets.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaUpload.d.ts +11 -0
- package/dist/src/runtime/hooks/useMediaUpload.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaUpload.js +34 -0
- package/dist/src/runtime/hooks/useMediaUpload.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaVariants.d.ts +18 -0
- package/dist/src/runtime/hooks/useMediaVariants.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaVariants.js +78 -0
- package/dist/src/runtime/hooks/useMediaVariants.js.map +1 -0
- package/dist/src/runtime/listParams.d.ts +27 -0
- package/dist/src/runtime/listParams.d.ts.map +1 -0
- package/dist/src/runtime/listParams.js +66 -0
- package/dist/src/runtime/listParams.js.map +1 -0
- package/dist/src/runtime/queryKeys.d.ts +18 -0
- package/dist/src/runtime/queryKeys.d.ts.map +1 -0
- package/dist/src/runtime/queryKeys.js +23 -0
- package/dist/src/runtime/queryKeys.js.map +1 -0
- package/dist/src/runtime/react/AdminMediaPanel.d.ts +2 -0
- package/dist/src/runtime/react/AdminMediaPanel.d.ts.map +1 -0
- package/dist/src/runtime/react/AdminMediaPanel.js +14 -0
- package/dist/src/runtime/react/AdminMediaPanel.js.map +1 -0
- package/dist/src/runtime/react/MediaLibrary.d.ts +6 -0
- package/dist/src/runtime/react/MediaLibrary.d.ts.map +1 -0
- package/dist/src/runtime/react/MediaLibrary.js +138 -0
- package/dist/src/runtime/react/MediaLibrary.js.map +1 -0
- package/dist/src/runtime/react/MediaProvider.d.ts +18 -0
- package/dist/src/runtime/react/MediaProvider.d.ts.map +1 -0
- package/dist/src/runtime/react/MediaProvider.js +79 -0
- package/dist/src/runtime/react/MediaProvider.js.map +1 -0
- package/dist/src/runtime/react/MediaQueryProvider.d.ts +8 -0
- package/dist/src/runtime/react/MediaQueryProvider.d.ts.map +1 -0
- package/dist/src/runtime/react/MediaQueryProvider.js +11 -0
- package/dist/src/runtime/react/MediaQueryProvider.js.map +1 -0
- package/dist/src/runtime/react/MediaUploadDropzone.d.ts +8 -0
- package/dist/src/runtime/react/MediaUploadDropzone.d.ts.map +1 -0
- package/dist/src/runtime/react/MediaUploadDropzone.js +34 -0
- package/dist/src/runtime/react/MediaUploadDropzone.js.map +1 -0
- package/dist/src/runtime/react/ObjectDetail.d.ts +5 -0
- package/dist/src/runtime/react/ObjectDetail.d.ts.map +1 -0
- package/dist/src/runtime/react/ObjectDetail.js +34 -0
- package/dist/src/runtime/react/ObjectDetail.js.map +1 -0
- package/dist/src/runtime/react/PresetEditor.d.ts +3 -0
- package/dist/src/runtime/react/PresetEditor.d.ts.map +1 -0
- package/dist/src/runtime/react/PresetEditor.js +36 -0
- package/dist/src/runtime/react/PresetEditor.js.map +1 -0
- package/dist/src/runtime/react/RequireSuperuser.d.ts +7 -0
- package/dist/src/runtime/react/RequireSuperuser.d.ts.map +1 -0
- package/dist/src/runtime/react/RequireSuperuser.js +10 -0
- package/dist/src/runtime/react/RequireSuperuser.js.map +1 -0
- package/dist/src/runtime/react/VariantPicker.d.ts +5 -0
- package/dist/src/runtime/react/VariantPicker.d.ts.map +1 -0
- package/dist/src/runtime/react/VariantPicker.js +28 -0
- package/dist/src/runtime/react/VariantPicker.js.map +1 -0
- package/dist/src/runtime/react/default-ui/index.d.ts +25 -0
- package/dist/src/runtime/react/default-ui/index.d.ts.map +1 -0
- package/dist/src/runtime/react/default-ui/index.js +33 -0
- package/dist/src/runtime/react/default-ui/index.js.map +1 -0
- package/dist/src/runtime/react/index.d.ts +10 -0
- package/dist/src/runtime/react/index.d.ts.map +1 -0
- package/dist/src/runtime/react/index.js +10 -0
- package/dist/src/runtime/react/index.js.map +1 -0
- package/dist/src/runtime/routes.d.ts +19 -0
- package/dist/src/runtime/routes.d.ts.map +1 -0
- package/dist/src/runtime/routes.js +35 -0
- package/dist/src/runtime/routes.js.map +1 -0
- package/dist/src/runtime/schemas.d.ts +812 -0
- package/dist/src/runtime/schemas.d.ts.map +1 -0
- package/dist/src/runtime/schemas.js +427 -0
- package/dist/src/runtime/schemas.js.map +1 -0
- package/dist/src/runtime/upload/index.d.ts +2 -0
- package/dist/src/runtime/upload/index.d.ts.map +1 -0
- package/dist/src/runtime/upload/index.js +2 -0
- package/dist/src/runtime/upload/index.js.map +1 -0
- package/dist/src/runtime/upload/uploadController.d.ts +71 -0
- package/dist/src/runtime/upload/uploadController.d.ts.map +1 -0
- package/dist/src/runtime/upload/uploadController.js +217 -0
- package/dist/src/runtime/upload/uploadController.js.map +1 -0
- package/package.json +97 -0
- package/registry/r/admin-media-dashboard.json +23 -0
- package/registry/r/data-table.json +23 -0
- package/registry/r/media-dashboard-overview.json +26 -0
- package/registry/r/media-maintenance-panel.json +23 -0
- package/registry/r/media-storage-chart.json +21 -0
- package/registry/r/registry.json +37 -0
- package/registry.json +92 -0
- package/src/routes/admin/media.astro +12 -0
- package/src/routes/library.astro +12 -0
- package/src/routes/object/[id].astro +14 -0
- package/src/routes/presets.astro +12 -0
- package/src/routes/upload.astro +12 -0
- package/src/scaffold/styles/media.css +208 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { deleteObject } from "../api/objects.js";
|
|
4
|
+
import { useDownloadUrl } from "../hooks/useDownloadUrl.js";
|
|
5
|
+
import { useMediaObjects } from "../hooks/useMediaObjects.js";
|
|
6
|
+
const STATUS_BADGE = {
|
|
7
|
+
pending_upload: "Pending",
|
|
8
|
+
uploaded: "Uploaded",
|
|
9
|
+
processing: "Processing",
|
|
10
|
+
ready: "Ready",
|
|
11
|
+
failed: "Failed",
|
|
12
|
+
deleted: "Deleted",
|
|
13
|
+
rejected: "Rejected"
|
|
14
|
+
};
|
|
15
|
+
const inputClassName = "fa-media-control h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40";
|
|
16
|
+
const VIEW_LABELS = {
|
|
17
|
+
list: "List",
|
|
18
|
+
grid: "Grid",
|
|
19
|
+
masonry: "Masonry"
|
|
20
|
+
};
|
|
21
|
+
const titleRowClassName = "fa-media-title-row flex w-full flex-wrap items-center justify-between gap-3";
|
|
22
|
+
const filterRowClassName = "fa-media-filter-row flex w-full flex-col gap-3 md:flex-row md:items-center";
|
|
23
|
+
const viewSwitcherClassName = "fa-media-view-switcher inline-flex shrink-0 rounded-lg border border-input bg-transparent p-0.5";
|
|
24
|
+
const viewButtonClassName = "fa-media-view-button min-h-7 rounded-md border-0 bg-transparent px-2.5 py-1 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground aria-pressed:bg-foreground aria-pressed:text-background";
|
|
25
|
+
const previewClassName = "fa-media-preview block aspect-square h-14 w-14 rounded-md border border-border bg-muted object-cover text-xs font-medium text-muted-foreground";
|
|
26
|
+
const previewPlaceholderClassName = `${previewClassName} grid place-items-center px-1 text-center`;
|
|
27
|
+
const gridClassName = "fa-media-cards fa-media-cards--grid grid gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4";
|
|
28
|
+
const masonryClassName = "fa-media-cards fa-media-cards--masonry columns-1 gap-4 sm:columns-2 lg:columns-3 xl:columns-4";
|
|
29
|
+
const cardClassName = "fa-media-card mb-4 break-inside-avoid overflow-hidden rounded-lg border border-border bg-card text-card-foreground";
|
|
30
|
+
const cardPreviewClassName = "h-auto w-full rounded-none border-0";
|
|
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[unitIndex]}`;
|
|
78
|
+
}
|
|
79
|
+
function MediaObjectPreview({ object, view, index }) {
|
|
80
|
+
const { data, loading, error, request } = useDownloadUrl(isImage(object) ? object.id : null);
|
|
81
|
+
const loadingMode = previewLoadingFor(view, index);
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
if (!isImage(object) || data || loading || error)
|
|
84
|
+
return;
|
|
85
|
+
void request();
|
|
86
|
+
}, [data, error, loading, object, request]);
|
|
87
|
+
if (!isImage(object)) {
|
|
88
|
+
return (_jsx("span", { className: `${previewPlaceholderClassName} fa-media-preview--file`, style: view === "list" ? listPreviewStyle : undefined, "aria-hidden": "true", children: object.extension ?? "file" }));
|
|
89
|
+
}
|
|
90
|
+
if (!data) {
|
|
91
|
+
return (_jsx("span", { className: `${previewPlaceholderClassName} fa-media-preview--loading`, style: view === "list" ? listPreviewStyle : undefined, "aria-label": `${objectLabel(object)} preview loading`, children: loading ? "Loading" : "Preview" }));
|
|
92
|
+
}
|
|
93
|
+
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 }));
|
|
94
|
+
}
|
|
95
|
+
function MediaObjectName({ object, objectHref }) {
|
|
96
|
+
const label = objectLabel(object);
|
|
97
|
+
return objectHref ? _jsx("a", { href: objectHref(object.id), children: label }) : label;
|
|
98
|
+
}
|
|
99
|
+
function MediaObjectMeta({ object }) {
|
|
100
|
+
return (_jsxs(_Fragment, { children: [_jsx("span", { children: object.category }), _jsx("span", { className: `fa-media-badge fa-media-badge--${object.status}`, children: STATUS_BADGE[object.status] }), _jsx("span", { children: humanizeBytes(object.size_bytes) })] }));
|
|
101
|
+
}
|
|
102
|
+
function MediaObjectActions({ object, objectHref, deletingId, onDelete }) {
|
|
103
|
+
const label = objectLabel(object);
|
|
104
|
+
const href = objectHref?.(object.id);
|
|
105
|
+
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" })] }));
|
|
106
|
+
}
|
|
107
|
+
export function MediaLibrary({ objectHref, initial = {} }) {
|
|
108
|
+
const [query, setQuery] = useState(initial);
|
|
109
|
+
const [view, setView] = useState("list");
|
|
110
|
+
const [deletingId, setDeletingId] = useState(null);
|
|
111
|
+
const [actionError, setActionError] = useState(null);
|
|
112
|
+
const { items, count, loading, error, hasMore, refresh, loadMore } = useMediaObjects(query);
|
|
113
|
+
async function handleDelete(object) {
|
|
114
|
+
setActionError(null);
|
|
115
|
+
setDeletingId(object.id);
|
|
116
|
+
try {
|
|
117
|
+
await deleteObject(object.id);
|
|
118
|
+
await refresh();
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
setActionError("Failed to delete media");
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
setDeletingId(null);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
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: ["Media library (", count, ")"] }), _jsx("div", { className: viewSwitcherClassName, "aria-label": "Media library view", children: Object.keys(VIEW_LABELS).map((value) => (_jsx("button", { type: "button", "aria-pressed": view === value, className: viewButtonClassName, style: view === value ? activeViewButtonStyle : undefined, onClick: () => setView(value), children: VIEW_LABELS[value] }, value))) })] }), _jsxs("div", { className: filterRowClassName, children: [_jsx("input", { className: inputClassName, type: "search", placeholder: "Search filename", onChange: (event) => {
|
|
128
|
+
const q = event.currentTarget.value || undefined;
|
|
129
|
+
setQuery((prev) => ({ ...prev, q }));
|
|
130
|
+
} }), _jsxs("select", { className: inputClassName, onChange: (event) => {
|
|
131
|
+
const category = (event.currentTarget.value || undefined);
|
|
132
|
+
setQuery((prev) => ({ ...prev, category }));
|
|
133
|
+
}, children: [_jsx("option", { value: "", children: "All categories" }), ["avatar", "document", "asset", "chat_attachment", "export", "receipt"].map((value) => (_jsx("option", { value: value, children: value }, value)))] }), _jsxs("select", { className: inputClassName, onChange: (event) => {
|
|
134
|
+
const status = (event.currentTarget.value || undefined);
|
|
135
|
+
setQuery((prev) => ({ ...prev, status }));
|
|
136
|
+
}, children: [_jsx("option", { value: "", children: "All statuses" }), Object.keys(STATUS_BADGE).map((value) => (_jsx("option", { value: value, children: STATUS_BADGE[value] }, value)))] })] })] }), error ? _jsx("p", { role: "alert", children: "Failed to load media" }) : null, actionError ? _jsx("p", { role: "alert", children: actionError }) : null, view === "list" ? (_jsxs("table", { className: "fa-media-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Preview" }), _jsx("th", { children: "Filename" }), _jsx("th", { children: "Actions" }), _jsx("th", { children: "Category" }), _jsx("th", { children: "Status" }), _jsx("th", { children: "Size" })] }) }), _jsx("tbody", { children: items.map((object, index) => (_jsxs("tr", { children: [_jsx("td", { children: _jsx(MediaObjectPreview, { object: object, view: view, index: index }) }), _jsx("td", { children: _jsx(MediaObjectName, { object: object, objectHref: objectHref }) }), _jsx("td", { children: _jsx(MediaObjectActions, { object: object, objectHref: objectHref, deletingId: deletingId, onDelete: handleDelete }) }), _jsx("td", { children: object.category }), _jsx("td", { children: _jsx("span", { className: `fa-media-badge fa-media-badge--${object.status}`, children: STATUS_BADGE[object.status] }) }), _jsx("td", { children: humanizeBytes(object.size_bytes) })] }, object.id))) })] })) : (_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 }), _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 }) }), _jsx(MediaObjectActions, { object: object, objectHref: objectHref, deletingId: deletingId, onDelete: handleDelete })] })] }, object.id))) })), loading ? _jsx("p", { children: "Loading..." }) : null, hasMore ? (_jsx("button", { type: "button", disabled: loading, onClick: () => void loadMore(), children: "Load more" })) : null] }));
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=MediaLibrary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaLibrary.js","sourceRoot":"","sources":["../../../../src/runtime/react/MediaLibrary.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { type MediaRuntimeConfig } from "../config.js";
|
|
3
|
+
import { type MediaAuthAdapter } from "../authAdapter.js";
|
|
4
|
+
export type MediaContextValue = {
|
|
5
|
+
adapter: MediaAuthAdapter;
|
|
6
|
+
user: unknown;
|
|
7
|
+
isSuperuser: boolean;
|
|
8
|
+
loading: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare function MediaProvider({ children, config, adapter }: {
|
|
11
|
+
children: ReactNode;
|
|
12
|
+
config?: Partial<Omit<MediaRuntimeConfig, "polling">> & {
|
|
13
|
+
polling?: Partial<MediaRuntimeConfig["polling"]>;
|
|
14
|
+
};
|
|
15
|
+
adapter?: MediaAuthAdapter;
|
|
16
|
+
}): import("react").JSX.Element;
|
|
17
|
+
export declare function useMediaContext(): MediaContextValue;
|
|
18
|
+
//# sourceMappingURL=MediaProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaProvider.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/MediaProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE/E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAwBF,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,MAAM,EACN,OAAO,EACR,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC,GAAG;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAA;KAAE,CAAC;IAC7G,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B,+BAsDA;AAED,wBAAgB,eAAe,IAAI,iBAAiB,CAInD"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useEffect, useMemo, useState } from "react";
|
|
3
|
+
import { configureMedia } from "../config.js";
|
|
4
|
+
import { getMediaAuthAdapter } from "../authAdapter.js";
|
|
5
|
+
const MediaContext = createContext(null);
|
|
6
|
+
function isPromiseLike(value) {
|
|
7
|
+
return Boolean(value &&
|
|
8
|
+
(typeof value === "object" || typeof value === "function") &&
|
|
9
|
+
"then" in value &&
|
|
10
|
+
typeof value.then === "function");
|
|
11
|
+
}
|
|
12
|
+
function readAdapterUser(adapter) {
|
|
13
|
+
if (!adapter.getUser)
|
|
14
|
+
return { user: null, loading: false };
|
|
15
|
+
try {
|
|
16
|
+
const value = adapter.getUser();
|
|
17
|
+
if (isPromiseLike(value))
|
|
18
|
+
return { user: null, loading: true };
|
|
19
|
+
return { user: value, loading: false };
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return { user: null, loading: false };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function MediaProvider({ children, config, adapter }) {
|
|
26
|
+
const resolved = adapter ?? getMediaAuthAdapter();
|
|
27
|
+
const [authState, setAuthState] = useState(() => readAdapterUser(resolved));
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
if (config)
|
|
30
|
+
configureMedia(config);
|
|
31
|
+
}, [config]);
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (!resolved.getUser) {
|
|
34
|
+
setAuthState({ user: null, loading: false });
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
let cancelled = false;
|
|
38
|
+
try {
|
|
39
|
+
const value = resolved.getUser();
|
|
40
|
+
if (!isPromiseLike(value)) {
|
|
41
|
+
setAuthState({ user: value, loading: false });
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
setAuthState((current) => ({ ...current, loading: true }));
|
|
45
|
+
Promise.resolve(value)
|
|
46
|
+
.then((nextUser) => {
|
|
47
|
+
if (!cancelled)
|
|
48
|
+
setAuthState({ user: nextUser, loading: false });
|
|
49
|
+
})
|
|
50
|
+
.catch(() => {
|
|
51
|
+
if (!cancelled)
|
|
52
|
+
setAuthState({ user: null, loading: false });
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
setAuthState({ user: null, loading: false });
|
|
57
|
+
}
|
|
58
|
+
return () => {
|
|
59
|
+
cancelled = true;
|
|
60
|
+
};
|
|
61
|
+
}, [resolved]);
|
|
62
|
+
const currentUserState = readAdapterUser(resolved);
|
|
63
|
+
const user = currentUserState.loading ? authState.user : currentUserState.user;
|
|
64
|
+
const loading = currentUserState.loading ? authState.loading : false;
|
|
65
|
+
const value = useMemo(() => ({
|
|
66
|
+
adapter: resolved,
|
|
67
|
+
user,
|
|
68
|
+
isSuperuser: Boolean(resolved.isSuperuser?.(user)),
|
|
69
|
+
loading
|
|
70
|
+
}), [loading, resolved, user]);
|
|
71
|
+
return _jsx(MediaContext.Provider, { value: value, children: children });
|
|
72
|
+
}
|
|
73
|
+
export function useMediaContext() {
|
|
74
|
+
const context = useContext(MediaContext);
|
|
75
|
+
if (!context)
|
|
76
|
+
throw new Error("useMediaContext must be used inside MediaProvider");
|
|
77
|
+
return context;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=MediaProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaProvider.js","sourceRoot":"","sources":["../../../../src/runtime/react/MediaProvider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { QueryClient } from "@tanstack/react-query";
|
|
2
|
+
import { type ReactNode } from "react";
|
|
3
|
+
export type MediaQueryProviderProps = {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
client?: QueryClient;
|
|
6
|
+
};
|
|
7
|
+
export declare function MediaQueryProvider({ children, client }: MediaQueryProviderProps): import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=MediaQueryProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaQueryProvider.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/MediaQueryProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA2C,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE7D,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,uBAAuB,+BAO/E"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { QueryClient, QueryClientContext, QueryClientProvider } from "@tanstack/react-query";
|
|
3
|
+
import { useContext, useState } from "react";
|
|
4
|
+
export function MediaQueryProvider({ children, client }) {
|
|
5
|
+
const parentClient = useContext(QueryClientContext);
|
|
6
|
+
const [ownedClient] = useState(() => client ?? new QueryClient());
|
|
7
|
+
if (parentClient)
|
|
8
|
+
return _jsx(_Fragment, { children: children });
|
|
9
|
+
return _jsx(QueryClientProvider, { client: ownedClient, children: children });
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=MediaQueryProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaQueryProvider.js","sourceRoot":"","sources":["../../../../src/runtime/react/MediaQueryProvider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAO7D,MAAM,UAAU,kBAAkB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAA2B;IAC9E,MAAM,YAAY,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACpD,MAAM,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;IAElE,IAAI,YAAY;QAAE,OAAO,4BAAG,QAAQ,GAAI,CAAC;IAEzC,OAAO,KAAC,mBAAmB,IAAC,MAAM,EAAE,WAAW,YAAG,QAAQ,GAAuB,CAAC;AACpF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { MediaCategory, MediaObjectPublic, MediaVisibility } from "../schemas.js";
|
|
2
|
+
export declare function MediaUploadDropzone({ defaultCategory, defaultVisibility, checksum, onUploaded }: {
|
|
3
|
+
defaultCategory?: MediaCategory;
|
|
4
|
+
defaultVisibility?: MediaVisibility;
|
|
5
|
+
checksum?: "none" | "sha256";
|
|
6
|
+
onUploaded?: (object: MediaObjectPublic) => void;
|
|
7
|
+
}): import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=MediaUploadDropzone.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaUploadDropzone.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/MediaUploadDropzone.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAgBvF,wBAAgB,mBAAmB,CAAC,EAClC,eAAyB,EACzB,iBAA6B,EAC7B,QAAmB,EACnB,UAAU,EACX,EAAE;IACD,eAAe,CAAC,EAAE,aAAa,CAAC;IAChC,iBAAiB,CAAC,EAAE,eAAe,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC7B,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAClD,+BA0DA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { useMediaUpload } from "../hooks/useMediaUpload.js";
|
|
4
|
+
const CATEGORIES = [
|
|
5
|
+
"avatar",
|
|
6
|
+
"document",
|
|
7
|
+
"asset",
|
|
8
|
+
"chat_attachment",
|
|
9
|
+
"export",
|
|
10
|
+
"receipt"
|
|
11
|
+
];
|
|
12
|
+
const VISIBILITIES = ["private", "public", "tenant", "sensitive"];
|
|
13
|
+
const inputClassName = "fa-media-control h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40";
|
|
14
|
+
const labelClassName = "fa-media-label flex items-center gap-2 pb-2 text-sm leading-none font-medium select-none";
|
|
15
|
+
export function MediaUploadDropzone({ defaultCategory = "asset", defaultVisibility = "private", checksum = "sha256", onUploaded }) {
|
|
16
|
+
const { upload, abort, progress, error, busy } = useMediaUpload();
|
|
17
|
+
const [category, setCategory] = useState(defaultCategory);
|
|
18
|
+
const [visibility, setVisibility] = useState(defaultVisibility);
|
|
19
|
+
async function onPick(event) {
|
|
20
|
+
const file = event.currentTarget.files?.[0];
|
|
21
|
+
if (!file)
|
|
22
|
+
return;
|
|
23
|
+
try {
|
|
24
|
+
const object = await upload({ file, category, visibility, checksum, waitForScan: true });
|
|
25
|
+
onUploaded?.(object);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// surfaced via `error`
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const pct = progress?.fraction != null ? Math.round(progress.fraction * 100) : null;
|
|
32
|
+
return (_jsxs("section", { className: "not-content fa-media-panel", children: [_jsx("h2", { children: "Upload media" }), _jsxs("div", { className: "fa-media-field", children: [_jsxs("div", { className: "fa-media-field-control", children: [_jsx("label", { className: labelClassName, htmlFor: "fa-media-upload-category", children: "Category" }), _jsx("select", { id: "fa-media-upload-category", className: inputClassName, value: category, onChange: (event) => setCategory(event.currentTarget.value), children: CATEGORIES.map((value) => (_jsx("option", { value: value, children: value }, value))) })] }), _jsxs("div", { className: "fa-media-field-control", children: [_jsx("label", { className: labelClassName, htmlFor: "fa-media-upload-visibility", children: "Visibility" }), _jsx("select", { id: "fa-media-upload-visibility", className: inputClassName, value: visibility, onChange: (event) => setVisibility(event.currentTarget.value), children: VISIBILITIES.map((value) => (_jsx("option", { value: value, children: value }, value))) })] })] }), _jsx("input", { className: inputClassName, type: "file", disabled: busy, onChange: onPick }), progress ? (_jsxs("div", { className: "fa-media-progress", role: "status", children: [_jsx("span", { children: progress.state }), pct != null ? _jsx("progress", { max: 100, value: pct }) : null] })) : null, busy ? (_jsx("button", { type: "button", onClick: abort, children: "Cancel" })) : null, error ? _jsx("p", { role: "alert", children: error instanceof Error ? error.message : "Upload failed" }) : null] }));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=MediaUploadDropzone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaUploadDropzone.js","sourceRoot":"","sources":["../../../../src/runtime/react/MediaUploadDropzone.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectDetail.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/ObjectDetail.tsx"],"names":[],"mappings":"AAWA,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,+BAuEjG"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { useDownloadUrl } from "../hooks/useDownloadUrl.js";
|
|
4
|
+
import { useMediaObject } from "../hooks/useMediaObject.js";
|
|
5
|
+
import { VariantPicker } from "./VariantPicker.js";
|
|
6
|
+
const inputClassName = "fa-media-control h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40";
|
|
7
|
+
const labelClassName = "fa-media-label flex items-center gap-2 pb-2 text-sm leading-none font-medium select-none";
|
|
8
|
+
export function ObjectDetail({ objectId, onDeleted }) {
|
|
9
|
+
const { object, loading, error, update, remove } = useMediaObject(objectId);
|
|
10
|
+
const { data: download, request: requestDownload } = useDownloadUrl(objectId);
|
|
11
|
+
const [saving, setSaving] = useState(false);
|
|
12
|
+
if (loading && !object)
|
|
13
|
+
return _jsx("p", { children: "Loading\u2026" });
|
|
14
|
+
if (error)
|
|
15
|
+
return _jsx("p", { role: "alert", children: "Failed to load object" });
|
|
16
|
+
if (!object)
|
|
17
|
+
return _jsx("p", { children: "Not found" });
|
|
18
|
+
async function patch(field, value) {
|
|
19
|
+
setSaving(true);
|
|
20
|
+
try {
|
|
21
|
+
await update(field === "visibility"
|
|
22
|
+
? { visibility: value }
|
|
23
|
+
: { category: value });
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
setSaving(false);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return (_jsxs("section", { className: "not-content fa-media-panel", children: [_jsx("h2", { children: object.original_filename ?? object.id }), _jsxs("dl", { className: "fa-media-meta", children: [_jsx("dt", { children: "Status" }), _jsx("dd", { children: object.status }), _jsx("dt", { children: "Scan" }), _jsx("dd", { children: object.scan_status }), _jsx("dt", { children: "MIME" }), _jsx("dd", { children: object.mime_type }), _jsx("dt", { children: "Size" }), _jsxs("dd", { children: [object.size_bytes, " bytes"] })] }), _jsxs("div", { className: "fa-media-field-control", children: [_jsx("label", { className: labelClassName, htmlFor: "fa-media-object-visibility", children: "Visibility" }), _jsx("select", { id: "fa-media-object-visibility", className: inputClassName, disabled: saving, value: object.visibility, onChange: (event) => void patch("visibility", event.currentTarget.value), children: ["private", "public", "tenant", "sensitive"].map((value) => (_jsx("option", { value: value, children: value }, value))) })] }), _jsxs("div", { className: "fa-media-actions", children: [_jsx("button", { type: "button", onClick: () => void requestDownload(), children: "Get download URL" }), download ? (_jsxs("a", { href: download.url, rel: "noreferrer", children: ["Download (expires ", download.expires_at, ")"] })) : null, _jsx("button", { type: "button", className: "fa-media-danger", onClick: async () => {
|
|
30
|
+
await remove();
|
|
31
|
+
onDeleted?.();
|
|
32
|
+
}, children: "Delete" })] }), _jsx(VariantPicker, { objectId: object.id })] }));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=ObjectDetail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectDetail.js","sourceRoot":"","sources":["../../../../src/runtime/react/ObjectDetail.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PresetEditor.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/PresetEditor.tsx"],"names":[],"mappings":"AAUA,0EAA0E;AAC1E,wBAAgB,YAAY,gCAsE3B"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { useMediaPresets } from "../hooks/useMediaPresets.js";
|
|
4
|
+
const FORMATS = ["WEBP", "JPEG", "PNG", "GIF", "AVIF"];
|
|
5
|
+
const inputClassName = "fa-media-control h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40";
|
|
6
|
+
const labelClassName = "fa-media-label flex items-center gap-2 pb-2 text-sm leading-none font-medium select-none";
|
|
7
|
+
/** Built-in presets render read-only; user-owned presets are editable. */
|
|
8
|
+
export function PresetEditor() {
|
|
9
|
+
const { presets, create, remove, error } = useMediaPresets();
|
|
10
|
+
const [name, setName] = useState("");
|
|
11
|
+
const [width, setWidth] = useState(512);
|
|
12
|
+
const [format, setFormat] = useState("WEBP");
|
|
13
|
+
const [busy, setBusy] = useState(false);
|
|
14
|
+
async function add() {
|
|
15
|
+
if (!name.trim())
|
|
16
|
+
return;
|
|
17
|
+
setBusy(true);
|
|
18
|
+
try {
|
|
19
|
+
await create({
|
|
20
|
+
name: name.trim(),
|
|
21
|
+
spec: {
|
|
22
|
+
image_size: { fixed_width: width, fixed_height: null, fixed_size: null },
|
|
23
|
+
formats: [{ ext: format, quality: 82 }],
|
|
24
|
+
allow_upscale: false,
|
|
25
|
+
max_byte_size: null
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
setName("");
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
setBusy(false);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return (_jsxs("section", { className: "not-content fa-media-panel", children: [_jsx("h2", { children: "Presets" }), error ? _jsx("p", { role: "alert", children: "Failed to load presets" }) : null, _jsx("ul", { className: "fa-media-presets", children: presets.map((preset) => (_jsxs("li", { children: [_jsx("strong", { children: preset.name }), preset.builtin ? (_jsx("em", { children: " built-in (read-only)" })) : (_jsx("button", { type: "button", onClick: () => preset.id && void remove(preset.id), children: "Delete" }))] }, preset.id ?? preset.name))) }), _jsxs("fieldset", { children: [_jsx("legend", { children: "New preset" }), _jsxs("div", { className: "fa-media-field-control", children: [_jsx("label", { className: labelClassName, htmlFor: "fa-media-preset-name", children: "Name" }), _jsx("input", { id: "fa-media-preset-name", className: inputClassName, value: name, onChange: (event) => setName(event.currentTarget.value) })] }), _jsxs("div", { className: "fa-media-field-control", children: [_jsx("label", { className: labelClassName, htmlFor: "fa-media-preset-width", children: "Width" }), _jsx("input", { id: "fa-media-preset-width", className: inputClassName, type: "number", min: 1, value: width, onChange: (event) => setWidth(Number(event.currentTarget.value)) })] }), _jsxs("div", { className: "fa-media-field-control", children: [_jsx("label", { className: labelClassName, htmlFor: "fa-media-preset-format", children: "Format" }), _jsx("select", { id: "fa-media-preset-format", className: inputClassName, value: format, onChange: (event) => setFormat(event.currentTarget.value), children: FORMATS.map((value) => (_jsx("option", { value: value, children: value }, value))) })] }), _jsx("button", { type: "button", disabled: busy, onClick: () => void add(), children: "Add preset" })] })] }));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=PresetEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PresetEditor.js","sourceRoot":"","sources":["../../../../src/runtime/react/PresetEditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
/** Render children only when the auth adapter reports a superuser. */
|
|
3
|
+
export declare function RequireSuperuser({ children, fallback }: {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
fallback?: ReactNode;
|
|
6
|
+
}): import("react").JSX.Element | null;
|
|
7
|
+
//# sourceMappingURL=RequireSuperuser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequireSuperuser.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/RequireSuperuser.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAe,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,sCAI5G"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useMediaContext } from "./MediaProvider.js";
|
|
3
|
+
/** Render children only when the auth adapter reports a superuser. */
|
|
4
|
+
export function RequireSuperuser({ children, fallback = null }) {
|
|
5
|
+
const { isSuperuser, loading } = useMediaContext();
|
|
6
|
+
if (loading)
|
|
7
|
+
return null;
|
|
8
|
+
return _jsx(_Fragment, { children: isSuperuser ? children : fallback });
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=RequireSuperuser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequireSuperuser.js","sourceRoot":"","sources":["../../../../src/runtime/react/RequireSuperuser.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,sEAAsE;AACtE,MAAM,UAAU,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,EAAiD;IAC3G,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,eAAe,EAAE,CAAC;IACnD,IAAI,OAAO;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,4BAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAI,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VariantPicker.d.ts","sourceRoot":"","sources":["../../../../src/runtime/react/VariantPicker.tsx"],"names":[],"mappings":"AAOA,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,+BAkD/D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { useMediaPresets } from "../hooks/useMediaPresets.js";
|
|
4
|
+
import { useMediaVariants } from "../hooks/useMediaVariants.js";
|
|
5
|
+
const checkboxLabelClassName = "fa-media-label flex items-center gap-2 pb-2 text-sm leading-none font-medium select-none";
|
|
6
|
+
/** List variants for an object and generate new ones from named presets. */
|
|
7
|
+
export function VariantPicker({ objectId }) {
|
|
8
|
+
const { presets } = useMediaPresets();
|
|
9
|
+
const { items, job, generate, remove, error } = useMediaVariants(objectId);
|
|
10
|
+
const [selected, setSelected] = useState([]);
|
|
11
|
+
const [busy, setBusy] = useState(false);
|
|
12
|
+
function toggle(name) {
|
|
13
|
+
setSelected((prev) => (prev.includes(name) ? prev.filter((value) => value !== name) : [...prev, name]));
|
|
14
|
+
}
|
|
15
|
+
async function run() {
|
|
16
|
+
if (!selected.length)
|
|
17
|
+
return;
|
|
18
|
+
setBusy(true);
|
|
19
|
+
try {
|
|
20
|
+
await generate(selected);
|
|
21
|
+
}
|
|
22
|
+
finally {
|
|
23
|
+
setBusy(false);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return (_jsxs("section", { className: "not-content fa-media-panel", children: [_jsx("h3", { children: "Variants" }), error ? _jsx("p", { role: "alert", children: "Failed to load variants" }) : null, _jsx("ul", { className: "fa-media-variants", children: items.map((variant) => (_jsxs("li", { children: [variant.variant_name, " \u00B7 ", variant.format, " \u00B7 ", variant.width ?? "?", "\u00D7", variant.height ?? "?", _jsx("button", { type: "button", onClick: () => void remove(variant.id), children: "Delete" })] }, variant.id))) }), _jsxs("fieldset", { children: [_jsx("legend", { children: "Generate from presets" }), presets.map((preset) => (_jsxs("label", { className: checkboxLabelClassName, children: [_jsx("input", { type: "checkbox", checked: selected.includes(preset.name), onChange: () => toggle(preset.name) }), preset.name, preset.builtin ? " (built-in)" : ""] }, preset.name))), _jsx("button", { type: "button", disabled: busy || !selected.length, onClick: () => void run(), children: busy ? "Generating…" : "Generate" }), job ? _jsxs("p", { children: ["Job ", job.status, ": ", job.variants_created, "/", job.variants_expected] }) : null] })] }));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=VariantPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VariantPicker.js","sourceRoot":"","sources":["../../../../src/runtime/react/VariantPicker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { MediaRuntimeConfig } from "../../config.js";
|
|
2
|
+
type ViewConfig = Partial<Omit<MediaRuntimeConfig, "polling">> & {
|
|
3
|
+
polling?: Partial<MediaRuntimeConfig["polling"]>;
|
|
4
|
+
};
|
|
5
|
+
export declare function UploadView({ config, libraryHref }: {
|
|
6
|
+
config?: ViewConfig;
|
|
7
|
+
libraryHref?: string;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
9
|
+
export declare function LibraryView({ config, objectHref }: {
|
|
10
|
+
config?: ViewConfig;
|
|
11
|
+
objectHref?: (id: string) => string;
|
|
12
|
+
}): import("react").JSX.Element;
|
|
13
|
+
export declare function ObjectDetailView({ config, objectId, libraryHref }: {
|
|
14
|
+
config?: ViewConfig;
|
|
15
|
+
objectId: string;
|
|
16
|
+
libraryHref?: string;
|
|
17
|
+
}): import("react").JSX.Element;
|
|
18
|
+
export declare function PresetsView({ config }: {
|
|
19
|
+
config?: ViewConfig;
|
|
20
|
+
}): import("react").JSX.Element;
|
|
21
|
+
export declare function AdminMediaView({ config }: {
|
|
22
|
+
config?: ViewConfig;
|
|
23
|
+
}): import("react").JSX.Element;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/react/default-ui/index.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,KAAK,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC,GAAG;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC;CAClD,CAAC;AAUF,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,UAAU,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,+BAUhG;AAED,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,UAAU,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,+BAM/G;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,QAAQ,EACR,WAAW,EACZ,EAAE;IACD,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,+BAWA;AAED,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,UAAU,CAAA;CAAE,+BAM9D;AAED,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,UAAU,CAAA;CAAE,+BAMjE"}
|