Try this view (with my Integration Toolkit installed):
{
"custom": {
"optionsMaster": {
"$": [
"ds",
192,
1712246364304
],
"$columns": [
{
"data": [
"",
"pressure",
"temp",
"flowsw",
"levelsw"
],
"name": "code",
"type": "String"
},
{
"data": [
"Disabled",
"Pressure",
"Temperature",
"Flow Switch",
"Level Switch"
],
"name": "display",
"type": "String"
},
{
"data": [
true,
false,
false,
false,
false
],
"name": "multiples",
"type": "Boolean"
}
]
},
"port1": "pressure",
"port2": "temp",
"port3": "flowsw",
"port4": "levelsw"
},
"params": {},
"propConfig": {
"custom.optionsMaster": {
"persistent": true
},
"custom.port1": {
"persistent": true
},
"custom.port2": {
"persistent": true
},
"custom.port3": {
"persistent": true
},
"custom.port4": {
"persistent": true
}
},
"props": {},
"root": {
"children": [
{
"children": [
{
"children": [
{
"meta": {
"name": "Label"
},
"position": {
"basis": "200px"
},
"props": {
"style": {
"paddingRight": "10px"
},
"text": "Port #1 Function:",
"textStyle": {
"textAlign": "right"
}
},
"type": "ia.display.label"
},
{
"meta": {
"name": "Dropdown"
},
"position": {
"basis": "250px"
},
"propConfig": {
"props.options": {
"binding": {
"config": {
"expression": "forEach(\n\twhere(\n\t\t{view.custom.optionsMaster},\n\t\tit()[\u0027multiples\u0027] || it()[\u0027code\u0027] !\u003d {view.custom.port2},\n\t\tit()[\u0027multiples\u0027] || it()[\u0027code\u0027] !\u003d {view.custom.port3},\n\t\tit()[\u0027multiples\u0027] || it()[\u0027code\u0027] !\u003d {view.custom.port4}\n\t),\n\tasMap(\n\t\t\u0027value\u0027, it()[\u0027code\u0027],\n\t\t\u0027label\u0027, it()[\u0027display\u0027]\n\t)\n)"
},
"type": "expr"
}
},
"props.value": {
"binding": {
"config": {
"bidirectional": true,
"path": "view.custom.port1"
},
"type": "property"
}
}
},
"type": "ia.input.dropdown"
}
],
"meta": {
"name": "TabRow"
},
"position": {
"basis": "50px"
},
"type": "ia.container.flex"
}
],
"meta": {
"name": "Tab1Column"
},
"props": {
"direction": "column"
},
"type": "ia.container.flex"
},
{
"children": [
{
"children": [
{
"meta": {
"name": "Label"
},
"position": {
"basis": "200px"
},
"props": {
"style": {
"paddingRight": "10px"
},
"text": "Port #2 Function:",
"textStyle": {
"textAlign": "right"
}
},
"type": "ia.display.label"
},
{
"meta": {
"name": "Dropdown"
},
"position": {
"basis": "250px"
},
"propConfig": {
"props.options": {
"binding": {
"config": {
"expression": "forEach(\n\twhere(\n\t\t{view.custom.optionsMaster},\n\t\tit()[\u0027multiples\u0027] || it()[\u0027code\u0027] !\u003d {view.custom.port1},\n\t\tit()[\u0027multiples\u0027] || it()[\u0027code\u0027] !\u003d {view.custom.port3},\n\t\tit()[\u0027multiples\u0027] || it()[\u0027code\u0027] !\u003d {view.custom.port4}\n\t),\n\tasMap(\n\t\t\u0027value\u0027, it()[\u0027code\u0027],\n\t\t\u0027label\u0027, it()[\u0027display\u0027]\n\t)\n)"
},
"type": "expr"
}
},
"props.value": {
"binding": {
"config": {
"bidirectional": true,
"path": "view.custom.port2"
},
"type": "property"
}
}
},
"type": "ia.input.dropdown"
}
],
"meta": {
"name": "TabRow"
},
"position": {
"basis": "50px"
},
"type": "ia.container.flex"
}
],
"meta": {
"name": "Tab2Column"
},
"position": {
"tabIndex": 1
},
"props": {
"direction": "column"
},
"type": "ia.container.flex"
},
{
"children": [
{
"children": [
{
"meta": {
"name": "Label"
},
"position": {
"basis": "200px"
},
"props": {
"style": {
"paddingRight": "10px"
},
"text": "Port #3 Function:",
"textStyle": {
"textAlign": "right"
}
},
"type": "ia.display.label"
},
{
"meta": {
"name": "Dropdown"
},
"position": {
"basis": "250px"
},
"propConfig": {
"props.options": {
"binding": {
"config": {
"expression": "forEach(\n\twhere(\n\t\t{view.custom.optionsMaster},\n\t\tit()[\u0027multiples\u0027] || it()[\u0027code\u0027] !\u003d {view.custom.port1},\n\t\tit()[\u0027multiples\u0027] || it()[\u0027code\u0027] !\u003d {view.custom.port2},\n\t\tit()[\u0027multiples\u0027] || it()[\u0027code\u0027] !\u003d {view.custom.port4}\n\t),\n\tasMap(\n\t\t\u0027value\u0027, it()[\u0027code\u0027],\n\t\t\u0027label\u0027, it()[\u0027display\u0027]\n\t)\n)"
},
"type": "expr"
}
},
"props.value": {
"binding": {
"config": {
"bidirectional": true,
"path": "view.custom.port3"
},
"type": "property"
}
}
},
"type": "ia.input.dropdown"
}
],
"meta": {
"name": "TabRow"
},
"position": {
"basis": "50px"
},
"type": "ia.container.flex"
}
],
"meta": {
"name": "Tab3Column"
},
"position": {
"tabIndex": 2
},
"props": {
"direction": "column"
},
"type": "ia.container.flex"
},
{
"children": [
{
"children": [
{
"meta": {
"name": "Label"
},
"position": {
"basis": "200px"
},
"props": {
"style": {
"paddingRight": "10px"
},
"text": "Port #4 Function:",
"textStyle": {
"textAlign": "right"
}
},
"type": "ia.display.label"
},
{
"meta": {
"name": "Dropdown"
},
"position": {
"basis": "250px"
},
"propConfig": {
"props.options": {
"binding": {
"config": {
"expression": "forEach(\n\twhere(\n\t\t{view.custom.optionsMaster},\n\t\tit()[\u0027multiples\u0027] || it()[\u0027code\u0027] !\u003d {view.custom.port1},\n\t\tit()[\u0027multiples\u0027] || it()[\u0027code\u0027] !\u003d {view.custom.port2},\n\t\tit()[\u0027multiples\u0027] || it()[\u0027code\u0027] !\u003d {view.custom.port3}\n\t),\n\tasMap(\n\t\t\u0027value\u0027, it()[\u0027code\u0027],\n\t\t\u0027label\u0027, it()[\u0027display\u0027]\n\t)\n)"
},
"type": "expr"
}
},
"props.value": {
"binding": {
"config": {
"bidirectional": true,
"path": "view.custom.port4"
},
"type": "property"
}
}
},
"type": "ia.input.dropdown"
}
],
"meta": {
"name": "TabRow"
},
"position": {
"basis": "50px"
},
"type": "ia.container.flex"
}
],
"meta": {
"name": "Tab4Column"
},
"position": {
"tabIndex": 3
},
"props": {
"direction": "column"
},
"type": "ia.container.flex"
}
],
"meta": {
"name": "root"
},
"props": {
"currentTabIndex": 3,
"tabs": [
"Tab1",
"Tab2",
"Tab3",
"Tab4"
]
},
"type": "ia.container.tab"
}
}
Edit: For the uninitiated, you can use the above JSON of an entire view by creating a new Perspective view, put the above on the clipboard, SHIFT-right-click on the new view, and select "Paste JSON". The clipboard content will completely replace the new view. The above view is completely stand-alone (other than using Integration Toolkit functions--see below for an alternative).