Skip to main content

Tutorial: All UI widgets demo

In this tutorial, you build a Python UDF operator for Lakeflow Designer that exercises every UI widget available in the custom-operator-v0.1.0 schema. Use it as a template when creating your own operators. For a broader overview, see Custom operators in Lakeflow Designer.

Overview​

This operator is a demonstration UDF that accepts parameters using every available UI widget type. It concatenates all input values into a descriptive string, making it easy to see how each widget passes data to your function.

The available widget types are:

Widget

Description

Data Type

expression

Column/expression picker from input port

string

input

Single-line text input

string

textarea

Multi-line text area

string

checkbox

Checkbox toggle

Boolean

toggle

Switch toggle

Boolean

number

Number input with min/max

number

slider

Numeric slider with range

number

select

Single-select dropdown (static values)

string

select

Single-select dropdown (from input columns)

string

multi-select

Multi-select (static values)

array

multi-select

Multi-select (from input columns)

array

Widget

Description

Data Type

expression

Column/expression picker from input port

string

input

Single-line text input

string

textarea

Multi-line text area

string

checkbox

Checkbox toggle

Boolean

toggle

Switch toggle

Boolean

number

Number input with min/max

number

slider

Numeric slider with range

number

select

Single-select dropdown (static values)

string

select

Single-select dropdown (from input columns)

string

multi-select

Multi-select (static values)

array

multi-select

Multi-select (from input columns)

array

Requirements​

Step 1: Write and test the Python function​

First, define the Python function that accepts all the different parameter types. This function simply concatenates all inputs into a descriptive string for demonstration purposes.

Python
def concat_all_widgets(
expression_widget_value: str,
input_widget_value: str,
textarea_widget_value: str,
checkbox_widget_value: bool,
toggle_widget_value: bool,
number_widget_value: float,
slider_widget_value: float,
select_static_widget_value: str,
select_columns_widget_value: str,
multiselect_static_widget_value: list,
multiselect_columns_widget_value: list
) -> str:
"""
Concatenates all input parameters into a descriptive string.
This demonstrates all UI widget types available in custom operators.
"""
lines = [
f"1: Expression (Column Picker) -> {expression_widget_value}",
f"2: Text Input (Single Line) -> {input_widget_value}",
f"3: Text Area (Multi-Line) -> {textarea_widget_value}",
f"4: Checkbox Option -> {checkbox_widget_value}",
f"5: Toggle Switch -> {toggle_widget_value}",
f"6: Number Input -> {number_widget_value}",
f"7: Slider Value -> {slider_widget_value}",
f"8: Select (Static Options) -> {select_static_widget_value}",
f"9: Select (From Input Columns) -> {select_columns_widget_value}",
f"10: Multi-Select (Static Options) -> [{', '.join(multiselect_static_widget_value or [])}]",
f"11: Multi-Select (From Input Columns) -> [{', '.join(multiselect_columns_widget_value or [])}]"
]
return "\n".join(lines)

Test the function with the following code:

Python
result = concat_all_widgets(
expression_widget_value="column_value_123",
input_widget_value="Hello World",
textarea_widget_value="Line 1\nLine 2\nLine 3",
checkbox_widget_value=True,
toggle_widget_value=False,
number_widget_value=42.5,
slider_widget_value=75.0,
select_static_widget_value="option_b",
select_columns_widget_value="amount",
multiselect_static_widget_value=["tag1", "tag3"],
multiselect_columns_widget_value=["col1", "col3"]
)
print(result)

Step 2: Create the YAML configuration​

The YAML configuration defines how the operator appears in Lakeflow Designer. This example demonstrates every available widget type:

YAML
schema: custom-operator-v0.1.0
type: uc-udf
name: All Widgets Demo
id: demo.all_widgets
version: '1.0.0'
description: >
A demonstration UDF that showcases all available UI widgets.
config:
type: object
properties:
# ============================================
# EXPRESSION WIDGET
# ============================================
expression_widget_value:
type: string
format: expression
title: 1. Expression (Column Picker)
examples:
- 'Select a column or enter an expression'
x-ui:
widget: expression
port: in

