Directives UI pour Datagrok

VérifiéSûr

Règles et bonnes pratiques pour créer des composants UI Datagrok en TypeScript : onglets paresseux, grilles, layouts, dialogues et menus contextuels.

Spar Skills Guide Bot
DeveloppementIntermédiaire
0018/10/2026
Claude Code
#datagrok#ui#typescript#drag-and-drop#performance

Recommandé pour

Notre avis

Un guide de conventions pour construire des interfaces en TypeScript dans Datagrok : onglets, grilles, layouts, dialogues, menus à bascules et glisser-déposer.

Points forts

  • Impose le chargement paresseux via des callbacks getContent pour les tabControls et accordéons, ce qui évite de construire des composants coûteux inutilement
  • Donne des exemples de code corrects et incorrects côte à côte, faciles à imiter
  • Couvre des choix d'API précis (DG.Viewer.grid vs DG.TableView.create, ui.splitH/divV, menu.items avec isChecked)
  • Inclut des consignes de performance concrètes (debounce, rendu canvas, mise à jour sur place)

Limites

  • Très spécifique à l'écosystème Datagrok et à son API js-api : inutile hors de ce framework
  • Le document est tronqué (section « Common Anti-Patterns » incomplète) et ne fournit donc pas la liste complète des pièges
  • Suppose une bonne connaissance préalable des classes DG (Viewer, JsViewer, Menu) sans les expliquer
Quand l'utiliser

À utiliser dès qu'on crée ou modifie un composant d'interface, un viewer, un dialogue ou une zone de glisser-déposer dans un package Datagrok en TypeScript.

Quand l'éviter

À éviter pour des projets front-end hors Datagrok ou lorsqu'on a besoin de documentation complète sur les anti-patterns, absente ici.

Analyse de sécurité

Sûr
Score qualité93/100

This skill provides static coding guidelines and patterns for building UI in Datagrok. It does not instruct any execution of commands, file operations, network requests, or data exfiltration. It is purely educational content about TypeScript UI development.

Aucun point d'attention détecté

Exemples

Lazy tab control
Refactor this Datagrok tab control so each pane builds its grid lazily with addPane and a getContent callback instead of eagerly creating every viewer.
Grid inside a split layout
Build a tree plus content split panel in Datagrok with ui.splitH, embedding the selected DataFrame using DG.Viewer.grid rather than opening a full TableView.
Toggle settings popup
Create a DG.Menu.popup with Debug and Benchmark toggles that use menu.items with isChecked and closeOnClick = false, instead of prefixing labels with a checkmark.
Drop zone for browse-tree entities
Add a droppable panel to my Datagrok viewer using ui.makeDroppable with acceptDrop and doDrop handlers so users can drag tables from the browse tree onto it.

name: ui description: UI building guidelines for Datagrok TypeScript components, viewers, and drag-and-drop when-to-use: When creating or modifying UI components, viewers, dialogs, file viewers, layouts, grids, or drag-and-drop effort: low

Datagrok UI Building Guidelines

Rules and patterns for building UI in TypeScript packages and libraries. These are authoritative — follow them unless the user explicitly overrides.

Tab Controls

  • Always use addPane with a lazy getContent callback — never pass pre-built elements
  • This avoids creating heavy components (grids, viewers, DataFrames) for tabs the user may never open
// Good
const tabs = ui.tabControl();
tabs.addPane('Sheet 1', () => {
  const df = buildDataFrame();
  const grid = DG.Viewer.grid(df);
  return grid.root;
});

// Bad — all tabs built eagerly
const tabs = ui.tabControl({
  'Sheet 1': buildExpensiveGrid(),
  'Sheet 2': buildExpensiveGrid(),
});

Grids and Viewers

  • Prefer DG.Viewer.grid(df) for embedding a grid inside a composite layout
  • Prefer DG.TableView.create(df, false) when the grid IS the entire view
  • The second argument (false) prevents the table from being added to the workspace

Layouts

  • Use ui.splitH / ui.splitV for resizable split panels
  • Use ui.divV / ui.divH for simple stacking without resize handles
  • Set flex: 1 on the element that should fill remaining space
  • For tree + content layouts, use ui.splitH([tree.root, contentPanel])

Dialogs and Inputs

  • Use ui.dialog() for modal interactions
  • Use ui.input.choice(), ui.input.int(), ui.input.bool(), etc. for typed inputs - full set of input functions is in js-api/ui.ts. Prefer onValueChanged in the options object over .onChanged.subscribe():
  ui.input.bool('Debug', {value: DG.Test.isInDebug, onValueChanged: (v) => DG.Test.isInDebug = v});

Use ui.form([...inputs]) to render a labeled list of inputs inside a dialog

  • For property panels, prefer DG.JsViewer properties (this.string(...), this.int(...)) which automatically appear in the context panel

Toggle Settings in Popup Menus

For toggleable settings in a DG.Menu.popup(), use menu.items() with isChecked — never use text-prefix hacks like `${flag ? '✓ ' : ''}Label`:

const toggles = [
  {label: 'Debug', get: () => DG.Test.isInDebug, set: (v: boolean) => { DG.Test.isInDebug = v; }},
  {label: 'Benchmark', get: () => DG.Test.isInBenchmark, set: (v: boolean) => { DG.Test.isInBenchmark = v; }},
];
const menu = DG.Menu.popup();
menu.closeOnClick = false;
const refresh = () => {
  menu.clear();
  menu.items(toggles, (t) => { t.set(!t.get()); refresh(); }, {isChecked: (t) => t.get()});
};
refresh();
menu.show();

Performance

  • Debounce resize and selection handlers: DG.debounce(observable, 50)
  • For large datasets, prefer canvas-based rendering over DOM elements
  • Avoid re-creating viewers on every data change — update in place when possible

Accordion

  • Use ui.accordion() with lazy getContent callbacks (same principle as tab controls)
const acc = ui.accordion();
acc.addPane('Details', () => buildDetailsPanel());
acc.addPane('Statistics', () => buildStatsPanel());

Drag and Drop

  • ui.makeDroppable(el, IDragAndDropOptions<T>) — receive entities dragged from the browse tree, grid, or other sources.
    • acceptDrop(obj) — fast predicate for showing the zone.
    • doDrop(args) — handle the drop. args is a DragDropArgs<T> with dragObject, dragSource, dragObjectType, copying (Ctrl/Cmd), link (Alt), handled.
    • Rich hooks: acceptDrag, onBeginDrag, onEndDrag, onMouseEnter/Over/Leave/Out, dropSuggestion, makeDropZone, dropZoneRectTransformation, dropIndication.
  • ui.makeDraggable(el, {getDragObject, getDragCaption}) — make your own UI a drag source.
  • Sample: ApiSamples/scripts/ui/interactivity/drag-and-drop.js.

Common Anti-Patterns

  • Do not use raw document.createElement when ui.* helpers exist
  • Do not set innerHTML with user data — use ui.divText() or textContent
  • Do not use style.width = '100%' on tables — let them size to content
  • Do not build all content eagerly in multi-pane layouts (tabs, accordions)
Skills similaires