コンテンツへスキップ

UIオプション ​

Pivotick は、グラフの上に柔軟な UI レイヤーを提供し、ユーザーがノード、エッジ、キャンバスと対話する方法を制御できるようにします。 UI オプションを使用すると、次のことができます。

  • UI の全体的なモード (フル、ビューア、静的など) を構成します。
  • サイドバー とパネルをカスタマイズして、プロパティや追加情報を表示します。
  • オプションのカスタム レンダラーを使用して、ノードとエッジの tooltips を定義します。
  • ノード、エッジ、キャンバスのコンテキストメニューを設定します。
  • filter パネルのファセットを宣言するか、データから派生させます。
  • legend をキャンバスにドッキングします。これはフィルターとしても機能する色のキーで、宣言されたノード タイプによって色が説明されるときに単独で表示されます。
  • オンデマンドで取得したデータから、これらのサーフェス 非同期 のいずれかを埋めます。
  • 統合で使用しない機能をオフ にします。
  • ライブラリ独自のテキストをユーザーの言語に置き換えます。「UI の翻訳」を参照してください。

UIモード ​

mode オプションは、グラフ UI の全体的な動作と対話レベルを制御します。

  • full デフォルト: すべてのパネル、メニュー、およびインタラクションが有効になった完全な UI。
  • light: 重要なインタラクションが有効になっている最小限の UI。
  • viewer: UI パネルを表示せずに、グラフの移動 (パン、ズーム、ドラッグ) のみを許可します。
  • static: 静的グラフ、UI パネルやインタラクションなし。グラフは読み取り専用です。

Pivotick を画像スタイルで使用するには、次を使用します。

ts
const container = document.getElementById('graph-container')
const options = {
    UI: {  
        mode: 'viewer'
    },
}
const graph = Pivotick(container, options)

他の UI コンポーネントは、それぞれの名前空間を通じて構成できます。

ts
const options = {
    UI: { 
        sidebar: {},
        mainHeader: {},
        propertiesPanel: {},
        extraPanels: [],
        tooltip: {},
        contextMenu: {},
        filter: {},
    }
}

full モードのコントロールサーフェス ​

full モードでは、クロムはモード主導のレイアウトです: 左側の ** モード レール** (選択/作成/表示/物理)、アクティブなツール パネルコンテキスト ツール パネル ポインター モード、2 つの設定フライアウト — 表示 (キャンバスの背景とスイッチ) 物理 (レイアウト + シミュレーション) — トップバー (検索、フィルター、メモ、元に戻す/やり直し)、 選択範囲 サイドバー (プロパティ、ファセット、近傍、および一括アクション行)、および 右側のビューポートレール (フィットアンドセンター、ズーム、設定、フルスクリーン)、および ミニマップ は右下隅の空き領域にあり、折りたたまれます。 キャンバスが小さすぎてスペースに余裕がない場合 (UI.minimap: false ドロップする場合)。 light モードはサイドバーとミニマップを削除します。 viewer はビューポート レールのみを保持します。 static 裸のキャンバスです。

コーナークロームからの移行

フローティング GraphControls および GraphToolbar オーバーレイが削除されました。レイアウトと 物理学は物理学フライアウト (UIManager.physicsFlyout) に移動されました — これらは 1.5.0 のビュー フライアウト (UIManager.viewFlyout)。キャンバスの背景が保持されるようになりました。 そしてグリッドスイッチ。選択/作成ツールはツール パネル (UIManager.toolPanel) に表示され、 モードレール (UIManager.modeRail)。の UI.selectionMenu オプションはなくなりました。ノードごとのアクションには contextMenu を使用してください。 複数選択アクションのサイドバーの一括アクション行。 UIManager.graphNaviationは graphNavigationに名前変更されました。 UI.modeRail オプションとその無効化された Explore / Enrich スロットが削除されました — リアル モードを登録してください 代わりにaddRailMode。を参照してください。 CHANGELOG。

