@perspective-dev/viewer 4.5.2 → 5.1.0

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.
Files changed (227) hide show
  1. package/dist/cdn/perspective-viewer.js +20 -1
  2. package/dist/cdn/perspective-viewer.js.map +4 -4
  3. package/dist/css/botanical.css +1 -1
  4. package/dist/css/dracula.css +1 -1
  5. package/dist/css/gruvbox-dark.css +1 -1
  6. package/dist/css/gruvbox.css +1 -1
  7. package/dist/css/icons.css +1 -1
  8. package/dist/css/intl/de.css +1 -1
  9. package/dist/css/intl/es.css +1 -1
  10. package/dist/css/intl/fr.css +1 -1
  11. package/dist/css/intl/ja.css +1 -1
  12. package/dist/css/intl/pt.css +1 -1
  13. package/dist/css/intl/zh.css +1 -1
  14. package/dist/css/intl.css +1 -1
  15. package/dist/css/monokai.css +1 -1
  16. package/dist/css/phosphor.css +1 -1
  17. package/dist/css/pro-dark.css +1 -1
  18. package/dist/css/pro.css +1 -1
  19. package/dist/css/solarized-dark.css +1 -1
  20. package/dist/css/solarized.css +1 -1
  21. package/dist/css/themes.css +1 -1
  22. package/dist/css/vaporwave.css +1 -1
  23. package/dist/esm/extensions.d.ts +22 -3
  24. package/dist/esm/perspective-viewer.d.ts +9 -0
  25. package/dist/esm/perspective-viewer.inline.js +20 -1
  26. package/dist/esm/perspective-viewer.inline.js.map +4 -4
  27. package/dist/esm/perspective-viewer.js +20 -1
  28. package/dist/esm/perspective-viewer.js.map +4 -4
  29. package/dist/esm/plugin.d.ts +71 -5
  30. package/dist/esm/ts-rs/ClientOptions.d.ts +7 -0
  31. package/dist/esm/ts-rs/ExportMethod.d.ts +1 -0
  32. package/dist/esm/ts-rs/ExportOptions.d.ts +9 -0
  33. package/dist/esm/ts-rs/GetClientOptions.d.ts +8 -0
  34. package/dist/esm/ts-rs/GetTableOptions.d.ts +8 -0
  35. package/dist/esm/ts-rs/Layout.d.ts +11 -0
  36. package/dist/esm/ts-rs/Orientation.d.ts +4 -0
  37. package/dist/esm/ts-rs/PanelOptions.d.ts +7 -0
  38. package/dist/esm/ts-rs/PanelViewerConfig.d.ts +41 -0
  39. package/dist/esm/ts-rs/SplitLayout.d.ts +7 -0
  40. package/dist/esm/ts-rs/TabLayout.d.ts +10 -0
  41. package/dist/esm/ts-rs/ViewerConfig.d.ts +8 -2
  42. package/dist/esm/ts-rs/ViewerConfigUpdate.d.ts +9 -0
  43. package/dist/esm/ts-rs/WindowAggregate.d.ts +1 -0
  44. package/dist/esm/ts-rs/WindowSort.d.ts +7 -0
  45. package/dist/esm/ts-rs/WindowSortDir.d.ts +6 -0
  46. package/dist/esm/ts-rs/WindowSpec.d.ts +46 -0
  47. package/dist/esm/ts-rs/Windows.d.ts +10 -0
  48. package/dist/esm/ts-rs/WorkspaceConfig.d.ts +40 -0
  49. package/dist/esm/ts-rs/WorkspaceConfigUpdate.d.ts +28 -0
  50. package/dist/wasm/perspective-viewer.d.ts +299 -78
  51. package/dist/wasm/perspective-viewer.js +544 -186
  52. package/dist/wasm/perspective-viewer.wasm +0 -0
  53. package/dist/wasm/perspective-viewer.wasm.d.ts +34 -26
  54. package/dist/wasm/snippets/perspective-viewer-8a8c7d5d696b43ae/inline0.js +6 -0
  55. package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline3.js → perspective-viewer-8a8c7d5d696b43ae/inline4.js} +5 -0
  56. package/package.json +3 -2
  57. package/src/css/_context_menu.css +14 -0
  58. package/src/css/column-selector.css +1 -0
  59. package/src/css/column-settings-panel.css +68 -3
  60. package/src/css/column-style.css +4 -3
  61. package/src/css/config-selector.css +22 -1
  62. package/src/css/containers/context-menu.css +107 -0
  63. package/src/css/containers/tabs.css +2 -2
  64. package/src/css/panel-tab.css +193 -0
  65. package/src/css/plugin-selector.css +7 -10
  66. package/src/css/status-bar.css +75 -81
  67. package/src/css/viewer.css +188 -70
  68. package/src/rust/components/column_dropdown.rs +40 -30
  69. package/src/rust/components/column_selector/active_column.rs +28 -45
  70. package/src/rust/components/column_selector/aggregate_selector.rs +4 -7
  71. package/src/rust/components/column_selector/column_selector_column_row.rs +73 -0
  72. package/src/rust/components/column_selector/config_selector.rs +40 -82
  73. package/src/rust/components/column_selector/expr_edit_button.rs +7 -1
  74. package/src/rust/components/column_selector/filter_column.rs +5 -15
  75. package/src/rust/components/column_selector/inactive_column.rs +11 -9
  76. package/src/rust/components/column_selector/sort_column.rs +3 -6
  77. package/src/rust/components/column_selector.rs +25 -14
  78. package/src/rust/components/column_settings_sidebar/style_tab.rs +2 -1
  79. package/src/rust/components/column_settings_sidebar/window_tab.rs +34 -0
  80. package/src/rust/components/column_settings_sidebar.rs +163 -16
  81. package/src/rust/components/containers/dragdrop_list.rs +73 -3
  82. package/src/rust/components/containers/sidebar.rs +99 -22
  83. package/src/rust/components/containers/split_panel.rs +181 -62
  84. package/src/rust/components/context_menu.rs +130 -0
  85. package/src/rust/components/editable_header.rs +2 -0
  86. package/src/rust/components/form/debug.rs +3 -0
  87. package/src/rust/components/global_filter_bar.rs +76 -0
  88. package/src/rust/components/main_panel/frame_theme.rs +186 -0
  89. package/src/rust/components/main_panel/msg.rs +62 -0
  90. package/src/rust/components/main_panel/presize.rs +220 -0
  91. package/src/rust/components/main_panel/reconcile.rs +224 -0
  92. package/src/rust/components/main_panel/render.rs +385 -0
  93. package/src/rust/components/main_panel/update.rs +184 -0
  94. package/src/rust/components/main_panel.rs +316 -71
  95. package/src/rust/components/mod.rs +5 -0
  96. package/src/rust/components/panel_menu.rs +493 -0
  97. package/src/rust/components/panel_tab.rs +510 -0
  98. package/src/rust/components/plugin_tab.rs +1 -1
  99. package/src/rust/components/portal.rs +7 -0
  100. package/src/rust/components/settings_panel.rs +13 -5
  101. package/src/rust/components/status_bar.rs +110 -178
  102. package/src/rust/components/status_indicator.rs +6 -9
  103. package/src/rust/components/style/mod.rs +5 -0
  104. package/src/rust/components/style/style_provider.rs +2 -0
  105. package/src/rust/components/viewer/filters.rs +133 -0
  106. package/src/rust/components/viewer/msg.rs +182 -0
  107. package/src/rust/components/viewer/panels.rs +326 -0
  108. package/src/rust/components/viewer/render.rs +255 -0
  109. package/src/rust/components/viewer/settings.rs +434 -0
  110. package/src/rust/components/viewer/snapshots.rs +134 -0
  111. package/src/rust/components/viewer/wiring.rs +505 -0
  112. package/src/rust/components/viewer.rs +245 -756
  113. package/src/rust/components/window_editor.rs +1013 -0
  114. package/src/rust/config/export_method.rs +1 -1
  115. package/src/rust/config/mod.rs +4 -0
  116. package/src/rust/config/options.rs +71 -0
  117. package/src/rust/config/viewer_config.rs +24 -2
  118. package/src/rust/config/workspace_config.rs +92 -0
  119. package/src/rust/custom_elements/copy_dropdown.rs +3 -1
  120. package/src/rust/custom_elements/debug_plugin.rs +20 -1
  121. package/src/rust/custom_elements/export_dropdown.rs +3 -1
  122. package/src/rust/custom_elements/viewer.rs +1015 -286
  123. package/src/rust/custom_events.rs +212 -61
  124. package/src/rust/js/mod.rs +2 -0
  125. package/src/rust/js/plugin.rs +297 -10
  126. package/src/rust/js/regular_layout.rs +258 -0
  127. package/src/rust/lib.rs +24 -2
  128. package/src/rust/presentation/column_locator.rs +16 -1
  129. package/src/rust/presentation.rs +66 -33
  130. package/src/rust/queries/columns_iter_set.rs +7 -1
  131. package/src/rust/queries/get_viewer_config.rs +29 -11
  132. package/src/rust/queries/plugin_column_styles.rs +2 -2
  133. package/src/rust/renderer/activate.rs +41 -14
  134. package/src/rust/renderer/dispatch.rs +463 -0
  135. package/src/rust/renderer/plugin_config.rs +495 -0
  136. package/src/rust/renderer/registry.rs +18 -6
  137. package/src/rust/renderer/render_timer.rs +29 -10
  138. package/src/rust/renderer.rs +384 -838
  139. package/src/rust/session/column_defaults_update.rs +26 -8
  140. package/src/rust/session/drag_drop_update.rs +18 -0
  141. package/src/rust/session/metadata.rs +66 -9
  142. package/src/rust/session/replace_expression_update.rs +1 -0
  143. package/src/rust/session/view_subscription.rs +30 -15
  144. package/src/rust/session.rs +755 -264
  145. package/src/rust/tasks/apply_global_filters.rs +89 -0
  146. package/src/rust/tasks/auto_pause.rs +171 -0
  147. package/src/rust/tasks/copy_export.rs +29 -19
  148. package/src/rust/tasks/create_panel.rs +243 -0
  149. package/src/rust/tasks/dismiss_render_warning.rs +3 -1
  150. package/src/rust/tasks/edit_expression.rs +4 -4
  151. package/src/rust/tasks/edit_window.rs +155 -0
  152. package/src/rust/tasks/eject.rs +64 -23
  153. package/src/rust/tasks/mod.rs +30 -4
  154. package/src/rust/tasks/pipeline.rs +411 -0
  155. package/src/rust/tasks/presize_panels.rs +324 -0
  156. package/src/rust/tasks/reset_all.rs +22 -12
  157. package/src/rust/tasks/resize_observer.rs +124 -87
  158. package/src/rust/tasks/restore_and_render.rs +80 -86
  159. package/src/rust/tasks/restore_panel.rs +145 -0
  160. package/src/rust/tasks/send_column_config.rs +5 -2
  161. package/src/rust/tasks/send_plugin_config.rs +5 -2
  162. package/src/rust/tasks/set_edit_mode.rs +59 -0
  163. package/src/rust/tasks/sync_update_panels.rs +152 -0
  164. package/src/rust/tasks/table_lifecycle.rs +158 -0
  165. package/src/rust/tasks/update_theme.rs +56 -12
  166. package/src/rust/utils/browser/dragdrop.rs +12 -0
  167. package/src/rust/utils/browser/tests/debounce.rs +49 -0
  168. package/src/rust/utils/completion.rs +56 -0
  169. package/src/rust/utils/custom_element.rs +5 -0
  170. package/src/rust/utils/debounce.rs +189 -17
  171. package/src/rust/utils/mod.rs +6 -0
  172. package/src/rust/utils/pending_effects.rs +62 -0
  173. package/src/rust/utils/spawn.rs +33 -0
  174. package/src/rust/utils/weak_scope.rs +0 -10
  175. package/src/rust/workspace.rs +846 -0
  176. package/src/svg/active-indicator.svg +3 -0
  177. package/src/svg/pin-icon.svg +5 -0
  178. package/src/themes/botanical.css +5 -2
  179. package/src/themes/defaults.css +54 -2
  180. package/src/themes/dracula.css +6 -3
  181. package/src/themes/gruvbox-dark.css +5 -2
  182. package/src/themes/gruvbox.css +5 -2
  183. package/src/themes/icons.css +5 -2
  184. package/src/themes/intl/de.css +7 -0
  185. package/src/themes/intl/es.css +7 -0
  186. package/src/themes/intl/fr.css +7 -0
  187. package/src/themes/intl/ja.css +7 -0
  188. package/src/themes/intl/pt.css +7 -0
  189. package/src/themes/intl/zh.css +7 -0
  190. package/src/themes/intl.css +10 -1
  191. package/src/themes/monokai.css +5 -2
  192. package/src/themes/phosphor.css +5 -2
  193. package/src/themes/pro-dark.css +5 -2
  194. package/src/themes/pro.css +2 -1
  195. package/src/themes/solarized-dark.css +5 -2
  196. package/src/themes/solarized.css +5 -2
  197. package/src/themes/vaporwave.css +5 -2
  198. package/src/ts/bootstrap.ts +8 -7
  199. package/src/ts/extensions.ts +30 -2
  200. package/src/ts/perspective-viewer.ts +10 -0
  201. package/src/ts/plugin.ts +72 -5
  202. package/src/ts/ts-rs/ClientOptions.ts +7 -0
  203. package/src/ts/ts-rs/ExportMethod.ts +3 -0
  204. package/src/ts/ts-rs/ExportOptions.ts +8 -0
  205. package/src/ts/ts-rs/GetClientOptions.ts +7 -0
  206. package/src/ts/ts-rs/GetTableOptions.ts +7 -0
  207. package/src/ts/ts-rs/Layout.ts +9 -0
  208. package/src/ts/ts-rs/Orientation.ts +6 -0
  209. package/src/ts/ts-rs/PanelOptions.ts +7 -0
  210. package/src/ts/ts-rs/PanelViewerConfig.ts +16 -0
  211. package/src/ts/ts-rs/SplitLayout.ts +5 -0
  212. package/src/ts/ts-rs/TabLayout.ts +11 -0
  213. package/src/ts/ts-rs/ViewerConfig.ts +7 -2
  214. package/src/ts/ts-rs/ViewerConfigUpdate.ts +9 -0
  215. package/src/ts/ts-rs/WindowAggregate.ts +3 -0
  216. package/src/ts/ts-rs/WindowSort.ts +9 -0
  217. package/src/ts/ts-rs/WindowSortDir.ts +8 -0
  218. package/src/ts/ts-rs/WindowSpec.ts +46 -0
  219. package/src/ts/ts-rs/Windows.ts +10 -0
  220. package/src/ts/ts-rs/WorkspaceConfig.ts +36 -0
  221. package/src/ts/ts-rs/WorkspaceConfigUpdate.ts +24 -0
  222. package/src/rust/tasks/intersection_observer.rs +0 -98
  223. package/src/rust/tasks/update_and_render.rs +0 -110
  224. /package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline0.js → perspective-viewer-8a8c7d5d696b43ae/inline1.js} +0 -0
  225. /package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline1.js → perspective-viewer-8a8c7d5d696b43ae/inline2.js} +0 -0
  226. /package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline2.js → perspective-viewer-8a8c7d5d696b43ae/inline3.js} +0 -0
  227. /package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline4.js → perspective-viewer-8a8c7d5d696b43ae/inline5.js} +0 -0
