@@ -48,25 +48,30 @@ import {
48
48
import {
49
49
$selectedInstance ,
50
50
$selectedInstanceKey ,
51
+ $selectedInstancePath ,
51
52
$selectedPage ,
52
53
} from "~/shared/awareness" ;
53
54
54
55
/**
55
56
* find variables defined specifically on this selected instance
56
57
*/
57
- const $instanceVariables = computed (
58
- [ $selectedInstance , $dataSources ] ,
59
- ( instance , dataSources ) => {
60
- const matchedVariables : DataSource [ ] = [ ] ;
61
- if ( instance === undefined ) {
62
- return matchedVariables ;
58
+ const $availableVariables = computed (
59
+ [ $selectedInstancePath , $dataSources ] ,
60
+ ( instancePath , dataSources ) => {
61
+ if ( instancePath === undefined ) {
62
+ return [ ] ;
63
63
}
64
- for ( const dataSource of dataSources . values ( ) ) {
65
- if ( instance . id === dataSource . scopeInstanceId ) {
66
- matchedVariables . push ( dataSource ) ;
64
+ const availableVariables = new Map < DataSource [ "name" ] , DataSource > ( ) ;
65
+ // order from ancestor to descendant
66
+ // so descendants can override ancestor variables
67
+ for ( const { instance } of instancePath . slice ( ) . reverse ( ) ) {
68
+ for ( const dataSource of dataSources . values ( ) ) {
69
+ if ( dataSource . scopeInstanceId === instance . id ) {
70
+ availableVariables . set ( dataSource . name , dataSource ) ;
71
+ }
67
72
}
68
73
}
69
- return matchedVariables ;
74
+ return Array . from ( availableVariables . values ( ) ) ;
70
75
}
71
76
) ;
72
77
@@ -181,27 +186,33 @@ const EmptyVariables = () => {
181
186
182
187
const VariablesItem = ( {
183
188
variable,
189
+ source,
184
190
index,
185
191
value,
186
192
usageCount,
187
193
} : {
188
194
variable : DataSource ;
195
+ source : "local" | "remote" ;
189
196
index : number ;
190
197
value : unknown ;
191
198
usageCount : number ;
192
199
} ) => {
193
- const label =
194
- value === undefined
195
- ? variable . name
196
- : `${ variable . name } : ${ formatValuePreview ( value ) } ` ;
200
+ const labelValue =
201
+ value === undefined ? "" : `: ${ formatValuePreview ( value ) } ` ;
197
202
const [ inspectDialogOpen , setInspectDialogOpen ] = useState ( false ) ;
198
203
const [ isMenuOpen , setIsMenuOpen ] = useState ( false ) ;
199
204
return (
200
205
< VariablePopoverTrigger key = { variable . id } variable = { variable } >
201
206
< CssValueListItem
202
207
id = { variable . id }
203
208
index = { index }
204
- label = { < Label truncate > { label } </ Label > }
209
+ label = {
210
+ < Flex align = "center" >
211
+ < Label color = { source } > { variable . name } </ Label >
212
+ { labelValue }
213
+ </ Flex >
214
+ }
215
+ disabled = { source === "remote" }
205
216
data-state = { isMenuOpen ? "open" : undefined }
206
217
buttons = {
207
218
< >
@@ -234,13 +245,15 @@ const VariablesItem = ({
234
245
< DropdownMenuItem onSelect = { ( ) => setInspectDialogOpen ( true ) } >
235
246
Inspect
236
247
</ DropdownMenuItem >
237
- < DropdownMenuItem
238
- // allow to delete only unused variables
239
- disabled = { variable . type === "parameter" || usageCount > 0 }
240
- onSelect = { ( ) => deleteVariable ( variable . id ) }
241
- >
242
- Delete { usageCount > 0 && `(${ usageCount } bindings)` }
243
- </ DropdownMenuItem >
248
+ { source === "local" && (
249
+ < DropdownMenuItem
250
+ // allow to delete only unused variables
251
+ disabled = { variable . type === "parameter" || usageCount > 0 }
252
+ onSelect = { ( ) => deleteVariable ( variable . id ) }
253
+ >
254
+ Delete { usageCount > 0 && `(${ usageCount } bindings)` }
255
+ </ DropdownMenuItem >
256
+ ) }
244
257
</ DropdownMenuContent >
245
258
</ DropdownMenuPortal >
246
259
</ DropdownMenu >
@@ -252,7 +265,8 @@ const VariablesItem = ({
252
265
} ;
253
266
254
267
const VariablesList = ( ) => {
255
- const availableVariables = useStore ( $instanceVariables ) ;
268
+ const instance = useStore ( $selectedInstance ) ;
269
+ const availableVariables = useStore ( $availableVariables ) ;
256
270
const variableValues = useStore ( $instanceVariableValues ) ;
257
271
const usedVariables = useStore ( $usedVariables ) ;
258
272
@@ -262,18 +276,18 @@ const VariablesList = () => {
262
276
263
277
return (
264
278
< CssValueListArrowFocus >
265
- { availableVariables . map ( ( variable , index ) => {
266
- const value = variableValues . get ( variable . id ) ;
267
- return (
268
- < VariablesItem
269
- key = { variable . id }
270
- value = { value }
271
- variable = { variable }
272
- index = { index }
273
- usageCount = { usedVariables . get ( variable . id ) ?? 0 }
274
- />
275
- ) ;
276
- } ) }
279
+ { availableVariables . map ( ( variable , index ) => (
280
+ < VariablesItem
281
+ key = { variable . id }
282
+ source = {
283
+ instance ?. id === variable . scopeInstanceId ? "local" : "remote"
284
+ }
285
+ value = { variableValues . get ( variable . id ) }
286
+ variable = { variable }
287
+ index = { index }
288
+ usageCount = { usedVariables . get ( variable . id ) ?? 0 }
289
+ />
290
+ ) ) }
277
291
</ CssValueListArrowFocus >
278
292
) ;
279
293
} ;
0 commit comments