gloomberb 0.18.2 → 0.18.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -8
- package/README.zh-CN.md +11 -11
- package/bin/{gloomberb → gloom} +3 -1
- package/package.json +6 -2
- package/patches/electrobun@1.18.1.patch +106 -5
- package/src/account/checkout-handoff.tsx +225 -0
- package/src/account/device-signin-dialog.tsx +2 -2
- package/src/account/device-signin.ts +2 -2
- package/src/account/upgrade-dialog.tsx +1 -1
- package/src/api-client/askg.ts +2 -2
- package/src/api-client/auth.ts +2 -2
- package/src/api-client/central-bank-rates.ts +6 -0
- package/src/api-client/collections.ts +5 -1
- package/src/api-client/cot.ts +2 -0
- package/src/api-client/crypto-etf-flows.ts +37 -0
- package/src/api-client/crypto-markets.ts +60 -0
- package/src/api-client/data.ts +99 -5
- package/src/api-client/doe.ts +15 -0
- package/src/api-client/equity-screener.ts +28 -0
- package/src/api-client/exchange-announcements.ts +38 -0
- package/src/api-client/fund-facts.ts +39 -0
- package/src/api-client/futures-curve.ts +9 -1
- package/src/api-client/hiring.ts +301 -0
- package/src/api-client/index.ts +24 -5
- package/src/api-client/market-discovery.ts +14 -0
- package/src/api-client/members.ts +6 -0
- package/src/api-client/mna.ts +6 -0
- package/src/api-client/paths.ts +18 -1
- package/src/api-client/request.ts +26 -7
- package/src/api-client/short-side-publications.ts +37 -0
- package/src/api-client/socket.ts +64 -4
- package/src/api-client/swap-curve.ts +35 -0
- package/src/api-client/telemetry.ts +17 -0
- package/src/api-client/themes.ts +7 -1
- package/src/api-client/types.ts +90 -2
- package/src/app/global-shortcuts.ts +1 -16
- package/src/app/pane-runtime/plugin-bindings.ts +9 -2
- package/src/app/runtime/desktop-deeplink.ts +5 -5
- package/src/app/runtime/plugin-bindings.ts +2 -2
- package/src/app/runtime/startup.ts +13 -0
- package/src/app/runtime/update.ts +28 -8
- package/src/app/star-prompt/status-line.tsx +2 -2
- package/src/architecture/core-builtin-allowlist.json +5 -2
- package/src/architecture/pane-tabs-allowlist.json +65 -0
- package/src/architecture/ui-literals-allowlist.json +3 -3
- package/src/architecture/ui-tokens-allowlist.json +1 -1
- package/src/brokers/broker-portfolio-sync.ts +37 -0
- package/src/brokers/directory.ts +11 -0
- package/src/brokers/logos.ts +3 -1
- package/src/brokers/signed-in/adapter.ts +304 -26
- package/src/brokers/signed-in/client.ts +14 -2
- package/src/brokers/signed-in/connect.ts +10 -2
- package/src/brokers/sync-broker-instance.ts +9 -1
- package/src/capabilities/chart-series.ts +22 -6
- package/src/cli/bank-section.ts +1 -1
- package/src/cli/base-converter.ts +23 -14
- package/src/cli/central-bank-events.ts +1 -1
- package/src/cli/command-options.ts +59 -4
- package/src/cli/commands/api.ts +9 -6
- package/src/cli/commands/broker.ts +2 -2
- package/src/cli/commands/command-utils.ts +2 -2
- package/src/cli/commands/crypto-hints.ts +7 -20
- package/src/cli/commands/fred-series.ts +4 -2
- package/src/cli/commands/keybindings.ts +2 -2
- package/src/cli/commands/market.ts +1189 -296
- package/src/cli/commands/news-hints.ts +2 -2
- package/src/cli/commands/news-search.ts +59 -6
- package/src/cli/commands/options-leaps.ts +41 -26
- package/src/cli/commands/overview.ts +121 -48
- package/src/cli/commands/plugins.ts +9 -9
- package/src/cli/commands/remote.ts +13 -10
- package/src/cli/commands/search.ts +64 -44
- package/src/cli/commands/system.ts +27 -19
- package/src/cli/commands/themes.ts +1 -1
- package/src/cli/commands/ticker.ts +272 -70
- package/src/cli/context.ts +3 -2
- package/src/cli/desktop-pane-shot-view.ts +2 -2
- package/src/cli/desktop-pane-shot.ts +1 -1
- package/src/cli/earnings-calendar.ts +4 -4
- package/src/cli/entry.ts +18 -1
- package/src/cli/errors.ts +20 -2
- package/src/cli/exit-codes.ts +1 -1
- package/src/cli/export-source.ts +10 -4
- package/src/cli/freshness.ts +2 -8
- package/src/cli/fx-forward.ts +130 -0
- package/src/cli/fx-pair.ts +10 -9
- package/src/cli/glossary.ts +64 -20
- package/src/cli/help.ts +20 -14
- package/src/cli/history-export.ts +126 -0
- package/src/cli/history-rows.ts +196 -43
- package/src/cli/index-roots.ts +5 -45
- package/src/cli/index.ts +32 -18
- package/src/cli/issuer-membership.ts +103 -0
- package/src/cli/known-gaps.ts +118 -25
- package/src/cli/listing-arg.ts +315 -43
- package/src/cli/name-entries.ts +73 -22
- package/src/cli/native-smoke.ts +2 -0
- package/src/cli/not-a-ticker.ts +19 -9
- package/src/cli/opentui-libc.ts +5 -0
- package/src/cli/options.ts +12 -0
- package/src/cli/pane-functions/capabilities.ts +77 -20
- package/src/cli/pane-functions/catalog.ts +40 -23
- package/src/cli/pane-functions/discovery.ts +1 -1
- package/src/cli/pane-functions/dom.ts +12 -8
- package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
- package/src/cli/pane-functions/freshness.ts +174 -23
- package/src/cli/pane-functions/function-help.ts +66 -27
- package/src/cli/pane-functions/headless.ts +48 -16
- package/src/cli/pane-functions/index.ts +82 -21
- package/src/cli/pane-functions/options.ts +22 -2
- package/src/cli/pane-functions/report-notices.ts +12 -4
- package/src/cli/pane-functions/report.ts +5 -5
- package/src/cli/pane-functions/resolver.ts +65 -14
- package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
- package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
- package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
- package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
- package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
- package/src/cli/pane-functions/screenshot-payload.ts +453 -0
- package/src/cli/pane-functions/screenshot-render.ts +316 -0
- package/src/cli/pane-functions/screenshot-types.ts +162 -0
- package/src/cli/pane-functions/shot-options.ts +8 -3
- package/src/cli/peso-dollar-rates.ts +79 -0
- package/src/cli/quote-answer.ts +38 -3
- package/src/cli/report-tables.ts +190 -27
- package/src/cli/restore-plugins.ts +29 -14
- package/src/cli/result.ts +122 -25
- package/src/cli/series-search.ts +5 -5
- package/src/cli/statement-filings.ts +19 -0
- package/src/cli/suffixed-listing-rows.ts +49 -0
- package/src/cli/symbol-args.ts +50 -15
- package/src/cli/symbol-cells.ts +120 -0
- package/src/cli/symbol-list.ts +226 -60
- package/src/cli/symbol-rows.ts +131 -25
- package/src/cli/ticker-resolution.ts +108 -11
- package/src/cli/treasury-yields.ts +5 -5
- package/src/cli/types.ts +2 -0
- package/src/cli/uncovered-instrument.ts +3 -3
- package/src/cli/unknown-command.ts +6 -6
- package/src/components/chart/composite/chart-layout.ts +131 -0
- package/src/components/chart/composite/composite-chart.tsx +387 -21
- package/src/components/chart/composite/drawing-store.ts +26 -6
- package/src/components/chart/composite/interactions.ts +9 -3
- package/src/components/chart/composite/legend.tsx +75 -3
- package/src/components/chart/composite/levels.ts +5 -0
- package/src/components/chart/composite/panel-gestures.ts +41 -0
- package/src/components/chart/composite/panel-labels.ts +2 -1
- package/src/components/chart/composite/panel-surface.tsx +316 -11
- package/src/components/chart/composite/price-axis-labels.tsx +27 -3
- package/src/components/chart/composite/rasterizer.ts +44 -19
- package/src/components/chart/composite/scene.ts +16 -4
- package/src/components/chart/composite/text-renderer.ts +48 -21
- package/src/components/chart/composite/toolbar.tsx +52 -5
- package/src/components/chart/composite/types.ts +19 -0
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
- package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
- package/src/components/chart/composite/use-composite-viewport.ts +12 -3
- package/src/components/chart/composite/value-scale.ts +149 -0
- package/src/components/chart/composite/volume-profile-paint.ts +6 -3
- package/src/components/chart/core/pointer.ts +2 -0
- package/src/components/chart-table/index.ts +2 -0
- package/src/components/chart-table/read.tsx +74 -0
- package/src/components/command-bar/commands/collection-list.ts +41 -19
- package/src/components/command-bar/commands/collection.ts +9 -3
- package/src/components/command-bar/commands/direct/index.ts +1 -1
- package/src/components/command-bar/commands/direct/runtime.ts +3 -2
- package/src/components/command-bar/pane-templates/items.ts +59 -6
- package/src/components/command-bar/pane-templates/workflow.ts +10 -1
- package/src/components/command-bar/routes/root/command-items.ts +32 -6
- package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
- package/src/components/command-bar/routes/root/provider-search.ts +42 -11
- package/src/components/command-bar/routes/root/results.ts +18 -4
- package/src/components/command-bar/routes/root/runtime.ts +15 -3
- package/src/components/command-bar/routes/root/search-providers.ts +25 -2
- package/src/components/command-bar/routes/root/selection.ts +6 -1
- package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
- package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
- package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
- package/src/components/command-bar/selection-runtime.ts +50 -10
- package/src/components/command-bar/surface/index.tsx +24 -2
- package/src/components/command-bar/view-model.ts +7 -0
- package/src/components/command-bar/workflow/broker.ts +2 -2
- package/src/components/command-bar/workflow/collection-actions.ts +46 -7
- package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
- package/src/components/command-bar/workflow/fields.ts +8 -2
- package/src/components/command-bar/workflow/ops.ts +18 -4
- package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
- package/src/components/command-bar/workflow/submit.ts +3 -2
- package/src/components/command-bar/workflow/tickers.ts +5 -1
- package/src/components/company-logo.tsx +39 -0
- package/src/components/data-table/sections.ts +4 -2
- package/src/components/data-table/view.tsx +23 -3
- package/src/components/form-modal/confirm.tsx +2 -1
- package/src/components/form-modal/request.ts +5 -0
- package/src/components/form-modal/routes.ts +4 -1
- package/src/components/index.ts +13 -6
- package/src/components/layout/detached-pane-shell.tsx +1 -0
- package/src/components/layout/floating-pane.tsx +1 -0
- package/src/components/layout/header.tsx +234 -60
- package/src/components/layout/market-summary.ts +9 -6
- package/src/components/layout/pane/capture-status.ts +1 -1
- package/src/components/layout/pane/footer/model.ts +11 -5
- package/src/components/layout/pane/header.tsx +10 -3
- package/src/components/layout/pane/index.tsx +1 -0
- package/src/components/layout/pane/pane-tabs.tsx +9 -1
- package/src/components/layout/shell/chrome.ts +19 -6
- package/src/components/layout/shell/index.tsx +2 -1
- package/src/components/layout/shell/pane/layers.tsx +19 -1
- package/src/components/layout/status-bar.tsx +2 -2
- package/src/components/market-board/index.tsx +11 -3
- package/src/components/onboarding/onboarding-wizard.tsx +1 -0
- package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
- package/src/components/onboarding/wizard-broker-sync.ts +4 -1
- package/src/components/pane-settings-dialog/desktop.tsx +20 -7
- package/src/components/pane-settings-dialog/tui.tsx +17 -9
- package/src/components/pane-settings-dialog/value.ts +8 -1
- package/src/components/pane-settings-dialog.tsx +44 -13
- package/src/components/sign-in-code-panel.tsx +27 -19
- package/src/components/ui/column-grid.tsx +48 -4
- package/src/components/ui/country-flag-art.tsx +180 -0
- package/src/components/ui/country-flag.tsx +118 -12
- package/src/components/ui/data-table/opentui/index.tsx +61 -2
- package/src/components/ui/data-table/opentui/model.ts +109 -2
- package/src/components/ui/data-table/types.ts +1 -1
- package/src/components/ui/display.tsx +5 -1
- package/src/components/ui/index.ts +3 -1
- package/src/components/ui/logo-mark.tsx +11 -2
- package/src/components/ui/query-bar.tsx +1 -1
- package/src/components/ui/row-notes.ts +79 -0
- package/src/components/ui/stat-grid.tsx +28 -3
- package/src/components/ui/status.tsx +3 -1
- package/src/core/app-services.ts +4 -0
- package/src/core/state/app/layout.ts +4 -4
- package/src/data/cached-query.ts +8 -1
- package/src/data/config/chart-settings.ts +3 -3
- package/src/data/config/home.ts +10 -2
- package/src/data/config/layout.ts +4 -1
- package/src/data/config/store/node.ts +4 -0
- package/src/data/config/store/normalize.ts +13 -3
- package/src/data/config/store/portfolio-as-of-column.ts +2 -2
- package/src/data/json-storage.ts +2 -0
- package/src/data/saved-copies.ts +84 -0
- package/src/docs/snapshot.json +65 -32
- package/src/i18n/es.ts +51 -12
- package/src/i18n/ja.ts +51 -12
- package/src/i18n/ko.ts +51 -12
- package/src/i18n/zh-cn.ts +51 -12
- package/src/i18n/zh-tw.ts +51 -12
- package/src/layout/desks.ts +1 -1
- package/src/layout/launch-layout.ts +1 -1
- package/src/layout/pane-manager/floating-actions.ts +5 -3
- package/src/layout/pane-manager/floating.ts +43 -1
- package/src/layout/pane-manager/index.ts +2 -0
- package/src/layout/selected-ticker.ts +74 -0
- package/src/market-data/depositary-pair.ts +251 -0
- package/src/market-data/futures-board.ts +1 -1
- package/src/market-data/futures-contract.ts +124 -40
- package/src/market-data/fx-closes.ts +17 -2
- package/src/market-data/hooks.tsx +19 -11
- package/src/market-data/market/change-basis.ts +49 -7
- package/src/market-data/market/freshness.ts +34 -5
- package/src/market-data/market/period-return.ts +163 -0
- package/src/market-data/market/trading-sessions.ts +13 -0
- package/src/market-data/market/year-to-date.ts +8 -13
- package/src/market-data/performance.ts +20 -14
- package/src/market-data/perpetual-premium.ts +32 -0
- package/src/market-data/published-apac-sessions.ts +2 -1
- package/src/market-data/published-futures-sessions.ts +69 -0
- package/src/market-data/quotes/contributions.ts +5 -1
- package/src/market-data/quotes/freshness.ts +42 -0
- package/src/market-data/quotes/intraday-bar.ts +37 -0
- package/src/market-data/quotes/regular-session-valuation.ts +13 -8
- package/src/market-data/quotes/resolution.ts +4 -2
- package/src/market-data/tax-equivalent.ts +1 -1
- package/src/market-data/ticker-price-returns.ts +3 -1
- package/src/news/aggregator.ts +5 -1
- package/src/news/news-model.ts +4 -0
- package/src/news/types.ts +11 -0
- package/src/notifications/app-notifier.ts +1 -1
- package/src/plugins/auto-update.ts +2 -2
- package/src/plugins/builtin/account-management/index.tsx +1 -0
- package/src/plugins/builtin/account-management/pane.tsx +9 -8
- package/src/plugins/builtin/alerts/alert-engine.ts +30 -18
- package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
- package/src/plugins/builtin/alerts/cli.ts +485 -76
- package/src/plugins/builtin/alerts/command.ts +5 -10
- package/src/plugins/builtin/alerts/event-rows.ts +9 -5
- package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
- package/src/plugins/builtin/alerts/events.ts +108 -5
- package/src/plugins/builtin/alerts/fired-log.ts +78 -0
- package/src/plugins/builtin/alerts/format.ts +2 -1
- package/src/plugins/builtin/alerts/headless.ts +100 -39
- package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
- package/src/plugins/builtin/alerts/history-rows.ts +89 -0
- package/src/plugins/builtin/alerts/index.tsx +45 -18
- package/src/plugins/builtin/alerts/iv-level.ts +365 -0
- package/src/plugins/builtin/alerts/levels.ts +3 -3
- package/src/plugins/builtin/alerts/pane.tsx +97 -29
- package/src/plugins/builtin/alerts/price.ts +35 -0
- package/src/plugins/builtin/alerts/quotes.ts +24 -0
- package/src/plugins/builtin/alerts/research-builder.ts +84 -11
- package/src/plugins/builtin/alerts/research-rules.ts +77 -3
- package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
- package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
- package/src/plugins/builtin/alerts/scheduled.ts +188 -29
- package/src/plugins/builtin/alerts/storage.ts +13 -10
- package/src/plugins/builtin/alerts/targets.ts +12 -3
- package/src/plugins/builtin/analytics/index.tsx +8 -2
- package/src/plugins/builtin/analytics/metrics.ts +1 -1
- package/src/plugins/builtin/analytics/risk-book.ts +215 -0
- package/src/plugins/builtin/analytics/risk-client.ts +13 -6
- package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
- package/src/plugins/builtin/analytics/risk-math.ts +6 -3
- package/src/plugins/builtin/analytics/risk-model.ts +297 -104
- package/src/plugins/builtin/analytics/risk-options.ts +17 -2
- package/src/plugins/builtin/analytics/risk-pane.tsx +107 -43
- package/src/plugins/builtin/attention/pane.tsx +22 -16
- package/src/plugins/builtin/awards/headless.ts +7 -3
- package/src/plugins/builtin/awards/model.ts +18 -0
- package/src/plugins/builtin/awards/pane.tsx +12 -9
- package/src/plugins/builtin/backtest/export.ts +1 -1
- package/src/plugins/builtin/backtest/headless.ts +3 -3
- package/src/plugins/builtin/backtest/rules.ts +41 -5
- package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
- package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
- package/src/plugins/builtin/broker-manager/footer.ts +27 -11
- package/src/plugins/builtin/broker-manager/index.tsx +21 -12
- package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
- package/src/plugins/builtin/broker-manager/model.ts +12 -2
- package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
- package/src/plugins/builtin/broker-manager/table.ts +28 -12
- package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
- package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
- package/src/plugins/builtin/broker-trading/controller.ts +45 -13
- package/src/plugins/builtin/broker-trading/dock.tsx +24 -4
- package/src/plugins/builtin/broker-trading/headless.ts +2 -1
- package/src/plugins/builtin/broker-trading/index.tsx +7 -1
- package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
- package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
- package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
- package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
- package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
- package/src/plugins/builtin/broker-trading/pane.tsx +115 -26
- package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
- package/src/plugins/builtin/broker-trading/ticket.tsx +122 -36
- package/src/plugins/builtin/buildout/cells.tsx +4 -0
- package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
- package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
- package/src/plugins/builtin/buildout/pane/index.tsx +34 -18
- package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
- package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
- package/src/plugins/builtin/catalysts/client.ts +2 -2
- package/src/plugins/builtin/catalysts/detail.tsx +3 -2
- package/src/plugins/builtin/catalysts/index.tsx +1 -1
- package/src/plugins/builtin/catalysts/model.ts +49 -4
- package/src/plugins/builtin/catalysts/pane.tsx +9 -11
- package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
- package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
- package/src/plugins/builtin/changelog/index.tsx +1 -0
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
- package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
- package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
- package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
- package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
- package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
- package/src/plugins/builtin/chart-composer/headless.ts +253 -35
- package/src/plugins/builtin/chart-composer/index.tsx +12 -2
- package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
- package/src/plugins/builtin/chart-composer/pane.tsx +128 -28
- package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
- package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
- package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
- package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
- package/src/plugins/builtin/chart-composer/settings.ts +31 -19
- package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
- package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
- package/src/plugins/builtin/chat/attachments/model.ts +3 -1
- package/src/plugins/builtin/chat/content/index.tsx +1 -1
- package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
- package/src/plugins/builtin/chat/people.ts +1 -1
- package/src/plugins/builtin/clinical-trials/client.ts +5 -2
- package/src/plugins/builtin/clinical-trials/model.ts +13 -4
- package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
- package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
- package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
- package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
- package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
- package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
- package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
- package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
- package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
- package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
- package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
- package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
- package/src/plugins/builtin/commodity-balances/pane.tsx +14 -8
- package/src/plugins/builtin/company-attention/app-rank.tsx +11 -10
- package/src/plugins/builtin/company-attention/building-model.ts +222 -0
- package/src/plugins/builtin/company-attention/building.tsx +172 -0
- package/src/plugins/builtin/company-attention/client.ts +117 -1
- package/src/plugins/builtin/company-attention/evidence.ts +16 -3
- package/src/plugins/builtin/company-attention/headless.ts +101 -5
- package/src/plugins/builtin/company-attention/index.tsx +6 -3
- package/src/plugins/builtin/company-attention/model.ts +33 -7
- package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
- package/src/plugins/builtin/company-attention/moves.tsx +159 -0
- package/src/plugins/builtin/company-attention/pane.tsx +89 -31
- package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
- package/src/plugins/builtin/company-attention/signals.tsx +160 -0
- package/src/plugins/builtin/company-kpis/headless.ts +3 -2
- package/src/plugins/builtin/company-kpis/model.ts +2 -2
- package/src/plugins/builtin/company-kpis/pane.tsx +5 -4
- package/src/plugins/builtin/composite-plugins.ts +2 -1
- package/src/plugins/builtin/congress-trades/headless.ts +1 -1
- package/src/plugins/builtin/connections/index.ts +1 -0
- package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
- package/src/plugins/builtin/correlation/headless.ts +7 -4
- package/src/plugins/builtin/correlation/relationship/model.ts +1 -0
- package/src/plugins/builtin/correlation/settings.ts +1 -0
- package/src/plugins/builtin/cot/headless.ts +28 -6
- package/src/plugins/builtin/cot/model.ts +12 -0
- package/src/plugins/builtin/cot/pane.tsx +7 -5
- package/src/plugins/builtin/cpi/headless.ts +5 -1
- package/src/plugins/builtin/cpi/pane.tsx +11 -9
- package/src/plugins/builtin/credit-boards/model.ts +2 -0
- package/src/plugins/builtin/credit-documents/headless.ts +1 -1
- package/src/plugins/builtin/credit-documents/pane.tsx +8 -7
- package/src/plugins/builtin/crypto-board/client.ts +86 -0
- package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
- package/src/plugins/builtin/crypto-board/defi.ts +239 -0
- package/src/plugins/builtin/crypto-board/headless.ts +117 -6
- package/src/plugins/builtin/crypto-board/index.tsx +8 -3
- package/src/plugins/builtin/crypto-board/model.ts +40 -8
- package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
- package/src/plugins/builtin/crypto-board/series.ts +19 -1
- package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
- package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
- package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
- package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
- package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
- package/src/plugins/builtin/debt-maturities/pane.tsx +4 -3
- package/src/plugins/builtin/debug/index.tsx +1 -0
- package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
- package/src/plugins/builtin/docs/index.tsx +1 -1
- package/src/plugins/builtin/docs/pane.tsx +2 -2
- package/src/plugins/builtin/docs/targets.ts +1 -1
- package/src/plugins/builtin/doe/client.ts +5 -1
- package/src/plugins/builtin/doe/headless.ts +12 -6
- package/src/plugins/builtin/doe/model.ts +43 -6
- package/src/plugins/builtin/doe/pane.tsx +19 -12
- package/src/plugins/builtin/earnings/board-model.ts +13 -6
- package/src/plugins/builtin/earnings/board-table.ts +4 -1
- package/src/plugins/builtin/earnings/board.tsx +253 -50
- package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
- package/src/plugins/builtin/earnings/calendar.tsx +338 -0
- package/src/plugins/builtin/earnings/client.ts +4 -3
- package/src/plugins/builtin/earnings/headless.ts +53 -15
- package/src/plugins/builtin/earnings/history-model.ts +53 -36
- package/src/plugins/builtin/earnings/index.tsx +15 -22
- package/src/plugins/builtin/earnings/model.ts +17 -12
- package/src/plugins/builtin/earnings/scope.ts +89 -0
- package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
- package/src/plugins/builtin/earnings-calls/data.ts +146 -2
- package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
- package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
- package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
- package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
- package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
- package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
- package/src/plugins/builtin/econ/calendar-model.ts +132 -20
- package/src/plugins/builtin/econ/detail-view.tsx +48 -10
- package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
- package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
- package/src/plugins/builtin/econ/index.tsx +112 -25
- package/src/plugins/builtin/econ/print-watch.ts +2 -1
- package/src/plugins/builtin/econ/types.ts +32 -1
- package/src/plugins/builtin/econ-statistics/client.ts +16 -3
- package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
- package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
- package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
- package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
- package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
- package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
- package/src/plugins/builtin/econ-statistics/view.ts +16 -1
- package/src/plugins/builtin/equity-screener/client.ts +21 -3
- package/src/plugins/builtin/equity-screener/headless.ts +77 -5
- package/src/plugins/builtin/equity-screener/live.ts +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +34 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +148 -106
- package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
- package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
- package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
- package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
- package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
- package/src/plugins/builtin/exposure/headless.ts +51 -6
- package/src/plugins/builtin/exposure/index.tsx +28 -2
- package/src/plugins/builtin/exposure/model.ts +7 -0
- package/src/plugins/builtin/exposure/pane.tsx +16 -10
- package/src/plugins/builtin/fear-greed/index.tsx +1 -1
- package/src/plugins/builtin/filing-events/index.tsx +1 -1
- package/src/plugins/builtin/futures/model.ts +10 -9
- package/src/plugins/builtin/futures/returns.ts +8 -36
- package/src/plugins/builtin/futures/table.tsx +1 -1
- package/src/plugins/builtin/futures-curve/client.ts +40 -9
- package/src/plugins/builtin/futures-curve/headless.ts +39 -17
- package/src/plugins/builtin/futures-curve/model.ts +258 -69
- package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
- package/src/plugins/builtin/fx-matrix/client.ts +15 -8
- package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
- package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
- package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
- package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
- package/src/plugins/builtin/gpu/board.tsx +4 -1
- package/src/plugins/builtin/gpu/changes.tsx +10 -10
- package/src/plugins/builtin/gpu/equities.tsx +4 -1
- package/src/plugins/builtin/gpu/headless.ts +9 -4
- package/src/plugins/builtin/gpu/history.tsx +4 -2
- package/src/plugins/builtin/gpu/pane.tsx +5 -3
- package/src/plugins/builtin/help/index.tsx +13 -3
- package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
- package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
- package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
- package/src/plugins/builtin/holders/client.ts +15 -2
- package/src/plugins/builtin/holders/format.ts +28 -17
- package/src/plugins/builtin/holders/headless.ts +48 -8
- package/src/plugins/builtin/holders/index-holders.ts +264 -0
- package/src/plugins/builtin/holders/pane.tsx +79 -15
- package/src/plugins/builtin/holders/report-rows.ts +35 -7
- package/src/plugins/builtin/holders/table-model.ts +2 -1
- package/src/plugins/builtin/holders/thirteenf-match.ts +3 -1
- package/src/plugins/builtin/holders/treemap.tsx +2 -2
- package/src/plugins/builtin/insider/base-values.ts +11 -7
- package/src/plugins/builtin/insider/client.ts +3 -0
- package/src/plugins/builtin/insider/headless.ts +20 -7
- package/src/plugins/builtin/insider/index.tsx +17 -8
- package/src/plugins/builtin/insider/issuer.ts +34 -4
- package/src/plugins/builtin/insider/signals-client.ts +3 -3
- package/src/plugins/builtin/insider/signals.tsx +1 -1
- package/src/plugins/builtin/insider/table-model.ts +35 -13
- package/src/plugins/builtin/insider/table.tsx +5 -2
- package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
- package/src/plugins/builtin/iv-history/client.ts +20 -0
- package/src/plugins/builtin/iv-history/events.ts +145 -0
- package/src/plugins/builtin/iv-history/format.ts +3 -0
- package/src/plugins/builtin/iv-history/headless.ts +91 -7
- package/src/plugins/builtin/iv-history/index.tsx +1 -1
- package/src/plugins/builtin/iv-history/model.ts +13 -4
- package/src/plugins/builtin/iv-history/series.ts +3 -1
- package/src/plugins/builtin/jobs/lock-note.ts +1 -1
- package/src/plugins/builtin/jobs/model.ts +4 -15
- package/src/plugins/builtin/jobs/pane.tsx +7 -5
- package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
- package/src/plugins/builtin/jodi/pane.tsx +14 -8
- package/src/plugins/builtin/layout-manager/index.tsx +1 -0
- package/src/plugins/builtin/macro-day/headless.ts +20 -7
- package/src/plugins/builtin/macro-day/index.tsx +3 -2
- package/src/plugins/builtin/macro-day/model.ts +29 -8
- package/src/plugins/builtin/macro-day/pane.tsx +46 -10
- package/src/plugins/builtin/macro-day/releases.ts +55 -13
- package/src/plugins/builtin/market-heatmap/data.ts +9 -2
- package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
- package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
- package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
- package/src/plugins/builtin/market-heatmap/model.ts +10 -7
- package/src/plugins/builtin/market-movers/client.ts +36 -21
- package/src/plugins/builtin/market-movers/headless.ts +8 -2
- package/src/plugins/builtin/market-movers/index.tsx +16 -10
- package/src/plugins/builtin/market-movers/screener.ts +33 -11
- package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
- package/src/plugins/builtin/market-movers/session-table.ts +4 -2
- package/src/plugins/builtin/market-movers/table.ts +4 -1
- package/src/plugins/builtin/market-valuation/headless.ts +2 -0
- package/src/plugins/builtin/market-valuation/view.ts +5 -0
- package/src/plugins/builtin/members/headless.ts +6 -5
- package/src/plugins/builtin/members/pane.tsx +11 -4
- package/src/plugins/builtin/mna/client.ts +1 -0
- package/src/plugins/builtin/mna/detail.tsx +20 -32
- package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
- package/src/plugins/builtin/mna/distress/model.ts +3 -2
- package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
- package/src/plugins/builtin/mna/headless.ts +6 -13
- package/src/plugins/builtin/mna/model.ts +93 -15
- package/src/plugins/builtin/mna/pane.tsx +5 -4
- package/src/plugins/builtin/news/headless.ts +12 -6
- package/src/plugins/builtin/news/index.tsx +10 -1
- package/src/plugins/builtin/news/wire/index.tsx +3 -2
- package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
- package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
- package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
- package/src/plugins/builtin/notes/cli.ts +50 -15
- package/src/plugins/builtin/notes/export.ts +17 -6
- package/src/plugins/builtin/notes/files.ts +16 -5
- package/src/plugins/builtin/openfda/pane.tsx +1 -1
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/enrichment-model.ts +10 -9
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/model-spot.ts +70 -4
- package/src/plugins/builtin/options/view.tsx +51 -23
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-calculator/pane.tsx +3 -2
- package/src/plugins/builtin/options-positioning/headless.ts +11 -3
- package/src/plugins/builtin/options-positioning/model.ts +24 -0
- package/src/plugins/builtin/options-positioning/pane.tsx +10 -12
- package/src/plugins/builtin/options-scenario/client.ts +142 -29
- package/src/plugins/builtin/options-scenario/collar.ts +8 -6
- package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
- package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
- package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
- package/src/plugins/builtin/options-scenario/csp.ts +101 -21
- package/src/plugins/builtin/options-scenario/headless.ts +49 -21
- package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
- package/src/plugins/builtin/options-scenario/index.tsx +28 -3
- package/src/plugins/builtin/options-scenario/model.ts +13 -0
- package/src/plugins/builtin/options-scenario/pane.tsx +22 -10
- package/src/plugins/builtin/perps/equity-row.tsx +11 -3
- package/src/plugins/builtin/perps/freshness.ts +8 -5
- package/src/plugins/builtin/perps/headless.ts +3 -1
- package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
- package/src/plugins/builtin/perps/live-rows.ts +161 -0
- package/src/plugins/builtin/perps/markets-section.tsx +154 -0
- package/src/plugins/builtin/perps/pane.tsx +36 -17
- package/src/plugins/builtin/perps/venue-markets.ts +96 -0
- package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +145 -60
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +78 -27
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
- package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
- package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
- package/src/plugins/builtin/portfolio-list/income.ts +13 -2
- package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
- package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
- package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
- package/src/plugins/builtin/power/client.ts +6 -3
- package/src/plugins/builtin/power/evidence.ts +22 -7
- package/src/plugins/builtin/power/gas.tsx +5 -1
- package/src/plugins/builtin/power/pane.tsx +44 -32
- package/src/plugins/builtin/power/prices.tsx +10 -3
- package/src/plugins/builtin/research/analyst-headless.ts +25 -8
- package/src/plugins/builtin/research/analyst-model.ts +68 -3
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
- package/src/plugins/builtin/research/event-model.ts +3 -1
- package/src/plugins/builtin/research/event-sources.ts +12 -4
- package/src/plugins/builtin/research/index.tsx +2 -1
- package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
- package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
- package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
- package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
- package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
- package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
- package/src/plugins/builtin/reverse-dcf/client.ts +2 -1
- package/src/plugins/builtin/reverse-dcf/model.ts +10 -5
- package/src/plugins/builtin/risk-factors/index.tsx +2 -2
- package/src/plugins/builtin/scanner/lock-note.ts +1 -1
- package/src/plugins/builtin/seasonality/client.ts +2 -1
- package/src/plugins/builtin/sec/forms.ts +13 -0
- package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
- package/src/plugins/builtin/sec/fund-facts.ts +68 -8
- package/src/plugins/builtin/sec/headless.ts +85 -8
- package/src/plugins/builtin/sec/index.tsx +58 -12
- package/src/plugins/builtin/sectors/client.ts +6 -4
- package/src/plugins/builtin/sectors/sector-model.ts +11 -15
- package/src/plugins/builtin/series-inventory.ts +2 -0
- package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
- package/src/plugins/builtin/shared/cloud-resource.ts +15 -2
- package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
- package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
- package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
- package/src/plugins/builtin/shared/earnings-report.ts +3 -3
- package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
- package/src/plugins/builtin/shared/job-posting.ts +129 -0
- package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
- package/src/plugins/builtin/shared/report-freshness.ts +3 -0
- package/src/plugins/builtin/shared/research-trading.tsx +23 -0
- package/src/plugins/builtin/shared/series-cache.ts +2 -0
- package/src/plugins/builtin/shared/series-list-detail.tsx +3 -1
- package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
- package/src/plugins/builtin/shared/volatility/options.ts +2 -1
- package/src/plugins/builtin/short-interest/client.ts +2 -0
- package/src/plugins/builtin/short-interest/headless.ts +41 -12
- package/src/plugins/builtin/short-interest/index.tsx +23 -1
- package/src/plugins/builtin/short-interest/model.ts +70 -19
- package/src/plugins/builtin/short-interest/pane.tsx +19 -2
- package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
- package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
- package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
- package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
- package/src/plugins/builtin/short-interest/schedule.ts +35 -2
- package/src/plugins/builtin/short-interest/surface.tsx +11 -4
- package/src/plugins/builtin/short-interest/types.ts +9 -0
- package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
- package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
- package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
- package/src/plugins/builtin/social-mentions/client.ts +2 -1
- package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
- package/src/plugins/builtin/supply-chain/model.ts +51 -3
- package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
- package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
- package/src/plugins/builtin/themes/headless.ts +8 -5
- package/src/plugins/builtin/themes/model.ts +14 -4
- package/src/plugins/builtin/themes/pane.tsx +24 -5
- package/src/plugins/builtin/thirteenf/headless.ts +5 -5
- package/src/plugins/builtin/thirteenf/signals.ts +3 -1
- package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
- package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
- package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
- package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
- package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
- package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
- package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
- package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
- package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
- package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
- package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
- package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
- package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
- package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
- package/src/plugins/builtin/vol-surface/client.ts +28 -7
- package/src/plugins/builtin/vol-surface/headless.ts +43 -15
- package/src/plugins/builtin/vol-surface/model.ts +34 -12
- package/src/plugins/builtin/vol-surface/pane.tsx +33 -13
- package/src/plugins/builtin/vol-surface/stored.ts +34 -3
- package/src/plugins/builtin/vol-surface/tables.ts +14 -0
- package/src/plugins/builtin/volatility/model.ts +5 -10
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
- package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
- package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
- package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
- package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
- package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
- package/src/plugins/builtin/world-venue-map/index.ts +3 -26
- package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
- package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
- package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
- package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
- package/src/plugins/builtin/yield-curve/client.ts +25 -0
- package/src/plugins/builtin/yield-curve/curves.ts +7 -4
- package/src/plugins/builtin/yield-curve/headless.ts +38 -4
- package/src/plugins/builtin/yield-curve/history.ts +4 -3
- package/src/plugins/builtin/yield-curve/index.tsx +12 -6
- package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
- package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
- package/src/plugins/bundle.ts +1 -1
- package/src/plugins/catalog-browser.ts +2 -1
- package/src/plugins/compat.ts +3 -3
- package/src/plugins/dependencies.ts +75 -14
- package/src/plugins/extracted-plugins.ts +132 -34
- package/src/plugins/host-link.ts +149 -34
- package/src/plugins/installer.ts +35 -10
- package/src/plugins/loader.ts +206 -38
- package/src/plugins/manager-node.ts +2 -2
- package/src/plugins/marketplace/deactivation.ts +22 -0
- package/src/plugins/marketplace/model.ts +2 -2
- package/src/plugins/marketplace/packs.ts +1 -1
- package/src/plugins/ownership.ts +1 -1
- package/src/plugins/peer-retry.ts +155 -0
- package/src/plugins/registry/contributions.ts +3 -1
- package/src/plugins/registry/index.ts +4 -3
- package/src/plugins/registry/plugin-state.ts +3 -0
- package/src/plugins/seed-notice.ts +20 -0
- package/src/plugins/shortcut-argument.ts +39 -0
- package/src/portfolio/allocation.ts +1 -1
- package/src/portfolio/collection-name.ts +31 -0
- package/src/portfolio/column-values.ts +10 -8
- package/src/portfolio/cost-fx.ts +296 -19
- package/src/portfolio/manual-lots.ts +75 -0
- package/src/portfolio/mutations.ts +60 -22
- package/src/portfolio/suffixed-listings.ts +209 -0
- package/src/portfolio/totals-currency.ts +24 -0
- package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
- package/src/public/time-series.ts +11 -8
- package/src/remote/schema.ts +1 -1
- package/src/renderers/browser/config-host.ts +3 -0
- package/src/renderers/browser/main.tsx +23 -3
- package/src/renderers/dom/boot-frame-page.ts +187 -0
- package/src/renderers/dom/boot-frame.ts +237 -0
- package/src/renderers/dom/build-assets.ts +46 -8
- package/src/renderers/dom/desktop/controls.tsx +1 -1
- package/src/renderers/dom/desktop/query-bar.tsx +2 -0
- package/src/renderers/dom/dom-ui-host.tsx +4 -29
- package/src/renderers/dom/host/ascii-text.ts +16 -2
- package/src/renderers/dom/host/box.tsx +43 -2
- package/src/renderers/dom/host/chart-surface.tsx +2 -0
- package/src/renderers/dom/host/hls.chunk.ts +3 -0
- package/src/renderers/dom/host/image-surface.tsx +49 -0
- package/src/renderers/dom/host/media-surface.tsx +24 -18
- package/src/renderers/dom/host/mouse.ts +30 -0
- package/src/renderers/dom/host/size-observer.ts +1 -1
- package/src/renderers/dom/host/style.ts +1 -1
- package/src/renderers/dom/host/tabs.tsx +16 -5
- package/src/renderers/dom/host/top-surface.ts +127 -0
- package/src/renderers/dom/styles.css +115 -0
- package/src/renderers/dom/test-utils.tsx +2 -1
- package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
- package/src/renderers/electrobun/bun/core-capabilities.ts +9 -1
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +56 -3
- package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
- package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
- package/src/renderers/electrobun/bun/desktop/update.ts +210 -30
- package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
- package/src/renderers/electrobun/bun/index.ts +11 -1
- package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
- package/src/renderers/electrobun/bun/window/create.ts +4 -1
- package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
- package/src/renderers/electrobun/shared/protocol.ts +6 -1
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
- package/src/renderers/electrobun/view/config-host.ts +3 -0
- package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
- package/src/renderers/electrobun/view/main.tsx +30 -4
- package/src/renderers/electrobun/view/news-source.ts +9 -7
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +9 -2
- package/src/renderers/electrobun/view/ui-host.tsx +1 -1
- package/src/renderers/opentui/browser-open.ts +88 -0
- package/src/renderers/opentui/host.tsx +5 -14
- package/src/renderers/opentui/image/loader.ts +3 -2
- package/src/renderers/opentui/native-smoke.ts +10 -1
- package/src/renderers/opentui/pane-image/index.ts +2 -1
- package/src/renderers/opentui/render-lib.ts +253 -0
- package/src/renderers/opentui/render-timing-smoke.ts +1 -1
- package/src/renderers/opentui/start.tsx +8 -1
- package/src/renderers/share/layout-view.tsx +2 -2
- package/src/renderers/share/main.tsx +4 -4
- package/src/renderers/share/view.tsx +1 -1
- package/src/series/resolve.ts +22 -6
- package/src/series/standalone.ts +30 -2
- package/src/series/types.ts +8 -1
- package/src/shares/api.ts +4 -1
- package/src/shares/pane.ts +1 -1
- package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
- package/src/sources/gloomberb-cloud/index.ts +39 -16
- package/src/sources/gloomberb-cloud/news.ts +39 -0
- package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
- package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
- package/src/sources/listing-symbols.ts +37 -0
- package/src/sources/provider-errors.ts +16 -2
- package/src/sources/provider-router/financial-routes.ts +21 -3
- package/src/sources/provider-router/financials.ts +15 -2
- package/src/sources/provider-router/history.ts +30 -8
- package/src/sources/provider-router/index.ts +16 -0
- package/src/sources/provider-router/primary.ts +1 -1
- package/src/state/app/bootstrap.ts +23 -0
- package/src/state/hooks/inline-tickers.ts +30 -5
- package/src/sync/controller.ts +1 -1
- package/src/sync/core-contributors.ts +46 -14
- package/src/team/collections-sync.ts +2 -1
- package/src/team/collections.ts +178 -17
- package/src/telemetry/crash-reports.ts +21 -4
- package/src/telemetry/update-failures-node.ts +59 -0
- package/src/telemetry/update-failures.ts +307 -0
- package/src/test-support/builtin-panes.ts +1 -1
- package/src/theme/colors.ts +3 -30
- package/src/theme/ui-tokens.ts +37 -1
- package/src/tickers/company-name-listing.ts +215 -36
- package/src/tickers/company-name.ts +43 -0
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- package/src/tickers/listing-fate.ts +30 -0
- package/src/tickers/metadata.ts +10 -0
- package/src/tickers/perpetual-listing.ts +5 -2
- package/src/tickers/search/home-listing.ts +75 -0
- package/src/tickers/search/index.ts +76 -27
- package/src/tickers/search/ranking.ts +54 -4
- package/src/tickers/search/upsert.ts +29 -0
- package/src/tickers/terminal-codes.ts +416 -40
- package/src/time-series/bar-aggregation.ts +243 -0
- package/src/time-series/base-series.ts +307 -0
- package/src/time-series/chart-bounds.ts +349 -0
- package/src/time-series/chart-seed.ts +142 -0
- package/src/time-series/economic.ts +5 -0
- package/src/time-series/fundamentals.ts +18 -3
- package/src/time-series/history-acquisition.ts +499 -0
- package/src/time-series/leverage.ts +100 -0
- package/src/time-series/market-resolution.ts +4 -2
- package/src/time-series/market.ts +2 -1
- package/src/time-series/price-comparison.ts +175 -30
- package/src/time-series/range.ts +9 -1
- package/src/time-series/resolution.ts +174 -16
- package/src/time-series/resolve-context.ts +157 -0
- package/src/time-series/resolve.ts +126 -1577
- package/src/time-series/series-name.ts +38 -0
- package/src/time-series/series-presentation.ts +208 -0
- package/src/time-series/spec.ts +11 -6
- package/src/time-series/studies.ts +109 -12
- package/src/time-series/tail-reconcile.ts +121 -0
- package/src/time-series/types.ts +29 -2
- package/src/time-series/use-chart-resolution.ts +4 -5
- package/src/types/broker.ts +10 -0
- package/src/types/config.ts +14 -0
- package/src/types/data-provider.ts +20 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +104 -7
- package/src/types/headless.ts +83 -6
- package/src/types/instrument.ts +3 -0
- package/src/types/issuer-listings.ts +28 -0
- package/src/types/plugin.ts +65 -8
- package/src/types/price-history.ts +2 -0
- package/src/types/ticker.ts +13 -0
- package/src/types/trading.ts +59 -1
- package/src/ui/ascii-font.ts +13 -1
- package/src/ui/host.tsx +6 -1
- package/src/updater/command-names.ts +175 -0
- package/src/updater/failure.ts +163 -0
- package/src/updater/index.ts +97 -28
- package/src/utils/calendar-date.ts +32 -15
- package/src/utils/cash-runway.ts +241 -0
- package/src/utils/central-banks.ts +42 -0
- package/src/utils/cli-output.ts +259 -80
- package/src/utils/contract-month.ts +16 -0
- package/src/utils/crypto-pair.ts +61 -3
- package/src/utils/currency-pair.ts +26 -0
- package/src/utils/currency-units.ts +29 -0
- package/src/utils/datetime-format.ts +10 -0
- package/src/utils/debug-log.ts +1 -1
- package/src/utils/decimal-comma.ts +39 -6
- package/src/utils/exchange-announcements.ts +71 -0
- package/src/utils/exchange-rate-snapshot.ts +10 -0
- package/src/utils/financial-statements.ts +83 -4
- package/src/utils/format.ts +34 -16
- package/src/utils/fundamentals.ts +150 -34
- package/src/utils/fx-market-hours.ts +10 -1
- package/src/utils/latest-financial-period.ts +8 -0
- package/src/utils/linux-libc.ts +54 -0
- package/src/utils/market-capitalization.ts +111 -15
- package/src/utils/max-drawdown.ts +64 -0
- package/src/utils/network-failure.ts +83 -0
- package/src/utils/option-expiry.ts +139 -7
- package/src/utils/price-earnings.ts +11 -5
- package/src/utils/price-history.ts +18 -8
- package/src/utils/price-window.ts +131 -0
- package/src/utils/release-date.ts +47 -0
- package/src/utils/sec.ts +71 -0
- package/src/utils/throttled-fetch.ts +11 -4
- package/src/utils/trailing-eps.ts +67 -0
- package/src/utils/typed-text.ts +21 -0
- package/src/utils/utc-time.ts +24 -1
- package/src/version.ts +6 -0
- package/src/cli/pane-functions/screenshot.ts +0 -2122
|
@@ -16,6 +16,7 @@ import { connectSignedInBrokerProfile } from "../../../brokers/signed-in/connect
|
|
|
16
16
|
import {
|
|
17
17
|
addTickerToPortfolio,
|
|
18
18
|
adoptFirstPositionCurrency,
|
|
19
|
+
LotCostFxMergeError,
|
|
19
20
|
createManualPortfolio as createManualPortfolioConfig,
|
|
20
21
|
deleteManualPortfolio,
|
|
21
22
|
deleteWatchlist as deleteWatchlistConfig,
|
|
@@ -27,6 +28,14 @@ import {
|
|
|
27
28
|
validatePositionShares,
|
|
28
29
|
} from "../../../portfolio/mutations";
|
|
29
30
|
import { loadFuturesEntrySize } from "../../../portfolio/futures-terms";
|
|
31
|
+
import {
|
|
32
|
+
FORM_COST_FX_WORDING, PositionCostFxError, readCostFxRate, readPurchaseDate, resolvePositionCostFx,
|
|
33
|
+
} from "../../../portfolio/cost-fx";
|
|
34
|
+
import { getManualPortfolioPositionPrefill } from "../../../portfolio/manual-lots";
|
|
35
|
+
import { resolvePortfolioTotalsCurrency } from "../../../portfolio/totals-currency";
|
|
36
|
+
import { createBaseConverter } from "../../../cli/base-converter";
|
|
37
|
+
import { heldCurrencyUnit } from "../../../utils/currency-units";
|
|
38
|
+
import { positionCostTermsPrefill } from "./portfolio-position";
|
|
30
39
|
import { wholeUnitQuantityProblem } from "../../../portfolio/position-quantity";
|
|
31
40
|
import type { CommandBarFieldValue } from "./types";
|
|
32
41
|
import type { WorkflowStringValues } from "./broker";
|
|
@@ -126,6 +135,7 @@ export function createCommandBarCollectionWorkflowActions(options: {
|
|
|
126
135
|
const connected = await connectSignedInBrokerProfile(broker, {
|
|
127
136
|
getConfig: () => pluginRegistry.getConfig(),
|
|
128
137
|
createBrokerInstance: (brokerType, label, values) => pluginRegistry.createBrokerInstance(brokerType, label, values),
|
|
138
|
+
enableBrokerInstance: (instanceId) => pluginRegistry.updateBrokerInstance(instanceId, {}, { enabled: true }),
|
|
129
139
|
syncBrokerInstance: (instanceId) => pluginRegistry.syncBrokerInstance(instanceId),
|
|
130
140
|
requestSignIn: requestBrokerSignIn,
|
|
131
141
|
});
|
|
@@ -271,16 +281,45 @@ export function createCommandBarCollectionWorkflowActions(options: {
|
|
|
271
281
|
currentState.config.baseCurrency,
|
|
272
282
|
size?.currency,
|
|
273
283
|
);
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
avgCost,
|
|
277
|
-
currency,
|
|
278
|
-
...(size ? { multiplier: size.multiplier } : {}),
|
|
279
|
-
});
|
|
284
|
+
// Purchase Date and Cost FX behave as `position set --date/--cost-fx`. A field left as it opened keeps
|
|
285
|
+
// what the lots have; one emptied clears it; a new date reads that day's FX close unless a rate is typed.
|
|
280
286
|
const firstPosition = !hasOpenPortfolioPositions(portfolio.id, getState().tickers.values());
|
|
287
|
+
const adopted = firstPosition ? adoptFirstPositionCurrency(getState().config, portfolio.id, currency) : null;
|
|
288
|
+
const valued = adopted ?? getState().config;
|
|
289
|
+
const portfolioCurrency = resolvePortfolioTotalsCurrency(
|
|
290
|
+
valued.portfolios.find((entry) => entry.id === portfolio.id) ?? portfolio, valued.baseCurrency);
|
|
291
|
+
const opened = positionCostTermsPrefill(getManualPortfolioPositionPrefill(ticker, portfolio.id).position, portfolioCurrency);
|
|
292
|
+
const dateText = coerceFieldString(values.dateAcquired).trim();
|
|
293
|
+
const rateText = coerceFieldString(values.costFx).trim();
|
|
294
|
+
const dateAcquired = dateText === opened.dateAcquired ? undefined : dateText ? readPurchaseDate(dateText, FORM_COST_FX_WORDING) : null;
|
|
295
|
+
const typedRate = rateText && rateText !== opened.costFx ? readCostFxRate(rateText, FORM_COST_FX_WORDING) : undefined;
|
|
296
|
+
const toPortfolio = createBaseConverter(dataProvider, heldCurrencyUnit(portfolioCurrency).currency);
|
|
297
|
+
let result: ReturnType<typeof setManualPortfolioPosition>;
|
|
298
|
+
try {
|
|
299
|
+
const bought = await resolvePositionCostFx({
|
|
300
|
+
date: dateAcquired ?? undefined, costFx: typedRate, history: apiClient,
|
|
301
|
+
currency, portfolioCurrency, listing: ticker.metadata.ticker, wording: FORM_COST_FX_WORDING,
|
|
302
|
+
// Today's rate, in the units the lot is held in: what a typed rate is checked against.
|
|
303
|
+
todaysRate: async () => (await toPortfolio(1, heldCurrencyUnit(currency).currency))
|
|
304
|
+
/ heldCurrencyUnit(currency).divisor * heldCurrencyUnit(portfolioCurrency).divisor,
|
|
305
|
+
});
|
|
306
|
+
const costFx = bought ? bought.costFx : !rateText && opened.costFx ? null : undefined;
|
|
307
|
+
result = setManualPortfolioPosition(ticker, portfolio.id, {
|
|
308
|
+
shares,
|
|
309
|
+
avgCost,
|
|
310
|
+
currency,
|
|
311
|
+
...(size ? { multiplier: size.multiplier } : {}),
|
|
312
|
+
...(dateAcquired !== undefined ? { dateAcquired } : {}),
|
|
313
|
+
...(costFx !== undefined ? { costFx } : {}),
|
|
314
|
+
});
|
|
315
|
+
} catch (error) {
|
|
316
|
+
// The form shows one message: what is wrong, then what to give instead.
|
|
317
|
+
if (error instanceof PositionCostFxError && error.details) throw new Error(`${error.message} ${error.details}`);
|
|
318
|
+
if (error instanceof LotCostFxMergeError) throw new Error(`${error.message} Give its Cost FX or Purchase Date.`);
|
|
319
|
+
throw error;
|
|
320
|
+
}
|
|
281
321
|
await tickerRepository.saveTicker(result.ticker);
|
|
282
322
|
dispatch({ type: "UPDATE_TICKER", ticker: result.ticker });
|
|
283
|
-
const adopted = firstPosition ? adoptFirstPositionCurrency(getState().config, portfolio.id, currency) : null;
|
|
284
323
|
if (adopted) {
|
|
285
324
|
dispatch({ type: "SET_CONFIG", config: adopted });
|
|
286
325
|
persistConfig(adopted);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { TickerRecord } from "../../../types/ticker";
|
|
2
|
-
import { canonicalExchange, parsePublicTickerKey } from "../../../utils/exchanges";
|
|
2
|
+
import { canonicalExchange, parsePublicTickerKey, publicTickerKey } from "../../../utils/exchanges";
|
|
3
3
|
import { resolveCurrencyUnit } from "../../../utils/currency-units";
|
|
4
|
-
import { tickerHasListingSuffix, listingSuffixConflictsWithExchange, listingSuffixExchange } from "../../../sources/listing-symbols";
|
|
4
|
+
import { tickerHasListingSuffix, listingSuffixConflictsWithExchange, listingSuffixExchange, listingSuffixVenue } from "../../../sources/listing-symbols";
|
|
5
5
|
import { classifyInstrumentKind } from "../../../tickers/search/ranking";
|
|
6
6
|
import { searchContractKey } from "../../../tickers/search/identity";
|
|
7
7
|
import type { CollectionKind } from "./tickers";
|
|
@@ -42,6 +42,34 @@ function ownsCollection(ticker: TickerRecord, kind: CollectionKind, collectionId
|
|
|
42
42
|
|| (kind === "portfolio" && ticker.metadata.positions.some((position) => !collectionId || position.portfolio === collectionId));
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
/**
|
|
46
|
+
* The row a research alias under a vendor's suffixed key (GARAN.IS, opened
|
|
47
|
+
* from a link) joins a collection as: its listing's own row, saved under the
|
|
48
|
+
* key GARAN:BIST is saved under, or a new one there. Null for any other row.
|
|
49
|
+
*/
|
|
50
|
+
function listingRow(
|
|
51
|
+
ticker: TickerRecord,
|
|
52
|
+
equivalent: readonly TickerRecord[],
|
|
53
|
+
tickers: ReadonlyMap<string, TickerRecord>,
|
|
54
|
+
): TickerRecord | null {
|
|
55
|
+
if ((ticker.metadata.broker_contracts ?? []).length > 0) return null;
|
|
56
|
+
const parsed = parsePublicTickerKey(ticker.metadata.ticker);
|
|
57
|
+
const venue = listingSuffixVenue(parsed.symbol, parsed.exchange ?? ticker.metadata.exchange);
|
|
58
|
+
if (!venue) return null;
|
|
59
|
+
const own = equivalent.find((candidate) => !tickerHasListingSuffix(parsePublicTickerKey(candidate.metadata.ticker).symbol));
|
|
60
|
+
if (own) return own;
|
|
61
|
+
const onVenue = (row: TickerRecord | undefined) => !!row && canonicalExchange(row.metadata.exchange) === venue.exchange;
|
|
62
|
+
const bare = tickers.get(venue.symbol);
|
|
63
|
+
const venueKey = publicTickerKey(venue.symbol, venue.exchange);
|
|
64
|
+
if (onVenue(bare)) return bare!;
|
|
65
|
+
if (onVenue(tickers.get(venueKey))) return tickers.get(venueKey)!;
|
|
66
|
+
// A new row takes the key adding GARAN:BIST takes: the bare symbol while it is free.
|
|
67
|
+
const key = bare ? venueKey : venue.symbol;
|
|
68
|
+
if (tickers.has(key)) return null;
|
|
69
|
+
const { mergedLots: _lots, ...metadata } = ticker.metadata;
|
|
70
|
+
return { metadata: { ...metadata, ticker: key, exchange: venue.exchange, portfolios: [], watchlists: [], positions: [], tags: [], custom: {} } };
|
|
71
|
+
}
|
|
72
|
+
|
|
45
73
|
/** Research aliases must not hide or duplicate the saved record that owns a holding. */
|
|
46
74
|
export function resolveCollectionTicker(
|
|
47
75
|
ticker: TickerRecord,
|
|
@@ -51,7 +79,7 @@ export function resolveCollectionTicker(
|
|
|
51
79
|
): TickerRecord {
|
|
52
80
|
ticker = tickers.get(ticker.metadata.ticker) ?? ticker;
|
|
53
81
|
const identity = listingIdentity(ticker);
|
|
54
|
-
if (!identity) return ticker;
|
|
82
|
+
if (!identity) return listingRow(ticker, [], tickers) ?? ticker;
|
|
55
83
|
const equivalent = [...new Map([...tickers, [ticker.metadata.ticker, ticker]]).values()]
|
|
56
84
|
.filter((candidate) => listingIdentity(candidate) === identity);
|
|
57
85
|
const owners = equivalent.filter((candidate) => ownsCollection(candidate, kind, collectionId));
|
|
@@ -61,5 +89,5 @@ export function resolveCollectionTicker(
|
|
|
61
89
|
// If existing records own different collections, the requested empty record
|
|
62
90
|
// can join a new collection without changing either existing owner.
|
|
63
91
|
const otherOwners = collectionId ? equivalent.filter((candidate) => ownsCollection(candidate, kind)) : [];
|
|
64
|
-
return otherOwners.length === 1 ? otherOwners[0]! : ticker;
|
|
92
|
+
return otherOwners.length === 1 ? otherOwners[0]! : listingRow(ticker, equivalent, tickers) ?? ticker;
|
|
65
93
|
}
|
|
@@ -47,6 +47,12 @@ export function keysClearedByChange(
|
|
|
47
47
|
return clearOnChange && !Object.is(previous, next) ? clearOnChange : [];
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
/** A wizard step's condition as the workflow field's list: one answer, or every one of several. */
|
|
51
|
+
function wizardDependencies(dependsOn: WizardStep["dependsOn"]): FieldDependency[] | undefined {
|
|
52
|
+
if (!dependsOn) return undefined;
|
|
53
|
+
return (Array.isArray(dependsOn) ? dependsOn : [dependsOn]).map(({ key, value }) => ({ key, value }));
|
|
54
|
+
}
|
|
55
|
+
|
|
50
56
|
/** The answer a wizard step starts on: its default, else a select's first option. */
|
|
51
57
|
function wizardStepInitialValue(step: WizardStep): string | undefined {
|
|
52
58
|
if (step.defaultValue) return step.defaultValue;
|
|
@@ -175,7 +181,7 @@ export function normalizeWizardFields(steps: WizardStep[]): {
|
|
|
175
181
|
placeholder: step.placeholder,
|
|
176
182
|
description: step.body?.[0],
|
|
177
183
|
required: step.required !== false,
|
|
178
|
-
dependsOn: step.dependsOn
|
|
184
|
+
dependsOn: wizardDependencies(step.dependsOn),
|
|
179
185
|
clearOnChange: step.clearOnChange,
|
|
180
186
|
});
|
|
181
187
|
continue;
|
|
@@ -188,7 +194,7 @@ export function normalizeWizardFields(steps: WizardStep[]): {
|
|
|
188
194
|
placeholder: step.placeholder,
|
|
189
195
|
description: step.body?.[0],
|
|
190
196
|
required: step.required !== false,
|
|
191
|
-
dependsOn: step.dependsOn
|
|
197
|
+
dependsOn: wizardDependencies(step.dependsOn),
|
|
192
198
|
clearOnChange: step.clearOnChange,
|
|
193
199
|
});
|
|
194
200
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type LayoutConfig, type PaneBinding, type PaneInstanceConfig } from "../../../types/config";
|
|
2
2
|
import type { PaneSettingField, PaneTemplateContext, PaneTemplateCreateOptions, PaneTemplateInstanceConfig, PaneTemplateDef } from "../../../types/plugin";
|
|
3
3
|
import { getFocusedCollectionId, getFocusedTickerSymbol } from "../../../state/app/context";
|
|
4
|
+
import { commandPromptTicker } from "../../../layout/selected-ticker";
|
|
4
5
|
import { resolveInstrumentForPane, resolveListingForPane } from "../../../core/state/app/instrument";
|
|
5
6
|
import { resolveTickerOpenTarget, tickerOpenFailureMessage } from "../../../tickers/open-target";
|
|
6
7
|
import { instrumentFromTicker } from "../../../market-data/request-types";
|
|
@@ -20,7 +21,7 @@ import {
|
|
|
20
21
|
buildRelationshipGraphPaneTitle,
|
|
21
22
|
} from "../../../plugins/builtin/correlation/relationship/model";
|
|
22
23
|
import { buildQuoteMonitorPaneTitle } from "../../../plugins/builtin/ticker-detail/settings";
|
|
23
|
-
import { getPaneTemplateDisplayLabel } from "../pane-templates/items";
|
|
24
|
+
import { getPaneTemplateDisplayLabel, paneTemplateArgError } from "../pane-templates/items";
|
|
24
25
|
import { automationActive, describeUsageFunction, recordFunctionOpen } from "../../../telemetry/usage-counts";
|
|
25
26
|
import { attentionActionForPane, captureAttentionAction } from "../../../telemetry/attention-counts";
|
|
26
27
|
import { publicTickerKey } from "../../../utils/exchanges";
|
|
@@ -101,13 +102,20 @@ async function resolvePaneTemplateOptions(
|
|
|
101
102
|
resolvedOptions: PaneTemplateCreateOptions | undefined;
|
|
102
103
|
}> {
|
|
103
104
|
const state = deps.getState();
|
|
105
|
+
const focusedSymbol = getFocusedTickerSymbol(state);
|
|
106
|
+
// A required ticker follows the prompt, including a linked desk the focused
|
|
107
|
+
// pane does not hold. An optional ticker stays unbound unless one was named.
|
|
108
|
+
const requiresTicker = (template.shortcut?.argPlaceholder === "ticker" || template.shortcut?.argKind === "ticker")
|
|
109
|
+
&& !template.shortcut?.argOptional;
|
|
110
|
+
const prompt = requiresTicker ? commandPromptTicker(state) : null;
|
|
111
|
+
const tickerRootId = prompt?.rootInstanceId ?? state.focusedPaneId;
|
|
104
112
|
const baseContext: PaneTemplateContext = {
|
|
105
113
|
config: state.config,
|
|
106
114
|
layout: state.config.layout,
|
|
107
115
|
focusedPaneId: state.focusedPaneId,
|
|
108
|
-
activeTicker:
|
|
109
|
-
activeInstrument:
|
|
110
|
-
activeListing:
|
|
116
|
+
activeTicker: prompt?.symbol ?? focusedSymbol,
|
|
117
|
+
activeInstrument: tickerRootId ? resolveInstrumentForPane(state, tickerRootId)?.instrument : undefined,
|
|
118
|
+
activeListing: tickerRootId ? resolveListingForPane(state, tickerRootId) : undefined,
|
|
111
119
|
activeCollectionId: getFocusedCollectionId(state),
|
|
112
120
|
};
|
|
113
121
|
|
|
@@ -226,6 +234,12 @@ export async function createPaneTemplateOrThrow(
|
|
|
226
234
|
|
|
227
235
|
const { context, resolvedOptions } = await resolvePaneTemplateOptions(template, options, deps);
|
|
228
236
|
|
|
237
|
+
// A name the function knows nothing of opens nothing, rather than its default view.
|
|
238
|
+
const argError = paneTemplateArgError(template, resolvedOptions?.arg, context);
|
|
239
|
+
if (argError) {
|
|
240
|
+
throw new Error(argError.detail ? `${argError.message}. ${argError.detail}.` : `${argError.message}.`);
|
|
241
|
+
}
|
|
242
|
+
|
|
229
243
|
if (template.canCreate && !template.canCreate(context, resolvedOptions)) {
|
|
230
244
|
throw new Error(uncoveredTemplateMessage(template, deps.pluginRegistry, resolvedOptions)
|
|
231
245
|
?? `Can't create ${getPaneTemplateDisplayLabel(template).toLowerCase()} right now.`);
|
|
@@ -5,6 +5,10 @@ import { t, tf } from "../../../i18n";
|
|
|
5
5
|
import { getManualPortfolioPositionPrefill, type ManualPortfolioPositionPrefill } from "../../../portfolio/manual-lots";
|
|
6
6
|
import { isManualPortfolio, positionQuantityLabel, resolveManualPositionCurrency } from "../../../portfolio/mutations";
|
|
7
7
|
import { futuresLotCurrency, isFuturesTicker } from "../../../portfolio/futures-positions";
|
|
8
|
+
import { sameCurrency } from "../../../portfolio/position-metrics";
|
|
9
|
+
import { resolvePortfolioTotalsCurrency } from "../../../portfolio/totals-currency";
|
|
10
|
+
import type { TickerPosition } from "../../../types/ticker";
|
|
11
|
+
import { DATE_FIELD_EXAMPLES } from "../../../utils/calendar-date";
|
|
8
12
|
import { US_CENTS } from "../../../utils/currency-units";
|
|
9
13
|
|
|
10
14
|
export interface SetPortfolioPositionWorkflowState {
|
|
@@ -24,12 +28,29 @@ interface ManualPortfolioPositionWorkflowOptions {
|
|
|
24
28
|
hidePortfolioFieldWhenSingleOption?: boolean;
|
|
25
29
|
}
|
|
26
30
|
|
|
31
|
+
/**
|
|
32
|
+
* What the Purchase Date and Cost FX fields start from for a holding: its
|
|
33
|
+
* date (several lots, their earliest) and the rate its cost was bought at
|
|
34
|
+
* into the portfolio's currency (several, weighted by cost). Saving them
|
|
35
|
+
* unchanged keeps what the lots have; a rate into another currency is kept
|
|
36
|
+
* without being shown.
|
|
37
|
+
*/
|
|
38
|
+
export function positionCostTermsPrefill(position: TickerPosition | null | undefined, portfolioCurrency: string): { dateAcquired: string; costFx: string } {
|
|
39
|
+
const rate = position?.costFxRate;
|
|
40
|
+
const shown = typeof rate === "number" && Number.isFinite(rate) && rate > 0 && position?.costFxCurrency?.trim().toUpperCase() === portfolioCurrency;
|
|
41
|
+
// A cross rate carries float noise (0.012625500000000001): shown to ten digits, kept exact when left as it opened.
|
|
42
|
+
return { dateAcquired: position?.dateAcquired ?? "", costFx: shown ? String(Number(rate.toPrecision(10))) : "" };
|
|
43
|
+
}
|
|
44
|
+
|
|
27
45
|
/** Several lots become one position on save: say so, and what the fields hold. */
|
|
28
46
|
function lotsReplacementHint(prefill: ManualPortfolioPositionPrefill, portfolioName: string): string | undefined {
|
|
29
47
|
if (prefill.lotCount < 2) return undefined;
|
|
30
48
|
const params = { count: prefill.lotCount, portfolio: portfolioName };
|
|
49
|
+
if (prefill.position && prefill.costFxConflict) {
|
|
50
|
+
return tf("Totals of your {count} lots in \"{portfolio}\", bought at FX rates one position cannot keep: give its Cost FX or Purchase Date. Saving replaces them with one position.", params);
|
|
51
|
+
}
|
|
31
52
|
if (prefill.position) {
|
|
32
|
-
return tf("Totals of your {count} lots in \"{portfolio}\". Saving replaces them with one position
|
|
53
|
+
return tf("Totals of your {count} lots in \"{portfolio}\". Saving replaces them with one position, dated by the earliest.", params);
|
|
33
54
|
}
|
|
34
55
|
return prefill.currencies
|
|
35
56
|
? tf("{count} lots in \"{portfolio}\" are in different currencies ({currencies}), so none is filled in. Saving replaces them with one position.", {
|
|
@@ -56,6 +77,13 @@ function buildManualPortfolioPositionWorkflow(
|
|
|
56
77
|
// A future's cost is typed as it is quoted, which for corn is cents: what a blank currency then saves.
|
|
57
78
|
const contractCurrency = options.ticker && isFuturesTicker(options.ticker)
|
|
58
79
|
&& options.quoteCurrency?.trim().toUpperCase() === US_CENTS ? US_CENTS : undefined;
|
|
80
|
+
// What a blank currency saves, and the currency the portfolio values it in: the rate's units.
|
|
81
|
+
const blankCurrency = options.ticker
|
|
82
|
+
? resolveManualPositionCurrency(undefined, options.ticker, preferredPortfolio, config.baseCurrency, contractCurrency)
|
|
83
|
+
: undefined;
|
|
84
|
+
const portfolioCurrency = resolvePortfolioTotalsCurrency(preferredPortfolio, config.baseCurrency);
|
|
85
|
+
const heldCurrency = (preferredPosition ? futuresLotCurrency(preferredPosition, contractCurrency) : undefined) ?? blankCurrency;
|
|
86
|
+
const costTerms = positionCostTermsPrefill(preferredPosition, portfolioCurrency);
|
|
59
87
|
|
|
60
88
|
const fields: CommandBarWorkflowField[] = [
|
|
61
89
|
...(showPortfolioField ? [{
|
|
@@ -98,9 +126,28 @@ function buildManualPortfolioPositionWorkflow(
|
|
|
98
126
|
type: "text",
|
|
99
127
|
// What a blank field saves: the ticker's own currency before the
|
|
100
128
|
// portfolio's. Without a ticker yet there is nothing true to show.
|
|
101
|
-
placeholder:
|
|
102
|
-
|
|
103
|
-
|
|
129
|
+
placeholder: blankCurrency,
|
|
130
|
+
required: false,
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
id: "dateAcquired",
|
|
134
|
+
label: "Purchase Date",
|
|
135
|
+
type: "text",
|
|
136
|
+
placeholder: DATE_FIELD_EXAMPLES,
|
|
137
|
+
required: false,
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
id: "costFx",
|
|
141
|
+
label: "Cost FX",
|
|
142
|
+
type: "number",
|
|
143
|
+
// What a blank field saves, as `position set` without --cost-fx does.
|
|
144
|
+
placeholder: t("The purchase date's close, else today's rate"),
|
|
145
|
+
// The rate's units, in context: the portfolio's currency per unit of the holding's.
|
|
146
|
+
description: heldCurrency && sameCurrency(heldCurrency, portfolioCurrency)
|
|
147
|
+
? t("Only for a holding in another currency than the portfolio's.")
|
|
148
|
+
: heldCurrency
|
|
149
|
+
? tf("{portfolio} per {holding} when bought.", { portfolio: portfolioCurrency, holding: heldCurrency })
|
|
150
|
+
: tf("{portfolio} per unit of the holding's currency when bought.", { portfolio: portfolioCurrency }),
|
|
104
151
|
required: false,
|
|
105
152
|
},
|
|
106
153
|
];
|
|
@@ -116,6 +163,8 @@ function buildManualPortfolioPositionWorkflow(
|
|
|
116
163
|
: "",
|
|
117
164
|
// A corn lot saved before contract sizes, in dollars, is read in cents: saving the form unchanged keeps it so.
|
|
118
165
|
currency: (preferredPosition ? futuresLotCurrency(preferredPosition, contractCurrency) : undefined) ?? "",
|
|
166
|
+
dateAcquired: costTerms.dateAcquired,
|
|
167
|
+
costFx: costTerms.costFx,
|
|
119
168
|
};
|
|
120
169
|
|
|
121
170
|
return {
|
|
@@ -158,8 +158,9 @@ export async function submitCommandBarWorkflow(options: {
|
|
|
158
158
|
break;
|
|
159
159
|
}
|
|
160
160
|
case "add-portfolio": {
|
|
161
|
-
|
|
162
|
-
|
|
161
|
+
// A purchase date or rate typed without a size is a position to set, whose missing size is then refused.
|
|
162
|
+
const position = ["shares", "dateAcquired", "costFx"].some((id) => coerceFieldString(route.values[id]).trim());
|
|
163
|
+
if (!position) {
|
|
163
164
|
await collectionWorkflowActions.addTickerMembershipFromWorkflow(route.values);
|
|
164
165
|
} else {
|
|
165
166
|
await collectionWorkflowActions.setPortfolioPositionFromWorkflow(route.values);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { indexRootSuggestion } from "../../../tickers/index-roots";
|
|
1
2
|
import type { Dispatch } from "react";
|
|
2
3
|
import type { AppAction, AppState } from "../../../state/app/context";
|
|
3
4
|
import type { AppTickerRepositoryPort } from "../../../core/app-service-ports";
|
|
@@ -203,7 +204,10 @@ export async function resolveTickerInputOrThrow(
|
|
|
203
204
|
): Promise<ResolvedTickerInput> {
|
|
204
205
|
const resolved = await resolveTickerInput(rawInput, activeTicker, collectionId, deps, { ...options, throwUnresolved: true });
|
|
205
206
|
if (!resolved) {
|
|
206
|
-
|
|
207
|
+
const typed = rawInput ?? activeTicker ?? "";
|
|
208
|
+
// A bare index root (VIX) is quoted as ^VIX, which the message offers.
|
|
209
|
+
const suggestion = indexRootSuggestion(typed.trim());
|
|
210
|
+
throw new Error(`No ticker match found for "${typed}".${suggestion ? ` ${suggestion}` : ""}`);
|
|
207
211
|
}
|
|
208
212
|
return resolved;
|
|
209
213
|
}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import { createElement } from "react";
|
|
1
2
|
import { Box, ImageSurface, Text, TextAttributes, useUiCapabilities } from "../ui";
|
|
2
3
|
import { cloudLogoPath, type CloudLogoKind } from "../api-client/paths";
|
|
3
4
|
import { getCloudApiBaseUrl } from "../api-client/request";
|
|
4
5
|
import { resolveAssetDisplayKind } from "../market-data/market/format";
|
|
5
6
|
import { colors } from "../theme/colors";
|
|
7
|
+
import type { DataTableCell } from "./ui/data-table";
|
|
8
|
+
import { LogoMark, type LogoMarkProps } from "./ui/logo-mark";
|
|
6
9
|
|
|
7
10
|
export function resolveCompanyLogoSrc(input: {
|
|
8
11
|
symbol: string;
|
|
@@ -14,6 +17,42 @@ export function resolveCompanyLogoSrc(input: {
|
|
|
14
17
|
return path ? `${getCloudApiBaseUrl()}${path}` : null;
|
|
15
18
|
}
|
|
16
19
|
|
|
20
|
+
/** What a row's logo stands for: a company's listing or a coin. */
|
|
21
|
+
export interface CompanyLogoSubject {
|
|
22
|
+
symbol: string;
|
|
23
|
+
/** `CRYPTO` draws the coin's logo; any other listing but cash and contracts, the company's. */
|
|
24
|
+
assetCategory?: string;
|
|
25
|
+
/** Its initial stands in while there is no logo; the symbol's without a name. */
|
|
26
|
+
name?: string | null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* A company's or a coin's logo on a `LogoMark` tile, on the desktop and the
|
|
31
|
+
* web: the logo Gloom Cloud serves for its ticker, and its initial on the
|
|
32
|
+
* same tile when there is none, so a missing logo moves nothing.
|
|
33
|
+
*/
|
|
34
|
+
export function CompanyLogoMark({ symbol, assetCategory, name, size }: CompanyLogoSubject & Pick<LogoMarkProps, "size">) {
|
|
35
|
+
return createElement(LogoMark, {
|
|
36
|
+
src: resolveCompanyLogoSrc({ symbol, assetCategory }),
|
|
37
|
+
name: name?.trim() || symbol,
|
|
38
|
+
size,
|
|
39
|
+
plate: true,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The cell that names a company or a coin in a table, led by its logo on the
|
|
45
|
+
* desktop and the web (docs/pane-conventions.md, "Company and coin logos").
|
|
46
|
+
* The terminal gets the cell as it was, and exports read only its text.
|
|
47
|
+
*/
|
|
48
|
+
export function withCompanyLogo(cell: DataTableCell, subject: CompanyLogoSubject | null | undefined, desktop: boolean): DataTableCell {
|
|
49
|
+
if (!desktop || !subject?.symbol) return cell;
|
|
50
|
+
return {
|
|
51
|
+
...cell,
|
|
52
|
+
leading: createElement(CompanyLogoMark, { symbol: subject.symbol, assetCategory: subject.assetCategory, name: subject.name ?? cell.text }),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
17
56
|
export function CompanyLogo({
|
|
18
57
|
symbol,
|
|
19
58
|
assetCategory,
|
|
@@ -12,6 +12,8 @@ import type { DataTableSectionHeader } from "../ui/data-table";
|
|
|
12
12
|
|
|
13
13
|
export interface TableSection<T> {
|
|
14
14
|
label: string;
|
|
15
|
+
/** Tells apart two sections under one label (a month split by today); the label by default. */
|
|
16
|
+
key?: string;
|
|
15
17
|
items: T[];
|
|
16
18
|
/** Kept even with no items, to show the section exists. */
|
|
17
19
|
emptyLabel?: string;
|
|
@@ -32,9 +34,9 @@ export function buildSectionedRows<T>(
|
|
|
32
34
|
return sections.flatMap((section) => {
|
|
33
35
|
if (section.items.length === 0 && !section.emptyLabel) return [];
|
|
34
36
|
return [
|
|
35
|
-
{ kind: "section" as const, key: `section:${section.label}`, label: section.label, count: section.items.length },
|
|
37
|
+
{ kind: "section" as const, key: `section:${section.key ?? section.label}`, label: section.label, count: section.items.length },
|
|
36
38
|
...(section.items.length === 0
|
|
37
|
-
? [{ kind: "empty" as const, key: `empty:${section.label}`, label: section.emptyLabel! }]
|
|
39
|
+
? [{ kind: "empty" as const, key: `empty:${section.key ?? section.label}`, label: section.emptyLabel! }]
|
|
38
40
|
: section.items.map((item) => ({ kind: "item" as const, key: getItemKey(item), item }))),
|
|
39
41
|
];
|
|
40
42
|
});
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
import type { ScrollBoxRenderable } from "../../ui";
|
|
12
12
|
import { useBeforeShortcut, useShortcut } from "../../react/input";
|
|
13
13
|
import { isPlainKey, isPlainKeyboardEvent } from "../../utils/keyboard";
|
|
14
|
-
import { DataTable, type DataTableColumn, type DataTableProps } from "../ui";
|
|
14
|
+
import { DataTable, PaneStatusBody, type DataTableColumn, type DataTableProps, type PaneStatusBodyProps } from "../ui";
|
|
15
15
|
import { useDataTableSortMenu } from "./sort-menu";
|
|
16
16
|
import {
|
|
17
17
|
TableViewFrame,
|
|
@@ -89,6 +89,19 @@ export type DataTableSelection<T> =
|
|
|
89
89
|
) => void;
|
|
90
90
|
};
|
|
91
91
|
|
|
92
|
+
/**
|
|
93
|
+
* What the table's body shows instead of rows while it has none to show: its
|
|
94
|
+
* first page loading after a tab or filter change, a failed load, a state
|
|
95
|
+
* with nothing to list. The same states `PaneStatusBody` draws, in the
|
|
96
|
+
* table's place under `rootBefore`, so the query bar and figures above stay
|
|
97
|
+
* on screen (and a search field keeps its focus) while the body waits.
|
|
98
|
+
*/
|
|
99
|
+
export type DataTableBodyStatus = Omit<PaneStatusBodyProps, "children" | "width" | "height" | "align">;
|
|
100
|
+
|
|
101
|
+
function bodyStatusShown(status: DataTableBodyStatus | undefined): status is DataTableBodyStatus {
|
|
102
|
+
return !!status && (!!status.error || status.loading === true || status.empty === true);
|
|
103
|
+
}
|
|
104
|
+
|
|
92
105
|
interface SelectionCommitTarget {
|
|
93
106
|
index: number;
|
|
94
107
|
id?: string;
|
|
@@ -124,6 +137,12 @@ export interface DataTableViewProps<
|
|
|
124
137
|
isNavigable?: (item: T, index: number) => boolean;
|
|
125
138
|
rootBefore?: ReactNode;
|
|
126
139
|
rootAfter?: ReactNode;
|
|
140
|
+
/**
|
|
141
|
+
* Replaces the table (header and rows) with a loading, error or empty
|
|
142
|
+
* state while `rootBefore` stays. Precedence is the caller's, as with
|
|
143
|
+
* `PaneStatusBody`: pass `loading` only while there is nothing to show.
|
|
144
|
+
*/
|
|
145
|
+
status?: DataTableBodyStatus;
|
|
127
146
|
rootWidth?: number;
|
|
128
147
|
rootHeight?: number;
|
|
129
148
|
rootBackgroundColor?: string;
|
|
@@ -165,6 +184,7 @@ export function DataTableView<
|
|
|
165
184
|
isNavigable,
|
|
166
185
|
rootBefore,
|
|
167
186
|
rootAfter,
|
|
187
|
+
status,
|
|
168
188
|
rootWidth,
|
|
169
189
|
rootHeight,
|
|
170
190
|
rootBackgroundColor,
|
|
@@ -728,7 +748,7 @@ export function DataTableView<
|
|
|
728
748
|
before={rootBefore}
|
|
729
749
|
after={rootAfter}
|
|
730
750
|
>
|
|
731
|
-
<DataTable<T, C>
|
|
751
|
+
{bodyStatusShown(status) ? <PaneStatusBody {...status} /> : <DataTable<T, C>
|
|
732
752
|
{...tableProps}
|
|
733
753
|
headerScrollRef={effectiveHeaderScrollRef}
|
|
734
754
|
scrollRef={effectiveScrollRef}
|
|
@@ -741,7 +761,7 @@ export function DataTableView<
|
|
|
741
761
|
onActivate={handleTableActivate}
|
|
742
762
|
onRowMouseDown={handleRowMouseDown}
|
|
743
763
|
onRowContextMenu={handleRowContextMenu}
|
|
744
|
-
/>
|
|
764
|
+
/>}
|
|
745
765
|
</TableViewFrame>
|
|
746
766
|
);
|
|
747
767
|
}
|
|
@@ -74,7 +74,8 @@ export function ConfirmModalContent({
|
|
|
74
74
|
pendingRef.current = false;
|
|
75
75
|
if (!mountedRef.current) {
|
|
76
76
|
// Closed while it ran: the inline error has nowhere to go.
|
|
77
|
-
|
|
77
|
+
if (confirm.onFailureAfterClose) confirm.onFailureAfterClose(failure);
|
|
78
|
+
else runtime.getDeps().pluginRegistry.notify({ body: errorMessage(failure), type: "error" });
|
|
78
79
|
return;
|
|
79
80
|
}
|
|
80
81
|
setPending(false);
|
|
@@ -24,6 +24,11 @@ export interface ConfirmModalOptions {
|
|
|
24
24
|
* when the confirm was closed before the work finished.
|
|
25
25
|
*/
|
|
26
26
|
onSuccess?: () => void;
|
|
27
|
+
/**
|
|
28
|
+
* Says what `onConfirm` threw once the confirm was closed and cannot say it
|
|
29
|
+
* inline: on the row it concerns, say. A toast when missing.
|
|
30
|
+
*/
|
|
31
|
+
onFailureAfterClose?: (failure: unknown) => void;
|
|
27
32
|
}
|
|
28
33
|
|
|
29
34
|
/**
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
getFocusedTickerSymbol,
|
|
8
8
|
type AppState,
|
|
9
9
|
} from "../../state/app/context";
|
|
10
|
+
import { commandPromptTicker } from "../../layout/selected-ticker";
|
|
10
11
|
import type { CommandDef, PaneTemplateCreateOptions } from "../../types/plugin";
|
|
11
12
|
import type { TickerRecord } from "../../types/ticker";
|
|
12
13
|
import { buildPaneTemplateWorkflowRoute } from "../command-bar/pane-templates/workflow-route";
|
|
@@ -142,8 +143,10 @@ export function buildPaneTemplateFormRoute(
|
|
|
142
143
|
): FormRouteResult {
|
|
143
144
|
const template = pluginRegistry.paneTemplates.get(templateId);
|
|
144
145
|
if (!template) return { kind: "none" };
|
|
146
|
+
const requiresTicker = (template.shortcut?.argPlaceholder === "ticker" || template.shortcut?.argKind === "ticker")
|
|
147
|
+
&& !template.shortcut?.argOptional;
|
|
145
148
|
const route = buildPaneTemplateWorkflowRoute({
|
|
146
|
-
activeTicker: getFocusedTickerSymbol(state),
|
|
149
|
+
activeTicker: (requiresTicker ? commandPromptTicker(state)?.symbol : null) ?? getFocusedTickerSymbol(state),
|
|
147
150
|
arg,
|
|
148
151
|
template,
|
|
149
152
|
});
|
package/src/components/index.ts
CHANGED
|
@@ -12,11 +12,11 @@ export { CompositeChart, pricePointsToResolvedSeries } from "./chart/composite";
|
|
|
12
12
|
// Figures, then a chart, then a table: the header zone, its size rule at every
|
|
13
13
|
// pane size, and the selection the chart and the table share.
|
|
14
14
|
export {
|
|
15
|
-
ChartStrip, ChartTableHeader, chartTableChromeRows, chartTableLayout, formatBpAxis, formatPercentAxis,
|
|
16
|
-
spanAxisFormatter, spanDigits, useChartTableLayout, useChartTableSelection,
|
|
15
|
+
ChartRead, ChartStrip, ChartTableHeader, chartTableChromeRows, chartTableLayout, formatBpAxis, formatPercentAxis,
|
|
16
|
+
spanAxisFormatter, spanDigits, useChartReadRows, useChartTableLayout, useChartTableSelection,
|
|
17
17
|
} from "./chart-table";
|
|
18
18
|
export type {
|
|
19
|
-
ChartBandMode, ChartStripSpec, ChartTableChart, ChartTableHeaderProps, ChartTableLayout,
|
|
19
|
+
ChartBandMode, ChartReadProps, ChartStripSpec, ChartTableChart, ChartTableHeaderProps, ChartTableLayout,
|
|
20
20
|
ChartTableSelection,
|
|
21
21
|
} from "./chart-table";
|
|
22
22
|
export { scalarPoint, stackedSeries, staticSeries, type StackedLayer } from "./chart/static/series";
|
|
@@ -67,6 +67,7 @@ export { usePagedRows } from "./paged-rows";
|
|
|
67
67
|
export type { PageLoader, PageRequest, PagedRows, PagedRowsOptions, RowPage } from "./paged-rows";
|
|
68
68
|
export { DataTableView } from "./data-table/view";
|
|
69
69
|
export type {
|
|
70
|
+
DataTableBodyStatus,
|
|
70
71
|
DataTableKeyEvent,
|
|
71
72
|
DataTableRootKeyContext,
|
|
72
73
|
DataTableSelectionChangeReason,
|
|
@@ -86,6 +87,11 @@ export { DataTableStackView } from "./data-table/stack-view";
|
|
|
86
87
|
// table re-render on selection or scroll does not redo all of it.
|
|
87
88
|
export { createRowValueCache } from "./ui/row-value-cache";
|
|
88
89
|
export type { RowValueCache } from "./ui/row-value-cache";
|
|
90
|
+
// What the last action on one row came to, kept for that row until the next
|
|
91
|
+
// action on it or until its own status moves on (docs/pane-conventions.md,
|
|
92
|
+
// "Row messages"): its status cell says it, never the footer or a toast.
|
|
93
|
+
export { useRowNotes } from "./ui/row-notes";
|
|
94
|
+
export type { RowNotes } from "./ui/row-notes";
|
|
89
95
|
export { FeedDataTableStackView } from "./feed-data-table/stack-view";
|
|
90
96
|
export type { FeedDataTableItem } from "./feed-data-table/stack-view";
|
|
91
97
|
export { activeStackIndex, sortStackItems } from "./feed-stack-controller";
|
|
@@ -127,7 +133,8 @@ export { MarkdownText } from "./markdown-text";
|
|
|
127
133
|
// this file is the public `gloomberb/components` surface: a kit component
|
|
128
134
|
// reaches plugins only once it is added here.
|
|
129
135
|
export {
|
|
130
|
-
ActionRow, Badge, BulletList, Button, ButtonActionScope, Card, Checkbox, ChoiceDialog, ColumnGrid, ColumnGridPair, ConfirmDialog, confirmDialog,
|
|
136
|
+
ActionRow, Badge, BulletList, Button, ButtonActionScope, Card, Checkbox, ChoiceDialog, ColumnGrid, ColumnGridPair, ConfirmDialog, confirmDialog,
|
|
137
|
+
COUNTRY_FLAG_CELLS, CountryFlag, CountryFlagLead, DataTable,
|
|
131
138
|
DetailScrollBody, DialogFrame, DisclosureMarker, Divider, EmptyState, ExternalLink, ExternalLinkText, FieldGrid, FieldLabel,
|
|
132
139
|
fieldFrameStyle, fieldGridColumns, FRAMED_TEXTAREA_DESKTOP_STYLE, fieldGridRows, FigureList, getMessageComposerBlockHeight, GridFieldView, Icon, ICON_GLYPHS,
|
|
133
140
|
IconButton, InlineQuickAddRow, KeyValueRow, ListView, loadingText, Menu, MenuPopover,
|
|
@@ -135,11 +142,11 @@ export {
|
|
|
135
142
|
NumberPromptDialog, openUrl, PageStackView, PaneLinkMenu, PaneStatusBody, Popover, Prose,
|
|
136
143
|
QueryBar, RangeTrack, RatioBar, READING_WIDTH, RemoteImage, Section, SectionHeading, SegmentedControl, SelectButton, ShortcutHint,
|
|
137
144
|
Spinner, StatGrid, statGridColumns, statGridRows, Tabs, TextField, TextPromptDialog, unavailableText,
|
|
138
|
-
useFieldRing, usePaneLinkMenuEntry, useQueryBarSearch,
|
|
145
|
+
useFieldRing, usePaneLinkMenuEntry, useQueryBarSearch, withCountryFlag, withFlagRoom,
|
|
139
146
|
} from "./ui";
|
|
140
147
|
export type {
|
|
141
148
|
ActionRowProps, BadgeProps, BulletListProps, ButtonProps, ButtonVariant, CardProps, CheckboxProps, ChoiceDialogChoice, ColumnGridCell,
|
|
142
|
-
ColumnGridColumn, ColumnGridPairProps, ColumnGridProps, ConfirmDialogOptions,
|
|
149
|
+
ColumnGridColumn, ColumnGridLink, ColumnGridPairProps, ColumnGridProps, ConfirmDialogOptions, CountryFlagProps,
|
|
143
150
|
DataTableCell, DataTableColumn, DataTableProps, DataTableVisibleRange, DetailScrollBodyProps, DialogFrameProps,
|
|
144
151
|
DisclosureMarkerProps, DividerProps, EmptyStateProps, FieldGridProps, FieldLabelProps, FieldRing, FieldRingOptions,
|
|
145
152
|
FigureListItem, FigureListProps, GridField,
|
|
@@ -441,6 +441,7 @@ export function DetachedPaneShell({ pluginRegistry, desktopWindowBridge }: Detac
|
|
|
441
441
|
onMouseDown: () => toggleQuickSetting(setting.key),
|
|
442
442
|
}))}
|
|
443
443
|
tabs={headerTabs}
|
|
444
|
+
bodyBackground={background}
|
|
444
445
|
titleBar={{
|
|
445
446
|
rows: headerHeightRows,
|
|
446
447
|
overlay: titleBarOverlay === true,
|