@@ -0,0 +1,255 @@
1
+ // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2
+ // ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
3
+ // ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
4
+ // ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
5
+ // ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
6
+ // ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7
+ // ┃ Copyright (c) 2017, the Perspective Authors. ┃
8
+ // ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9
+ // ┃ This file is part of the Perspective library, distributed under the terms ┃
10
+ // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
+ // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
+
13
+ //! The root component's `view()`: composition of the settings pane, the
14
+ //! column-settings drawer, and the multi-panel `MainPanel`.
15
+ //!
16
+ //! INVARIANT: the `SplitPanel` is ALWAYS rendered with `main_panel` as its
17
+ //! last (flex-fill) pane — toggling the settings sidebar only adds/removes the
18
+ //! leading pane, never reparents `main_panel` (a remount would tear down
19
+ //! `<regular-layout>` + the plugin `<slot>`s).
20
+
21
+ use yew::prelude::*;
22
+
23
+ use super::PerspectiveViewer;
24
+ use super::msg::PerspectiveViewerMsg::*;
25
+ use crate::components::column_settings_sidebar::ColumnSettingsPanel;
26
+ use crate::components::containers::split_panel::SplitPanel;
27
+ use crate::components::font_loader::FontLoader;
28
+ use crate::components::main_panel::MainPanel;
29
+ use crate::components::panel_menu::PanelCommand;
30
+ use crate::components::settings_panel::SettingsPanel;
31
+ use crate::components::style::StyleProvider;
32
+ use crate::queries::*;
33
+ use crate::session::TableLoadState;
34
+
35
+ impl PerspectiveViewer {
36
+ pub(super) fn render(&self, ctx: &Context<Self>) -> Html {
37
+ // The settings panel + status bar bind to the *active* panel's engines;
38
+ // `presentation` is element-level (shared).
39
+ let presentation = &ctx.props().presentation;
40
+ let renderer = &self.active_renderer;
41
+ let session = &self.active_session;
42
+
43
+ let is_settings_open = self.settings_open
44
+ && matches!(self.session_props.has_table, Some(TableLoadState::Loaded));
45
+
46
+ let mut class = classes!();
47
+ if !is_settings_open {
48
+ class.push("settings-closed");
49
+ }
50
+
51
+ if self.session_props.title.is_some() {
52
+ class.push("titled");
53
+ }
54
+
55
+ let on_open_expr_panel = ctx.link().callback(|c| OpenColumnSettings {
56
+ locator: c,
57
+ sender: None,
58
+ toggle: true,
59
+ });
60
+
61
+ let on_column_settings_panel_resize = ctx
62
+ .link()
63
+ .callback(|(x, _)| ColumnSettingsPanelSizeUpdate(Some(x)));
64
+
65
+ let on_close_settings = ctx.link().callback(|()| ToggleSettingsInit(None, None));
66
+ let on_debug = ctx.link().callback(|_| ToggleDebug);
67
+ let selected_column = get_current_column_locator(
68
+ &self.presentation_props.open_column_settings,
69
+ renderer,
70
+ &self.session_props.config,
71
+ &self.session_props.metadata,
72
+ );
73
+
74
+ let selected_tab = self.presentation_props.open_column_settings.tab;
75
+ let plugin_name = self.renderer_props.plugin_name.clone();
76
+ let available_plugins = self.renderer_props.available_plugins.clone();
77
+ let has_table = self.session_props.has_table.clone();
78
+ let named_column_count = self.renderer_props.config.config_column_names.len();
79
+
80
+ let view_config = self.session_props.config.clone();
81
+ let drag_column = self.dragdrop_props.column.clone();
82
+ let metadata = self.session_props.metadata.clone();
83
+ let on_select_tab = ctx.link().callback(SettingsPanelTabChanged);
84
+ let on_auto_width = ctx.link().callback(SettingsPanelAutoWidth);
85
+ let settings_panel = if is_settings_open {
86
+ html! {
87
+ <SettingsPanel
88
+ on_close={on_close_settings}
89
+ on_resize={&self.on_resize}
90
+ on_select_column={on_open_expr_panel}
91
+ is_debug={self.debug_open}
92
+ {on_debug}
93
+ {plugin_name}
94
+ {available_plugins}
95
+ {has_table}
96
+ {named_column_count}
97
+ {view_config}
98
+ plugin_config={self.renderer_props.plugin_config.clone()}
99
+ {drag_column}
100
+ metadata={metadata.clone()}
101
+ open_column_settings={self.presentation_props.open_column_settings.clone()}
102
+ selected_theme={self.presentation_props.selected_theme.clone()}
103
+ selected_tab={self.settings_geometry.selected_tab}
104
+ auto_width={self.settings_geometry.auto_width}
105
+ on_dimensions_reset={&self.on_settings_panel_dimensions_reset}
106
+ {on_select_tab}
107
+ {on_auto_width}
108
+ {presentation}
109
+ {renderer}
110
+ {session}
111
+ />
112
+ }
113
+ } else {
114
+ html! { <></> }
115
+ };
116
+
117
+ let on_settings = ctx.link().callback(|()| ToggleSettingsInit(None, None));
118
+ let on_select_tab = ctx.link().callback(ColumnSettingsTabChanged);
119
+ // Pinning the drawer is a pure CSS positioning flip on `#modal_panel`
120
+ // (absolute overlay over the main panel <-> static flex sibling
121
+ // between the main panel and the settings pane) - the drawer NEVER
122
+ // reparents, so neither `MainPanel` nor the drawer subtree remounts
123
+ // on toggle, and the divider/width-override machinery is identical
124
+ // in both modes.
125
+ let is_pinned = self.settings_geometry.column_settings_pinned;
126
+ let column_settings_panel = html! {
127
+ if let Some(selected_column) = selected_column {
128
+ <SplitPanel
129
+ id="modal_panel"
130
+ class={classes!(is_pinned.then_some("pinned"))}
131
+ reverse=true
132
+ initial_size={self.settings_geometry.column_settings_width_override}
133
+ on_reset={ctx.link().callback(|_| ColumnSettingsPanelSizeUpdate(None))}
134
+ on_resize={on_column_settings_panel_resize}
135
+ >
136
+ <ColumnSettingsPanel
137
+ {selected_column}
138
+ {selected_tab}
139
+ on_close={self.on_close_column_settings.clone()}
140
+ width_override={self.settings_geometry.column_settings_width_override}
141
+ auto_width={self.settings_geometry.column_settings_auto_width}
142
+ on_auto_width={ctx.link().callback(ColumnSettingsPanelAutoWidth)}
143
+ {is_pinned}
144
+ on_toggle_pin={ctx.link().callback(|()| ToggleColumnSettingsPin)}
145
+ {on_select_tab}
146
+ plugin_name={self.renderer_props.plugin_name.clone()}
147
+ {metadata}
148
+ view_config={self.session_props.config.clone()}
149
+ column_stats={self.session_props.column_stats.clone()}
150
+ selected_theme={self.presentation_props.selected_theme.clone()}
151
+ {presentation}
152
+ {renderer}
153
+ {session}
154
+ />
155
+ <></>
156
+ </SplitPanel>
157
+ }
158
+ };
159
+
160
+ let on_reset = ctx.link().callback(|all| ResetPanel(None, all, None));
161
+ let main_panel = html! {
162
+ <MainPanel
163
+ {on_settings}
164
+ {on_reset}
165
+ on_activate_panel={ctx.link().callback(|id| SetActivePanel(id, None))}
166
+ on_close_panel={ctx.link().callback(|id| ClosePanel(id, None))}
167
+ on_panel_command={ctx.link().batch_callback(|(id, cmd): (String, PanelCommand)| {
168
+ match cmd {
169
+ PanelCommand::New => vec![NewPanel(id)],
170
+ PanelCommand::NewFrom { client, table } => {
171
+ vec![NewPanelFrom { client, table }]
172
+ },
173
+ PanelCommand::Duplicate => vec![DuplicatePanel(id)],
174
+ PanelCommand::Reset => vec![ResetPanel(Some(id), false, None)],
175
+ PanelCommand::ToggleMaster => vec![ToggleMaster(id)],
176
+ PanelCommand::Close => vec![ClosePanel(id, None)],
177
+ PanelCommand::Maximize | PanelCommand::Restore => vec![],
178
+ }
179
+ })}
180
+ session_props={self.session_props.clone()}
181
+ renderer_props={self.renderer_props.clone()}
182
+ presentation_props={self.presentation_props.clone()}
183
+ {is_settings_open}
184
+ update_count={self.update_count}
185
+ panel_ids={ctx.props().workspace.panel_ids()}
186
+ panel_titles={ctx.props()
187
+ .workspace
188
+ .panel_ids()
189
+ .iter()
190
+ .map(|id| {
191
+ let title = ctx
192
+ .props()
193
+ .workspace
194
+ .panel(id)
195
+ .and_then(|p| p.session.get_title())
196
+ .filter(|t| !t.is_empty());
197
+ (id.as_str().to_owned(), title)
198
+ })
199
+ .collect::<Vec<_>>()}
200
+ panel_themes={ctx.props()
201
+ .workspace
202
+ .panel_ids()
203
+ .iter()
204
+ .map(|id| {
205
+ (
206
+ id.as_str().to_owned(),
207
+ ctx.props().workspace.panel(id).and_then(|p| p.renderer.theme()),
208
+ )
209
+ })
210
+ .collect::<Vec<_>>()}
211
+ panel_masters={ctx.props().workspace.masters()}
212
+ workspace={ctx.props().workspace.clone()}
213
+ global_filters={self.global_filters.clone()}
214
+ on_remove_global_filter={ctx.link().callback(RemoveGlobalFilter)}
215
+ on_clear_global_filters={ctx.link().callback(|_| ClearGlobalFilters)}
216
+ {presentation}
217
+ {renderer}
218
+ {session}
219
+ />
220
+ };
221
+
222
+ let is_single_panel = if ctx.props().workspace.placed_count() == 1 {
223
+ "only-child"
224
+ } else {
225
+ ""
226
+ };
227
+
228
+ html! {
229
+ <StyleProvider root={ctx.props().elem.clone()}>
230
+ <div id="component_container" class={is_single_panel}>
231
+ <div id="layout_area">
232
+ <SplitPanel
233
+ id="app_panel"
234
+ reverse=true
235
+ skip_empty=true
236
+ deferred=true
237
+ size={self.settings_geometry.pane_width_override}
238
+ initial_size={self.settings_geometry.pane_width_override}
239
+ on_reset={ctx.link().callback(|_| SettingsPanelSizeUpdate(None))}
240
+ on_resize={ctx.link().callback(|(x, _): (i32, i32)| SettingsDividerMove(x))}
241
+ on_resize_finished={ctx.link().callback(|_| SettingsDividerFinish)}
242
+ >
243
+ { settings_panel }
244
+ <div id="main_column_container">
245
+ { main_panel }
246
+ { column_settings_panel }
247
+ </div>
248
+ </SplitPanel>
249
+ </div>
250
+ </div>
251
+ <FontLoader ..self.fonts.clone() />
252
+ </StyleProvider>
253
+ }
254
+ }
255
+ }