@perspective-dev/viewer 4.4.1 → 4.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/dist/cdn/perspective-viewer.js +1 -2
  2. package/dist/cdn/perspective-viewer.js.map +4 -4
  3. package/dist/css/botanical.css +1 -1
  4. package/dist/css/dracula.css +1 -1
  5. package/dist/css/gruvbox-dark.css +1 -1
  6. package/dist/css/gruvbox.css +1 -1
  7. package/dist/css/icons.css +1 -1
  8. package/dist/css/intl/de.css +1 -1
  9. package/dist/css/intl/es.css +1 -1
  10. package/dist/css/intl/fr.css +1 -1
  11. package/dist/css/intl/ja.css +1 -1
  12. package/dist/css/intl/pt.css +1 -1
  13. package/dist/css/intl/zh.css +1 -1
  14. package/dist/css/intl.css +1 -1
  15. package/dist/css/monokai.css +1 -1
  16. package/dist/css/phosphor.css +1 -1
  17. package/dist/css/pro-dark.css +1 -1
  18. package/dist/css/pro.css +1 -1
  19. package/dist/css/solarized-dark.css +1 -1
  20. package/dist/css/solarized.css +1 -1
  21. package/dist/css/themes.css +1 -1
  22. package/dist/css/vaporwave.css +1 -1
  23. package/dist/esm/bootstrap.d.ts +2 -1
  24. package/dist/esm/column-format.d.ts +51 -0
  25. package/dist/esm/extensions.d.ts +2 -0
  26. package/dist/esm/perspective-viewer.d.ts +3 -1
  27. package/dist/esm/perspective-viewer.inline.js +1 -2
  28. package/dist/esm/perspective-viewer.inline.js.map +4 -4
  29. package/dist/esm/perspective-viewer.js +1 -2
  30. package/dist/esm/perspective-viewer.js.map +4 -4
  31. package/dist/esm/perspective-viewer.worker.d.ts +2 -0
  32. package/dist/esm/plugin.d.ts +16 -72
  33. package/dist/esm/ts-rs/ColumnSelectMode.d.ts +1 -0
  34. package/dist/esm/ts-rs/PluginStaticConfig.d.ts +77 -0
  35. package/dist/esm/ts-rs/ViewerConfig.d.ts +6 -3
  36. package/dist/esm/ts-rs/ViewerConfigUpdate.d.ts +7 -4
  37. package/dist/wasm/perspective-viewer.d.ts +77 -18
  38. package/dist/wasm/perspective-viewer.js +302 -148
  39. package/dist/wasm/perspective-viewer.wasm +0 -0
  40. package/dist/wasm/perspective-viewer.wasm.d.ts +20 -15
  41. package/package.json +24 -2
  42. package/src/css/column-selector.css +3 -2
  43. package/src/css/column-settings-panel.css +44 -9
  44. package/src/css/column-style.css +35 -2
  45. package/src/css/containers/scroll-panel.css +2 -1
  46. package/src/css/containers/tabs.css +8 -52
  47. package/src/css/dom/checkbox.css +2 -6
  48. package/src/css/form/code-editor.css +1 -0
  49. package/src/css/form/debug.css +3 -10
  50. package/src/css/plugin-selector.css +33 -0
  51. package/src/css/plugin-settings-panel.css +99 -0
  52. package/src/css/viewer.css +143 -3
  53. package/src/rust/components/column_dropdown.rs +3 -1
  54. package/src/rust/components/column_selector/active_column.rs +16 -19
  55. package/src/rust/components/column_selector/config_selector.rs +20 -20
  56. package/src/rust/components/column_selector/filter_column.rs +14 -14
  57. package/src/rust/components/column_selector/inactive_column.rs +10 -15
  58. package/src/rust/components/column_selector/pivot_column.rs +7 -7
  59. package/src/rust/components/column_selector/sort_column.rs +7 -7
  60. package/src/rust/components/column_selector.rs +55 -37
  61. package/src/rust/components/column_settings_sidebar/style_tab/agg_depth_selector.rs +15 -7
  62. package/src/rust/components/column_settings_sidebar/style_tab/primitive_field.rs +395 -0
  63. package/src/rust/components/column_settings_sidebar/style_tab/symbol.rs +15 -6
  64. package/src/rust/components/column_settings_sidebar/style_tab.rs +267 -136
  65. package/src/rust/components/column_settings_sidebar.rs +44 -49
  66. package/src/rust/components/containers/dragdrop_list.rs +32 -5
  67. package/src/rust/components/containers/mod.rs +0 -1
  68. package/src/rust/components/containers/scroll_panel.rs +21 -7
  69. package/src/rust/components/containers/sidebar.rs +8 -6
  70. package/src/rust/components/containers/split_panel.rs +3 -3
  71. package/src/rust/components/containers/tab_list.rs +3 -9
  72. package/src/rust/components/copy_dropdown.rs +2 -3
  73. package/src/rust/components/datetime_column_style.rs +19 -81
  74. package/src/rust/components/editable_header.rs +17 -3
  75. package/src/rust/components/export_dropdown.rs +2 -3
  76. package/src/rust/components/expression_editor.rs +29 -17
  77. package/src/rust/components/filter_dropdown.rs +2 -1
  78. package/src/rust/components/form/color_range_selector.rs +14 -7
  79. package/src/rust/components/form/debug.rs +47 -37
  80. package/src/rust/components/main_panel.rs +24 -65
  81. package/src/rust/components/mod.rs +2 -1
  82. package/src/rust/components/number_series_style.rs +161 -0
  83. package/src/rust/components/plugin_tab.rs +221 -0
  84. package/src/rust/components/settings_panel.rs +181 -59
  85. package/src/rust/components/status_bar.rs +141 -174
  86. package/src/rust/components/status_indicator.rs +15 -22
  87. package/src/rust/components/string_column_style.rs +20 -82
  88. package/src/rust/components/style_controls/number_string_format.rs +14 -30
  89. package/src/rust/components/viewer.rs +169 -132
  90. package/src/rust/config/column_config_schema.rs +195 -0
  91. package/src/rust/config/columns_config.rs +4 -97
  92. package/src/rust/config/datetime_column_style.rs +0 -5
  93. package/src/rust/config/mod.rs +8 -2
  94. package/src/rust/config/number_series_style.rs +79 -0
  95. package/src/rust/config/plugin_static_config.rs +144 -0
  96. package/src/rust/config/string_column_style.rs +0 -5
  97. package/src/rust/config/viewer_config.rs +5 -6
  98. package/src/rust/custom_elements/copy_dropdown.rs +30 -18
  99. package/src/rust/custom_elements/debug_plugin.rs +1 -3
  100. package/src/rust/custom_elements/export_dropdown.rs +26 -18
  101. package/src/rust/custom_elements/viewer.rs +62 -73
  102. package/src/rust/custom_events.rs +181 -224
  103. package/src/rust/js/plugin.rs +45 -117
  104. package/src/rust/lib.rs +34 -5
  105. package/src/rust/presentation/drag_helpers.rs +206 -0
  106. package/src/rust/presentation/props.rs +8 -0
  107. package/src/rust/presentation.rs +256 -41
  108. package/src/rust/{tasks → queries}/column_locator.rs +17 -73
  109. package/src/rust/queries/column_values.rs +59 -0
  110. package/src/rust/{tasks → queries}/columns_iter_set.rs +11 -18
  111. package/src/rust/queries/exports.rs +96 -0
  112. package/src/rust/queries/fetch_column_stats.rs +94 -0
  113. package/src/rust/queries/get_viewer_config.rs +54 -0
  114. package/src/rust/queries/mod.rs +44 -0
  115. package/src/rust/queries/plugin_column_styles.rs +101 -0
  116. package/src/rust/{engines.rs → queries/validate_expression.rs} +26 -15
  117. package/src/rust/renderer/activate.rs +1 -0
  118. package/src/rust/renderer/limits.rs +9 -4
  119. package/src/rust/renderer/plugin_store.rs +12 -0
  120. package/src/rust/renderer/props.rs +28 -3
  121. package/src/rust/renderer/registry.rs +40 -15
  122. package/src/rust/renderer.rs +703 -60
  123. package/src/rust/session/column_defaults_update.rs +20 -28
  124. package/src/rust/session/drag_drop_update.rs +10 -10
  125. package/src/rust/session/metadata.rs +31 -16
  126. package/src/rust/session/props.rs +15 -6
  127. package/src/rust/session/view_subscription.rs +10 -0
  128. package/src/rust/session.rs +109 -147
  129. package/src/rust/tasks/copy_export.rs +178 -158
  130. package/src/rust/tasks/{structural.rs → dismiss_render_warning.rs} +20 -40
  131. package/src/rust/tasks/edit_expression.rs +68 -88
  132. package/src/rust/tasks/eject.rs +25 -22
  133. package/src/rust/tasks/intersection_observer.rs +8 -21
  134. package/src/rust/tasks/mod.rs +19 -21
  135. package/src/rust/tasks/reset_all.rs +98 -0
  136. package/src/rust/tasks/resize_observer.rs +11 -33
  137. package/src/rust/tasks/restore_and_render.rs +128 -90
  138. package/src/rust/tasks/{get_viewer_config.rs → send_column_config.rs} +39 -35
  139. package/src/rust/tasks/send_plugin_config.rs +33 -33
  140. package/src/rust/tasks/update_and_render.rs +75 -49
  141. package/src/rust/{components/containers/trap_door_panel.rs → tasks/update_theme.rs} +34 -33
  142. package/src/rust/tasks/validate_expression.rs +61 -0
  143. package/src/rust/utils/browser/selection.rs +4 -4
  144. package/src/rust/utils/mod.rs +0 -63
  145. package/src/svg/checkbox-checked-icon.svg +1 -1
  146. package/src/svg/checkbox-unchecked-icon.svg +1 -1
  147. package/src/svg/mega-menu-icons-density.svg +23 -0
  148. package/src/svg/mega-menu-icons-map-density.svg +24 -0
  149. package/src/svg/mega-menu-icons-map-line.svg +19 -0
  150. package/src/themes/botanical.css +27 -53
  151. package/src/themes/defaults.css +24 -36
  152. package/src/themes/dracula.css +36 -54
  153. package/src/themes/gruvbox-dark.css +39 -59
  154. package/src/themes/gruvbox.css +16 -28
  155. package/src/themes/icons.css +5 -0
  156. package/src/themes/intl/de.css +43 -6
  157. package/src/themes/intl/es.css +43 -6
  158. package/src/themes/intl/fr.css +43 -6
  159. package/src/themes/intl/ja.css +43 -6
  160. package/src/themes/intl/pt.css +43 -6
  161. package/src/themes/intl/zh.css +43 -6
  162. package/src/themes/intl.css +38 -4
  163. package/src/themes/monokai.css +45 -61
  164. package/src/themes/phosphor.css +20 -29
  165. package/src/themes/pro-dark.css +25 -34
  166. package/src/themes/solarized-dark.css +21 -36
  167. package/src/themes/solarized.css +13 -23
  168. package/src/themes/vaporwave.css +40 -74
  169. package/src/ts/bootstrap.ts +14 -3
  170. package/src/ts/column-format.ts +162 -0
  171. package/src/ts/extensions.ts +4 -0
  172. package/src/ts/perspective-viewer.ts +9 -1
  173. package/src/{rust/components/column_settings_sidebar/style_tab/stub.rs → ts/perspective-viewer.worker.ts} +2 -22
  174. package/src/ts/plugin.ts +25 -101
  175. package/src/ts/ts-rs/{FormatUnit.ts → ColumnSelectMode.ts} +1 -1
  176. package/src/ts/ts-rs/PluginStaticConfig.ts +78 -0
  177. package/src/ts/ts-rs/ViewerConfig.ts +1 -2
  178. package/src/ts/ts-rs/ViewerConfigUpdate.ts +2 -3
  179. package/dist/esm/ts-rs/ColumnConfigValues.d.ts +0 -31
  180. package/dist/esm/ts-rs/CustomDatetimeFormat.d.ts +0 -1
  181. package/dist/esm/ts-rs/CustomDatetimeStyleConfig.d.ts +0 -15
  182. package/dist/esm/ts-rs/CustomNumberFormatConfig.d.ts +0 -18
  183. package/dist/esm/ts-rs/DatetimeColorMode.d.ts +0 -1
  184. package/dist/esm/ts-rs/DatetimeFormatType.d.ts +0 -6
  185. package/dist/esm/ts-rs/FormatMode.d.ts +0 -1
  186. package/dist/esm/ts-rs/FormatUnit.d.ts +0 -1
  187. package/dist/esm/ts-rs/NumberBackgroundMode.d.ts +0 -1
  188. package/dist/esm/ts-rs/NumberForegroundMode.d.ts +0 -1
  189. package/dist/esm/ts-rs/PluginConfig.d.ts +0 -2
  190. package/dist/esm/ts-rs/RoundingMode.d.ts +0 -1
  191. package/dist/esm/ts-rs/RoundingPriority.d.ts +0 -1
  192. package/dist/esm/ts-rs/SignDisplay.d.ts +0 -1
  193. package/dist/esm/ts-rs/SimpleDatetimeFormat.d.ts +0 -1
  194. package/dist/esm/ts-rs/SimpleDatetimeStyleConfig.d.ts +0 -6
  195. package/dist/esm/ts-rs/StringColorMode.d.ts +0 -1
  196. package/dist/esm/ts-rs/TrailingZeroDisplay.d.ts +0 -1
  197. package/dist/esm/ts-rs/UseGrouping.d.ts +0 -1
  198. package/src/rust/components/number_column_style.rs +0 -491
  199. package/src/rust/config/number_column_style.rs +0 -136
  200. package/src/rust/dragdrop.rs +0 -481
  201. package/src/rust/tasks/plugin_column_styles.rs +0 -98
  202. package/src/ts/ts-rs/ColumnConfigValues.ts +0 -14
  203. package/src/ts/ts-rs/CustomDatetimeFormat.ts +0 -3
  204. package/src/ts/ts-rs/CustomDatetimeStyleConfig.ts +0 -5
  205. package/src/ts/ts-rs/CustomNumberFormatConfig.ts +0 -8
  206. package/src/ts/ts-rs/DatetimeColorMode.ts +0 -3
  207. package/src/ts/ts-rs/DatetimeFormatType.ts +0 -8
  208. package/src/ts/ts-rs/FormatMode.ts +0 -3
  209. package/src/ts/ts-rs/NumberBackgroundMode.ts +0 -3
  210. package/src/ts/ts-rs/NumberForegroundMode.ts +0 -3
  211. package/src/ts/ts-rs/PluginConfig.ts +0 -4
  212. package/src/ts/ts-rs/RoundingMode.ts +0 -3
  213. package/src/ts/ts-rs/RoundingPriority.ts +0 -3
  214. package/src/ts/ts-rs/SignDisplay.ts +0 -3
  215. package/src/ts/ts-rs/SimpleDatetimeFormat.ts +0 -3
  216. package/src/ts/ts-rs/SimpleDatetimeStyleConfig.ts +0 -4
  217. package/src/ts/ts-rs/StringColorMode.ts +0 -3
  218. package/src/ts/ts-rs/TrailingZeroDisplay.ts +0 -3
  219. package/src/ts/ts-rs/UseGrouping.ts +0 -3
  220. /package/dist/wasm/snippets/{perspective-viewer-d924246f0b4a3dce → perspective-viewer-3cd58f0374935772}/inline0.js +0 -0
  221. /package/dist/wasm/snippets/{perspective-viewer-d924246f0b4a3dce → perspective-viewer-3cd58f0374935772}/inline1.js +0 -0
  222. /package/dist/wasm/snippets/{perspective-viewer-d924246f0b4a3dce → perspective-viewer-3cd58f0374935772}/inline2.js +0 -0
  223. /package/dist/wasm/snippets/{perspective-viewer-d924246f0b4a3dce → perspective-viewer-3cd58f0374935772}/inline3.js +0 -0
  224. /package/dist/wasm/snippets/{perspective-viewer-d924246f0b4a3dce → perspective-viewer-3cd58f0374935772}/inline4.js +0 -0
  225. /package/src/rust/{tasks → config}/export_method.rs +0 -0
  226. /package/src/rust/{tasks → queries}/export_app.rs +0 -0
  227. /package/src/rust/{tasks → queries}/is_invalid_drop.rs +0 -0
