@perspective-dev/viewer 4.5.2 → 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 (178) 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.d.ts +9 -0
  18. package/dist/esm/perspective-viewer.inline.js +20 -1
  19. package/dist/esm/perspective-viewer.inline.js.map +4 -4
  20. package/dist/esm/perspective-viewer.js +20 -1
  21. package/dist/esm/perspective-viewer.js.map +4 -4
  22. package/dist/esm/plugin.d.ts +71 -5
  23. package/dist/esm/ts-rs/ClientOptions.d.ts +7 -0
  24. package/dist/esm/ts-rs/ExportMethod.d.ts +1 -0
  25. package/dist/esm/ts-rs/ExportOptions.d.ts +9 -0
  26. package/dist/esm/ts-rs/GetClientOptions.d.ts +8 -0
  27. package/dist/esm/ts-rs/GetTableOptions.d.ts +8 -0
  28. package/dist/esm/ts-rs/Layout.d.ts +11 -0
  29. package/dist/esm/ts-rs/Orientation.d.ts +4 -0
  30. package/dist/esm/ts-rs/PanelOptions.d.ts +7 -0
  31. package/dist/esm/ts-rs/PanelViewerConfig.d.ts +39 -0
  32. package/dist/esm/ts-rs/SplitLayout.d.ts +7 -0
  33. package/dist/esm/ts-rs/TabLayout.d.ts +10 -0
  34. package/dist/esm/ts-rs/ViewerConfig.d.ts +6 -2
  35. package/dist/esm/ts-rs/WorkspaceConfig.d.ts +40 -0
  36. package/dist/esm/ts-rs/WorkspaceConfigUpdate.d.ts +28 -0
  37. package/dist/wasm/perspective-viewer.d.ts +211 -77
  38. package/dist/wasm/perspective-viewer.js +528 -180
  39. package/dist/wasm/perspective-viewer.wasm +0 -0
  40. package/dist/wasm/perspective-viewer.wasm.d.ts +34 -26
  41. package/dist/wasm/snippets/perspective-viewer-daeef4ceb066e6c7/inline0.js +6 -0
  42. package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline3.js → perspective-viewer-daeef4ceb066e6c7/inline4.js} +5 -0
  43. package/package.json +3 -2
  44. package/src/css/_context_menu.css +14 -0
  45. package/src/css/column-settings-panel.css +1 -1
  46. package/src/css/containers/context-menu.css +101 -0
  47. package/src/css/panel-tab.css +193 -0
  48. package/src/css/plugin-selector.css +7 -10
  49. package/src/css/status-bar.css +75 -81
  50. package/src/css/viewer.css +180 -70
  51. package/src/rust/components/column_dropdown.rs +40 -30
  52. package/src/rust/components/column_selector/active_column.rs +7 -18
  53. package/src/rust/components/column_selector/aggregate_selector.rs +4 -7
  54. package/src/rust/components/column_selector/config_selector.rs +33 -81
  55. package/src/rust/components/column_selector/filter_column.rs +5 -15
  56. package/src/rust/components/column_selector/inactive_column.rs +3 -8
  57. package/src/rust/components/column_selector/sort_column.rs +3 -6
  58. package/src/rust/components/column_selector.rs +5 -11
  59. package/src/rust/components/containers/split_panel.rs +175 -62
  60. package/src/rust/components/context_menu.rs +130 -0
  61. package/src/rust/components/form/debug.rs +3 -0
  62. package/src/rust/components/global_filter_bar.rs +76 -0
  63. package/src/rust/components/main_panel/frame_theme.rs +186 -0
  64. package/src/rust/components/main_panel/msg.rs +62 -0
  65. package/src/rust/components/main_panel/presize.rs +220 -0
  66. package/src/rust/components/main_panel/reconcile.rs +224 -0
  67. package/src/rust/components/main_panel/render.rs +385 -0
  68. package/src/rust/components/main_panel/update.rs +184 -0
  69. package/src/rust/components/main_panel.rs +311 -71
  70. package/src/rust/components/mod.rs +4 -0
  71. package/src/rust/components/panel_menu.rs +486 -0
  72. package/src/rust/components/panel_tab.rs +505 -0
  73. package/src/rust/components/plugin_tab.rs +1 -1
  74. package/src/rust/components/settings_panel.rs +13 -5
  75. package/src/rust/components/status_bar.rs +110 -178
  76. package/src/rust/components/status_indicator.rs +6 -9
  77. package/src/rust/components/style/mod.rs +5 -0
  78. package/src/rust/components/style/style_provider.rs +2 -0
  79. package/src/rust/components/viewer/filters.rs +133 -0
  80. package/src/rust/components/viewer/msg.rs +180 -0
  81. package/src/rust/components/viewer/panels.rs +326 -0
  82. package/src/rust/components/viewer/render.rs +243 -0
  83. package/src/rust/components/viewer/settings.rs +402 -0
  84. package/src/rust/components/viewer/snapshots.rs +134 -0
  85. package/src/rust/components/viewer/wiring.rs +505 -0
  86. package/src/rust/components/viewer.rs +243 -756
  87. package/src/rust/config/export_method.rs +1 -1
  88. package/src/rust/config/mod.rs +4 -0
  89. package/src/rust/config/options.rs +71 -0
  90. package/src/rust/config/viewer_config.rs +24 -2
  91. package/src/rust/config/workspace_config.rs +92 -0
  92. package/src/rust/custom_elements/copy_dropdown.rs +3 -1
  93. package/src/rust/custom_elements/debug_plugin.rs +20 -1
  94. package/src/rust/custom_elements/export_dropdown.rs +3 -1
  95. package/src/rust/custom_elements/viewer.rs +1015 -286
  96. package/src/rust/custom_events.rs +212 -61
  97. package/src/rust/js/mod.rs +2 -0
  98. package/src/rust/js/plugin.rs +297 -10
  99. package/src/rust/js/regular_layout.rs +258 -0
  100. package/src/rust/lib.rs +20 -1
  101. package/src/rust/presentation.rs +66 -33
  102. package/src/rust/queries/get_viewer_config.rs +29 -11
  103. package/src/rust/queries/plugin_column_styles.rs +2 -2
  104. package/src/rust/renderer/activate.rs +41 -14
  105. package/src/rust/renderer/dispatch.rs +436 -0
  106. package/src/rust/renderer/plugin_config.rs +495 -0
  107. package/src/rust/renderer/registry.rs +18 -6
  108. package/src/rust/renderer/render_timer.rs +29 -10
  109. package/src/rust/renderer.rs +350 -837
  110. package/src/rust/session/column_defaults_update.rs +26 -8
  111. package/src/rust/session/view_subscription.rs +30 -15
  112. package/src/rust/session.rs +753 -264
  113. package/src/rust/tasks/apply_global_filters.rs +89 -0
  114. package/src/rust/tasks/auto_pause.rs +171 -0
  115. package/src/rust/tasks/copy_export.rs +29 -19
  116. package/src/rust/tasks/create_panel.rs +243 -0
  117. package/src/rust/tasks/dismiss_render_warning.rs +3 -1
  118. package/src/rust/tasks/edit_expression.rs +4 -4
  119. package/src/rust/tasks/eject.rs +64 -23
  120. package/src/rust/tasks/mod.rs +28 -4
  121. package/src/rust/tasks/pipeline.rs +411 -0
  122. package/src/rust/tasks/presize_panels.rs +324 -0
  123. package/src/rust/tasks/reset_all.rs +22 -12
  124. package/src/rust/tasks/resize_observer.rs +124 -87
  125. package/src/rust/tasks/restore_and_render.rs +80 -86
  126. package/src/rust/tasks/restore_panel.rs +145 -0
  127. package/src/rust/tasks/send_column_config.rs +5 -2
  128. package/src/rust/tasks/send_plugin_config.rs +5 -2
  129. package/src/rust/tasks/set_edit_mode.rs +59 -0
  130. package/src/rust/tasks/sync_update_panels.rs +152 -0
  131. package/src/rust/tasks/table_lifecycle.rs +158 -0
  132. package/src/rust/tasks/update_theme.rs +56 -12
  133. package/src/rust/utils/completion.rs +56 -0
  134. package/src/rust/utils/custom_element.rs +5 -0
  135. package/src/rust/utils/debounce.rs +130 -7
  136. package/src/rust/utils/mod.rs +6 -0
  137. package/src/rust/utils/pending_effects.rs +62 -0
  138. package/src/rust/utils/spawn.rs +33 -0
  139. package/src/rust/utils/weak_scope.rs +0 -10
  140. package/src/rust/workspace.rs +846 -0
  141. package/src/svg/active-indicator.svg +3 -0
  142. package/src/themes/botanical.css +5 -2
  143. package/src/themes/defaults.css +54 -2
  144. package/src/themes/dracula.css +6 -3
  145. package/src/themes/gruvbox-dark.css +5 -2
  146. package/src/themes/gruvbox.css +5 -2
  147. package/src/themes/icons.css +4 -2
  148. package/src/themes/monokai.css +5 -2
  149. package/src/themes/phosphor.css +5 -2
  150. package/src/themes/pro-dark.css +5 -2
  151. package/src/themes/pro.css +2 -1
  152. package/src/themes/solarized-dark.css +5 -2
  153. package/src/themes/solarized.css +5 -2
  154. package/src/themes/vaporwave.css +5 -2
  155. package/src/ts/bootstrap.ts +8 -7
  156. package/src/ts/extensions.ts +30 -2
  157. package/src/ts/perspective-viewer.ts +10 -0
  158. package/src/ts/plugin.ts +72 -5
  159. package/src/ts/ts-rs/ClientOptions.ts +7 -0
  160. package/src/ts/ts-rs/ExportMethod.ts +3 -0
  161. package/src/ts/ts-rs/ExportOptions.ts +8 -0
  162. package/src/ts/ts-rs/GetClientOptions.ts +7 -0
  163. package/src/ts/ts-rs/GetTableOptions.ts +7 -0
  164. package/src/ts/ts-rs/Layout.ts +9 -0
  165. package/src/ts/ts-rs/Orientation.ts +6 -0
  166. package/src/ts/ts-rs/PanelOptions.ts +7 -0
  167. package/src/ts/ts-rs/PanelViewerConfig.ts +15 -0
  168. package/src/ts/ts-rs/SplitLayout.ts +5 -0
  169. package/src/ts/ts-rs/TabLayout.ts +11 -0
  170. package/src/ts/ts-rs/ViewerConfig.ts +6 -2
  171. package/src/ts/ts-rs/WorkspaceConfig.ts +36 -0
  172. package/src/ts/ts-rs/WorkspaceConfigUpdate.ts +24 -0
  173. package/src/rust/tasks/intersection_observer.rs +0 -98
  174. package/src/rust/tasks/update_and_render.rs +0 -110
  175. /package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline0.js → perspective-viewer-daeef4ceb066e6c7/inline1.js} +0 -0
  176. /package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline1.js → perspective-viewer-daeef4ceb066e6c7/inline2.js} +0 -0
  177. /package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline2.js → perspective-viewer-daeef4ceb066e6c7/inline3.js} +0 -0
  178. /package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline4.js → perspective-viewer-daeef4ceb066e6c7/inline5.js} +0 -0
