@perspective-dev/viewer 4.5.1 → 5.0.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 (212) 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/monokai.css +1 -1
  9. package/dist/css/phosphor.css +1 -1
  10. package/dist/css/pro-dark.css +1 -1
  11. package/dist/css/pro.css +1 -1
  12. package/dist/css/solarized-dark.css +1 -1
  13. package/dist/css/solarized.css +1 -1
  14. package/dist/css/themes.css +1 -1
  15. package/dist/css/vaporwave.css +1 -1
  16. package/dist/esm/extensions.d.ts +22 -3
  17. package/dist/esm/perspective-viewer.cdn.d.ts +3 -0
  18. package/dist/esm/perspective-viewer.d.ts +9 -0
  19. package/dist/esm/perspective-viewer.inline.d.ts +3 -0
  20. package/dist/esm/perspective-viewer.inline.js +20 -1
  21. package/dist/esm/perspective-viewer.inline.js.map +4 -4
  22. package/dist/esm/perspective-viewer.js +20 -1
  23. package/dist/esm/perspective-viewer.js.map +4 -4
  24. package/dist/esm/plugin.d.ts +71 -5
  25. package/dist/esm/ts-rs/ClientOptions.d.ts +7 -0
  26. package/dist/esm/ts-rs/ExportMethod.d.ts +1 -0
  27. package/dist/esm/ts-rs/ExportOptions.d.ts +9 -0
  28. package/dist/esm/ts-rs/GetClientOptions.d.ts +8 -0
  29. package/dist/esm/ts-rs/GetTableOptions.d.ts +8 -0
  30. package/dist/esm/ts-rs/Layout.d.ts +11 -0
  31. package/dist/esm/ts-rs/OnUpdateData.d.ts +6 -0
  32. package/dist/esm/ts-rs/Orientation.d.ts +4 -0
  33. package/dist/esm/ts-rs/PanelOptions.d.ts +7 -0
  34. package/dist/esm/ts-rs/PanelViewerConfig.d.ts +39 -0
  35. package/dist/esm/ts-rs/SplitLayout.d.ts +7 -0
  36. package/dist/esm/ts-rs/TabLayout.d.ts +10 -0
  37. package/dist/esm/ts-rs/ViewOnUpdateResp.d.ts +4 -0
  38. package/dist/esm/ts-rs/ViewerConfig.d.ts +6 -2
  39. package/dist/esm/ts-rs/WorkspaceConfig.d.ts +40 -0
  40. package/dist/esm/ts-rs/WorkspaceConfigUpdate.d.ts +28 -0
  41. package/dist/wasm/perspective-viewer.d.ts +213 -79
  42. package/dist/wasm/perspective-viewer.js +537 -189
  43. package/dist/wasm/perspective-viewer.wasm +0 -0
  44. package/dist/wasm/perspective-viewer.wasm.d.ts +36 -28
  45. package/dist/wasm/snippets/perspective-viewer-daeef4ceb066e6c7/inline0.js +6 -0
  46. package/dist/wasm/snippets/{perspective-viewer-3cd58f0374935772/inline3.js → perspective-viewer-daeef4ceb066e6c7/inline4.js} +5 -0
  47. package/package.json +3 -2
  48. package/src/css/_column_dropdown.css +14 -0
  49. package/src/css/_context_menu.css +14 -0
  50. package/src/css/_dropdown_menu.css +14 -0
  51. package/src/css/_filter_dropdown.css +14 -0
  52. package/src/css/_function_dropdown.css +14 -0
  53. package/src/css/_viewer_bundle.css +41 -0
  54. package/src/css/column-settings-panel.css +1 -1
  55. package/src/css/containers/context-menu.css +101 -0
  56. package/src/css/panel-tab.css +193 -0
  57. package/src/css/plugin-selector.css +7 -10
  58. package/src/css/status-bar.css +75 -81
  59. package/src/css/viewer.css +181 -71
  60. package/src/rust/components/column_dropdown.rs +43 -33
  61. package/src/rust/components/column_selector/active_column.rs +7 -18
  62. package/src/rust/components/column_selector/aggregate_selector.rs +4 -10
  63. package/src/rust/components/column_selector/config_selector.rs +33 -84
  64. package/src/rust/components/column_selector/empty_column.rs +0 -3
  65. package/src/rust/components/column_selector/filter_column.rs +5 -18
  66. package/src/rust/components/column_selector/inactive_column.rs +3 -8
  67. package/src/rust/components/column_selector/invalid_column.rs +0 -4
  68. package/src/rust/components/column_selector/sort_column.rs +3 -6
  69. package/src/rust/components/column_selector.rs +5 -14
  70. package/src/rust/components/column_settings_sidebar/style_tab/symbol/symbol_pairs.rs +0 -3
  71. package/src/rust/components/column_settings_sidebar/style_tab/symbol.rs +0 -3
  72. package/src/rust/components/column_settings_sidebar.rs +0 -3
  73. package/src/rust/components/containers/dropdown_menu.rs +1 -3
  74. package/src/rust/components/containers/scroll_panel.rs +1 -3
  75. package/src/rust/components/containers/split_panel.rs +175 -66
  76. package/src/rust/components/containers/tab_list.rs +0 -3
  77. package/src/rust/components/context_menu.rs +130 -0
  78. package/src/rust/components/datetime_column_style.rs +0 -3
  79. package/src/rust/components/empty_row.rs +0 -3
  80. package/src/rust/components/expression_editor.rs +2 -3
  81. package/src/rust/components/filter_dropdown.rs +3 -3
  82. package/src/rust/components/font_loader.rs +2 -2
  83. package/src/rust/components/form/code_editor.rs +0 -3
  84. package/src/rust/components/form/debug.rs +3 -4
  85. package/src/rust/components/function_dropdown.rs +3 -3
  86. package/src/rust/components/global_filter_bar.rs +76 -0
  87. package/src/rust/components/main_panel/frame_theme.rs +186 -0
  88. package/src/rust/components/main_panel/msg.rs +62 -0
  89. package/src/rust/components/main_panel/presize.rs +220 -0
  90. package/src/rust/components/main_panel/reconcile.rs +224 -0
  91. package/src/rust/components/main_panel/render.rs +385 -0
  92. package/src/rust/components/main_panel/update.rs +184 -0
  93. package/src/rust/components/main_panel.rs +311 -71
  94. package/src/rust/components/mod.rs +4 -0
  95. package/src/rust/components/number_series_style.rs +0 -3
  96. package/src/rust/components/panel_menu.rs +486 -0
  97. package/src/rust/components/panel_tab.rs +505 -0
  98. package/src/rust/components/plugin_selector.rs +0 -3
  99. package/src/rust/components/plugin_tab.rs +1 -6
  100. package/src/rust/components/portal.rs +5 -2
  101. package/src/rust/components/render_warning.rs +0 -3
  102. package/src/rust/components/settings_panel.rs +13 -5
  103. package/src/rust/components/status_bar.rs +113 -180
  104. package/src/rust/components/status_indicator.rs +6 -9
  105. package/src/rust/components/string_column_style.rs +0 -3
  106. package/src/rust/components/style/mod.rs +65 -27
  107. package/src/rust/components/style/style_provider.rs +51 -16
  108. package/src/rust/components/style_controls/number_string_format.rs +1 -8
  109. package/src/rust/components/type_icon.rs +1 -4
  110. package/src/rust/components/viewer/filters.rs +133 -0
  111. package/src/rust/components/viewer/msg.rs +180 -0
  112. package/src/rust/components/viewer/panels.rs +326 -0
  113. package/src/rust/components/viewer/render.rs +243 -0
  114. package/src/rust/components/viewer/settings.rs +402 -0
  115. package/src/rust/components/viewer/snapshots.rs +134 -0
  116. package/src/rust/components/viewer/wiring.rs +505 -0
  117. package/src/rust/components/viewer.rs +243 -758
  118. package/src/rust/config/export_method.rs +1 -1
  119. package/src/rust/config/mod.rs +4 -0
  120. package/src/rust/config/options.rs +71 -0
  121. package/src/rust/config/viewer_config.rs +24 -2
  122. package/src/rust/config/workspace_config.rs +92 -0
  123. package/src/rust/custom_elements/copy_dropdown.rs +9 -3
  124. package/src/rust/custom_elements/debug_plugin.rs +20 -1
  125. package/src/rust/custom_elements/export_dropdown.rs +9 -3
  126. package/src/rust/custom_elements/viewer.rs +1015 -286
  127. package/src/rust/custom_events.rs +212 -61
  128. package/src/rust/js/mod.rs +2 -0
  129. package/src/rust/js/plugin.rs +297 -10
  130. package/src/rust/js/regular_layout.rs +258 -0
  131. package/src/rust/lib.rs +20 -2
  132. package/src/rust/presentation.rs +66 -33
  133. package/src/rust/queries/get_viewer_config.rs +29 -11
  134. package/src/rust/queries/plugin_column_styles.rs +2 -2
  135. package/src/rust/renderer/activate.rs +41 -14
  136. package/src/rust/renderer/dispatch.rs +436 -0
  137. package/src/rust/renderer/plugin_config.rs +495 -0
  138. package/src/rust/renderer/registry.rs +18 -6
  139. package/src/rust/renderer/render_timer.rs +29 -10
  140. package/src/rust/renderer.rs +350 -827
  141. package/src/rust/session/column_defaults_update.rs +26 -8
  142. package/src/rust/session/metadata.rs +11 -1
  143. package/src/rust/session/view_subscription.rs +30 -15
  144. package/src/rust/session.rs +753 -251
  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/eject.rs +64 -23
  152. package/src/rust/tasks/mod.rs +28 -4
  153. package/src/rust/tasks/pipeline.rs +411 -0
  154. package/src/rust/tasks/presize_panels.rs +324 -0
  155. package/src/rust/tasks/reset_all.rs +22 -12
  156. package/src/rust/tasks/resize_observer.rs +124 -87
  157. package/src/rust/tasks/restore_and_render.rs +80 -86
  158. package/src/rust/tasks/restore_panel.rs +145 -0
  159. package/src/rust/tasks/send_column_config.rs +5 -2
  160. package/src/rust/tasks/send_plugin_config.rs +5 -2
  161. package/src/rust/tasks/set_edit_mode.rs +59 -0
  162. package/src/rust/tasks/sync_update_panels.rs +152 -0
  163. package/src/rust/tasks/table_lifecycle.rs +158 -0
  164. package/src/rust/tasks/update_theme.rs +56 -12
  165. package/src/rust/utils/completion.rs +56 -0
  166. package/src/rust/utils/custom_element.rs +5 -0
  167. package/src/rust/utils/debounce.rs +130 -7
  168. package/src/rust/utils/mod.rs +6 -0
  169. package/src/rust/utils/pending_effects.rs +62 -0
  170. package/src/rust/{components/style/local_style.rs → utils/spawn.rs} +17 -19
  171. package/src/rust/utils/weak_scope.rs +0 -10
  172. package/src/rust/workspace.rs +846 -0
  173. package/src/svg/active-indicator.svg +3 -0
  174. package/src/themes/botanical.css +7 -2
  175. package/src/themes/defaults.css +54 -2
  176. package/src/themes/dracula.css +8 -3
  177. package/src/themes/gruvbox-dark.css +7 -2
  178. package/src/themes/gruvbox.css +5 -2
  179. package/src/themes/icons.css +4 -2
  180. package/src/themes/monokai.css +7 -2
  181. package/src/themes/phosphor.css +7 -2
  182. package/src/themes/pro-dark.css +7 -2
  183. package/src/themes/pro.css +2 -1
  184. package/src/themes/solarized-dark.css +5 -2
  185. package/src/themes/solarized.css +5 -2
  186. package/src/themes/vaporwave.css +7 -2
  187. package/src/ts/bootstrap.ts +8 -7
  188. package/src/ts/extensions.ts +30 -2
  189. package/src/ts/perspective-viewer.ts +10 -0
  190. package/src/ts/plugin.ts +72 -5
  191. package/src/ts/ts-rs/ClientOptions.ts +7 -0
  192. package/src/ts/ts-rs/ExportMethod.ts +3 -0
  193. package/src/ts/ts-rs/ExportOptions.ts +8 -0
  194. package/src/ts/ts-rs/GetClientOptions.ts +7 -0
  195. package/src/ts/ts-rs/GetTableOptions.ts +7 -0
  196. package/src/ts/ts-rs/Layout.ts +9 -0
  197. package/src/ts/ts-rs/Orientation.ts +6 -0
  198. package/src/ts/ts-rs/PanelOptions.ts +7 -0
  199. package/src/ts/ts-rs/PanelViewerConfig.ts +15 -0
  200. package/src/ts/ts-rs/SplitLayout.ts +5 -0
  201. package/src/ts/ts-rs/TabLayout.ts +11 -0
  202. package/src/ts/ts-rs/ViewerConfig.ts +6 -2
  203. package/src/ts/ts-rs/WorkspaceConfig.ts +36 -0
  204. package/src/ts/ts-rs/WorkspaceConfigUpdate.ts +24 -0
  205. package/tsconfig.json +1 -1
  206. package/src/rust/components/style/style_cache.rs +0 -136
  207. package/src/rust/tasks/intersection_observer.rs +0 -98
  208. package/src/rust/tasks/update_and_render.rs +0 -110
  209. /package/dist/wasm/snippets/{perspective-viewer-3cd58f0374935772/inline0.js → perspective-viewer-daeef4ceb066e6c7/inline1.js} +0 -0
  210. /package/dist/wasm/snippets/{perspective-viewer-3cd58f0374935772/inline1.js → perspective-viewer-daeef4ceb066e6c7/inline2.js} +0 -0
  211. /package/dist/wasm/snippets/{perspective-viewer-3cd58f0374935772/inline2.js → perspective-viewer-daeef4ceb066e6c7/inline3.js} +0 -0
  212. /package/dist/wasm/snippets/{perspective-viewer-3cd58f0374935772/inline4.js → perspective-viewer-daeef4ceb066e6c7/inline5.js} +0 -0
