@perspective-dev/viewer 4.4.0 → 4.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 (228) 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 -0
  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 +6 -0
  26. package/dist/esm/perspective-viewer.d.ts +4 -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 +21 -77
  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 +39 -0
  36. package/dist/esm/ts-rs/ViewerConfigUpdate.d.ts +7 -4
  37. package/dist/wasm/perspective-viewer.d.ts +88 -24
  38. package/dist/wasm/perspective-viewer.js +320 -151
  39. package/dist/wasm/perspective-viewer.wasm +0 -0
  40. package/dist/wasm/perspective-viewer.wasm.d.ts +22 -17
  41. package/package.json +24 -2
  42. package/src/css/column-selector.css +3 -2
  43. package/src/css/column-settings-panel.css +36 -6
  44. package/src/css/column-style.css +27 -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 +0 -4
  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/status-bar.css +1 -1
  53. package/src/css/viewer.css +65 -3
  54. package/src/rust/components/column_dropdown.rs +3 -1
  55. package/src/rust/components/column_selector/active_column.rs +13 -19
  56. package/src/rust/components/column_selector/config_selector.rs +20 -20
  57. package/src/rust/components/column_selector/filter_column.rs +14 -14
  58. package/src/rust/components/column_selector/inactive_column.rs +9 -15
  59. package/src/rust/components/column_selector/pivot_column.rs +7 -7
  60. package/src/rust/components/column_selector/sort_column.rs +7 -7
  61. package/src/rust/components/column_selector.rs +55 -37
  62. package/src/rust/components/column_settings_sidebar/style_tab/agg_depth_selector.rs +15 -7
  63. package/src/rust/components/column_settings_sidebar/style_tab/primitive_field.rs +394 -0
  64. package/src/rust/components/column_settings_sidebar/style_tab/symbol.rs +15 -6
  65. package/src/rust/components/column_settings_sidebar/style_tab.rs +267 -136
  66. package/src/rust/components/column_settings_sidebar.rs +43 -49
  67. package/src/rust/components/containers/dragdrop_list.rs +5 -5
  68. package/src/rust/components/containers/mod.rs +0 -1
  69. package/src/rust/components/containers/scroll_panel.rs +21 -7
  70. package/src/rust/components/containers/sidebar.rs +8 -6
  71. package/src/rust/components/containers/split_panel.rs +3 -3
  72. package/src/rust/components/containers/tab_list.rs +3 -9
  73. package/src/rust/components/copy_dropdown.rs +2 -3
  74. package/src/rust/components/datetime_column_style.rs +19 -81
  75. package/src/rust/components/editable_header.rs +2 -3
  76. package/src/rust/components/export_dropdown.rs +2 -3
  77. package/src/rust/components/expression_editor.rs +29 -17
  78. package/src/rust/components/filter_dropdown.rs +2 -1
  79. package/src/rust/components/form/color_range_selector.rs +14 -7
  80. package/src/rust/components/form/debug.rs +47 -37
  81. package/src/rust/components/main_panel.rs +24 -65
  82. package/src/rust/components/mod.rs +2 -1
  83. package/src/rust/components/number_series_style.rs +161 -0
  84. package/src/rust/components/plugin_tab.rs +221 -0
  85. package/src/rust/components/settings_panel.rs +181 -59
  86. package/src/rust/components/status_bar.rs +140 -173
  87. package/src/rust/components/status_indicator.rs +15 -22
  88. package/src/rust/components/string_column_style.rs +20 -82
  89. package/src/rust/components/style_controls/number_string_format.rs +14 -30
  90. package/src/rust/components/viewer.rs +92 -132
  91. package/src/rust/config/column_config_schema.rs +195 -0
  92. package/src/rust/config/columns_config.rs +4 -97
  93. package/src/rust/config/datetime_column_style.rs +0 -5
  94. package/src/rust/config/mod.rs +8 -2
  95. package/src/rust/config/number_series_style.rs +79 -0
  96. package/src/rust/config/plugin_static_config.rs +144 -0
  97. package/src/rust/config/string_column_style.rs +0 -5
  98. package/src/rust/config/viewer_config.rs +7 -8
  99. package/src/rust/custom_elements/copy_dropdown.rs +30 -18
  100. package/src/rust/custom_elements/debug_plugin.rs +5 -7
  101. package/src/rust/custom_elements/export_dropdown.rs +26 -18
  102. package/src/rust/custom_elements/viewer.rs +77 -77
  103. package/src/rust/custom_events.rs +181 -224
  104. package/src/rust/js/plugin.rs +45 -117
  105. package/src/rust/lib.rs +39 -5
  106. package/src/rust/presentation/drag_helpers.rs +206 -0
  107. package/src/rust/presentation/props.rs +8 -0
  108. package/src/rust/presentation.rs +256 -41
  109. package/src/rust/{tasks → queries}/column_locator.rs +17 -73
  110. package/src/rust/queries/column_values.rs +59 -0
  111. package/src/rust/{tasks → queries}/columns_iter_set.rs +11 -18
  112. package/src/rust/queries/exports.rs +96 -0
  113. package/src/rust/queries/fetch_column_stats.rs +94 -0
  114. package/src/rust/queries/get_viewer_config.rs +54 -0
  115. package/src/rust/queries/mod.rs +44 -0
  116. package/src/rust/queries/plugin_column_styles.rs +101 -0
  117. package/src/rust/{engines.rs → queries/validate_expression.rs} +26 -15
  118. package/src/rust/renderer/activate.rs +1 -0
  119. package/src/rust/renderer/limits.rs +9 -4
  120. package/src/rust/renderer/plugin_store.rs +12 -0
  121. package/src/rust/renderer/props.rs +28 -3
  122. package/src/rust/renderer/registry.rs +40 -15
  123. package/src/rust/renderer.rs +649 -55
  124. package/src/rust/session/column_defaults_update.rs +20 -28
  125. package/src/rust/session/drag_drop_update.rs +10 -10
  126. package/src/rust/session/metadata.rs +31 -16
  127. package/src/rust/session/props.rs +15 -6
  128. package/src/rust/session/view_subscription.rs +10 -0
  129. package/src/rust/session.rs +109 -147
  130. package/src/rust/tasks/copy_export.rs +178 -158
  131. package/src/rust/tasks/{structural.rs → dismiss_render_warning.rs} +20 -40
  132. package/src/rust/tasks/edit_expression.rs +68 -88
  133. package/src/rust/tasks/eject.rs +25 -22
  134. package/src/rust/tasks/intersection_observer.rs +8 -21
  135. package/src/rust/tasks/mod.rs +19 -21
  136. package/src/rust/tasks/reset_all.rs +78 -0
  137. package/src/rust/tasks/resize_observer.rs +11 -33
  138. package/src/rust/tasks/restore_and_render.rs +117 -89
  139. package/src/rust/tasks/{get_viewer_config.rs → send_column_config.rs} +38 -35
  140. package/src/rust/tasks/send_plugin_config.rs +32 -33
  141. package/src/rust/tasks/update_and_render.rs +66 -47
  142. package/src/rust/{components/containers/trap_door_panel.rs → tasks/update_theme.rs} +34 -33
  143. package/src/rust/tasks/validate_expression.rs +61 -0
  144. package/src/rust/utils/browser/selection.rs +4 -4
  145. package/src/rust/utils/mod.rs +0 -63
  146. package/src/svg/datagrid-select-row-tree.svg +13 -0
  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 +42 -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 +4 -18
  156. package/src/themes/intl/de.css +42 -6
  157. package/src/themes/intl/es.css +42 -6
  158. package/src/themes/intl/fr.css +42 -6
  159. package/src/themes/intl/ja.css +42 -6
  160. package/src/themes/intl/pt.css +42 -6
  161. package/src/themes/intl/zh.css +42 -6
  162. package/src/themes/intl.css +37 -4
  163. package/src/themes/monokai.css +45 -61
  164. package/src/themes/phosphor.css +175 -0
  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/themes.css +1 -0
  169. package/src/themes/vaporwave.css +40 -74
  170. package/src/ts/bootstrap.ts +14 -3
  171. package/src/ts/column-format.ts +162 -0
  172. package/src/ts/extensions.ts +12 -1
  173. package/src/ts/perspective-viewer.ts +10 -1
  174. package/src/{rust/components/column_settings_sidebar/style_tab/stub.rs → ts/perspective-viewer.worker.ts} +2 -22
  175. package/src/ts/plugin.ts +29 -105
  176. package/src/ts/ts-rs/{FormatUnit.ts → ColumnSelectMode.ts} +1 -1
  177. package/src/ts/ts-rs/PluginStaticConfig.ts +78 -0
  178. package/src/ts/ts-rs/ViewerConfig.ts +14 -0
  179. package/src/ts/ts-rs/ViewerConfigUpdate.ts +2 -3
  180. package/dist/esm/ts-rs/ColumnConfigValues.d.ts +0 -31
  181. package/dist/esm/ts-rs/CustomDatetimeFormat.d.ts +0 -1
  182. package/dist/esm/ts-rs/CustomDatetimeStyleConfig.d.ts +0 -15
  183. package/dist/esm/ts-rs/CustomNumberFormatConfig.d.ts +0 -18
  184. package/dist/esm/ts-rs/DatetimeColorMode.d.ts +0 -1
  185. package/dist/esm/ts-rs/DatetimeFormatType.d.ts +0 -6
  186. package/dist/esm/ts-rs/FormatMode.d.ts +0 -1
  187. package/dist/esm/ts-rs/FormatUnit.d.ts +0 -1
  188. package/dist/esm/ts-rs/NumberBackgroundMode.d.ts +0 -1
  189. package/dist/esm/ts-rs/NumberForegroundMode.d.ts +0 -1
  190. package/dist/esm/ts-rs/PluginConfig.d.ts +0 -2
  191. package/dist/esm/ts-rs/RoundingMode.d.ts +0 -1
  192. package/dist/esm/ts-rs/RoundingPriority.d.ts +0 -1
  193. package/dist/esm/ts-rs/SignDisplay.d.ts +0 -1
  194. package/dist/esm/ts-rs/SimpleDatetimeFormat.d.ts +0 -1
  195. package/dist/esm/ts-rs/SimpleDatetimeStyleConfig.d.ts +0 -6
  196. package/dist/esm/ts-rs/StringColorMode.d.ts +0 -1
  197. package/dist/esm/ts-rs/TrailingZeroDisplay.d.ts +0 -1
  198. package/dist/esm/ts-rs/UseGrouping.d.ts +0 -1
  199. package/src/rust/components/number_column_style.rs +0 -483
  200. package/src/rust/config/number_column_style.rs +0 -132
  201. package/src/rust/dragdrop.rs +0 -481
  202. package/src/rust/tasks/plugin_column_styles.rs +0 -98
  203. package/src/ts/ts-rs/ColumnConfigValues.ts +0 -14
  204. package/src/ts/ts-rs/CustomDatetimeFormat.ts +0 -3
  205. package/src/ts/ts-rs/CustomDatetimeStyleConfig.ts +0 -5
  206. package/src/ts/ts-rs/CustomNumberFormatConfig.ts +0 -8
  207. package/src/ts/ts-rs/DatetimeColorMode.ts +0 -3
  208. package/src/ts/ts-rs/DatetimeFormatType.ts +0 -8
  209. package/src/ts/ts-rs/FormatMode.ts +0 -3
  210. package/src/ts/ts-rs/NumberBackgroundMode.ts +0 -3
  211. package/src/ts/ts-rs/NumberForegroundMode.ts +0 -3
  212. package/src/ts/ts-rs/PluginConfig.ts +0 -4
  213. package/src/ts/ts-rs/RoundingMode.ts +0 -3
  214. package/src/ts/ts-rs/RoundingPriority.ts +0 -3
  215. package/src/ts/ts-rs/SignDisplay.ts +0 -3
  216. package/src/ts/ts-rs/SimpleDatetimeFormat.ts +0 -3
  217. package/src/ts/ts-rs/SimpleDatetimeStyleConfig.ts +0 -4
  218. package/src/ts/ts-rs/StringColorMode.ts +0 -3
  219. package/src/ts/ts-rs/TrailingZeroDisplay.ts +0 -3
  220. package/src/ts/ts-rs/UseGrouping.ts +0 -3
  221. /package/dist/wasm/snippets/{perspective-viewer-68fef752754ffbc6 → perspective-viewer-39ab7da3ca157861}/inline0.js +0 -0
  222. /package/dist/wasm/snippets/{perspective-viewer-68fef752754ffbc6 → perspective-viewer-39ab7da3ca157861}/inline1.js +0 -0
  223. /package/dist/wasm/snippets/{perspective-viewer-68fef752754ffbc6 → perspective-viewer-39ab7da3ca157861}/inline2.js +0 -0
  224. /package/dist/wasm/snippets/{perspective-viewer-68fef752754ffbc6 → perspective-viewer-39ab7da3ca157861}/inline3.js +0 -0
  225. /package/dist/wasm/snippets/{perspective-viewer-68fef752754ffbc6 → perspective-viewer-39ab7da3ca157861}/inline4.js +0 -0
  226. /package/src/rust/{tasks → config}/export_method.rs +0 -0
  227. /package/src/rust/{tasks → queries}/export_app.rs +0 -0
  228. /package/src/rust/{tasks → queries}/is_invalid_drop.rs +0 -0