# ============================================
# INPUT WIDGET (single-line text)
# ============================================
input_widget_value:
type: string
title: 2. Text Input (Single Line)
default: default text
examples:
- 'Enter a single line of text'
x-ui:
widget: input

# ============================================
# TEXTAREA WIDGET (multi-line text)
# ============================================
textarea_widget_value:
type: string
title: 3. Text Area (Multi-Line)
default: Sample text
examples:
- 'Enter multiple lines of text here...'
x-ui:
widget: textarea
rows: 3

# ============================================
# CHECKBOX WIDGET (boolean)
# ============================================
checkbox_widget_value:
type: boolean
title: 4. Checkbox Option
default: true
x-ui:
widget: checkbox

# ============================================
# TOGGLE WIDGET (boolean switch)
# ============================================
toggle_widget_value:
type: boolean
title: 5. Toggle Switch
default: false
x-ui:
widget: toggle

# ============================================
# NUMBER WIDGET (numeric input with min/max)
# ============================================
number_widget_value:
type: number
title: 6. Number Input
default: 50
minimum: 0
maximum: 100
examples:
- 'Enter a number (0-100)'
x-ui:
widget: number

# ============================================
# SLIDER WIDGET (numeric slider)
# ============================================
slider_widget_value:
type: number
title: 7. Slider Value
default: 50
minimum: 0
maximum: 100
x-ui:
widget: slider
step: 5

# ============================================
# SELECT WIDGET with STATIC options
# ============================================
select_static_widget_value:
type: string
title: 8. Select (Static Options)
default: option_a
examples:
- 'Choose an option'
x-ui:
widget: select
optionsSource:
type: static
values:
- option_a
- option_b
- option_c

# ============================================
# SELECT WIDGET with INPUT COLUMNS options
# ============================================
select_columns_widget_value:
type: string
title: 9. Select (From Input Columns)
examples:
- 'Select a column from input'
x-ui:
widget: select
optionsSource:
type: inputColumns
port: in

# ============================================
# MULTI-SELECT WIDGET with STATIC options
# ============================================
multiselect_static_widget_value:
type: array
items:
type: string
title: 10. Multi-Select (Static Options)
default:
- tag1
- tag2
examples:
- 'Select one or more tags'
x-ui:
widget: multi-select
optionsSource:
type: static
values:
- tag1
- tag2
- tag3
- tag4
- tag5

# ============================================
# MULTI-SELECT WIDGET with INPUT COLUMNS options
# ============================================
multiselect_columns_widget_value:
type: array
items:
type: string
title: 11. Multi-Select (From Input Columns)
examples:
- 'Select one or more columns'
x-ui:
widget: multi-select
optionsSource:
type: inputColumns
port: in

required:
- expression_widget_value
additionalProperties: false
ports:
input:
- name: in
title: Input Data
output:
- name: out
title: Output

Schema highlights​

Config Key

Widget

Data Type

Purpose

expression_widget_value

expression

string

Pick a column or expression from input data.

input_widget_value

input

string

Single-line text entry.

textarea_widget_value

textarea

string

Multi-line text entry.

checkbox_widget_value

checkbox

Boolean

Boolean checkbox.

toggle_widget_value

toggle

Boolean

Boolean toggle switch.

number_widget_value

number

number

Numeric input with min/max validation.

slider_widget_value

slider

number

Numeric slider with step increments.

select_static_widget_value

select

string

Dropdown with hardcoded options.

select_columns_widget_value

select

string

Dropdown populated from input columns.

multiselect_static_widget_value

multi-select

array

Multi-select with hardcoded options.

multiselect_columns_widget_value

multi-select

array

Multi-select populated from input columns.

Config Key

Widget

Data Type

Purpose

expression_widget_value

expression

string

Pick a column or expression from input data.

input_widget_value

input

string

