@perspective-dev/viewer 4.4.1 → 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 (225) 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 +293 -144
  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 +35 -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/viewer.css +65 -3
  53. package/src/rust/components/column_dropdown.rs +3 -1
  54. package/src/rust/components/column_selector/active_column.rs +13 -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 +9 -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 +394 -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 +43 -49
  66. package/src/rust/components/containers/dragdrop_list.rs +5 -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 +2 -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 +140 -173
  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 +92 -131
  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 +640 -51
  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 +78 -0
  136. package/src/rust/tasks/resize_observer.rs +11 -33
  137. package/src/rust/tasks/restore_and_render.rs +117 -90
  138. package/src/rust/tasks/{get_viewer_config.rs → send_column_config.rs} +38 -35
  139. package/src/rust/tasks/send_plugin_config.rs +32 -33
  140. package/src/rust/tasks/update_and_render.rs +66 -47
  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/mega-menu-icons-density.svg +23 -0
  146. package/src/svg/mega-menu-icons-map-density.svg +24 -0
  147. package/src/svg/mega-menu-icons-map-line.svg +19 -0
  148. package/src/themes/botanical.css +27 -53
  149. package/src/themes/defaults.css +24 -36
  150. package/src/themes/dracula.css +36 -54
  151. package/src/themes/gruvbox-dark.css +39 -59
  152. package/src/themes/gruvbox.css +16 -28
  153. package/src/themes/icons.css +3 -0
  154. package/src/themes/intl/de.css +42 -6
  155. package/src/themes/intl/es.css +42 -6
  156. package/src/themes/intl/fr.css +42 -6
  157. package/src/themes/intl/ja.css +42 -6
  158. package/src/themes/intl/pt.css +42 -6
  159. package/src/themes/intl/zh.css +42 -6
  160. package/src/themes/intl.css +37 -4
  161. package/src/themes/monokai.css +45 -61
  162. package/src/themes/phosphor.css +20 -29
  163. package/src/themes/pro-dark.css +25 -34
  164. package/src/themes/solarized-dark.css +21 -36
  165. package/src/themes/solarized.css +13 -23
  166. package/src/themes/vaporwave.css +40 -74
  167. package/src/ts/bootstrap.ts +14 -3
  168. package/src/ts/column-format.ts +162 -0
  169. package/src/ts/extensions.ts +4 -0
  170. package/src/ts/perspective-viewer.ts +9 -1
  171. package/src/{rust/components/column_settings_sidebar/style_tab/stub.rs → ts/perspective-viewer.worker.ts} +2 -22
  172. package/src/ts/plugin.ts +25 -101
  173. package/src/ts/ts-rs/{FormatUnit.ts → ColumnSelectMode.ts} +1 -1
  174. package/src/ts/ts-rs/PluginStaticConfig.ts +78 -0
  175. package/src/ts/ts-rs/ViewerConfig.ts +1 -2
  176. package/src/ts/ts-rs/ViewerConfigUpdate.ts +2 -3
  177. package/dist/esm/ts-rs/ColumnConfigValues.d.ts +0 -31
  178. package/dist/esm/ts-rs/CustomDatetimeFormat.d.ts +0 -1
  179. package/dist/esm/ts-rs/CustomDatetimeStyleConfig.d.ts +0 -15
  180. package/dist/esm/ts-rs/CustomNumberFormatConfig.d.ts +0 -18
  181. package/dist/esm/ts-rs/DatetimeColorMode.d.ts +0 -1
  182. package/dist/esm/ts-rs/DatetimeFormatType.d.ts +0 -6
  183. package/dist/esm/ts-rs/FormatMode.d.ts +0 -1
  184. package/dist/esm/ts-rs/FormatUnit.d.ts +0 -1
  185. package/dist/esm/ts-rs/NumberBackgroundMode.d.ts +0 -1
  186. package/dist/esm/ts-rs/NumberForegroundMode.d.ts +0 -1
  187. package/dist/esm/ts-rs/PluginConfig.d.ts +0 -2
  188. package/dist/esm/ts-rs/RoundingMode.d.ts +0 -1
  189. package/dist/esm/ts-rs/RoundingPriority.d.ts +0 -1
  190. package/dist/esm/ts-rs/SignDisplay.d.ts +0 -1
  191. package/dist/esm/ts-rs/SimpleDatetimeFormat.d.ts +0 -1
  192. package/dist/esm/ts-rs/SimpleDatetimeStyleConfig.d.ts +0 -6
  193. package/dist/esm/ts-rs/StringColorMode.d.ts +0 -1
  194. package/dist/esm/ts-rs/TrailingZeroDisplay.d.ts +0 -1
  195. package/dist/esm/ts-rs/UseGrouping.d.ts +0 -1
  196. package/src/rust/components/number_column_style.rs +0 -491
  197. package/src/rust/config/number_column_style.rs +0 -136
  198. package/src/rust/dragdrop.rs +0 -481
  199. package/src/rust/tasks/plugin_column_styles.rs +0 -98
  200. package/src/ts/ts-rs/ColumnConfigValues.ts +0 -14
  201. package/src/ts/ts-rs/CustomDatetimeFormat.ts +0 -3
  202. package/src/ts/ts-rs/CustomDatetimeStyleConfig.ts +0 -5
  203. package/src/ts/ts-rs/CustomNumberFormatConfig.ts +0 -8
  204. package/src/ts/ts-rs/DatetimeColorMode.ts +0 -3
  205. package/src/ts/ts-rs/DatetimeFormatType.ts +0 -8
  206. package/src/ts/ts-rs/FormatMode.ts +0 -3
  207. package/src/ts/ts-rs/NumberBackgroundMode.ts +0 -3
  208. package/src/ts/ts-rs/NumberForegroundMode.ts +0 -3
  209. package/src/ts/ts-rs/PluginConfig.ts +0 -4
  210. package/src/ts/ts-rs/RoundingMode.ts +0 -3
  211. package/src/ts/ts-rs/RoundingPriority.ts +0 -3
  212. package/src/ts/ts-rs/SignDisplay.ts +0 -3
  213. package/src/ts/ts-rs/SimpleDatetimeFormat.ts +0 -3
  214. package/src/ts/ts-rs/SimpleDatetimeStyleConfig.ts +0 -4
  215. package/src/ts/ts-rs/StringColorMode.ts +0 -3
  216. package/src/ts/ts-rs/TrailingZeroDisplay.ts +0 -3
  217. package/src/ts/ts-rs/UseGrouping.ts +0 -3
  218. /package/dist/wasm/snippets/{perspective-viewer-d924246f0b4a3dce → perspective-viewer-39ab7da3ca157861}/inline0.js +0 -0
  219. /package/dist/wasm/snippets/{perspective-viewer-d924246f0b4a3dce → perspective-viewer-39ab7da3ca157861}/inline1.js +0 -0
  220. /package/dist/wasm/snippets/{perspective-viewer-d924246f0b4a3dce → perspective-viewer-39ab7da3ca157861}/inline2.js +0 -0
  221. /package/dist/wasm/snippets/{perspective-viewer-d924246f0b4a3dce → perspective-viewer-39ab7da3ca157861}/inline3.js +0 -0
  222. /package/dist/wasm/snippets/{perspective-viewer-d924246f0b4a3dce → perspective-viewer-39ab7da3ca157861}/inline4.js +0 -0
  223. /package/src/rust/{tasks → config}/export_method.rs +0 -0
  224. /package/src/rust/{tasks → queries}/export_app.rs +0 -0
  225. /package/src/rust/{tasks → queries}/is_invalid_drop.rs +0 -0
