修复通用导入器根目录与请求参数

统一文件管理器根路径并修复导入标题图标布局

修复 Tauri 导入请求字段映射并覆盖 camelCase 反序列化
This commit is contained in:
2026-08-18 17:27:34 +08:00
parent e423c410eb
commit a71fdf0180
2 changed files with 34 additions and 6 deletions
@@ -7,7 +7,7 @@ const UI_EDITOR_FONT_MAX_COUNT: usize = 64;
#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
struct AssetImportRequirements {
pub(crate) struct AssetImportRequirements {
max_items: usize,
max_file_size_bytes: Option<u64>,
max_total_size_bytes: Option<u64>,
@@ -15,15 +15,19 @@ struct AssetImportRequirements {
#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
struct AssetImportPolicy {
pub(crate) struct AssetImportPolicy {
destination: String,
accepted_media_types: Vec<String>,
accepted_extensions: Vec<String>,
}
#[derive(Debug, Deserialize)]
#[serde(tag = "source", rename_all = "camelCase")]
pub enum UiEditorAssetImportRequest {
#[serde(
tag = "source",
rename_all = "camelCase",
rename_all_fields = "camelCase"
)]
pub(crate) enum UiEditorAssetImportRequest {
Local {
project_path: String,
local_source_paths: Vec<String>,
@@ -38,6 +42,29 @@ pub enum UiEditorAssetImportRequest {
},
}
#[cfg(test)]
mod ui_editor_asset_import_request_tests {
use super::UiEditorAssetImportRequest;
#[test]
fn local_request_accepts_tauri_camel_case_fields() {
let request = serde_json::from_value::<UiEditorAssetImportRequest>(serde_json::json!({
"source": "local",
"projectPath": "/project",
"localSourcePaths": ["/source/font.ttf"],
"localPolicy": {
"destination": "assets/fonts",
"acceptedMediaTypes": ["font/ttf"],
"acceptedExtensions": ["ttf"]
},
"localRequirements": { "maxItems": 64 }
}))
.expect("deserialize local import request");
assert!(matches!(request, UiEditorAssetImportRequest::Local { .. }));
}
}
fn validate_asset_import_policy(policy: &AssetImportPolicy) -> Result<bool, String> {
let normalized_destination = policy.destination.trim();
let is_font = normalized_destination == "assets/fonts";
@@ -38,7 +38,7 @@ export type {
RemoteAssetCandidate,
} from './utils';
const ROOT_PATH = '/';
const ROOT_PATH = '';
export type AssetImporterProps = {
open: boolean;
@@ -387,7 +387,7 @@ export function AssetImporter({
panelClassName="flex h-[min(760px,92dvh)] w-[min(1100px,96vw)] min-w-0 flex-col overflow-hidden rounded-2xl shadow-2xl"
>
<header className="relative flex h-14 shrink-0 items-center justify-center border-b border-(--platform-subpanel-border) px-14">
<h2 className="m-0 text-center text-sm font-semibold leading-5">
<h2 className="m-0 flex items-center justify-center gap-2 text-center text-sm font-semibold leading-5">
{settings.icon}
{settings.title}
</h2>
@@ -412,6 +412,7 @@ export function AssetImporter({
) : null}
<div className="min-h-0 flex-1 p-3">
<FileManager
key={`${settings.ariaLabel}:${open ? 'open' : 'closed'}`}
style={{ minHeight: 0, height: '100%', width: '100%' }}
files={files}
layout="grid"