@jsenv/navi 0.10.2 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/jsenv_navi.js +13838 -23291
- package/dist/jsenv_navi.js.map +1281 -0
- package/package.json +6 -8
- package/index.js +0 -122
- package/src/action_private_properties.js +0 -11
- package/src/action_proxy_test.html +0 -353
- package/src/action_run_states.js +0 -5
- package/src/actions.js +0 -1401
- package/src/browser_integration/browser_integration.js +0 -216
- package/src/browser_integration/document_back_and_forward.js +0 -17
- package/src/browser_integration/document_loading_signal.js +0 -100
- package/src/browser_integration/document_state_signal.js +0 -9
- package/src/browser_integration/document_url_signal.js +0 -9
- package/src/browser_integration/use_is_visited.js +0 -19
- package/src/browser_integration/via_history.js +0 -232
- package/src/browser_integration/via_navigation.js +0 -168
- package/src/components/action_execution/form_context.js +0 -5
- package/src/components/action_execution/render_actionable_component.jsx +0 -29
- package/src/components/action_execution/use_action.js +0 -99
- package/src/components/action_execution/use_execute_action.js +0 -193
- package/src/components/action_execution/use_run_on_mount.js +0 -9
- package/src/components/action_renderer.jsx +0 -125
- package/src/components/callout/callout.js +0 -990
- package/src/components/callout/callout_demo.html +0 -201
- package/src/components/callout/test_dynamic_positioning.html +0 -161
- package/src/components/callout/test_html_document_iframe.html +0 -182
- package/src/components/demos/0_button_demo.html +0 -707
- package/src/components/demos/10_column_reordering_debug.html +0 -277
- package/src/components/demos/11_table_selection_debug.html +0 -432
- package/src/components/demos/1_checkbox_demo.html +0 -754
- package/src/components/demos/2_input_textual_demo.html +0 -286
- package/src/components/demos/3_radio_demo.html +0 -874
- package/src/components/demos/4_select_demo.html +0 -100
- package/src/components/demos/5_list_scrollable_demo.html +0 -153
- package/src/components/demos/6_tablist_demo.html +0 -77
- package/src/components/demos/7_table_selection_demo.html +0 -176
- package/src/components/demos/8_table_fixed_headers_demo.html +0 -584
- package/src/components/demos/9_table_column_drag_demo.html +0 -325
- package/src/components/demos/action/0_button_demo.html +0 -204
- package/src/components/demos/action/10_shortcuts_demo.html +0 -189
- package/src/components/demos/action/11_nested_shortcuts_demo.xhtml +0 -401
- package/src/components/demos/action/1_input_text_demo.html +0 -876
- package/src/components/demos/action/2_form_multiple.html +0 -303
- package/src/components/demos/action/3_details_demo.html +0 -203
- package/src/components/demos/action/4_input_checkbox_demo.html +0 -731
- package/src/components/demos/action/5_input_checkbox_state_demo.html +0 -270
- package/src/components/demos/action/6_checkbox_list_demo.html +0 -341
- package/src/components/demos/action/7_radio_list_demo.html +0 -357
- package/src/components/demos/action/8_editable_demo.html +0 -431
- package/src/components/demos/action/9_link_demo.html +0 -194
- package/src/components/demos/demo.md +0 -0
- package/src/components/demos/route/basic/basic.html +0 -14
- package/src/components/demos/route/basic/basic_route_demo.jsx +0 -224
- package/src/components/demos/route/multi/multi.html +0 -14
- package/src/components/demos/route/multi/multi_route_demo.jsx +0 -277
- package/src/components/demos/ui_transition/0_action_renderer_ui_transition_demo.html +0 -695
- package/src/components/demos/ui_transition/1_nested_ui_transition_demo.html +0 -429
- package/src/components/demos/ui_transition/2_height_transition_test.html +0 -295
- package/src/components/details/details.jsx +0 -245
- package/src/components/details/summary_marker.jsx +0 -141
- package/src/components/edition/editable.jsx +0 -186
- package/src/components/error_boundary_context.js +0 -9
- package/src/components/field/README.md +0 -247
- package/src/components/field/button.jsx +0 -429
- package/src/components/field/checkbox_list.jsx +0 -185
- package/src/components/field/collect_form_element_values.js +0 -82
- package/src/components/field/custom_field.js +0 -106
- package/src/components/field/form.jsx +0 -209
- package/src/components/field/input.jsx +0 -16
- package/src/components/field/input_checkbox.jsx +0 -434
- package/src/components/field/input_radio.jsx +0 -432
- package/src/components/field/input_textual.jsx +0 -389
- package/src/components/field/label.jsx +0 -46
- package/src/components/field/radio_list.jsx +0 -183
- package/src/components/field/select.jsx +0 -256
- package/src/components/field/use_action_events.js +0 -132
- package/src/components/field/use_form_events.js +0 -59
- package/src/components/field/use_ui_state_controller.js +0 -506
- package/src/components/item_tracker/README.md +0 -461
- package/src/components/item_tracker/use_isolated_item_tracker.jsx +0 -209
- package/src/components/item_tracker/use_isolated_item_tracker_demo.html +0 -148
- package/src/components/item_tracker/use_isolated_item_tracker_demo.jsx +0 -460
- package/src/components/item_tracker/use_item_tracker.jsx +0 -143
- package/src/components/item_tracker/use_item_tracker_demo.html +0 -207
- package/src/components/item_tracker/use_item_tracker_demo.jsx +0 -216
- package/src/components/keyboard_shortcuts/active_keyboard_shortcuts.jsx +0 -87
- package/src/components/keyboard_shortcuts/aria_key_shortcuts.js +0 -61
- package/src/components/keyboard_shortcuts/keyboard_key_meta.js +0 -17
- package/src/components/keyboard_shortcuts/keyboard_shortcuts.js +0 -371
- package/src/components/keyboard_shortcuts/os.js +0 -9
- package/src/components/layout/demos/demo_flex.html +0 -638
- package/src/components/layout/demos/demo_layout_style_buttons.html +0 -351
- package/src/components/layout/demos/demo_layout_style_input.html +0 -226
- package/src/components/layout/demos/demo_layout_style_text.html +0 -514
- package/src/components/layout/flex.jsx +0 -109
- package/src/components/layout/layout_context.jsx +0 -3
- package/src/components/layout/spacing.jsx +0 -20
- package/src/components/layout/use_layout_style.js +0 -249
- package/src/components/link/link.jsx +0 -267
- package/src/components/link/link_with_icon.jsx +0 -52
- package/src/components/loader/loader_background.jsx +0 -372
- package/src/components/loader/loading_spinner.jsx +0 -68
- package/src/components/loader/network_speed.js +0 -83
- package/src/components/loader/rectangle_loading.jsx +0 -244
- package/src/components/props_composition/demos/demo_with_props_style.html +0 -81
- package/src/components/props_composition/with_props_class_name.js +0 -37
- package/src/components/props_composition/with_props_style.js +0 -26
- package/src/components/route.jsx +0 -19
- package/src/components/selection/selection.jsx +0 -1583
- package/src/components/svg/font_sized_svg.jsx +0 -59
- package/src/components/svg/icon_and_text.jsx +0 -21
- package/src/components/svg/svg_mask_overlay.jsx +0 -105
- package/src/components/table/drag/table_drag.jsx +0 -506
- package/src/components/table/resize/table_resize.jsx +0 -650
- package/src/components/table/resize/table_size.js +0 -43
- package/src/components/table/selection/table_selection.js +0 -106
- package/src/components/table/selection/table_selection.jsx +0 -203
- package/src/components/table/sticky/sticky_group.js +0 -354
- package/src/components/table/sticky/table_sticky.js +0 -25
- package/src/components/table/sticky/table_sticky.jsx +0 -501
- package/src/components/table/table.jsx +0 -721
- package/src/components/table/table_css.js +0 -211
- package/src/components/table/table_ui.jsx +0 -49
- package/src/components/table/use_cells_and_columns.js +0 -90
- package/src/components/table/use_object_array_to_cells.js +0 -46
- package/src/components/table/z_indexes.js +0 -23
- package/src/components/tablist/tablist.jsx +0 -99
- package/src/components/text/demos/demo_text_and_icon.html +0 -421
- package/src/components/text/overflow.jsx +0 -15
- package/src/components/text/text.jsx +0 -83
- package/src/components/text/text_and_count.jsx +0 -28
- package/src/components/ui_transition.jsx +0 -128
- package/src/components/use_auto_focus.js +0 -94
- package/src/components/use_batch_during_render.js +0 -33
- package/src/components/use_debounce_true.js +0 -31
- package/src/components/use_dependencies_diff.js +0 -35
- package/src/components/use_focus_group.js +0 -20
- package/src/components/use_initial_value.js +0 -78
- package/src/components/use_is_visited.js +0 -19
- package/src/components/use_ref_array.js +0 -38
- package/src/components/use_signal_sync.js +0 -50
- package/src/components/use_stable_callback.js +0 -68
- package/src/components/use_state_array.js +0 -47
- package/src/docs/actions.md +0 -250
- package/src/docs/demos/resource/action_status.jsx +0 -42
- package/src/docs/demos/resource/demo.md +0 -1
- package/src/docs/demos/resource/resource_demo_0.html +0 -84
- package/src/docs/demos/resource/resource_demo_10_post_gc.html +0 -364
- package/src/docs/demos/resource/resource_demo_11_describe_many.html +0 -362
- package/src/docs/demos/resource/resource_demo_2.html +0 -173
- package/src/docs/demos/resource/resource_demo_3_filtered_users.html +0 -415
- package/src/docs/demos/resource/resource_demo_4_details.html +0 -284
- package/src/docs/demos/resource/resource_demo_5_renderer_lazy.html +0 -115
- package/src/docs/demos/resource/resource_demo_6_gc.html +0 -217
- package/src/docs/demos/resource/resource_demo_7_child_gc.html +0 -240
- package/src/docs/demos/resource/resource_demo_8_proxy_gc.html +0 -319
- package/src/docs/demos/resource/resource_demo_9_describe_one.html +0 -472
- package/src/docs/demos/resource/tata.jsx +0 -3
- package/src/docs/demos/resource/toto.jsx +0 -3
- package/src/docs/demos/user_nav/user_nav.html +0 -12
- package/src/docs/demos/user_nav/user_nav.jsx +0 -330
- package/src/docs/resource_dependencies.md +0 -103
- package/src/docs/resource_with_params.md +0 -80
- package/src/navi_css_vars.js +0 -14
- package/src/notes.md +0 -34
- package/src/route/route.js +0 -596
- package/src/route/route.xtest.html +0 -228
- package/src/store/array_signal_store.js +0 -537
- package/src/store/local_storage_signal.js +0 -17
- package/src/store/resource_graph.js +0 -1304
- package/src/store/tests/resource_graph_autoreload_demo.html +0 -12
- package/src/store/tests/resource_graph_autoreload_demo.jsx +0 -964
- package/src/store/tests/resource_graph_dependencies.test_manual.js +0 -95
- package/src/store/value_in_local_storage.js +0 -187
- package/src/symbol_object_signal.js +0 -1
- package/src/use_action_data.js +0 -10
- package/src/use_action_status.js +0 -47
- package/src/utils/add_many_event_listeners.js +0 -15
- package/src/utils/array_add_remove.js +0 -61
- package/src/utils/array_signal.js +0 -15
- package/src/utils/compare_two_js_values.js +0 -172
- package/src/utils/execute_with_cleanup.js +0 -21
- package/src/utils/get_caller_info.js +0 -85
- package/src/utils/is_signal.js +0 -20
- package/src/utils/js_value_weak_map.js +0 -162
- package/src/utils/js_value_weak_map_demo.html +0 -690
- package/src/utils/merge_two_js_values.js +0 -53
- package/src/utils/stringify_for_display.js +0 -131
- package/src/utils/weak_effect.js +0 -48
- package/src/validation/constraints/confirm_constraint.js +0 -14
- package/src/validation/constraints/create_unique_value_constraint.js +0 -27
- package/src/validation/constraints/native_constraints.js +0 -338
- package/src/validation/constraints/readonly_constraint.js +0 -41
- package/src/validation/constraints/same_as_constraint.js +0 -42
- package/src/validation/constraints/single_space_constraint.js +0 -13
- package/src/validation/custom_constraint_validation.js +0 -793
- package/src/validation/custom_message.js +0 -18
- package/src/validation/demos/browser_style.png +0 -0
- package/src/validation/demos/demo_same_as_constraint.html +0 -259
- package/src/validation/demos/form_validation_demo.html +0 -142
- package/src/validation/demos/form_validation_demo_preact.html +0 -87
- package/src/validation/demos/form_validation_native_popover_demo.html +0 -168
- package/src/validation/demos/form_validation_vs_native_demo.html +0 -172
- package/src/validation/hooks/use_constraints.js +0 -23
- package/src/validation/hooks/use_custom_validation_ref.js +0 -73
- package/src/validation/hooks/use_validation_message.js +0 -19
- package/src/validation/input_change_effect.js +0 -106
|
@@ -1,650 +0,0 @@
|
|
|
1
|
-
import { createDragToMoveGestureController } from "@jsenv/dom";
|
|
2
|
-
import { forwardRef } from "preact/compat";
|
|
3
|
-
import { useContext } from "preact/hooks";
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
Z_INDEX_RESIZER_BACKDROP,
|
|
7
|
-
Z_INDEX_RESIZER_HANDLE,
|
|
8
|
-
} from "../z_indexes.js";
|
|
9
|
-
import { TableSizeContext } from "./table_size.js";
|
|
10
|
-
|
|
11
|
-
const ROW_MIN_HEIGHT = 30;
|
|
12
|
-
const ROW_MAX_HEIGHT = 100;
|
|
13
|
-
const COLUMN_MIN_WIDTH = 50;
|
|
14
|
-
const COLUMN_MAX_WIDTH = 500;
|
|
15
|
-
|
|
16
|
-
import.meta.css = /* css */ `
|
|
17
|
-
body {
|
|
18
|
-
--table-resizer-handle-color: #063b7c;
|
|
19
|
-
--table-resizer-color: #387ec9;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
.navi_table_cell {
|
|
23
|
-
/* ensure table cell padding does not count when we say column = 50px we want a column of 50px, not 50px + paddings */
|
|
24
|
-
box-sizing: border-box;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
.navi_table_cell_resize_handle {
|
|
28
|
-
position: absolute;
|
|
29
|
-
/* background: orange; */
|
|
30
|
-
/* opacity: 0.5; */
|
|
31
|
-
z-index: ${Z_INDEX_RESIZER_HANDLE};
|
|
32
|
-
}
|
|
33
|
-
.navi_table_cell_resize_handle[data-left],
|
|
34
|
-
.navi_table_cell_resize_handle[data-right] {
|
|
35
|
-
cursor: ew-resize;
|
|
36
|
-
top: 0;
|
|
37
|
-
bottom: 0;
|
|
38
|
-
width: 8px;
|
|
39
|
-
}
|
|
40
|
-
.navi_table_cell_resize_handle[data-left] {
|
|
41
|
-
left: 0;
|
|
42
|
-
}
|
|
43
|
-
.navi_table_cell_resize_handle[data-right] {
|
|
44
|
-
right: 0;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
.navi_table_cell_resize_handle[data-top],
|
|
48
|
-
.navi_table_cell_resize_handle[data-bottom] {
|
|
49
|
-
cursor: ns-resize;
|
|
50
|
-
left: 0;
|
|
51
|
-
right: 0;
|
|
52
|
-
height: 8px;
|
|
53
|
-
}
|
|
54
|
-
.navi_table_cell_resize_handle[data-top] {
|
|
55
|
-
top: 0;
|
|
56
|
-
}
|
|
57
|
-
.navi_table_cell_resize_handle[data-bottom] {
|
|
58
|
-
bottom: 0;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
.navi_table_column_resizer {
|
|
62
|
-
pointer-events: none;
|
|
63
|
-
position: absolute;
|
|
64
|
-
left: var(--table-column-resizer-left);
|
|
65
|
-
width: 10px;
|
|
66
|
-
top: var(--table-visual-top);
|
|
67
|
-
height: var(--table-visual-height);
|
|
68
|
-
opacity: 0;
|
|
69
|
-
}
|
|
70
|
-
.navi_table_column_resize_handle {
|
|
71
|
-
position: absolute;
|
|
72
|
-
height: 100%;
|
|
73
|
-
top: 50%;
|
|
74
|
-
transform: translateY(-50%);
|
|
75
|
-
border-radius: 15px;
|
|
76
|
-
background: var(--table-resizer-handle-color);
|
|
77
|
-
/* opacity: 0.5; */
|
|
78
|
-
width: 5px;
|
|
79
|
-
height: 26px;
|
|
80
|
-
max-height: 80%;
|
|
81
|
-
}
|
|
82
|
-
.navi_table_column_resize_handle[data-left] {
|
|
83
|
-
left: 2px;
|
|
84
|
-
}
|
|
85
|
-
.navi_table_column_resize_handle[data-right] {
|
|
86
|
-
right: 3px;
|
|
87
|
-
}
|
|
88
|
-
.navi_table_column_resize_handle_container {
|
|
89
|
-
position: absolute;
|
|
90
|
-
top: 0;
|
|
91
|
-
left: -10px;
|
|
92
|
-
right: 0;
|
|
93
|
-
height: var(--table-cell-height);
|
|
94
|
-
}
|
|
95
|
-
.navi_table_column_resizer_line {
|
|
96
|
-
position: absolute;
|
|
97
|
-
top: 0;
|
|
98
|
-
bottom: 0;
|
|
99
|
-
width: 5px;
|
|
100
|
-
left: -3px;
|
|
101
|
-
background: var(--table-resizer-color);
|
|
102
|
-
opacity: 0;
|
|
103
|
-
transition: opacity 0.1s ease;
|
|
104
|
-
}
|
|
105
|
-
.navi_table_column_resizer[data-hover],
|
|
106
|
-
.navi_table_column_resizer[data-grabbed] {
|
|
107
|
-
opacity: 1;
|
|
108
|
-
}
|
|
109
|
-
.navi_table_column_resizer[data-hover] {
|
|
110
|
-
transition-delay: 150ms; /* Delay before showing hover effect */
|
|
111
|
-
}
|
|
112
|
-
.navi_table_column_resizer[data-grabbed] .navi_table_column_resizer_line {
|
|
113
|
-
opacity: 1;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
.navi_table_row_resizer {
|
|
117
|
-
pointer-events: none;
|
|
118
|
-
position: absolute;
|
|
119
|
-
left: var(--table-visual-left);
|
|
120
|
-
width: var(--table-visual-width);
|
|
121
|
-
top: var(--table-row-resizer-top);
|
|
122
|
-
height: 10px;
|
|
123
|
-
opacity: 0;
|
|
124
|
-
}
|
|
125
|
-
.navi_table_row_resize_handle {
|
|
126
|
-
position: absolute;
|
|
127
|
-
width: 100%;
|
|
128
|
-
left: 50%;
|
|
129
|
-
transform: translateX(-50%);
|
|
130
|
-
border-radius: 15px;
|
|
131
|
-
background: var(--table-resizer-handle-color);
|
|
132
|
-
/* opacity: 0.5; */
|
|
133
|
-
width: 26px;
|
|
134
|
-
height: 5px;
|
|
135
|
-
max-width: 80%;
|
|
136
|
-
}
|
|
137
|
-
.navi_table_row_resize_handle[data-top] {
|
|
138
|
-
top: 2px;
|
|
139
|
-
}
|
|
140
|
-
.navi_table_row_resize_handle[data-bottom] {
|
|
141
|
-
bottom: 3px;
|
|
142
|
-
}
|
|
143
|
-
.navi_table_row_resize_handle_container {
|
|
144
|
-
position: absolute;
|
|
145
|
-
left: 0;
|
|
146
|
-
top: -10px;
|
|
147
|
-
bottom: 0;
|
|
148
|
-
width: var(--table-cell-width);
|
|
149
|
-
}
|
|
150
|
-
.navi_table_row_resizer_line {
|
|
151
|
-
position: absolute;
|
|
152
|
-
left: 0;
|
|
153
|
-
right: 0;
|
|
154
|
-
height: 5px;
|
|
155
|
-
top: -3px;
|
|
156
|
-
background: var(--table-resizer-color);
|
|
157
|
-
opacity: 0;
|
|
158
|
-
transition: opacity 0.1s ease;
|
|
159
|
-
}
|
|
160
|
-
.navi_table_row_resizer[data-hover],
|
|
161
|
-
.navi_table_row_resizer[data-grabbed] {
|
|
162
|
-
opacity: 1;
|
|
163
|
-
}
|
|
164
|
-
.navi_table_row_resizer[data-hover] {
|
|
165
|
-
transition-delay: 150ms; /* Delay before showing hover effect */
|
|
166
|
-
}
|
|
167
|
-
.navi_table_row_resizer[data-grabbed] .navi_table_row_resizer_line {
|
|
168
|
-
opacity: 1;
|
|
169
|
-
}
|
|
170
|
-
`;
|
|
171
|
-
|
|
172
|
-
// Column resize components
|
|
173
|
-
export const TableColumnResizer = forwardRef((props, ref) => {
|
|
174
|
-
return (
|
|
175
|
-
<div ref={ref} className="navi_table_column_resizer">
|
|
176
|
-
<div className="navi_table_column_resize_handle_container">
|
|
177
|
-
<div className="navi_table_column_resize_handle" data-left=""></div>
|
|
178
|
-
<div className="navi_table_column_resize_handle" data-right=""></div>
|
|
179
|
-
</div>
|
|
180
|
-
<div className="navi_table_column_resizer_line"></div>
|
|
181
|
-
</div>
|
|
182
|
-
);
|
|
183
|
-
});
|
|
184
|
-
export const TableCellColumnResizeHandles = ({
|
|
185
|
-
columnIndex,
|
|
186
|
-
columnMinWidth,
|
|
187
|
-
columnMaxWidth,
|
|
188
|
-
}) => {
|
|
189
|
-
const { onColumnSizeChange } = useContext(TableSizeContext);
|
|
190
|
-
const canResize = Boolean(onColumnSizeChange);
|
|
191
|
-
|
|
192
|
-
return (
|
|
193
|
-
<>
|
|
194
|
-
{canResize && columnIndex > 0 && (
|
|
195
|
-
<TableColumnLeftResizeHandle
|
|
196
|
-
onRelease={(width) => onColumnSizeChange(width, columnIndex - 1)}
|
|
197
|
-
columnMinWidth={columnMinWidth}
|
|
198
|
-
columnMaxWidth={columnMaxWidth}
|
|
199
|
-
/>
|
|
200
|
-
)}
|
|
201
|
-
{canResize && (
|
|
202
|
-
<TableColumnRightResizeHandle
|
|
203
|
-
onRelease={(width) => onColumnSizeChange(width, columnIndex)}
|
|
204
|
-
columnMinWidth={columnMinWidth}
|
|
205
|
-
columnMaxWidth={columnMaxWidth}
|
|
206
|
-
/>
|
|
207
|
-
)}
|
|
208
|
-
</>
|
|
209
|
-
);
|
|
210
|
-
};
|
|
211
|
-
const TableColumnLeftResizeHandle = ({
|
|
212
|
-
columnMinWidth,
|
|
213
|
-
columnMaxWidth,
|
|
214
|
-
onGrab,
|
|
215
|
-
onDrag,
|
|
216
|
-
onRelease,
|
|
217
|
-
}) => {
|
|
218
|
-
const { columnResizerRef } = useContext(TableSizeContext);
|
|
219
|
-
|
|
220
|
-
return (
|
|
221
|
-
<div
|
|
222
|
-
className="navi_table_cell_resize_handle"
|
|
223
|
-
data-left=""
|
|
224
|
-
onPointerDown={(e) => {
|
|
225
|
-
if (e.button !== 0) {
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
e.preventDefault(); // prevent text selection
|
|
229
|
-
e.stopPropagation(); // prevent drag column or drag sticky frontier
|
|
230
|
-
initResizeTableColumnViaPointer(e, {
|
|
231
|
-
columnResizer: columnResizerRef.current,
|
|
232
|
-
columnMinWidth,
|
|
233
|
-
columnMaxWidth,
|
|
234
|
-
onGrab,
|
|
235
|
-
onDrag,
|
|
236
|
-
onRelease,
|
|
237
|
-
isLeft: true,
|
|
238
|
-
});
|
|
239
|
-
}}
|
|
240
|
-
onMouseEnter={(e) => {
|
|
241
|
-
onMouseEnterLeftResizeHandle(e, columnResizerRef.current);
|
|
242
|
-
}}
|
|
243
|
-
onMouseLeave={(e) => {
|
|
244
|
-
onMouseLeaveLeftResizeHandle(e, columnResizerRef.current);
|
|
245
|
-
}}
|
|
246
|
-
></div>
|
|
247
|
-
);
|
|
248
|
-
};
|
|
249
|
-
const TableColumnRightResizeHandle = ({
|
|
250
|
-
columnMinWidth,
|
|
251
|
-
columnMaxWidth,
|
|
252
|
-
onGrab,
|
|
253
|
-
onDrag,
|
|
254
|
-
onRelease,
|
|
255
|
-
}) => {
|
|
256
|
-
const { columnResizerRef } = useContext(TableSizeContext);
|
|
257
|
-
|
|
258
|
-
return (
|
|
259
|
-
<div
|
|
260
|
-
className="navi_table_cell_resize_handle"
|
|
261
|
-
data-right=""
|
|
262
|
-
onPointerDown={(e) => {
|
|
263
|
-
if (e.button !== 0) {
|
|
264
|
-
return;
|
|
265
|
-
}
|
|
266
|
-
e.preventDefault(); // prevent text selection
|
|
267
|
-
e.stopPropagation(); // prevent drag column or drag sticky frontier
|
|
268
|
-
initResizeTableColumnViaPointer(e, {
|
|
269
|
-
columnResizer: columnResizerRef.current,
|
|
270
|
-
columnMinWidth,
|
|
271
|
-
columnMaxWidth,
|
|
272
|
-
onGrab,
|
|
273
|
-
onDrag,
|
|
274
|
-
onRelease,
|
|
275
|
-
});
|
|
276
|
-
}}
|
|
277
|
-
onMouseEnter={(e) => {
|
|
278
|
-
onMouseEnterRightResizeHandle(e, columnResizerRef.current);
|
|
279
|
-
}}
|
|
280
|
-
onMouseLeave={(e) => {
|
|
281
|
-
onMouseLeaveRightResizeHandle(e, columnResizerRef.current);
|
|
282
|
-
}}
|
|
283
|
-
></div>
|
|
284
|
-
);
|
|
285
|
-
};
|
|
286
|
-
|
|
287
|
-
const updateTableColumnResizerPosition = (columnCell, columnResizer) => {
|
|
288
|
-
if (columnResizer.hasAttribute("data-grabbed")) {
|
|
289
|
-
// ensure mouseenter/mouseleave while resizing cannot interfere
|
|
290
|
-
// while resizing (would move the resizer on other columns)
|
|
291
|
-
return;
|
|
292
|
-
}
|
|
293
|
-
const columnCellRect = columnCell.getBoundingClientRect();
|
|
294
|
-
const columnRight = columnCellRect.right;
|
|
295
|
-
const cellHeight = columnCellRect.height;
|
|
296
|
-
columnResizer.style.setProperty(
|
|
297
|
-
"--table-column-resizer-left",
|
|
298
|
-
`${columnRight}px`,
|
|
299
|
-
);
|
|
300
|
-
columnResizer.style.setProperty("--table-cell-height", `${cellHeight}px`);
|
|
301
|
-
columnResizer.setAttribute("data-hover", "");
|
|
302
|
-
};
|
|
303
|
-
// Row resize helper functions
|
|
304
|
-
const updateTableRowResizerPosition = (rowCell, rowResizer) => {
|
|
305
|
-
if (rowResizer.hasAttribute("data-grabbed")) {
|
|
306
|
-
// ensure mouseenter/mouseleave while resizing cannot interfere
|
|
307
|
-
// while resizing (would move the resizer on other rows)
|
|
308
|
-
return;
|
|
309
|
-
}
|
|
310
|
-
const rowCellRect = rowCell.getBoundingClientRect();
|
|
311
|
-
const rowBottom = rowCellRect.bottom;
|
|
312
|
-
const cellWidth = rowCellRect.width;
|
|
313
|
-
rowResizer.style.setProperty("--table-row-resizer-top", `${rowBottom}px`);
|
|
314
|
-
rowResizer.style.setProperty("--table-cell-width", `${cellWidth}px`);
|
|
315
|
-
rowResizer.setAttribute("data-hover", "");
|
|
316
|
-
};
|
|
317
|
-
|
|
318
|
-
const onMouseEnterLeftResizeHandle = (e, columnResizer) => {
|
|
319
|
-
const previousCell =
|
|
320
|
-
e.target.closest(".navi_table_cell").previousElementSibling;
|
|
321
|
-
updateTableColumnResizerPosition(previousCell, columnResizer);
|
|
322
|
-
};
|
|
323
|
-
const onMouseEnterRightResizeHandle = (e, columnResizer) => {
|
|
324
|
-
const cell = e.target.closest(".navi_table_cell");
|
|
325
|
-
updateTableColumnResizerPosition(cell, columnResizer);
|
|
326
|
-
};
|
|
327
|
-
const onMouseLeaveLeftResizeHandle = (e, columnResizer) => {
|
|
328
|
-
columnResizer.removeAttribute("data-hover");
|
|
329
|
-
};
|
|
330
|
-
const onMouseLeaveRightResizeHandle = (e, columnResizer) => {
|
|
331
|
-
columnResizer.removeAttribute("data-hover");
|
|
332
|
-
};
|
|
333
|
-
// Generic function to handle table cell resize for both axes
|
|
334
|
-
const initResizeViaPointer = (
|
|
335
|
-
pointerdownEvent,
|
|
336
|
-
{
|
|
337
|
-
tableCell,
|
|
338
|
-
resizer,
|
|
339
|
-
minSize,
|
|
340
|
-
maxSize,
|
|
341
|
-
onGrab,
|
|
342
|
-
onDrag,
|
|
343
|
-
onRelease,
|
|
344
|
-
// Axis-specific configuration
|
|
345
|
-
axis, // 'x' or 'y'
|
|
346
|
-
},
|
|
347
|
-
) => {
|
|
348
|
-
const updateResizerPosition =
|
|
349
|
-
axis === "x"
|
|
350
|
-
? updateTableColumnResizerPosition
|
|
351
|
-
: updateTableRowResizerPosition;
|
|
352
|
-
|
|
353
|
-
const tableCellRect = tableCell.getBoundingClientRect();
|
|
354
|
-
// Calculate size and position based on axis
|
|
355
|
-
const currentSize = axis === "x" ? tableCellRect.width : tableCellRect.height;
|
|
356
|
-
|
|
357
|
-
// Convert constraint bounds to scroll container coordinates
|
|
358
|
-
// (Same as boundingClientRect + document scrolls but within the scroll container)
|
|
359
|
-
const areaConstraint = (() => {
|
|
360
|
-
const defaultMinSize = axis === "x" ? COLUMN_MIN_WIDTH : ROW_MIN_HEIGHT;
|
|
361
|
-
const defaultMaxSize = axis === "x" ? COLUMN_MAX_WIDTH : ROW_MAX_HEIGHT;
|
|
362
|
-
const minCellSize =
|
|
363
|
-
typeof minSize === "number" && minSize > defaultMinSize
|
|
364
|
-
? minSize
|
|
365
|
-
: defaultMinSize;
|
|
366
|
-
const maxCellSize =
|
|
367
|
-
typeof maxSize === "number" && maxSize < defaultMaxSize
|
|
368
|
-
? maxSize
|
|
369
|
-
: defaultMaxSize;
|
|
370
|
-
const isSticky =
|
|
371
|
-
axis === "x"
|
|
372
|
-
? tableCell.hasAttribute("data-sticky-left")
|
|
373
|
-
: tableCell.hasAttribute("data-sticky-top");
|
|
374
|
-
|
|
375
|
-
if (axis === "x") {
|
|
376
|
-
return {
|
|
377
|
-
left: ({ leftAtGrab, scrollport }) => {
|
|
378
|
-
// to get the cell position at grab we need to remove cell size because
|
|
379
|
-
// we place the resizer at the right of the cell
|
|
380
|
-
const cellLeftAtGrab = leftAtGrab - currentSize;
|
|
381
|
-
const minLeft = cellLeftAtGrab + minCellSize;
|
|
382
|
-
if (isSticky && minLeft < scrollport.left) {
|
|
383
|
-
return scrollport.left;
|
|
384
|
-
}
|
|
385
|
-
return minLeft;
|
|
386
|
-
},
|
|
387
|
-
right: ({ leftAtGrab, scrollport }) => {
|
|
388
|
-
const cellLeftAtGrab = leftAtGrab - currentSize;
|
|
389
|
-
const maxRight = cellLeftAtGrab + maxCellSize;
|
|
390
|
-
if (isSticky && maxRight > scrollport.right) {
|
|
391
|
-
return scrollport.right;
|
|
392
|
-
}
|
|
393
|
-
return maxRight;
|
|
394
|
-
},
|
|
395
|
-
};
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
return {
|
|
399
|
-
top: ({ topAtGrab, scrollport }) => {
|
|
400
|
-
const cellTopAtGrab = topAtGrab - currentSize;
|
|
401
|
-
const minTop = cellTopAtGrab + minCellSize;
|
|
402
|
-
if (isSticky && minTop < scrollport.top) {
|
|
403
|
-
return scrollport.top;
|
|
404
|
-
}
|
|
405
|
-
return minTop;
|
|
406
|
-
},
|
|
407
|
-
bottom: ({ topAtGrab, scrollport }) => {
|
|
408
|
-
const cellTopAtGrab = topAtGrab - currentSize;
|
|
409
|
-
const maxBottom = cellTopAtGrab + maxCellSize;
|
|
410
|
-
if (isSticky && maxBottom > scrollport.bottom) {
|
|
411
|
-
return scrollport.bottom;
|
|
412
|
-
}
|
|
413
|
-
return maxBottom;
|
|
414
|
-
},
|
|
415
|
-
};
|
|
416
|
-
})();
|
|
417
|
-
|
|
418
|
-
// Build drag gesture configuration based on axis
|
|
419
|
-
const gestureName = axis === "x" ? "resize-column" : "resize-row";
|
|
420
|
-
const direction = axis === "x" ? { x: true } : { y: true };
|
|
421
|
-
|
|
422
|
-
updateResizerPosition(tableCell, resizer);
|
|
423
|
-
const dragToMoveGestureController = createDragToMoveGestureController({
|
|
424
|
-
name: gestureName,
|
|
425
|
-
direction,
|
|
426
|
-
backdropZIndex: Z_INDEX_RESIZER_BACKDROP,
|
|
427
|
-
areaConstraint,
|
|
428
|
-
autoScrollAreaPadding: 20,
|
|
429
|
-
onGrab: () => {
|
|
430
|
-
onGrab?.();
|
|
431
|
-
},
|
|
432
|
-
onDrag,
|
|
433
|
-
resetPositionAfterRelease: true,
|
|
434
|
-
onRelease: (gestureInfo) => {
|
|
435
|
-
const sizeChange =
|
|
436
|
-
axis === "x" ? gestureInfo.layout.xDelta : gestureInfo.layout.yDelta;
|
|
437
|
-
const newSize = currentSize + sizeChange;
|
|
438
|
-
onRelease(newSize, currentSize);
|
|
439
|
-
resizer.removeAttribute("data-hover");
|
|
440
|
-
},
|
|
441
|
-
});
|
|
442
|
-
dragToMoveGestureController.grabViaPointer(pointerdownEvent, {
|
|
443
|
-
element: resizer,
|
|
444
|
-
referenceElement: tableCell,
|
|
445
|
-
});
|
|
446
|
-
};
|
|
447
|
-
|
|
448
|
-
const initResizeTableColumnViaPointer = (
|
|
449
|
-
pointerdownEvent,
|
|
450
|
-
{
|
|
451
|
-
columnResizer,
|
|
452
|
-
columnMinWidth,
|
|
453
|
-
columnMaxWidth,
|
|
454
|
-
onGrab,
|
|
455
|
-
onDrag,
|
|
456
|
-
onRelease,
|
|
457
|
-
isLeft,
|
|
458
|
-
},
|
|
459
|
-
) => {
|
|
460
|
-
let tableCell = pointerdownEvent.target.closest(".navi_table_cell");
|
|
461
|
-
if (isLeft) {
|
|
462
|
-
tableCell = tableCell.previousElementSibling;
|
|
463
|
-
}
|
|
464
|
-
initResizeViaPointer(pointerdownEvent, {
|
|
465
|
-
tableCell,
|
|
466
|
-
resizer: columnResizer,
|
|
467
|
-
minSize: columnMinWidth,
|
|
468
|
-
maxSize: columnMaxWidth,
|
|
469
|
-
onGrab,
|
|
470
|
-
onDrag,
|
|
471
|
-
onRelease,
|
|
472
|
-
axis: "x",
|
|
473
|
-
});
|
|
474
|
-
};
|
|
475
|
-
const initResizeTableRowViaPointer = (
|
|
476
|
-
pointerdownEvent,
|
|
477
|
-
{ rowResizer, rowMinHeight, rowMaxHeight, onGrab, onDrag, onRelease, isTop },
|
|
478
|
-
) => {
|
|
479
|
-
let tableCell = pointerdownEvent.target.closest(".navi_table_cell");
|
|
480
|
-
if (isTop) {
|
|
481
|
-
const tableRow = tableCell.closest(".navi_tr");
|
|
482
|
-
const previousTr = findPreviousTableRow(tableRow);
|
|
483
|
-
if (!previousTr) {
|
|
484
|
-
return;
|
|
485
|
-
}
|
|
486
|
-
// Select the same table cell (same column index) in previous row
|
|
487
|
-
const columnIndex = Array.from(tableRow.children).indexOf(tableCell);
|
|
488
|
-
tableCell = previousTr.children[columnIndex];
|
|
489
|
-
}
|
|
490
|
-
initResizeViaPointer(pointerdownEvent, {
|
|
491
|
-
tableCell,
|
|
492
|
-
resizer: rowResizer,
|
|
493
|
-
minSize: rowMinHeight,
|
|
494
|
-
maxSize: rowMaxHeight,
|
|
495
|
-
onGrab,
|
|
496
|
-
onDrag,
|
|
497
|
-
onRelease,
|
|
498
|
-
axis: "y",
|
|
499
|
-
});
|
|
500
|
-
};
|
|
501
|
-
|
|
502
|
-
// Row resize components
|
|
503
|
-
export const TableRowResizer = forwardRef((props, ref) => {
|
|
504
|
-
return (
|
|
505
|
-
<div ref={ref} className="navi_table_row_resizer">
|
|
506
|
-
<div className="navi_table_row_resize_handle_container">
|
|
507
|
-
<div className="navi_table_row_resize_handle" data-top=""></div>
|
|
508
|
-
<div className="navi_table_row_resize_handle" data-bottom=""></div>
|
|
509
|
-
</div>
|
|
510
|
-
<div className="navi_table_row_resizer_line"></div>
|
|
511
|
-
</div>
|
|
512
|
-
);
|
|
513
|
-
});
|
|
514
|
-
export const TableCellRowResizeHandles = ({
|
|
515
|
-
rowIndex,
|
|
516
|
-
rowMinHeight,
|
|
517
|
-
rowMaxHeight,
|
|
518
|
-
}) => {
|
|
519
|
-
const { onRowSizeChange } = useContext(TableSizeContext);
|
|
520
|
-
const canResize = Boolean(onRowSizeChange);
|
|
521
|
-
|
|
522
|
-
return (
|
|
523
|
-
<>
|
|
524
|
-
{canResize && rowIndex > 0 && (
|
|
525
|
-
<TableRowTopResizeHandle
|
|
526
|
-
onRelease={(width) => onRowSizeChange(width, rowIndex - 1)}
|
|
527
|
-
rowMinHeight={rowMinHeight}
|
|
528
|
-
rowMaxHeight={rowMaxHeight}
|
|
529
|
-
/>
|
|
530
|
-
)}
|
|
531
|
-
{canResize && (
|
|
532
|
-
<TableRowBottomResizeHandle
|
|
533
|
-
onRelease={(width) => onRowSizeChange(width, rowIndex)}
|
|
534
|
-
rowMinHeight={rowMinHeight}
|
|
535
|
-
rowMaxHeight={rowMaxHeight}
|
|
536
|
-
/>
|
|
537
|
-
)}
|
|
538
|
-
</>
|
|
539
|
-
);
|
|
540
|
-
};
|
|
541
|
-
const TableRowTopResizeHandle = ({
|
|
542
|
-
rowMinHeight,
|
|
543
|
-
rowMaxHeight,
|
|
544
|
-
onGrab,
|
|
545
|
-
onDrag,
|
|
546
|
-
onRelease,
|
|
547
|
-
}) => {
|
|
548
|
-
const { rowResizerRef } = useContext(TableSizeContext);
|
|
549
|
-
|
|
550
|
-
return (
|
|
551
|
-
<div
|
|
552
|
-
className="navi_table_cell_resize_handle"
|
|
553
|
-
data-top=""
|
|
554
|
-
onPointerDown={(e) => {
|
|
555
|
-
if (e.button !== 0) {
|
|
556
|
-
return;
|
|
557
|
-
}
|
|
558
|
-
e.preventDefault(); // prevent text selection
|
|
559
|
-
e.stopPropagation(); // prevent drag row
|
|
560
|
-
initResizeTableRowViaPointer(e, {
|
|
561
|
-
rowResizer: rowResizerRef.current,
|
|
562
|
-
rowMinHeight,
|
|
563
|
-
rowMaxHeight,
|
|
564
|
-
onGrab,
|
|
565
|
-
onDrag,
|
|
566
|
-
onRelease,
|
|
567
|
-
isTop: true,
|
|
568
|
-
});
|
|
569
|
-
}}
|
|
570
|
-
onMouseEnter={(e) => {
|
|
571
|
-
onMouseEnterTopResizeHandle(e, rowResizerRef.current);
|
|
572
|
-
}}
|
|
573
|
-
onMouseLeave={(e) => {
|
|
574
|
-
onMouseLeaveTopResizeHandle(e, rowResizerRef.current);
|
|
575
|
-
}}
|
|
576
|
-
></div>
|
|
577
|
-
);
|
|
578
|
-
};
|
|
579
|
-
const TableRowBottomResizeHandle = ({
|
|
580
|
-
rowMinHeight,
|
|
581
|
-
rowMaxHeight,
|
|
582
|
-
onGrab,
|
|
583
|
-
onDrag,
|
|
584
|
-
onRelease,
|
|
585
|
-
}) => {
|
|
586
|
-
const { rowResizerRef } = useContext(TableSizeContext);
|
|
587
|
-
|
|
588
|
-
return (
|
|
589
|
-
<div
|
|
590
|
-
className="navi_table_cell_resize_handle"
|
|
591
|
-
data-bottom=""
|
|
592
|
-
onPointerDown={(e) => {
|
|
593
|
-
if (e.button !== 0) {
|
|
594
|
-
return;
|
|
595
|
-
}
|
|
596
|
-
e.preventDefault(); // prevent text selection
|
|
597
|
-
e.stopPropagation(); // prevent drag row
|
|
598
|
-
initResizeTableRowViaPointer(e, {
|
|
599
|
-
rowResizer: rowResizerRef.current,
|
|
600
|
-
rowMinHeight,
|
|
601
|
-
rowMaxHeight,
|
|
602
|
-
onGrab,
|
|
603
|
-
onDrag,
|
|
604
|
-
onRelease,
|
|
605
|
-
});
|
|
606
|
-
}}
|
|
607
|
-
onMouseEnter={(e) => {
|
|
608
|
-
onMouseEnterBottomResizeHandle(e, rowResizerRef.current);
|
|
609
|
-
}}
|
|
610
|
-
onMouseLeave={(e) => {
|
|
611
|
-
onMouseLeaveBottomResizeHandle(e, rowResizerRef.current);
|
|
612
|
-
}}
|
|
613
|
-
></div>
|
|
614
|
-
);
|
|
615
|
-
};
|
|
616
|
-
|
|
617
|
-
const onMouseEnterTopResizeHandle = (e, rowResize) => {
|
|
618
|
-
const currentRow = e.target.closest(".navi_tr");
|
|
619
|
-
const previousRow = findPreviousTableRow(currentRow);
|
|
620
|
-
if (previousRow) {
|
|
621
|
-
updateTableRowResizerPosition(
|
|
622
|
-
previousRow.querySelector(".navi_table_cell"),
|
|
623
|
-
rowResize,
|
|
624
|
-
);
|
|
625
|
-
}
|
|
626
|
-
};
|
|
627
|
-
const onMouseEnterBottomResizeHandle = (e, rowResizer) => {
|
|
628
|
-
const rowCell = e.target.closest(".navi_table_cell");
|
|
629
|
-
updateTableRowResizerPosition(rowCell, rowResizer);
|
|
630
|
-
};
|
|
631
|
-
const onMouseLeaveTopResizeHandle = (e, rowResizer) => {
|
|
632
|
-
rowResizer.removeAttribute("data-hover");
|
|
633
|
-
};
|
|
634
|
-
const onMouseLeaveBottomResizeHandle = (e, rowResizer) => {
|
|
635
|
-
rowResizer.removeAttribute("data-hover");
|
|
636
|
-
};
|
|
637
|
-
|
|
638
|
-
const findPreviousTableRow = (currentRow) => {
|
|
639
|
-
// First, try to find previous sibling within the same table section
|
|
640
|
-
const previousSibling = currentRow.previousElementSibling;
|
|
641
|
-
if (previousSibling) {
|
|
642
|
-
return previousSibling;
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
// Otherwise, get all rows in the table and find the previous one
|
|
646
|
-
const table = currentRow.closest(".navi_table");
|
|
647
|
-
const allRows = Array.from(table.querySelectorAll(".navi_tr"));
|
|
648
|
-
const currentIndex = allRows.indexOf(currentRow);
|
|
649
|
-
return currentIndex > 0 ? allRows[currentIndex - 1] : null;
|
|
650
|
-
};
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { createContext } from "preact";
|
|
2
|
-
import { useMemo } from "preact/hooks";
|
|
3
|
-
|
|
4
|
-
import { useStableCallback } from "../../use_stable_callback.js";
|
|
5
|
-
|
|
6
|
-
export const TableSizeContext = createContext();
|
|
7
|
-
|
|
8
|
-
export const useTableSizeContextValue = ({
|
|
9
|
-
onColumnSizeChange,
|
|
10
|
-
onRowSizeChange,
|
|
11
|
-
columns,
|
|
12
|
-
rows,
|
|
13
|
-
columnResizerRef,
|
|
14
|
-
rowResizerRef,
|
|
15
|
-
}) => {
|
|
16
|
-
onColumnSizeChange = useStableCallback(onColumnSizeChange);
|
|
17
|
-
onRowSizeChange = useStableCallback(onRowSizeChange);
|
|
18
|
-
|
|
19
|
-
const tableSizeContextValue = useMemo(() => {
|
|
20
|
-
const onColumnSizeChangeWithColumn = onColumnSizeChange
|
|
21
|
-
? (width, columnIndex) => {
|
|
22
|
-
const column = columns[columnIndex];
|
|
23
|
-
return onColumnSizeChange(width, columnIndex, column);
|
|
24
|
-
}
|
|
25
|
-
: onColumnSizeChange;
|
|
26
|
-
|
|
27
|
-
const onRowSizeChangeWithRow = onRowSizeChange
|
|
28
|
-
? (height, rowIndex) => {
|
|
29
|
-
const row = rows[rowIndex];
|
|
30
|
-
return onRowSizeChange(height, rowIndex, row);
|
|
31
|
-
}
|
|
32
|
-
: onRowSizeChange;
|
|
33
|
-
|
|
34
|
-
return {
|
|
35
|
-
onColumnSizeChange: onColumnSizeChangeWithColumn,
|
|
36
|
-
onRowSizeChange: onRowSizeChangeWithRow,
|
|
37
|
-
columnResizerRef,
|
|
38
|
-
rowResizerRef,
|
|
39
|
-
};
|
|
40
|
-
}, []);
|
|
41
|
-
|
|
42
|
-
return tableSizeContextValue;
|
|
43
|
-
};
|