@@ -13,7 +13,6 @@
13
13
  use std::collections::HashSet;
14
14
 
15
15
  use perspective_client::config::*;
16
- use perspective_js::utils::ApiFuture;
17
16
  use web_sys::*;
18
17
  use yew::prelude::*;
19
18
 
@@ -28,6 +27,7 @@ use crate::presentation::{ColumnLocator, Presentation};
28
27
  use crate::queries::*;
29
28
  use crate::renderer::*;
30
29
  use crate::session::*;
30
+ use crate::tasks::apply_and_render;
31
31
  use crate::utils::*;
32
32
 
33
33
  #[derive(Clone, Properties)]
@@ -162,11 +162,8 @@ impl Component for ActiveColumn {
162
162
  {
163
163
  let session = ctx.props().session.clone();
164
164
  let renderer = ctx.props().renderer.clone();
165
- if session.update_view_config(update).is_ok() {
166
- ApiFuture::spawn(async move {
167
- renderer.apply_pending_plugin()?;
168
- renderer.draw(session.validate().await?.create_view()).await
169
- });
165
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
166
+ spawn_owned("active-column", task);
170
167
  }
171
168
  }
172
169
 
@@ -190,11 +187,8 @@ impl Component for ActiveColumn {
190
187
  {
191
188
  let session = ctx.props().session.clone();
192
189
  let renderer = ctx.props().renderer.clone();
193
- if session.update_view_config(update).is_ok() {
194
- ApiFuture::spawn(async move {
195
- renderer.apply_pending_plugin()?;
196
- renderer.draw(session.validate().await?.create_view()).await
197
- });
190
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
191
+ spawn_owned("active-column", task);
198
192
  }
199
193
  }
200
194
 
@@ -477,13 +471,8 @@ impl ActiveColumnProps {
477
471
  ..ViewConfigUpdate::default()
478
472
  };
479
473
 
480
- if self.session.update_view_config(config).is_ok() {
481
- let session = self.session.clone();
482
- let renderer = self.renderer.clone();
483
- ApiFuture::spawn(async move {
484
- renderer.apply_pending_plugin()?;
485
- renderer.draw(session.validate().await?.create_view()).await
486
- });
474
+ if let Ok(task) = apply_and_render(&self.session, &self.renderer, config) {
475
+ spawn_owned("active-column", task);
487
476
  }
488
477
  }
489
478
  }
@@ -14,15 +14,13 @@ use std::collections::HashSet;
14
14
  use std::rc::Rc;
15
15
 
16
16
  use perspective_client::config::*;
17
- use perspective_js::utils::ApiFuture;
18
17
  use yew::prelude::*;
19
18
 
20
19
  use crate::components::containers::select::*;
21
- use crate::components::style::LocalStyle;
22
- use crate::css;
23
20
  use crate::renderer::*;
24
21
  use crate::session::*;
25
- use crate::utils::PtrEqRc;
22
+ use crate::tasks::apply_and_render;
23
+ use crate::utils::{PtrEqRc, spawn_owned};
26
24
 
27
25
  #[derive(Properties)]
28
26
  pub struct AggregateSelectorProps {
@@ -119,7 +117,6 @@ impl Component for AggregateSelector {
119
117
 
120
118
  html! {
121
119
  <>
122
- <LocalStyle href={css!("aggregate-selector")} />
123
120
  <div class="aggregate-selector-wrapper">
124
121
  <Select<Aggregate>
125
122
  wrapper_class="aggregate-selector"
@@ -146,11 +143,8 @@ impl AggregateSelector {
146
143
 
147
144
  let session = ctx.props().session.clone();
148
145
  let renderer = ctx.props().renderer.clone();
149
- if session.update_view_config(config).is_ok() {
150
- ApiFuture::spawn(async move {
151
- renderer.apply_pending_plugin()?;
152
- renderer.draw(session.validate().await?.create_view()).await
153
- });
146
+ if let Ok(task) = apply_and_render(&session, &renderer, config) {
147
+ spawn_owned("aggregate-selector", task);
154
148
  }
155
149
  }
156
150
 
@@ -14,7 +14,6 @@ use std::collections::HashSet;
14
14
  use std::rc::Rc;
15
15
 
16
16
  use perspective_client::config::{ViewConfig, *};
17
- use perspective_js::utils::ApiFuture;
18
17
  use yew::prelude::*;
19
18
 
20
19
  use super::InPlaceColumn;
@@ -25,12 +24,11 @@ use crate::components::column_dropdown::{ColumnDropDownElement, ColumnDropDownPo
25
24
  use crate::components::containers::dragdrop_list::*;
26
25
  use crate::components::containers::select::{Select, SelectItem};
27
26
  use crate::components::filter_dropdown::{FilterDropDownElement, FilterDropDownPortal};
28
- use crate::components::style::LocalStyle;
29
- use crate::css;
30
27
  use crate::presentation::Presentation;
31
28
  use crate::renderer::*;
32
29
  use crate::session::drag_drop_update::*;
33
30
  use crate::session::*;
31
+ use crate::tasks::apply_and_render;
34
32
  use crate::utils::*;
35
33
 
36
34
  #[derive(Clone, Properties)]
@@ -134,11 +132,8 @@ impl Component for ConfigSelector {
134
132
  {
135
133
  let session = ctx.props().session.clone();
136
134
  let renderer = ctx.props().renderer.clone();
137
- if session.update_view_config(config).is_ok() {
138
- ApiFuture::spawn(async move {
139
- renderer.apply_pending_plugin()?;
140
- renderer.draw(session.validate().await?.create_view()).await
141
- });
135
+ if let Ok(task) = apply_and_render(&session, &renderer, config) {
136
+ spawn_owned("config-selector", task);
142
137
  }
143
138
  }
144
139
 
@@ -154,11 +149,8 @@ impl Component for ConfigSelector {
154
149
  {
155
150
  let session = ctx.props().session.clone();
156
151
  let renderer = ctx.props().renderer.clone();
157
- if session.update_view_config(config).is_ok() {
158
- ApiFuture::spawn(async move {
159
- renderer.apply_pending_plugin()?;
160
- renderer.draw(session.validate().await?.create_view()).await
161
- });
152
+ if let Ok(task) = apply_and_render(&session, &renderer, config) {
153
+ spawn_owned("config-selector", task);
162
154
  }
163
155
  }
164
156
 
@@ -193,11 +185,8 @@ impl Component for ConfigSelector {
193
185
  {
194
186
  let session = ctx.props().session.clone();
195
187
  let renderer = ctx.props().renderer.clone();
196
- if session.update_view_config(config).is_ok() {
197
- ApiFuture::spawn(async move {
198
- renderer.apply_pending_plugin()?;
199
- renderer.draw(session.validate().await?.create_view()).await
200
- });
188
+ if let Ok(task) = apply_and_render(&session, &renderer, config) {
189
+ spawn_owned("config-selector", task);
201
190
  }
202
191
  }
203
192
 
@@ -216,11 +205,8 @@ impl Component for ConfigSelector {
216
205
  {
217
206
  let session = ctx.props().session.clone();
218
207
  let renderer = ctx.props().renderer.clone();
219
- if session.update_view_config(config).is_ok() {
220
- ApiFuture::spawn(async move {
221
- renderer.apply_pending_plugin()?;
222
- renderer.draw(session.validate().await?.create_view()).await
223
- });
208
+ if let Ok(task) = apply_and_render(&session, &renderer, config) {
209
+ spawn_owned("config-selector", task);
224
210
  }
225
211
  }
226
212
 
@@ -239,11 +225,8 @@ impl Component for ConfigSelector {
239
225
  {
240
226
  let session = ctx.props().session.clone();
241
227
  let renderer = ctx.props().renderer.clone();
242
- if session.update_view_config(config).is_ok() {
243
- ApiFuture::spawn(async move {
244
- renderer.apply_pending_plugin()?;
245
- renderer.draw(session.validate().await?.create_view()).await
246
- });
228
+ if let Ok(task) = apply_and_render(&session, &renderer, config) {
229
+ spawn_owned("config-selector", task);
247
230
  }
248
231
  }
249
232
 
@@ -272,11 +255,8 @@ impl Component for ConfigSelector {
272
255
  {
273
256
  let session = ctx.props().session.clone();
274
257
  let renderer = ctx.props().renderer.clone();
275
- if session.update_view_config(update).is_ok() {
276
- ApiFuture::spawn(async move {
277
- renderer.apply_pending_plugin()?;
278
- renderer.draw(session.validate().await?.create_view()).await
279
- });
258
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
259
+ spawn_owned("config-selector", task);
280
260
  }
281
261
  }
282
262
 
@@ -302,11 +282,8 @@ impl Component for ConfigSelector {
302
282
  {
303
283
  let session = ctx.props().session.clone();
304
284
  let renderer = ctx.props().renderer.clone();
305
- if session.update_view_config(update).is_ok() {
306
- ApiFuture::spawn(async move {
307
- renderer.apply_pending_plugin()?;
308
- renderer.draw(session.validate().await?.create_view()).await
309
- });
285
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
286
+ spawn_owned("config-selector", task);
310
287
  }
311
288
  }
312
289
  ctx.props().onselect.emit(());
@@ -347,11 +324,8 @@ impl Component for ConfigSelector {
347
324
  {
348
325
  let session = ctx.props().session.clone();
349
326
  let renderer = ctx.props().renderer.clone();
350
- if session.update_view_config(update).is_ok() {
351
- ApiFuture::spawn(async move {
352
- renderer.apply_pending_plugin()?;
353
- renderer.draw(session.validate().await?.create_view()).await
354
- });
327
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
328
+ spawn_owned("config-selector", task);
355
329
  }
356
330
  }
357
331
 
@@ -368,11 +342,8 @@ impl Component for ConfigSelector {
368
342
  {
369
343
  let session = ctx.props().session.clone();
370
344
  let renderer = ctx.props().renderer.clone();
371
- if session.update_view_config(update).is_ok() {
372
- ApiFuture::spawn(async move {
373
- renderer.apply_pending_plugin()?;
374
- renderer.draw(session.validate().await?.create_view()).await
375
- });
345
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
346
+ spawn_owned("config-selector", task);
376
347
  }
377
348
  }
378
349
 
@@ -390,11 +361,8 @@ impl Component for ConfigSelector {
390
361
  {
391
362
  let session = ctx.props().session.clone();
392
363
  let renderer = ctx.props().renderer.clone();
393
- if session.update_view_config(update).is_ok() {
394
- ApiFuture::spawn(async move {
395
- renderer.apply_pending_plugin()?;
396
- renderer.draw(session.validate().await?.create_view()).await
397
- });
364
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
365
+ spawn_owned("config-selector", task);
398
366
  }
399
367
  }
400
368
 
@@ -418,11 +386,8 @@ impl Component for ConfigSelector {
418
386
  {
419
387
  let session = ctx.props().session.clone();
420
388
  let renderer = ctx.props().renderer.clone();
421
- if session.update_view_config(update).is_ok() {
422
- ApiFuture::spawn(async move {
423
- renderer.apply_pending_plugin()?;
424
- renderer.draw(session.validate().await?.create_view()).await
425
- });
389
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
390
+ spawn_owned("config-selector", task);
426
391
  }
427
392
  }
428
393
 
@@ -440,11 +405,8 @@ impl Component for ConfigSelector {
440
405
  {
441
406
  let session = ctx.props().session.clone();
442
407
  let renderer = ctx.props().renderer.clone();
443
- if session.update_view_config(update).is_ok() {
444
- ApiFuture::spawn(async move {
445
- renderer.apply_pending_plugin()?;
446
- renderer.draw(session.validate().await?.create_view()).await
447
- });
408
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
409
+ spawn_owned("config-selector", task);
448
410
  }
449
411
  }
450
412
 
@@ -464,11 +426,8 @@ impl Component for ConfigSelector {
464
426
  {
465
427
  let session = ctx.props().session.clone();
466
428
  let renderer = ctx.props().renderer.clone();
467
- if session.update_view_config(update).is_ok() {
468
- ApiFuture::spawn(async move {
469
- renderer.apply_pending_plugin()?;
470
- renderer.draw(session.validate().await?.create_view()).await
471
- });
429
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
430
+ spawn_owned("config-selector", task);
472
431
  }
473
432
  }
474
433
 
@@ -488,11 +447,8 @@ impl Component for ConfigSelector {
488
447
  {
489
448
  let session = ctx.props().session.clone();
490
449
  let renderer = ctx.props().renderer.clone();
491
- if session.update_view_config(update).is_ok() {
492
- ApiFuture::spawn(async move {
493
- renderer.apply_pending_plugin()?;
494
- renderer.draw(session.validate().await?.create_view()).await
495
- });
450
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
451
+ spawn_owned("config-selector", task);
496
452
  }
497
453
  }
498
454
 
@@ -520,11 +476,8 @@ impl Component for ConfigSelector {
520
476
  {
521
477
  let session = ctx.props().session.clone();
522
478
  let renderer = ctx.props().renderer.clone();
523
- if session.update_view_config(update).is_ok() {
524
- ApiFuture::spawn(async move {
525
- renderer.apply_pending_plugin()?;
526
- renderer.draw(session.validate().await?.create_view()).await
527
- });
479
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
480
+ spawn_owned("config-selector", task);
528
481
  }
529
482
  }
530
483
 
@@ -546,11 +499,8 @@ impl Component for ConfigSelector {
546
499
  {
547
500
  let session = ctx.props().session.clone();
548
501
  let renderer = ctx.props().renderer.clone();
549
- if session.update_view_config(update).is_ok() {
550
- ApiFuture::spawn(async move {
551
- renderer.apply_pending_plugin()?;
552
- renderer.draw(session.validate().await?.create_view()).await
553
- });
502
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
503
+ spawn_owned("config-selector", task);
554
504
  }
555
505
  }
556
506
 
@@ -609,7 +559,6 @@ impl Component for ConfigSelector {
609
559
  html! {
610
560
  <>
611
561
  <div slot="top_panel" id="top_panel" {class} ondragend={dragend}>
612
- <LocalStyle href={css!("config-selector")} />
613
562
  <div class="pivot_controls">
614
563
  if group_rollups.len() > 1 {
615
564
  <Select<GroupRollupMode>
@@ -17,8 +17,6 @@ use web_sys::*;
17
17
  use yew::prelude::*;
18
18
 
19
19
  use crate::components::column_dropdown::ColumnDropDownElement;
20
- use crate::components::style::LocalStyle;
21
- use crate::css;
22
20
 
23
21
  #[derive(Properties)]
24
22
  pub struct EmptyColumnProps {
@@ -70,7 +68,6 @@ impl Component for EmptyColumn {
70
68
 
71
69
  html! {
72
70
  <div class="pivot-column column-empty">
73
- <LocalStyle href={css!("empty-column")} />
74
71
  <input
75
72
  spellcheck="false"
76
73
  ref={self.input_ref.clone()}
@@ -15,7 +15,6 @@ use std::rc::Rc;
15
15
 
16
16
  use chrono::{Datelike, NaiveDate, TimeZone, Utc};
17
17
  use perspective_client::config::*;
18
- use perspective_js::utils::ApiFuture;
19
18
  use wasm_bindgen::JsCast;
20
19
  use web_sys::*;
21
20
  use yew::prelude::*;
@@ -23,12 +22,11 @@ use yew::prelude::*;
23
22
  use crate::components::containers::dragdrop_list::*;
24
23
  use crate::components::containers::select::*;
25
24
  use crate::components::filter_dropdown::FilterDropDownElement;
26
- use crate::components::style::LocalStyle;
27
25
  use crate::components::type_icon::TypeIcon;
28
- use crate::css;
29
26
  use crate::presentation::Presentation;
30
27
  use crate::renderer::*;
31
28
  use crate::session::*;
29
+ use crate::tasks::apply_and_render;
32
30
  use crate::utils::*;
33
31
 
34
32
  #[derive(Clone, Properties)]
@@ -348,7 +346,6 @@ impl Component for FilterColumn {
348
346
  ondragstart={dragstart}
349
347
  ondragend={dragend}
350
348
  >
351
- <LocalStyle href={css!("filter-item")} />
352
349
  <div class="pivot-column-border">
353
350
  <span class="drag-handle icon" />
354
351
  // <TypeIcon ty={ColumnType::String} />
@@ -451,13 +448,8 @@ impl FilterColumnProps {
451
448
  ..ViewConfigUpdate::default()
452
449
  };
453
450
 
454
- if self.session.update_view_config(update).is_ok() {
455
- let session = self.session.clone();
456
- let renderer = self.renderer.clone();
457
- ApiFuture::spawn(async move {
458
- renderer.apply_pending_plugin()?;
459
- renderer.draw(session.validate().await?.create_view()).await
460
- });
451
+ if let Ok(task) = apply_and_render(&self.session, &self.renderer, update) {
452
+ spawn_owned("filter-column", task);
461
453
  }
462
454
  }
463
455
 
@@ -529,13 +521,8 @@ impl FilterColumnProps {
529
521
  ..ViewConfigUpdate::default()
530
522
  };
531
523
 
532
- if self.session.update_view_config(update).is_ok() {
533
- let session = self.session.clone();
534
- let renderer = self.renderer.clone();
535
- ApiFuture::spawn(async move {
536
- renderer.apply_pending_plugin()?;
537
- renderer.draw(session.validate().await?.create_view()).await
538
- });
524
+ if let Ok(task) = apply_and_render(&self.session, &self.renderer, update) {
525
+ spawn_owned("filter-column", task);
539
526
  }
540
527
  }
541
528
  }
@@ -12,7 +12,6 @@
12
12
 
13
13
  use itertools::Itertools;
14
14
  use perspective_client::config::*;
15
- use perspective_js::utils::ApiFuture;
16
15
  use web_sys::*;
17
16
  use yew::prelude::*;
18
17
 
@@ -22,6 +21,7 @@ use crate::config::ColumnSelectMode;
22
21
  use crate::presentation::{ColumnLocator, Presentation};
23
22
  use crate::renderer::*;
24
23
  use crate::session::*;
24
+ use crate::tasks::apply_and_render;
25
25
  use crate::utils::*;
26
26
 
27
27
  #[derive(Clone, Properties)]
@@ -231,13 +231,8 @@ impl InactiveColumnProps {
231
231
  ..ViewConfigUpdate::default()
232
232
  };
233
233
 
234
- if self.session.update_view_config(config).is_ok() {
235
- let session = self.session.clone();
236
- let renderer = self.renderer.clone();
237
- ApiFuture::spawn(async move {
238
- renderer.apply_pending_plugin()?;
239
- renderer.draw(session.validate().await?.create_view()).await
240
- });
234
+ if let Ok(task) = apply_and_render(&self.session, &self.renderer, config) {
235
+ spawn_owned("inactive-column", task);
241
236
  }
242
237
  }
243
238
  }
@@ -12,14 +12,10 @@
12
12
 
13
13
  use yew::prelude::*;
14
14
 
15
- use crate::components::style::LocalStyle;
16
- use crate::css;
17
-
18
15
  #[function_component(InvalidColumn)]
19
16
  pub fn invalid_column() -> Html {
20
17
  html! {
21
18
  <div class="pivot-column column-empty column-invalid">
22
- <LocalStyle href={css!("empty-column")} />
23
19
  <div class="column-invalid-input" />
24
20
  </div>
25
21
  }
@@ -11,7 +11,6 @@
11
11
  // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
12
 
13
13
  use perspective_client::config::*;
14
- use perspective_js::utils::ApiFuture;
15
14
  use web_sys::*;
16
15
  use yew::prelude::*;
17
16
 
@@ -20,6 +19,7 @@ use crate::components::type_icon::TypeIcon;
20
19
  use crate::presentation::Presentation;
21
20
  use crate::renderer::*;
22
21
  use crate::session::*;
22
+ use crate::tasks::apply_and_render;
23
23
  use crate::utils::*;
24
24
 
25
25
  #[derive(Properties)]
@@ -86,11 +86,8 @@ impl Component for SortColumn {
86
86
 
87
87
  let session = ctx.props().session.clone();
88
88
  let renderer = ctx.props().renderer.clone();
89
- if session.update_view_config(update).is_ok() {
90
- ApiFuture::spawn(async move {
91
- renderer.apply_pending_plugin()?;
92
- renderer.draw(session.validate().await?.create_view()).await
93
- });
89
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
90
+ spawn_owned("sort-column", task);
94
91
  }
95
92
 
96
93
  false
@@ -28,7 +28,6 @@ use std::rc::Rc;
28
28
  pub use empty_column::*;
29
29
  pub use invalid_column::*;
30
30
  use perspective_client::config::ViewConfig;
31
- use perspective_js::utils::ApiFuture;
32
31
  pub use pivot_column::*;
33
32
  use web_sys::*;
34
33
  use yew::prelude::*;
@@ -39,15 +38,14 @@ use self::config_selector::ConfigSelector;
39
38
  use self::inactive_column::*;
40
39
  use super::containers::scroll_panel::*;
41
40
  use super::containers::split_panel::{Orientation, SplitPanel};
42
- use super::style::LocalStyle;
43
41
  use crate::components::column_dropdown::{ColumnDropDownElement, ColumnDropDownPortal};
44
42
  use crate::components::containers::scroll_panel_item::ScrollPanelItem;
45
- use crate::css;
46
43
  use crate::presentation::{ColumnLocator, DragDropContainer, Presentation};
47
44
  use crate::queries::{ActiveColumnState, ActiveColumnStateData, ColumnsIteratorSet};
48
45
  use crate::renderer::*;
49
46
  use crate::session::drag_drop_update::*;
50
47
  use crate::session::*;
48
+ use crate::tasks::apply_and_render;
51
49
  use crate::utils::*;
52
50
 
53
51
  #[derive(Properties)]
@@ -220,11 +218,8 @@ impl Component for ColumnSelector {
220
218
 
221
219
  let session = ctx.props().session.clone();
222
220
  let renderer = ctx.props().renderer.clone();
223
- if session.update_view_config(update).is_ok() {
224
- ApiFuture::spawn(async move {
225
- renderer.apply_pending_plugin()?;
226
- renderer.draw(session.validate().await?.create_view()).await
227
- });
221
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
222
+ spawn_owned("column-selector", task);
228
223
  }
229
224
  }
230
225
 
@@ -248,11 +243,8 @@ impl Component for ColumnSelector {
248
243
 
249
244
  let session = ctx.props().session.clone();
250
245
  let renderer = ctx.props().renderer.clone();
251
- if session.update_view_config(update).is_ok() {
252
- ApiFuture::spawn(async move {
253
- renderer.apply_pending_plugin()?;
254
- renderer.draw(session.validate().await?.create_view()).await
255
- });
246
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
247
+ spawn_owned("column-selector", task);
256
248
  }
257
249
 
258
250
  true
@@ -519,7 +511,6 @@ impl Component for ColumnSelector {
519
511
 
520
512
  html! {
521
513
  <>
522
- <LocalStyle href={css!("column-selector")} />
523
514
  <SplitPanel
524
515
  no_wrap=true
525
516
  on_reset={self.on_reset.callback()}
@@ -17,9 +17,7 @@ use yew::{Callback, Html, Properties, html};
17
17
 
18
18
  use crate::components::column_settings_sidebar::style_tab::symbol::symbol_pairs_item::PairsListItem;
19
19
  use crate::components::filter_dropdown::FilterDropDownElement;
20
- use crate::components::style::LocalStyle;
21
20
  use crate::config::SymbolKVPair;
22
- use crate::css;
23
21
  use crate::utils::PtrEqRc;
24
22
 
25
23
  #[derive(Properties, PartialEq)]
@@ -84,7 +82,6 @@ impl yew::Component for PairsList {
84
82
 
85
83
  html! {
86
84
  <>
87
- <LocalStyle href={css!("containers/pairs-list")} />
88
85
  <div class="pairs-list" id={props.id.clone()} data-label={props.title.clone()}>
89
86
  <ul>{ for main_pairs }</ul>
90
87
  </div>
@@ -24,9 +24,7 @@ use yew::{Callback, Html, Properties, html};
24
24
 
25
25
  use crate::components::column_settings_sidebar::style_tab::symbol::symbol_pairs::PairsList;
26
26
  use crate::components::filter_dropdown::{FilterDropDownElement, FilterDropDownPortal};
27
- use crate::components::style::LocalStyle;
28
27
  use crate::config::{ColumnConfigFieldUpdate, KeyValueOpts, SymbolKVPair};
29
- use crate::css;
30
28
  use crate::session::Session;
31
29
 
32
30
  #[derive(Properties, PartialEq, Clone)]
@@ -126,7 +124,6 @@ impl yew::Component for SymbolStyle {
126
124
  let update_pairs = ctx.link().callback(SymbolAttrMsg::UpdatePairs);
127
125
  html! {
128
126
  <>
129
- <LocalStyle href={css!("column-symbol-attributes")} />
130
127
  <PairsList
131
128
  title="Symbols"
132
129
  id="attributes-symbols"
@@ -31,14 +31,12 @@ use crate::components::containers::sidebar::Sidebar;
31
31
  use crate::components::containers::tab_list::TabList;
32
32
  use crate::components::editable_header::EditableHeaderProps;
33
33
  use crate::components::expression_editor::ExpressionEditorProps;
34
- use crate::components::style::LocalStyle;
35
34
  use crate::components::type_icon::TypeIconType;
36
35
  use crate::presentation::{ColumnLocator, ColumnSettingsTab, Presentation};
37
36
  use crate::renderer::Renderer;
38
37
  use crate::session::{Session, SessionMetadataRc};
39
38
  use crate::tasks::{delete_expr, save_expr, update_expr};
40
39
  use crate::utils::PtrEqRc;
41
- use crate::*;
42
40
 
43
41
  #[derive(Clone, Derivative, Properties)]
44
42
  #[derivative(Debug)]
@@ -356,7 +354,6 @@ impl Component for ColumnSettingsPanel {
356
354
 
357
355
  html! {
358
356
  <>
359
- <LocalStyle href={css!("column-settings-panel")} />
360
357
  <Sidebar
361
358
  on_close={ctx.props().on_close.clone()}
362
359
  id_prefix="column_settings"
@@ -17,8 +17,6 @@ use web_sys::*;
17
17
  use yew::prelude::*;
18
18
 
19
19
  use super::select::SelectItem;
20
- use crate::components::style::LocalStyle;
21
- use crate::*;
22
20
 
23
21
  #[derive(Properties, PartialEq)]
24
22
  pub struct DropDownMenuProps<T>
@@ -95,7 +93,7 @@ where
95
93
  html! { <span class="no-results">{ "No Completions" }</span> }
96
94
  };
97
95
 
98
- html! { <><LocalStyle href={css!("containers/dropdown-menu")} />{ body }</> }
96
+ html! { <>{ body }</> }
99
97
  }
100
98
  }
101
99
 
@@ -22,8 +22,6 @@ use yew::prelude::*;
22
22
  use yew::virtual_dom::VChild;
23
23
 
24
24
  use super::scroll_panel_item::ScrollPanelItem;
25
- use crate::components::style::LocalStyle;
26
- use crate::css;
27
25
  use crate::utils::*;
28
26
 
29
27
  #[derive(Properties)]
@@ -253,7 +251,7 @@ impl Component for ScrollPanel {
253
251
  }
254
252
  };
255
253
 
256
- html! { <><LocalStyle href={css!("containers/scroll-panel")} />{ items }</> }
254
+ html! { <>{ items }</> }
257
255
  }
258
256
 
259
257
  fn rendered(&mut self, ctx: &Context<Self>, _first_render: bool) {