@@ -1,491 +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 perspective_client::config::Scalar;
14
- use yew::prelude::*;
15
- use yew::*;
16
-
17
- use super::form::color_range_selector::*;
18
- use super::form::number_field::NumberFieldProps;
19
- use super::modal::*;
20
- use super::style::LocalStyle;
21
- use crate::components::form::number_field::NumberField;
22
- use crate::components::form::select_enum_field::SelectEnumField;
23
- use crate::config::*;
24
- use crate::session::Session;
25
- use crate::utils::*;
26
- use crate::*;
27
-
28
- #[derive(PartialEq, Eq, Copy, Clone, Debug)]
29
- pub enum Side {
30
- Fg,
31
- Bg,
32
- }
33
-
34
- use Side::*;
35
-
36
- /// A `ColumnStyle` component is mounted to the window anchored at the screen
37
- /// position of `elem`.
38
- ///
39
- /// It needs two input configs, the current configuration object and a default
40
- /// version without `Option<>`
41
- #[derive(Properties)]
42
- pub struct NumberColumnStyleProps {
43
- #[cfg_attr(test, prop_or_default)]
44
- pub config: Option<NumberColumnStyleConfig>,
45
-
46
- #[cfg_attr(test, prop_or_default)]
47
- pub default_config: NumberColumnStyleDefaultConfig,
48
-
49
- #[prop_or_default]
50
- pub on_change: Callback<ColumnConfigValueUpdate>,
51
-
52
- #[prop_or_default]
53
- pub weak_link: WeakScope<NumberColumnStyle>,
54
-
55
- #[prop_or_default]
56
- pub column_name: Option<String>,
57
-
58
- // State
59
- pub session: Session,
60
- }
61
-
62
- impl ModalLink<NumberColumnStyle> for NumberColumnStyleProps {
63
- fn weak_link(&self) -> &'_ WeakScope<NumberColumnStyle> {
64
- &self.weak_link
65
- }
66
- }
67
-
68
- impl PartialEq for NumberColumnStyleProps {
69
- fn eq(&self, other: &Self) -> bool {
70
- self.config == other.config
71
- && self.default_config == other.default_config
72
- && self.column_name == other.column_name
73
- }
74
- }
75
-
76
- fn scalar_to_f64(scalar: &Scalar) -> f64 {
77
- match scalar {
78
- Scalar::Float(x) => *x,
79
- Scalar::String(x) => x.parse::<f64>().unwrap_or_default(),
80
- Scalar::Bool(x) => {
81
- if *x {
82
- 1.0
83
- } else {
84
- 0.0
85
- }
86
- },
87
- Scalar::Null => 0.0,
88
- }
89
- }
90
-
91
- fn set_default_gradient(session: &Session, ctx: &Context<NumberColumnStyle>) {
92
- if let Some(column_name) = ctx.props().column_name.clone() {
93
- let session = session.clone();
94
- ctx.link().send_future(async move {
95
- let view = session.get_view().unwrap();
96
- let min_max = view.get_min_max(column_name).await.unwrap();
97
- let abs_max = scalar_to_f64(&min_max.0)
98
- .abs()
99
- .max(scalar_to_f64(&min_max.1).abs());
100
-
101
- let gradient = (abs_max * 100.).round() / 100.;
102
- NumberColumnStyleMsg::DefaultGradientChanged(gradient)
103
- });
104
- }
105
- }
106
-
107
- #[derive(Debug)]
108
- pub enum NumberColumnStyleMsg {
109
- PosColorChanged(Side, String),
110
- NegColorChanged(Side, String),
111
- NumberForeModeChanged(NumberForegroundMode),
112
- NumberBackModeChanged(NumberBackgroundMode),
113
- GradientChanged(Side, Option<f64>),
114
- DefaultGradientChanged(f64),
115
- }
116
-
117
- /// A column style form control for `number` columns.
118
- pub struct NumberColumnStyle {
119
- config: NumberColumnStyleConfig,
120
- default_config: NumberColumnStyleDefaultConfig,
121
- fg_mode: NumberForegroundMode,
122
- bg_mode: NumberBackgroundMode,
123
- pos_fg_color: String,
124
- neg_fg_color: String,
125
- pos_bg_color: String,
126
- neg_bg_color: String,
127
- fg_gradient: Option<f64>,
128
- bg_gradient: Option<f64>,
129
- }
130
-
131
- impl Component for NumberColumnStyle {
132
- type Message = NumberColumnStyleMsg;
133
- type Properties = NumberColumnStyleProps;
134
-
135
- fn create(ctx: &Context<Self>) -> Self {
136
- ctx.set_modal_link();
137
- set_default_gradient(&ctx.props().session, ctx);
138
- Self::reset(
139
- &ctx.props().config.clone().unwrap_or_default(),
140
- &ctx.props().default_config.clone(),
141
- )
142
- }
143
-
144
- fn changed(&mut self, ctx: &Context<Self>, _old: &Self::Properties) -> bool {
145
- let mut new = Self::reset(
146
- &ctx.props().config.clone().unwrap_or_default(),
147
- &ctx.props().default_config.clone(),
148
- );
149
-
150
- set_default_gradient(&ctx.props().session, ctx);
151
- std::mem::swap(self, &mut new);
152
- true
153
- }
154
-
155
- fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
156
- match msg {
157
- NumberColumnStyleMsg::PosColorChanged(side, val) => {
158
- if side == Fg {
159
- self.pos_fg_color = val;
160
- self.config.pos_fg_color = Some(self.pos_fg_color.to_owned());
161
- } else {
162
- self.pos_bg_color = val;
163
- self.config.pos_bg_color = Some(self.pos_bg_color.to_owned());
164
- }
165
-
166
- self.dispatch_config(ctx);
167
- true
168
- },
169
- NumberColumnStyleMsg::NegColorChanged(side, val) => {
170
- if side == Fg {
171
- self.neg_fg_color = val;
172
- self.config.neg_fg_color = Some(self.neg_fg_color.to_owned());
173
- } else {
174
- self.neg_bg_color = val;
175
- self.config.neg_bg_color = Some(self.neg_bg_color.to_owned());
176
- }
177
-
178
- self.dispatch_config(ctx);
179
- true
180
- },
181
- NumberColumnStyleMsg::NumberForeModeChanged(val) => {
182
- self.fg_mode = val;
183
- self.config.number_fg_mode = val;
184
- if self.fg_mode.needs_gradient() {
185
- self.config.fg_gradient = Some(self.fg_gradient.unwrap());
186
- } else {
187
- self.config.fg_gradient = None;
188
- }
189
-
190
- self.dispatch_config(ctx);
191
- true
192
- },
193
- NumberColumnStyleMsg::NumberBackModeChanged(val) => {
194
- self.bg_mode = val;
195
- self.config.number_bg_mode = val;
196
- if self.bg_mode.needs_gradient() {
197
- self.config.bg_gradient = Some(self.bg_gradient.unwrap());
198
- } else {
199
- self.config.bg_gradient = None;
200
- }
201
-
202
- self.dispatch_config(ctx);
203
- true
204
- },
205
- NumberColumnStyleMsg::GradientChanged(side, gradient) => {
206
- match (side, gradient) {
207
- (Fg, Some(x)) => {
208
- self.fg_gradient = Some(x);
209
- self.config.fg_gradient = Some(x);
210
- },
211
- (Fg, None) => {
212
- self.fg_gradient = Some(self.default_config.fg_gradient);
213
- self.config.fg_gradient = None;
214
- },
215
- (Bg, Some(x)) => {
216
- self.bg_gradient = Some(x);
217
- self.config.bg_gradient = Some(x);
218
- },
219
- (Bg, None) => {
220
- self.bg_gradient = Some(self.default_config.bg_gradient);
221
- self.config.bg_gradient = None;
222
- },
223
- };
224
-
225
- self.dispatch_config(ctx);
226
- false
227
- },
228
- NumberColumnStyleMsg::DefaultGradientChanged(gradient) => {
229
- self.fg_gradient.get_or_insert(gradient);
230
- self.bg_gradient.get_or_insert(gradient);
231
- self.default_config.fg_gradient = gradient;
232
- self.default_config.bg_gradient = gradient;
233
- true
234
- },
235
- }
236
- }
237
-
238
- fn view(&self, ctx: &Context<Self>) -> Html {
239
- let fg_mode_changed = ctx.link().callback(|x: Option<_>| {
240
- NumberColumnStyleMsg::NumberForeModeChanged(x.unwrap_or_default())
241
- });
242
-
243
- let bg_mode_changed = ctx.link().callback(|x: Option<_>| {
244
- NumberColumnStyleMsg::NumberBackModeChanged(x.unwrap_or_default())
245
- });
246
-
247
- let fg_controls = match self.fg_mode {
248
- NumberForegroundMode::Disabled => html! {},
249
- NumberForegroundMode::Color => html! {
250
- <div class="row">
251
- <ColorRangeSelector ..self.color_props("fg-color", Fg, false, ctx) />
252
- </div>
253
- },
254
- NumberForegroundMode::Bar => html! {
255
- <>
256
- <div class="row">
257
- <ColorRangeSelector ..self.color_props("bar-color", Fg, false, ctx) />
258
- </div>
259
- <NumberField ..self.max_value_props(Fg, ctx) />
260
- </>
261
- },
262
- NumberForegroundMode::LabelBar => html! {
263
- <>
264
- <div class="row">
265
- <ColorRangeSelector ..self.color_props("label-bar-color", Fg, false, ctx) />
266
- </div>
267
- <NumberField ..self.max_value_props(Fg, ctx) />
268
- </>
269
- },
270
- };
271
-
272
- let bg_controls = match self.bg_mode {
273
- NumberBackgroundMode::Disabled => html! {},
274
- NumberBackgroundMode::Color => html! {
275
- <div class="row">
276
- <ColorRangeSelector ..self.color_props("bg-color", Bg,false, ctx) />
277
- </div>
278
- },
279
- NumberBackgroundMode::Gradient => html! {
280
- <>
281
- <div class="row">
282
- <ColorRangeSelector ..self.color_props("gradient-color", Bg, true, ctx) />
283
- </div>
284
- <NumberField ..self.max_value_props(Bg, ctx) />
285
- </>
286
- },
287
- NumberBackgroundMode::Pulse => html! {
288
- <div class="row">
289
- <ColorRangeSelector ..self.color_props("pulse-color", Bg, true, ctx) />
290
- </div>
291
- },
292
- };
293
-
294
- html! {
295
- <>
296
- <LocalStyle href={css!("column-style")} />
297
- <div id="column-style-container" class="number-column-style-container">
298
- <SelectEnumField<NumberForegroundMode>
299
- label="foreground"
300
- on_change={fg_mode_changed}
301
- current_value={self.fg_mode}
302
- />
303
- { fg_controls }
304
- <SelectEnumField<NumberBackgroundMode>
305
- label="background"
306
- on_change={bg_mode_changed}
307
- current_value={self.bg_mode}
308
- />
309
- { bg_controls }
310
- </div>
311
- </>
312
- }
313
- }
314
- }
315
-
316
- impl NumberColumnStyle {
317
- /// When this config has changed, we must signal the wrapper element.
318
- fn dispatch_config(&self, ctx: &Context<Self>) {
319
- let mut config = self.config.clone();
320
- match &self.config {
321
- NumberColumnStyleConfig {
322
- pos_fg_color: Some(pos_color),
323
- neg_fg_color: Some(neg_color),
324
- ..
325
- } if *pos_color == self.default_config.pos_fg_color
326
- && *neg_color == self.default_config.neg_fg_color =>
327
- {
328
- config.pos_fg_color = None;
329
- config.neg_fg_color = None;
330
- },
331
- _ => {},
332
- };
333
-
334
- match &self.config {
335
- NumberColumnStyleConfig {
336
- pos_bg_color: Some(pos_color),
337
- neg_bg_color: Some(neg_color),
338
- ..
339
- } if *pos_color == self.default_config.pos_bg_color
340
- && *neg_color == self.default_config.neg_bg_color =>
341
- {
342
- config.pos_bg_color = None;
343
- config.neg_bg_color = None;
344
- },
345
- _ => {},
346
- };
347
-
348
- let update = Some(config).filter(|config| config != &NumberColumnStyleConfig::default());
349
-
350
- ctx.props()
351
- .on_change
352
- .emit(ColumnConfigValueUpdate::DatagridNumberStyle(update));
353
- }
354
-
355
- fn color_props(
356
- &self,
357
- id: &str,
358
- side: Side,
359
- is_gradient: bool,
360
- ctx: &Context<Self>,
361
- ) -> ColorRangeProps {
362
- let on_pos_color = ctx
363
- .link()
364
- .callback(move |x| NumberColumnStyleMsg::PosColorChanged(side, x));
365
- let on_neg_color = ctx
366
- .link()
367
- .callback(move |x| NumberColumnStyleMsg::NegColorChanged(side, x));
368
-
369
- let default_config = self.default_config.clone();
370
-
371
- props!(ColorRangeProps {
372
- id: id.to_string(),
373
- is_gradient,
374
- pos_color: if side == Fg {
375
- &self.pos_fg_color
376
- } else {
377
- &self.pos_bg_color
378
- }
379
- .to_owned(),
380
- neg_color: if side == Fg {
381
- &self.neg_fg_color
382
- } else {
383
- &self.neg_bg_color
384
- }
385
- .to_owned(),
386
- on_pos_color,
387
- on_neg_color,
388
- on_reset: ctx.link().batch_callback(move |_| if side == Fg {
389
- vec![
390
- NumberColumnStyleMsg::PosColorChanged(
391
- side,
392
- default_config.pos_fg_color.clone(),
393
- ),
394
- NumberColumnStyleMsg::NegColorChanged(
395
- side,
396
- default_config.neg_fg_color.clone(),
397
- ),
398
- ]
399
- } else {
400
- vec![
401
- NumberColumnStyleMsg::PosColorChanged(
402
- side,
403
- default_config.pos_bg_color.clone(),
404
- ),
405
- NumberColumnStyleMsg::NegColorChanged(
406
- side,
407
- default_config.neg_bg_color.clone(),
408
- ),
409
- ]
410
- }),
411
- is_modified: if side == Fg {
412
- self.pos_fg_color != self.default_config.pos_fg_color
413
- || self.neg_fg_color != self.default_config.neg_fg_color
414
- } else {
415
- self.pos_bg_color != self.default_config.pos_bg_color
416
- || self.neg_bg_color != self.default_config.neg_bg_color
417
- },
418
- })
419
- }
420
-
421
- fn max_value_props(&self, side: Side, ctx: &Context<Self>) -> NumberFieldProps {
422
- let on_change = ctx
423
- .link()
424
- .callback(move |x| NumberColumnStyleMsg::GradientChanged(side, x));
425
-
426
- let value = if side == Fg {
427
- self.fg_gradient.unwrap_or_default()
428
- } else {
429
- self.bg_gradient.unwrap_or_default()
430
- };
431
-
432
- props!(NumberFieldProps {
433
- default: value,
434
- current_value: value,
435
- label: "max-value",
436
- on_change
437
- })
438
- }
439
-
440
- fn reset(
441
- config: &NumberColumnStyleConfig,
442
- default_config: &NumberColumnStyleDefaultConfig,
443
- ) -> Self {
444
- let mut config = config.clone();
445
- let fg_gradient = config.fg_gradient;
446
- let bg_gradient = config.bg_gradient;
447
-
448
- let pos_fg_color = config
449
- .pos_fg_color
450
- .as_ref()
451
- .unwrap_or(&default_config.pos_fg_color)
452
- .to_owned();
453
-
454
- let neg_fg_color = config
455
- .neg_fg_color
456
- .as_ref()
457
- .unwrap_or(&default_config.neg_fg_color)
458
- .to_owned();
459
-
460
- let pos_bg_color = config
461
- .pos_bg_color
462
- .as_ref()
463
- .unwrap_or(&default_config.pos_bg_color)
464
- .to_owned();
465
-
466
- let neg_bg_color = config
467
- .neg_bg_color
468
- .as_ref()
469
- .unwrap_or(&default_config.neg_bg_color)
470
- .to_owned();
471
-
472
- config.pos_fg_color = Some(pos_fg_color.to_owned());
473
- config.neg_fg_color = Some(neg_fg_color.to_owned());
474
- let fg_mode = config.number_fg_mode;
475
- config.pos_bg_color = Some(pos_bg_color.to_owned());
476
- config.neg_bg_color = Some(neg_bg_color.to_owned());
477
- let bg_mode = config.number_bg_mode;
478
- Self {
479
- config,
480
- default_config: default_config.clone(),
481
- fg_mode,
482
- bg_mode,
483
- pos_fg_color,
484
- neg_fg_color,
485
- pos_bg_color,
486
- neg_bg_color,
487
- fg_gradient,
488
- bg_gradient,
489
- }
490
- }
491
- }
@@ -1,136 +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::str::FromStr;
14
-
15
- use serde::{Deserialize, Serialize};
16
- use strum::{Display, EnumIter};
17
- use ts_rs::TS;
18
-
19
- #[derive(
20
- Clone, Copy, Debug, Default, Deserialize, Display, EnumIter, Eq, PartialEq, Serialize, TS,
21
- )]
22
- pub enum NumberForegroundMode {
23
- #[serde(rename = "disabled")]
24
- Disabled,
25
-
26
- #[default]
27
- #[serde(rename = "color")]
28
- Color,
29
-
30
- #[serde(rename = "bar")]
31
- Bar,
32
-
33
- #[serde(rename = "label-bar")]
34
- LabelBar,
35
- }
36
-
37
- impl FromStr for NumberForegroundMode {
38
- type Err = String;
39
-
40
- fn from_str(s: &str) -> Result<Self, Self::Err> {
41
- match s {
42
- "color" => Ok(Self::Color),
43
- "bar" => Ok(Self::Bar),
44
- "label-bar" => Ok(Self::LabelBar),
45
- x => Err(format!("Unknown NumberForegroundMode::{x}")),
46
- }
47
- }
48
- }
49
-
50
- impl NumberForegroundMode {
51
- fn is_color(&self) -> bool {
52
- *self == Self::Color
53
- }
54
-
55
- pub fn is_enabled(&self) -> bool {
56
- *self != Self::Disabled
57
- }
58
-
59
- pub fn needs_gradient(&self) -> bool {
60
- *self == Self::Bar || *self == Self::LabelBar
61
- }
62
- }
63
-
64
- #[derive(
65
- Clone, Copy, Debug, Default, Deserialize, Display, EnumIter, Eq, PartialEq, Serialize, TS,
66
- )]
67
- pub enum NumberBackgroundMode {
68
- #[default]
69
- #[serde(rename = "disabled")]
70
- Disabled,
71
-
72
- #[serde(rename = "color")]
73
- Color,
74
-
75
- #[serde(rename = "gradient")]
76
- Gradient,
77
-
78
- #[serde(rename = "pulse")]
79
- Pulse,
80
- }
81
-
82
- impl NumberBackgroundMode {
83
- pub fn is_disabled(&self) -> bool {
84
- *self == Self::Disabled
85
- }
86
-
87
- pub fn needs_gradient(&self) -> bool {
88
- *self == Self::Gradient
89
- }
90
- }
91
-
92
- #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, TS)]
93
- pub struct NumberColumnStyleConfig {
94
- #[serde(default = "NumberForegroundMode::default")]
95
- #[serde(skip_serializing_if = "NumberForegroundMode::is_color")]
96
- pub number_fg_mode: NumberForegroundMode,
97
-
98
- #[serde(default = "NumberBackgroundMode::default")]
99
- #[serde(skip_serializing_if = "NumberBackgroundMode::is_disabled")]
100
- pub number_bg_mode: NumberBackgroundMode,
101
-
102
- #[serde(skip_serializing_if = "Option::is_none")]
103
- pub pos_fg_color: Option<String>,
104
-
105
- #[serde(skip_serializing_if = "Option::is_none")]
106
- pub neg_fg_color: Option<String>,
107
-
108
- #[serde(skip_serializing_if = "Option::is_none")]
109
- pub pos_bg_color: Option<String>,
110
-
111
- #[serde(skip_serializing_if = "Option::is_none")]
112
- pub neg_bg_color: Option<String>,
113
-
114
- #[serde(skip_serializing_if = "Option::is_none")]
115
- pub fg_gradient: Option<f64>,
116
-
117
- #[serde(skip_serializing_if = "Option::is_none")]
118
- pub bg_gradient: Option<f64>,
119
- }
120
-
121
- /// Exactly like a `ColumnStyleConfig`, except without `Option<>` fields.
122
- ///
123
- /// Necessary because this struct represents the default values we should use in
124
- /// the GUI when they are `None` in the real config. It is also used to decide
125
- /// when to omit a field when serialized a `ColumnStyleConfig` to JSON.
126
- #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq)]
127
- pub struct NumberColumnStyleDefaultConfig {
128
- pub fg_gradient: f64,
129
- pub bg_gradient: f64,
130
- pub pos_fg_color: String,
131
- pub neg_fg_color: String,
132
- pub pos_bg_color: String,
133
- pub neg_bg_color: String,
134
- pub number_fg_mode: NumberForegroundMode,
135
- pub number_bg_mode: NumberBackgroundMode,
136
- }