@perspective-dev/viewer 5.3.1 → 5.5.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 (291) hide show
  1. package/dist/cdn/perspective-viewer.js +6 -6
  2. package/dist/cdn/perspective-viewer.js.map +2 -2
  3. package/dist/css/blueprint.css +1 -1
  4. package/dist/css/botanical.css +1 -1
  5. package/dist/css/dracula.css +1 -1
  6. package/dist/css/eggplant.css +1 -1
  7. package/dist/css/gruvbox-dark.css +1 -1
  8. package/dist/css/gruvbox.css +1 -1
  9. package/dist/css/icons.css +1 -1
  10. package/dist/css/intl/ar.css +1 -0
  11. package/dist/css/intl/de.css +1 -1
  12. package/dist/css/intl/es.css +1 -1
  13. package/dist/css/intl/fr.css +1 -1
  14. package/dist/css/intl/ja.css +1 -1
  15. package/dist/css/intl/pt.css +1 -1
  16. package/dist/css/intl/zh.css +1 -1
  17. package/dist/css/intl.css +1 -1
  18. package/dist/css/ledger.css +1 -1
  19. package/dist/css/monokai.css +1 -1
  20. package/dist/css/nord.css +1 -1
  21. package/dist/css/phosphor.css +1 -1
  22. package/dist/css/pro-dark.css +1 -1
  23. package/dist/css/pro.css +1 -1
  24. package/dist/css/solarized-dark.css +1 -1
  25. package/dist/css/solarized.css +1 -1
  26. package/dist/css/themes.css +1 -1
  27. package/dist/css/vaporwave.css +1 -1
  28. package/dist/css/velvet.css +1 -1
  29. package/dist/docs/perspective-docs.json +1 -1
  30. package/dist/esm/extensions.d.ts +0 -5
  31. package/dist/esm/perspective-viewer.d.ts +2 -0
  32. package/dist/esm/perspective-viewer.inline.js +8 -8
  33. package/dist/esm/perspective-viewer.inline.js.map +2 -2
  34. package/dist/esm/perspective-viewer.js +5 -5
  35. package/dist/esm/perspective-viewer.js.map +2 -2
  36. package/dist/esm/plugin.d.ts +9 -0
  37. package/dist/esm/ts-rs/AddPanelOptions.d.ts +9 -0
  38. package/dist/esm/ts-rs/GetViewMode.d.ts +4 -0
  39. package/dist/esm/ts-rs/GetViewOptions.d.ts +8 -0
  40. package/dist/esm/ts-rs/RestoreOptions.d.ts +6 -0
  41. package/dist/esm/ts-rs/RestoreWorkspaceOptions.d.ts +9 -0
  42. package/dist/esm/ts-rs/ViewOnUpdateResp.d.ts +1 -1
  43. package/dist/esm/ts-rs/WorkspaceConfigUpdate.d.ts +30 -22
  44. package/dist/wasm/perspective-viewer.d.ts +137 -104
  45. package/dist/wasm/perspective-viewer.js +337 -269
  46. package/dist/wasm/perspective-viewer.wasm +0 -0
  47. package/dist/wasm/perspective-viewer.wasm.d.ts +20 -30
  48. package/package.json +7 -7
  49. package/src/css/_context_menu.css +1 -1
  50. package/src/css/_dropdown_menu.css +1 -1
  51. package/src/css/_viewer_bundle.css +7 -8
  52. package/src/css/column-dropdown.css +0 -3
  53. package/src/css/column-selector.css +18 -7
  54. package/src/css/column-settings-panel.css +0 -225
  55. package/src/css/column-style.css +175 -0
  56. package/src/css/config-selector.css +19 -11
  57. package/src/css/filter-dropdown.css +5 -5
  58. package/src/css/form/debug.css +37 -4
  59. package/src/css/function-dropdown.css +5 -5
  60. package/src/css/panel-tab.css +23 -0
  61. package/src/css/plugin-selector.css +5 -5
  62. package/src/css/render-warning.css +1 -1
  63. package/src/css/status-bar.css +63 -21
  64. package/src/css/type-icon.css +1 -3
  65. package/src/css/{containers → ui/containers}/context-menu.css +22 -16
  66. package/src/css/ui/containers/dropdown-menu-items.css +66 -0
  67. package/src/css/{containers → ui/containers}/dropdown-menu.css +8 -53
  68. package/src/css/{containers → ui/containers}/tabs.css +2 -1
  69. package/src/css/viewer.css +32 -26
  70. package/src/rust/agent/tools.rs +80 -7
  71. package/src/rust/components/chat_panel.rs +1 -1
  72. package/src/rust/components/{form/code_editor.rs → code_editor.rs} +4 -2
  73. package/src/rust/components/column_dropdown.rs +2 -2
  74. package/src/rust/components/column_selector/active_column.rs +24 -9
  75. package/src/rust/components/column_selector/aggregate_selector.rs +1 -1
  76. package/src/rust/components/column_selector/config_selector.rs +2 -2
  77. package/src/rust/components/column_selector/filter_column.rs +8 -5
  78. package/src/rust/components/column_selector/inactive_column.rs +4 -2
  79. package/src/rust/components/column_selector/pivot_column.rs +4 -3
  80. package/src/rust/components/column_selector/sort_column.rs +7 -4
  81. package/src/rust/components/column_selector.rs +14 -3
  82. package/src/rust/components/column_settings_sidebar/style_tab/agg_depth_selector.rs +1 -1
  83. package/src/rust/components/column_settings_sidebar/style_tab/alignment_field.rs +90 -0
  84. package/src/rust/components/column_settings_sidebar/style_tab/font_field.rs +267 -0
  85. package/src/rust/components/column_settings_sidebar/style_tab/primitive_field.rs +16 -18
  86. package/src/rust/components/column_settings_sidebar/style_tab/symbol/symbol_selector.rs +1 -1
  87. package/src/rust/components/column_settings_sidebar/style_tab.rs +70 -12
  88. package/src/rust/components/column_settings_sidebar.rs +3 -4
  89. package/src/rust/components/copy_dropdown.rs +1 -1
  90. package/src/rust/components/datetime_column_style/custom.rs +1 -3
  91. package/src/rust/components/datetime_column_style/simple.rs +1 -2
  92. package/src/rust/components/datetime_column_style.rs +1 -2
  93. package/src/rust/components/{form/debug.rs → debug_panel.rs} +112 -55
  94. package/src/rust/components/{containers/dragdrop_list.rs → dragdrop_list.rs} +2 -10
  95. package/src/rust/components/export_dropdown.rs +1 -1
  96. package/src/rust/components/expression_editor.rs +1 -1
  97. package/src/rust/components/filter_dropdown.rs +2 -2
  98. package/src/rust/components/function_dropdown.rs +2 -2
  99. package/src/rust/components/main_panel/frame_theme.rs +3 -59
  100. package/src/rust/components/main_panel/msg.rs +4 -0
  101. package/src/rust/components/main_panel/reconcile.rs +9 -4
  102. package/src/rust/components/main_panel/render.rs +62 -11
  103. package/src/rust/components/main_panel/update.rs +39 -10
  104. package/src/rust/components/main_panel.rs +40 -2
  105. package/src/rust/components/mod.rs +5 -8
  106. package/src/rust/components/new_panel_menu.rs +97 -0
  107. package/src/rust/components/number_series_style.rs +2 -3
  108. package/src/rust/components/panel_menu.rs +61 -87
  109. package/src/rust/components/panel_tab.rs +100 -43
  110. package/src/rust/components/plugin_tab.rs +58 -4
  111. package/src/rust/components/render_warning.rs +2 -2
  112. package/src/rust/components/{status_bar_counter.rs → rows_counter.rs} +10 -10
  113. package/src/rust/components/settings_panel.rs +8 -2
  114. package/src/rust/components/status_bar.rs +113 -19
  115. package/src/rust/components/status_indicator.rs +9 -14
  116. package/src/rust/components/{style/mod.rs → style.rs} +32 -15
  117. package/src/rust/components/style_controls/number_string_format/digits_section.rs +3 -5
  118. package/src/rust/components/style_controls/number_string_format/misc_section.rs +1 -1
  119. package/src/rust/components/style_controls/number_string_format/style_section.rs +1 -1
  120. package/src/rust/components/viewer/msg.rs +43 -30
  121. package/src/rust/components/viewer/panels.rs +53 -19
  122. package/src/rust/components/viewer/render.rs +16 -13
  123. package/src/rust/components/viewer/settings.rs +137 -68
  124. package/src/rust/components/viewer/snapshots.rs +5 -10
  125. package/src/rust/components/viewer/wiring.rs +11 -22
  126. package/src/rust/components/viewer.rs +15 -10
  127. package/src/rust/components/window_editor.rs +8 -9
  128. package/src/rust/config/column_config_schema.rs +312 -33
  129. package/src/rust/config/datetime_column_style.rs +0 -11
  130. package/src/rust/config/mod.rs +0 -4
  131. package/src/rust/config/options.rs +50 -0
  132. package/src/rust/config/workspace_config.rs +70 -24
  133. package/src/rust/custom_elements/debug_plugin.rs +1 -10
  134. package/src/rust/custom_elements/mod.rs +0 -3
  135. package/src/rust/custom_elements/viewer.rs +194 -115
  136. package/src/rust/js/plugin.rs +3 -87
  137. package/src/rust/lib.rs +19 -18
  138. package/src/rust/presentation/column_locator.rs +3 -7
  139. package/src/rust/presentation.rs +68 -38
  140. package/src/rust/queries/hosted_tables.rs +38 -0
  141. package/src/rust/queries/mod.rs +2 -0
  142. package/src/rust/queries/palette_set.rs +1 -1
  143. package/src/rust/queries/plugin_column_styles.rs +6 -5
  144. package/src/rust/renderer/activate.rs +1 -3
  145. package/src/rust/renderer/dispatch.rs +83 -22
  146. package/src/rust/renderer/limits.rs +24 -5
  147. package/src/rust/renderer/plugin_config.rs +201 -41
  148. package/src/rust/renderer/plugin_store.rs +2 -1
  149. package/src/rust/renderer/props.rs +7 -1
  150. package/src/rust/renderer.rs +23 -27
  151. package/src/rust/session/props.rs +8 -3
  152. package/src/rust/session/view_subscription.rs +19 -6
  153. package/src/rust/session.rs +189 -150
  154. package/src/rust/tasks/create_panel.rs +5 -2
  155. package/src/rust/tasks/dismiss_render_warning.rs +1 -1
  156. package/src/rust/tasks/eject.rs +1 -0
  157. package/src/rust/tasks/pipeline.rs +18 -67
  158. package/src/rust/tasks/presize_panels.rs +24 -1
  159. package/src/rust/tasks/restore_and_render.rs +0 -17
  160. package/src/rust/tasks/restore_panel.rs +129 -30
  161. package/src/rust/tasks/send_column_config.rs +4 -1
  162. package/src/rust/tasks/send_plugin_config.rs +1 -1
  163. package/src/rust/tasks/set_edit_mode.rs +1 -1
  164. package/src/rust/tasks/sync_update_panels.rs +147 -67
  165. package/src/rust/tasks/table_lifecycle.rs +7 -1
  166. package/src/rust/{components → ui}/containers/control_group.rs +25 -3
  167. package/src/rust/{components → ui}/containers/dropdown_menu.rs +5 -2
  168. package/src/rust/{components → ui}/containers/mod.rs +0 -4
  169. package/src/rust/{components → ui}/containers/scroll_panel.rs +0 -22
  170. package/src/rust/{components → ui}/containers/scroll_panel_item.rs +0 -13
  171. package/src/rust/{components → ui}/containers/select.rs +0 -6
  172. package/src/rust/{components → ui}/containers/sidebar.rs +5 -32
  173. package/src/rust/{components → ui}/containers/split_panel.rs +8 -80
  174. package/src/rust/{components → ui}/containers/tab_list.rs +15 -9
  175. package/src/rust/{components → ui}/context_menu.rs +8 -13
  176. package/src/rust/{presentation/drag_helpers.rs → ui/dragdrop.rs} +26 -31
  177. package/src/rust/{components → ui}/font_loader.rs +0 -26
  178. package/src/rust/{components → ui}/form/color_selector.rs +4 -2
  179. package/src/rust/{config/datetime_column_style/color_mode.rs → ui/form/intl_label.rs} +42 -42
  180. package/src/rust/{components → ui}/form/mirrored_textarea.rs +0 -53
  181. package/src/rust/{components → ui}/form/mod.rs +1 -10
  182. package/src/rust/{components → ui}/form/multi_stop_gradient_selector.rs +4 -5
  183. package/src/rust/{components → ui}/form/named_value_picker.rs +1 -6
  184. package/src/rust/{components → ui}/form/number_field.rs +1 -1
  185. package/src/rust/{components → ui}/form/number_range_field.rs +1 -1
  186. package/src/rust/{components → ui}/form/optional_field.rs +3 -1
  187. package/src/rust/{components → ui}/form/palette_selector.rs +4 -5
  188. package/src/rust/{components → ui}/form/select_enum_field.rs +2 -2
  189. package/src/rust/{components → ui}/form/select_value_field.rs +2 -2
  190. package/src/rust/ui/mod.rs +56 -0
  191. package/src/rust/ui/modal.rs +61 -0
  192. package/src/rust/{components → ui}/portal.rs +175 -79
  193. package/src/rust/{components/style/style_provider.rs → ui/style.rs} +4 -34
  194. package/src/rust/utils/completion.rs +0 -6
  195. package/src/rust/{config/css_scale.rs → utils/css.rs} +38 -35
  196. package/src/rust/utils/css_vars.rs +13 -0
  197. package/src/rust/utils/local_fonts.rs +395 -0
  198. package/src/rust/utils/mod.rs +4 -0
  199. package/src/rust/workspace.rs +47 -0
  200. package/src/svg/boolean-type.svg +3 -2
  201. package/src/svg/checkbox-checked-icon.svg +4 -7
  202. package/src/svg/checkbox-hover.svg +3 -3
  203. package/src/svg/checkbox-off.svg +2 -3
  204. package/src/svg/checkbox-on.svg +3 -3
  205. package/src/svg/checkbox-unchecked-icon.svg +3 -3
  206. package/src/svg/datagrid-select-column.svg +8 -15
  207. package/src/svg/datagrid-select-region.svg +8 -15
  208. package/src/svg/datagrid-select-row-tree.svg +7 -12
  209. package/src/svg/datagrid-select-row.svg +8 -13
  210. package/src/svg/date-type.svg +4 -23
  211. package/src/svg/drawer-tab-hover.svg +4 -6
  212. package/src/svg/drawer-tab-invert-hover.svg +5 -5
  213. package/src/svg/drawer-tab-invert.svg +3 -5
  214. package/src/svg/drawer-tab.svg +5 -5
  215. package/src/svg/mega-menu-icons-candlestick.svg +5 -37
  216. package/src/svg/mega-menu-icons-ohlc.svg +4 -39
  217. package/src/svg/mega-menu-icons-sunburst.svg +4 -38
  218. package/src/svg/mega-menu-icons-treemap.svg +3 -43
  219. package/src/svg/mega-menu-icons-y-scatter.svg +12 -72
  220. package/src/svg/new-panel-icon.svg +4 -0
  221. package/src/svg/number-type.svg +3 -3
  222. package/src/svg/radio-hover.svg +3 -3
  223. package/src/svg/radio-off.svg +3 -3
  224. package/src/svg/radio-on.svg +3 -3
  225. package/src/svg/status_ok.svg +3 -26
  226. package/src/svg/status_pending.svg +3 -0
  227. package/src/svg/string-type.svg +4 -8
  228. package/src/svg/theme-icon.svg +5 -5
  229. package/src/themes/blueprint.css +0 -57
  230. package/src/themes/botanical.css +0 -36
  231. package/src/themes/defaults.css +1 -24
  232. package/src/themes/dracula.css +0 -58
  233. package/src/themes/eggplant.css +0 -58
  234. package/src/themes/gruvbox-dark.css +0 -65
  235. package/src/themes/gruvbox.css +1 -39
  236. package/src/themes/icons.css +2 -8
  237. package/src/themes/intl/ar.css +198 -0
  238. package/src/themes/intl/de.css +63 -40
  239. package/src/themes/intl/es.css +58 -35
  240. package/src/themes/intl/fr.css +57 -34
  241. package/src/themes/intl/ja.css +59 -36
  242. package/src/themes/intl/pt.css +54 -31
  243. package/src/themes/intl/zh.css +65 -42
  244. package/src/themes/intl.css +34 -8
  245. package/src/themes/ledger.css +1 -59
  246. package/src/themes/monokai.css +0 -51
  247. package/src/themes/nord.css +0 -55
  248. package/src/themes/phosphor.css +0 -48
  249. package/src/themes/pro-dark.css +0 -37
  250. package/src/themes/pro.css +3 -23
  251. package/src/themes/solarized-dark.css +0 -31
  252. package/src/themes/solarized.css +1 -24
  253. package/src/themes/vaporwave.css +0 -44
  254. package/src/themes/velvet.css +0 -60
  255. package/src/ts/extensions.ts +0 -13
  256. package/src/ts/perspective-viewer.ts +2 -0
  257. package/src/ts/plugin.ts +9 -0
  258. package/src/ts/ts-rs/AddPanelOptions.ts +10 -0
  259. package/src/ts/ts-rs/{DatetimeColorMode.ts → GetViewMode.ts} +4 -1
  260. package/src/ts/ts-rs/GetViewOptions.ts +7 -0
  261. package/src/ts/ts-rs/RestoreOptions.ts +7 -1
  262. package/src/ts/ts-rs/RestoreWorkspaceOptions.ts +10 -0
  263. package/src/ts/ts-rs/ViewOnUpdateResp.ts +1 -1
  264. package/src/ts/ts-rs/WorkspaceConfigUpdate.ts +31 -20
  265. package/dist/esm/ts-rs/DatetimeColorMode.d.ts +0 -1
  266. package/dist/esm/ts-rs/FormatMode.d.ts +0 -1
  267. package/dist/esm/ts-rs/StringColorMode.d.ts +0 -1
  268. package/src/css/plugin-settings-panel.css +0 -171
  269. package/src/rust/components/modal.rs +0 -177
  270. package/src/rust/components/string_column_style.rs +0 -121
  271. package/src/rust/config/string_column_style.rs +0 -135
  272. package/src/rust/custom_elements/copy_dropdown.rs +0 -219
  273. package/src/rust/custom_elements/export_dropdown.rs +0 -216
  274. package/src/rust/custom_elements/modal.rs +0 -299
  275. package/src/ts/ts-rs/FormatMode.ts +0 -3
  276. package/src/ts/ts-rs/StringColorMode.ts +0 -3
  277. /package/dist/wasm/snippets/{perspective-viewer-87bd21b215d0631a → perspective-viewer-ea71a3990cad35d7}/inline0.js +0 -0
  278. /package/dist/wasm/snippets/{perspective-viewer-87bd21b215d0631a → perspective-viewer-ea71a3990cad35d7}/inline1.js +0 -0
  279. /package/dist/wasm/snippets/{perspective-viewer-87bd21b215d0631a → perspective-viewer-ea71a3990cad35d7}/inline2.js +0 -0
  280. /package/dist/wasm/snippets/{perspective-viewer-87bd21b215d0631a → perspective-viewer-ea71a3990cad35d7}/inline3.js +0 -0
  281. /package/dist/wasm/snippets/{perspective-viewer-87bd21b215d0631a → perspective-viewer-ea71a3990cad35d7}/inline4.js +0 -0
  282. /package/dist/wasm/snippets/{perspective-viewer-87bd21b215d0631a → perspective-viewer-ea71a3990cad35d7}/inline5.js +0 -0
  283. /package/src/css/{containers → ui/containers}/scroll-panel.css +0 -0
  284. /package/src/css/{containers → ui/containers}/split-panel.css +0 -0
  285. /package/src/css/{dom → ui/dom}/checkbox.css +0 -0
  286. /package/src/css/{dom → ui/dom}/scrollbar.css +0 -0
  287. /package/src/css/{dom → ui/dom}/select.css +0 -0
  288. /package/src/css/{form → ui/form}/mirrored-textarea.css +0 -0
  289. /package/src/rust/components/{form → code_editor}/highlight.rs +0 -0
  290. /package/src/rust/{components → ui}/containers/sidebar_close_button.rs +0 -0
  291. /package/src/rust/{components → ui}/form/number_input.rs +0 -0
