SDKリファレンス - pick_lists

このページは機械翻訳により提供されています。翻訳内容と英語版に相違がある場合は、英語版が優先されます。

ピックリストは、一部の入力フィールドと組み合わせて使用し、ドロップダウンで選択可能なオプションを列挙します。 ピックリストのオプションは、pick_listsキーに保存するか、入力フィールドのハッシュ内で直接定義できます。 pick_list属性を使用する入力フィールドは、次のcontrol_typeである必要があります。

  • select
    • ユーザーがドロップダウンから単一の入力を選択できるようにします。
  • multiselect
    • ユーザーがドロップダウンから複数の入力を選択できるようにします。
  • tree
    • ユーザーが階層型ドロップダウンから単一または複数の入力を選択できるようにします。

クイック概要

ピックリストは、APIが特定の値セットのみを受け入れる場合に、コネクターを使いやすくする優れた方法です。 ユーザーに手動で入力してもらうのではなく、ドロップダウンから値を簡単に選択できるようにピックリストを使用する必要があります。 pick_listキーには、これらのオプションを保存し、入力フィールドの作成時に参照できます。

構造

ruby
    pick_lists: {

      [Unique_pick_list_name]: lambda do |connection, pick_list_parameters|
        Array
      end,

      [Another_unique_pick_list_name]: lambda do |connection, pick_list_parameters|
        Array
      end
    },

属性説明
キー[Unique_pick_list_name]
タイプラムダ関数
必須True
説明このラムダ関数は、その親object_definitionのキーがアクションまたはトリガーで呼び出されるたびに呼び出されます。 HTTPリクエストを実行して、メタデータエンドポイントからスキーマを動的に構築できます。 このラムダ関数の出力は、入力フィールドまたは出力フィールドを表すハッシュの配列である必要があります。
指定可能な引数connection - connectionで定義されたユーザー指定の入力を表すハッシュ
pick_list_parameters - 依存ピックリストを定義するときに使用します。
想定される出力配列の配列

pick_listsの出力は、次の形式の2次元配列である必要があります。

ruby
[
  [ "Picklist Label", "Value" ],
  [ "Picklist Label", "Value" ],
  [ "Picklist Label", "Value" ],
  [ "Picklist Label", "Value" ]
]

- コネクションフィールドではpick_listsは許可されません

例: コネクションフィールドのオプション

コネクションフィールドに列挙可能な値を定義するときは、コネクターで定義されたpick_listsを参照できない点に注意してください。

代わりに、これらのフィールドを静的に定義し、スキーマ属性optionsを使用できます。

ruby
connection: {
  fields: [
    {
      name: 'environment',
      label: 'Instance environment',
      control_type: 'select',
      options: [
        ['Production', 'production'],
        ['Sandbox', 'Sandbox']
      ]
    }
  ]
}
例: pick_lists: 静的

pick_listsは静的にできます。 参照されると、この定義は格納されている配列を返します。 入力フィールドがこのピックリストを参照すると、この配列が返され、フロントエンドでドロップダウンとしてレンダリングされます。

ruby
    input_fields: lambda do |object_definitions|
      [
        {
          name: 'event_category',
          control_type: 'select',
          pick_list: 'events'
        }
      ]
    end,
ruby
    pick_lists: {
      events: lambda do |connection|
        [
          ["Meeting","meeting"],
          ["Webinar","webinar"],
          ["Cloud recording","recording"],
          ["User","user"],
        ]
      end
    },
例: pick_lists: 依存および静的

依存ピックリストを使用すると、別のフィールドの値に基づいてピックリストの内容を変更できます。 たとえば、すべての都市を単一のピックリストに表示するのではなく、別のフィールドで選択された国の都市のみを選択的に表示できます。

ruby
    input_fields: lambda do |_object_definitions|
      [
        {
          name: 'country',
          control_type: 'select',
          pick_list: 'countries',
          optional: false
        },
        {
          name: 'city',
          control_type: 'select',
          pick_list: 'cities',
          pick_list_params: { country: 'country' },
          optional: false
        }
      ]
    end
ruby
    pick_lists: {
      countries: lambda do |_connection|
      [
        ['United States', 'USA'],
        ['India', 'IND']
      ]
      end,

      cities: lambda do |_connection, country:|
      {
        'USA' => [
          ['New York City', 'NYC'],
          ['San Fransisco', 'SF']
        ],
        'IND' => [
          ['Bangalore', 'BNG'],
          ['Delhi', 'DLH']
        ]
      }[country]
      end
    }
例: pick_lists: 依存および動的

