注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
オブジェクトテーブルウィジェットは、オブジェクトデータをテーブル形式で表示するために使用します。オブジェクトテーブルウィジェットを設定するモジュール作成者は、次の機能を使用できます。
以下のスクリーンショットは、Flight Alert データを表示するように設定されたオブジェクトテーブルの例です。

オブジェクトテーブルウィジェットの主な設定オプションは次のとおりです。
入力データ
列の設定
列:このセクションでは、オブジェクトテーブル内に表示する列を決定します。初期オブジェクトセットにデータが入力されると、この設定オプションが展開され、そのオブジェクトセット内のプロパティタイプの詳細が表示されます。また、特殊な列の種類を使用すると、モジュール作成者は、リンクされたオブジェクト、パラメーター化された URL リンク、時系列データ、関数によってその場で生成される派生列を表示できます。表示モードのユーザーも、表示される列を設定できます。列ヘッダーの横にある矢印から列を設定するを選択すると、閲覧者はオブジェクトテーブルに表示する列とその順序を選択できます。時系列データの詳細については、以下の時系列プロパティセクションを、派生列の設定方法の詳細については、関数ベースの列セクションを参照してください。
表示される列名はテキスト項目で、追加時にはオブジェクトタイプのプロパティ名がデフォルト値として設定されます。 その後、オントロジーでオブジェクトタイプのプロパティ名を更新しても、オブジェクトテーブルに表示される列名は自動的には変更されません。
**派生プロパティ:**モジュールレベルで設定された派生プロパティを、オブジェクトテーブルの列として表示できます。これらのプロパティは、リンクされたオブジェクトの値や集計に基づいて実行時に計算されます。設定の詳細と対応するウィジェットについては、派生プロパティのドキュメントを参照してください。
**未対応のプロパティタイプ:**サイズの大きい一部のプロパティ(たとえば、Geoshape やベクトル)は、パフォーマンスを維持するため、デフォルトでは読み込まれません。閲覧モードでは、セルの「...」オーバーフローメニューを選択して、未対応のプロパティの値を必要に応じて読み込むことができます。ウィジェットエディターでは、未対応のプロパティに警告アイコンとツールチップが表示され、パフォーマンスに影響する可能性があることが示されます。
**インライン編集を有効にする:**この切り替えを有効にすると、オブジェクトテーブル内のセルレベルの編集を設定できます。この詳細機能の設定方法については、以下のインライン編集(セルレベルのライトバック)セクションを参照してください。
**デフォルトの並べ替え:**この設定では、1 個または複数のデフォルトの並べ替え条件をテーブルに適用できます。モジュール作成者は、テーブルに表示されるプロパティタイプと、表示されない非表示のプロパティタイプのどちらでも並べ替えることができます。並べ替え条件を適用しない場合、データは並べ替えられません。必要に応じて並べ替え条件を指定することをお勧めします。
**変数に基づく列の表示設定と並び順:**有効にすると、表示する列のAPI名を含む文字列配列変数を使用して、表示する列を制御できます。この配列変数は、列が表示される順序も制御します。文字列配列が空の場合、設定されたすべての列がテーブルに表示されます。
列の設定を非表示にする:有効にすると、閲覧モードでテーブルのヘッダーメニューに表示される列を設定するの選択肢を非表示にします。
右クリックメニュー
選択
表示と書式設定
オブジェクトに画像の URL を格納するプロパティがある場合、タイプクラス hubble:icon を追加すると、オブジェクトタイプの設定時に選択したアイコンの代わりに、その画像を表示できます。この機能を使用すると、データとともにピクトグラムや画像を表示できます。
シナリオ
ユーザーの列設定を保存するには、次の手順で、状態の保存に対応した文字列配列変数を使用します。
このセクションのチュートリアルでは、Flight Alert オブジェクトタイプを参照していますが、ユーザーの Foundry 環境では利用できない場合があります。このチュートリアルを参考に、Foundry インスタンス内の類似のオブジェクトタイプを使用して手順を実行してください。関数についての詳細は、専用の関数のドキュメントを参照してください。
1 列または複数列の関数ベースの列を返す関数を作成するには、次の仕様を満たす必要があります。
関数の入力パラメーターには、ObjectSet<ObjectType> パラメーターを含める必要があります(必要に応じて、他の入力パラメーターを含めることもできます)。この ObjectSet<ObjectType> パラメーターにより、テーブルに表示されるオブジェクトを関数に渡し、目的の派生列を生成できます。ここでは ObjectType[] パラメーターも使用できますが、この選択肢はパフォーマンスが低いため、お勧めしません。
関数の戻り値の型は、オブジェクトタイプから値またはカスタム型へのマップである必要があります。これにより、関数はオブジェクトから値、または 1 個以上のフィールドを含むカスタム型へのマッピングを返すことができます。
FunctionsMap<ObjectType, CustomType> を使用します。Record<ObjectSpecifier<ObjectType>, CustomType> を使用します。dict[ObjectType, CustomType] を使用します。上記の条件を満たす関数を設定して公開すると、オブジェクトテーブルの設定内で、関数ベースのプロパティ列を設定できるようになります。より詳細なチュートリアルについては、以下を参照してください。
オブジェクトテーブルウィジェットは、関数によってその場で計算される関数ベースのプロパティの表示に対応しています。これにより、モジュール作成者は柔軟に列を表示でき、たとえば次のことが可能になります。
この例では、関数ベースのプロパティを使用して、Flight Alert チケットの優先度をユーザーが確認し、扱えるようにします。ここでの目標は、Time of Delay(時間単位)という既存のプロパティを調べ、このプロパティから Urgency という新しい関数ベースの列を生成することです。派生列 Urgency では、長い遅延(4 時間を超える遅延)を緊急度「High」、中程度の遅延(2~4 時間)を緊急度「Medium」、短い遅延(2 時間未満)を緊急度「Low」として指定します。この派生プロパティ Urgency により、ユーザーはオブジェクトテーブルをすばやく確認し、どのアラートに最初に対応すべきかを判断しやすくなります。
この関数ベースのプロパティを設定するには、まず、期待される入力(たとえば、Flight Alert オブジェクトのオブジェクトセット)を受け取り、オブジェクトテーブルが関数ベースのプロパティに要求する、期待されるマップ出力(たとえば、Flight Alert オブジェクトから緊急度の文字列へのマップ)を返す関数を設定します。この例では、以下のように、緊急度を計算するロジックを関数自体にハードコードしています。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23import { Function, FunctionsMap } from "@foundry/functions-api"; import { FlightAlertWorkshopTutorial, ObjectSet } from "@foundry/ontology-api"; export class MyFunctions { @Function() public flightAlertCalculateUrgency(flightAlerts: ObjectSet<FlightAlertWorkshopTutorial>): FunctionsMap<FlightAlertWorkshopTutorial, string>{ const map = new FunctionsMap<FlightAlertWorkshopTutorial, string>(); flightAlerts.all().forEach(flightAlert => { var hoursDelayed = flightAlert.timeOfDelayHours if (hoursDelayed! > 4) { map.set(flightAlert, "High") } else if (hoursDelayed! > 2) { map.set(flightAlert, "Medium") } else { map.set(flightAlert, "Low") } }); return map; } }
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21import { ObjectSet, ObjectSpecifier } from "@osdk/client"; import { FlightAlertWorkshopTutorial } from "@ontology/sdk"; async function flightAlertCalculateUrgency( flightAlerts: ObjectSet<FlightAlertWorkshopTutorial> ): Promise<Record<ObjectSpecifier<FlightAlertWorkshopTutorial>, string>> { const map: Record<ObjectSpecifier<FlightAlertWorkshopTutorial>, string> = {}; for await(const flightAlert of flightAlerts.asyncIter({"$select": ["timeOfDelayHours"]})) { const hoursDelayed = flightAlert.timeOfDelayHours; if (hoursDelayed! > 4) { map[flightAlert.$objectSpecifier] = "High"; } else if (hoursDelayed! > 2) { map[flightAlert.$objectSpecifier] = "Medium"; } else { map[flightAlert.$objectSpecifier] = "Low"; } } return map; } export default flightAlertCalculateUrgency;
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18from functions.api import function from ontology_sdk.ontology.objects import FlightAlertWorkshopTutorial from ontology_sdk.ontology.object_sets import FlightAlertWorkshopTutorialObjectSet @function def flight_alert_calculate_urgency( flight_alerts: FlightAlertWorkshopTutorialObjectSet, ) -> dict[FlightAlertWorkshopTutorial, str]: result = {} for flight_alert in flight_alerts.iterate(): hours_delayed = flight_alert.time_of_delay_hours if hours_delayed is not None and hours_delayed > 4: result[flight_alert] = "High" elif hours_delayed is not None and hours_delayed > 2: result[flight_alert] = "Medium" else: result[flight_alert] = "Low" return result
この関数を公開したら、この Workshop モジュールに派生プロパティ Urgency を表示するように設定します。まず、Workshop モジュール内のオブジェクトテーブルの設定パネルで、列を追加ボタンと、関数ベースのプロパティを追加する選択肢を選択します。