@@ -1,483 +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
- };
263
-
264
- let bg_controls = match self.bg_mode {
265
- NumberBackgroundMode::Disabled => html! {},
266
- NumberBackgroundMode::Color => html! {
267
- <div class="row">
268
- <ColorRangeSelector ..self.color_props("bg-color", Bg,false, ctx) />
269
- </div>
270
- },
271
- NumberBackgroundMode::Gradient => html! {
272
- <>
273
- <div class="row">
274
- <ColorRangeSelector ..self.color_props("gradient-color", Bg, true, ctx) />
275
- </div>
276
- <NumberField ..self.max_value_props(Bg, ctx) />
277
- </>
278
- },
279
- NumberBackgroundMode::Pulse => html! {
280
- <div class="row">
281
- <ColorRangeSelector ..self.color_props("pulse-color", Bg, true, ctx) />
282
- </div>
283
- },
284
- };
285
-
286
- html! {
287
- <>
288
- <LocalStyle href={css!("column-style")} />
289
- <div id="column-style-container" class="number-column-style-container">
290
- <SelectEnumField<NumberForegroundMode>
291
- label="foreground"
292
- on_change={fg_mode_changed}
293
- current_value={self.fg_mode}
294
- />
295
- { fg_controls }
296
- <SelectEnumField<NumberBackgroundMode>
297
- label="background"
298
- on_change={bg_mode_changed}
299
- current_value={self.bg_mode}
300
- />
301
- { bg_controls }
302
- </div>
303
- </>
304
- }
305
- }
306
- }
307
-
308
- impl NumberColumnStyle {
309
- /// When this config has changed, we must signal the wrapper element.
310
- fn dispatch_config(&self, ctx: &Context<Self>) {
311
- let mut config = self.config.clone();
312
- match &self.config {
313
- NumberColumnStyleConfig {
314
- pos_fg_color: Some(pos_color),
315
- neg_fg_color: Some(neg_color),
316
- ..
317
- } if *pos_color == self.default_config.pos_fg_color
318
- && *neg_color == self.default_config.neg_fg_color =>
319
- {
320
- config.pos_fg_color = None;
321
- config.neg_fg_color = None;
322
- },
323
- _ => {},
324
- };
325
-
326
- match &self.config {
327
- NumberColumnStyleConfig {
328
- pos_bg_color: Some(pos_color),
329
- neg_bg_color: Some(neg_color),
330
- ..
331
- } if *pos_color == self.default_config.pos_bg_color
332
- && *neg_color == self.default_config.neg_bg_color =>
333
- {
334
- config.pos_bg_color = None;
335
- config.neg_bg_color = None;
336
- },
337
- _ => {},
338
- };
339
-
340
- let update = Some(config).filter(|config| config != &NumberColumnStyleConfig::default());
341
-
342
- ctx.props()
343
- .on_change
344
- .emit(ColumnConfigValueUpdate::DatagridNumberStyle(update));
345
- }
346
-
347
- fn color_props(
348
- &self,
349
- id: &str,
350
- side: Side,
351
- is_gradient: bool,
352
- ctx: &Context<Self>,
353
- ) -> ColorRangeProps {
354
- let on_pos_color = ctx
355
- .link()
356
- .callback(move |x| NumberColumnStyleMsg::PosColorChanged(side, x));
357
- let on_neg_color = ctx
358
- .link()
359
- .callback(move |x| NumberColumnStyleMsg::NegColorChanged(side, x));
360
-
361
- let default_config = self.default_config.clone();
362
-
363
- props!(ColorRangeProps {
364
- id: id.to_string(),
365
- is_gradient,
366
- pos_color: if side == Fg {
367
- &self.pos_fg_color
368
- } else {
369
- &self.pos_bg_color
370
- }
371
- .to_owned(),
372
- neg_color: if side == Fg {
373
- &self.neg_fg_color
374
- } else {
375
- &self.neg_bg_color
376
- }
377
- .to_owned(),
378
- on_pos_color,
379
- on_neg_color,
380
- on_reset: ctx.link().batch_callback(move |_| if side == Fg {
381
- vec![
382
- NumberColumnStyleMsg::PosColorChanged(
383
- side,
384
- default_config.pos_fg_color.clone(),
385
- ),
386
- NumberColumnStyleMsg::NegColorChanged(
387
- side,
388
- default_config.neg_fg_color.clone(),
389
- ),
390
- ]
391
- } else {
392
- vec![
393
- NumberColumnStyleMsg::PosColorChanged(
394
- side,
395
- default_config.pos_bg_color.clone(),
396
- ),
397
- NumberColumnStyleMsg::NegColorChanged(
398
- side,
399
- default_config.neg_bg_color.clone(),
400
- ),
401
- ]
402
- }),
403
- is_modified: if side == Fg {
404
- self.pos_fg_color != self.default_config.pos_fg_color
405
- || self.neg_fg_color != self.default_config.neg_fg_color
406
- } else {
407
- self.pos_bg_color != self.default_config.pos_bg_color
408
- || self.neg_bg_color != self.default_config.neg_bg_color
409
- },
410
- })
411
- }
412
-
413
- fn max_value_props(&self, side: Side, ctx: &Context<Self>) -> NumberFieldProps {
414
- let on_change = ctx
415
- .link()
416
- .callback(move |x| NumberColumnStyleMsg::GradientChanged(side, x));
417
-
418
- let value = if side == Fg {
419
- self.fg_gradient.unwrap_or_default()
420
- } else {
421
- self.bg_gradient.unwrap_or_default()
422
- };
423
-
424
- props!(NumberFieldProps {
425
- default: value,
426
- current_value: value,
427
- label: "max-value",
428
- on_change
429
- })
430
- }
431
-
432
- fn reset(
433
- config: &NumberColumnStyleConfig,
434
- default_config: &NumberColumnStyleDefaultConfig,
435
- ) -> Self {
436
- let mut config = config.clone();
437
- let fg_gradient = config.fg_gradient;
438
- let bg_gradient = config.bg_gradient;
439
-
440
- let pos_fg_color = config
441
- .pos_fg_color
442
- .as_ref()
443
- .unwrap_or(&default_config.pos_fg_color)
444
- .to_owned();
445
-
446
- let neg_fg_color = config
447
- .neg_fg_color
448
- .as_ref()
449
- .unwrap_or(&default_config.neg_fg_color)
450
- .to_owned();
451
-
452
- let pos_bg_color = config
453
- .pos_bg_color
454
- .as_ref()
455
- .unwrap_or(&default_config.pos_bg_color)
456
- .to_owned();
457
-
458
- let neg_bg_color = config
459
- .neg_bg_color
460
- .as_ref()
461
- .unwrap_or(&default_config.neg_bg_color)
462
- .to_owned();
463
-
464
- config.pos_fg_color = Some(pos_fg_color.to_owned());
465
- config.neg_fg_color = Some(neg_fg_color.to_owned());
466
- let fg_mode = config.number_fg_mode;
467
- config.pos_bg_color = Some(pos_bg_color.to_owned());
468
- config.neg_bg_color = Some(neg_bg_color.to_owned());
469
- let bg_mode = config.number_bg_mode;
470
- Self {
471
- config,
472
- default_config: default_config.clone(),
473
- fg_mode,
474
- bg_mode,
475
- pos_fg_color,
476
- neg_fg_color,
477
- pos_bg_color,
478
- neg_bg_color,
479
- fg_gradient,
480
- bg_gradient,
481
- }
482
- }
483
- }
@@ -1,132 +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
-
34
- impl FromStr for NumberForegroundMode {
35
- type Err = String;
36
-
37
- fn from_str(s: &str) -> Result<Self, Self::Err> {
38
- match s {
39
- "color" => Ok(Self::Color),
40
- "bar" => Ok(Self::Bar),
41
- x => Err(format!("Unknown NumberForegroundMode::{x}")),
42
- }
43
- }
44
- }
45
-
46
- impl NumberForegroundMode {
47
- fn is_color(&self) -> bool {
48
- *self == Self::Color
49
- }
50
-
51
- pub fn is_enabled(&self) -> bool {
52
- *self != Self::Disabled
53
- }
54
-
55
- pub fn needs_gradient(&self) -> bool {
56
- *self == Self::Bar
57
- }
58
- }
59
-
60
- #[derive(
61
- Clone, Copy, Debug, Default, Deserialize, Display, EnumIter, Eq, PartialEq, Serialize, TS,
62
- )]
63
- pub enum NumberBackgroundMode {
64
- #[default]
65
- #[serde(rename = "disabled")]
66
- Disabled,
67
-
68
- #[serde(rename = "color")]
69
- Color,
70
-
71
- #[serde(rename = "gradient")]
72
- Gradient,
73
-
74
- #[serde(rename = "pulse")]
75
- Pulse,
76
- }
77
-
78
- impl NumberBackgroundMode {
79
- pub fn is_disabled(&self) -> bool {
80
- *self == Self::Disabled
81
- }
82
-
83
- pub fn needs_gradient(&self) -> bool {
84
- *self == Self::Gradient
85
- }
86
- }
87
-
88
- #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, TS)]
89
- pub struct NumberColumnStyleConfig {
90
- #[serde(default = "NumberForegroundMode::default")]
91
- #[serde(skip_serializing_if = "NumberForegroundMode::is_color")]
92
- pub number_fg_mode: NumberForegroundMode,
93
-
94
- #[serde(default = "NumberBackgroundMode::default")]
95
- #[serde(skip_serializing_if = "NumberBackgroundMode::is_disabled")]
96
- pub number_bg_mode: NumberBackgroundMode,
97
-
98
- #[serde(skip_serializing_if = "Option::is_none")]
99
- pub pos_fg_color: Option<String>,
100
-
101
- #[serde(skip_serializing_if = "Option::is_none")]
102
- pub neg_fg_color: Option<String>,
103
-
104
- #[serde(skip_serializing_if = "Option::is_none")]
105
- pub pos_bg_color: Option<String>,
106
-
107
- #[serde(skip_serializing_if = "Option::is_none")]
108
- pub neg_bg_color: Option<String>,
109
-
110
- #[serde(skip_serializing_if = "Option::is_none")]
111
- pub fg_gradient: Option<f64>,
112
-
113
- #[serde(skip_serializing_if = "Option::is_none")]
114
- pub bg_gradient: Option<f64>,
115
- }
116
-
117
- /// Exactly like a `ColumnStyleConfig`, except without `Option<>` fields.
118
- ///
119
- /// Necessary because this struct represents the default values we should use in
120
- /// the GUI when they are `None` in the real config. It is also used to decide
121
- /// when to omit a field when serialized a `ColumnStyleConfig` to JSON.
122
- #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq)]
123
- pub struct NumberColumnStyleDefaultConfig {
124
- pub fg_gradient: f64,
125
- pub bg_gradient: f64,
126
- pub pos_fg_color: String,
127
- pub neg_fg_color: String,
128
- pub pos_bg_color: String,
129
- pub neg_bg_color: String,
130
- pub number_fg_mode: NumberForegroundMode,
131
- pub number_bg_mode: NumberBackgroundMode,
132
- }