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 user-defined-operator-v0.1.0 schema. Use it as a template when creating your own operators. For a broader overview, see User-defined 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

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.

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 user-defined 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:

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:

schema: user-defined-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.

Options source types

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

Static options: Fixed list of values:

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

Input columns: Dynamic list from input port columns:

optionsSource:
  type: inputColumns
  port: in

For all available properties, data types, widgets, and options, see User-defined 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:

CREATE SCHEMA IF NOT EXISTS main.example_output
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: user-defined-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:

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 .user_defined_operators.yaml file:

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:

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