列リストに表示される関数ベースのプロパティの選択肢で、「fx」関数アイコンを選択し、目的の関数を選択します。この例では、flightAlertCalculateUrgency 関数を選択します。

次に、関数のバージョンを確認してから、関数に必要な入力を設定します。実行時の入力を使用するを選択すると、オブジェクトセット全体ではなく、オブジェクトテーブルに現在表示されているオブジェクトのみを派生列の関数に渡すため、パフォーマンスが向上します。もう一方の変数入力を使用するでは、オブジェクトテーブルの元となるオブジェクトセット変数など、オブジェクトセット変数全体を渡しますが、パフォーマンスが低下する可能性があります。

最後に、関数ベースのプロパティ列のセルを選択して、この列の名前を「Urgency」などのよりわかりやすい名前に変更します。

最終的に、以下のオブジェクトテーブルが作成されます。新しい派生列 Urgency がその場で計算され、この有用な追加情報がユーザーに表示されます。

次に、カスタムの戻り値の型を使用して、複数の関数ベースのプロパティを生成する単一の関数を作成する、より詳細な例を説明します。カスタム型について詳しくはこちら。 単一の関数を使用して複数の関数ベースのプロパティを返すことには、パフォーマンスの向上や、関連する派生プロパティのコードをより明確に整理できるなど、いくつかの利点があります。
この例では、ObjectSet<FlightAlerts> を受け取り、Departure Airport リンクをたどってリンクされた Airport オブジェクトを取得し、そのリンクされた Airport オブジェクトから 3 個のプロパティを返す関数を使用します。これにより、オブジェクトテーブルに表示されるデータに、リンクされたオブジェクトタイプの関連情報を追加できます。
この目標を達成するには、まず、この関数内で使用するカスタム型を定義します。たとえば、次のようになります。
Copied!1 2 3 4 5interface LinkedDepartureAirportProperties { airport: string; city: string; country: string; }
Copied!1 2 3 4 5interface LinkedDepartureAirportProperties { airport: string; city: string; country: string; }
Copied!1 2 3 4 5 6 7from dataclasses import dataclass @dataclass class LinkedDepartureAirportProperties: airport: str city: str country: str
次に、このカスタム型を使用して、Airport、City、Country の 3 列の関数ベースの列を返す関数を記述します。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32import { Function, FunctionsMap } from "@foundry/functions-api"; import { AirportObject, FlightAlertWorkshopTutorial, ObjectSet } from "@foundry/ontology-api"; export class MyFunctions { @Function() public getColumnsFromLinkedDepartureAirport(flightAlerts: ObjectSet<FlightAlertWorkshopTutorial>): FunctionsMap<FlightAlertWorkshopTutorial, LinkedDepartureAirportProperties> { // リンクされた空港をすべて取得し、iata をキーとして辞書に保存します const iataToAirport: { [iata: string]: AirportObject } = {}; flightAlerts.searchAroundDepartureAirport().all().forEach(airport => { iataToAirport[airport.iata!] = airport; }); const map = new FunctionsMap<FlightAlertWorkshopTutorial, LinkedDepartureAirportProperties>(); flightAlerts.all().forEach(alert => { // このアラートに対応する空港を取得します const airport = iataToAirport[alert.departureAirportCode!]; // 空港が見つからない場合はスキップします if (!airport) { return; } map.set(alert, { airport: airport.airport!, city: airport.city!, country: airport.country!, }); }); return map; } }
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32import { ObjectSet, ObjectSpecifier, Osdk } from "@osdk/client"; import { AirportObject, FlightAlertWorkshopTutorial } from "@ontology/sdk"; async function getColumnsFromLinkedDepartureAirport( flightAlerts: ObjectSet<FlightAlertWorkshopTutorial> ): Promise<Record<ObjectSpecifier<FlightAlertWorkshopTutorial>, LinkedDepartureAirportProperties>> { // リンクされた空港をすべて取得し、iata をキーとして辞書に保存します const iataToAirport: { [iata: string]: Osdk.Instance<AirportObject, never, "iata" | "airport" | "city" | "country"> } = {}; for await(const airport of flightAlerts.pivotTo("departureAirport").asyncIter({"$select": ["iata", "airport", "city", "country"]})) { iataToAirport[airport.iata!] = airport; } const map: Record<ObjectSpecifier<FlightAlertWorkshopTutorial>, LinkedDepartureAirportProperties> = {}; for await(const alert of flightAlerts.asyncIter({"$select": ["departureAirportCode"]})) { // このアラートに対応する空港を取得します const airport = iataToAirport[alert.departureAirportCode!]; // 空港が見つからない場合はスキップします if (!airport) { continue; } map[alert.$objectSpecifier] = { airport: airport.airport!, city: airport.city!, country: airport.country!, }; } return map; } export default getColumnsFromLinkedDepartureAirport;
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28from functions.api import function from ontology_sdk.ontology.objects import AirportObject, FlightAlertWorkshopTutorial from ontology_sdk.ontology.object_sets import FlightAlertWorkshopTutorialObjectSet @function def get_columns_from_linked_departure_airport( flight_alerts: FlightAlertWorkshopTutorialObjectSet, ) -> dict[FlightAlertWorkshopTutorial, LinkedDepartureAirportProperties]: # リンクされた空港をすべて取得し、iata をキーとして辞書に保存します iata_to_airport: dict[str, AirportObject] = {} for airport in flight_alerts.search_around_departure_airport().iterate(): iata_to_airport[airport.iata] = airport result: dict[FlightAlertWorkshopTutorial, LinkedDepartureAirportProperties] = {} for alert in flight_alerts.iterate(): # このアラートに対応する空港を取得します airport = iata_to_airport.get(alert.departure_airport_code) # 空港が見つからない場合はスキップします if airport is None: continue result[alert] = LinkedDepartureAirportProperties( airport=airport.airport, city=airport.city, country=airport.country, ) return result
上記の関数を公開すると、Workshop 内で派生列を追加するために使用できます。上のセクションと同様に、Flight Alert オブジェクトを含むオブジェクトテーブルウィジェットに、新しい Function-backed property 列を追加します。
列リストに表示される新しい列で、fx アイコンを選択し、派生列の計算に使用する関数を選択します。この例では、このチュートリアルで先ほど定義した getColumnsFromLinkedDepartureAirport 関数を選択します。

次に、選択した関数の入力パラメーターを設定します。この例では、関数は flightAlerts という Flight Alert オブジェクトのオブジェクトセットを、単一の入力パラメーターとして受け取ります。実行時の入力を使用するを選択すると、オブジェクトテーブルに現在表示されているオブジェクトのみを関数に渡すため、パフォーマンスが向上します。もう一方の変数入力を使用するでは、オブジェクトテーブルの元となる入力オブジェクトセット変数など、オブジェクトセット変数全体を渡しますが、パフォーマンスが低下する可能性があります。

上記の手順が完了すると、関数が正常に実行され、**オブジェクトテーブル:**に期待される 3 列、Departure Airport、Departure City、Departure Country が表示されます。このまま完了することも、列の表示名や順序を編集して、アプリケーション内での列の見せ方を改善することもできます。

ウィジェット設定パネルの列の設定セクションに関数ベースの列を追加した後、その下にあるデフォルトの並べ替えセクションから関数ベースの列を選択して、列の並べ替え方法を設定します。Workshop が関数ベースの列で並べ替える場合、テーブルのすべての行について関数の実行が完了するまで待機してから、データを表示します。
時系列プロパティは、時系列変換によって生成されたデータを含め、オブジェクトテーブル内で通常のプロパティとともに表示できます。時系列プロパティは、タイムスタンプ付きの値の履歴を格納するオブジェクトプロパティです。詳細については、Workshop の時系列プロパティを参照してください。
以下の例では、Country オブジェクトに、国名を格納する一般的な文字列プロパティ Name と、その国で観測された COVID-19 の新規感染者数の日次履歴を格納する時系列プロパティ New Cases があります。オブジェクトテーブルでは、左側の最初の 2 列にこれらの 2 個のプロパティを表示し、それに加えて、時系列変換を使用して New Cases プロパティから派生した 3 個の時系列、Case Acceleration、Weekly Cases、Total Cases を表示しています。各時系列列では、左側に時系列の最新の観測を表示し、右側に時系列の履歴を可視化するスパークラインを表示します。

オブジェクトテーブルで時系列プロパティ列を設定する方法を説明するため、Weekly Cases 列の設定手順を紹介します。画面右側のパネルは、Weekly Cases 列の設定の上部と下部です。設定と結果を全体的に確認できるように、これらを列自体と同じ画面にまとめて配置しています。

まず、時系列変換を使用して、COVID-19 の週間感染者数の時系列を生成する必要があります。時系列変換は、入力時系列データに対して数学的な演算を実行し、新しい出力時系列を生成します。時系列変換の詳細については、Workshop の時系列プロパティを参照してください。
ここでは、集計変換を使用して必要な時系列を作成できます。Add transform ボタンで変換の設定を開き、必要な時系列を生成するように設定できます。

次に、時系列サマライザー(赤色の枠)を使用して、列に表示する数値を生成できます。時系列サマライザーは、時系列データの要約統計量、つまり時系列の状態を反映する値を設定します。ここでは、単一値サマライザーを使用して、表示したい値である最新の週間平均感染者数を生成します。時系列サマライザーの詳細については、Workshop の時系列プロパティを参照してください。
次に、「数値の書式設定」ヘッダーの下にある値の書式設定(青色の枠)と、「条件付き書式設定」ヘッダーの下にある条件付き書式設定(緑色の枠)を設定して、この値の表示スタイルを調整できます。値の書式設定は数値の表示方法を制御し、条件付き書式設定は値に基づくルールによって表示色を変更します。この場合は、コンパクトな表記法を使用し、COVID-19 の週間平均感染者数が 100 を超える場合に値を赤色で表示します。値の書式設定と条件付き書式設定の詳細については、Workshop の書式設定を参照してください。

最後に、週間平均感染者数の時系列の履歴を表示する、スパークラインの可視化を設定できます。
期間セレクター(赤色の枠)では、時系列を可視化する時間枠を指定できます。期間の詳細については、Workshop の時系列プロパティを参照してください。
「条件付き書式設定」ヘッダーの下にある条件付き書式設定(青色の枠)を適用して、値に基づくルールによってスパークラインの色を変更することもできます。条件付き書式設定の詳細については、Workshop の書式設定を参照してください。
最後に、ベースライン(緑色の枠)を設定して、スパークラインを解釈しやすくできます。ベースラインの設定の詳細については、Workshop の時系列プロパティを参照してください。

インライン編集を有効にすると、モジュールのユーザーはオブジェクトテーブル内に表示されるセルレベルのデータを変更し、その編集をオブジェクトデータに保存できます。編集オプションは、オントロジーで設定されたアクションによって定義されます。インライン編集に関するその他の考慮事項については、アクションのインライン編集のドキュメントを参照してください。インライン編集に対応するには、アクションが次の条件を満たす必要があります。
補足事項:
オブジェクトテーブルウィジェットを設定すると、列の設定セクションの列リストの下に、インライン編集を有効にする切り替えが表示されます。この切り替えを true に設定すると、インライン編集を有効にする設定が適用され、表示されるオブジェクトタイプを変更するためにオントロジーですでに設定したアクションを選択する画面が表示されます。以下の例では、Flight Alert: Inline Editing アクションによってインライン編集を有効にしています。アクションピッカーの下では、表示されたドロップダウンメニューを使用して、アクションパラメーターをテーブル列にマッピングします。また、変数をアクションパラメーターとして渡すこともできます。これらは、ユーザーがテーブル内の項目を編集しなくても、自動的にアクションに渡されます。

上記の設定後、ユーザーはテーブルのフッターに表示されるテーブルを編集ボタンで編集モードに入ることができます。このボタンのテキストは、カスタムボタンのテキスト入力項目で編集できます。デフォルトで編集モードを有効にするをオンにすると、テーブルを常にインライン編集モードにすることもできます。編集モードに入ると、以下のように、アクションパラメーターにマッピングされた変更可能な列を編集できます。関数ベースのアクションでは、一度に最大 20 行の編集をステージングでき、関数ベースではないアクションでは、一度に最大 200 行の編集をステージングできます。ステージングされた編集は、
元に戻すボタンで元に戻せます(以下のスクリーンショットのテーブルの左端の列に表示されています)。

編集を行い、変更を確定する準備ができたら、テーブルの右下にある確定ボタンを押します。確認ダイアログが表示されるので、もう一度確定を押して変更を確定します。ワンクリックで確定し、この確認ダイアログを無効にする場合は、ワンクリック確定の切り替えを有効にします。
右クリックメニューにカスタムの行の操作を追加すると、ユーザーはオブジェクトテーブルで右クリックしたオブジェクトに対して、アクションやイベントを実行できます。
右クリックメニューにカスタムの行の操作を追加するには、右クリックメニューセクションの右クリックメニューのカスタマイズ切り替えを有効にします。この切り替えを true に設定すると、テーブル内で現在右クリックされているオブジェクトを出力する「右クリックされたオブジェクト」を作成する画面が表示されます。次に、項目を追加を選択して、カスタム項目をメニューに追加できます。

項目を追加を選択すると、新しいメニューが表示され(以下のスクリーンショットを参照)、右クリックメニュー内でのメニュー項目の表示方法をカスタマイズできます。また、クリック時ドロップダウンメニューから選択肢を選ぶことで、メニュー項目にアクションを割り当てることもできます。これにより、メニュー項目がアクションとイベントのどちらをトリガーするかを選択できます。さらに、先ほど設定した「右クリックされたオブジェクト」を、アクションやイベント内で使用できます。

設定が完了すると、オブジェクトテーブルの行を右クリックしたときに、変更内容が表示されます。
