Skip to content

Commit

Permalink
fix: rework props editing (#205)
Browse files Browse the repository at this point in the history
  • Loading branch information
ignatiusmb authored Apr 16, 2024
1 parent e094a68 commit 7135de9
Show file tree
Hide file tree
Showing 7 changed files with 198 additions and 195 deletions.
19 changes: 16 additions & 3 deletions src/client/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,25 @@ import { serialize } from './utils.js';
window['#SvelteDevTools'] = {
/**
* @param {string} id
* @param {string} key
* @param {string[]} keys
* @param {any} value
*/
inject(id, key, value) {
inject(id, keys, value) {
const { detail: component } = v4.map.get(id) || {};
component && component.$inject_state({ [key]: value });
if (component) {
const [prop, ...rest] = keys;
const original = component.$capture_state()[prop];
if (typeof original === 'object') {
let ref = original;
for (let i = 0; i < rest.length - 1; i += 1) {
ref = ref[rest[i]];
}
ref[rest[rest.length - 1]] = value;
component.$inject_state({ [prop]: original });
} else {
component.$inject_state({ [prop]: value });
}
}
},
};

Expand Down
4 changes: 2 additions & 2 deletions src/client/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ export function serialize(node) {
const listeners = node.detail.__listeners || [];

res.detail = {
attributes: attributes.map(({ name: key, value }) => ({ key, value })),
attributes: attributes.map(({ name: key, value }) => ({ key, value, readonly: true })),
listeners: listeners.map((o) => ({ ...o, handler: o.handler.toString() })),
};
break;
Expand All @@ -86,7 +86,7 @@ export function serialize(node) {
const { ctx, source } = node.detail;
const cloned = Object.entries(clone(ctx));
res.detail = {
ctx: cloned.map(([key, value]) => ({ key, value })),
ctx: cloned.map(([key, value]) => ({ key, value, readonly: true })),
source: source.slice(source.indexOf('{'), source.indexOf('}') + 1),
};
break;
Expand Down
48 changes: 38 additions & 10 deletions src/lib/panel/Editable.svelte
Original file line number Diff line number Diff line change
@@ -1,38 +1,66 @@
<script lang="ts">
interface Props {
type: 'string' | 'number' | 'null';
value: any;
value: string;
readonly: boolean;
onchange(updated: unknown): void;
onchange(updated: string): void;
}
let { type, value, readonly, onchange }: Props = $props();
let editing = $state(false);
function update(v: string) {
editing = false;
switch (true) {
case v === '':
case v === 'undefined': {
type = 'null';
v = 'undefined';
break;
}
case v === 'null': {
type = v = 'null';
break;
}
case v === 'true' || v === 'false': {
type = 'number';
v = `${v === 'true'}`;
break;
}
case !Number.isNaN(Number(v)): {
type = 'number';
v = `${Number(v)}`;
break;
}
default: {
type = 'string';
break;
}
}
value = v;
onchange(type === 'string' ? `"${v.replace(/"/g, '\\"')}"` : v);
}
</script>

{#if editing}
<input
value={JSON.stringify(value)}
value={value === null ? 'null' : value === undefined ? 'undefined' : value}
onblur={({ target }) => {
editing = false;
// @ts-expect-error - target and value exists
const updated = target.value;
onchange((value = JSON.parse(updated)));
update(target.value);
}}
onkeydown={({ key, target }) => {
if (key !== 'Enter') return;
editing = false;
// @ts-expect-error - target and value exists
const updated = target.value;
onchange((value = JSON.parse(updated)));
update(target.value);
}}
/>
{:else}
<!-- svelte-ignore a11y-click-events-have-key-events -->
<!-- svelte-ignore a11y-no-static-element-interactions -->
<span class:readonly class={type} onclick={() => (editing = !readonly)}>
{JSON.stringify(value)}
{type === 'string' ? `"${value}"` : `${value}`}
</span>
{/if}

Expand Down
149 changes: 0 additions & 149 deletions src/lib/panel/Expandable.svelte

This file was deleted.

Loading

0 comments on commit 7135de9

Please sign in to comment.