Single-line text entry.

textarea_widget_value

textarea

string

Multi-line text entry.

checkbox_widget_value

checkbox

Boolean

Boolean checkbox.

toggle_widget_value

toggle

Boolean

Boolean toggle switch.

number_widget_value

number

number

Numeric input with min/max validation.

slider_widget_value

slider

number

Numeric slider with step increments.

select_static_widget_value

select

string

Dropdown with hardcoded options.

select_columns_widget_value

select

string

Dropdown populated from input columns.

multiselect_static_widget_value

multi-select

array

Multi-select with hardcoded options.

multiselect_columns_widget_value

multi-select

array

Multi-select populated from input columns.

Options source types​

For select and multi-select widgets, you must specify an optionsSource:

Static options: Fixed list of values:

YAML
optionsSource:
type: static
values:
- value1
- value2
- value3

Input columns: Dynamic list from input port columns:

YAML
optionsSource:
type: inputColumns
port: in

For all available properties, data types, widgets, and options, see Custom operator YAML reference.

Step 3: Create the Unity Catalog function​

Combine the YAML configuration and Python function into a single CREATE FUNCTION statement. Note that multi-select values (type: array) are passed as ARRAY<STRING> to the UDF.

The example creates the function in main.example_output. Create the schema first if it doesn't exist:

SQL
CREATE SCHEMA IF NOT EXISTS main.example_output
SQL
CREATE OR REPLACE FUNCTION main.example_output.all_widgets_demo(
expression_widget_value STRING,
input_widget_value STRING,
textarea_widget_value STRING,
checkbox_widget_value BOOLEAN,
toggle_widget_value BOOLEAN,
number_widget_value DOUBLE,
slider_widget_value DOUBLE,
select_static_widget_value STRING,
select_columns_widget_value STRING,
multiselect_static_widget_value ARRAY<STRING>,
multiselect_columns_widget_value ARRAY<STRING>
)
RETURNS STRING
LANGUAGE PYTHON
AS $$
"""
schema: custom-operator-v0.1.0
type: uc-udf
name: All Widgets Demo
id: demo.all_widgets
version: "1.0.0"
description: >
A demonstration UDF that showcases all available UI widgets.
config:
type: object
properties:
expression_widget_value:
type: string
format: expression
title: 1. Expression (Column Picker)
examples:
- "Select a column or enter an expression"
x-ui:
widget: expression
port: in
input_widget_value:
type: string
title: 2. Text Input (Single Line)
default: "default text"
examples:
- "Enter a single line of text"
x-ui:
widget: input
textarea_widget_value:
type: string
title: 3. Text Area (Multi-Line)
default: Sample text
examples:
- "Enter multiple lines of text here..."
x-ui:
widget: textarea
rows: 3
checkbox_widget_value:
type: boolean
title: 4. Checkbox Option
default: true
x-ui:
widget: checkbox
toggle_widget_value:
type: boolean
title: 5. Toggle Switch
default: false
x-ui:
widget: toggle
number_widget_value:
type: number
title: 6. Number Input
default: 50
minimum: 0
maximum: 100
examples:
- "Enter a number (0-100)"
x-ui:
widget: number
slider_widget_value:
type: number
title: 7. Slider Value
default: 50
minimum: 0
maximum: 100
x-ui:
widget: slider
step: 5
select_static_widget_value:
type: string
title: 8. Select (Static Options)
default: option_a
examples:
- "Choose an option"
x-ui:
widget: select
optionsSource:
type: static
values:
- option_a
- option_b
- option_c
select_columns_widget_value:
type: string
title: 9. Select (From Input Columns)
examples:
- "Select a column from input"
x-ui:
widget: select
optionsSource:
type: inputColumns
port: in
multiselect_static_widget_value:
type: array
items:
type: string
title: 10. Multi-Select (Static Options)
default:
- tag1
- tag2
examples:
- "Select one or more tags"
x-ui:
widget: multi-select
optionsSource:
type: static
values:
- tag1
- tag2
- tag3
- tag4
- tag5
multiselect_columns_widget_value:
type: array
items:
type: string
title: 11. Multi-Select (From Input Columns)
examples:
- "Select one or more columns"
x-ui:
widget: multi-select
optionsSource:
type: inputColumns
port: in
required:
- expression_widget_value
additionalProperties: false
ports:
input:
- name: in
title: Input Data
output:
- name: out
title: Output
"""