@@ -1,135 +0,0 @@
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
- use std::fmt::Display;
14
- use std::str::FromStr;
15
-
16
- use serde::{Deserialize, Serialize};
17
- use strum::EnumIter;
18
- use ts_rs::TS;
19
-
20
- #[derive(Clone, Copy, Debug, Default, Deserialize, Eq, EnumIter, PartialEq, Serialize, TS)]
21
- pub enum StringColorMode {
22
- #[default]
23
- #[serde(rename = "none")]
24
- None,
25
-
26
- #[serde(rename = "foreground")]
27
- Foreground,
28
-
29
- #[serde(rename = "background")]
30
- Background,
31
-
32
- #[serde(rename = "series")]
33
- Series,
34
- }
35
-
36
- impl Display for StringColorMode {
37
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
38
- let text = match self {
39
- Self::None => "none",
40
- Self::Foreground => "foreground",
41
- Self::Background => "background",
42
- Self::Series => "series",
43
- };
44
-
45
- write!(f, "{text}")
46
- }
47
- }
48
-
49
- impl FromStr for StringColorMode {
50
- type Err = String;
51
-
52
- fn from_str(s: &str) -> Result<Self, Self::Err> {
53
- match s {
54
- "none" => Ok(Self::None),
55
- "foreground" => Ok(Self::Foreground),
56
- "background" => Ok(Self::Background),
57
- "series" => Ok(Self::Series),
58
- x => Err(format!("Unknown StringColorMode::{x}")),
59
- }
60
- }
61
- }
62
-
63
- impl StringColorMode {
64
- pub fn is_none(&self) -> bool {
65
- self == &Self::None
66
- }
67
- }
68
-
69
- #[derive(Clone, Copy, Debug, Default, Deserialize, EnumIter, Eq, PartialEq, Serialize, TS)]
70
- pub enum FormatMode {
71
- #[default]
72
- #[serde(rename = "none")]
73
- None,
74
-
75
- #[serde(rename = "link")]
76
- Link,
77
-
78
- // #[serde(rename = "image")]
79
- // Image,
80
- #[serde(rename = "bold")]
81
- Bold,
82
-
83
- #[serde(rename = "italics")]
84
- Italics,
85
- }
86
-
87
- impl Display for FormatMode {
88
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
89
- let text = match self {
90
- Self::None => "none",
91
- Self::Link => "link",
92
- // Self::Image => "image",
93
- Self::Bold => "bold",
94
- Self::Italics => "italics",
95
- };
96
-
97
- write!(f, "{text}")
98
- }
99
- }
100
-
101
- impl FromStr for FormatMode {
102
- type Err = String;
103
-
104
- fn from_str(s: &str) -> Result<Self, Self::Err> {
105
- match s {
106
- "none" => Ok(Self::None),
107
- "link" => Ok(Self::Link),
108
- // "image" => Ok(Self::Image),
109
- "bold" => Ok(Self::Bold),
110
- "italics" => Ok(Self::Italics),
111
- x => Err(format!("Unknown format mode {x}")),
112
- }
113
- }
114
- }
115
-
116
- impl FormatMode {
117
- fn is_none(&self) -> bool {
118
- self == &Self::None
119
- }
120
- }
121
-
122
- #[derive(Debug, Clone, Default, Deserialize, Eq, PartialEq, Serialize, TS)]
123
- pub struct StringColumnStyleConfig {
124
- #[serde(skip_serializing_if = "FormatMode::is_none")]
125
- #[serde(default)]
126
- pub format: FormatMode,
127
-
128
- #[serde(skip_serializing_if = "StringColorMode::is_none")]
129
- #[serde(default)]
130
- pub string_color_mode: StringColorMode,
131
-
132
- #[serde(skip_serializing_if = "Option::is_none")]
133
- #[serde(default)]
134
- pub color: Option<String>,
135
- }
@@ -1,219 +0,0 @@
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
- use std::cell::RefCell;
14
- use std::rc::Rc;
15
-
16
- use perspective_js::utils::global;
17
- use wasm_bindgen::prelude::*;
18
- use wasm_bindgen_futures::spawn_local;
19
- use web_sys::*;
20
- use yew::prelude::*;
21
-
22
- use super::viewer::PerspectiveViewerElement;
23
- use crate::components::copy_dropdown::CopyDropDownMenu;
24
- use crate::components::portal::PortalModal;
25
- use crate::components::style::{StyleProvider, StyleSurface};
26
- use crate::config::*;
27
- use crate::js::*;
28
- use crate::presentation::Presentation;
29
- use crate::renderer::*;
30
- use crate::session::Session;
31
- use crate::tasks::*;
32
- use crate::utils::*;
33
- use crate::*;
34
-
35
- type TargetState = Rc<RefCell<Option<HtmlElement>>>;
36
-
37
- #[derive(Properties, PartialEq)]
38
- struct CopyDropDownWrapperProps {
39
- renderer: Renderer,
40
- callback: Callback<ExportFile>,
41
- target: TargetState,
42
- custom_element: HtmlElement,
43
- #[prop_or_default]
44
- theme: String,
45
- }
46
-
47
- enum CopyDropDownWrapperMsg {
48
- Open,
49
- Close,
50
- }
51
-
52
- struct CopyDropDownWrapper {
53
- target: Option<HtmlElement>,
54
- }
55
-
56
- impl Component for CopyDropDownWrapper {
57
- type Message = CopyDropDownWrapperMsg;
58
- type Properties = CopyDropDownWrapperProps;
59
-
60
- fn create(_ctx: &Context<Self>) -> Self {
61
- Self { target: None }
62
- }
63
-
64
- fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
65
- match msg {
66
- CopyDropDownWrapperMsg::Open => {
67
- self.target = ctx.props().target.borrow().clone();
68
- true
69
- },
70
- CopyDropDownWrapperMsg::Close => {
71
- self.target = None;
72
- true
73
- },
74
- }
75
- }
76
-
77
- fn view(&self, ctx: &Context<Self>) -> Html {
78
- let on_close = ctx.link().callback(|_| CopyDropDownWrapperMsg::Close);
79
- html! {
80
- <StyleProvider
81
- root={ctx.props().custom_element.clone()}
82
- surface={StyleSurface::DropdownMenu}
83
- >
84
- <PortalModal
85
- tag_name="perspective-copy-menu"
86
- surface={StyleSurface::DropdownMenu}
87
- target={self.target.clone()}
88
- own_focus=true
89
- {on_close}
90
- theme={ctx.props().theme.clone()}
91
- >
92
- <CopyDropDownMenu
93
- renderer={ctx.props().renderer.clone()}
94
- callback={ctx.props().callback.clone()}
95
- />
96
- </PortalModal>
97
- </StyleProvider>
98
- }
99
- }
100
- }
101
-
102
- #[wasm_bindgen]
103
- #[derive(Clone)]
104
- pub struct CopyDropDownMenuElement {
105
- elem: HtmlElement,
106
- target: TargetState,
107
- root: Rc<RefCell<Option<AppHandle<CopyDropDownWrapper>>>>,
108
- }
109
-
110
- impl CustomElementMetadata for CopyDropDownMenuElement {
111
- const CUSTOM_ELEMENT_NAME: &'static str = "perspective-copy-menu";
112
- }
113
-
114
- #[wasm_bindgen]
115
- impl CopyDropDownMenuElement {
116
- #[wasm_bindgen(constructor)]
117
- pub fn new(elem: HtmlElement) -> Self {
118
- Self {
119
- elem,
120
- target: Default::default(),
121
- root: Default::default(),
122
- }
123
- }
124
-
125
- pub fn open(&self, target: HtmlElement) {
126
- *self.target.borrow_mut() = Some(target);
127
- if let Some(root) = self.root.borrow().as_ref() {
128
- root.send_message(CopyDropDownWrapperMsg::Open);
129
- }
130
- }
131
-
132
- pub fn hide(&self) -> ApiResult<()> {
133
- if let Some(root) = self.root.borrow().as_ref() {
134
- root.send_message(CopyDropDownWrapperMsg::Close);
135
- }
136
- Ok(())
137
- }
138
-
139
- pub fn __set_model(&self, parent: &PerspectiveViewerElement) {
140
- if let Some(panel) = parent.workspace.active_panel() {
141
- self.set_config_model(&panel.session, &panel.renderer, &parent.presentation);
142
- }
143
- }
144
-
145
- pub fn connected_callback(&self) {}
146
- }
147
-
148
- impl CopyDropDownMenuElement {
149
- pub fn new_from_model(
150
- session: &Session,
151
- renderer: &Renderer,
152
- presentation: &Presentation,
153
- ) -> Self {
154
- let dropdown = global::document()
155
- .create_element("perspective-copy-menu")
156
- .unwrap()
157
- .unchecked_into::<HtmlElement>();
158
-
159
- let elem = Self::new(dropdown);
160
- elem.set_config_model(session, renderer, presentation);
161
- elem
162
- }
163
-
164
- pub fn set_config_model(
165
- &self,
166
- session: &Session,
167
- renderer: &Renderer,
168
- presentation: &Presentation,
169
- ) {
170
- let callback = Callback::from({
171
- let session = session.clone();
172
- let renderer = renderer.clone();
173
- let presentation = presentation.clone();
174
- let target = self.target.clone();
175
- let root = self.root.clone();
176
- move |x: ExportFile| {
177
- let session = session.clone();
178
- let renderer = renderer.clone();
179
- let presentation = presentation.clone();
180
- let target = target.clone();
181
- let root = root.clone();
182
- spawn_local(async move {
183
- let mime = x.method.mimetype(x.is_chart);
184
- let task = export_method_to_blob(&session, &renderer, &presentation, x.method);
185
- let result = copy_to_clipboard(task, mime).await;
186
- let r = (|| -> ApiResult<()> {
187
- result?;
188
- *target.borrow_mut() = None;
189
- if let Some(root) = root.borrow().as_ref() {
190
- root.send_message(CopyDropDownWrapperMsg::Close);
191
- }
192
- Ok(())
193
- })();
194
- if let Err(e) = r {
195
- web_sys::console::warn_1(&e.into());
196
- }
197
- })
198
- }
199
- });
200
-
201
- let renderer = renderer.clone();
202
- let init = ShadowRootInit::new(ShadowRootMode::Open);
203
- let shadow_root = self
204
- .elem
205
- .attach_shadow(&init)
206
- .unwrap()
207
- .unchecked_into::<Element>();
208
-
209
- let props = yew::props!(CopyDropDownWrapperProps {
210
- renderer,
211
- callback,
212
- target: self.target.clone(),
213
- custom_element: self.elem.clone()
214
- });
215
-
216
- let handle = yew::Renderer::with_root_and_props(shadow_root, props).render();
217
- *self.root.borrow_mut() = Some(handle);
218
- }
219
- }
@@ -1,216 +0,0 @@
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
- use std::cell::RefCell;
14
- use std::rc::Rc;
15
-
16
- use perspective_js::utils::global;
17
- use wasm_bindgen::prelude::*;
18
- use wasm_bindgen_futures::spawn_local;
19
- use web_sys::*;
20
- use yew::prelude::*;
21
-
22
- use super::viewer::PerspectiveViewerElement;
23
- use crate::components::export_dropdown::ExportDropDownMenu;
24
- use crate::components::portal::PortalModal;
25
- use crate::components::style::{StyleProvider, StyleSurface};
26
- use crate::config::*;
27
- use crate::presentation::Presentation;
28
- use crate::renderer::*;
29
- use crate::session::*;
30
- use crate::tasks::*;
31
- use crate::utils::*;
32
- use crate::*;
33
-
34
- type TargetState = Rc<RefCell<Option<HtmlElement>>>;
35
-
36
- #[derive(Properties, PartialEq)]
37
- struct ExportDropDownWrapperProps {
38
- renderer: Renderer,
39
- session: Session,
40
- callback: Callback<ExportFile>,
41
- target: TargetState,
42
- custom_element: HtmlElement,
43
- #[prop_or_default]
44
- theme: String,
45
- }
46
-
47
- enum ExportDropDownWrapperMsg {
48
- Open,
49
- Close,
50
- }
51
-
52
- struct ExportDropDownWrapper {
53
- target: Option<HtmlElement>,
54
- }
55
-
56
- impl Component for ExportDropDownWrapper {
57
- type Message = ExportDropDownWrapperMsg;
58
- type Properties = ExportDropDownWrapperProps;
59
-
60
- fn create(_ctx: &Context<Self>) -> Self {
61
- Self { target: None }
62
- }
63
-
64
- fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
65
- match msg {
66
- ExportDropDownWrapperMsg::Open => {
67
- self.target = ctx.props().target.borrow().clone();
68
- true
69
- },
70
- ExportDropDownWrapperMsg::Close => {
71
- self.target = None;
72
- true
73
- },
74
- }
75
- }
76
-
77
- fn view(&self, ctx: &Context<Self>) -> Html {
78
- let on_close = ctx.link().callback(|_| ExportDropDownWrapperMsg::Close);
79
- html! {
80
- <StyleProvider
81
- root={ctx.props().custom_element.clone()}
82
- surface={StyleSurface::DropdownMenu}
83
- >
84
- <PortalModal
85
- tag_name="perspective-export-menu"
86
- surface={StyleSurface::DropdownMenu}
87
- target={self.target.clone()}
88
- own_focus=true
89
- {on_close}
90
- theme={ctx.props().theme.clone()}
91
- >
92
- <ExportDropDownMenu
93
- renderer={ctx.props().renderer.clone()}
94
- session={ctx.props().session.clone()}
95
- callback={ctx.props().callback.clone()}
96
- />
97
- </PortalModal>
98
- </StyleProvider>
99
- }
100
- }
101
- }
102
-
103
- #[wasm_bindgen]
104
- #[derive(Clone)]
105
- pub struct ExportDropDownMenuElement {
106
- elem: HtmlElement,
107
- target: TargetState,
108
- root: Rc<RefCell<Option<AppHandle<ExportDropDownWrapper>>>>,
109
- }
110
-
111
- impl CustomElementMetadata for ExportDropDownMenuElement {
112
- const CUSTOM_ELEMENT_NAME: &'static str = "perspective-export-menu";
113
- }
114
-
115
- #[wasm_bindgen]
116
- impl ExportDropDownMenuElement {
117
- #[wasm_bindgen(constructor)]
118
- pub fn new(elem: HtmlElement) -> Self {
119
- Self {
120
- elem,
121
- target: Default::default(),
122
- root: Default::default(),
123
- }
124
- }
125
-
126
- pub fn open(&self, target: HtmlElement) {
127
- *self.target.borrow_mut() = Some(target);
128
- if let Some(root) = self.root.borrow().as_ref() {
129
- root.send_message(ExportDropDownWrapperMsg::Open);
130
- }
131
- }
132
-
133
- pub fn hide(&self) -> ApiResult<()> {
134
- if let Some(root) = self.root.borrow().as_ref() {
135
- root.send_message(ExportDropDownWrapperMsg::Close);
136
- }
137
- Ok(())
138
- }
139
-
140
- pub fn __set_model(&self, parent: &PerspectiveViewerElement) {
141
- if let Some(panel) = parent.workspace.active_panel() {
142
- self.set_config_model(&panel.session, &panel.renderer, &parent.presentation);
143
- }
144
- }
145
-
146
- pub fn connected_callback(&self) {}
147
- }
148
-
149
- impl ExportDropDownMenuElement {
150
- pub fn new_from_model(
151
- session: &Session,
152
- renderer: &Renderer,
153
- presentation: &Presentation,
154
- ) -> Self {
155
- let dropdown = global::document()
156
- .create_element("perspective-export-menu")
157
- .unwrap()
158
- .unchecked_into::<HtmlElement>();
159
-
160
- let elem = Self::new(dropdown);
161
- elem.set_config_model(session, renderer, presentation);
162
- elem
163
- }
164
-
165
- fn set_config_model(
166
- &self,
167
- session: &Session,
168
- renderer: &Renderer,
169
- presentation: &Presentation,
170
- ) {
171
- let callback = Callback::from({
172
- let session = session.clone();
173
- let renderer = renderer.clone();
174
- let presentation = presentation.clone();
175
- let target = self.target.clone();
176
- let root = self.root.clone();
177
- move |x: ExportFile| {
178
- if !x.name.is_empty() {
179
- clone!(target, root, session, renderer, presentation);
180
- spawn_local(async move {
181
- let val =
182
- export_method_to_blob(&session, &renderer, &presentation, x.method)
183
- .await
184
- .unwrap();
185
- let is_chart = renderer.is_chart();
186
- download(&x.as_filename(is_chart), &val).unwrap();
187
- *target.borrow_mut() = None;
188
- if let Some(root) = root.borrow().as_ref() {
189
- root.send_message(ExportDropDownWrapperMsg::Close);
190
- }
191
- })
192
- }
193
- }
194
- });
195
-
196
- let renderer = renderer.clone();
197
- let session = session.clone();
198
- let init = ShadowRootInit::new(ShadowRootMode::Open);
199
- let shadow_root = self
200
- .elem
201
- .attach_shadow(&init)
202
- .unwrap()
203
- .unchecked_into::<Element>();
204
-
205
- let props = yew::props!(ExportDropDownWrapperProps {
206
- renderer,
207
- session,
208
- callback,
209
- target: self.target.clone(),
210
- custom_element: self.elem.clone(),
211
- });
212
-
213
- let handle = yew::Renderer::with_root_and_props(shadow_root, props).render();
214
- *self.root.borrow_mut() = Some(handle);
215
- }
216
- }