mirror of
https://github.com/Ku6epXBOCTuK/easy-png-tools.git
synced 2026-11-13 17:08:20 +00:00
feat: touched fields dont reset on change source image
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
type ToolSchema,
|
||||
} from "$lib/registry-schema";
|
||||
import { downloadZip } from "$lib/zip";
|
||||
import { SvelteSet } from "svelte/reactivity";
|
||||
|
||||
interface Props {
|
||||
page: Page;
|
||||
@@ -38,6 +39,9 @@
|
||||
const resultKind = $derived(tool.result ?? "image");
|
||||
|
||||
let values = $state<Record<string, unknown>>({});
|
||||
// Поля, изменённые пользователем: при загрузке нового файла им не даём
|
||||
// перезаписаться source-дефолтами. Reset снимает пометку.
|
||||
const touched = new SvelteSet<string>();
|
||||
let source = $state<PixelImage | null>(null);
|
||||
let result = $state<PixelImage | null>(null);
|
||||
let fileResult = $state<FileResult | null>(null);
|
||||
@@ -67,10 +71,12 @@
|
||||
}
|
||||
|
||||
function setValue(id: string, value: unknown) {
|
||||
touched.add(id);
|
||||
values = { ...values, [id]: value };
|
||||
}
|
||||
|
||||
function reset() {
|
||||
touched.clear();
|
||||
values = schema
|
||||
? defaultSchemaParams(schema, { source: source ?? undefined })
|
||||
: {};
|
||||
@@ -87,7 +93,12 @@
|
||||
const decoded = await decodeFile(file);
|
||||
source = decoded;
|
||||
if (schema) {
|
||||
values = applySourceDefaults(schema, values, { source: decoded });
|
||||
values = applySourceDefaults(
|
||||
schema,
|
||||
values,
|
||||
{ source: decoded },
|
||||
touched,
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
displayError = toDisplayError(e);
|
||||
|
||||
@@ -89,6 +89,16 @@ describe("registry-schema: source-aware dimension defaults", () => {
|
||||
});
|
||||
});
|
||||
|
||||
it("touched-поля не перезаписываются source-дефолтами", () => {
|
||||
const manual = { size: { width: 5, height: 6 } };
|
||||
expect(
|
||||
applySourceDefaults(sourceSchema, manual, { source }, new Set(["size"])),
|
||||
).toEqual({
|
||||
size: { width: 5, height: 6 },
|
||||
fixed: { width: 10, height: 20 },
|
||||
});
|
||||
});
|
||||
|
||||
it("uses source dimensions when sanitizing missing values", () => {
|
||||
expect(sanitizeSchemaParams(sourceSchema, {}, { source })).toEqual({
|
||||
size: source,
|
||||
|
||||
@@ -435,15 +435,22 @@ export function defaultSchemaParams<P>(
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
* Пересчитывает дефолты от нового исходника, сохраняя значения пользователя.
|
||||
* Поля из touched (изменённые вручную) не перезаписываются даже если у них
|
||||
* source-дефолт — иначе загрузка нового файла сносила бы настроенные размеры.
|
||||
*/
|
||||
export function applySourceDefaults<P>(
|
||||
schema: ToolSchema<P>,
|
||||
values: Record<string, unknown>,
|
||||
context: SchemaContext,
|
||||
touched?: ReadonlySet<string>,
|
||||
): Record<keyof P, unknown> {
|
||||
const defaults = defaultSchemaParams(schema, context);
|
||||
for (const key of Object.keys(schema.fields) as (keyof P)[]) {
|
||||
const spec = schema.fields[key].spec;
|
||||
if (spec.kind === "dimension" && spec.defaultFromSource) continue;
|
||||
const fromSource = spec.kind === "dimension" && spec.defaultFromSource;
|
||||
if (fromSource && !touched?.has(key as string)) continue;
|
||||
if (Object.prototype.hasOwnProperty.call(values, key)) {
|
||||
defaults[key] = values[key as string];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user