レールには 4 つのモードが組み込まれていますが、保持できるモードはそれだけではありません。プラグインによってそのモードが追加されます。 addRailMode を使用して、Explore または Enrich モードを使用して、 あなたの データが構築される意味を知っています。

機能をオフにする ​

UI モードは、グラフが取得するクロムの量を決定します。そのクロム内のすべての機能 一度に 1 つずつオフにすることもできます。これにより、統合によってその内容が削除されます。 バックエンドまたはそのユーザーは使用できません。

機能を無効にすると、その機能にアクセスするためのすべての操作手段がなくなります。ボタン、パネル、コンテキストメニューの項目、キーボードショートカットがまとめて無効になるため、クリックやキー操作をしても何も起こらない操作手段は残りません。

ts
const options = {
    UI: {
        mode: 'full',
        notes: { enabled: false },        
        history: { enabled: false },
        inspector: { enabled: false },
        editors: { deletion: { enabled: false } },
    },
}

スイッチ ​

オプションそれに付随するものは何ですか
UI.topBar.enabled上部のストリップ、予約された高さ、コントロールが所有するショートカット (Shift+J、Shift+K、Shift+N、Mod+Z)、および任意のホストアクション。下のスイッチを使用して 1 錠を落とし、残りを保管します。
UI.search.enabled検索ピル、そのノード ピッカー、および Shift+J。
UI.filter.enabledFilter Graph ピル、そのパネル、および Shift+K。 graph.queryEngine は引き続きコードからフィルターします。
UI.notes.enabledメモのピルとパネル、Shift+N、メモの追加ツール、キャンバス メニューのメモの追加、N、メモのコンテキスト メニュー、および noteManager.addNote (拒否)。
UI.history.enabled元に戻す/やり直しボタン、その履歴ドロップダウン、および Mod+Z / Mod+Shift+Z。 graph.history は録音を続けます。
UI.inspector.enabledノード メニューの [プロパティの検査] エントリと I。
UI.notifications.enabled乾杯。 graph.notifier.* は、undefined を返す no-op になります。
UI.sidebar.enabledサイドコラム全体とそれにかかる幅。
UI.propertiesPanel.enabledサイドバーのプロパティ パネルとそのセパレータ。
UI.neighborsPanel.enabledサイドバーの隣接パネルとそのセパレータ。
UI.viewFlyout.enabled[レールの表示] ボタンとそのパネル。
UI.physicsFlyout.enabled物理レール ボタンとそのパネル。
UI.tooltip.enabledホバーツールチップ、ピン留めされたツールチップが含まれます。 { nodes, edges, groups } または (element, kind) => boolean も使用できます。 ツールヒント を参照してください。
UI.contextMenu.enabledすべてのコンテキスト メニュー。
UI.navigation.enabledビューポート レール: フィット、ズーム、フルスクリーン。
UI.legend: falseキャンバスの凡例 (それ自体が派生するものを含む)。
UI.minimap: falseミニマップ。
UI.emptyState: false空のキャンバス に表示されるカード。
UI.table: falseデータドックとそのShift+T。
UI.pivotMode: falseピボット レール モード (登録されているもの)。

書き込みパス機能は UI.editors の下に同じスイッチがあるため、読み取り専用です。 統合により、すべてのクリックを拒否するのではなく、アフォーダンスが削除されます。 nodeCreator、edgeCreator、nodeEditor、edgeEditor、deletion。

レンダラーの動作は、render: zoomEnabled でオフになります (これにも時間がかかります) レールのズーム ボタン、フィットとセンターの維持)、dragEnabled、 selectionBox.enabled (マーキー ** および** 選択 ▸ なげなわツール)、 enableNodeExpansion (シェブロン、その Enter、および折りたたまれた破線) 概要)、enableFocusMode、 interactionEnabled ですべてを一度に行えます。 simulation.enabled レイアウトを停止します ランニングから。

作成モードはそのツールに従います

レールの作成モードには、ノードの追加、エッジの追加、注記の追加、編集の 4 つのツールが含まれています。 ノード。 4 つすべてのスイッチをオフにすると、モードは C ショートカットとともにレールから外れます。 空のパネルに開くのではなく。選択は常に残ります。

