@perspective-dev/viewer 4.0.0 → 4.1.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.
- package/dist/cdn/perspective-viewer.js +2 -2
- package/dist/cdn/perspective-viewer.js.map +4 -4
- package/dist/css/dracula.css +1 -1
- package/dist/css/gruvbox-dark.css +1 -1
- package/dist/css/gruvbox.css +1 -1
- package/dist/css/icons.css +1 -1
- package/dist/css/monokai.css +1 -1
- package/dist/css/pro-dark.css +1 -1
- package/dist/css/pro.css +1 -1
- package/dist/css/solarized-dark.css +1 -1
- package/dist/css/solarized.css +1 -1
- package/dist/css/themes.css +1 -1
- package/dist/css/vaporwave.css +1 -1
- package/dist/esm/extensions.d.ts +23 -2
- package/dist/esm/perspective-viewer.d.ts +2 -7
- package/dist/esm/perspective-viewer.inline.js +2 -2
- package/dist/esm/perspective-viewer.inline.js.map +4 -4
- package/dist/esm/perspective-viewer.js +2 -2
- package/dist/esm/perspective-viewer.js.map +4 -4
- package/dist/esm/plugin.d.ts +1 -1
- package/dist/esm/ts-rs/ViewerConfigUpdate.d.ts +1 -0
- package/dist/wasm/perspective-viewer.d.ts +218 -46
- package/dist/wasm/perspective-viewer.js +1251 -762
- package/dist/wasm/perspective-viewer.wasm +0 -0
- package/dist/wasm/perspective-viewer.wasm.d.ts +38 -19
- package/package.json +1 -1
- package/src/less/containers/scroll-panel.less +0 -1
- package/src/less/plugin-selector.less +15 -5
- package/src/less/status-bar.less +75 -27
- package/src/less/viewer.less +140 -58
- package/src/rust/components/column_dropdown.rs +21 -21
- package/src/rust/components/column_selector/active_column.rs +131 -120
- package/src/rust/components/column_selector/add_expression_button.rs +5 -0
- package/src/rust/components/column_selector/aggregate_selector.rs +8 -4
- package/src/rust/components/column_selector/config_selector.rs +170 -161
- package/src/rust/components/column_selector/empty_column.rs +16 -11
- package/src/rust/components/column_selector/{expression_toolbar.rs → expr_edit_button.rs} +7 -0
- package/src/rust/components/column_selector/filter_column.rs +195 -194
- package/src/rust/components/column_selector/inactive_column.rs +82 -67
- package/src/rust/components/column_selector/pivot_column.rs +16 -11
- package/src/rust/components/column_selector/sort_column.rs +9 -7
- package/src/rust/components/column_selector.rs +42 -37
- package/src/rust/components/column_settings_sidebar/save_settings.rs +3 -1
- package/src/rust/components/column_settings_sidebar/style_tab/agg_depth_selector.rs +58 -0
- package/src/rust/components/column_settings_sidebar/style_tab/symbol/row_selector.rs +6 -6
- package/src/rust/components/column_settings_sidebar/style_tab/symbol/symbol_pairs.rs +2 -94
- package/src/rust/components/column_settings_sidebar/style_tab/symbol/symbol_pairs_item.rs +111 -0
- package/src/rust/components/column_settings_sidebar/style_tab/symbol.rs +3 -3
- package/src/rust/components/column_settings_sidebar/style_tab.rs +23 -83
- package/src/rust/components/{column_settings_sidebar/sidebar.rs → column_settings_sidebar.rs} +198 -171
- package/src/rust/components/containers/dragdrop_list.rs +20 -20
- package/src/rust/components/containers/dropdown_menu.rs +4 -6
- package/src/rust/components/containers/mod.rs +1 -4
- package/src/rust/components/containers/scroll_panel.rs +80 -80
- package/src/rust/components/containers/scroll_panel_item.rs +36 -36
- package/src/rust/components/containers/select.rs +46 -44
- package/src/rust/components/containers/sidebar.rs +3 -19
- package/src/rust/components/{column_settings_sidebar/style_tab/symbol/symbol_config.rs → containers/sidebar_close_button.rs} +15 -9
- package/src/rust/components/containers/split_panel.rs +212 -200
- package/src/rust/components/containers/tab_list.rs +11 -11
- package/src/rust/components/copy_dropdown.rs +22 -25
- package/src/rust/components/datetime_column_style/custom.rs +19 -19
- package/src/rust/components/datetime_column_style/simple.rs +13 -14
- package/src/rust/components/datetime_column_style.rs +75 -76
- package/src/rust/components/editable_header.rs +18 -14
- package/src/rust/components/empty_row.rs +5 -5
- package/src/rust/components/export_dropdown.rs +42 -42
- package/src/rust/components/expression_editor.rs +25 -19
- package/src/rust/components/filter_dropdown.rs +22 -22
- package/src/rust/components/font_loader.rs +11 -9
- package/src/rust/components/form/code_editor.rs +106 -105
- package/src/rust/components/form/color_range_selector.rs +14 -12
- package/src/rust/components/form/color_selector.rs +3 -1
- package/src/rust/components/form/debug.rs +95 -94
- package/src/rust/components/form/highlight.rs +5 -3
- package/src/rust/components/form/mod.rs +3 -2
- package/src/rust/components/form/optional_field.rs +2 -2
- package/src/rust/components/form/{select_field.rs → select_enum_field.rs} +1 -46
- package/src/rust/components/form/select_value_field.rs +64 -0
- package/src/rust/components/function_dropdown.rs +21 -21
- package/src/rust/components/main_panel.rs +219 -0
- package/src/rust/components/mod.rs +6 -6
- package/src/rust/components/modal.rs +42 -42
- package/src/rust/components/number_column_style.rs +34 -88
- package/src/rust/components/plugin_selector.rs +22 -25
- package/src/rust/components/render_warning.rs +9 -6
- package/src/rust/components/settings_panel.rs +82 -0
- package/src/rust/components/status_bar.rs +250 -146
- package/src/rust/components/status_bar_counter.rs +26 -119
- package/src/rust/components/status_indicator.rs +95 -79
- package/src/rust/components/string_column_style.rs +45 -45
- package/src/rust/components/style/style_provider.rs +1 -15
- package/src/rust/components/style_controls/number_string_format/digits_section.rs +1 -1
- package/src/rust/components/style_controls/number_string_format/misc_section.rs +1 -1
- package/src/rust/components/style_controls/number_string_format/style_section.rs +1 -1
- package/src/rust/components/style_controls/number_string_format.rs +45 -46
- package/src/rust/components/type_icon.rs +14 -11
- package/src/rust/components/viewer.rs +241 -384
- package/src/rust/config/columns_config.rs +2 -2
- package/src/rust/config/datetime_column_style.rs +1 -6
- package/src/rust/config/mod.rs +1 -0
- package/src/rust/config/number_column_style.rs +0 -6
- package/src/rust/config/number_string_format.rs +27 -4
- package/src/rust/config/viewer_config.rs +27 -167
- package/src/rust/custom_elements/copy_dropdown.rs +14 -6
- package/src/rust/custom_elements/export_dropdown.rs +15 -7
- package/src/rust/custom_elements/filter_dropdown.rs +4 -4
- package/src/rust/custom_elements/mod.rs +3 -0
- package/src/rust/custom_elements/viewer.rs +353 -161
- package/src/rust/custom_events.rs +55 -32
- package/src/rust/dragdrop.rs +4 -24
- package/src/rust/exprtk/cursor.rs +10 -1
- package/src/rust/exprtk/mod.rs +2 -0
- package/src/rust/exprtk/tokenize.rs +20 -3
- package/src/rust/js/clipboard.rs +2 -2
- package/src/rust/js/mimetype.rs +2 -7
- package/src/rust/js/mod.rs +0 -1
- package/src/rust/js/plugin.rs +7 -0
- package/src/rust/lib.rs +18 -5
- package/src/rust/model/column_locator.rs +82 -0
- package/src/rust/model/columns_iter_set.rs +1 -0
- package/src/rust/model/copy_export.rs +50 -14
- package/src/rust/model/edit_expression.rs +2 -5
- package/src/rust/model/eject.rs +41 -0
- package/src/rust/model/export_app.rs +3 -2
- package/src/rust/model/get_viewer_config.rs +4 -28
- package/src/rust/model/intersection_observer.rs +20 -8
- package/src/rust/model/mod.rs +11 -4
- package/src/rust/model/plugin_column_styles.rs +0 -31
- package/src/rust/model/reset_all.rs +38 -0
- package/src/rust/model/resize_observer.rs +34 -7
- package/src/rust/model/restore_and_render.rs +12 -7
- package/src/rust/{utils/scope.rs → model/send_plugin_config.rs} +32 -35
- package/src/rust/model/structural.rs +194 -23
- package/src/rust/model/update_and_render.rs +14 -4
- package/src/rust/{model/create_col.rs → presentation/column_locator.rs} +73 -42
- package/src/rust/{utils/wasm_abi.rs → presentation/sheets.rs} +54 -40
- package/src/rust/presentation.rs +60 -119
- package/src/rust/renderer/activate.rs +20 -5
- package/src/rust/renderer/limits.rs +0 -149
- package/src/rust/renderer/render_timer.rs +1 -1
- package/src/rust/renderer.rs +34 -18
- package/src/rust/root.rs +50 -0
- package/src/rust/session/column_defaults_update.rs +4 -4
- package/src/rust/session/drag_drop_update.rs +1 -1
- package/src/rust/session/metadata.rs +3 -17
- package/src/rust/session/replace_expression_update.rs +1 -2
- package/src/rust/session.rs +162 -82
- package/src/rust/utils/browser/blob.rs +16 -2
- package/src/rust/utils/browser/download.rs +1 -0
- package/src/rust/{components/column_settings_sidebar/mod.rs → utils/browser/dragdrop.rs} +14 -5
- package/src/rust/utils/browser/mod.rs +8 -4
- package/src/rust/utils/browser/selection.rs +5 -0
- package/src/rust/utils/custom_element.rs +28 -13
- package/src/rust/utils/datetime.rs +5 -0
- package/src/rust/utils/debounce.rs +7 -1
- package/src/rust/utils/hooks/use_async_callback.rs +7 -17
- package/src/rust/utils/mod.rs +28 -40
- package/src/rust/utils/number_format.rs +6 -5
- package/src/rust/utils/pubsub.rs +15 -10
- package/src/rust/utils/weak_scope.rs +11 -1
- package/src/svg/bookmark-icon.svg +4 -0
- package/src/svg/drag-handle copy.svg +10 -0
- package/src/svg/drawer-tab-hover.svg +5 -7
- package/src/svg/drawer-tab-invert-hover.svg +4 -8
- package/src/svg/drawer-tab-invert.svg +4 -7
- package/src/svg/drawer-tab.svg +4 -6
- package/src/svg/status_ok.svg +24 -24
- package/src/ts/extensions.ts +51 -3
- package/src/ts/perspective-viewer.ts +2 -14
- package/src/ts/plugin.ts +1 -1
- package/src/ts/ts-rs/ViewerConfigUpdate.ts +1 -1
- package/src/rust/components/column_settings_sidebar/style_tab/column_style.rs +0 -177
- package/src/rust/components/containers/tests/mod.rs +0 -11
- package/src/rust/components/containers/tests/split_panel.rs +0 -91
- package/src/rust/js/testing.rs +0 -149
- package/src/rust/utils/tee.rs +0 -88
- /package/dist/wasm/snippets/{perspective-viewer-c69283f6f62a5f14 → perspective-viewer-0d326a25c1022412}/inline0.js +0 -0
- /package/dist/wasm/snippets/{perspective-viewer-c69283f6f62a5f14 → perspective-viewer-0d326a25c1022412}/inline1.js +0 -0
- /package/dist/wasm/snippets/{perspective-viewer-c69283f6f62a5f14 → perspective-viewer-0d326a25c1022412}/inline2.js +0 -0
- /package/dist/wasm/snippets/{perspective-viewer-c69283f6f62a5f14 → perspective-viewer-0d326a25c1022412}/inline3.js +0 -0
- /package/dist/wasm/snippets/{perspective-viewer-c69283f6f62a5f14 → perspective-viewer-0d326a25c1022412}/inline4.js +0 -0
- /package/src/rust/components/{style_controls.rs → style_controls/mod.rs} +0 -0
- /package/src/rust/{components/containers → config}/kvpair.rs +0 -0
|
@@ -15,6 +15,7 @@ use std::rc::Rc;
|
|
|
15
15
|
|
|
16
16
|
use perspective_client::config::*;
|
|
17
17
|
use perspective_client::utils::PerspectiveResultExt;
|
|
18
|
+
use perspective_js::utils::ApiFuture;
|
|
18
19
|
use yew::prelude::*;
|
|
19
20
|
|
|
20
21
|
use super::InPlaceColumn;
|
|
@@ -29,17 +30,19 @@ use crate::model::*;
|
|
|
29
30
|
use crate::renderer::*;
|
|
30
31
|
use crate::session::*;
|
|
31
32
|
use crate::utils::*;
|
|
32
|
-
use crate
|
|
33
|
+
use crate::{PerspectiveProperties, css};
|
|
33
34
|
|
|
34
|
-
#[derive(Properties)]
|
|
35
|
+
#[derive(Properties, PerspectiveProperties!)]
|
|
35
36
|
pub struct ConfigSelectorProps {
|
|
36
|
-
pub session: Session,
|
|
37
|
-
pub renderer: Renderer,
|
|
38
|
-
pub dragdrop: DragDrop,
|
|
39
37
|
pub onselect: Callback<()>,
|
|
40
38
|
|
|
41
39
|
#[prop_or_default]
|
|
42
40
|
pub ondragenter: Callback<()>,
|
|
41
|
+
|
|
42
|
+
// State
|
|
43
|
+
pub session: Session,
|
|
44
|
+
pub renderer: Renderer,
|
|
45
|
+
pub dragdrop: DragDrop,
|
|
43
46
|
}
|
|
44
47
|
|
|
45
48
|
impl PartialEq for ConfigSelectorProps {
|
|
@@ -48,18 +51,6 @@ impl PartialEq for ConfigSelectorProps {
|
|
|
48
51
|
}
|
|
49
52
|
}
|
|
50
53
|
|
|
51
|
-
impl ConfigSelectorProps {
|
|
52
|
-
fn default_op(&self, column: &str) -> Option<String> {
|
|
53
|
-
let metadata = self.session.metadata();
|
|
54
|
-
let features = metadata.get_features()?;
|
|
55
|
-
let col_type = metadata.get_column_table_type(column)?;
|
|
56
|
-
let first = features.default_op(col_type)?;
|
|
57
|
-
Some(first.to_string())
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
derive_model!(Renderer, Session for ConfigSelectorProps);
|
|
62
|
-
|
|
63
54
|
#[derive(Debug)]
|
|
64
55
|
pub enum ConfigSelectorMsg {
|
|
65
56
|
DragStart,
|
|
@@ -81,104 +72,6 @@ pub struct ConfigSelector {
|
|
|
81
72
|
_subscriptions: [Rc<Subscription>; 4],
|
|
82
73
|
}
|
|
83
74
|
|
|
84
|
-
struct GroupByContext {}
|
|
85
|
-
struct SplitByContext {}
|
|
86
|
-
struct SortDragContext {}
|
|
87
|
-
struct FilterDragContext {}
|
|
88
|
-
|
|
89
|
-
impl DragContext<ConfigSelectorMsg> for GroupByContext {
|
|
90
|
-
fn dragenter(index: usize) -> ConfigSelectorMsg {
|
|
91
|
-
ConfigSelectorMsg::DragOver(index, DragTarget::GroupBy)
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
fn close(index: usize) -> ConfigSelectorMsg {
|
|
95
|
-
ConfigSelectorMsg::Close(index, DragTarget::GroupBy)
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
fn dragleave() -> ConfigSelectorMsg {
|
|
99
|
-
ConfigSelectorMsg::DragLeave(DragTarget::GroupBy)
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
fn create(col: InPlaceColumn) -> ConfigSelectorMsg {
|
|
103
|
-
ConfigSelectorMsg::New(DragTarget::GroupBy, col)
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
fn is_self_move(target: DragTarget) -> bool {
|
|
107
|
-
target == DragTarget::GroupBy
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
impl DragContext<ConfigSelectorMsg> for SplitByContext {
|
|
112
|
-
fn dragenter(index: usize) -> ConfigSelectorMsg {
|
|
113
|
-
ConfigSelectorMsg::DragOver(index, DragTarget::SplitBy)
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
fn close(index: usize) -> ConfigSelectorMsg {
|
|
117
|
-
ConfigSelectorMsg::Close(index, DragTarget::SplitBy)
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
fn dragleave() -> ConfigSelectorMsg {
|
|
121
|
-
ConfigSelectorMsg::DragLeave(DragTarget::SplitBy)
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
fn create(col: InPlaceColumn) -> ConfigSelectorMsg {
|
|
125
|
-
ConfigSelectorMsg::New(DragTarget::SplitBy, col)
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
fn is_self_move(target: DragTarget) -> bool {
|
|
129
|
-
target == DragTarget::SplitBy
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
impl DragContext<ConfigSelectorMsg> for SortDragContext {
|
|
134
|
-
fn dragenter(index: usize) -> ConfigSelectorMsg {
|
|
135
|
-
ConfigSelectorMsg::DragOver(index, DragTarget::Sort)
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
fn close(index: usize) -> ConfigSelectorMsg {
|
|
139
|
-
ConfigSelectorMsg::Close(index, DragTarget::Sort)
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
fn dragleave() -> ConfigSelectorMsg {
|
|
143
|
-
ConfigSelectorMsg::DragLeave(DragTarget::Sort)
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
fn create(col: InPlaceColumn) -> ConfigSelectorMsg {
|
|
147
|
-
ConfigSelectorMsg::New(DragTarget::Sort, col)
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
fn is_self_move(target: DragTarget) -> bool {
|
|
151
|
-
target == DragTarget::Sort
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
impl DragContext<ConfigSelectorMsg> for FilterDragContext {
|
|
156
|
-
fn dragenter(index: usize) -> ConfigSelectorMsg {
|
|
157
|
-
ConfigSelectorMsg::DragOver(index, DragTarget::Filter)
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
fn close(index: usize) -> ConfigSelectorMsg {
|
|
161
|
-
ConfigSelectorMsg::Close(index, DragTarget::Filter)
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
fn dragleave() -> ConfigSelectorMsg {
|
|
165
|
-
ConfigSelectorMsg::DragLeave(DragTarget::Filter)
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
fn create(col: InPlaceColumn) -> ConfigSelectorMsg {
|
|
169
|
-
ConfigSelectorMsg::New(DragTarget::Filter, col)
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
fn is_self_move(target: DragTarget) -> bool {
|
|
173
|
-
target == DragTarget::Filter
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
type GroupBySelector = DragDropList<ConfigSelector, PivotColumn, GroupByContext>;
|
|
178
|
-
type SplitBySelector = DragDropList<ConfigSelector, PivotColumn, SplitByContext>;
|
|
179
|
-
type SortSelector = DragDropList<ConfigSelector, SortColumn, SortDragContext>;
|
|
180
|
-
type FilterSelector = DragDropList<ConfigSelector, FilterColumn, FilterDragContext>;
|
|
181
|
-
|
|
182
75
|
impl Component for ConfigSelector {
|
|
183
76
|
type Message = ConfigSelectorMsg;
|
|
184
77
|
type Properties = ConfigSelectorProps;
|
|
@@ -535,21 +428,27 @@ impl Component for ConfigSelector {
|
|
|
535
428
|
// }
|
|
536
429
|
|
|
537
430
|
fn view(&self, ctx: &Context<Self>) -> Html {
|
|
538
|
-
let
|
|
431
|
+
let ConfigSelectorProps {
|
|
432
|
+
dragdrop,
|
|
433
|
+
renderer,
|
|
434
|
+
session,
|
|
435
|
+
..
|
|
436
|
+
} = ctx.props();
|
|
437
|
+
let config = session.get_view_config();
|
|
539
438
|
let transpose = ctx.link().callback(|_| ConfigSelectorMsg::TransposePivots);
|
|
540
439
|
let column_dropdown = self.column_dropdown.clone();
|
|
541
|
-
let class = if
|
|
440
|
+
let class = if dragdrop.get_drag_column().is_some() {
|
|
542
441
|
"dragdrop-highlight"
|
|
543
442
|
} else {
|
|
544
443
|
""
|
|
545
444
|
};
|
|
546
445
|
|
|
547
446
|
let dragend = Callback::from({
|
|
548
|
-
let dragdrop =
|
|
447
|
+
let dragdrop = dragdrop.clone();
|
|
549
448
|
move |_event| dragdrop.notify_drag_end()
|
|
550
449
|
});
|
|
551
450
|
|
|
552
|
-
let metadata =
|
|
451
|
+
let metadata = session.metadata();
|
|
553
452
|
let features = metadata.get_features().unwrap();
|
|
554
453
|
|
|
555
454
|
html! {
|
|
@@ -570,18 +469,19 @@ impl Component for ConfigSelector {
|
|
|
570
469
|
column_dropdown={column_dropdown.clone()}
|
|
571
470
|
exclude={config.group_by.iter().cloned().collect::<HashSet<_>>()}
|
|
572
471
|
is_dragover={ctx.props().dragdrop.is_dragover(DragTarget::GroupBy)}
|
|
573
|
-
|
|
472
|
+
{dragdrop}
|
|
574
473
|
>
|
|
575
474
|
{ for config.group_by.iter().map(|group_by| {
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
475
|
+
html_nested! {
|
|
476
|
+
<PivotColumn
|
|
477
|
+
action={DragTarget::GroupBy}
|
|
478
|
+
column={group_by.clone()}
|
|
479
|
+
{dragdrop}
|
|
480
|
+
{session}
|
|
481
|
+
>
|
|
482
|
+
</PivotColumn>
|
|
483
|
+
}
|
|
484
|
+
}) }
|
|
585
485
|
</GroupBySelector>
|
|
586
486
|
}
|
|
587
487
|
if features.split_by {
|
|
@@ -598,16 +498,17 @@ impl Component for ConfigSelector {
|
|
|
598
498
|
parent={ctx.link().clone()}
|
|
599
499
|
column_dropdown={column_dropdown.clone()}
|
|
600
500
|
exclude={config.split_by.iter().cloned().collect::<HashSet<_>>()}
|
|
601
|
-
is_dragover={
|
|
602
|
-
|
|
501
|
+
is_dragover={dragdrop.is_dragover(DragTarget::SplitBy)}
|
|
502
|
+
{dragdrop}
|
|
603
503
|
>
|
|
604
504
|
{ for config.split_by.iter().map(|split_by| {
|
|
605
505
|
html_nested! {
|
|
606
506
|
<PivotColumn
|
|
607
|
-
dragdrop={ &ctx.props().dragdrop }
|
|
608
|
-
session={ &ctx.props().session }
|
|
609
507
|
action={ DragTarget::SplitBy }
|
|
610
|
-
column={ split_by.clone() }
|
|
508
|
+
column={ split_by.clone() }
|
|
509
|
+
|
|
510
|
+
{dragdrop}
|
|
511
|
+
{session}>
|
|
611
512
|
</PivotColumn>
|
|
612
513
|
}
|
|
613
514
|
}) }
|
|
@@ -620,19 +521,19 @@ impl Component for ConfigSelector {
|
|
|
620
521
|
parent={ctx.link().clone()}
|
|
621
522
|
column_dropdown={column_dropdown.clone()}
|
|
622
523
|
exclude={config.sort.iter().map(|x| x.0.clone()).collect::<HashSet<_>>()}
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
524
|
+
is_dragover={dragdrop.is_dragover(DragTarget::Sort).map(|(index, name)| {
|
|
525
|
+
(index, Sort(name, SortDir::Asc))
|
|
526
|
+
})}
|
|
527
|
+
{dragdrop}
|
|
627
528
|
>
|
|
628
529
|
{ for config.sort.iter().enumerate().map(|(idx, sort)| {
|
|
629
530
|
html_nested! {
|
|
630
531
|
<SortColumn
|
|
631
532
|
idx={ idx }
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
533
|
+
sort={ sort.clone() }
|
|
534
|
+
{dragdrop}
|
|
535
|
+
{renderer}
|
|
536
|
+
{session}>
|
|
636
537
|
</SortColumn>
|
|
637
538
|
}
|
|
638
539
|
}) }
|
|
@@ -645,30 +546,138 @@ impl Component for ConfigSelector {
|
|
|
645
546
|
parent={ctx.link().clone()}
|
|
646
547
|
{column_dropdown}
|
|
647
548
|
exclude={config.filter.iter().map(|x| x.column().to_string()).collect::<HashSet<_>>()}
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
549
|
+
is_dragover={dragdrop.is_dragover(DragTarget::Filter).map(|(index, name)| {
|
|
550
|
+
(index, Filter::new(&name, "", FilterTerm::Scalar(Scalar::Null)))
|
|
551
|
+
})}
|
|
552
|
+
{dragdrop}
|
|
652
553
|
>
|
|
653
554
|
{ for config.filter.iter().enumerate().map(|(idx, filter)| {
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
555
|
+
let filter_keydown = ctx.link()
|
|
556
|
+
.callback(move |txt| ConfigSelectorMsg::SetFilterValue(idx, txt));
|
|
557
|
+
|
|
558
|
+
html_nested! {
|
|
559
|
+
<FilterColumn
|
|
560
|
+
idx={ idx }
|
|
561
|
+
filter_dropdown={ &self.filter_dropdown }
|
|
562
|
+
filter={ filter.clone() }
|
|
563
|
+
on_keydown={ filter_keydown }
|
|
564
|
+
{dragdrop}
|
|
565
|
+
{renderer}
|
|
566
|
+
{session}>
|
|
567
|
+
</FilterColumn>
|
|
568
|
+
}
|
|
569
|
+
}) }
|
|
669
570
|
</FilterSelector>
|
|
670
571
|
}
|
|
671
572
|
</div>
|
|
672
573
|
}
|
|
673
574
|
}
|
|
674
575
|
}
|
|
576
|
+
|
|
577
|
+
impl ConfigSelectorProps {
|
|
578
|
+
fn default_op(&self, column: &str) -> Option<String> {
|
|
579
|
+
let metadata = self.session.metadata();
|
|
580
|
+
let features = metadata.get_features()?;
|
|
581
|
+
let col_type = metadata.get_column_table_type(column)?;
|
|
582
|
+
let first = features.default_op(col_type)?;
|
|
583
|
+
Some(first.to_string())
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
struct GroupByContext {}
|
|
588
|
+
struct SplitByContext {}
|
|
589
|
+
struct SortDragContext {}
|
|
590
|
+
struct FilterDragContext {}
|
|
591
|
+
|
|
592
|
+
impl DragContext<ConfigSelectorMsg> for GroupByContext {
|
|
593
|
+
fn dragenter(index: usize) -> ConfigSelectorMsg {
|
|
594
|
+
ConfigSelectorMsg::DragOver(index, DragTarget::GroupBy)
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
fn close(index: usize) -> ConfigSelectorMsg {
|
|
598
|
+
ConfigSelectorMsg::Close(index, DragTarget::GroupBy)
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
fn dragleave() -> ConfigSelectorMsg {
|
|
602
|
+
ConfigSelectorMsg::DragLeave(DragTarget::GroupBy)
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
fn create(col: InPlaceColumn) -> ConfigSelectorMsg {
|
|
606
|
+
ConfigSelectorMsg::New(DragTarget::GroupBy, col)
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
fn is_self_move(target: DragTarget) -> bool {
|
|
610
|
+
target == DragTarget::GroupBy
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
impl DragContext<ConfigSelectorMsg> for SplitByContext {
|
|
615
|
+
fn dragenter(index: usize) -> ConfigSelectorMsg {
|
|
616
|
+
ConfigSelectorMsg::DragOver(index, DragTarget::SplitBy)
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
fn close(index: usize) -> ConfigSelectorMsg {
|
|
620
|
+
ConfigSelectorMsg::Close(index, DragTarget::SplitBy)
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
fn dragleave() -> ConfigSelectorMsg {
|
|
624
|
+
ConfigSelectorMsg::DragLeave(DragTarget::SplitBy)
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
fn create(col: InPlaceColumn) -> ConfigSelectorMsg {
|
|
628
|
+
ConfigSelectorMsg::New(DragTarget::SplitBy, col)
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
fn is_self_move(target: DragTarget) -> bool {
|
|
632
|
+
target == DragTarget::SplitBy
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
impl DragContext<ConfigSelectorMsg> for SortDragContext {
|
|
637
|
+
fn dragenter(index: usize) -> ConfigSelectorMsg {
|
|
638
|
+
ConfigSelectorMsg::DragOver(index, DragTarget::Sort)
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
fn close(index: usize) -> ConfigSelectorMsg {
|
|
642
|
+
ConfigSelectorMsg::Close(index, DragTarget::Sort)
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
fn dragleave() -> ConfigSelectorMsg {
|
|
646
|
+
ConfigSelectorMsg::DragLeave(DragTarget::Sort)
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
fn create(col: InPlaceColumn) -> ConfigSelectorMsg {
|
|
650
|
+
ConfigSelectorMsg::New(DragTarget::Sort, col)
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
fn is_self_move(target: DragTarget) -> bool {
|
|
654
|
+
target == DragTarget::Sort
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
impl DragContext<ConfigSelectorMsg> for FilterDragContext {
|
|
659
|
+
fn dragenter(index: usize) -> ConfigSelectorMsg {
|
|
660
|
+
ConfigSelectorMsg::DragOver(index, DragTarget::Filter)
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
fn close(index: usize) -> ConfigSelectorMsg {
|
|
664
|
+
ConfigSelectorMsg::Close(index, DragTarget::Filter)
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
fn dragleave() -> ConfigSelectorMsg {
|
|
668
|
+
ConfigSelectorMsg::DragLeave(DragTarget::Filter)
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
fn create(col: InPlaceColumn) -> ConfigSelectorMsg {
|
|
672
|
+
ConfigSelectorMsg::New(DragTarget::Filter, col)
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
fn is_self_move(target: DragTarget) -> bool {
|
|
676
|
+
target == DragTarget::Filter
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
type GroupBySelector = DragDropList<ConfigSelector, PivotColumn, GroupByContext>;
|
|
681
|
+
type SplitBySelector = DragDropList<ConfigSelector, PivotColumn, SplitByContext>;
|
|
682
|
+
type SortSelector = DragDropList<ConfigSelector, SortColumn, SortDragContext>;
|
|
683
|
+
type FilterSelector = DragDropList<ConfigSelector, FilterColumn, FilterDragContext>;
|
|
@@ -20,21 +20,15 @@ use crate::components::style::LocalStyle;
|
|
|
20
20
|
use crate::css;
|
|
21
21
|
use crate::custom_elements::ColumnDropDownElement;
|
|
22
22
|
|
|
23
|
-
#[derive(Default)]
|
|
24
|
-
pub struct EmptyColumn {
|
|
25
|
-
input_ref: NodeRef,
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
#[derive(Clone, Debug)]
|
|
29
|
-
pub enum InPlaceColumn {
|
|
30
|
-
Column(String),
|
|
31
|
-
Expression(Expression<'static>),
|
|
32
|
-
}
|
|
33
|
-
|
|
34
23
|
#[derive(Properties)]
|
|
35
24
|
pub struct EmptyColumnProps {
|
|
25
|
+
/// The autocomplete dropdown element.
|
|
36
26
|
pub column_dropdown: ColumnDropDownElement,
|
|
27
|
+
|
|
28
|
+
/// Values to exclude from autocomplete
|
|
37
29
|
pub exclude: HashSet<String>,
|
|
30
|
+
|
|
31
|
+
/// Fires when a value is selected.
|
|
38
32
|
pub on_select: Callback<InPlaceColumn>,
|
|
39
33
|
}
|
|
40
34
|
|
|
@@ -44,6 +38,12 @@ impl PartialEq for EmptyColumnProps {
|
|
|
44
38
|
}
|
|
45
39
|
}
|
|
46
40
|
|
|
41
|
+
#[derive(Clone, Debug)]
|
|
42
|
+
pub enum InPlaceColumn {
|
|
43
|
+
Column(String),
|
|
44
|
+
Expression(Expression<'static>),
|
|
45
|
+
}
|
|
46
|
+
|
|
47
47
|
pub enum EmptyColumnMsg {
|
|
48
48
|
KeyDown(u32),
|
|
49
49
|
Blur,
|
|
@@ -52,6 +52,11 @@ pub enum EmptyColumnMsg {
|
|
|
52
52
|
|
|
53
53
|
use EmptyColumnMsg::*;
|
|
54
54
|
|
|
55
|
+
#[derive(Default)]
|
|
56
|
+
pub struct EmptyColumn {
|
|
57
|
+
input_ref: NodeRef,
|
|
58
|
+
}
|
|
59
|
+
|
|
55
60
|
impl Component for EmptyColumn {
|
|
56
61
|
type Message = EmptyColumnMsg;
|
|
57
62
|
type Properties = EmptyColumnProps;
|
|
@@ -16,9 +16,16 @@ use super::ColumnLocator;
|
|
|
16
16
|
|
|
17
17
|
#[derive(PartialEq, Clone, Properties)]
|
|
18
18
|
pub struct ExprEditButtonProps {
|
|
19
|
+
/// Column name.
|
|
19
20
|
pub name: String,
|
|
21
|
+
|
|
22
|
+
/// Is this an expression column?
|
|
20
23
|
pub is_expression: bool,
|
|
24
|
+
|
|
25
|
+
/// Fires when the config/expresison button is clicked.
|
|
21
26
|
pub on_open_expr_panel: Callback<ColumnLocator>,
|
|
27
|
+
|
|
28
|
+
/// Is the expression/config panel open?
|
|
22
29
|
pub is_editing: bool,
|
|
23
30
|
}
|
|
24
31
|
|