Create a JSON tree visualizer (#10579)

Inspired by
https://github.com/reduxjs/redux-devtools/tree/main/packages/react-json-tree

- Created a reusable JSON tree visualizer
- For now, the visualizer is only meant to render raw JSON. It can't
determine if a string is a UUID and display a specific icon.

**The visualizer is not rendered in the app. You must use Storybook to
review it.**

## Demo



https://github.com/user-attachments/assets/ffd4fc94-b33d-4481-9ac1-fa3a348b7c81
This commit is contained in:
Baptiste Devessier
2025-03-03 16:55:16 +01:00
committed by GitHub
parent 2325e0ae0f
commit 3d56e5394f
76 changed files with 817 additions and 31 deletions
@@ -570,6 +570,10 @@ msgstr "Maak toe"
msgid "Close command menu"
msgstr "Sluit opdragkieslys"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Kleurkode"
@@ -1265,6 +1269,10 @@ msgstr "Bestaande voorwerpe"
msgid "Exit Settings"
msgstr "Verlaat Instellings"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "إغلاق"
msgid "Close command menu"
msgstr "إغلاق قائمة الأوامر"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "رمز اللون"
@@ -1265,6 +1269,10 @@ msgstr "الكائنات الحالية"
msgid "Exit Settings"
msgstr "خروج من الإعدادات"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Tanca"
msgid "Close command menu"
msgstr "Tanca el menú de comandament"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Codi de colors"
@@ -1265,6 +1269,10 @@ msgstr "Objectes existents"
msgid "Exit Settings"
msgstr "Sortir de la configuració"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Zavřít"
msgid "Close command menu"
msgstr "Zavřít příkazové menu"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Barevný kód"
@@ -1265,6 +1269,10 @@ msgstr "Stávající objekty"
msgid "Exit Settings"
msgstr "Opustit nastavení"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Luk"
msgid "Close command menu"
msgstr "Luk kommandomenu"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Farvekode"
@@ -1265,6 +1269,10 @@ msgstr "Eksisterende objekter"
msgid "Exit Settings"
msgstr "Forlad indstillinger"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Schließen"
msgid "Close command menu"
msgstr "Befehlsmenü schließen"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Farbcode"
@@ -1265,6 +1269,10 @@ msgstr "Vorhandene Objekte"
msgid "Exit Settings"
msgstr "Einstellungen verlassen"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Κλείσιμο"
msgid "Close command menu"
msgstr "Κλείσιμο μενού εντολών"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Κωδικός χρώματος"
@@ -1265,6 +1269,10 @@ msgstr "Υπάρχοντα αντικείμενα"
msgid "Exit Settings"
msgstr "Έξοδος από Ρυθμίσεις"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
+8
View File
@@ -565,6 +565,10 @@ msgstr "Close"
msgid "Close command menu"
msgstr "Close command menu"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr "Collapse"
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Color code"
@@ -1260,6 +1264,10 @@ msgstr "Existing objects"
msgid "Exit Settings"
msgstr "Exit Settings"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr "Expand"
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Cerrar"
msgid "Close command menu"
msgstr "Cerrar menú de comandos"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Código de color"
@@ -1265,6 +1269,10 @@ msgstr "Objetos existentes"
msgid "Exit Settings"
msgstr "Salir de Configuración"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Sulje"
msgid "Close command menu"
msgstr "Sulje komento-valikko"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Värikoodi"
@@ -1265,6 +1269,10 @@ msgstr "Olemassa olevat objektit"
msgid "Exit Settings"
msgstr "Poistu asetuksista"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Fermer"
msgid "Close command menu"
msgstr "Fermer le menu de commande"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Code couleur"
@@ -1265,6 +1269,10 @@ msgstr "Objets existants"
msgid "Exit Settings"
msgstr "Quitter les paramètres"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -570,6 +570,10 @@ msgstr "סגור"
msgid "Close command menu"
msgstr "סגור תפריט פקודות"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "קוד צבע"
@@ -1265,6 +1269,10 @@ msgstr "אובייקטים קיימים"
msgid "Exit Settings"
msgstr "יציאה מהגדרות"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Bezár"
msgid "Close command menu"
msgstr "Parancsmenü bezárása"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Színekód"
@@ -1265,6 +1269,10 @@ msgstr "Meglévő objektumok"
msgid "Exit Settings"
msgstr "Kilépés a beállításokból"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Chiudi"
msgid "Close command menu"
msgstr "Chiudi il menu comandi"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Codice colore"
@@ -1265,6 +1269,10 @@ msgstr "Oggetti esistenti"
msgid "Exit Settings"
msgstr "Esci dalle impostazioni"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "閉じる"
msgid "Close command menu"
msgstr "コマンドメニューを閉じる"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "色のコード"
@@ -1265,6 +1269,10 @@ msgstr "既存のオブジェクト"
msgid "Exit Settings"
msgstr "設定を終了"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "닫기"
msgid "Close command menu"
msgstr "명령 메뉴 닫기"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "색상 코드"
@@ -1265,6 +1269,10 @@ msgstr "기존 개체"
msgid "Exit Settings"
msgstr "설정 종료"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Sluiten"
msgid "Close command menu"
msgstr "Sluit opdrachtmenu"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Kleurcode"
@@ -1265,6 +1269,10 @@ msgstr "Bestaande objecten"
msgid "Exit Settings"
msgstr "Verlaat instellingen"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Lukk"
msgid "Close command menu"
msgstr "Lukk kommandomeny"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Fargekode"
@@ -1265,6 +1269,10 @@ msgstr "Eksisterende objekter"
msgid "Exit Settings"
msgstr "Avslutt innstillinger"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Zamknij"
msgid "Close command menu"
msgstr "Zamknij menu poleceń"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Kod koloru"
@@ -1265,6 +1269,10 @@ msgstr "Istniejące obiekty"
msgid "Exit Settings"
msgstr "Wyjdź z ustawień"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -565,6 +565,10 @@ msgstr ""
msgid "Close command menu"
msgstr ""
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr ""
@@ -1260,6 +1264,10 @@ msgstr ""
msgid "Exit Settings"
msgstr ""
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr ""
@@ -570,6 +570,10 @@ msgstr "Fechar"
msgid "Close command menu"
msgstr "Fechar menu de comandos"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Código de cor"
@@ -1265,6 +1269,10 @@ msgstr "Objetos existentes"
msgid "Exit Settings"
msgstr "Sair das Configurações"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Fechar"
msgid "Close command menu"
msgstr "Fechar menu de comandos"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Código de cor"
@@ -1265,6 +1269,10 @@ msgstr "Objetos existentes"
msgid "Exit Settings"
msgstr "Sair das Definições"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Închide"
msgid "Close command menu"
msgstr "Închide meniul de comandă"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Cod culoare"
@@ -1265,6 +1269,10 @@ msgstr "Obiecte existente"
msgid "Exit Settings"
msgstr "Ieșire din Setări"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
Binary file not shown.
@@ -570,6 +570,10 @@ msgstr "Затвори"
msgid "Close command menu"
msgstr "Затвори мени команди"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Шифра боје"
@@ -1265,6 +1269,10 @@ msgstr "Постојећи објекти"
msgid "Exit Settings"
msgstr "Изађи из подешавања"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Stäng"
msgid "Close command menu"
msgstr "Stäng kommandomenyn"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Färgkod"
@@ -1265,6 +1269,10 @@ msgstr "Befintliga objekt"
msgid "Exit Settings"
msgstr "Avsluta inställningar"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Kapat"
msgid "Close command menu"
msgstr "Komut menüsünü kapat"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Renk kodu"
@@ -1265,6 +1269,10 @@ msgstr "Mevcut nesneler"
msgid "Exit Settings"
msgstr "Ayarları Kapat"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Закрити"
msgid "Close command menu"
msgstr "Закрити командне меню"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Код кольору"
@@ -1321,6 +1325,10 @@ msgstr "Існуючі об'єкти"
msgid "Exit Settings"
msgstr "Вийти з налаштувань"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "Đóng"
msgid "Close command menu"
msgstr "Đóng menu lệnh"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "Mã màu"
@@ -1265,6 +1269,10 @@ msgstr "\"Đối tượng hiện hữu\""
msgid "Exit Settings"
msgstr "\"Thoát Cài đặt\""
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "关闭"
msgid "Close command menu"
msgstr "关闭命令菜单"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "颜色代码"
@@ -1265,6 +1269,10 @@ msgstr "现有对象"
msgid "Exit Settings"
msgstr "退出设置"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -570,6 +570,10 @@ msgstr "關閉"
msgid "Close command menu"
msgstr "關閉指令選單"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Collapse"
msgstr ""
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Color code"
msgstr "顏色代碼"
@@ -1265,6 +1269,10 @@ msgstr "現有對象"
msgid "Exit Settings"
msgstr "退出設置"
#: src/modules/workflow/components/json-visualizer/components/internal/JsonArrow.tsx
msgid "Expand"
msgstr ""
#: src/modules/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect.tsx
#~ msgid "Expected selected node to be a create step node."
#~ msgstr "Expected selected node to be a create step node."
@@ -0,0 +1,189 @@
import { JsonTree } from '@/workflow/components/json-visualizer/components/JsonTree';
import { Meta, StoryObj } from '@storybook/react';
import {
expect,
userEvent,
waitForElementToBeRemoved,
within,
} from '@storybook/test';
import { ComponentDecorator } from 'twenty-ui';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
const meta: Meta<typeof JsonTree> = {
title: 'Modules/Workflow/JsonVisualizer/JsonTree',
component: JsonTree,
args: {},
argTypes: {},
decorators: [ComponentDecorator, I18nFrontDecorator],
};
export default meta;
type Story = StoryObj<typeof JsonTree>;
export const String: Story = {
args: {
value: 'Hello',
},
};
export const Number: Story = {
args: {
value: 42,
},
};
export const Boolean: Story = {
args: {
value: true,
},
};
export const Null: Story = {
args: {
value: null,
},
};
export const ArraySimple: Story = {
args: {
value: [1, 2, 3],
},
};
export const ArrayNested: Story = {
args: {
value: [1, 2, ['a', 'b', 'c'], 3],
},
};
export const ArrayWithObjects: Story = {
args: {
value: [
{
name: 'John Doe',
age: 30,
},
{
name: 'John Dowl',
age: 42,
},
],
},
};
export const ObjectSimple: Story = {
args: {
value: {
name: 'John Doe',
age: 30,
},
},
};
export const ObjectNested: Story = {
args: {
value: {
person: {
name: 'John Doe',
address: {
street: '123 Main St',
city: 'New York',
},
},
isActive: true,
},
},
};
export const ObjectWithArray: Story = {
args: {
value: {
users: [
{ id: 1, name: 'John' },
{ id: 2, name: 'Jane' },
],
settings: {
theme: 'dark',
notifications: true,
},
},
},
};
export const NestedElementCanBeCollapsed: Story = {
args: {
value: {
person: {
name: 'John Doe',
age: 12,
},
isActive: true,
},
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
const toggleButton = await canvas.findByRole('button', {
name: 'Collapse',
});
const ageElement = canvas.getByText('age');
await Promise.all([
waitForElementToBeRemoved(ageElement),
userEvent.click(toggleButton),
]);
expect(toggleButton).toHaveTextContent('Expand');
},
};
export const ExpandingElementExpandsAllItsDescendants: Story = {
args: {
value: {
person: {
name: 'John Doe',
address: {
street: '123 Main St',
city: 'New York',
country: {
name: 'USA',
code: 'US',
},
},
},
isActive: true,
},
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
{
const allCollapseButtons = await canvas.findAllByRole('button', {
name: 'Collapse',
});
expect(allCollapseButtons).toHaveLength(3);
for (const collapseButton of allCollapseButtons.reverse()) {
await userEvent.click(collapseButton);
}
}
const rootExpandButton = await canvas.findByRole('button', {
name: 'Expand',
});
await userEvent.click(rootExpandButton);
{
const allCollapseButtons = await canvas.findAllByRole('button', {
name: 'Collapse',
});
expect(allCollapseButtons).toHaveLength(3);
}
},
};
@@ -0,0 +1,25 @@
import { JsonNestedNode } from '@/workflow/components/json-visualizer/components/JsonNestedNode';
import { IconBrackets } from 'twenty-ui';
import { JsonArray } from 'type-fest';
export const JsonArrayNode = ({
label,
value,
depth,
}: {
label?: string;
value: JsonArray;
depth: number;
}) => {
return (
<JsonNestedNode
elements={[...value.entries()].map(([key, value]) => ({
key: String(key),
value,
}))}
label={label}
Icon={IconBrackets}
depth={depth}
/>
);
};
@@ -0,0 +1,65 @@
import { JsonArrow } from '@/workflow/components/json-visualizer/components/internal/JsonArrow';
import { JsonList } from '@/workflow/components/json-visualizer/components/internal/JsonList';
import { JsonNodeLabel } from '@/workflow/components/json-visualizer/components/internal/JsonNodeLabel';
import { JsonNode } from '@/workflow/components/json-visualizer/components/JsonNode';
import styled from '@emotion/styled';
import { useState } from 'react';
import { isDefined } from 'twenty-shared';
import { IconComponent } from 'twenty-ui';
import { JsonValue } from 'type-fest';
const StyledContainer = styled.li`
list-style-type: none;
display: grid;
row-gap: ${({ theme }) => theme.spacing(2)};
`;
const StyledLabelContainer = styled.div`
display: flex;
align-items: center;
gap: ${({ theme }) => theme.spacing(2)};
`;
export const JsonNestedNode = ({
label,
Icon,
elements,
depth,
}: {
label?: string;
Icon: IconComponent;
elements: Array<{ key: string; value: JsonValue }>;
depth: number;
}) => {
const hideRoot = !isDefined(label);
const [isOpen, setIsOpen] = useState(true);
const renderedChildren = (
<JsonList depth={depth}>
{elements.map(({ key, value }) => (
<JsonNode key={key} label={key} value={value} depth={depth + 1} />
))}
</JsonList>
);
const handleArrowClick = () => {
setIsOpen(!isOpen);
};
if (hideRoot) {
return <StyledContainer>{renderedChildren}</StyledContainer>;
}
return (
<StyledContainer>
<StyledLabelContainer>
<JsonArrow isOpen={isOpen} onClick={handleArrowClick} />
<JsonNodeLabel label={label} Icon={Icon} />
</StyledLabelContainer>
{isOpen && renderedChildren}
</StyledContainer>
);
};
@@ -0,0 +1,68 @@
import { JsonArrayNode } from '@/workflow/components/json-visualizer/components/JsonArrayNode';
import { JsonObjectNode } from '@/workflow/components/json-visualizer/components/JsonObjectNode';
import { JsonValueNode } from '@/workflow/components/json-visualizer/components/JsonValueNode';
import { isArray } from '@/workflow/components/json-visualizer/utils/isArray';
import { isBoolean, isNull, isNumber, isString } from '@sniptt/guards';
import {
IconCheckbox,
IconCircleOff,
IconNumber9,
IconTypography,
} from 'twenty-ui';
import { JsonValue } from 'type-fest';
export const JsonNode = ({
label,
value,
depth,
}: {
label?: string;
value: JsonValue;
depth: number;
}) => {
if (isNull(value)) {
return (
<JsonValueNode
label={label}
valueAsString="[null]"
Icon={IconCircleOff}
/>
);
}
if (isString(value)) {
return (
<JsonValueNode
label={label}
valueAsString={value}
Icon={IconTypography}
/>
);
}
if (isNumber(value)) {
return (
<JsonValueNode
label={label}
valueAsString={String(value)}
Icon={IconNumber9}
/>
);
}
if (isBoolean(value)) {
return (
<JsonValueNode
label={label}
valueAsString={String(value)}
Icon={IconCheckbox}
/>
);
}
if (isArray(value)) {
return <JsonArrayNode label={label} value={value} depth={depth} />;
}
return <JsonObjectNode label={label} value={value} depth={depth} />;
};
@@ -0,0 +1,25 @@
import { JsonNestedNode } from '@/workflow/components/json-visualizer/components/JsonNestedNode';
import { IconCube } from 'twenty-ui';
import { JsonObject } from 'type-fest';
export const JsonObjectNode = ({
label,
value,
depth,
}: {
label?: string;
value: JsonObject;
depth: number;
}) => {
return (
<JsonNestedNode
elements={Object.entries(value).map(([key, value]) => ({
key,
value,
}))}
label={label}
Icon={IconCube}
depth={depth}
/>
);
};
@@ -0,0 +1,11 @@
import { JsonList } from '@/workflow/components/json-visualizer/components/internal/JsonList';
import { JsonNode } from '@/workflow/components/json-visualizer/components/JsonNode';
import { JsonValue } from 'type-fest';
export const JsonTree = ({ value }: { value: JsonValue }) => {
return (
<JsonList depth={0}>
<JsonNode value={value} depth={0} />
</JsonList>
);
};
@@ -0,0 +1,32 @@
import { JsonListItem } from '@/workflow/components/json-visualizer/components/internal/JsonListItem';
import { JsonNodeLabel } from '@/workflow/components/json-visualizer/components/internal/JsonNodeLabel';
import { JsonNodeValue } from '@/workflow/components/json-visualizer/components/internal/JsonNodeValue';
import styled from '@emotion/styled';
import { IconComponent } from 'twenty-ui';
const StyledListItem = styled(JsonListItem)`
column-gap: ${({ theme }) => theme.spacing(2)};
`;
type JsonValueNodeProps = {
valueAsString: string;
} & (
| {
label: string;
Icon: IconComponent;
}
| {
label?: never;
Icon?: unknown;
}
);
export const JsonValueNode = (props: JsonValueNodeProps) => {
return (
<StyledListItem>
{props.label && <JsonNodeLabel label={props.label} Icon={props.Icon} />}
<JsonNodeValue valueAsString={props.valueAsString} />
</StyledListItem>
);
};
@@ -0,0 +1,48 @@
import { useTheme } from '@emotion/react';
import styled from '@emotion/styled';
import { useLingui } from '@lingui/react/macro';
import { motion } from 'framer-motion';
import { IconChevronDown, VisibilityHidden } from 'twenty-ui';
const StyledButton = styled(motion.button)`
align-items: center;
border-color: ${({ theme }) => theme.border.color.medium};
border-radius: ${({ theme }) => theme.border.radius.sm};
border-style: solid;
border-width: 1px;
display: flex;
justify-content: center;
padding-inline: ${({ theme }) => theme.spacing(1)};
background-color: ${({ theme }) => theme.background.transparent.lighter};
height: 24px;
width: 24px;
box-sizing: border-box;
cursor: pointer;
`;
const MotionIconChevronDown = motion(IconChevronDown);
export const JsonArrow = ({
isOpen,
onClick,
}: {
isOpen: boolean;
onClick: () => void;
}) => {
const { t } = useLingui();
const theme = useTheme();
return (
<StyledButton onClick={onClick}>
<VisibilityHidden>{isOpen ? t`Collapse` : t`Expand`}</VisibilityHidden>
<MotionIconChevronDown
size={theme.icon.size.md}
color={theme.font.color.secondary}
initial={false}
animate={{ rotate: isOpen ? -180 : 0 }}
/>
</StyledButton>
);
};
@@ -0,0 +1,18 @@
import { css } from '@emotion/react';
import styled from '@emotion/styled';
const StyledList = styled.ul<{ depth: number }>`
margin: 0;
padding: 0;
display: grid;
row-gap: ${({ theme }) => theme.spacing(2)};
${({ theme, depth }) =>
depth > 0 &&
css`
padding-left: ${theme.spacing(8)};
`}
`;
export { StyledList as JsonList };
@@ -0,0 +1,9 @@
import styled from '@emotion/styled';
const StyledListItem = styled.li`
align-items: center;
display: flex;
list-style-type: none;
`;
export { StyledListItem as JsonListItem };
@@ -0,0 +1,39 @@
import { useTheme } from '@emotion/react';
import styled from '@emotion/styled';
import { IconComponent } from 'twenty-ui';
const StyledLabelContainer = styled.span`
align-items: center;
background-color: ${({ theme }) => theme.background.transparent.lighter};
border-color: ${({ theme }) => theme.border.color.medium};
border-radius: ${({ theme }) => theme.border.radius.sm};
border-style: solid;
border-width: 1px;
height: 24px;
box-sizing: border-box;
column-gap: ${({ theme }) => theme.spacing(2)};
display: flex;
font-variant-numeric: tabular-nums;
justify-content: center;
padding-block: ${({ theme }) => theme.spacing(1)};
padding-inline: ${({ theme }) => theme.spacing(2)};
width: fit-content;
`;
export const JsonNodeLabel = ({
label,
Icon,
}: {
label: string;
Icon: IconComponent;
}) => {
const theme = useTheme();
return (
<StyledLabelContainer>
<Icon size={theme.icon.size.md} color={theme.font.color.tertiary} />
<span>{label}</span>
</StyledLabelContainer>
);
};
@@ -0,0 +1,9 @@
import styled from '@emotion/styled';
const StyledText = styled.span`
color: ${({ theme }) => theme.font.color.tertiary};
`;
export const JsonNodeValue = ({ valueAsString }: { valueAsString: string }) => {
return <StyledText>{valueAsString}</StyledText>;
};
@@ -0,0 +1,5 @@
import { isArray as _isArray } from '@sniptt/guards';
export const isArray = (
value: unknown,
): value is unknown[] | readonly unknown[] => _isArray(value);
@@ -23,6 +23,7 @@ export {
IconBookmark,
IconBookmarkPlus,
IconBox,
IconBrackets,
IconBracketsContain,
IconBrandGithub,
IconBrandGoogle,
@@ -59,6 +60,8 @@ export {
IconCoins,
IconColorSwatch,
IconMessageCircle as IconComment,
IconCube,
IconTypography,
IconCopy,
IconCreativeCommonsSa,
IconCreditCard,