修复通用导入器根目录与请求参数
统一文件管理器根路径并修复导入标题图标布局 修复 Tauri 导入请求字段映射并覆盖 camelCase 反序列化
This commit is contained in:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user