@@ -1,6 +1,5 @@
1
1
  // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
2
2
  import type { Aggregate } from "./Aggregate.js";
3
- import type { ColumnConfigValues } from "./ColumnConfigValues.js";
4
3
  import type { Expressions } from "./Expressions.js";
5
4
  import type { Filter } from "./Filter.js";
6
5
  import type { FilterReducer } from "./FilterReducer.js";
@@ -12,4 +11,4 @@ import type { JsonValue } from "./serde_json/JsonValue.js";
12
11
  * The state of an entire `custom_elements::PerspectiveViewerElement` component
13
12
  * and its `Plugin`.
14
13
  */
15
- export type ViewerConfig<V = string> = { version: V, columns_config: { [key in string]?: ColumnConfigValues }, plugin: string, plugin_config: JsonValue, settings: boolean, table: string | null, theme: string | null, title: string | null, group_by: Array<string>, split_by: Array<string>, sort: Array<Sort>, filter: Array<Filter>, group_rollup_mode: GroupRollupMode, filter_op?: FilterReducer, expressions: Expressions, columns: Array<string | null>, aggregates: { [key in string]?: Aggregate }, group_by_depth?: number | null, };
14
+ export type ViewerConfig<V = string> = { version: V, columns_config: { [key in string]?: { [key in string]?: JsonValue } }, plugin: string, plugin_config: { [key in string]?: JsonValue }, settings: boolean, table: string | null, theme: string | null, title: string | null, group_by: Array<string>, split_by: Array<string>, sort: Array<Sort>, filter: Array<Filter>, group_rollup_mode: GroupRollupMode, filter_op?: FilterReducer, expressions: Expressions, columns: Array<string | null>, aggregates: { [key in string]?: Aggregate }, group_by_depth?: number | null, };
@@ -1,15 +1,14 @@
1
1
  // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