上部のバーにある自分のアクション ​

キャンバス全体に対するアクション (保存など) は、 元に戻す/やり直しグループ。 UI.topBar.actions は検索と同じスタイルで描かれた錠剤を宣言します。 フィルターとメモなので、これらのスタイルを変更するテーマはこれらもスタイル変更します。

ts
const options = {
    UI: {
        topBar: {
            actions: [{ 
                id: 'save-graph',
                text: () => storedId ? 'Update graph' : 'Save as graph',
                async onclick(_event, ctx) {
                    if (storedId) return updateGraph(storedId, ctx.graph)
                    const values = await ctx.promptData({
                        fields: [{ key: 'name', label: 'Name', type: 'text' }],
                    })
                    if (values) storedId = await createGraph(values.name, ctx.graph)
                },
                menu: () => storedId
                    ? [{ text: 'Save as new graph…', onclick: saveAsNew }]
                    : [],
            }],
        },
    },
}
  • Where. placement: 'end' (デフォルト) は、元に戻す/やり直しの直前にピルを配置します。 グループ。 'start'は左側の内蔵錠剤の後に置きます。錠剤は秩序を保つ で宣言されました。
  • その内容。 text、title、visible、enabled は、次の値または関数を取ります。 グラフ。関数はデータが変更されるたびに再度読み取られます。 graph.UIManager.refreshTopBar()、そしてonclickから返された約束が解決したら。 その約束が切れている間は錠剤が無効になるため、スロー セーブを 2 回開始することはできません。
  • 何を取得するか。 onclick(event, ctx) は、グラフと、 ライブラリのモーダル: ctx.promptData({ fields }) は値または null に解決されます。 キャンセルし、ctx.confirm({ body }) は確認ボタンでのみ true を解決します。 ctx.refresh() はすべてのアクションを再読み込みします。
  • キャレット。 menu を使用すると、錠剤は分割ボタンになります。ラベルは onclick と続き、 キャレットにより、コンテキスト メニュー と同じ行形式で行が開きます。 (サブメニューなし)。関数フォームは同じ ctx で渡され、毎回呼び出されます。 リフレッシュして開くたびに。行を返さない間、ピルにはキャレットがありません。逃げるか、 他の場所をクリックすると行が閉じます。
  • ショートカット。 shortcutは錠剤にバッジを描きます。これはラベルのみです。 自分を縛ること。

プラグインは ctx.addTopBarAction(action) で錠剤を追加し、ディスポーザーを返します (プラグインを参照)。錠剤はストリップに従っています: viewer または static にはありません モード、およびUI.topBar.enabled: false ではなし。

空のキャンバス ​

ノードもメモもないグラフでは、キャンバスの中央にカードが表示されるため、ソース 描画するものが何もない場合は、ロードに失敗したグラフとして読み取られません。 「何もありません」と表示されます キャンバスはまだです」、別の言い方をしない限り、次のようになります。

ts
const options = {
    UI: {
        emptyState: { 
            render: ({ initial, graph }) => {
                const box = document.createElement('div')
                box.textContent = initial ? 'Nothing is related to this record.' : 'The canvas is empty.'
                const button = document.createElement('button')
                button.textContent = 'Find related'
                button.onclick = () => graph.UIManager.openPivotMode()
                box.append(button)
                return box
            },
        },
    },
}

カードはデータに従います。ノードまたはメモを追加すると削除され、最後のノードまたはメモが削除されます。 手動で、または元の摂取を元に戻すことで、それらを元に戻します。ノード フィルタはまだカウントを非表示にします: グラフは空ではなく狭くなります。

render は、カードが表示されるたびに実行されます。カードが表示されるたびに実行されるわけではありません。 initial グラフがノードを保持するまでは true であるため、キャンバス全体を空にしたアナリストは、 空のソースで語られること以外のことを語られる。返された文字列は次のようにレンダリングされます プレーンテキストであり、render は以下のフックのように async になる場合があります。

