sa2kit 1.2.1 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{UniversalFileService-C1rUWWU-.d.ts → UniversalFileService-BuHN-jrR.d.ts} +46 -2
- package/dist/{UniversalFileService-DrCK0-NL.d.mts → UniversalFileService-CGGzYeeF.d.mts} +46 -2
- package/dist/{chunk-3XG5OHFD.mjs → chunk-CIVO4R6N.mjs} +2 -2
- package/dist/{chunk-3XG5OHFD.mjs.map → chunk-CIVO4R6N.mjs.map} +1 -1
- package/dist/chunk-EV6BCVOQ.mjs +204 -0
- package/dist/chunk-EV6BCVOQ.mjs.map +1 -0
- package/dist/chunk-W35VTQAW.js +211 -0
- package/dist/chunk-W35VTQAW.js.map +1 -0
- package/dist/{chunk-HWJ34NL6.js → chunk-ZRAW3HXA.js} +2 -2
- package/dist/{chunk-HWJ34NL6.js.map → chunk-ZRAW3HXA.js.map} +1 -1
- package/dist/drizzle-schema-BNhqj2AZ.d.mts +1114 -0
- package/dist/drizzle-schema-BNhqj2AZ.d.ts +1114 -0
- package/dist/mmd/admin/index.d.mts +8 -1115
- package/dist/mmd/admin/index.d.ts +8 -1115
- package/dist/mmd/admin/index.js +98 -248
- package/dist/mmd/admin/index.js.map +1 -1
- package/dist/mmd/admin/index.mjs +75 -244
- package/dist/mmd/admin/index.mjs.map +1 -1
- package/dist/mmd/index.d.mts +265 -3
- package/dist/mmd/index.d.ts +265 -3
- package/dist/mmd/index.js +1266 -15
- package/dist/mmd/index.js.map +1 -1
- package/dist/mmd/index.mjs +1261 -16
- package/dist/mmd/index.mjs.map +1 -1
- package/dist/mmd/server/index.d.mts +138 -0
- package/dist/mmd/server/index.d.ts +138 -0
- package/dist/mmd/server/index.js +245 -0
- package/dist/mmd/server/index.js.map +1 -0
- package/dist/mmd/server/index.mjs +207 -0
- package/dist/mmd/server/index.mjs.map +1 -0
- package/dist/testYourself/index.d.mts +145 -0
- package/dist/testYourself/index.d.ts +145 -0
- package/dist/testYourself/index.js +1004 -0
- package/dist/testYourself/index.js.map +1 -0
- package/dist/testYourself/index.mjs +993 -0
- package/dist/testYourself/index.mjs.map +1 -0
- package/dist/{types-C2ale3d9.d.mts → types-Bc_p-zAR.d.mts} +1 -1
- package/dist/{types-C2ale3d9.d.ts → types-Bc_p-zAR.d.ts} +1 -1
- package/dist/{types-Dg-U_chI.d.mts → types-CK4We_aI.d.mts} +13 -1
- package/dist/{types-Dg-U_chI.d.ts → types-CK4We_aI.d.ts} +13 -1
- package/dist/universalFile/index.d.mts +3 -3
- package/dist/universalFile/index.d.ts +3 -3
- package/dist/universalFile/index.js +48 -10
- package/dist/universalFile/index.js.map +1 -1
- package/dist/universalFile/index.mjs +43 -5
- package/dist/universalFile/index.mjs.map +1 -1
- package/dist/universalFile/server/index.d.mts +3 -3
- package/dist/universalFile/server/index.d.ts +3 -3
- package/dist/universalFile/server/index.js +239 -7
- package/dist/universalFile/server/index.js.map +1 -1
- package/dist/universalFile/server/index.mjs +234 -2
- package/dist/universalFile/server/index.mjs.map +1 -1
- package/package.json +19 -1
package/dist/mmd/admin/index.js
CHANGED
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var chunkW35VTQAW_js = require('../../chunk-W35VTQAW.js');
|
|
3
4
|
require('../../chunk-DGUM43GV.js');
|
|
4
5
|
var React2 = require('react');
|
|
5
6
|
var lucideReact = require('lucide-react');
|
|
6
|
-
var
|
|
7
|
-
var pgCore = require('drizzle-orm/pg-core');
|
|
7
|
+
var JSZip = require('jszip');
|
|
8
8
|
|
|
9
9
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
10
|
|
|
11
11
|
var React2__default = /*#__PURE__*/_interopDefault(React2);
|
|
12
|
+
var JSZip__default = /*#__PURE__*/_interopDefault(JSZip);
|
|
12
13
|
|
|
13
14
|
// src/mmd/admin/types.ts
|
|
14
15
|
var MMD_RESOURCE_TYPE_CONFIGS = {
|
|
15
16
|
model: {
|
|
16
17
|
moduleId: "mmd-models",
|
|
17
|
-
acceptedTypes: [".
|
|
18
|
-
maxFileSize:
|
|
19
|
-
description: "MMD\u6A21\u578B\
|
|
18
|
+
acceptedTypes: [".zip"],
|
|
19
|
+
maxFileSize: 150,
|
|
20
|
+
description: "MMD\u6A21\u578B\u538B\u7F29\u5305 (ZIP)",
|
|
21
|
+
hint: "\u8BF7\u4E0A\u4F20\u5305\u542B PMX/\u8D34\u56FE\u7B49\u5B8C\u6574\u76EE\u5F55\u7684 ZIP \u538B\u7F29\u5305\uFF0C\u4FDD\u6301\u539F\u59CB\u6587\u4EF6\u7ED3\u6784"
|
|
20
22
|
},
|
|
21
23
|
motion: {
|
|
22
24
|
moduleId: "mmd-motions",
|
|
@@ -38,9 +40,10 @@ var MMD_RESOURCE_TYPE_CONFIGS = {
|
|
|
38
40
|
},
|
|
39
41
|
stage: {
|
|
40
42
|
moduleId: "mmd-stages",
|
|
41
|
-
acceptedTypes: [".
|
|
42
|
-
maxFileSize:
|
|
43
|
-
description: "
|
|
43
|
+
acceptedTypes: [".zip"],
|
|
44
|
+
maxFileSize: 200,
|
|
45
|
+
description: "\u821E\u53F0/\u573A\u666F\u538B\u7F29\u5305 (ZIP)",
|
|
46
|
+
hint: "\u9700\u5C06\u821E\u53F0\u6A21\u578B\u4E0E\u4F9D\u8D56\u8D34\u56FE\u4E00\u8D77\u6253\u5305 ZIP\uFF0C\u5E76\u4FDD\u6301\u76EE\u5F55\u7ED3\u6784"
|
|
44
47
|
},
|
|
45
48
|
thumbnail: {
|
|
46
49
|
moduleId: "mmd-thumbnails",
|
|
@@ -66,6 +69,7 @@ var MmdResourceSelector = ({
|
|
|
66
69
|
const [uploading, setUploading] = React2.useState(false);
|
|
67
70
|
const [searchTerm, setSearchTerm] = React2.useState("");
|
|
68
71
|
const [showUploader, setShowUploader] = React2.useState(false);
|
|
72
|
+
const [zipValidationError, setZipValidationError] = React2.useState(null);
|
|
69
73
|
const config = MMD_RESOURCE_TYPE_CONFIGS[resourceType];
|
|
70
74
|
if (!config) {
|
|
71
75
|
return /* @__PURE__ */ React2__default.default.createElement("div", { className: "p-4 bg-red-50 text-red-600 rounded-lg" }, "\u672A\u627E\u5230\u8D44\u6E90\u7C7B\u578B\u914D\u7F6E\uFF1A", resourceType);
|
|
@@ -117,10 +121,32 @@ var MmdResourceSelector = ({
|
|
|
117
121
|
setSelectedFile(file);
|
|
118
122
|
fileService.getFileUrl(file.id).then((url) => onChange(file.id, url)).catch((error) => console.error("\u83B7\u53D6\u6587\u4EF6URL\u5931\u8D25:", error));
|
|
119
123
|
};
|
|
124
|
+
const validateZipContents = async (buffer, type) => {
|
|
125
|
+
const zip = await JSZip__default.default.loadAsync(buffer);
|
|
126
|
+
const entries = Object.keys(zip.files);
|
|
127
|
+
if (!entries.length) {
|
|
128
|
+
throw new Error("\u538B\u7F29\u5305\u4E3A\u7A7A\uFF0C\u8BF7\u68C0\u67E5\u6587\u4EF6\u5185\u5BB9");
|
|
129
|
+
}
|
|
130
|
+
const hasModel = entries.some((name) => /\.[pP][mM][xX]$/.test(name)) || type === "stage" && entries.some((name) => /\.[pP][mM][dD]$/.test(name));
|
|
131
|
+
const hasAssets = entries.some(
|
|
132
|
+
(name) => /\.(png|jpg|jpeg|bmp|tga|dds|spa|sph)$/i.test(name)
|
|
133
|
+
);
|
|
134
|
+
if (!hasModel) {
|
|
135
|
+
throw new Error(type === "stage" ? "\u538B\u7F29\u5305\u4E2D\u672A\u627E\u5230 PMX/PMD \u821E\u53F0\u6A21\u578B\u6587\u4EF6" : "\u538B\u7F29\u5305\u4E2D\u672A\u627E\u5230 PMX \u6A21\u578B\u6587\u4EF6");
|
|
136
|
+
}
|
|
137
|
+
if (!hasAssets) {
|
|
138
|
+
throw new Error("\u538B\u7F29\u5305\u4E2D\u672A\u53D1\u73B0\u8D34\u56FE\u6587\u4EF6\uFF0C\u8BF7\u786E\u8BA4\u662F\u5426\u5305\u542B texture \u76EE\u5F55");
|
|
139
|
+
}
|
|
140
|
+
};
|
|
120
141
|
const handleFileUpload = async (file) => {
|
|
121
142
|
if (!fileService) return;
|
|
122
143
|
setUploading(true);
|
|
144
|
+
setZipValidationError(null);
|
|
123
145
|
try {
|
|
146
|
+
if (resourceType === "model" || resourceType === "stage") {
|
|
147
|
+
const arrayBuffer = await file.arrayBuffer();
|
|
148
|
+
await validateZipContents(arrayBuffer, resourceType);
|
|
149
|
+
}
|
|
124
150
|
const fileMetadata = await fileService.uploadFile({
|
|
125
151
|
file,
|
|
126
152
|
moduleId: config.moduleId,
|
|
@@ -132,7 +158,9 @@ var MmdResourceSelector = ({
|
|
|
132
158
|
setShowUploader(false);
|
|
133
159
|
} catch (error) {
|
|
134
160
|
console.error("\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25:", error);
|
|
135
|
-
|
|
161
|
+
const message = error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF";
|
|
162
|
+
setZipValidationError(message);
|
|
163
|
+
alert(`\u4E0A\u4F20\u5931\u8D25: ${message}`);
|
|
136
164
|
} finally {
|
|
137
165
|
setUploading(false);
|
|
138
166
|
}
|
|
@@ -159,7 +187,7 @@ var MmdResourceSelector = ({
|
|
|
159
187
|
className: "p-1 hover:bg-white/50 dark:hover:bg-black/20 rounded transition-colors"
|
|
160
188
|
},
|
|
161
189
|
/* @__PURE__ */ React2__default.default.createElement(lucideReact.X, { className: "w-4 h-4" })
|
|
162
|
-
)), showUploader && /* @__PURE__ */ React2__default.default.createElement("div", { className: "p-4 bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "text-sm text-gray-600 dark:text-gray-400 mb-3" }, "\u652F\u6301\u7684\u6587\u4EF6\u7C7B\u578B: ", config.acceptedTypes.join(", "), /* @__PURE__ */ React2__default.default.createElement("
|
|
190
|
+
)), showUploader && /* @__PURE__ */ React2__default.default.createElement("div", { className: "p-4 bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "text-sm text-gray-600 dark:text-gray-400 mb-3 space-y-1" }, /* @__PURE__ */ React2__default.default.createElement("p", null, "\u652F\u6301\u7684\u6587\u4EF6\u7C7B\u578B: ", config.acceptedTypes.join(", ")), /* @__PURE__ */ React2__default.default.createElement("p", null, "\u6700\u5927\u6587\u4EF6\u5927\u5C0F: ", config.maxFileSize, "MB"), config.hint && /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-xs text-amber-600 dark:text-amber-400" }, config.hint)), /* @__PURE__ */ React2__default.default.createElement(
|
|
163
191
|
"input",
|
|
164
192
|
{
|
|
165
193
|
type: "file",
|
|
@@ -177,7 +205,7 @@ var MmdResourceSelector = ({
|
|
|
177
205
|
disabled: uploading,
|
|
178
206
|
className: "w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-lg file:border-0 file:text-sm file:font-semibold file:bg-blue-50 file:text-blue-700 hover:file:bg-blue-100 disabled:opacity-50"
|
|
179
207
|
}
|
|
180
|
-
), uploading && /* @__PURE__ */ React2__default.default.createElement("div", { className: "mt-3 flex items-center gap-2 text-sm text-blue-600" }, /* @__PURE__ */ React2__default.default.createElement(lucideReact.Loader2, { className: "w-4 h-4 animate-spin" }), "\u4E0A\u4F20\u4E2D...")), /* @__PURE__ */ React2__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React2__default.default.createElement(lucideReact.Search, { className: "absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-gray-400" }), /* @__PURE__ */ React2__default.default.createElement(
|
|
208
|
+
), uploading && /* @__PURE__ */ React2__default.default.createElement("div", { className: "mt-3 flex items-center gap-2 text-sm text-blue-600" }, /* @__PURE__ */ React2__default.default.createElement(lucideReact.Loader2, { className: "w-4 h-4 animate-spin" }), "\u4E0A\u4F20\u4E2D..."), zipValidationError && /* @__PURE__ */ React2__default.default.createElement("div", { className: "mt-3 flex items-center gap-2 text-sm text-amber-600 dark:text-amber-400" }, /* @__PURE__ */ React2__default.default.createElement(lucideReact.AlertTriangle, { className: "w-4 h-4" }), zipValidationError)), /* @__PURE__ */ React2__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React2__default.default.createElement(lucideReact.Search, { className: "absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-gray-400" }), /* @__PURE__ */ React2__default.default.createElement(
|
|
181
209
|
"input",
|
|
182
210
|
{
|
|
183
211
|
type: "text",
|
|
@@ -225,50 +253,50 @@ var MmdPlaylistEditor = ({
|
|
|
225
253
|
setNodes([...nodes, newNode]);
|
|
226
254
|
setExpandedNodes(/* @__PURE__ */ new Set([...expandedNodes, nodes.length]));
|
|
227
255
|
};
|
|
228
|
-
const removeNode = (
|
|
229
|
-
const newNodes = nodes.filter((_, i) => i !==
|
|
256
|
+
const removeNode = (index) => {
|
|
257
|
+
const newNodes = nodes.filter((_, i) => i !== index);
|
|
230
258
|
newNodes.forEach((node, i) => {
|
|
231
259
|
node.sortOrder = i;
|
|
232
260
|
});
|
|
233
261
|
setNodes(newNodes);
|
|
234
262
|
const newExpanded = /* @__PURE__ */ new Set();
|
|
235
263
|
expandedNodes.forEach((i) => {
|
|
236
|
-
if (i <
|
|
237
|
-
else if (i >
|
|
264
|
+
if (i < index) newExpanded.add(i);
|
|
265
|
+
else if (i > index) newExpanded.add(i - 1);
|
|
238
266
|
});
|
|
239
267
|
setExpandedNodes(newExpanded);
|
|
240
268
|
};
|
|
241
|
-
const moveNode = (
|
|
269
|
+
const moveNode = (index, direction) => {
|
|
242
270
|
const newNodes = [...nodes];
|
|
243
|
-
const targetIndex = direction === "up" ?
|
|
271
|
+
const targetIndex = direction === "up" ? index - 1 : index + 1;
|
|
244
272
|
if (targetIndex < 0 || targetIndex >= newNodes.length) return;
|
|
245
|
-
if (!newNodes[
|
|
246
|
-
[newNodes[
|
|
273
|
+
if (!newNodes[index] || !newNodes[targetIndex]) return;
|
|
274
|
+
[newNodes[index], newNodes[targetIndex]] = [newNodes[targetIndex], newNodes[index]];
|
|
247
275
|
newNodes.forEach((node, i) => {
|
|
248
276
|
node.sortOrder = i;
|
|
249
277
|
});
|
|
250
278
|
setNodes(newNodes);
|
|
251
279
|
const newExpanded = /* @__PURE__ */ new Set();
|
|
252
280
|
expandedNodes.forEach((i) => {
|
|
253
|
-
if (i ===
|
|
254
|
-
else if (i === targetIndex) newExpanded.add(
|
|
281
|
+
if (i === index) newExpanded.add(targetIndex);
|
|
282
|
+
else if (i === targetIndex) newExpanded.add(index);
|
|
255
283
|
else newExpanded.add(i);
|
|
256
284
|
});
|
|
257
285
|
setExpandedNodes(newExpanded);
|
|
258
286
|
};
|
|
259
|
-
const toggleNode = (
|
|
287
|
+
const toggleNode = (index) => {
|
|
260
288
|
const newExpanded = new Set(expandedNodes);
|
|
261
|
-
if (newExpanded.has(
|
|
262
|
-
newExpanded.delete(
|
|
289
|
+
if (newExpanded.has(index)) {
|
|
290
|
+
newExpanded.delete(index);
|
|
263
291
|
} else {
|
|
264
|
-
newExpanded.add(
|
|
292
|
+
newExpanded.add(index);
|
|
265
293
|
}
|
|
266
294
|
setExpandedNodes(newExpanded);
|
|
267
295
|
};
|
|
268
|
-
const updateNode = (
|
|
296
|
+
const updateNode = (index, updates) => {
|
|
269
297
|
const newNodes = [...nodes];
|
|
270
|
-
if (!newNodes[
|
|
271
|
-
newNodes[
|
|
298
|
+
if (!newNodes[index]) return;
|
|
299
|
+
newNodes[index] = { ...newNodes[index], ...updates };
|
|
272
300
|
setNodes(newNodes);
|
|
273
301
|
};
|
|
274
302
|
const validateForm = () => {
|
|
@@ -392,10 +420,10 @@ var MmdPlaylistEditor = ({
|
|
|
392
420
|
},
|
|
393
421
|
/* @__PURE__ */ React2__default.default.createElement(lucideReact.Plus, { className: "w-4 h-4" }),
|
|
394
422
|
"\u6DFB\u52A0\u8282\u70B9"
|
|
395
|
-
)), nodes.length === 0 ? /* @__PURE__ */ React2__default.default.createElement("div", { className: "p-8 text-center text-gray-500 border-2 border-dashed border-gray-300 dark:border-gray-700 rounded-lg" }, '\u6682\u65E0\u8282\u70B9\uFF0C\u8BF7\u70B9\u51FB"\u6DFB\u52A0\u8282\u70B9"\u6309\u94AE\u5F00\u59CB') : nodes.map((node,
|
|
423
|
+
)), nodes.length === 0 ? /* @__PURE__ */ React2__default.default.createElement("div", { className: "p-8 text-center text-gray-500 border-2 border-dashed border-gray-300 dark:border-gray-700 rounded-lg" }, '\u6682\u65E0\u8282\u70B9\uFF0C\u8BF7\u70B9\u51FB"\u6DFB\u52A0\u8282\u70B9"\u6309\u94AE\u5F00\u59CB') : nodes.map((node, index) => /* @__PURE__ */ React2__default.default.createElement(
|
|
396
424
|
"div",
|
|
397
425
|
{
|
|
398
|
-
key:
|
|
426
|
+
key: index,
|
|
399
427
|
className: "border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden"
|
|
400
428
|
},
|
|
401
429
|
/* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center gap-3 p-4 bg-gray-50 dark:bg-gray-800" }, /* @__PURE__ */ React2__default.default.createElement(
|
|
@@ -408,16 +436,16 @@ var MmdPlaylistEditor = ({
|
|
|
408
436
|
), /* @__PURE__ */ React2__default.default.createElement(
|
|
409
437
|
"button",
|
|
410
438
|
{
|
|
411
|
-
onClick: () => toggleNode(
|
|
439
|
+
onClick: () => toggleNode(index),
|
|
412
440
|
className: "flex-1 flex items-center justify-between text-left"
|
|
413
441
|
},
|
|
414
|
-
/* @__PURE__ */ React2__default.default.createElement("span", { className: "font-medium text-gray-900 dark:text-white" },
|
|
415
|
-
expandedNodes.has(
|
|
442
|
+
/* @__PURE__ */ React2__default.default.createElement("span", { className: "font-medium text-gray-900 dark:text-white" }, index + 1, ". ", node.name || "\u672A\u547D\u540D\u8282\u70B9"),
|
|
443
|
+
expandedNodes.has(index) ? /* @__PURE__ */ React2__default.default.createElement(lucideReact.ChevronUp, { className: "w-5 h-5 text-gray-400" }) : /* @__PURE__ */ React2__default.default.createElement(lucideReact.ChevronDown, { className: "w-5 h-5 text-gray-400" })
|
|
416
444
|
), /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React2__default.default.createElement(
|
|
417
445
|
"button",
|
|
418
446
|
{
|
|
419
|
-
onClick: () => moveNode(
|
|
420
|
-
disabled:
|
|
447
|
+
onClick: () => moveNode(index, "up"),
|
|
448
|
+
disabled: index === 0,
|
|
421
449
|
className: "p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 disabled:opacity-30",
|
|
422
450
|
title: "\u4E0A\u79FB"
|
|
423
451
|
},
|
|
@@ -425,8 +453,8 @@ var MmdPlaylistEditor = ({
|
|
|
425
453
|
), /* @__PURE__ */ React2__default.default.createElement(
|
|
426
454
|
"button",
|
|
427
455
|
{
|
|
428
|
-
onClick: () => moveNode(
|
|
429
|
-
disabled:
|
|
456
|
+
onClick: () => moveNode(index, "down"),
|
|
457
|
+
disabled: index === nodes.length - 1,
|
|
430
458
|
className: "p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 disabled:opacity-30",
|
|
431
459
|
title: "\u4E0B\u79FB"
|
|
432
460
|
},
|
|
@@ -434,18 +462,18 @@ var MmdPlaylistEditor = ({
|
|
|
434
462
|
), /* @__PURE__ */ React2__default.default.createElement(
|
|
435
463
|
"button",
|
|
436
464
|
{
|
|
437
|
-
onClick: () => removeNode(
|
|
465
|
+
onClick: () => removeNode(index),
|
|
438
466
|
className: "p-1 text-red-400 hover:text-red-600 dark:hover:text-red-300",
|
|
439
467
|
title: "\u5220\u9664"
|
|
440
468
|
},
|
|
441
469
|
/* @__PURE__ */ React2__default.default.createElement(lucideReact.Trash2, { className: "w-5 h-5" })
|
|
442
470
|
))),
|
|
443
|
-
expandedNodes.has(
|
|
471
|
+
expandedNodes.has(index) && /* @__PURE__ */ React2__default.default.createElement("div", { className: "p-6 space-y-6 bg-white dark:bg-gray-900" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2" }, "\u8282\u70B9\u540D\u79F0 ", /* @__PURE__ */ React2__default.default.createElement("span", { className: "text-red-500" }, "*")), /* @__PURE__ */ React2__default.default.createElement(
|
|
444
472
|
"input",
|
|
445
473
|
{
|
|
446
474
|
type: "text",
|
|
447
475
|
value: node.name,
|
|
448
|
-
onChange: (e) => updateNode(
|
|
476
|
+
onChange: (e) => updateNode(index, { name: e.target.value }),
|
|
449
477
|
className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
450
478
|
}
|
|
451
479
|
)), /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2" }, "\u65F6\u957F\uFF08\u79D2\uFF09"), /* @__PURE__ */ React2__default.default.createElement(
|
|
@@ -453,14 +481,14 @@ var MmdPlaylistEditor = ({
|
|
|
453
481
|
{
|
|
454
482
|
type: "number",
|
|
455
483
|
value: node.duration || "",
|
|
456
|
-
onChange: (e) => updateNode(
|
|
484
|
+
onChange: (e) => updateNode(index, { duration: parseInt(e.target.value) || void 0 }),
|
|
457
485
|
className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
458
486
|
}
|
|
459
487
|
))), /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2" }, "\u63CF\u8FF0"), /* @__PURE__ */ React2__default.default.createElement(
|
|
460
488
|
"textarea",
|
|
461
489
|
{
|
|
462
490
|
value: node.description || "",
|
|
463
|
-
onChange: (e) => updateNode(
|
|
491
|
+
onChange: (e) => updateNode(index, { description: e.target.value }),
|
|
464
492
|
rows: 2,
|
|
465
493
|
className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
466
494
|
}
|
|
@@ -469,7 +497,7 @@ var MmdPlaylistEditor = ({
|
|
|
469
497
|
{
|
|
470
498
|
type: "checkbox",
|
|
471
499
|
checked: node.loop,
|
|
472
|
-
onChange: (e) => updateNode(
|
|
500
|
+
onChange: (e) => updateNode(index, { loop: e.target.checked }),
|
|
473
501
|
className: "w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500"
|
|
474
502
|
}
|
|
475
503
|
), /* @__PURE__ */ React2__default.default.createElement("span", { className: "text-sm text-gray-700 dark:text-gray-300" }, "\u5355\u66F2\u5FAA\u73AF")), /* @__PURE__ */ React2__default.default.createElement("div", { className: "grid grid-cols-1 gap-6 pt-4 border-t border-gray-200 dark:border-gray-700" }, /* @__PURE__ */ React2__default.default.createElement(
|
|
@@ -479,7 +507,7 @@ var MmdPlaylistEditor = ({
|
|
|
479
507
|
fileService,
|
|
480
508
|
userId,
|
|
481
509
|
value: node.modelFileId,
|
|
482
|
-
onChange: (fileId) => updateNode(
|
|
510
|
+
onChange: (fileId) => updateNode(index, { modelFileId: fileId }),
|
|
483
511
|
required: true
|
|
484
512
|
}
|
|
485
513
|
), /* @__PURE__ */ React2__default.default.createElement(
|
|
@@ -489,7 +517,7 @@ var MmdPlaylistEditor = ({
|
|
|
489
517
|
fileService,
|
|
490
518
|
userId,
|
|
491
519
|
value: node.motionFileId,
|
|
492
|
-
onChange: (fileId) => updateNode(
|
|
520
|
+
onChange: (fileId) => updateNode(index, { motionFileId: fileId })
|
|
493
521
|
}
|
|
494
522
|
), /* @__PURE__ */ React2__default.default.createElement(
|
|
495
523
|
MmdResourceSelector,
|
|
@@ -498,7 +526,7 @@ var MmdPlaylistEditor = ({
|
|
|
498
526
|
fileService,
|
|
499
527
|
userId,
|
|
500
528
|
value: node.audioFileId,
|
|
501
|
-
onChange: (fileId) => updateNode(
|
|
529
|
+
onChange: (fileId) => updateNode(index, { audioFileId: fileId })
|
|
502
530
|
}
|
|
503
531
|
)))
|
|
504
532
|
))));
|
|
@@ -795,203 +823,31 @@ function extractPathsFromMmdResources(resources) {
|
|
|
795
823
|
if (resources.additionalMotions) paths.push(...resources.additionalMotions);
|
|
796
824
|
return paths;
|
|
797
825
|
}
|
|
798
|
-
var mmdPlaylists = pgCore.pgTable(
|
|
799
|
-
"mmd_playlists",
|
|
800
|
-
{
|
|
801
|
-
/** 主键ID */
|
|
802
|
-
id: pgCore.uuid("id").primaryKey().defaultRandom(),
|
|
803
|
-
/** 播放列表名称 */
|
|
804
|
-
name: pgCore.varchar("name", { length: 255 }).notNull(),
|
|
805
|
-
/** 播放列表描述 */
|
|
806
|
-
description: pgCore.text("description"),
|
|
807
|
-
/** 是否启用列表循环 */
|
|
808
|
-
loop: pgCore.boolean("loop").notNull().default(false),
|
|
809
|
-
/** 预加载策略: none, next, all */
|
|
810
|
-
preloadStrategy: pgCore.varchar("preload_strategy", { length: 20 }).notNull().default("none"),
|
|
811
|
-
/** 是否自动播放 */
|
|
812
|
-
autoPlay: pgCore.boolean("auto_play").notNull().default(false),
|
|
813
|
-
/** 播放列表缩略图文件ID (关联 file_metadata.id) */
|
|
814
|
-
thumbnailFileId: pgCore.uuid("thumbnail_file_id"),
|
|
815
|
-
/** 播放列表状态: draft, published, archived */
|
|
816
|
-
status: pgCore.varchar("status", { length: 20 }).notNull().default("draft"),
|
|
817
|
-
/** 显示顺序 */
|
|
818
|
-
sortOrder: pgCore.integer("sort_order").notNull().default(0),
|
|
819
|
-
/** 额外配置(JSON格式,存储舞台配置等) */
|
|
820
|
-
config: pgCore.json("config"),
|
|
821
|
-
/** 创建者ID */
|
|
822
|
-
createdBy: pgCore.varchar("created_by", { length: 255 }).notNull(),
|
|
823
|
-
/** 创建时间 */
|
|
824
|
-
createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
|
|
825
|
-
/** 更新时间 */
|
|
826
|
-
updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull(),
|
|
827
|
-
/** 删除时间(软删除) */
|
|
828
|
-
deletedAt: pgCore.timestamp("deleted_at")
|
|
829
|
-
},
|
|
830
|
-
(table) => ({
|
|
831
|
-
/** 按状态查询的索引 */
|
|
832
|
-
statusIndex: pgCore.index("mmd_playlists_status_idx").on(table.status),
|
|
833
|
-
/** 按创建者查询的索引 */
|
|
834
|
-
createdByIndex: pgCore.index("mmd_playlists_created_by_idx").on(table.createdBy),
|
|
835
|
-
/** 按删除状态查询的索引 */
|
|
836
|
-
deletedAtIndex: pgCore.index("mmd_playlists_deleted_at_idx").on(table.deletedAt),
|
|
837
|
-
/** 按排序查询的索引 */
|
|
838
|
-
sortOrderIndex: pgCore.index("mmd_playlists_sort_order_idx").on(table.sortOrder)
|
|
839
|
-
})
|
|
840
|
-
);
|
|
841
|
-
var mmdPlaylistNodes = pgCore.pgTable(
|
|
842
|
-
"mmd_playlist_nodes",
|
|
843
|
-
{
|
|
844
|
-
/** 主键ID */
|
|
845
|
-
id: pgCore.uuid("id").primaryKey().defaultRandom(),
|
|
846
|
-
/** 所属播放列表ID */
|
|
847
|
-
playlistId: pgCore.uuid("playlist_id").references(() => mmdPlaylists.id, { onDelete: "cascade" }).notNull(),
|
|
848
|
-
/** 节点名称 */
|
|
849
|
-
name: pgCore.varchar("name", { length: 255 }).notNull(),
|
|
850
|
-
/** 节点描述 */
|
|
851
|
-
description: pgCore.text("description"),
|
|
852
|
-
/** 是否启用节点循环 */
|
|
853
|
-
loop: pgCore.boolean("loop").notNull().default(false),
|
|
854
|
-
/** 预计时长(秒) */
|
|
855
|
-
duration: pgCore.integer("duration"),
|
|
856
|
-
/** 节点缩略图文件ID */
|
|
857
|
-
thumbnailFileId: pgCore.uuid("thumbnail_file_id"),
|
|
858
|
-
/** 显示顺序 */
|
|
859
|
-
sortOrder: pgCore.integer("sort_order").notNull().default(0),
|
|
860
|
-
/** 模型文件ID (关联 file_metadata.id) */
|
|
861
|
-
modelFileId: pgCore.uuid("model_file_id").notNull(),
|
|
862
|
-
/** 动作文件ID */
|
|
863
|
-
motionFileId: pgCore.uuid("motion_file_id"),
|
|
864
|
-
/** 相机动画文件ID */
|
|
865
|
-
cameraFileId: pgCore.uuid("camera_file_id"),
|
|
866
|
-
/** 音频文件ID */
|
|
867
|
-
audioFileId: pgCore.uuid("audio_file_id"),
|
|
868
|
-
/** 舞台模型文件ID */
|
|
869
|
-
stageModelFileId: pgCore.uuid("stage_model_file_id"),
|
|
870
|
-
/** 附加动作文件ID列表(JSON数组) */
|
|
871
|
-
additionalMotionFileIds: pgCore.json("additional_motion_file_ids").$type(),
|
|
872
|
-
/** 额外配置(JSON格式) */
|
|
873
|
-
config: pgCore.json("config"),
|
|
874
|
-
/** 创建时间 */
|
|
875
|
-
createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
|
|
876
|
-
/** 更新时间 */
|
|
877
|
-
updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
|
|
878
|
-
},
|
|
879
|
-
(table) => ({
|
|
880
|
-
/** 按播放列表查询的索引 */
|
|
881
|
-
playlistIndex: pgCore.index("mmd_playlist_nodes_playlist_idx").on(table.playlistId),
|
|
882
|
-
/** 按排序查询的索引 */
|
|
883
|
-
sortOrderIndex: pgCore.index("mmd_playlist_nodes_sort_order_idx").on(table.sortOrder),
|
|
884
|
-
/** 按模型文件查询的索引 */
|
|
885
|
-
modelFileIndex: pgCore.index("mmd_playlist_nodes_model_file_idx").on(table.modelFileId),
|
|
886
|
-
/** 组合索引:播放列表+排序 */
|
|
887
|
-
playlistSortIndex: pgCore.index("mmd_playlist_nodes_playlist_sort_idx").on(
|
|
888
|
-
table.playlistId,
|
|
889
|
-
table.sortOrder
|
|
890
|
-
)
|
|
891
|
-
})
|
|
892
|
-
);
|
|
893
|
-
var mmdResourceOptions = pgCore.pgTable(
|
|
894
|
-
"mmd_resource_options",
|
|
895
|
-
{
|
|
896
|
-
/** 主键ID */
|
|
897
|
-
id: pgCore.uuid("id").primaryKey().defaultRandom(),
|
|
898
|
-
/** 资源名称 */
|
|
899
|
-
name: pgCore.varchar("name", { length: 255 }).notNull(),
|
|
900
|
-
/** 资源描述 */
|
|
901
|
-
description: pgCore.text("description"),
|
|
902
|
-
/** 资源类型: model, motion, camera, audio, stage */
|
|
903
|
-
resourceType: pgCore.varchar("resource_type", { length: 20 }).notNull(),
|
|
904
|
-
/** 文件ID (关联 file_metadata.id) */
|
|
905
|
-
fileId: pgCore.uuid("file_id").notNull(),
|
|
906
|
-
/** 缩略图文件ID */
|
|
907
|
-
thumbnailFileId: pgCore.uuid("thumbnail_file_id"),
|
|
908
|
-
/** 资源标签(JSON数组,用于分类和筛选) */
|
|
909
|
-
tags: pgCore.json("tags").$type(),
|
|
910
|
-
/** 显示顺序 */
|
|
911
|
-
sortOrder: pgCore.integer("sort_order").notNull().default(0),
|
|
912
|
-
/** 是否启用 */
|
|
913
|
-
isActive: pgCore.boolean("is_active").notNull().default(true),
|
|
914
|
-
/** 创建者ID */
|
|
915
|
-
createdBy: pgCore.varchar("created_by", { length: 255 }).notNull(),
|
|
916
|
-
/** 创建时间 */
|
|
917
|
-
createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
|
|
918
|
-
/** 更新时间 */
|
|
919
|
-
updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
|
|
920
|
-
},
|
|
921
|
-
(table) => ({
|
|
922
|
-
/** 按资源类型查询的索引 */
|
|
923
|
-
resourceTypeIndex: pgCore.index("mmd_resource_options_resource_type_idx").on(table.resourceType),
|
|
924
|
-
/** 按文件ID查询的索引 */
|
|
925
|
-
fileIdIndex: pgCore.index("mmd_resource_options_file_id_idx").on(table.fileId),
|
|
926
|
-
/** 按活跃状态查询的索引 */
|
|
927
|
-
isActiveIndex: pgCore.index("mmd_resource_options_is_active_idx").on(table.isActive),
|
|
928
|
-
/** 按创建者查询的索引 */
|
|
929
|
-
createdByIndex: pgCore.index("mmd_resource_options_created_by_idx").on(table.createdBy),
|
|
930
|
-
/** 组合索引:资源类型+活跃状态+排序 */
|
|
931
|
-
typeActiveSortIndex: pgCore.index("mmd_resource_options_type_active_sort_idx").on(
|
|
932
|
-
table.resourceType,
|
|
933
|
-
table.isActive,
|
|
934
|
-
table.sortOrder
|
|
935
|
-
)
|
|
936
|
-
})
|
|
937
|
-
);
|
|
938
|
-
var mmdPresetItems = pgCore.pgTable(
|
|
939
|
-
"mmd_preset_items",
|
|
940
|
-
{
|
|
941
|
-
/** 主键ID */
|
|
942
|
-
id: pgCore.uuid("id").primaryKey().defaultRandom(),
|
|
943
|
-
/** 预设名称 */
|
|
944
|
-
name: pgCore.varchar("name", { length: 255 }).notNull(),
|
|
945
|
-
/** 预设描述 */
|
|
946
|
-
description: pgCore.text("description"),
|
|
947
|
-
/** 缩略图文件ID */
|
|
948
|
-
thumbnailFileId: pgCore.uuid("thumbnail_file_id"),
|
|
949
|
-
/** 模型文件ID */
|
|
950
|
-
modelFileId: pgCore.uuid("model_file_id").notNull(),
|
|
951
|
-
/** 动作文件ID */
|
|
952
|
-
motionFileId: pgCore.uuid("motion_file_id"),
|
|
953
|
-
/** 相机动画文件ID */
|
|
954
|
-
cameraFileId: pgCore.uuid("camera_file_id"),
|
|
955
|
-
/** 音频文件ID */
|
|
956
|
-
audioFileId: pgCore.uuid("audio_file_id"),
|
|
957
|
-
/** 舞台模型文件ID */
|
|
958
|
-
stageModelFileId: pgCore.uuid("stage_model_file_id"),
|
|
959
|
-
/** 附加动作文件ID列表(JSON数组) */
|
|
960
|
-
additionalMotionFileIds: pgCore.json("additional_motion_file_ids").$type(),
|
|
961
|
-
/** 显示顺序 */
|
|
962
|
-
sortOrder: pgCore.integer("sort_order").notNull().default(0),
|
|
963
|
-
/** 是否启用 */
|
|
964
|
-
isActive: pgCore.boolean("is_active").notNull().default(true),
|
|
965
|
-
/** 预设标签(JSON数组) */
|
|
966
|
-
tags: pgCore.json("tags").$type(),
|
|
967
|
-
/** 创建者ID */
|
|
968
|
-
createdBy: pgCore.varchar("created_by", { length: 255 }).notNull(),
|
|
969
|
-
/** 创建时间 */
|
|
970
|
-
createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
|
|
971
|
-
/** 更新时间 */
|
|
972
|
-
updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
|
|
973
|
-
},
|
|
974
|
-
(table) => ({
|
|
975
|
-
/** 按活跃状态查询的索引 */
|
|
976
|
-
isActiveIndex: pgCore.index("mmd_preset_items_is_active_idx").on(table.isActive),
|
|
977
|
-
/** 按排序查询的索引 */
|
|
978
|
-
sortOrderIndex: pgCore.index("mmd_preset_items_sort_order_idx").on(table.sortOrder),
|
|
979
|
-
/** 按创建者查询的索引 */
|
|
980
|
-
createdByIndex: pgCore.index("mmd_preset_items_created_by_idx").on(table.createdBy),
|
|
981
|
-
/** 按模型文件查询的索引 */
|
|
982
|
-
modelFileIndex: pgCore.index("mmd_preset_items_model_file_idx").on(table.modelFileId)
|
|
983
|
-
})
|
|
984
|
-
);
|
|
985
|
-
var mmdPlaylistsRelations = drizzleOrm.relations(mmdPlaylists, ({ many }) => ({
|
|
986
|
-
nodes: many(mmdPlaylistNodes)
|
|
987
|
-
}));
|
|
988
|
-
var mmdPlaylistNodesRelations = drizzleOrm.relations(mmdPlaylistNodes, ({ one }) => ({
|
|
989
|
-
playlist: one(mmdPlaylists, {
|
|
990
|
-
fields: [mmdPlaylistNodes.playlistId],
|
|
991
|
-
references: [mmdPlaylists.id]
|
|
992
|
-
})
|
|
993
|
-
}));
|
|
994
826
|
|
|
827
|
+
Object.defineProperty(exports, "mmdPlaylistNodes", {
|
|
828
|
+
enumerable: true,
|
|
829
|
+
get: function () { return chunkW35VTQAW_js.mmdPlaylistNodes; }
|
|
830
|
+
});
|
|
831
|
+
Object.defineProperty(exports, "mmdPlaylistNodesRelations", {
|
|
832
|
+
enumerable: true,
|
|
833
|
+
get: function () { return chunkW35VTQAW_js.mmdPlaylistNodesRelations; }
|
|
834
|
+
});
|
|
835
|
+
Object.defineProperty(exports, "mmdPlaylists", {
|
|
836
|
+
enumerable: true,
|
|
837
|
+
get: function () { return chunkW35VTQAW_js.mmdPlaylists; }
|
|
838
|
+
});
|
|
839
|
+
Object.defineProperty(exports, "mmdPlaylistsRelations", {
|
|
840
|
+
enumerable: true,
|
|
841
|
+
get: function () { return chunkW35VTQAW_js.mmdPlaylistsRelations; }
|
|
842
|
+
});
|
|
843
|
+
Object.defineProperty(exports, "mmdPresetItems", {
|
|
844
|
+
enumerable: true,
|
|
845
|
+
get: function () { return chunkW35VTQAW_js.mmdPresetItems; }
|
|
846
|
+
});
|
|
847
|
+
Object.defineProperty(exports, "mmdResourceOptions", {
|
|
848
|
+
enumerable: true,
|
|
849
|
+
get: function () { return chunkW35VTQAW_js.mmdResourceOptions; }
|
|
850
|
+
});
|
|
995
851
|
exports.MMD_RESOURCE_TYPE_CONFIGS = MMD_RESOURCE_TYPE_CONFIGS;
|
|
996
852
|
exports.MmdAdminPanel = MmdAdminPanel;
|
|
997
853
|
exports.MmdPlaylistEditor = MmdPlaylistEditor;
|
|
@@ -1010,12 +866,6 @@ exports.extractFileIdsFromResourceOptions = extractFileIdsFromResourceOptions;
|
|
|
1010
866
|
exports.extractPathsFromMmdResources = extractPathsFromMmdResources;
|
|
1011
867
|
exports.generateMockFileUrls = generateMockFileUrls;
|
|
1012
868
|
exports.mergeFileUrlMaps = mergeFileUrlMaps;
|
|
1013
|
-
exports.mmdPlaylistNodes = mmdPlaylistNodes;
|
|
1014
|
-
exports.mmdPlaylistNodesRelations = mmdPlaylistNodesRelations;
|
|
1015
|
-
exports.mmdPlaylists = mmdPlaylists;
|
|
1016
|
-
exports.mmdPlaylistsRelations = mmdPlaylistsRelations;
|
|
1017
|
-
exports.mmdPresetItems = mmdPresetItems;
|
|
1018
|
-
exports.mmdResourceOptions = mmdResourceOptions;
|
|
1019
869
|
exports.validateFileUrls = validateFileUrls;
|
|
1020
870
|
//# sourceMappingURL=index.js.map
|
|
1021
871
|
//# sourceMappingURL=index.js.map
|