11<template >
2- <div
3- class =" BuilderFieldsWriterResourceId"
4- :data-automation-key =" props.fieldKey"
2+ <WdsFieldWrapper
3+ :is-binding-button-shown
4+ :is-binding-enabled =" isBindingMode"
5+ :label
6+ :unit
7+ :hint
8+ :error
9+ :data-automation-key =" fieldKey"
10+ @update:is-binding-enabled =" toggleBindingMode"
511 >
6- <component
7- :is =" selector"
8- ref =" selectorEl"
9- v-model =" selected"
10- :enable-multi-selection =" enableMultiSelection"
11- @selected-data =" onSelectedData"
12- />
13- <a
14- v-if =" ressourceUrl"
15- class =" BuilderFieldsWriterResourceId__link"
16- :href =" ressourceUrl"
17- target =" _blank"
18- :data-writer-tooltip =" linkTooltip"
12+ <div
13+ class =" BuilderFieldsWriterResourceId"
14+ :data-automation-key =" fieldKey"
1915 >
20- <WdsIcon name =" external-link" />
21- </a >
22- </div >
16+ <BuilderFieldsText
17+ v-if =" isBindingMode"
18+ type =" state-template"
19+ :component-id
20+ :field-key
21+ :error
22+ />
23+ <component
24+ :is =" selector"
25+ v-else
26+ ref =" selectorEl"
27+ v-model =" selected"
28+ :enable-multi-selection =" enableMultiSelection"
29+ @selected-data =" onSelectedData"
30+ />
31+ <a
32+ v-if =" ressourceUrl"
33+ class =" BuilderFieldsWriterResourceId__link"
34+ :href =" ressourceUrl"
35+ target =" _blank"
36+ :data-writer-tooltip =" linkTooltip"
37+ >
38+ <WdsIcon name =" external-link" />
39+ </a >
40+ </div >
41+ </WdsFieldWrapper >
2342</template >
2443
2544<script setup lang="ts">
2645import {
27- toRefs ,
28- inject ,
2946 computed ,
3047 PropType ,
3148 defineAsyncComponent ,
3249 useTemplateRef ,
3350 ref ,
51+ toRef ,
3452} from " vue" ;
35- import { useComponentActions } from " ../useComponentActions " ;
36- import injectionKeys from " @/injectionKeys " ;
53+ import { useComponentFieldViewModel } from " ../useComponentFieldViewModel " ;
54+ import { useBindingMode } from " ./composables/useBindingMode " ;
3755import WdsIcon from " @/wds/WdsIcon.vue" ;
56+ import WdsFieldWrapper from " @/wds/WdsFieldWrapper.vue" ;
3857import { WriterApplication } from " @/writerTypes" ;
58+ import BuilderFieldsText from " ./BuilderFieldsText.vue" ;
3959
4060const BuilderApplicationSelect = defineAsyncComponent (
4161 () => import (" ../BuilderApplicationSelect.vue" ),
@@ -47,22 +67,36 @@ const BuilderModelSelect = defineAsyncComponent(
4767 () => import (" ../BuilderModelSelect.vue" ),
4868);
4969
50- const wf = inject (injectionKeys .core );
51- const ssbm = inject (injectionKeys .builderManager );
52- const { setContentValue } = useComponentActions (wf , ssbm );
53-
5470const props = defineProps ({
5571 componentId: { type: String , required: true },
5672 fieldKey: { type: String , required: true },
73+ defaultValue: { type: String , required: false , default: undefined },
74+ label: { type: String , required: false , default: undefined },
75+ unit: { type: String , required: false , default: undefined },
76+ hint: { type: String , required: false , default: undefined },
5777 error: { type: String , required: false , default: undefined },
5878 resourceType: {
5979 type: String as PropType <" graph" | " application" | " model" >,
6080 required: true ,
6181 },
6282 enableMultiSelection: { type: Boolean , required: false , default: false },
83+ isBindingButtonShown: { type: Boolean , required: false , default: false },
84+ });
85+
86+ const fieldViewModel = useComponentFieldViewModel ({
87+ componentId: toRef (props , " componentId" ),
88+ fieldKey: toRef (props , " fieldKey" ),
89+ defaultValue: toRef (props , " defaultValue" ),
90+ });
91+
92+ const { isBindingMode, toggleBindingMode } = useBindingMode ({
93+ fieldViewModel ,
94+ });
95+
96+ const appInputsViewModel = useComponentFieldViewModel ({
97+ componentId: toRef (props , " componentId" ),
98+ fieldKey: " appInputs" ,
6399});
64- const { componentId, fieldKey, enableMultiSelection } = toRefs (props );
65- const component = computed (() => wf .getComponentById (componentId .value ));
66100
67101const selectorEl = useTemplateRef (" selectorEl" );
68102
@@ -114,40 +148,22 @@ const ressourceUrl = computed(() => {
114148 }
115149});
116150
117- const fieldDefinition = computed (() => {
118- const def = wf .getComponentDefinition (component .value .type );
119- return def ?.fields ?.[props .fieldKey ];
120- });
121-
122151const selected = computed <string | string []>({
123152 get() {
124- if (enableMultiSelection .value ) {
125- const raw =
126- component .value .content [props .fieldKey ] ??
127- fieldDefinition .value .default ??
128- " []" ;
153+ if (props .enableMultiSelection ) {
154+ const raw = fieldViewModel .value || " []" ;
129155 try {
130156 return JSON .parse (raw );
131157 } catch {
132158 return [];
133159 }
134160 }
135- return (
136- component .value .content [props .fieldKey ] ||
137- fieldDefinition .value .default ||
138- " "
139- );
161+ return fieldViewModel .value ;
140162 },
141163 set(value : string | string []) {
142- if (enableMultiSelection .value ) {
143- setContentValue (
144- component .value .id ,
145- fieldKey .value ,
146- JSON .stringify (value ),
147- );
148- } else {
149- setContentValue (component .value .id , fieldKey .value , String (value ));
150- }
164+ fieldViewModel .value = props .enableMultiSelection
165+ ? JSON .stringify (value )
166+ : String (value );
151167 },
152168});
153169
@@ -164,11 +180,7 @@ function onSelectedData(appData: WriterApplication | undefined) {
164180 return ;
165181 }
166182
167- setContentValue (
168- component .value .id ,
169- " appInputs" ,
170- JSON .stringify (appData .inputs ),
171- );
183+ appInputsViewModel .value = JSON .stringify (appData .inputs );
172184}
173185 </script >
174186
0 commit comments