この例では、accountsは独立した動的ピックリストであり、propertiesは依存する動的ピックリストです。 動的ピックリストを定義する場合でも、HTTPリクエストからのレスポンスは同じ配列の配列に変換する必要があります。

この例では、変換を実行するために.pluck関数を使用しました。

ruby
    input_fields: lambda do |_object_definitions|
      [
        {
          name: 'scope_id',
          label: 'Team',
          optional: false,
          control_type: 'select',
          pick_list: 'tenant_licenses'
        },
        {
          name: 'platform_id',
          control_type: 'select',
          pick_list: 'platforms',
          label: 'Platform',
          pick_list_params: { scope_ids: 'scope_id' },
          hint: 'Platform is required for creating Content'
        }
      ]
    end
ruby
    pick_lists: {
      tenant_licenses: lambda do |connection|
        app_id = get("api/v5/client/client:#{connection['client_id']}")&.
                   dig('data', 'app_id')
        tenant_id = get("/api/v5/app/#{app_id}")&.dig('data', 'tenant_id')
        get('/api/v5/license/').
          params(tenant_id: tenant_id,
                 statuses: 'active')['data']&.
          select { |lic| lic['parent_id'].present? }&.
          pluck('name', 'id')
      end,

      platforms: lambda do |_connection, scope_ids:|
        get('/api/v5/platform/').
          params(scope_ids: scope_ids)['data']&.
          pluck('name', 'id')
      end,
    }
例: pick_lists: tree

Workatoでは、treeタイプのピックリストも使用できます。 ツリーピックリストは、ファイルやフォルダ構造など、アプリケーション内の階層構造をモデル化するためによく使用されます。 ツリーピックリストを使用する場合、従来のpick_list_parametersは無視され、double splat変数に置き換えられます。

これを最も分かりやすく説明するために、フォルダに追加のフォルダやファイルが含まれる可能性がある、ファイルとフォルダ構造の概念を使用します。 すべてのフォルダとファイルはノードと見なされますが、主な違いは、フォルダには子ノードが含まれる可能性がある一方で、ファイルには含まれない点です。 ツリーピックリストを定義すると、ユーザーがフォルダノードをクリックするたびに、ピックリストが再評価され、その中の子ノードが構築されます。 ユーザーがクリックしたフォルダノードの値は、args&.[](:__parent_id)で確認できます。 この値がnilの場合、ルートノードにいることを示します。

ruby
    input_fields: lambda do |_object_definitions|
      [
        {
          name: 'path',
          label: 'File path',
          optional: false,
          control_type: 'tree',
          pick_list: "file_path"
        },
      ]
    end
ruby
    pick_lists: {
      file_path: lambda do |_connection, **args|
        # Get sub folders
        if (folder_path = args&.[](:__parent_id)).presence
          path = []
          response = get("/pubapi/v1/fs#{folder_path}").params(list_content: true, sort_by: 'name')
          if response['is_folder']
            path << response['folders']&.map { |folder| [folder['name'].labelize, folder['path'].gsub(' ', '%20'), nil, true] }
            path << response['files']&.map { |file| [file['name'].labelize, file['path'].gsub(' ', '%20'), nil, false] } if response['files'].present?
            Array.wrap(path.compact).flatten(1)
          end
        else
          # Get root folders
          get('/pubapi/v1/fs/')['folders']&.map do |folder|
            [folder['name'].labelize, folder['path'].gsub(' ', '%20'), nil, true]
          end
        end
      end,
    }

上記のケースでは、ユーザーがダウンロード対象のファイルのみを選択できるようにすることを想定していました。 しかし、さまざまなケースで、ファイルではなくフォルダへのパスを指定してもらうために、ユーザーがフォルダ(ノード)も選択できるようにしたい場合があります。 これは次のように設定できます。

ruby
    input_fields: lambda do |_object_definitions|
      [
        {
          name: 'path',
          label: 'Folder path',
          optional: false,
          control_type: 'tree',
          pick_list: 'folder_path',
          tree_options: {
            selectable_folder: true
          }
        },
      ]
    end

別のバリエーションは、エンドユーザーが複数のフォルダを選択できるようにする必要がある場合です。 これは次のように設定できます。

ruby
    input_fields: lambda do |_object_definitions|
      [
        {
          name: 'path',
          label: 'Folder path',
          optional: false,
          control_type: 'tree',
          pick_list: 'folder_path',
          tree_options: {
            selectable_folder: true,
            multi_select: true,
            force_selection_hierarchy: true # Setting this to true causes all child nodes to be selected when the parent is selected.
          }
        },
      ]
    end

Last updated: