@anvilkit/plugin-asset-manager 0.1.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 +21 -0
- package/README.md +159 -0
- package/dist/adapters/data-url.cjs +78 -0
- package/dist/adapters/data-url.d.cts +6 -0
- package/dist/adapters/data-url.d.cts.map +1 -0
- package/dist/adapters/data-url.d.ts +6 -0
- package/dist/adapters/data-url.d.ts.map +1 -0
- package/dist/adapters/data-url.js +44 -0
- package/dist/adapters/extract-image-dimensions.cjs +69 -0
- package/dist/adapters/extract-image-dimensions.d.cts +21 -0
- package/dist/adapters/extract-image-dimensions.d.cts.map +1 -0
- package/dist/adapters/extract-image-dimensions.d.ts +21 -0
- package/dist/adapters/extract-image-dimensions.d.ts.map +1 -0
- package/dist/adapters/extract-image-dimensions.js +35 -0
- package/dist/adapters/in-memory.cjs +62 -0
- package/dist/adapters/in-memory.d.cts +3 -0
- package/dist/adapters/in-memory.d.cts.map +1 -0
- package/dist/adapters/in-memory.d.ts +3 -0
- package/dist/adapters/in-memory.d.ts.map +1 -0
- package/dist/adapters/in-memory.js +28 -0
- package/dist/adapters/s3-presigned.cjs +166 -0
- package/dist/adapters/s3-presigned.d.cts +59 -0
- package/dist/adapters/s3-presigned.d.cts.map +1 -0
- package/dist/adapters/s3-presigned.d.ts +59 -0
- package/dist/adapters/s3-presigned.d.ts.map +1 -0
- package/dist/adapters/s3-presigned.js +129 -0
- package/dist/asset-reference.cjs +38 -0
- package/dist/asset-reference.d.cts +10 -0
- package/dist/asset-reference.d.cts.map +1 -0
- package/dist/asset-reference.d.ts +10 -0
- package/dist/asset-reference.d.ts.map +1 -0
- package/dist/asset-reference.js +4 -0
- package/dist/csp.cjs +83 -0
- package/dist/csp.d.cts +45 -0
- package/dist/csp.d.cts.map +1 -0
- package/dist/csp.d.ts +45 -0
- package/dist/csp.d.ts.map +1 -0
- package/dist/csp.js +49 -0
- package/dist/errors.cjs +58 -0
- package/dist/errors.d.cts +15 -0
- package/dist/errors.d.cts.map +1 -0
- package/dist/errors.d.ts +15 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +21 -0
- package/dist/header-action.cjs +44 -0
- package/dist/header-action.d.cts +3 -0
- package/dist/header-action.d.cts.map +1 -0
- package/dist/header-action.d.ts +3 -0
- package/dist/header-action.d.ts.map +1 -0
- package/dist/header-action.js +10 -0
- package/dist/index.cjs +90 -0
- package/dist/index.d.cts +18 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/infer-kind.cjs +45 -0
- package/dist/infer-kind.d.cts +8 -0
- package/dist/infer-kind.d.cts.map +1 -0
- package/dist/infer-kind.d.ts +8 -0
- package/dist/infer-kind.d.ts.map +1 -0
- package/dist/infer-kind.js +11 -0
- package/dist/plugin.cjs +258 -0
- package/dist/plugin.d.cts +9 -0
- package/dist/plugin.d.cts.map +1 -0
- package/dist/plugin.d.ts +9 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +212 -0
- package/dist/registry.cjs +198 -0
- package/dist/registry.d.cts +3 -0
- package/dist/registry.d.cts.map +1 -0
- package/dist/registry.d.ts +3 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +164 -0
- package/dist/resolver.cjs +185 -0
- package/dist/resolver.d.cts +10 -0
- package/dist/resolver.d.cts.map +1 -0
- package/dist/resolver.d.ts +10 -0
- package/dist/resolver.d.ts.map +1 -0
- package/dist/resolver.js +148 -0
- package/dist/retry.cjs +123 -0
- package/dist/retry.d.cts +71 -0
- package/dist/retry.d.cts.map +1 -0
- package/dist/retry.d.ts +71 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +86 -0
- package/dist/studio-asset-source.cjs +211 -0
- package/dist/studio-asset-source.d.cts +52 -0
- package/dist/studio-asset-source.d.cts.map +1 -0
- package/dist/studio-asset-source.d.ts +52 -0
- package/dist/studio-asset-source.d.ts.map +1 -0
- package/dist/studio-asset-source.js +171 -0
- package/dist/testing/index.cjs +66 -0
- package/dist/testing/index.d.cts +24 -0
- package/dist/testing/index.d.cts.map +1 -0
- package/dist/testing/index.d.ts +24 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +29 -0
- package/dist/types.cjs +18 -0
- package/dist/types.d.cts +132 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.ts +132 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +0 -0
- package/dist/ui/AssetBrowser.cjs +271 -0
- package/dist/ui/AssetBrowser.d.cts +45 -0
- package/dist/ui/AssetBrowser.d.cts.map +1 -0
- package/dist/ui/AssetBrowser.d.ts +45 -0
- package/dist/ui/AssetBrowser.d.ts.map +1 -0
- package/dist/ui/AssetBrowser.js +237 -0
- package/dist/ui/AssetCommandPalette.cjs +135 -0
- package/dist/ui/AssetCommandPalette.d.cts +21 -0
- package/dist/ui/AssetCommandPalette.d.cts.map +1 -0
- package/dist/ui/AssetCommandPalette.d.ts +21 -0
- package/dist/ui/AssetCommandPalette.d.ts.map +1 -0
- package/dist/ui/AssetCommandPalette.js +101 -0
- package/dist/ui/AssetManagerUI.cjs +169 -0
- package/dist/ui/AssetManagerUI.d.cts +15 -0
- package/dist/ui/AssetManagerUI.d.cts.map +1 -0
- package/dist/ui/AssetManagerUI.d.ts +15 -0
- package/dist/ui/AssetManagerUI.d.ts.map +1 -0
- package/dist/ui/AssetManagerUI.js +135 -0
- package/dist/ui/DeleteAssetDialog.cjs +70 -0
- package/dist/ui/DeleteAssetDialog.d.cts +22 -0
- package/dist/ui/DeleteAssetDialog.d.cts.map +1 -0
- package/dist/ui/DeleteAssetDialog.d.ts +22 -0
- package/dist/ui/DeleteAssetDialog.d.ts.map +1 -0
- package/dist/ui/DeleteAssetDialog.js +36 -0
- package/dist/ui/MetadataPanel.cjs +147 -0
- package/dist/ui/MetadataPanel.d.cts +21 -0
- package/dist/ui/MetadataPanel.d.cts.map +1 -0
- package/dist/ui/MetadataPanel.d.ts +21 -0
- package/dist/ui/MetadataPanel.d.ts.map +1 -0
- package/dist/ui/MetadataPanel.js +113 -0
- package/dist/ui/ReplaceAssetDialog.cjs +125 -0
- package/dist/ui/ReplaceAssetDialog.d.cts +14 -0
- package/dist/ui/ReplaceAssetDialog.d.cts.map +1 -0
- package/dist/ui/ReplaceAssetDialog.d.ts +14 -0
- package/dist/ui/ReplaceAssetDialog.d.ts.map +1 -0
- package/dist/ui/ReplaceAssetDialog.js +91 -0
- package/dist/ui/UploadButton.cjs +189 -0
- package/dist/ui/UploadButton.d.cts +17 -0
- package/dist/ui/UploadButton.d.cts.map +1 -0
- package/dist/ui/UploadButton.d.ts +17 -0
- package/dist/ui/UploadButton.d.ts.map +1 -0
- package/dist/ui/UploadButton.js +155 -0
- package/dist/ui/index.cjs +60 -0
- package/dist/ui/index.d.cts +15 -0
- package/dist/ui/index.d.cts.map +1 -0
- package/dist/ui/index.d.ts +15 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +7 -0
- package/dist/validate-upload-result.cjs +149 -0
- package/dist/validate-upload-result.d.cts +9 -0
- package/dist/validate-upload-result.d.cts.map +1 -0
- package/dist/validate-upload-result.d.ts +9 -0
- package/dist/validate-upload-result.d.ts.map +1 -0
- package/dist/validate-upload-result.js +115 -0
- package/package.json +131 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
AssetManagerUI: ()=>AssetManagerUI
|
|
28
|
+
});
|
|
29
|
+
const card_namespaceObject = require("@anvilkit/ui/card");
|
|
30
|
+
const progress_namespaceObject = require("@anvilkit/ui/progress");
|
|
31
|
+
const external_react_namespaceObject = require("react");
|
|
32
|
+
const external_validate_upload_result_cjs_namespaceObject = require("../validate-upload-result.cjs");
|
|
33
|
+
const external_AssetBrowser_cjs_namespaceObject = require("./AssetBrowser.cjs");
|
|
34
|
+
const external_AssetCommandPalette_cjs_namespaceObject = require("./AssetCommandPalette.cjs");
|
|
35
|
+
const external_DeleteAssetDialog_cjs_namespaceObject = require("./DeleteAssetDialog.cjs");
|
|
36
|
+
const external_MetadataPanel_cjs_namespaceObject = require("./MetadataPanel.cjs");
|
|
37
|
+
const external_ReplaceAssetDialog_cjs_namespaceObject = require("./ReplaceAssetDialog.cjs");
|
|
38
|
+
const external_UploadButton_cjs_namespaceObject = require("./UploadButton.cjs");
|
|
39
|
+
function AssetManagerUI({ acceptedMimeTypes, allowMixedScriptHostnames, dataUrlAllowlistOptIn, maxFileSize, onAssetInserted, registry, searchEnabled = true, uploader }) {
|
|
40
|
+
const [assets, setAssets] = external_react_namespaceObject.useState(()=>registry.list());
|
|
41
|
+
const [progress, setProgress] = external_react_namespaceObject.useState(null);
|
|
42
|
+
const [pendingDelete, setPendingDelete] = external_react_namespaceObject.useState(null);
|
|
43
|
+
const [pendingReplace, setPendingReplace] = external_react_namespaceObject.useState(null);
|
|
44
|
+
const [pendingEdit, setPendingEdit] = external_react_namespaceObject.useState(null);
|
|
45
|
+
const [paletteOpen, setPaletteOpen] = external_react_namespaceObject.useState(false);
|
|
46
|
+
external_react_namespaceObject.useEffect(()=>{
|
|
47
|
+
setAssets(registry.list());
|
|
48
|
+
const unsubscribe = registry.subscribe(()=>{
|
|
49
|
+
setAssets(registry.list());
|
|
50
|
+
});
|
|
51
|
+
return unsubscribe;
|
|
52
|
+
}, [
|
|
53
|
+
registry
|
|
54
|
+
]);
|
|
55
|
+
external_react_namespaceObject.useEffect(()=>{
|
|
56
|
+
if (!searchEnabled) return;
|
|
57
|
+
function handler(event) {
|
|
58
|
+
if ((event.metaKey || event.ctrlKey) && "k" === event.key.toLowerCase()) {
|
|
59
|
+
event.preventDefault();
|
|
60
|
+
setPaletteOpen((current)=>!current);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
window.addEventListener("keydown", handler);
|
|
64
|
+
return ()=>{
|
|
65
|
+
window.removeEventListener("keydown", handler);
|
|
66
|
+
};
|
|
67
|
+
}, [
|
|
68
|
+
searchEnabled
|
|
69
|
+
]);
|
|
70
|
+
function handleUploaded(asset) {
|
|
71
|
+
const stored = registry.register(asset);
|
|
72
|
+
onAssetInserted?.(stored);
|
|
73
|
+
}
|
|
74
|
+
async function handleConfirmDelete(asset) {
|
|
75
|
+
registry.delete(asset.id);
|
|
76
|
+
setPendingDelete(null);
|
|
77
|
+
}
|
|
78
|
+
async function handleConfirmReplace(asset, file) {
|
|
79
|
+
const uploaded = await uploader(file);
|
|
80
|
+
const validated = (0, external_validate_upload_result_cjs_namespaceObject.validateUploadResult)({
|
|
81
|
+
...uploaded,
|
|
82
|
+
meta: {
|
|
83
|
+
size: file.size,
|
|
84
|
+
...file.type ? {
|
|
85
|
+
mimeType: file.type
|
|
86
|
+
} : {},
|
|
87
|
+
...uploaded.meta ?? {}
|
|
88
|
+
}
|
|
89
|
+
}, {
|
|
90
|
+
dataUrlAllowlistOptIn,
|
|
91
|
+
allowMixedScriptHostnames
|
|
92
|
+
});
|
|
93
|
+
registry.replace(asset.id, validated);
|
|
94
|
+
setPendingReplace(null);
|
|
95
|
+
}
|
|
96
|
+
async function handleConfirmEdit(asset, next) {
|
|
97
|
+
if ("" !== next.name && next.name !== asset.name) registry.rename(asset.id, next.name);
|
|
98
|
+
registry.setTags(asset.id, next.tags);
|
|
99
|
+
setPendingEdit(null);
|
|
100
|
+
}
|
|
101
|
+
const showProgress = null !== progress && progress.total > 0;
|
|
102
|
+
const percent = showProgress ? Math.round(progress.completed / progress.total * 100) : 0;
|
|
103
|
+
return /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.Card, null, /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardHeader, null, /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardTitle, null, "Asset manager"), /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardDescription, null, "Upload via the configured adapter, then insert a validated asset reference.")), /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardContent, null, /*#__PURE__*/ external_react_namespaceObject.createElement(external_UploadButton_cjs_namespaceObject.UploadButton, {
|
|
104
|
+
acceptedMimeTypes: acceptedMimeTypes,
|
|
105
|
+
allowMixedScriptHostnames: allowMixedScriptHostnames,
|
|
106
|
+
dataUrlAllowlistOptIn: dataUrlAllowlistOptIn,
|
|
107
|
+
maxFileSize: maxFileSize,
|
|
108
|
+
onProgress: setProgress,
|
|
109
|
+
onUploaded: handleUploaded,
|
|
110
|
+
uploader: uploader
|
|
111
|
+
}), showProgress ? /*#__PURE__*/ external_react_namespaceObject.createElement("div", {
|
|
112
|
+
"data-asset-manager-progress": true
|
|
113
|
+
}, /*#__PURE__*/ external_react_namespaceObject.createElement(progress_namespaceObject.Progress, {
|
|
114
|
+
"aria-label": "Batch upload progress",
|
|
115
|
+
value: percent
|
|
116
|
+
}), /*#__PURE__*/ external_react_namespaceObject.createElement("p", {
|
|
117
|
+
"aria-live": "polite",
|
|
118
|
+
role: "status"
|
|
119
|
+
}, "Uploading ", progress.completed, " of ", progress.total)) : null, /*#__PURE__*/ external_react_namespaceObject.createElement(external_AssetBrowser_cjs_namespaceObject.AssetBrowser, {
|
|
120
|
+
assets: assets,
|
|
121
|
+
onDelete: (asset)=>{
|
|
122
|
+
setPendingDelete(asset);
|
|
123
|
+
},
|
|
124
|
+
onEdit: (asset)=>{
|
|
125
|
+
setPendingEdit(asset);
|
|
126
|
+
},
|
|
127
|
+
onInsert: (asset)=>{
|
|
128
|
+
onAssetInserted?.(asset);
|
|
129
|
+
},
|
|
130
|
+
onReplace: (asset)=>{
|
|
131
|
+
setPendingReplace(asset);
|
|
132
|
+
},
|
|
133
|
+
searchEnabled: searchEnabled
|
|
134
|
+
}), /*#__PURE__*/ external_react_namespaceObject.createElement(external_DeleteAssetDialog_cjs_namespaceObject.DeleteAssetDialog, {
|
|
135
|
+
asset: pendingDelete,
|
|
136
|
+
onCancel: ()=>{
|
|
137
|
+
setPendingDelete(null);
|
|
138
|
+
},
|
|
139
|
+
onConfirm: handleConfirmDelete
|
|
140
|
+
}), /*#__PURE__*/ external_react_namespaceObject.createElement(external_ReplaceAssetDialog_cjs_namespaceObject.ReplaceAssetDialog, {
|
|
141
|
+
acceptedMimeTypes: acceptedMimeTypes,
|
|
142
|
+
asset: pendingReplace,
|
|
143
|
+
maxFileSize: maxFileSize,
|
|
144
|
+
onCancel: ()=>{
|
|
145
|
+
setPendingReplace(null);
|
|
146
|
+
},
|
|
147
|
+
onConfirm: handleConfirmReplace
|
|
148
|
+
}), /*#__PURE__*/ external_react_namespaceObject.createElement(external_MetadataPanel_cjs_namespaceObject.MetadataPanel, {
|
|
149
|
+
asset: pendingEdit,
|
|
150
|
+
onCancel: ()=>{
|
|
151
|
+
setPendingEdit(null);
|
|
152
|
+
},
|
|
153
|
+
onConfirm: handleConfirmEdit
|
|
154
|
+
}), searchEnabled ? /*#__PURE__*/ external_react_namespaceObject.createElement(external_AssetCommandPalette_cjs_namespaceObject.AssetCommandPalette, {
|
|
155
|
+
onOpenChange: setPaletteOpen,
|
|
156
|
+
onSelect: (asset)=>{
|
|
157
|
+
onAssetInserted?.(asset);
|
|
158
|
+
},
|
|
159
|
+
open: paletteOpen,
|
|
160
|
+
registry: registry
|
|
161
|
+
}) : null));
|
|
162
|
+
}
|
|
163
|
+
exports.AssetManagerUI = __webpack_exports__.AssetManagerUI;
|
|
164
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
165
|
+
"AssetManagerUI"
|
|
166
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
167
|
+
Object.defineProperty(exports, '__esModule', {
|
|
168
|
+
value: true
|
|
169
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AssetManagerOptions, AssetRegistry, UploadResult } from "../types.js";
|
|
2
|
+
export interface AssetManagerUIProps extends Pick<AssetManagerOptions, "acceptedMimeTypes" | "maxFileSize" | "uploader" | "dataUrlAllowlistOptIn" | "allowMixedScriptHostnames"> {
|
|
3
|
+
readonly registry: AssetRegistry;
|
|
4
|
+
readonly onAssetInserted?: (asset: UploadResult) => void;
|
|
5
|
+
/**
|
|
6
|
+
* When `true`, exposes the search input + kind chips on the embedded
|
|
7
|
+
* `AssetBrowser` and enables Cmd-K / Ctrl-K to open the
|
|
8
|
+
* `AssetCommandPalette`. Defaults to `true` because Phase 3 is the
|
|
9
|
+
* library-management milestone — hosts that want the lean Phase 1
|
|
10
|
+
* chrome can opt out.
|
|
11
|
+
*/
|
|
12
|
+
readonly searchEnabled?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function AssetManagerUI({ acceptedMimeTypes, allowMixedScriptHostnames, dataUrlAllowlistOptIn, maxFileSize, onAssetInserted, registry, searchEnabled, uploader, }: AssetManagerUIProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=AssetManagerUI.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssetManagerUI.d.cts","sourceRoot":"","sources":["../../src/ui/AssetManagerUI.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACX,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,MAAM,aAAa,CAAC;AASrB,MAAM,WAAW,mBAChB,SAAQ,IAAI,CACX,mBAAmB,EACjB,mBAAmB,GACnB,aAAa,GACb,UAAU,GACV,uBAAuB,GACvB,2BAA2B,CAC7B;IACD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACzD;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,wBAAgB,cAAc,CAAC,EAC9B,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,EACrB,WAAW,EACX,eAAe,EACf,QAAQ,EACR,aAAoB,EACpB,QAAQ,GACR,EAAE,mBAAmB,2CAiKrB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AssetManagerOptions, AssetRegistry, UploadResult } from "../types.js";
|
|
2
|
+
export interface AssetManagerUIProps extends Pick<AssetManagerOptions, "acceptedMimeTypes" | "maxFileSize" | "uploader" | "dataUrlAllowlistOptIn" | "allowMixedScriptHostnames"> {
|
|
3
|
+
readonly registry: AssetRegistry;
|
|
4
|
+
readonly onAssetInserted?: (asset: UploadResult) => void;
|
|
5
|
+
/**
|
|
6
|
+
* When `true`, exposes the search input + kind chips on the embedded
|
|
7
|
+
* `AssetBrowser` and enables Cmd-K / Ctrl-K to open the
|
|
8
|
+
* `AssetCommandPalette`. Defaults to `true` because Phase 3 is the
|
|
9
|
+
* library-management milestone — hosts that want the lean Phase 1
|
|
10
|
+
* chrome can opt out.
|
|
11
|
+
*/
|
|
12
|
+
readonly searchEnabled?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function AssetManagerUI({ acceptedMimeTypes, allowMixedScriptHostnames, dataUrlAllowlistOptIn, maxFileSize, onAssetInserted, registry, searchEnabled, uploader, }: AssetManagerUIProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=AssetManagerUI.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssetManagerUI.d.ts","sourceRoot":"","sources":["../../src/ui/AssetManagerUI.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACX,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,MAAM,aAAa,CAAC;AASrB,MAAM,WAAW,mBAChB,SAAQ,IAAI,CACX,mBAAmB,EACjB,mBAAmB,GACnB,aAAa,GACb,UAAU,GACV,uBAAuB,GACvB,2BAA2B,CAC7B;IACD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACzD;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,wBAAgB,cAAc,CAAC,EAC9B,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,EACrB,WAAW,EACX,eAAe,EACf,QAAQ,EACR,aAAoB,EACpB,QAAQ,GACR,EAAE,mBAAmB,2CAiKrB"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@anvilkit/ui/card";
|
|
2
|
+
import { Progress } from "@anvilkit/ui/progress";
|
|
3
|
+
import { validateUploadResult } from "../validate-upload-result.js";
|
|
4
|
+
import { AssetBrowser } from "./AssetBrowser.js";
|
|
5
|
+
import { AssetCommandPalette } from "./AssetCommandPalette.js";
|
|
6
|
+
import { DeleteAssetDialog } from "./DeleteAssetDialog.js";
|
|
7
|
+
import { MetadataPanel } from "./MetadataPanel.js";
|
|
8
|
+
import { ReplaceAssetDialog } from "./ReplaceAssetDialog.js";
|
|
9
|
+
import { UploadButton } from "./UploadButton.js";
|
|
10
|
+
import * as __rspack_external_react from "react";
|
|
11
|
+
function AssetManagerUI({ acceptedMimeTypes, allowMixedScriptHostnames, dataUrlAllowlistOptIn, maxFileSize, onAssetInserted, registry, searchEnabled = true, uploader }) {
|
|
12
|
+
const [assets, setAssets] = __rspack_external_react.useState(()=>registry.list());
|
|
13
|
+
const [progress, setProgress] = __rspack_external_react.useState(null);
|
|
14
|
+
const [pendingDelete, setPendingDelete] = __rspack_external_react.useState(null);
|
|
15
|
+
const [pendingReplace, setPendingReplace] = __rspack_external_react.useState(null);
|
|
16
|
+
const [pendingEdit, setPendingEdit] = __rspack_external_react.useState(null);
|
|
17
|
+
const [paletteOpen, setPaletteOpen] = __rspack_external_react.useState(false);
|
|
18
|
+
__rspack_external_react.useEffect(()=>{
|
|
19
|
+
setAssets(registry.list());
|
|
20
|
+
const unsubscribe = registry.subscribe(()=>{
|
|
21
|
+
setAssets(registry.list());
|
|
22
|
+
});
|
|
23
|
+
return unsubscribe;
|
|
24
|
+
}, [
|
|
25
|
+
registry
|
|
26
|
+
]);
|
|
27
|
+
__rspack_external_react.useEffect(()=>{
|
|
28
|
+
if (!searchEnabled) return;
|
|
29
|
+
function handler(event) {
|
|
30
|
+
if ((event.metaKey || event.ctrlKey) && "k" === event.key.toLowerCase()) {
|
|
31
|
+
event.preventDefault();
|
|
32
|
+
setPaletteOpen((current)=>!current);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
window.addEventListener("keydown", handler);
|
|
36
|
+
return ()=>{
|
|
37
|
+
window.removeEventListener("keydown", handler);
|
|
38
|
+
};
|
|
39
|
+
}, [
|
|
40
|
+
searchEnabled
|
|
41
|
+
]);
|
|
42
|
+
function handleUploaded(asset) {
|
|
43
|
+
const stored = registry.register(asset);
|
|
44
|
+
onAssetInserted?.(stored);
|
|
45
|
+
}
|
|
46
|
+
async function handleConfirmDelete(asset) {
|
|
47
|
+
registry.delete(asset.id);
|
|
48
|
+
setPendingDelete(null);
|
|
49
|
+
}
|
|
50
|
+
async function handleConfirmReplace(asset, file) {
|
|
51
|
+
const uploaded = await uploader(file);
|
|
52
|
+
const validated = validateUploadResult({
|
|
53
|
+
...uploaded,
|
|
54
|
+
meta: {
|
|
55
|
+
size: file.size,
|
|
56
|
+
...file.type ? {
|
|
57
|
+
mimeType: file.type
|
|
58
|
+
} : {},
|
|
59
|
+
...uploaded.meta ?? {}
|
|
60
|
+
}
|
|
61
|
+
}, {
|
|
62
|
+
dataUrlAllowlistOptIn,
|
|
63
|
+
allowMixedScriptHostnames
|
|
64
|
+
});
|
|
65
|
+
registry.replace(asset.id, validated);
|
|
66
|
+
setPendingReplace(null);
|
|
67
|
+
}
|
|
68
|
+
async function handleConfirmEdit(asset, next) {
|
|
69
|
+
if ("" !== next.name && next.name !== asset.name) registry.rename(asset.id, next.name);
|
|
70
|
+
registry.setTags(asset.id, next.tags);
|
|
71
|
+
setPendingEdit(null);
|
|
72
|
+
}
|
|
73
|
+
const showProgress = null !== progress && progress.total > 0;
|
|
74
|
+
const percent = showProgress ? Math.round(progress.completed / progress.total * 100) : 0;
|
|
75
|
+
return /*#__PURE__*/ __rspack_external_react.createElement(Card, null, /*#__PURE__*/ __rspack_external_react.createElement(CardHeader, null, /*#__PURE__*/ __rspack_external_react.createElement(CardTitle, null, "Asset manager"), /*#__PURE__*/ __rspack_external_react.createElement(CardDescription, null, "Upload via the configured adapter, then insert a validated asset reference.")), /*#__PURE__*/ __rspack_external_react.createElement(CardContent, null, /*#__PURE__*/ __rspack_external_react.createElement(UploadButton, {
|
|
76
|
+
acceptedMimeTypes: acceptedMimeTypes,
|
|
77
|
+
allowMixedScriptHostnames: allowMixedScriptHostnames,
|
|
78
|
+
dataUrlAllowlistOptIn: dataUrlAllowlistOptIn,
|
|
79
|
+
maxFileSize: maxFileSize,
|
|
80
|
+
onProgress: setProgress,
|
|
81
|
+
onUploaded: handleUploaded,
|
|
82
|
+
uploader: uploader
|
|
83
|
+
}), showProgress ? /*#__PURE__*/ __rspack_external_react.createElement("div", {
|
|
84
|
+
"data-asset-manager-progress": true
|
|
85
|
+
}, /*#__PURE__*/ __rspack_external_react.createElement(Progress, {
|
|
86
|
+
"aria-label": "Batch upload progress",
|
|
87
|
+
value: percent
|
|
88
|
+
}), /*#__PURE__*/ __rspack_external_react.createElement("p", {
|
|
89
|
+
"aria-live": "polite",
|
|
90
|
+
role: "status"
|
|
91
|
+
}, "Uploading ", progress.completed, " of ", progress.total)) : null, /*#__PURE__*/ __rspack_external_react.createElement(AssetBrowser, {
|
|
92
|
+
assets: assets,
|
|
93
|
+
onDelete: (asset)=>{
|
|
94
|
+
setPendingDelete(asset);
|
|
95
|
+
},
|
|
96
|
+
onEdit: (asset)=>{
|
|
97
|
+
setPendingEdit(asset);
|
|
98
|
+
},
|
|
99
|
+
onInsert: (asset)=>{
|
|
100
|
+
onAssetInserted?.(asset);
|
|
101
|
+
},
|
|
102
|
+
onReplace: (asset)=>{
|
|
103
|
+
setPendingReplace(asset);
|
|
104
|
+
},
|
|
105
|
+
searchEnabled: searchEnabled
|
|
106
|
+
}), /*#__PURE__*/ __rspack_external_react.createElement(DeleteAssetDialog, {
|
|
107
|
+
asset: pendingDelete,
|
|
108
|
+
onCancel: ()=>{
|
|
109
|
+
setPendingDelete(null);
|
|
110
|
+
},
|
|
111
|
+
onConfirm: handleConfirmDelete
|
|
112
|
+
}), /*#__PURE__*/ __rspack_external_react.createElement(ReplaceAssetDialog, {
|
|
113
|
+
acceptedMimeTypes: acceptedMimeTypes,
|
|
114
|
+
asset: pendingReplace,
|
|
115
|
+
maxFileSize: maxFileSize,
|
|
116
|
+
onCancel: ()=>{
|
|
117
|
+
setPendingReplace(null);
|
|
118
|
+
},
|
|
119
|
+
onConfirm: handleConfirmReplace
|
|
120
|
+
}), /*#__PURE__*/ __rspack_external_react.createElement(MetadataPanel, {
|
|
121
|
+
asset: pendingEdit,
|
|
122
|
+
onCancel: ()=>{
|
|
123
|
+
setPendingEdit(null);
|
|
124
|
+
},
|
|
125
|
+
onConfirm: handleConfirmEdit
|
|
126
|
+
}), searchEnabled ? /*#__PURE__*/ __rspack_external_react.createElement(AssetCommandPalette, {
|
|
127
|
+
onOpenChange: setPaletteOpen,
|
|
128
|
+
onSelect: (asset)=>{
|
|
129
|
+
onAssetInserted?.(asset);
|
|
130
|
+
},
|
|
131
|
+
open: paletteOpen,
|
|
132
|
+
registry: registry
|
|
133
|
+
}) : null));
|
|
134
|
+
}
|
|
135
|
+
export { AssetManagerUI };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
DeleteAssetDialog: ()=>DeleteAssetDialog
|
|
28
|
+
});
|
|
29
|
+
const button_namespaceObject = require("@anvilkit/ui/button");
|
|
30
|
+
const dialog_namespaceObject = require("@anvilkit/ui/dialog");
|
|
31
|
+
const external_react_namespaceObject = require("react");
|
|
32
|
+
function DeleteAssetDialog({ asset, onCancel, onConfirm, referenceCount }) {
|
|
33
|
+
const [busy, setBusy] = external_react_namespaceObject.useState(false);
|
|
34
|
+
async function handleConfirm() {
|
|
35
|
+
if (null === asset || busy) return;
|
|
36
|
+
setBusy(true);
|
|
37
|
+
try {
|
|
38
|
+
await onConfirm(asset);
|
|
39
|
+
} finally{
|
|
40
|
+
setBusy(false);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function handleOpenChange(nextOpen) {
|
|
44
|
+
if (!nextOpen && !busy) onCancel();
|
|
45
|
+
}
|
|
46
|
+
const open = null !== asset;
|
|
47
|
+
const label = asset?.name ?? asset?.id ?? "";
|
|
48
|
+
const mimeType = asset?.meta?.mimeType;
|
|
49
|
+
return /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.Dialog, {
|
|
50
|
+
open: open,
|
|
51
|
+
onOpenChange: handleOpenChange
|
|
52
|
+
}, /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogContent, null, /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogHeader, null, /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogTitle, null, "Delete asset?"), /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogDescription, null, label, mimeType ? ` (${mimeType})` : "", " will be removed from the registry. References to it in the page will fail to resolve.", "number" == typeof referenceCount && referenceCount > 0 ? ` This asset is referenced in ${referenceCount} ${1 === referenceCount ? "node" : "nodes"}.` : "")), /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogFooter, null, /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
|
|
53
|
+
type: "button",
|
|
54
|
+
variant: "outline",
|
|
55
|
+
onClick: onCancel,
|
|
56
|
+
disabled: busy
|
|
57
|
+
}, "Cancel"), /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
|
|
58
|
+
type: "button",
|
|
59
|
+
variant: "destructive",
|
|
60
|
+
onClick: handleConfirm,
|
|
61
|
+
disabled: busy || null === asset
|
|
62
|
+
}, busy ? "Deleting…" : "Delete"))));
|
|
63
|
+
}
|
|
64
|
+
exports.DeleteAssetDialog = __webpack_exports__.DeleteAssetDialog;
|
|
65
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
66
|
+
"DeleteAssetDialog"
|
|
67
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
68
|
+
Object.defineProperty(exports, '__esModule', {
|
|
69
|
+
value: true
|
|
70
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { UploadResult } from "../types.js";
|
|
2
|
+
export interface DeleteAssetDialogProps {
|
|
3
|
+
/**
|
|
4
|
+
* Asset to confirm deletion for. When `null`, the dialog is closed.
|
|
5
|
+
* Setting this to an asset opens the dialog; the host clears it on
|
|
6
|
+
* cancel or after confirm resolves.
|
|
7
|
+
*/
|
|
8
|
+
readonly asset: UploadResult | null;
|
|
9
|
+
/**
|
|
10
|
+
* Called when the user confirms. May return a Promise to keep the
|
|
11
|
+
* "Delete" button in a busy state until it settles.
|
|
12
|
+
*/
|
|
13
|
+
readonly onConfirm: (asset: UploadResult) => void | Promise<void>;
|
|
14
|
+
readonly onCancel: () => void;
|
|
15
|
+
/**
|
|
16
|
+
* Optional context such as "This asset is referenced in 2 nodes".
|
|
17
|
+
* Rendered after the default destructive-action description.
|
|
18
|
+
*/
|
|
19
|
+
readonly referenceCount?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare function DeleteAssetDialog({ asset, onCancel, onConfirm, referenceCount, }: DeleteAssetDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=DeleteAssetDialog.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeleteAssetDialog.d.cts","sourceRoot":"","sources":["../../src/ui/DeleteAssetDialog.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,sBAAsB;IACtC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,wBAAgB,iBAAiB,CAAC,EACjC,KAAK,EACL,QAAQ,EACR,SAAS,EACT,cAAc,GACd,EAAE,sBAAsB,2CA8DxB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { UploadResult } from "../types.js";
|
|
2
|
+
export interface DeleteAssetDialogProps {
|
|
3
|
+
/**
|
|
4
|
+
* Asset to confirm deletion for. When `null`, the dialog is closed.
|
|
5
|
+
* Setting this to an asset opens the dialog; the host clears it on
|
|
6
|
+
* cancel or after confirm resolves.
|
|
7
|
+
*/
|
|
8
|
+
readonly asset: UploadResult | null;
|
|
9
|
+
/**
|
|
10
|
+
* Called when the user confirms. May return a Promise to keep the
|
|
11
|
+
* "Delete" button in a busy state until it settles.
|
|
12
|
+
*/
|
|
13
|
+
readonly onConfirm: (asset: UploadResult) => void | Promise<void>;
|
|
14
|
+
readonly onCancel: () => void;
|
|
15
|
+
/**
|
|
16
|
+
* Optional context such as "This asset is referenced in 2 nodes".
|
|
17
|
+
* Rendered after the default destructive-action description.
|
|
18
|
+
*/
|
|
19
|
+
readonly referenceCount?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare function DeleteAssetDialog({ asset, onCancel, onConfirm, referenceCount, }: DeleteAssetDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=DeleteAssetDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeleteAssetDialog.d.ts","sourceRoot":"","sources":["../../src/ui/DeleteAssetDialog.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,sBAAsB;IACtC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,wBAAgB,iBAAiB,CAAC,EACjC,KAAK,EACL,QAAQ,EACR,SAAS,EACT,cAAc,GACd,EAAE,sBAAsB,2CA8DxB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Button } from "@anvilkit/ui/button";
|
|
2
|
+
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@anvilkit/ui/dialog";
|
|
3
|
+
import * as __rspack_external_react from "react";
|
|
4
|
+
function DeleteAssetDialog({ asset, onCancel, onConfirm, referenceCount }) {
|
|
5
|
+
const [busy, setBusy] = __rspack_external_react.useState(false);
|
|
6
|
+
async function handleConfirm() {
|
|
7
|
+
if (null === asset || busy) return;
|
|
8
|
+
setBusy(true);
|
|
9
|
+
try {
|
|
10
|
+
await onConfirm(asset);
|
|
11
|
+
} finally{
|
|
12
|
+
setBusy(false);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function handleOpenChange(nextOpen) {
|
|
16
|
+
if (!nextOpen && !busy) onCancel();
|
|
17
|
+
}
|
|
18
|
+
const open = null !== asset;
|
|
19
|
+
const label = asset?.name ?? asset?.id ?? "";
|
|
20
|
+
const mimeType = asset?.meta?.mimeType;
|
|
21
|
+
return /*#__PURE__*/ __rspack_external_react.createElement(Dialog, {
|
|
22
|
+
open: open,
|
|
23
|
+
onOpenChange: handleOpenChange
|
|
24
|
+
}, /*#__PURE__*/ __rspack_external_react.createElement(DialogContent, null, /*#__PURE__*/ __rspack_external_react.createElement(DialogHeader, null, /*#__PURE__*/ __rspack_external_react.createElement(DialogTitle, null, "Delete asset?"), /*#__PURE__*/ __rspack_external_react.createElement(DialogDescription, null, label, mimeType ? ` (${mimeType})` : "", " will be removed from the registry. References to it in the page will fail to resolve.", "number" == typeof referenceCount && referenceCount > 0 ? ` This asset is referenced in ${referenceCount} ${1 === referenceCount ? "node" : "nodes"}.` : "")), /*#__PURE__*/ __rspack_external_react.createElement(DialogFooter, null, /*#__PURE__*/ __rspack_external_react.createElement(Button, {
|
|
25
|
+
type: "button",
|
|
26
|
+
variant: "outline",
|
|
27
|
+
onClick: onCancel,
|
|
28
|
+
disabled: busy
|
|
29
|
+
}, "Cancel"), /*#__PURE__*/ __rspack_external_react.createElement(Button, {
|
|
30
|
+
type: "button",
|
|
31
|
+
variant: "destructive",
|
|
32
|
+
onClick: handleConfirm,
|
|
33
|
+
disabled: busy || null === asset
|
|
34
|
+
}, busy ? "Deleting…" : "Delete"))));
|
|
35
|
+
}
|
|
36
|
+
export { DeleteAssetDialog };
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
MetadataPanel: ()=>MetadataPanel
|
|
28
|
+
});
|
|
29
|
+
const button_namespaceObject = require("@anvilkit/ui/button");
|
|
30
|
+
const dialog_namespaceObject = require("@anvilkit/ui/dialog");
|
|
31
|
+
const input_namespaceObject = require("@anvilkit/ui/input");
|
|
32
|
+
const external_react_namespaceObject = require("react");
|
|
33
|
+
function MetadataPanel({ asset, onCancel, onConfirm }) {
|
|
34
|
+
const [name, setName] = external_react_namespaceObject.useState("");
|
|
35
|
+
const [tagInput, setTagInput] = external_react_namespaceObject.useState("");
|
|
36
|
+
const [tags, setTags] = external_react_namespaceObject.useState([]);
|
|
37
|
+
const [busy, setBusy] = external_react_namespaceObject.useState(false);
|
|
38
|
+
external_react_namespaceObject.useEffect(()=>{
|
|
39
|
+
if (null === asset) return;
|
|
40
|
+
setName(asset.name ?? "");
|
|
41
|
+
setTags(asset.tags ?? []);
|
|
42
|
+
setTagInput("");
|
|
43
|
+
setBusy(false);
|
|
44
|
+
}, [
|
|
45
|
+
asset
|
|
46
|
+
]);
|
|
47
|
+
function commitTagInput() {
|
|
48
|
+
const next = tagInput.trim().toLowerCase();
|
|
49
|
+
if ("" === next) return tags;
|
|
50
|
+
if (tags.includes(next)) {
|
|
51
|
+
setTagInput("");
|
|
52
|
+
return tags;
|
|
53
|
+
}
|
|
54
|
+
const merged = [
|
|
55
|
+
...tags,
|
|
56
|
+
next
|
|
57
|
+
];
|
|
58
|
+
setTags(merged);
|
|
59
|
+
setTagInput("");
|
|
60
|
+
return merged;
|
|
61
|
+
}
|
|
62
|
+
function removeTag(value) {
|
|
63
|
+
setTags((current)=>current.filter((entry)=>entry !== value));
|
|
64
|
+
}
|
|
65
|
+
function handleTagKeyDown(event) {
|
|
66
|
+
if ("Enter" === event.key || "," === event.key) {
|
|
67
|
+
event.preventDefault();
|
|
68
|
+
commitTagInput();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async function handleConfirm() {
|
|
72
|
+
if (null === asset || busy) return;
|
|
73
|
+
const finalTags = "" === tagInput.trim() ? tags : commitTagInput();
|
|
74
|
+
setBusy(true);
|
|
75
|
+
try {
|
|
76
|
+
await onConfirm(asset, {
|
|
77
|
+
name: name.trim(),
|
|
78
|
+
tags: finalTags
|
|
79
|
+
});
|
|
80
|
+
} finally{
|
|
81
|
+
setBusy(false);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function handleOpenChange(nextOpen) {
|
|
85
|
+
if (!nextOpen && !busy) onCancel();
|
|
86
|
+
}
|
|
87
|
+
const open = null !== asset;
|
|
88
|
+
const mimeType = asset?.meta?.mimeType;
|
|
89
|
+
return /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.Dialog, {
|
|
90
|
+
open: open,
|
|
91
|
+
onOpenChange: handleOpenChange
|
|
92
|
+
}, /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogContent, null, /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogHeader, null, /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogTitle, null, "Edit asset"), /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogDescription, null, asset?.id, mimeType ? ` (${mimeType})` : "")), /*#__PURE__*/ external_react_namespaceObject.createElement("div", {
|
|
93
|
+
"data-asset-manager-metadata": true
|
|
94
|
+
}, /*#__PURE__*/ external_react_namespaceObject.createElement("label", {
|
|
95
|
+
htmlFor: "asset-metadata-name"
|
|
96
|
+
}, "Name"), /*#__PURE__*/ external_react_namespaceObject.createElement(input_namespaceObject.Input, {
|
|
97
|
+
id: "asset-metadata-name",
|
|
98
|
+
value: name,
|
|
99
|
+
onChange: (event)=>{
|
|
100
|
+
setName(event.target.value);
|
|
101
|
+
},
|
|
102
|
+
placeholder: asset?.id ?? "",
|
|
103
|
+
disabled: busy
|
|
104
|
+
}), /*#__PURE__*/ external_react_namespaceObject.createElement("div", {
|
|
105
|
+
"data-asset-manager-tag-editor": true
|
|
106
|
+
}, /*#__PURE__*/ external_react_namespaceObject.createElement("label", {
|
|
107
|
+
htmlFor: "asset-metadata-tag-input"
|
|
108
|
+
}, "Tags"), /*#__PURE__*/ external_react_namespaceObject.createElement("ul", {
|
|
109
|
+
"aria-label": "Current tags",
|
|
110
|
+
role: "list"
|
|
111
|
+
}, tags.map((tag)=>/*#__PURE__*/ external_react_namespaceObject.createElement("li", {
|
|
112
|
+
key: tag
|
|
113
|
+
}, /*#__PURE__*/ external_react_namespaceObject.createElement("span", null, tag), /*#__PURE__*/ external_react_namespaceObject.createElement("button", {
|
|
114
|
+
"aria-label": `Remove tag ${tag}`,
|
|
115
|
+
"data-asset-action": "remove-tag",
|
|
116
|
+
disabled: busy,
|
|
117
|
+
onClick: ()=>{
|
|
118
|
+
removeTag(tag);
|
|
119
|
+
},
|
|
120
|
+
type: "button"
|
|
121
|
+
}, "\xd7")))), /*#__PURE__*/ external_react_namespaceObject.createElement(input_namespaceObject.Input, {
|
|
122
|
+
id: "asset-metadata-tag-input",
|
|
123
|
+
value: tagInput,
|
|
124
|
+
onChange: (event)=>{
|
|
125
|
+
setTagInput(event.target.value);
|
|
126
|
+
},
|
|
127
|
+
onKeyDown: handleTagKeyDown,
|
|
128
|
+
placeholder: "Add a tag and press Enter",
|
|
129
|
+
disabled: busy
|
|
130
|
+
}))), /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogFooter, null, /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
|
|
131
|
+
disabled: busy,
|
|
132
|
+
onClick: onCancel,
|
|
133
|
+
type: "button",
|
|
134
|
+
variant: "outline"
|
|
135
|
+
}, "Cancel"), /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
|
|
136
|
+
disabled: busy || null === asset,
|
|
137
|
+
onClick: handleConfirm,
|
|
138
|
+
type: "button"
|
|
139
|
+
}, busy ? "Saving…" : "Save"))));
|
|
140
|
+
}
|
|
141
|
+
exports.MetadataPanel = __webpack_exports__.MetadataPanel;
|
|
142
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
143
|
+
"MetadataPanel"
|
|
144
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
145
|
+
Object.defineProperty(exports, '__esModule', {
|
|
146
|
+
value: true
|
|
147
|
+
});
|