Skip to content

Commit 7135de9

Browse files
authored
fix: rework props editing (#205)
1 parent e094a68 commit 7135de9

File tree

7 files changed

+198
-195
lines changed

7 files changed

+198
-195
lines changed

src/client/core.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,25 @@ import { serialize } from './utils.js';
77
window['#SvelteDevTools'] = {
88
/**
99
* @param {string} id
10-
* @param {string} key
10+
* @param {string[]} keys
1111
* @param {any} value
1212
*/
13-
inject(id, key, value) {
13+
inject(id, keys, value) {
1414
const { detail: component } = v4.map.get(id) || {};
15-
component && component.$inject_state({ [key]: value });
15+
if (component) {
16+
const [prop, ...rest] = keys;
17+
const original = component.$capture_state()[prop];
18+
if (typeof original === 'object') {
19+
let ref = original;
20+
for (let i = 0; i < rest.length - 1; i += 1) {
21+
ref = ref[rest[i]];
22+
}
23+
ref[rest[rest.length - 1]] = value;
24+
component.$inject_state({ [prop]: original });
25+
} else {
26+
component.$inject_state({ [prop]: value });
27+
}
28+
}
1629
},
1730
};
1831

src/client/utils.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export function serialize(node) {
6868
const listeners = node.detail.__listeners || [];
6969

7070
res.detail = {
71-
attributes: attributes.map(({ name: key, value }) => ({ key, value })),
71+
attributes: attributes.map(({ name: key, value }) => ({ key, value, readonly: true })),
7272
listeners: listeners.map((o) => ({ ...o, handler: o.handler.toString() })),
7373
};
7474
break;
@@ -86,7 +86,7 @@ export function serialize(node) {
8686
const { ctx, source } = node.detail;
8787
const cloned = Object.entries(clone(ctx));
8888
res.detail = {
89-
ctx: cloned.map(([key, value]) => ({ key, value })),
89+
ctx: cloned.map(([key, value]) => ({ key, value, readonly: true })),
9090
source: source.slice(source.indexOf('{'), source.indexOf('}') + 1),
9191
};
9292
break;

src/lib/panel/Editable.svelte

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,66 @@
11
<script lang="ts">
22
interface Props {
33
type: 'string' | 'number' | 'null';
4-
value: any;
4+
value: string;
55
readonly: boolean;
6-
onchange(updated: unknown): void;
6+
onchange(updated: string): void;
77
}
88
99
let { type, value, readonly, onchange }: Props = $props();
1010
1111
let editing = $state(false);
12+
13+
function update(v: string) {
14+
editing = false;
15+
switch (true) {
16+
case v === '':
17+
case v === 'undefined': {
18+
type = 'null';
19+
v = 'undefined';
20+
break;
21+
}
22+
case v === 'null': {
23+
type = v = 'null';
24+
break;
25+
}
26+
case v === 'true' || v === 'false': {
27+
type = 'number';
28+
v = `${v === 'true'}`;
29+
break;
30+
}
31+
case !Number.isNaN(Number(v)): {
32+
type = 'number';
33+
v = `${Number(v)}`;
34+
break;
35+
}
36+
default: {
37+
type = 'string';
38+
break;
39+
}
40+
}
41+
value = v;
42+
onchange(type === 'string' ? `"${v.replace(/"/g, '\\"')}"` : v);
43+
}
1244
</script>
1345

1446
{#if editing}
1547
<input
16-
value={JSON.stringify(value)}
48+
value={value === null ? 'null' : value === undefined ? 'undefined' : value}
1749
onblur={({ target }) => {
18-
editing = false;
1950
// @ts-expect-error - target and value exists
20-
const updated = target.value;
21-
onchange((value = JSON.parse(updated)));
51+
update(target.value);
2252
}}
2353
onkeydown={({ key, target }) => {
2454
if (key !== 'Enter') return;
25-
editing = false;
2655
// @ts-expect-error - target and value exists
27-
const updated = target.value;
28-
onchange((value = JSON.parse(updated)));
56+
update(target.value);
2957
}}
3058
/>
3159
{:else}
3260
<!-- svelte-ignore a11y-click-events-have-key-events -->
3361
<!-- svelte-ignore a11y-no-static-element-interactions -->
3462
<span class:readonly class={type} onclick={() => (editing = !readonly)}>
35-
{JSON.stringify(value)}
63+
{type === 'string' ? `"${value}"` : `${value}`}
3664
</span>
3765
{/if}
3866

src/lib/panel/Expandable.svelte

Lines changed: 0 additions & 149 deletions
This file was deleted.

0 commit comments

Comments
 (0)