@@ -14,13 +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
20
  use crate::renderer::*;
22
21
  use crate::session::*;
23
- use crate::utils::PtrEqRc;
22
+ use crate::tasks::apply_and_render;
23
+ use crate::utils::{PtrEqRc, spawn_owned};
24
24
 
25
25
  #[derive(Properties)]
26
26
  pub struct AggregateSelectorProps {
@@ -143,11 +143,8 @@ impl AggregateSelector {
143
143
 
144
144
  let session = ctx.props().session.clone();
145
145
  let renderer = ctx.props().renderer.clone();
146
- if session.update_view_config(config).is_ok() {
147
- ApiFuture::spawn(async move {
148
- renderer.apply_pending_plugin()?;
149
- renderer.draw(session.validate().await?.create_view()).await
150
- });
146
+ if let Ok(task) = apply_and_render(&session, &renderer, config) {
147
+ spawn_owned("aggregate-selector", task);
151
148
  }
152
149
  }
153
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;
@@ -29,6 +28,7 @@ use crate::presentation::Presentation;
29
28
  use crate::renderer::*;
30
29
  use crate::session::drag_drop_update::*;
31
30
  use crate::session::*;
31
+ use crate::tasks::apply_and_render;
32
32
  use crate::utils::*;
33
33
 
34
34
  #[derive(Clone, Properties)]
@@ -132,11 +132,8 @@ impl Component for ConfigSelector {
132
132
  {
133
133
  let session = ctx.props().session.clone();
134
134
  let renderer = ctx.props().renderer.clone();
135
- if session.update_view_config(config).is_ok() {
136
- ApiFuture::spawn(async move {
137
- renderer.apply_pending_plugin()?;
138
- renderer.draw(session.validate().await?.create_view()).await
139
- });
135
+ if let Ok(task) = apply_and_render(&session, &renderer, config) {
136
+ spawn_owned("config-selector", task);
140
137
  }
141
138
  }
142
139
 
@@ -152,11 +149,8 @@ impl Component for ConfigSelector {
152
149
  {
153
150
  let session = ctx.props().session.clone();
154
151
  let renderer = ctx.props().renderer.clone();
155
- if session.update_view_config(config).is_ok() {
156
- ApiFuture::spawn(async move {
157
- renderer.apply_pending_plugin()?;
158
- renderer.draw(session.validate().await?.create_view()).await
159
- });
152
+ if let Ok(task) = apply_and_render(&session, &renderer, config) {
153
+ spawn_owned("config-selector", task);
160
154
  }
161
155
  }
162
156
 
@@ -191,11 +185,8 @@ impl Component for ConfigSelector {
191
185
  {
192
186
  let session = ctx.props().session.clone();
193
187
  let renderer = ctx.props().renderer.clone();
194
- if session.update_view_config(config).is_ok() {
195
- ApiFuture::spawn(async move {
196
- renderer.apply_pending_plugin()?;
197
- renderer.draw(session.validate().await?.create_view()).await
198
- });
188
+ if let Ok(task) = apply_and_render(&session, &renderer, config) {
189
+ spawn_owned("config-selector", task);
199
190
  }
200
191
  }
201
192
 
@@ -214,11 +205,8 @@ impl Component for ConfigSelector {
214
205
  {
215
206
  let session = ctx.props().session.clone();
216
207
  let renderer = ctx.props().renderer.clone();
217
- if session.update_view_config(config).is_ok() {
218
- ApiFuture::spawn(async move {
219
- renderer.apply_pending_plugin()?;
220
- renderer.draw(session.validate().await?.create_view()).await
221
- });
208
+ if let Ok(task) = apply_and_render(&session, &renderer, config) {
209
+ spawn_owned("config-selector", task);
222
210
  }
223
211
  }
224
212
 
@@ -237,11 +225,8 @@ impl Component for ConfigSelector {
237
225
  {
238
226
  let session = ctx.props().session.clone();
239
227
  let renderer = ctx.props().renderer.clone();
240
- if session.update_view_config(config).is_ok() {
241
- ApiFuture::spawn(async move {
242
- renderer.apply_pending_plugin()?;
243
- renderer.draw(session.validate().await?.create_view()).await
244
- });
228
+ if let Ok(task) = apply_and_render(&session, &renderer, config) {
229
+ spawn_owned("config-selector", task);
245
230
  }
246
231
  }
247
232
 
@@ -270,11 +255,8 @@ impl Component for ConfigSelector {
270
255
  {
271
256
  let session = ctx.props().session.clone();
272
257
  let renderer = ctx.props().renderer.clone();
273
- if session.update_view_config(update).is_ok() {
274
- ApiFuture::spawn(async move {
275
- renderer.apply_pending_plugin()?;
276
- renderer.draw(session.validate().await?.create_view()).await
277
- });
258
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
259
+ spawn_owned("config-selector", task);
278
260
  }
279
261
  }
280
262
 
@@ -300,11 +282,8 @@ impl Component for ConfigSelector {
300
282
  {
301
283
  let session = ctx.props().session.clone();
302
284
  let renderer = ctx.props().renderer.clone();
303
- if session.update_view_config(update).is_ok() {
304
- ApiFuture::spawn(async move {
305
- renderer.apply_pending_plugin()?;
306
- renderer.draw(session.validate().await?.create_view()).await
307
- });
285
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
286
+ spawn_owned("config-selector", task);
308
287
  }
309
288
  }
310
289
  ctx.props().onselect.emit(());
@@ -345,11 +324,8 @@ impl Component for ConfigSelector {
345
324
  {
346
325
  let session = ctx.props().session.clone();
347
326
  let renderer = ctx.props().renderer.clone();
348
- if session.update_view_config(update).is_ok() {
349
- ApiFuture::spawn(async move {
350
- renderer.apply_pending_plugin()?;
351
- renderer.draw(session.validate().await?.create_view()).await
352
- });
327
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
328
+ spawn_owned("config-selector", task);
353
329
  }
354
330
  }
355
331
 
@@ -366,11 +342,8 @@ impl Component for ConfigSelector {
366
342
  {
367
343
  let session = ctx.props().session.clone();
368
344
  let renderer = ctx.props().renderer.clone();
369
- if session.update_view_config(update).is_ok() {
370
- ApiFuture::spawn(async move {
371
- renderer.apply_pending_plugin()?;
372
- renderer.draw(session.validate().await?.create_view()).await
373
- });
345
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
346
+ spawn_owned("config-selector", task);
374
347
  }
375
348
  }
376
349
 
@@ -388,11 +361,8 @@ impl Component for ConfigSelector {
388
361
  {
389
362
  let session = ctx.props().session.clone();
390
363
  let renderer = ctx.props().renderer.clone();
391
- if session.update_view_config(update).is_ok() {
392
- ApiFuture::spawn(async move {
393
- renderer.apply_pending_plugin()?;
394
- renderer.draw(session.validate().await?.create_view()).await
395
- });
364
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
365
+ spawn_owned("config-selector", task);
396
366
  }
397
367
  }
398
368
 
@@ -416,11 +386,8 @@ impl Component for ConfigSelector {
416
386
  {
417
387
  let session = ctx.props().session.clone();
418
388
  let renderer = ctx.props().renderer.clone();
419
- if session.update_view_config(update).is_ok() {
420
- ApiFuture::spawn(async move {
421
- renderer.apply_pending_plugin()?;
422
- renderer.draw(session.validate().await?.create_view()).await
423
- });
389
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
390
+ spawn_owned("config-selector", task);
424
391
  }
425
392
  }
426
393
 
@@ -438,11 +405,8 @@ impl Component for ConfigSelector {
438
405
  {
439
406
  let session = ctx.props().session.clone();
440
407
  let renderer = ctx.props().renderer.clone();
441
- if session.update_view_config(update).is_ok() {
442
- ApiFuture::spawn(async move {
443
- renderer.apply_pending_plugin()?;
444
- renderer.draw(session.validate().await?.create_view()).await
445
- });
408
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
409
+ spawn_owned("config-selector", task);
446
410
  }
447
411
  }
448
412
 
@@ -462,11 +426,8 @@ impl Component for ConfigSelector {
462
426
  {
463
427
  let session = ctx.props().session.clone();
464
428
  let renderer = ctx.props().renderer.clone();
465
- if session.update_view_config(update).is_ok() {
466
- ApiFuture::spawn(async move {
467
- renderer.apply_pending_plugin()?;
468
- renderer.draw(session.validate().await?.create_view()).await
469
- });
429
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
430
+ spawn_owned("config-selector", task);
470
431
  }
471
432
  }
472
433
 
@@ -486,11 +447,8 @@ impl Component for ConfigSelector {
486
447
  {
487
448
  let session = ctx.props().session.clone();
488
449
  let renderer = ctx.props().renderer.clone();
489
- if session.update_view_config(update).is_ok() {
490
- ApiFuture::spawn(async move {
491
- renderer.apply_pending_plugin()?;
492
- renderer.draw(session.validate().await?.create_view()).await
493
- });
450
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
451
+ spawn_owned("config-selector", task);
494
452
  }
495
453
  }
496
454
 
@@ -518,11 +476,8 @@ impl Component for ConfigSelector {
518
476
  {
519
477
  let session = ctx.props().session.clone();
520
478
  let renderer = ctx.props().renderer.clone();
521
- if session.update_view_config(update).is_ok() {
522
- ApiFuture::spawn(async move {
523
- renderer.apply_pending_plugin()?;
524
- renderer.draw(session.validate().await?.create_view()).await
525
- });
479
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
480
+ spawn_owned("config-selector", task);
526
481
  }
527
482
  }
528
483
 
@@ -544,11 +499,8 @@ impl Component for ConfigSelector {
544
499
  {
545
500
  let session = ctx.props().session.clone();
546
501
  let renderer = ctx.props().renderer.clone();
547
- if session.update_view_config(update).is_ok() {
548
- ApiFuture::spawn(async move {
549
- renderer.apply_pending_plugin()?;
550
- renderer.draw(session.validate().await?.create_view()).await
551
- });
502
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
503
+ spawn_owned("config-selector", task);
552
504
  }
553
505
  }
554
506
 
@@ -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::*;
@@ -27,6 +26,7 @@ use crate::components::type_icon::TypeIcon;
27
26
  use crate::presentation::Presentation;
28
27
  use crate::renderer::*;
29
28
  use crate::session::*;
29
+ use crate::tasks::apply_and_render;
30
30
  use crate::utils::*;
31
31
 
32
32
  #[derive(Clone, Properties)]
@@ -448,13 +448,8 @@ impl FilterColumnProps {
448
448
  ..ViewConfigUpdate::default()
449
449
  };
450
450
 
451
- if self.session.update_view_config(update).is_ok() {
452
- let session = self.session.clone();
453
- let renderer = self.renderer.clone();
454
- ApiFuture::spawn(async move {
455
- renderer.apply_pending_plugin()?;
456
- renderer.draw(session.validate().await?.create_view()).await
457
- });
451
+ if let Ok(task) = apply_and_render(&self.session, &self.renderer, update) {
452
+ spawn_owned("filter-column", task);
458
453
  }
459
454
  }
460
455
 
@@ -526,13 +521,8 @@ impl FilterColumnProps {
526
521
  ..ViewConfigUpdate::default()
527
522
  };
528
523
 
529
- if self.session.update_view_config(update).is_ok() {
530
- let session = self.session.clone();
531
- let renderer = self.renderer.clone();
532
- ApiFuture::spawn(async move {
533
- renderer.apply_pending_plugin()?;
534
- renderer.draw(session.validate().await?.create_view()).await
535
- });
524
+ if let Ok(task) = apply_and_render(&self.session, &self.renderer, update) {
525
+ spawn_owned("filter-column", task);
536
526
  }
537
527
  }
538
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
  }
@@ -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::*;
@@ -46,6 +45,7 @@ use crate::queries::{ActiveColumnState, ActiveColumnStateData, ColumnsIteratorSe
46
45
  use crate::renderer::*;
47
46
  use crate::session::drag_drop_update::*;
48
47
  use crate::session::*;
48
+ use crate::tasks::apply_and_render;
49
49
  use crate::utils::*;
50
50
 
51
51
  #[derive(Properties)]
@@ -218,11 +218,8 @@ impl Component for ColumnSelector {
218
218
 
219
219
  let session = ctx.props().session.clone();
220
220
  let renderer = ctx.props().renderer.clone();
221
- if session.update_view_config(update).is_ok() {
222
- ApiFuture::spawn(async move {
223
- renderer.apply_pending_plugin()?;
224
- renderer.draw(session.validate().await?.create_view()).await
225
- });
221
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
222
+ spawn_owned("column-selector", task);
226
223
  }
227
224
  }
228
225
 
@@ -246,11 +243,8 @@ impl Component for ColumnSelector {
246
243
 
247
244
  let session = ctx.props().session.clone();
248
245
  let renderer = ctx.props().renderer.clone();
249
- if session.update_view_config(update).is_ok() {
250
- ApiFuture::spawn(async move {
251
- renderer.apply_pending_plugin()?;
252
- renderer.draw(session.validate().await?.create_view()).await
253
- });
246
+ if let Ok(task) = apply_and_render(&session, &renderer, update) {
247
+ spawn_owned("column-selector", task);
254
248
  }
255
249
 
256
250
  true