def concat_all_widgets(
expression_widget_value: str,
input_widget_value: str,
textarea_widget_value: str,
checkbox_widget_value: bool,
toggle_widget_value: bool,
number_widget_value: float,
slider_widget_value: float,
select_static_widget_value: str,
select_columns_widget_value: str,
multiselect_static_widget_value: list,
multiselect_columns_widget_value: list
) -> str:
lines = [
f"1: Expression (Column Picker) -> {expression_widget_value}",
f"2: Text Input (Single Line) -> {input_widget_value}",
f"3: Text Area (Multi-Line) -> {textarea_widget_value}",
f"4: Checkbox Option -> {checkbox_widget_value}",
f"5: Toggle Switch -> {toggle_widget_value}",
f"6: Number Input -> {number_widget_value}",
f"7: Slider Value -> {slider_widget_value}",
f"8: Select (Static Options) -> {select_static_widget_value}",
f"9: Select (From Input Columns) -> {select_columns_widget_value}",
f"10: Multi-Select (Static Options) -> [{', '.join(multiselect_static_widget_value or [])}]",
f"11: Multi-Select (From Input Columns) -> [{', '.join(multiselect_columns_widget_value or [])}]"
]
return "\n".join(lines)

return concat_all_widgets(
expression_widget_value,
input_widget_value,
textarea_widget_value,
checkbox_widget_value,
toggle_widget_value,
number_widget_value,
slider_widget_value,
select_static_widget_value,
select_columns_widget_value,
multiselect_static_widget_value,
multiselect_columns_widget_value
)
$$

Step 4: Test the function​

Test the UC function directly with SQL:

SQL
SELECT main.example_output.all_widgets_demo(
expression_widget_value => 'my_column_value',
input_widget_value => 'Hello World',
textarea_widget_value => 'Multi\nLine\nText',
checkbox_widget_value => TRUE,
toggle_widget_value => FALSE,
number_widget_value => 42.5,
slider_widget_value => 75.0,
select_static_widget_value => 'option_b',
select_columns_widget_value => 'amount',
multiselect_static_widget_value => array('tag1', 'tag3'),
multiselect_columns_widget_value => array('col1', 'col2', 'col3')
) AS result;

Step 5: Register the operator​

Add the operator to your .custom_operators.yaml file:

YAML
operators:
- catalog: main
schema: example_output
functionName: all_widgets_demo
note

If you define this file in your user folder, it only appears for you. For more information, see Register and deploy your operator to Lakeflow Designer.

Step 6: Set up permissions​

Grant access to users who need to use this operator:

SQL
GRANT USE SCHEMA ON SCHEMA main.example_output TO `<user>`;
GRANT EXECUTE ON FUNCTION main.example_output.all_widgets_demo TO `<user>`;

Step 7: Use the operator in Lakeflow Designer​

  1. In a visual data prep, open the Operators menu in the left panel and find the All Widgets Demo operator.
  2. Drag the operator onto the canvas, and connect an input to it.
  3. Double-click the operator to open its configuration pane, then set its fields.
  4. Select the operator to preview its results in the output pane.

The operator's configuration pane includes:

  • An expression picker for column selection
  • Text inputs (single-line and multi-line)
  • Boolean controls (checkbox and toggle)
  • Numeric inputs (number field and slider)
  • Dropdowns with both static and dynamic options
  • Multi-select controls for choosing multiple values

This operator serves as a useful reference for understanding how each widget type renders and passes data to your function.

For every widget's data type and options, see UI widgets.

Additional resources​