2
2
  import type { Aggregate } from "./Aggregate.js";
3
- import type { ColumnConfigValues } from "./ColumnConfigValues.js";
4
3
  import type { Expressions } from "./Expressions.js";
5
4
  import type { Filter } from "./Filter.js";
6
5
  import type { FilterReducer } from "./FilterReducer.js";
7
6
  import type { GroupRollupMode } from "./GroupRollupMode.js";
8
7
  import type { OptionalUpdate } from "./OptionalUpdate.js";
9
- import type { PluginConfig } from "./PluginConfig.js";
10
8
  import type { Sort } from "./Sort.js";
9
+ import type { JsonValue } from "./serde_json/JsonValue.js";
11
10
 
12
- export type ViewerConfigUpdate = { version?: OptionalUpdate<string>, plugin?: OptionalUpdate<string>, title?: OptionalUpdate<string>, table?: OptionalUpdate<string>, theme?: OptionalUpdate<string>, settings?: OptionalUpdate<boolean>, plugin_config?: PluginConfig | null, columns_config?: OptionalUpdate<{ [key in string]?: ColumnConfigValues }>,
11
+ export type ViewerConfigUpdate = { version?: OptionalUpdate<string>, plugin?: OptionalUpdate<string>, title?: OptionalUpdate<string>, table?: OptionalUpdate<string>, theme?: OptionalUpdate<string>, settings?: OptionalUpdate<boolean>, plugin_config?: OptionalUpdate<{ [key in string]?: JsonValue }>, columns_config?: OptionalUpdate<{ [key in string]?: { [key in string]?: JsonValue } }>,
13
12
  /**
14
13
  * A group by _groups_ the dataset by the unique values of each column used
15
14
  * as a group by - a close analogue in SQL to the `GROUP BY` statement.
@@ -1,31 +0,0 @@
1
- import type { CustomNumberFormatConfig } from "./CustomNumberFormatConfig.js";
2
- import type { DatetimeColorMode } from "./DatetimeColorMode.js";
3
- import type { DatetimeFormatType } from "./DatetimeFormatType.js";
4
- import type { FormatMode } from "./FormatMode.js";
5
- import type { NumberBackgroundMode } from "./NumberBackgroundMode.js";
6
- import type { NumberForegroundMode } from "./NumberForegroundMode.js";
7
- import type { StringColorMode } from "./StringColorMode.js";
8
- /**
9
- * The value de/serialized and stored in the viewer config.
10
- * Also passed to the plugin via `plugin.save()`.
11
- */
12
- export type ColumnConfigValues = {
13
- symbols?: {
14
- [key in string]?: string;
15
- };
16
- number_format?: CustomNumberFormatConfig | null;
17
- aggregate_depth?: number;
18
- number_fg_mode?: NumberForegroundMode;
19
- number_bg_mode?: NumberBackgroundMode;
20
- pos_fg_color: string | null;
21
- neg_fg_color: string | null;
22
- pos_bg_color: string | null;
23
- neg_bg_color: string | null;
24
- fg_gradient: number | null;
25
- bg_gradient: number | null;
26
- format?: FormatMode;
27
- string_color_mode?: StringColorMode;
28
- color?: string | null;
29
- date_format?: DatetimeFormatType;
30
- datetime_color_mode?: DatetimeColorMode;
31
- };
@@ -1 +0,0 @@
1
- export type CustomDatetimeFormat = "long" | "short" | "narrow" | "numeric" | "2-digit" | "disabled";
@@ -1,15 +0,0 @@
1
- import type { CustomDatetimeFormat } from "./CustomDatetimeFormat.js";
2
- import type { FormatUnit } from "./FormatUnit.js";
3
- export type CustomDatetimeStyleConfig = {
4
- format: FormatUnit;
5
- timeZone?: string | null;
6
- fractionalSecondDigits?: number;
7
- second?: CustomDatetimeFormat;
8
- minute?: CustomDatetimeFormat;
9
- hour?: CustomDatetimeFormat;
10
- day?: CustomDatetimeFormat;
11
- weekday?: CustomDatetimeFormat;
12
- month?: CustomDatetimeFormat;
13
- year?: CustomDatetimeFormat;
14
- hour12?: boolean;
15
- };
@@ -1,18 +0,0 @@
1
- import type { RoundingMode } from "./RoundingMode.js";
2
- import type { RoundingPriority } from "./RoundingPriority.js";
3
- import type { SignDisplay } from "./SignDisplay.js";
4
- import type { TrailingZeroDisplay } from "./TrailingZeroDisplay.js";
5
- import type { UseGrouping } from "./UseGrouping.js";
6
- export type CustomNumberFormatConfig = {
7
- minimumIntegerDigits: number | null;
8
- minimumFractionDigits: number | null;
9
- maximumFractionDigits: number | null;
10
- minimumSignificantDigits: number | null;
11
- maximumSignificantDigits: number | null;
12
- roundingPriority: RoundingPriority | null;
13
- roundingIncrement: number | null;
14
- roundingMode: RoundingMode | null;
15
- trailingZeroDisplay: TrailingZeroDisplay | null;
16
- useGrouping: UseGrouping | null;
17
- signDisplay: SignDisplay | null;
18
- };
@@ -1 +0,0 @@
1
- export type DatetimeColorMode = "none" | "foreground" | "background";
@@ -1,6 +0,0 @@
1
- import type { CustomDatetimeStyleConfig } from "./CustomDatetimeStyleConfig.js";
2
- import type { SimpleDatetimeStyleConfig } from "./SimpleDatetimeStyleConfig.js";
3
- /**
4
- * `Simple` case has all default-able keys and must be last!
5
- */
6
- export type DatetimeFormatType = CustomDatetimeStyleConfig | SimpleDatetimeStyleConfig;
@@ -1 +0,0 @@
1
- export type FormatMode = "none" | "link" | "bold" | "italics";
@@ -1 +0,0 @@
1
- export type FormatUnit = "custom";
@@ -1 +0,0 @@
1
- export type NumberBackgroundMode = "disabled" | "color" | "gradient" | "pulse";
@@ -1 +0,0 @@
1
- export type NumberForegroundMode = "disabled" | "color" | "bar" | "label-bar";
@@ -1,2 +0,0 @@
1
- import type { JsonValue } from "./serde_json/JsonValue.js";
2
- export type PluginConfig = JsonValue;
@@ -1 +0,0 @@
1
- export type RoundingMode = "ceil" | "floor" | "expand" | "trunc" | "halfCeil" | "halfFloor" | "halfExpand" | "halfTrunc" | "halfEven";
@@ -1 +0,0 @@
1
- export type RoundingPriority = "auto" | "morePrecision" | "lessPrecision";
@@ -1 +0,0 @@
1
- export type SignDisplay = "auto" | "always" | "exceptZero" | "negative" | "never";
@@ -1 +0,0 @@
1
- export type SimpleDatetimeFormat = "full" | "long" | "medium" | "short" | "disabled";
@@ -1,6 +0,0 @@
1
- import type { SimpleDatetimeFormat } from "./SimpleDatetimeFormat.js";
2
- export type SimpleDatetimeStyleConfig = {
3
- timeZone?: string | null;
4
- dateStyle?: SimpleDatetimeFormat;
5
- timeStyle?: SimpleDatetimeFormat;
6
- };
@@ -1 +0,0 @@
1
- export type StringColorMode = "none" | "foreground" | "background" | "series";
@@ -1 +0,0 @@
1
- export type TrailingZeroDisplay = "auto" | "stripIfInteger";
@@ -1 +0,0 @@
1
- export type UseGrouping = "always" | "auto" | "min2" | boolean;
@@ -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
- }