カードはクロームの表面と枠線を使用しているので、テーマに沿っています。それは、 キャンバスのジェスチャを介してパン、ズーム、キャンバス メニューが機能します。 インタラクティブなコンテンツを除く: ボタン、リンク、フォーム コントロール、または tabindex は独自のクリックを取得します。 UI.emptyState: false には何も表示されません。

非同期コンテンツ ​

利用側が提供するコンテンツフックは、コンテンツそのものの代わりにPromiseを返せます。対象は、サイドバーのmainHeader.render、propertiesPanel.render / nodePropertiesMap / edgePropertiesMap、neighborsPanel.render、追加パネルのtitleとrender、ツールチップのrender、renderNodeExtra、renderEdgeExtraおよびプロパティマップ、そして空のキャンバスのrenderです。

これは、ノードのデータがレコードへの 参照 である場合に存在します。 レコード自体よりも、興味深いコンテンツは HTTP 呼び出しの背後にあります。

ts
const options = {
    UI: {
        tooltip: {
            renderNodeExtra: async (node, { signal }) => { 
                const res = await fetch(`/enrich/${node.getData().uuid}`, { signal })
                return renderChips(await res.json())       // an HTMLElement
            },
        },
    },
}

async を追加し、signal を転送すると、ライブラリが残りを処理します。

プレースホルダー約束が保留されている間、テーマのスケルトンがスロットを占めます。
スワップ解決時に、コンテンツがプレースホルダーを置き換えます。
古さスロットがなくなった後 (別のノードにカーソルを合わせ、選択を変更し、パネルを更新した後) に届く結果は、ドロップ です。解決順序に関係なく、サーフェスの最新のレンダリングのみをコミットできます。
キャンセルctx.signal はレンダリングが置き換えられるか、グラフが破棄されると中止されるため、転送された fetch はリークされるのではなくキャンセルされます。
失敗拒否された Promise は、スピナーを永久に残すのではなく、コンパクトなエラー行をレンダリングします。中止されたレンダリングは失敗ではなく、何も表示されません。

レンダーコンテキスト ​

すべてのコンテンツフックは RenderContext を受け取ります 最後の 引数として。既存の同期フックは単にそれを無視します。

ts
render: async (element, { signal, isStale }) => {
    const rows = await fetchRows(element, signal)
    if (isStale()) return ''            // cheap guard for non-abortable work
    return renderRows(rows)
}

プレースホルダーのカスタマイズ ​

UI.asyncContent は、保留中および失敗時に表示される内容をオーバーライドします。両方 文字列、HTMLElement、または曲面の関数を受け入れます。

ts
const options = {
    UI: {
        asyncContent: { 
            placeholder: (surface) => surface === 'tooltip' ? 'Loading…' : mySkeleton(),
            error: 'Could not load',
        },
    },
}

surface は、'tooltip'、'properties'、'neighbors'、'mainHeader'、のいずれかです。 'extraPanel' または 'emptyState'。

同期フックは変更されません

コンテンツを直接返すと、これまでとまったく同じように動作します。同じ呼び出し、同じです。 フレーム、プレースホルダーやラッパー要素はありません。既存のものについては何もありません 統合の変更。

非同期にできないもの

2 つのグループは意図的に同期を維持します。

  • HeaderMapEntry.title / subtitle 自動調整タイトル スロット * および* にフィードします ノード検索 (resolveNodeByName)、両方ともテキストが必要です。を使用してください ヘッダーで詳細を取得する必要がある場合は、async mainHeader.render を使用します。
  • PropertyEntry.name / value — 代わりに行をフェッチします: 非同期 nodePropertiesMap は一度解決してからプレーンなエントリを返します。 すべてのセルにスピナーを置くよりも。

フレームごとのレンダラー フック (render.renderNode、renderLabel、renderCluster) および NodeStyle.html) も同期専用です。これらは描画パス内で実行されます。 ノード、ティックごと。非同期ノード decoration が必要な場合は、ノードのデータにフェッチします そして同期レンダラーにそれを読み取らせます。