diff --git a/packages/frontend/navi/src/action/action_private_properties.js b/packages/frontend/navi/src/action/action_private_properties.js index 7de1757f3f..471c88f867 100644 --- a/packages/frontend/navi/src/action/action_private_properties.js +++ b/packages/frontend/navi/src/action/action_private_properties.js @@ -1,3 +1,5 @@ +import { ABORTED, COMPLETED, IDLE, RUNNING } from "./action_run_states.js"; + const actionPrivatePropertiesWeakMap = new WeakMap(); export const getActionPrivateProperties = (action) => { const actionPrivateProperties = actionPrivatePropertiesWeakMap.get(action); @@ -9,3 +11,17 @@ export const getActionPrivateProperties = (action) => { export const setActionPrivateProperties = (action, properties) => { actionPrivatePropertiesWeakMap.set(action, properties); }; + +export const getActionStatus = (action) => { + const { runningStateSignal, errorSignal, computedDataSignal } = + getActionPrivateProperties(action); + const runningState = runningStateSignal.value; + const idle = runningState === IDLE; + const aborted = runningState === ABORTED; + const error = errorSignal.value; + const loading = runningState === RUNNING; + const completed = runningState === COMPLETED; + const data = computedDataSignal.value; + + return { idle, loading, aborted, error, completed, data }; +}; diff --git a/packages/frontend/navi/src/action/actions.js b/packages/frontend/navi/src/action/actions.js index 7630e7cd5e..0a1dab4251 100644 --- a/packages/frontend/navi/src/action/actions.js +++ b/packages/frontend/navi/src/action/actions.js @@ -676,7 +676,7 @@ export const createAction = (callback, rootOptions = {}) => { } // ✅ CAS 2: Objet -> vérifier s'il contient des signals - if (newParamsOrSignal && typeof newParamsOrSignal === "object") { + if (isPlainObject(newParamsOrSignal)) { const staticParams = {}; const signalMap = new Map(); @@ -727,7 +727,7 @@ export const createAction = (callback, rootOptions = {}) => { return createActionProxyFromSignal(action, paramsSignal, options); } - // ✅ CAS 3: Primitive -> action enfant + // ✅ CAS 3: Primitive or objects like DOMEvents etc -> action enfant return createChildAction({ params: newParamsOrSignal, ...options, @@ -1395,6 +1395,19 @@ const generateActionName = (name, params) => { return `${name}${argsString}`; }; +const isPlainObject = (obj) => { + if (typeof obj !== "object" || obj === null) { + return false; + } + let proto = obj; + while (Object.getPrototypeOf(proto) !== null) { + proto = Object.getPrototypeOf(proto); + } + return ( + Object.getPrototypeOf(obj) === proto || Object.getPrototypeOf(obj) === null + ); +}; + if (import.meta.hot) { import.meta.hot.dispose(() => { abortRunningActions(); diff --git a/packages/frontend/navi/src/keyboard/keyboard_shortcuts.js b/packages/frontend/navi/src/keyboard/keyboard_shortcuts.js index ce4a537fd6..920231b78d 100644 --- a/packages/frontend/navi/src/keyboard/keyboard_shortcuts.js +++ b/packages/frontend/navi/src/keyboard/keyboard_shortcuts.js @@ -164,7 +164,8 @@ export const useKeyboardShortcuts = ( return false; } const { action } = shortcutCandidate; - return requestAction(element, action, { + const actionWithEvent = action.bindParams(keyboardEvent); + return requestAction(element, actionWithEvent, { actionOrigin: "keyboard_shortcut", event: keyboardEvent, requester: document.activeElement, diff --git a/packages/frontend/navi/src/layout/details/demos/details_demo.html b/packages/frontend/navi/src/layout/details/demos/details_demo.html new file mode 100644 index 0000000000..7e8d4e4425 --- /dev/null +++ b/packages/frontend/navi/src/layout/details/demos/details_demo.html @@ -0,0 +1,530 @@ + + +
+ + + +