注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
高度なウィジェットカテゴリーは、以下のウィジェットで構成されています。
Code Sandbox ウィジェットは、ユーザーの独自のカスタムウィジェットを実装して、Slate の機能を拡張できるセキュアなサンドボックスです。独自のカスタム可視化を構築したり、サードパーティの JavaScript ライブラリを活用したり、高度なワークフローインタラクションを構築したりできます。ウィジェットのレンダリング、ウィジェットモデル、イベントインタラクションを定義して、ウィジェットがアプリケーション全体と統合されるようにします。外部 JavaScript ライブラリは、プロジェクトのフォルダーにロードして、ウィジェットで参照できます。
Code Sandbox ウィジェットは、Slate アプリケーション内で高度なカスタム開発機能を解放します。Code Sandbox ウィジェットを使用したカスタム機能の実装は、技術的な複雑さと成功した開発に必要な長期的なメンテナンスを十分に理解した上で行う必要があります。ウィジェット開発はユーザーの裁量とリスクで行われ、カスタムコードのデバッグに関するサポートは提供されません。
Slate との相互作用と使用できる関数の概要は以下のとおりです。
このタブには、JavaScript のフィールドと、読み込む可能性のある JavaScript ライブラリがあります。
ウィジェットの読み込み時に実行される JavaScript の文字列です。この JavaScript を変更すると、ウィジェット全体がリロードされます。このフィールドの JavaScript は、ライブラリフィールドの JavaScript よりも後に実行されます。サードパーティライブラリの読み込み方法については、JavaScript ライブラリセクションを参照してください。
ここでは Handlebars を使用しないでください。JavaScript タブを介してデータを渡すために、SlateFunctions
を使用することをお勧めします。state のインタラクションタブで相互作用します。
Code Sandbox の JavaScript、JavaScript ライブラリ、または HTML において、ネットワークリクエストや参照(たとえば、fetch
の使用)はサポートされていません。すべてのネットワークリクエストは、SlateFunctions
経由で設定済みの Queries にプロキシされる必要があります。
利用可能な関数
以下のネイティブ関数を使用して、Slate 固有の機能との相互作用ができます。これらの関数を使用すると、イベント、アクション、および状態変更を使用して、残りの Slate アプリケーションとの相互作用ができます。これらの関数は、ウィジェット内で実行される JavaScript に公開されます。詳細と例については、以下を参照してください。
これは、プロジェクトのパスの配列で、ウィジェット内で順番にダウンロードして実行されます。また、CORS と CSP ポリシーで許可された URL の配列(混在させることができます)でもあります。
ブラウザーを使用してダウンロードするため、URL は CORS および CSP ポリシーで許可されている必要があります。Foundry 内でライブラリをホストしたい場合は、Blobster でホストして、クッキー認証付きの API を使用するか、アセットサーバーにスクリプトを配置します。このフィールドの変更は、ウィジェット全体のリロードと再読み込みを引き起こします(ライブラリ自体が SlateFunctions
を呼び出すことができるため、Slate 固有の機能との相互作用が可能となります)。
インポートされた JavaScript ライブラリは、JavaScript タブを介して参照されるために、グローバルに利用可能なスコープに機能を割り当てる必要があります(たとえば、UMD モジュールとしてバンドルされているか、明示的に window
に機能を割り当てる)。
d3.min.js ライブラリを使用するには、https://d3js.org/d3.v5.min.js
からダウンロードして、Foundry ディレクトリにドラッグアンドドロップしてファイルを保存します。ファイルがアップロードされると、プロジェクトパスをコピーしてライブラリ配列に貼り付けます。
["/Users/admin/d3.min.js"]
リソースのプロジェクトパスは、ファイルのディレクトリを調べることで取得できます。また、フォルダー内のファイルを右クリックして、「場所」をコピーすることもできます。
ウィジェットの読み込み時にレンダリングされる HTML の文字列です。
ここでは Handlebars を使用しないでください。HTML タグ <script>
は機能せず、JavaScript を JavaScript タブに抽出する必要があります。
ウィジェットの読み込み時にレンダリングされる CSS の文字列です。
ここでは Handlebars を使用しないでください。指定された CSS は、iframe の境界線内でレンダリングされた CSS を上書きすることができますが、フレーム内ではありません。同じ境界線のスタイリングは、ウィジェットの最上位の Styling タブの Additional CSS Classes および Custom Styles を使用して適用することもできます。
CSS ライブラリ機能を使用すると、CSS スタイル(例:Blueprint)を読み込んでカスタムウィジェットを作成できます。ウィジェットの HTML/CSS タブでアクセスできます。
CSS ライブラリは、Code Sandbox の JavaScript ライブラリと同様に機能します。CSS ライブラリは、ウィジェット内で順番にダウンロードしてレンダリングされるプロジェクトパスの配列を取得し、CORS と CSP ポリシーで許可された URL の配列(混在させることができます)でもあります。ブラウザーを使用してダウンロードするため、URL は CORS および CSP ポリシーで許可されている必要があります。Foundry 内で CSS ライブラリをホストしたい場合は、Blobster でホストして、クッキー認証付き API を使用するか、アセットサーバーにスクリプトを配置します。このフィールドの変更は、ウィジェット全体のリロードと再読み込みを引き起こします。
CSS ライブラリファイルの内容には、プレーンな CSS が十分です。CSS スタイルを囲む HTML <style>
タグがないことを確認してください。
これは、ウィジェットが Slate パラダイムと相互作用するためのコントロールです。Code Sandbox ウィジェットと Slate の残りの部分との間のすべての相互作用は、状態、イベント、アクションのいずれかを介して渡される必要があります。
Handlebars をこのインタラクションタブでのみ渡すことをお勧めします。JavaScript ボックスで Handlebars を直接使用すると、ウィジェット全体がリロードおよび再読み込みされるたびに機能しますが(たとえば、SlateFunctions.watch
や SlateFunctions.getState
を使用せずに状態を渡すため)、これはお勧めしません。
これは、ウィジェットの現在の設定を表す JSON ブロブです。これは、他のメタフィールドを許可するためにこのフィールドの下にネストされた、Slate の他のウィジェットが使用する状態と似ています。状態は、ウィジェット内部からまたは、状態に Handlebars を入れる通常の方法で変更できます。
ウィジェットから状態を変更するには、JavaScript 内で SlateFunctions.setState
を使用します。ウィジェットに状態を渡す他の Slate 関数は、SlateFunctions.watch
および SlateFunctions.getState
です(以下の例を参照)。
このフィールドを使用して、追加のランタイムコードを Code Sandbox ウィジェットにロードする方法がいくつかあります(たとえば、状態に JavaScript を渡して後でロードする)。ただし、これらの方法はお勧めしません。このフィールドの目的は、ウィジェットの状態を表すことです。
これは、このウィジェットがトリガーできるイベントの名前の文字列の配列です。これらのトリガーは、以下で提供される関数を使用して、ウィジェット内の JavaScript から明示的に呼び出す必要があります。イベントは、イベントタブに表示される際に custom.{event_name}
として名付けられます。イベント名は、triggerEvent パラメータに別途入力する必要はありません。
イベントをトリガーするには、JavaScript 内で SlateFunctions.triggerEvent(“event”)
を使用します。以下の例を参照してください。
これは、このウィジェットが他のウィジェットからトリガーされるアクションの名前の文字列の配列です。ウィジェット内の JavaScript は、以下で提供される関数を使用して、アクションをリッスンする必要があります。アクションは、イベントタブに表示される際に custom.{action_name}
として名付けられます。アクション名は、onAction パラメータに別途入力する必要はありません。
Slate コンテキストで作成されたアクションに対してウィジェットが応答するには、JavaScript 内で SlateFunctions.onAction(“action_name”,(value)=>{put JavaScript here})
を使用します。以下の例を参照してください。
これらのネイティブ関数を使用して、Slate 固有の機能との相互作用ができます。これらの関数は、ウィジェット内で実行される JavaScript に公開されます。これらの関数を使用すると、イベント、アクション、および状態変更を使用して、残りの Slate アプリケーションとの相互作用ができます。
データの方向:Slate コンテキスト → ウィジェット
SlateFunctions.onAction
を使用すると、ウィジェットでアクションが呼び出されたときにコールバックを登録できます。引数は、アクションの名前と、アクションが受信されたときに呼び出される関数です。関数は、アクションに伴って渡される「ボディ」を唯一の引数として呼び出されます。
次に、以下のインタラクションタブでアクションをリストする必要があります。
例
この例では、Slate Checkbox ウィジェットを使用して、クリック時に Code Sandbox ウィジェットが更新されます。
JavaScript:
Copied!1 2 3 4 5 6 7 8 9
// SlateFunctionsのonAction関数を使って、"checkbox"アクションを処理します SlateFunctions.onAction("checkbox", (value) => { // div要素を作成し、checkbox変数に格納します var checkbox = document.createElement("div") // 作成したdiv要素にvalueを代入します checkbox.innerHTML = value; // 作成したdiv要素をbodyに追加します document.body.appendChild(checkbox); });
インタラクション アクション:
Copied!1 2 3
[ "checkbox" // "チェックボックス" ]
新しいイベント-アクションペアが登録されました:
イベント: Slate_widget.selectedValues.changed
アクション: Code_Sandbox_widget.custom.checkbox
データ方向: Slate コンテキスト → ウィジェット (連続的な監視)
SlateFunctions.watch
は、AngularJS の監視と同様の方法で状態フィールドの変更を検出するのに役立つことを目的としています。SlateFunctions.watch
は文字列と関数を引数として受け取ります。文字列で表される状態の一部が変更されると、提供された関数が新しい状態と古い状態を引数として呼び出されます。これはおそらく最も有用な関数で、Interaction タブに渡される Handlebars を使用してウィジェットにデータを渡す方法です (例: "First Argument": "{{handlebars}}"
).
例えば、状態が二つのフィールド - 高さと幅 - を持っていて、高さが変化したときに関数を呼び出したい場合、SlateFunctions.watch("height", <insert function here>)
を呼び出します。初期文字列が空白の場合、関数は任意の状態変更に対して呼び出されます。
例
この例では、Slate の Input ウィジェットを使用して状態を Code Sandbox ウィジェットに渡し、それを表示します:
{{w_widget2.text}}
SlateFunctions.watch("State Name", (data) =>...
を使用します。JavaScript:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14
// "div"要素を作成します var el = document.createElement("div") // 作成した"div"要素に"id"属性を追加し、その値を"display"とします el.id = "display" // 作成した"div"要素をbody要素の子要素として追加します document.body.appendChild(el); // "Input State"という名前のSlateFunctionsを監視します。データが更新されると、この関数が呼び出されます SlateFunctions.watch("Input State", (data) => { // 上で作成した"div"要素の内部HTMLを更新します。更新内容は、"Code Sandbox widget: "に、更新されたデータを連結したものです el.innerHTML = "Code Sandbox widget: " + data; });
インタラクション アクション:
Copied!1 2 3
{ "Input State": "{{w_widget2.text}}" // 入力状態:w_widget2のテキスト }
データ方向: Slate コンテキスト → ウィジェット (連続的でない、1回限りの 'get')
この関数は、state フィールドによって最初に入力されるウィジェットの現在の状態を返します。
SlateFunctions.getState
は、state フィールドによって最初に入力されるウィジェットの現在の状態である JSON オブジェクトを返します。オブジェクトの異なるプロパティ(つまり、異なる'状態')にアクセスできます。
SlateFunctions.getState
は、state フィールドの JSON オブジェクトを返し、オブジェクトの異なるプロパティ(つまり、異なる'状態')にアクセスできます。
SlateFunctions.getState
は、呼び出されたときに一度だけ状態を取得します。対照的に、SlateFunctions.watch
は、状態フィールドの更新を常に "監視" します。この SlateFunctions.getState
関数を SlateFunctions.watch
の中で使用して、完全な状態オブジェクトの特定の属性を取得できます。
例えば、状態が以下のような場合:
Copied!1 2 3 4
{ "a": "cat", // 猫 "b": "hat" // 帽子 }
SlateFunctions.getState().a
はcat
を返します。
例
この例では、SlateのInputウィジェットを使用して、状態をCode Sandboxウィジェットに渡します。全体の状態は、getState
関数を使用して呼び出されます(xに割り当てられます)。その後、この"全体の状態"オブジェクトの特定の属性が表示されます。この場合は"a"です。
JavaScript:
Copied!1 2 3 4 5 6 7 8 9 10
// div要素を作成 var el = document.createElement("div") // 作成したdiv要素のidに"display"を設定 el.id = "display" // 作成したdiv要素をbody要素の子要素として追加 document.body.appendChild(el); // SlateFunctionsから状態を取得 var x = SlateFunctions.getState(); // 作成したdiv要素の中に、"Code Sandbox widget: "と状態の値aを表示 el.innerHTML = "Code Sandbox widget: " + x.a;
インタラクション・アクション:
Copied!1 2 3
"a": "{{w_widget2.text}}", // w_widget2テキストの内容 "b": "random_state" // 乱数の状態 }
データの方向:Widget → Slate コンテキスト
SlateFunctions.setState
は、Handlebars を使用してこのウィジェットの状態を参照する外部ウィジェットと、将来の getState
呼び出しの両方のウィジェットの状態を変更します。引数は2つあり、状態の変更を行う部分を表す文字列と、その部分の新しい値を表す JSON ブロブです。
例えば、ウィジェットのビューの高さを4に設定したいが、他のすべてのプロパティはそのままにしたい場合は、SlateFunctions.setState("view.height", 4)
と呼び出します。全体の状態を上書きしたい(高さだけではない)場合は、最初の引数に"view.height"
の代わりに""を渡すことができます。
例
この例では、Code Sandbox ウィジェットで生成されたボタンを使用して、Slate の "HTMLウィジェット" の状態を "初期ウィジェット状態" から "更新されたウィジェット状態" に更新します。
SlateFunctions.setState
をトリガーします。これにより、"outval" の状態が "初期ウィジェット状態" から "変更されたウィジェット状態" に更新されます。JavaScript:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13
// ボタン1を作成 var button1 = document.createElement("button"); // ボタン1のテキストを設定 button1.innerHTML = "button1"; // ボタン1がクリックされたときの動作を設定 button1.onclick = () => { // SlateFunctionsを使って、ウィジェットの状態を更新 SlateFunctions.setState("outval", "Updated widget state"); }; // ボタン1をページに追加 document.body.appendChild(button1);
インタラクション状態:
Copied!1 2 3
{ "outval": "Initial Widget State" // "outval": "初期ウィジェットの状態" }
データの方向:ウィジェット → Slate コンテキスト
SlateFunctions.triggerEvent
はイベントをトリガーします。引数は2つあり、トリガーするイベントの名前とイベントの本文として渡されるメッセージです。
例
この例では、Code Sandbox ウィジェットがボタンのクリックによって操作されると、Slate Toast ウィジェットが Slate コンテキストで起動します。
launchToast.onclick
が実行され、これが SlateFunctions.triggerEvent
をトリガーします。JavaScript
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13
// "launchToast"という名前の新しいボタン要素を作成します var launchToast = document.createElement("button"); // ボタンのテキストを"launch toast"に設定します launchToast.innerHTML = "launch toast"; // ボタンがクリックされた時の動作を定義します launchToast.onclick = () => { // "toast"というイベントをトリガーします SlateFunctions.triggerEvent("toast"); }; // 作成したボタンをウェブページに追加します document.body.appendChild(launchToast);
インタラクション イベント:
Copied!1 2 3
[ "toast" // これは単純なJSON配列で、一つの文字列"toast"を含んでいます。 ]
新たなイベント登録:
イベント:Code_Sandbox_widget.custom.toast
アクション:Slate_widget.open
Code Sandbox ウィジェットは以下の順序でロードします:
このウィジェットのセキュリティモデルは、Slate の関数と非常に似ています。コードは、入力と出力が postMessage を使用して転送されるサンドボックス化された iframe 内で実行されます。これにより、信頼できない JavaScript コードを安全に実行できます。唯一の変更点は、iframe がページ上で可視化されていることで、セキュリティモデルに変更はありません。
Chrome コンソールでは、デフォルトでトップに設定されているドロップダウンを選択し、codeSandboxIframe.html を選択できます。これにより、コンソールに入力した JavaScript がウィジェットの環境で実行されます。JavaScript フィールドへの変更がウィジェットのリロードを強制するため、ウィジェットの動作方法を把握しようとしているときに便利です。
サードパーティのコードを使用するときは、以下の一般的なアプローチを推奨します:
SlateFunctions.getState
を使用して渡します。SlateFunctions.triggerEvent
を関数にタグ付けできます。SlateFunctions.onAction
を関数にタグ付けできます。以下のテーブルは、File Import ウィジェットで利用可能なプロパティについての使用詳細を提供します。
属性 | 説明 | タイプ | 必須 | 変更者 |
---|---|---|---|---|
buttonCssClasses | ブラウズボタンに適用する CSS クラス | string[] | はい | 直接編集 |
buttonText | ブラウズボタンのテキスト | string | はい | 直接編集 |
message | アップロードパネルに表示するメッセージ | string | はい | 直接編集 |
fileContent | ユーザーがインポートしたファイルの内容 | string | はい | ユーザーの操作 |
fileName | ユーザーがインポートしたファイルの名前 | string | はい | ユーザーの操作 |
fileType | ユーザーがインポートしたファイルの MIME タイプ | string | はい | ユーザーの操作 |
以下のテーブルは、iframe ウィジェットで利用可能なプロパティについての使用詳細を提供します。テーブルの後にはいくつかの例が続きます。
ワークスペースを介してロードされる何かを埋め込む場合、URL の末尾に ?embedded=true
を追加する必要があります
属性 | 説明 | タイプ | 必須 | 変更者 |
---|---|---|---|---|
uri | iframe の src URI | string | いいえ | 直接編集 |
アクション
アクション名 | 説明 |
---|---|
sendMessage | このアクションをトリガーすると、ウィジェットは { source: ‘slate-iframe-action’, message: {…} の形式で内部の iframe にメッセージを送信します。 |
イベント
イベント名 | 説明 |
---|---|
getMessage | ウィジェットの内部 iframe が Slate に { target: ‘slate-iframe-event’, message: {…} の形式でメッセージを投稿すると、このイベントがトリガーされます。 |