|
3 | 3 | import { capitalizeFirstLetter } from '../utils/Utils'; |
4 | 4 | import Icon from './Icon.svelte'; |
5 | 5 |
|
6 | | - export let model: PropertyMappingModel; |
7 | | - export let save: (model: PropertyMappingModel) => void; |
| 6 | + interface Props { |
| 7 | + model: PropertyMappingModel; |
| 8 | + save: (model: PropertyMappingModel) => void; |
| 9 | + } |
8 | 10 |
|
9 | | - let validationResult: { res: boolean; err?: Error } | undefined; |
| 11 | + let { model, save }: Props = $props(); |
10 | 12 |
|
11 | | - $: validationResult = model.validate(); |
| 13 | + let validationResult: { res: boolean; err?: Error } | undefined = $derived(model.validate()); |
| 14 | +
|
| 15 | + // Use $state as a variable declaration initializer |
| 16 | + let propertyStates = $state(model.properties.map(p => ({ ...p }))); |
12 | 17 | </script> |
13 | 18 |
|
14 | 19 | <div class="media-db-plugin-property-mappings-model-container"> |
15 | 20 | <div class="setting-item-name">{capitalizeFirstLetter(model.type)}</div> |
16 | 21 | <div class="media-db-plugin-property-mappings-container"> |
17 | | - {#each model.properties as property} |
| 22 | + {#each propertyStates as property, i} |
18 | 23 | <div class="media-db-plugin-property-mapping-element"> |
19 | 24 | <div class="media-db-plugin-property-mapping-element-property-name-wrapper"> |
20 | 25 | <pre class="media-db-plugin-property-mapping-element-property-name"><code>{property.property}</code></pre> |
|
48 | 53 | <button |
49 | 54 | class="media-db-plugin-property-mappings-save-button {validationResult?.res ? 'mod-cta' : 'mod-muted'}" |
50 | 55 | onclick={() => { |
| 56 | + // Sync propertyStates back to model.properties |
| 57 | + model.properties.forEach((p, i) => { |
| 58 | + Object.assign(p, propertyStates[i]); |
| 59 | + }); |
51 | 60 | if (model.validate().res) save(model); |
52 | 61 | }} |
53 | 62 | >Save |
|
0 commit comments