@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
package/src/docs/actions.md
DELETED
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
/\*\*
|
|
2
|
-
|
|
3
|
-
- # Actions System - Declarative Resource Management for Frontend Applications
|
|
4
|
-
-
|
|
5
|
-
- This module provides a comprehensive system for managing asynchronous resources (API calls, data fetching)
|
|
6
|
-
- in a declarative, signal-based architecture. It's designed for complex frontend applications that need
|
|
7
|
-
- fine-grained control over loading states, caching, and resource lifecycle management.
|
|
8
|
-
-
|
|
9
|
-
- ## Core Concepts
|
|
10
|
-
-
|
|
11
|
-
- ### 🔧 **Action Templates**
|
|
12
|
-
- Factory functions that define how to load resources. Templates are pure and reusable.
|
|
13
|
-
- ```js
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
- const getUserTemplate = createActionTemplate(async ({ userId }) => {
|
|
18
|
-
- const response = await fetch(`/api/users/${userId}`);
|
|
19
|
-
- return response.json();
|
|
20
|
-
- });
|
|
21
|
-
- ```
|
|
22
|
-
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
-
|
|
26
|
-
- ### 🎯 **Action Instances**
|
|
27
|
-
- Stateful objects created from templates with specific parameters. Each unique parameter set
|
|
28
|
-
- gets its own cached instance (automatic memoization).
|
|
29
|
-
- ```js
|
|
30
|
-
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
- const userAction = getUserTemplate.instantiate({ userId: 123 });
|
|
34
|
-
- const status = useActionStatus(userAction); // { pending, data, error, ... }
|
|
35
|
-
- ```
|
|
36
|
-
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
-
|
|
40
|
-
- ### 🔄 **Action Proxies**
|
|
41
|
-
- Dynamic actions that react to signal changes, automatically reloading when parameters change.
|
|
42
|
-
- ```js
|
|
43
|
-
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
- const userProxy = createActionProxy(getUserTemplate, {
|
|
47
|
-
- userId: userIdSignal, // Signal - reactive
|
|
48
|
-
- includeProfile: true // Static - not reactive
|
|
49
|
-
- });
|
|
50
|
-
- // Automatically reloads when userIdSignal changes
|
|
51
|
-
- ```
|
|
52
|
-
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
-
|
|
56
|
-
- ## Loading States & Lifecycle
|
|
57
|
-
-
|
|
58
|
-
- ### 📊 **State Management**
|
|
59
|
-
- Each action has a well-defined state machine:
|
|
60
|
-
- - `IDLE` → `LOADING` → `LOADED` (success)
|
|
61
|
-
- - `IDLE` → `LOADING` → `FAILED` (error)
|
|
62
|
-
- - `IDLE` → `LOADING` → `ABORTED` (cancelled)
|
|
63
|
-
-
|
|
64
|
-
- ### ⚡ **Load Types**
|
|
65
|
-
- - **`.load()`** - Load with user intent (sets `loadRequested: true`)
|
|
66
|
-
- - **`.preload()`** - Background loading (sets `loadRequested: false`)
|
|
67
|
-
- - **`.reload()`** - Force reload even if already loaded
|
|
68
|
-
- - **`.unload()`** - Cancel loading and reset state
|
|
69
|
-
-
|
|
70
|
-
- ### 🛡️ **Preload Protection**
|
|
71
|
-
- Preloaded actions are protected from garbage collection for 5 minutes to ensure
|
|
72
|
-
- they remain available for components that may load later (e.g., via dynamic imports).
|
|
73
|
-
-
|
|
74
|
-
- ## Key Features
|
|
75
|
-
-
|
|
76
|
-
- ### 🧠 **Intelligent Memoization**
|
|
77
|
-
- - Actions with identical parameters share the same instance
|
|
78
|
-
- - Uses deep equality comparison with `compareTwoJsValues`
|
|
79
|
-
- - Supports `SYMBOL_IDENTITY` for fast recognition of "conceptually same" objects
|
|
80
|
-
- - Memory-efficient with automatic garbage collection
|
|
81
|
-
-
|
|
82
|
-
- ### 🔗 **Parameter Binding & Composition**
|
|
83
|
-
- ```js
|
|
84
|
-
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
- const baseAction = getUserTemplate.instantiate({ userId: 123 });
|
|
88
|
-
- const enrichedAction = baseAction.bindParams({ includeProfile: true });
|
|
89
|
-
- // Result: { userId: 123, includeProfile: true }
|
|
90
|
-
-
|
|
91
|
-
- // Supports objects, primitives, and signals
|
|
92
|
-
- const dynamicAction = baseAction.bindParams(filtersSignal);
|
|
93
|
-
- ```
|
|
94
|
-
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
-
|
|
98
|
-
- ### 🎮 **Concurrent Loading Control**
|
|
99
|
-
- - Prevents duplicate requests for same resource
|
|
100
|
-
- - Smart request deduplication and racing condition handling
|
|
101
|
-
- - Coordinated loading/unloading of multiple actions via `updateActions()`
|
|
102
|
-
-
|
|
103
|
-
- ### 🔧 **Side Effects & Cleanup**
|
|
104
|
-
- ```js
|
|
105
|
-
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
- const actionTemplate = createActionTemplate(callback, {
|
|
109
|
-
- sideEffect: (params, loadParams) => {
|
|
110
|
-
- // Setup logic (analytics, subscriptions, etc.)
|
|
111
|
-
- return () => {
|
|
112
|
-
- // Cleanup logic - called on unload/abort
|
|
113
|
-
- };
|
|
114
|
-
- }
|
|
115
|
-
- });
|
|
116
|
-
- ```
|
|
117
|
-
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
-
|
|
121
|
-
- ## Usage Patterns
|
|
122
|
-
-
|
|
123
|
-
- ### 🏗️ **Basic Resource Loading**
|
|
124
|
-
- ```js
|
|
125
|
-
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
- const getUserAction = createActionTemplate(async ({ userId }) => {
|
|
129
|
-
- return await api.getUser(userId);
|
|
130
|
-
- });
|
|
131
|
-
-
|
|
132
|
-
- // In component
|
|
133
|
-
- const userAction = getUserAction.instantiate({ userId: 123 });
|
|
134
|
-
- const { pending, data, error } = useActionStatus(userAction);
|
|
135
|
-
-
|
|
136
|
-
- useEffect(() => {
|
|
137
|
-
- userAction.load();
|
|
138
|
-
- }, []);
|
|
139
|
-
- ```
|
|
140
|
-
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
-
|
|
144
|
-
- ### 🔄 **Reactive Data Loading**
|
|
145
|
-
- ```js
|
|
146
|
-
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
- const searchProxy = createActionProxy(searchTemplate, {
|
|
150
|
-
- query: searchSignal,
|
|
151
|
-
- filters: filtersSignal
|
|
152
|
-
- });
|
|
153
|
-
- // Automatically reloads when signals change
|
|
154
|
-
- ```
|
|
155
|
-
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
-
|
|
159
|
-
- ### 📋 **Master-Detail Pattern**
|
|
160
|
-
- ```js
|
|
161
|
-
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
- const usersAction = getUsersTemplate.instantiate();
|
|
165
|
-
- const selectedUser = signal(null);
|
|
166
|
-
-
|
|
167
|
-
- const userDetailsProxy = createActionProxy(getUserTemplate, {
|
|
168
|
-
- userId: computed(() => selectedUser.value?.id)
|
|
169
|
-
- });
|
|
170
|
-
- ```
|
|
171
|
-
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
-
|
|
175
|
-
- ### 🏃 **Progressive Loading**
|
|
176
|
-
- ```js
|
|
177
|
-
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
- // Preload on hover, load on click
|
|
181
|
-
- <button
|
|
182
|
-
- onMouseEnter={() => action.preload()}
|
|
183
|
-
- onClick={() => action.load()}
|
|
184
|
-
- >
|
|
185
|
-
- Load User
|
|
186
|
-
- </button>
|
|
187
|
-
- ```
|
|
188
|
-
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
-
|
|
192
|
-
- ## Advanced Features
|
|
193
|
-
-
|
|
194
|
-
- ### 🎭 **Custom Data Transformation**
|
|
195
|
-
- ```js
|
|
196
|
-
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
- const actionTemplate = createActionTemplate(fetchUser, {
|
|
200
|
-
- computedDataSignal: computed(() => {
|
|
201
|
-
- const rawData = dataSignal.value;
|
|
202
|
-
- return rawData ? transformUser(rawData) : null;
|
|
203
|
-
- })
|
|
204
|
-
- });
|
|
205
|
-
- ```
|
|
206
|
-
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
-
|
|
210
|
-
- ### 🎨 **Async Rendering Support**
|
|
211
|
-
- ```js
|
|
212
|
-
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
- const actionTemplate = createActionTemplate(fetchData, {
|
|
216
|
-
- renderLoadedAsync: async () => {
|
|
217
|
-
- const { UserComponent } = await import('./UserComponent.js');
|
|
218
|
-
- return (user) => <UserComponent user={user} />;
|
|
219
|
-
- }
|
|
220
|
-
- });
|
|
221
|
-
- ```
|
|
222
|
-
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
-
|
|
226
|
-
- ### 🛠️ **Debugging & Observability**
|
|
227
|
-
- Built-in debug mode with detailed logging of state transitions, loading coordination,
|
|
228
|
-
- and memory management. Enable with `debug = true`.
|
|
229
|
-
-
|
|
230
|
-
- ## Integration Points
|
|
231
|
-
-
|
|
232
|
-
- - **Signals**: Built on @preact/signals for reactive state management
|
|
233
|
-
- - **Navigation**: Integrates with navigation systems for route-based loading
|
|
234
|
-
- - **Components**: Use `useActionStatus()` hook for component integration
|
|
235
|
-
- - **Memory Management**: Automatic cleanup with WeakMap-based private properties
|
|
236
|
-
-
|
|
237
|
-
- ## Performance Characteristics
|
|
238
|
-
-
|
|
239
|
-
- - **Memory Efficient**: Weak references prevent memory leaks
|
|
240
|
-
- - **Request Deduplication**: Identical requests are automatically merged
|
|
241
|
-
- - **Minimal Re-renders**: Signal-based updates only trigger when data actually changes
|
|
242
|
-
- - **Lazy Loading**: Actions only created when needed, with intelligent memoization
|
|
243
|
-
-
|
|
244
|
-
- This system is particularly well-suited for:
|
|
245
|
-
- - SPAs with complex data fetching requirements
|
|
246
|
-
- - Applications needing fine-grained loading state control
|
|
247
|
-
- - Systems requiring request coordination and deduplication
|
|
248
|
-
- - Progressive loading and preloading scenarios
|
|
249
|
-
- - Master-detail interfaces with dynamic parameter binding
|
|
250
|
-
\*/
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { useActionStatus } from "@jsenv/navi";
|
|
2
|
-
import { stringifyForDisplay } from "../../../utils/stringify_for_display.js";
|
|
3
|
-
|
|
4
|
-
export const ActionStatus = ({ action, name = action.name }) => {
|
|
5
|
-
const { idle, preloaded, pending, params, error, aborted, data } =
|
|
6
|
-
useActionStatus(action);
|
|
7
|
-
|
|
8
|
-
return (
|
|
9
|
-
<fieldset>
|
|
10
|
-
<legend>{name}</legend>
|
|
11
|
-
|
|
12
|
-
<div style="display: flex; flex-direction: column; gap: 5px;">
|
|
13
|
-
<div>
|
|
14
|
-
<span>
|
|
15
|
-
<span>loading state:</span>{" "}
|
|
16
|
-
<strong>
|
|
17
|
-
{idle
|
|
18
|
-
? "idle"
|
|
19
|
-
: aborted
|
|
20
|
-
? "aborted"
|
|
21
|
-
: error
|
|
22
|
-
? "error"
|
|
23
|
-
: pending
|
|
24
|
-
? "pending"
|
|
25
|
-
: preloaded
|
|
26
|
-
? "preloaded"
|
|
27
|
-
: "loaded"}
|
|
28
|
-
</strong>
|
|
29
|
-
</span>
|
|
30
|
-
</div>
|
|
31
|
-
<div style="display: flex; gap: 5px;">
|
|
32
|
-
<span>params: </span>
|
|
33
|
-
<pre style="margin: 0">{stringifyForDisplay(params)}</pre>
|
|
34
|
-
</div>
|
|
35
|
-
<div style="display: flex; gap: 5px;">
|
|
36
|
-
<span>data: </span>
|
|
37
|
-
<pre style="margin: 0">{stringifyForDisplay(data)}</pre>
|
|
38
|
-
</div>
|
|
39
|
-
</div>
|
|
40
|
-
</fieldset>
|
|
41
|
-
);
|
|
42
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
## Prochain truc a faire:
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8" />
|
|
5
|
-
<link rel="icon" href="data:," />
|
|
6
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
-
<title>Action demo 0</title>
|
|
8
|
-
</head>
|
|
9
|
-
<body>
|
|
10
|
-
<div id="root" style="position: relative; width: 200px"></div>
|
|
11
|
-
|
|
12
|
-
<script type="module" jsenv-type="module/jsx">
|
|
13
|
-
/**
|
|
14
|
-
* Ici on teste juste que d'ouvrir le details
|
|
15
|
-
* charge l'action et que la donée est affichée
|
|
16
|
-
* Si on reload la page, le details est open et l'action est lancée
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import { render } from "preact";
|
|
20
|
-
import { signal, effect } from "@preact/signals";
|
|
21
|
-
import { useActionStatus, resource } from "@jsenv/navi";
|
|
22
|
-
|
|
23
|
-
const USER = resource("user", {
|
|
24
|
-
idKey: "name",
|
|
25
|
-
GET_MANY: () => {
|
|
26
|
-
return [
|
|
27
|
-
{
|
|
28
|
-
name: "Alice",
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
name: "bob",
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
name: "Charlie",
|
|
35
|
-
},
|
|
36
|
-
];
|
|
37
|
-
},
|
|
38
|
-
});
|
|
39
|
-
const openedSignal = signal(
|
|
40
|
-
localStorage.getItem("user_opened") === "true",
|
|
41
|
-
);
|
|
42
|
-
effect(() => {
|
|
43
|
-
const opened = openedSignal.value;
|
|
44
|
-
if (opened) {
|
|
45
|
-
localStorage.setItem("user_opened", "true");
|
|
46
|
-
} else {
|
|
47
|
-
localStorage.removeItem("user_opened");
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
if (openedSignal.peek()) {
|
|
51
|
-
USER.GET_MANY.preload();
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// eslint-disable-next-line no-unused-vars
|
|
55
|
-
const App = () => {
|
|
56
|
-
const { data } = useActionStatus(USER.GET_MANY);
|
|
57
|
-
|
|
58
|
-
return (
|
|
59
|
-
<div>
|
|
60
|
-
<details
|
|
61
|
-
open={openedSignal.value}
|
|
62
|
-
onToggle={(e) => {
|
|
63
|
-
if (e.target.open) {
|
|
64
|
-
openedSignal.value = true;
|
|
65
|
-
USER.GET_MANY.load();
|
|
66
|
-
} else {
|
|
67
|
-
openedSignal.value = false;
|
|
68
|
-
USER.GET_MANY.abort();
|
|
69
|
-
}
|
|
70
|
-
}}
|
|
71
|
-
>
|
|
72
|
-
<summary>Users</summary>
|
|
73
|
-
{data.map(({ name }) => {
|
|
74
|
-
return <span>{name}</span>;
|
|
75
|
-
})}
|
|
76
|
-
</details>
|
|
77
|
-
</div>
|
|
78
|
-
);
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
render(<App />, document.querySelector("#root"));
|
|
82
|
-
</script>
|
|
83
|
-
</body>
|
|
84
|
-
</html>
|