|
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