selector-creator について
selector-creatorは、ブランチ上でDatex Studioのドロップダウンやオートコンプリートを作成・編集するスキルです。データソース接続、検証、安全な設定の往復編集を案内します。
主な機能
- 01セレクター設定の作成と編集
- 02セレクターとデータソースの接続
- 03全文検索の設定
- 04プッシュ前の設定検証
活用シーン
- 01エンティティに基づくドロップダウンの作成
- 02列挙型の選択肢リストの作成
- 03フォームやフィルターへのオートコンプリート追加
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ datex/ skills --skill selector-creatorインストール後、Claude Code で/selector-creatorを入力して読み込まれたか確認します。
同梱ファイルevals/evals.jsonreferences/selectors.md
詳細
セレクターの作成
ブランチ上で、Datex Studio セレクター(configurationTypeId=7)を作成または変更します。これは、プラットフォームのドロップダウン/オートコンプリートコントロールです。セレクターは、データソースに基づくオプションリスト、各オプションの表示ラベルを定義する式、入力されたテキストをバックエンドのデータソースに渡す組み込みの全文検索ボックスを定義します。フォームフィールド、ハブのフィルタードロップダウン、グリッドのフィルターセル内にマウントされ、単独ではレンダリングされません。
参考資料
- ../datex-studio-shared/branch-setup.md — ブランチ/接続の選択(スキル間で共有)
- references/selectors.md — セレクター作成の決定版リファレンス:コンポーネントバリアントのルール、ファイル形式、データソースの接続、全文検索の3要素の契約、getList と getByKeys の同等性
- ../datex-studio-conventions/file-format.md —
configurationTypeIdの一覧と TypeScript 式のエンコード規則 - ../datex-studio-conventions/naming-conventions.md —
_ddサフィックスの規則、ファイル名のベース名の一致、表示名の規則 - ../datex-studio-runtime/runtime-globals.md — セレクターコードで利用できるプラットフォーム注入のグローバル(
$selector、$option、$flows、$utils、…) - ../datex-studio-runtime/calling-conventions.md — UI 層の呼び出し規則(関数を呼び出し、アクションは呼び出さない)
- ../datasource-creator/references/datasources.md — データソースの分類(コンポーネントバリアントの
-datasource.jsonと FPDS の-footprintDatasource.json) - ../datasource-creator/references/flow-datasources.md — フロー型データソースの形式(列挙型ドロップダウン、計算されたオプションセット)
- ../datasource-creator/references/odata-datasources.md — OData 型データソースの形式(エンティティに基づくドロップダウン)
- ../component-wiring-check/references/component-wiring.md — 呼び出し元との契約ルール、moduleId のルール
- ../form-creator/references/forms.md — 一般的なマウント先(フォームフィールド)
- ../hub-creator/references/hubs.md — 一般的なマウント先(ハブのフィルタードロップダウン)
依存関係
requirements-gatheringスキル — 会話のコンテキストに要件ブリーフがない場合、作成のために呼び出しますdatasource-creatorスキル — セレクターに新しいバックエンドデータソースが必要な場合に呼び出します(ラップする-datasource.jsonがまだないセレクターすべてが対象)。バックエンドには必ず-datasource.jsonを使用し、-footprintDatasource.jsonは使用しないでくださいschema-explorerスキル — OData に基づくセレクターを作成する前に呼び出し、エンティティ、表示ラベルのフィールド、およびフィルターフィールドが Footprint スキーマに存在することを確認しますform-creator/hub-creatorスキル — セレクターのホスト(フォームフィールドまたはハブのフィルタードロップダウン)で、セレクターをマウントするためのconfigParametersの契約を設定する必要がある場合に呼び出しますcomponent-wiring-checkスキル — プッシュ前に、セレクターのホスト(外側)とバックエンドデータソース(内側)の両方で、configParametersと対象のinParamsの契約を監査するために呼び出します。特にfull_text_searchの接続が対象ですtype-definition-creatorスキル — セレクターのオプションエンティティの形状に新しいインターフェースまたは拡張したインターフェースが必要な場合に呼び出します(まれです。ほとんどのセレクターは既存のデータソースのoutParamsを反映します)
CLI のライフサイクル
セレクターの作成・編集には dxs configuration を使用します。これは、すべてのプラットフォーム設定タイプに対応する汎用 CRUD プリミティブです。dxs selector サブコマンドやフィールド単位のパッチ機能はありません。JSON 本文全体を作成する(または取得して抽出する)→編集する→全体を再度プッシュする、という手順になります。CLI のタイプ識別子は selector(小文字。ConfigurationEndpoints.normalize_type の出力と一致)で、configurationTypeId: 7 に対応します。
新しいセレクターを作成する場合:
# 1. Build body.json from scratch (see references/selectors.md → Datasource-Backed Selector)
# 2. Validate — gates the push. Exit 1 = errors found (read validation_errors, fix, re-run), not a broken CLI
dxs configuration validate selector -b <branchId> -D body.json
# 3. Create
dxs configuration upsert selector -b <branchId> -D body.json
既存のセレクターを編集する場合:
# 1. Fetch — note the envelope wrapper
dxs configuration get selector <configId> -b <branchId> -O envelope.json
# 2. EXTRACT THE INNER BODY (round-trip footgun guard — see "Round-trip rule" below)
jq .json envelope.json > body.json
# 3. Edit body.json
# 4. Validate — gates the push. Exit 1 = errors found (read validation_errors, fix, re-run), not a broken CLI
dxs configuration validate selector -b <branchId> -D body.json
# 5. Push
dxs configuration upsert selector -b <branchId> -D body.json
ラウンドトリップのルール(重要)
既存の設定を編集する場合、envelope.json を直接 dxs configuration upsert にパイプしてはいけません。設定内容が警告なく破壊されます。上記の修正済み手順(編集前に jq で内部の .json を抽出する)は、すべてのラウンドトリップで必須です。正規のラウンドトリップ手順と根本原因となったバグについては、../datex-studio-shared/configuration-roundtrip.md を参照してください。
セレクターはグリッドやフォームよりもシンプルです。本文の大部分は、configId、moduleId、datasourceKeyDef、configParameters、configOutParameters を含む datasourceConfig、表示ラベルの式である text、文字列の top、およびコンポーネント識別情報のエンベロープで構成されます。全文検索の設定はセレクターと、それを支えるデータソースにまたがります。両方にラウンドトリップの手順(取得 → jq で抽出 → 編集 → 検証 → プッシュ)が適用されます。
ワークフロー
[Phase 1: Setup + Requirements]
Follow branch-setup.md for branch/connection selection
|
[requirements brief in context?]
+-----+-----+
| |
YES NO -> invoke `requirements-gathering`
| |
+-----+------+
|
[Phase 2: Decide selector shape + backing source]
Consult references/selectors.md:
- datasource-backed dropdown (most common) — wraps an existing or new
`-datasource.json` (flow-type or OData-type query inside)
- autocomplete — same shape; the dropdown's built-in full-text search
box plus the three-piece contract makes it an autocomplete
- enum dropdown — flow-type backing iterating $types.<Package>.<enum>
with formatKey helpers, getList/getByKeys parity required
Backing-datasource source:
- existing `-datasource.json` -> wrap it; verify keyDef/outParams; flow-type
backing must be the keyed-collection shape (getListFlow + getByKeysFlow
populated, non-empty keyDef) — getList-only cannot resolve selected labels
- existing `-footprintDatasource.json` (FPDS) -> NOT ALLOWED as backing;
wrap the FPDS in a flow-type `-datasource.json` that calls through,
or invoke `datasource-creator` for a fresh one
- no datasource yet -> invoke `datasource-creator`; for OData-backed
options invoke `schema-explorer` first to confirm the entity
|
[Phase 3: Author selector body]
Build body.json:
- File shape (configurationTypeId=7, *-selector.json suffix,
referenceName typically ends _dd, snake_case matches filename stem)
- Hard component-variant rule — datasourceConfig.configId points to a
`-datasource.json` (configurationTypeId=6), NEVER a
`-footprintDatasource.json` (configurationTypeId=19); query type
inside the backing is unconstrained (flows or oDataQuery)
- Key wiring — datasourceKeyDef mirrors the datasource's keyDef;
configId + moduleId resolve to the backing; moduleId is the
DATASOURCE's package, not the selector's caller
- configOutParameters mirrors the datasource's outParams shape with
full property-descriptor boilerplate on every objectTypeDef entry
- text — display-label expression on $option.entity.<DisplayField>
- top — STRING ("25"), not a number
- Sort by display label — when authoring the backing datasource for
this selector, sort by the field referenced in text (OData orderBys
or in-code sort for flow-type)
- Full-text-search three-piece contract (when backing exists solely
for this selector): (1) backing declares full_text_search inParam
(string, required: false); (2) backing applies conditional
contains-filter on the display-label field gated on
$utils.isDefined; (3) selector wires $selector.fullTextSearch into
the datasource's full_text_search via configParameters
- getList ↔ getByKeys parity — if getListFlow applies a Key transform
(formatKey, etc.), getByKeysFlow MUST apply the identical transform
(duplicate the helper definitions inside both code bodies — flows
don't share scope)
- No $types.<Package>.e_<enum> in vars/inParams/outParams — primitives
only at the param layer; cast at usage in flow code
- Sibling *Config keys explicitly null
- Invoke `schema-explorer` for OData entity / display-label / filter
field validation before authoring OData-backed selectors
- Invoke `component-wiring-check` to audit BOTH the outer host
contract (form field / hub filter / grid filter cell) AND the inner
selector → datasource contract (every declared backing inParam,
including full_text_search, needs an explicit configParameters
entry)
|
[Phase 4: Validate + push]
dxs configuration validate selector -b <branchId> -D body.json
|
+----+----+
| |
CREATE MODIFY-EXISTING
| |
| use the corrected round-trip
| (get -O envelope -> jq .json -> body)
| |
+----+----+
|
v
dxs configuration upsert selector -b <branchId> -D body.json
(upsert creates or updates by referenceName — one command for both)
|
[Phase 5: Verify in Studio (optional)]
Open the selector through its normal mount (form field / hub filter);
confirm option population, alphabetized order by display label,
full-text-search filtering live as you type, saved-selection re-hydration
shows the same display label getList showed (getByKeys parity)
|
[invoke `post-edit-verification`; then `component-validator`]
フェーズの詳細
フェーズ 1:セットアップと要件
- ブランチと接続の選択については、../datex-studio-shared/branch-setup.md に従ってください。ブランチ ID を決めつけてはいけません。ユーザーに確認を求めてください。
- 会話のコンテキストに要件概要(
requirements-gatheringまたは別の呼び出し元スキルが作成)がすでにあるか確認してください。- 概要がある場合 — それを使用してください。概要には、ドロップダウンが表すもの(エンティティ、列挙型、計算されたリスト)、ユーザーに表示するラベル、保存された選択内容に保持される基になるキー/値、セレクターの配置場所(フォームフィールド/ハブフィルター/グリッドフィルターセル)、およびオートコンプリートの動作が必要かどうかを明記してください。
- 概要がない場合 — まず
requirements-gatheringスキルを呼び出してください。表示ラベル、保存するキー、配置場所を最初に正しく把握しておけば、text、datasourceKeyDef、およびホストのconfigParametersを作り直す必要がなくなります。
フェーズ 2:セレクターの形状とデータソースを決める
作成を始める前に、references/selectors.md を確認してください。決めることは 2 つあります。
セレクターの形状。 よく使われる形状は 3 種類です。
- データソース連携型ドロップダウン — 標準的な形状です。既存または新規の
-datasource.jsonをラップし、そのoutParamsを選択肢として表示します。text: "$option.entity.<DisplayField>"で表示ラベルを指定します。 - オートコンプリート — 形状はデータソース連携型ドロップダウンと同じです。ドロップダウンに組み込まれた全文検索ボックスと、3 要素からなる契約(references/selectors.md → 全文検索の配線 を参照)により、入力した文字に応じて選択肢がリアルタイムで絞り込まれます。
- 列挙型ドロップダウン — フロー型のデータソースが
$types.<Package>.<enum>を反復処理し、{ Key, Value }の行を出力します。formatKey/capitalizeヘルパーで表示ラベルを整形します。getList と getByKeys の整合性が必要です(references/selectors.md → getList と getByKeys のキー変換の整合性 を参照)。
データソース。 選択肢の取得元を決めます。
- 既存の
-datasource.json— これをラップします。keyDefとoutParamsの形状を確認してください。セレクターのdatasourceKeyDefとconfigOutParametersは、それらと一致させる必要があります。このブランチのサーバー側使用ゲートでは、基盤となるデータソースにgetListとgetByKeysの実装がない場合、公開がブロックされます。このセクションで必要とする、キー付きコレクションと同じ形状です。 - 既存の
-footprintDatasource.json(FPDS) — セレクターのデータソースとして使用できません。これはプラットフォームの厳格なルールです。FPDS を呼び出すフロー型の-datasource.jsonでラップするか、datasource-creatorを呼び出して同じ形状を返す新しいデータソースを作成してください。 - データソースがまだない —
datasource-creatorを呼び出します。OData を基盤とするデータソースの場合は、まずschema-explorerを呼び出して、Footprint スキーマにエンティティ、表示ラベル用のフィールド、フィルター用のフィールドが存在することを確認してください。
フェーズ 3:セレクターの本体を作成する
references/selectors.md → データソース連携型セレクター のひな形から body.json を作成します。重要な点は次のとおりです。
-
ファイルの基本事項。 以下の事前確認チェックリストと ../datex-studio-conventions/universal-checklist.md に従ってください。
-selector.jsonファイルの形状については、references/selectors.md → データソース連携型セレクター を参照してください。referenceNameの_ddドロップダウンインジケーターは、セレクター固有の命名規則です。 -
コンポーネントのバリアントに関する厳格なルール。
datasourceConfig.configIdとmoduleIdは、-datasource.json(configurationTypeId: 6)を参照する必要があります。-footprintDatasource.json(FPDS、configurationTypeId: 19)を参照することはできません。これは例外のない、プラットフォームの厳格なルールです。基盤データソース内部のクエリタイプには制約がありません。フロー型(type: "flows"。列挙型ドロップダウンや計算済みリストに使用)でも、OData 型(type: "oDataQuery"。データベースエンティティから選択肢を取得する場合に使用)でも構いません。つまり、セレクターで重要なのはコンポーネントのバリアントであり、クエリタイプではありません。必要なデータを FPDS がすでに公開している場合は、FPDS を呼び出すフロー型の-datasource.jsonでラップしてください。セレクターから FPDS を直接参照してはいけません。references/selectors.md → 基盤データソースのバリアント — 厳格なルール を参照してください。 -
キーの接続。
datasourceConfig.configIdとmoduleIdは、データソースを識別します。moduleIdはセレクターの呼び出し元ではなく、データソースのパッケージです。datasourceConfig.datasourceKeyDefはデータソースのkeyDefをミラーリングします(同じ ID、同じ型)。ここに不整合があると、getByKeysによる保存済み選択の再ハイドレーションが失敗します。datasourceConfig.configParametersは、セレクターの入力(例:$selector.fullTextSearch)をデータソースの inParams に接続します。datasourceConfig.configOutParametersは、データソースのoutParamsの形状をミラーリングします。同じobjectTypeDefエントリーを、パラメーター記述子の定型項目すべてとともに使用してください。references/selectors.md → 主なポイントを参照してください。 -
textは表示ラベルの式です。 通常は"$option.entity.<DisplayField>"(例:"$option.entity.Name"、"$option.entity.Key")です。ドロップダウンでリストを描画する際、オプションごとに一度実行されます。formatKeyで整形された{ Key, Value }の行を返すデータソースを使用する列挙型ドロップダウンでは、標準の表示値は"$option.entity.Key"です。 -
topは数値ではなく文字列です。"25"は、ドロップダウンに表示する項目数を指定します。JSON の数値25を指定するとインポートに失敗します。プラットフォームのパラメータースロットでは、TS 式の文字列リテラルが必要です。 -
表示ラベルでソートします。 このセレクター用に特別にデータソースを作成する場合は、
textで参照されるフィールドで結果をソートしてください。OData 型のデータソースでは、そのフィールドのorderBysエントリーを追加します。フロー型のデータソースでは、返す前にコード内で配列をソートします。Nameを表示するtask_status_ddセレクターのデータソースは、Nameの昇順でソートする必要があります。これにより、ユーザーには挿入順やデータベースから返された順ではなく、アルファベット順のオプションがすぐに表示されます。references/selectors.md → 主なポイントを参照してください。 -
全文検索の 3 点セットの契約。 データソースがこのセレクターを支えるために特別に用意されている場合に適用されます。他のフローやアクションでも使用される単独のデータソースは対象外です。次の 3 つの要件は相互に連携しており、いずれか 1 つでも欠けると、ドロップダウンの組み込み検索が正常に動作しないように感じられます。
- データソースで
full_text_searchを inParam として宣言する — ID は正確にfull_text_search、type: "string"、required: falseとします。 - データソースで表示ラベルのフィールド(
textが参照するフィールド)に条件付き contains フィルターを適用する。$utils.isDefined($datasource.inParams.full_text_search)を条件に指定し、入力が空の場合はフィルターを無効にします。OData 型では、hasCondition: trueと条件式を指定した標準形contains(<LabelField>, ${$utils.odata.formatString(...)})を使用します。フロー型では、getListFlowのコード内でif ($utils.isDefined($flow.inParams.full_text_search)) { rows = rows.filter(r => r.<LabelField>.toLowerCase().includes((... as string).toLowerCase())); }のようにガードします。 datasourceConfig.configParametersエントリーを介して、セレクターの$selector.fullTextSearchをデータソースのfull_text_search入力に接続する。そのエントリーのvalueは"$selector.fullTextSearch"とします。
top: "25"と「表示ラベルでソート」を組み合わせることで、オートコンプリートの基本動作を実現できます。要件を省くと、ユーザーが入力してもドロップダウンが反応しないように感じられます。references/selectors.md → 全文検索の接続を参照してください。 - データソースで
-
getListFlow↔getByKeysFlowのキー変換の一貫性。 ユーザーがドロップダウンを開いたとき、プラットフォームはドロップダウンにデータを設定するためにgetListFlowを呼び出し、以前に保存された値について表示可能なレコードを再取得するためにgetByKeysFlowを呼び出します。getListFlowでキー変換(例:formatKeyによるParentOfTarget→Parent of targetへの変換など、その他のラベルの調整も含む)を適用する場合、getByKeysFlowでも同じ変換を適用する必要があります。そうしないと、保存した選択値をgetByKeys経由で再取得したときに生の enum ID が返され、編集時にはドロップダウンコントロールにParentOfTargetが表示される一方、再読み込み後にはParent of targetが表示されます。formatKey/capitalizeヘルパー関数は、それぞれのフローのcode本文内にネストされた関数宣言として定義されています。プラットフォームは各フローを個別にコンパイルし、スコープを共有しないため、両方のフローで同じ定義を重複させてください。OData 型のバックエンドでこの問題が発生することはまれです(getByKeysはkeyDefから自動生成され、生の列を選択します)。ただし、OData クエリオプションに計算列や列のエイリアスが含まれる場合は、リスト取得時に使うプロジェクションをキー検索時に使うプロジェクションと一致させる必要があります。references/selectors.md → getList ↔ getByKeys のキー変換の一貫性を参照してください。 -
vars/inParams/outParamsにカスタム enum の FQN を指定しないでください。 セレクターはパラメーター宣言内の$types.<Package>.e_<enum>を解決できません。これらのフィールドはプリミティブ型(文字列値の enum にはstring、数値の enum にはnumber)として宣言し、フローコード内で使用時にキャストしてください。バックエンドのoutParams.result.objectTypeDef[Value]は、作成者が最も enum 型で指定したい箇所であるため、この問題は enum を使うセレクターで特に発生しやすくなります。 -
隣接する
*Configキーは明示的に null にします。customOptionsConfig、actionConfig、onInitFlowConfig、およびその他の無効なサブ設定は、標準的なデータソース接続型セレクターでは明示的にnullのままにしてください。構造的な差分比較ではこの慣例に従ってください。既存のセレクターコンポーネントでは、隣接するすべてのスロットが存在し、null に設定されています。 -
呼び出し階層への準拠。 セレクターコード(
onInitFlowConfigおよびflows[]の各エントリー)からは、$flows.<Package>.<fn>経由で関数を呼び出します。その関数が、CRUD アクションの呼び出しを$apis.<Package>.FootprintApi.extendedActions.<action_name>({...})でラップします。セレクターコードからアクションを直接呼び出さないでください。../datex-studio-runtime/calling-conventions.mdを参照してください。 -
ホストコントラクトの監査。 このセレクターをマウントするホスト(フォームフィールド、ハブのフィルタードロップダウン、グリッドのフィルターセル)はすべて、完全な
configParametersコントラクトを宣言します。セレクターが宣言するすべてのinParamについて、未使用のものも含めて、ホスト側にエントリーを設け、value: nullを設定してください。component-wiring-checkを実行し、両側の参照コントラクト(外側のホスト → セレクターのコントラクトと、内側のセレクター → バックエンドデータソースのコントラクト)を監査してください。セレクターが読み取るバックエンドのすべてのinParam(full_text_searchを含む)について、セレクター側に明示的なconfigParametersエントリーが必要です。自動配線はありません。../component-wiring-check/references/component-wiring.mdを参照してください。
フェーズ 4:検証してプッシュする
# Validate the body locally against the branch. Exit 1 = validation found errors
# (read validation_errors, fix body.json, re-run) — not a broken CLI. Do not push on exit 1.
dxs configuration validate selector -b <branchId> -D body.json
# For a new selector
dxs configuration upsert selector -b <branchId> -D body.json
# For modify-existing (round-trip — never skip the jq extract)
dxs configuration get selector <configId> -b <branchId> -O envelope.json
jq .json envelope.json > body.json
# ... edit body.json ...
dxs configuration upsert selector -b <branchId> -D body.json
検証では、必須フィールドの不足、不正なパラメーターディスクリプターの形式、未定義のフロー ID 参照、参照エラーを検出してからプッシュできます。ただし、コンポーネントバリアントの規則(-footprintDatasource.json を指定したセレクターはスキーマ検証に合格しますが、アップロード時または実行時に失敗します)、並べ替えられていないオプションのバグ、未完成の全文検索コントラクト、getList ↔ getByKeys 間のキー変換の不一致は検出しません。これらは動作上の問題であり、アップロード時の検証または実行時にドロップダウン上でのみ表面化します。プッシュする前に、以下に埋め込まれた事前チェックリストを確認してください。
フェーズ 5:Studio で確認(任意)
通常のマウント方法(フォームフィールド、ハブのフィルタードロップダウン、グリッドのフィルターセル)でセレクターを開き、次を確認します。
- オプションがバックエンドのデータソースから取得されます。空ではなく、
formatKeyが実行されるべき場合に列挙型の生の ID が表示されることもなく、重複もありません。 - オプションが表示ラベルのフィールド(
textが参照するフィールド)でアルファベット順に並びます。これにより、バックエンドのorderBysまたはコード内のソートが反映されたことを確認できます。 - 検索ボックスに入力すると、オプションがリアルタイムに絞り込まれます。これにより、全文検索の契約を構成する 3 つの要素(データソースでの inParam の宣言、条件付きフィルターの適用、
configParametersを介した$selector.fullTextSearchのセレクターへの接続)がすべて設定されていることを確認できます。 - 選択を保存し、フォーム/ダイアログを閉じてから再度開きます。保存された Value が再読み込みされ、
getListFlowで表示されるものと同じ表示ラベルで描画されます(getByKeysFlowの Key が一致していることを確認できます)。 - マウントの
moduleIdでセレクターを解決できます。インポートログにReferenced configuration <name> does not existエラーがありません。
実行中のアプリを利用できない場合は、(修正済みの jq .json 抽出パターンを使用して)設定を再取得し、body.json との差分を確認してプッシュが反映されたことを確かめます。
プッシュ前チェックリスト
プッシュ前に、このチェックリストを確認します。簡易版:
- コンポーネントのバリエーション。 バックエンドは
-datasource.json(configurationTypeId: 6)であり、-footprintDatasource.json(configurationTypeId: 19)ではありません。内部のクエリタイプは flows または oDataQuery のどちらでもかまいません。 - ファイルの基本事項。 サフィックスは
-selector.json、configurationTypeId: 7、referenceNameは通常_ddで終わります。さらに、共通チェック(../datex-studio-conventions/universal-checklist.md)も確認します。 - データソース接続の契約。
configIdとmoduleIdが実在するデータソースを解決します(moduleId= データソースのパッケージ)。datasourceKeyDefはデータソースのkeyDefと一致します。configOutParametersは、完全なパラメータ記述子の定型項目を含めてoutParamsと一致します。 - 表示式。
textが$option.entity.<field>上の実在するフィールドを参照します。 topは文字列("25")であり、数値ではありません。- データソースが表示ラベルのフィールドでソートされます(OData の
orderBysまたはフローコード内のソート)。初期状態でオプションがアルファベット順に並びます。 - バックエンドのデータソースがこのセレクター専用の場合は、全文検索を完全に設定します。 必要な要素は 3 つです。バックエンドで
full_text_searchinParam(string、required: false)を宣言すること、$utils.isDefinedを条件として表示ラベルのフィールドに contains フィルターを適用すること、configParametersを介してセレクターの$selector.fullTextSearchをバックエンドのfull_text_searchに接続することです。 getListFlowとgetByKeysFlowの Key 変換が一致していること。getListFlowで Key 変換(formatKeyなど)を行う場合は、getByKeysFlowでも同じ変換を行います。ヘルパー関数(formatKey、capitalize)は両方のcode本文内に複製します。フローはそれぞれ独立してコンパイルされます。vars/inParams/outParamsに$types.<Package>.e_<enum>がないこと。 パラメータ層ではプリミティブ型のみを使用し、フローコード内の使用箇所でキャストします。- 同階層の
*Configキーが明示的に null であること。 標準のデータソース接続セレクターでは、customOptionsConfig、actionConfig、onInitFlowConfigなどはnullのままにします。 - 呼び出し層の要件を満たしていること。 セレクターのコードは
$flows.<Package>.<fn>経由で関数を呼び出します。関数は$apis.<Package>.FootprintApi.extendedActions.<action_name>({...})経由で CRUD アクションをラップします。セレクターからアクションを直接呼び出しません。 - ホストに完全な
configParameters契約が設定されていること。 セレクターが宣言するすべての inParam に、ホスト(フォームフィールド/ハブのフィルター/グリッドのフィルターセル)でエントリがあります。未使用のものはvalue: nullを使用します。component-wiring-checkで監査します。 - 内部データソースの契約。 セレクター自身の
datasourceConfig.configParametersで、バックエンドのデータソースが宣言するすべての inParam(full_text_searchを含む)をカバーします(自動接続はされません。value: "$selector.fullTextSearch"の明示的なエントリが必要です)。
よくある間違い
| 間違い | 修正方法 |
|---|---|
セレクターが -footprintDatasource.json(FPDS、configurationTypeId: 19)を参照している | プラットフォームの厳格なルールとして、参照先は -datasource.json(configurationTypeId: 6)である必要があります。FPDSにデータがある場合は、それを呼び出すフロー型の -datasource.json でラップしてください。セレクターからFPDSを直接参照してはいけません。 |
| コンポーネントのバリアントとクエリの種類を混同し、「ODataドロップダウンならFPDSが参照先」と思い込んでいる | セレクターが参照するのはコンポーネントのバリアントであり、クエリの種類ではありません。ODataを参照するドロップダウンも問題ありません。ただし、ODataクエリを定義するのはFPDSではなく -datasource.json(type: "oDataQuery")です。 |
top: "25"(TS式の文字列)ではなく、top: 25(JSON数値)を指定している | スロットが受け取るのは文字列リテラルです。数値の 25 はインポートに失敗します。必ず引用符で囲んでください。 |
<field> がデータソースの outParams に存在しないのに、text: "$option.entity.<field>" を指定している | text は $option.entity に対して評価されます。選択肢の行の形状は、データソースの outParams[result].objectTypeDef によって決まります。実際に存在するフィールドを選ぶか、データソースにそのフィールドを追加してください。 |
| 参照先データソースが選択肢を挿入順で返すため、ユーザーからドロップダウンが「ランダム」だと苦情が出る | 表示ラベルのフィールドに対して、orderBys(OData)を追加するか、コード(フロー型)でソートしてください。ユーザーは選択肢がアルファベット順に並ぶことを期待します。 |
fullTextSearch は表示されるが、入力した文字で選択肢が絞り込まれない | 3つの要素からなる契約が正しく設定されていません。次を確認してください。(1)参照先で full_text_search inParam を宣言している。(2)参照先で表示ラベルのフィールドに条件付きフィルターを適用している。(3)セレクターの datasourceConfig.configParameters に、value: "$selector.fullTextSearch" を持つ full_text_search エントリーがある。いずれの要素も自動で連携されません。 |
getListFlow ではKeyのプロジェクションに formatKey(key) を使っているが、getByKeysFlow は元のcamelCaseの列挙型IDを返している | 保存した選択値を再度読み込むと、ドロップダウンの選択肢には整形された値が表示される一方で、保存値は未加工のまま表示されます。getByKeysFlow.code 内にも同じ formatKey 式(およびヘルパー関数の定義)を複製してください。フローは個別にコンパイルされ、スコープを共有しません。 |
セレクターの vars/inParams/outParams で $types.<Package>.e_<enum> を参照している | UIコンポーネントは、パラメーター層でカスタム列挙型の完全修飾名(FQN)を解決できません。プリミティブ型(文字列値の列挙型には string、数値の列挙型には number)として宣言し、フローコード内で使用するときにキャストしてください。 |
datasourceKeyDef が参照先の keyDef と異なる(IDまたは型が異なる) | getByKeysFlow を通じた保存済み選択値の再ハイドレーションに失敗するか、誤ったレコードが返されます。2つの keyDef は完全に一致させる必要があります。 |
configOutParameters の記述子の定型情報が {id, type} だけに省略されている | プラットフォームでは、各エントリーに完全なプロパティ記述子の形状(required、description、oneOf、fromBaseConfiguration、objectTypeDef、objectType、isCollection、isSecured、isConstant、constantValue)が必要です。参照先の outParams と同じ形状を使用してください。 |
セレクターの datasourceConfig の moduleId に、データソースのパッケージではなくセレクターのパッケージを設定している | コンポーネント間参照のルールでは、moduleId は常に参照先のパッケージです。データソースが登録されている場所を指定してください。../component-wiring-check/references/component-wiring.md を参照してください。 |
セレクター独自の vars/inParams/outParams フィールドを、トップレベルで宣言せずにフローコード内で記述している | インポートエラーが発生します。Property 'vars' does not exist on type 'ISelector'。各var/inParam/outParamを、標準のプロパティ記述子の形状で、対応するトップレベル配列に宣言してください。 |
兄弟の *Config スロットが省略されている(例:datasourceConfig だけを設定し、customOptionsConfig/actionConfig/onInitFlowConfig がすべて欠落している) | 既存のセレクターでは、構造差分を取るためにすべての兄弟スロットを残し、null に設定しています。この規約に合わせてください。 |
| セレクターのコードからアクションを直接呼び出している | UI層のルールでは、セレクターが呼び出せるのは関数のみです。関数内で $apis.<Package>.FootprintApi.extendedActions.<action_name>({...}) を使ってアクションをラップしてください。 |
dxs configuration get -O envelope.json の出力を、そのまま dxs configuration upsert -D envelope.json に渡している | 設定の内容が警告なく破壊されます。編集前に必ず jq .json envelope.json > body.json を実行してください。上記の「往復ルール」を参照してください。 |
description が100文字を超えている | SQLの列制限により、プッシュ時の検証に失敗します。短くしてください。 |
(セレクターがドロップダウンインジケーターの場合)referenceName が _dd で終わっていない、またはファイル名のベース名と一致していない | 規約の不一致により、検索や、_dd の接尾辞を期待する後続の呼び出し元で問題が発生します。スネークケースを使用し、該当する場合は _dd の接尾辞を付け、ファイル名のベース名と一致させてください。 |
編集後、post-edit-verification を実行して、説明文/JSON/スキーマの違反を検出してください。最終確認では、component-validator を実行してください。 |