@leav/ui 1.13.0-3e5f362c → 1.13.0-679fc681

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/components/Explorer/Explorer.d.ts +5 -1
  2. package/dist/components/Explorer/Explorer.js +7 -0
  3. package/dist/components/Explorer/Explorer.js.map +1 -1
  4. package/dist/components/Explorer/_types.d.ts +6 -0
  5. package/dist/components/Explorer/_types.js.map +1 -1
  6. package/dist/components/Explorer/manage-view-settings/filter-items/FilterItems.js +4 -4
  7. package/dist/components/Explorer/manage-view-settings/filter-items/FilterItems.js.map +1 -1
  8. package/dist/components/Explorer/manage-view-settings/store-view-settings/viewSettingsReducer.d.ts +7 -31
  9. package/dist/components/Explorer/manage-view-settings/store-view-settings/viewSettingsReducer.js +9 -20
  10. package/dist/components/Explorer/manage-view-settings/store-view-settings/viewSettingsReducer.js.map +1 -1
  11. package/dist/components/Explorer/useNotifyFiltersChange.d.ts +15 -0
  12. package/dist/components/Explorer/useNotifyFiltersChange.js +26 -0
  13. package/dist/components/Explorer/useNotifyFiltersChange.js.map +1 -0
  14. package/dist/components/Filters/context/filtersReducer.d.ts +9 -1
  15. package/dist/components/Filters/context/filtersReducer.js +9 -5
  16. package/dist/components/Filters/context/filtersReducer.js.map +1 -1
  17. package/dist/components/Filters/filter-items/filter-type/tree/TreeAttributeDropDown.js +14 -1
  18. package/dist/components/Filters/filter-items/filter-type/tree/TreeAttributeDropDown.js.map +1 -1
  19. package/dist/components/Filters/filter-items/filter-type/tree/useTreePermissions.js +1 -1
  20. package/dist/components/Filters/filter-items/filter-type/tree/useTreePermissions.js.map +1 -1
  21. package/dist/hooks/useIFrameMessenger/iFrameMessengerContext.d.ts +3 -1
  22. package/dist/hooks/useIFrameMessenger/iFrameMessengerContext.js.map +1 -1
  23. package/dist/hooks/useIFrameMessenger/messageHandlers.d.ts +2 -1
  24. package/dist/hooks/useIFrameMessenger/messageHandlers.js +9 -0
  25. package/dist/hooks/useIFrameMessenger/messageHandlers.js.map +1 -1
  26. package/dist/hooks/useIFrameMessenger/types.d.ts +21 -2
  27. package/dist/hooks/useIFrameMessenger/types.js.map +1 -1
  28. package/dist/hooks/useIFrameMessenger/useIFrameMessenger.d.ts +1 -0
  29. package/dist/hooks/useIFrameMessenger/useIFrameMessengerContext.js +29 -7
  30. package/dist/hooks/useIFrameMessenger/useIFrameMessengerContext.js.map +1 -1
  31. package/dist/hooks/useIFrameMessenger/useNativePanelMessengerHandlers.d.ts +14 -0
  32. package/dist/hooks/useIFrameMessenger/useNativePanelMessengerHandlers.js +22 -0
  33. package/dist/hooks/useIFrameMessenger/useNativePanelMessengerHandlers.js.map +1 -0
  34. package/dist/hooks/useIFrameMessengerClient/iFrameMessengerClientContext.d.ts +1 -0
  35. package/dist/hooks/useIFrameMessengerClient/useIFrameMessengerClient.d.ts +1 -0
  36. package/package.json +4 -9
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/hooks/useIFrameMessenger/types.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,MAAM,QAAQ,GAAG,uBAAuB,CAAC","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {type MutableRefObject, type RefObject, type ComponentProps, type Key, type JSXElementConstructor} from 'react';\nimport type * as z from 'zod/v4';\nimport {type KitNotification} from 'aristid-ds';\nimport {type IKitConfirmDialog} from 'aristid-ds/dist/Kit/Feedback/Modal/types';\nimport {type ToastedAlertProps} from 'aristid-ds/dist/Kit/Feedback/Alert/types';\nimport {\n type LibraryIdSchema,\n type WhereSchema,\n type PanelIdSchema,\n type PanelSchema,\n type PanelIFrameSchema,\n type FlapPanelIdSchema,\n type attributeExplorerPanelSchema,\n type baseExplorerPanelSchema,\n} from '_ui/hooks/useIFrameMessenger/schema';\nimport {type AnyPrimitive} from '@leav/utils';\nimport {type IRecordIdentity, type ITreeNodeWithRecord} from '_ui/types';\n\nexport const packetId = '__fromIframeMessenger';\n\nexport interface IEncodedMessage {\n payload: string;\n [packetId]: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ComponentPropsWithKey<T extends keyof JSX.IntrinsicElements | JSXElementConstructor<any>> =\n ComponentProps<T> & {\n key?: Key;\n };\n\nexport interface IMessageBase {\n __frameId?: string;\n}\n\nexport type ModalConfirmMessage = IMessageBase & {\n type: 'modal-confirm';\n id: string;\n data: IKitConfirmDialog;\n overrides?: string[];\n};\n\nexport type AlertMessage = IMessageBase & {\n type: 'alert';\n id: string;\n data: ToastedAlertProps;\n overrides?: string[];\n};\n\nexport type NotificationMessage = IMessageBase & {\n type: 'notification';\n id: string;\n data: ComponentPropsWithKey<typeof KitNotification>;\n overrides?: string[];\n};\n\nexport type ChangeLanguageMessage = IMessageBase & {\n type: 'change-language';\n language: string;\n};\n\nexport type SimpleMessage = IMessageBase & {\n type: 'message';\n id: string;\n data: unknown;\n};\n\nexport type RegisterMessage = IMessageBase & {\n type: 'register';\n id: string;\n};\n\nexport type UnregisterMessage = IMessageBase & {\n type: 'unregister';\n id: string;\n};\n\nexport type IsRegisteredMessage = IMessageBase & {\n type: 'is-registered';\n id: string;\n};\n\nexport type Panel = z.infer<typeof PanelSchema>;\n\nexport type AttributeExplorerPanel = Panel &\n z.infer<typeof baseExplorerPanelSchema> &\n z.infer<typeof attributeExplorerPanelSchema>;\n\nexport type LibraryId = z.infer<typeof LibraryIdSchema>;\n\nexport type PanelId = z.infer<typeof PanelIdSchema>;\n\nexport type Where = z.infer<typeof WhereSchema>;\n\nexport type PanelIFrame = z.infer<typeof PanelIFrameSchema>;\n\ntype FlapPanelId = z.infer<typeof FlapPanelIdSchema>;\n\nexport type NavigateToPanelMessage = IMessageBase & {\n type: 'navigate-to-panel';\n data: {\n where: Where;\n libraryId: LibraryId;\n panelId?: PanelId;\n recordId?: string;\n flapRecordId?: string;\n flapLibraryId?: LibraryId;\n flapPanelId?: FlapPanelId;\n queryParams?: Record<string, string> & {\n redirectUrl?: string;\n formInitialValues?: Record<string, Array<AnyPrimitive | IRecordIdentity | ITreeNodeWithRecord>>;\n };\n };\n};\n\nexport type ClosePanelMessage = IMessageBase & {\n type: 'close-panel';\n data: {\n recordId: string;\n where: string;\n recordPanelId: string;\n };\n};\n\nexport type NavigateToIframeMessage = IMessageBase & {\n type: 'navigate-to-iframe';\n data: {\n panel: PanelIFrame;\n destination: {libraryId: LibraryId};\n where: Where;\n recordId: string;\n recordPanelId: string;\n };\n};\n\nexport type MessageToPanelMessage = IMessageBase & {\n type: 'message-to-panel';\n data: {\n type: string;\n target?: string;\n payload: unknown;\n };\n};\n\nexport type OpenFlapPanelMessage = IMessageBase & {\n type: 'open-flap-panel';\n data: {\n flapRecordId: string;\n flapLibraryId: LibraryId;\n flapPanelId: FlapPanelId;\n };\n};\n\nexport type CloseFlapPanelMessage = IMessageBase & {\n type: 'close-flap-panel';\n};\n\nexport type GetUrlMessage = IMessageBase & {\n type: 'get-url';\n id: string;\n data: {\n onGetUrl: (url: string) => void;\n flapParams?: {\n flapRecordId: string;\n flapLibraryId: LibraryId;\n flapPanelId: FlapPanelId;\n };\n panelParams?: {\n recordId: string;\n where: Where;\n recordPanelId: PanelId;\n };\n };\n overrides?: string[];\n};\n\nexport type GetPanelConfigMessage = IMessageBase & {\n type: 'get-panel-config';\n id: string;\n data: {\n panelId?: string;\n onGetPanelConfig: (data: PanelIFrame) => void;\n };\n overrides?: string[];\n};\n\nexport type MessageToParent =\n | ModalConfirmMessage\n | AlertMessage\n | NotificationMessage\n | SimpleMessage\n | RegisterMessage\n | UnregisterMessage\n | NavigateToPanelMessage\n | ClosePanelMessage\n | NavigateToIframeMessage\n | MessageToPanelMessage\n | OpenFlapPanelMessage\n | CloseFlapPanelMessage\n | GetUrlMessage\n | GetPanelConfigMessage;\n\nexport type MessageFromParent =\n | (IMessageBase & {\n type: 'on-call-callback';\n path: string;\n data: unknown;\n })\n | IsRegisteredMessage\n | ChangeLanguageMessage;\n\nexport type Message = MessageToParent | MessageFromParent;\n\nexport type MessageHandler<T = Message> = (message: T, dispatch: MessageDispatcher<T>) => void;\nexport type MessageDispatcher<T = Message> = (message: T, frameId?: string) => void;\n\nexport type CallCbFunction = (path: string, data: unknown, frameId: string) => void;\n\nexport type CallbackFunction = (...args: never[]) => void;\nexport type Callbacks = Record<string, Record<string, CallbackFunction>>;\n\nexport type MessageToPanelMessageHandler = (data: MessageToPanelMessage['data']['payload']) => void;\nexport type AddMessageToPanelMessageHandler = (type: string, handler: MessageToPanelMessageHandler) => void;\n\nexport type UnregisterHandlers = () => void;\nexport type RegisterHandlers = (\n iframeRef: RefObject<HTMLIFrameElement>,\n handlers: IUseIFrameMessengerOptions['handlers'],\n) => UnregisterHandlers;\n\nexport interface IUseIFrameMessengerOptions {\n ref?: RefObject<HTMLIFrameElement>;\n id?: string;\n onMessageReceived?: (\n senderWindow: Window | null,\n message: Message,\n panelId: string | null,\n dispatch: MessageDispatcher,\n callCb: CallCbFunction,\n callbacksStore: MutableRefObject<Callbacks>,\n ) => void;\n handlers?: {\n onModalConfirm?: (\n data: ModalConfirmMessage['data'],\n id: string,\n dispatch: MessageDispatcher,\n callCb: CallCbFunction,\n ) => void;\n onAlert?: (data: AlertMessage['data'], id: string, dispatch: MessageDispatcher, callCb: CallCbFunction) => void;\n onNotification?: (\n data: NotificationMessage['data'],\n id: string,\n dispatch: MessageDispatcher,\n callCb: CallCbFunction,\n ) => void;\n onMessage?: (data: unknown, id: string, dispatch: MessageDispatcher, callCb: CallCbFunction) => void;\n onNavigateToPanel?: (data: NavigateToPanelMessage['data']) => void;\n onClosePanel?: (data: ClosePanelMessage['data']) => void;\n onNavigateToIframe?: (data: NavigateToIframeMessage['data']) => void;\n onOpenFlapPanel?: (data: OpenFlapPanelMessage['data']) => void;\n onGetUrl?: (data: GetUrlMessage['data']) => void;\n onGetPanelConfig?: (\n data: GetPanelConfigMessage['data'],\n id: string,\n dispatch: MessageDispatcher,\n callCb: CallCbFunction,\n ) => void;\n onCloseFlapPanel?: () => void;\n };\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/hooks/useIFrameMessenger/types.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAC,MAAM,QAAQ,GAAG,uBAAuB,CAAC","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {type MutableRefObject, type RefObject, type ComponentProps, type Key, type JSXElementConstructor} from 'react';\nimport type * as z from 'zod/v4';\nimport {type KitNotification} from 'aristid-ds';\nimport {type IKitConfirmDialog} from 'aristid-ds/dist/Kit/Feedback/Modal/types';\nimport {type ToastedAlertProps} from 'aristid-ds/dist/Kit/Feedback/Alert/types';\nimport {\n type LibraryIdSchema,\n type WhereSchema,\n type PanelIdSchema,\n type PanelSchema,\n type PanelIFrameSchema,\n type FlapPanelIdSchema,\n type attributeExplorerPanelSchema,\n type baseExplorerPanelSchema,\n} from '_ui/hooks/useIFrameMessenger/schema';\nimport {type AnyPrimitive} from '@leav/utils';\nimport {type IRecordIdentity, type ITreeNodeWithRecord} from '_ui/types';\nimport {type SerializedView} from '_ui/components/Explorer/_types';\n\nexport const packetId = '__fromIframeMessenger';\n\nexport interface IEncodedMessage {\n payload: string;\n [packetId]: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ComponentPropsWithKey<T extends keyof JSX.IntrinsicElements | JSXElementConstructor<any>> =\n ComponentProps<T> & {\n key?: Key;\n };\n\nexport interface IMessageBase {\n __frameId?: string;\n __targetPanelId?: string;\n}\n\nexport type ModalConfirmMessage = IMessageBase & {\n type: 'modal-confirm';\n id: string;\n data: IKitConfirmDialog;\n overrides?: string[];\n};\n\nexport type AlertMessage = IMessageBase & {\n type: 'alert';\n id: string;\n data: ToastedAlertProps;\n overrides?: string[];\n};\n\nexport type NotificationMessage = IMessageBase & {\n type: 'notification';\n id: string;\n data: ComponentPropsWithKey<typeof KitNotification>;\n overrides?: string[];\n};\n\nexport type ChangeLanguageMessage = IMessageBase & {\n type: 'change-language';\n language: string;\n};\n\nexport type SimpleMessage = IMessageBase & {\n type: 'message';\n id: string;\n data: unknown;\n};\n\nexport type RegisterMessage = IMessageBase & {\n type: 'register';\n id: string;\n};\n\nexport type UnregisterMessage = IMessageBase & {\n type: 'unregister';\n id: string;\n};\n\nexport type IsRegisteredMessage = IMessageBase & {\n type: 'is-registered';\n id: string;\n};\n\nexport type Panel = z.infer<typeof PanelSchema>;\n\nexport type AttributeExplorerPanel = Panel &\n z.infer<typeof baseExplorerPanelSchema> &\n z.infer<typeof attributeExplorerPanelSchema>;\n\nexport type LibraryId = z.infer<typeof LibraryIdSchema>;\n\nexport type PanelId = z.infer<typeof PanelIdSchema>;\n\nexport type Where = z.infer<typeof WhereSchema>;\n\nexport type PanelIFrame = z.infer<typeof PanelIFrameSchema>;\n\ntype FlapPanelId = z.infer<typeof FlapPanelIdSchema>;\n\nexport type NavigateToPanelMessage = IMessageBase & {\n type: 'navigate-to-panel';\n data: {\n where: Where;\n libraryId: LibraryId;\n panelId?: PanelId;\n recordId?: string;\n flapRecordId?: string;\n flapLibraryId?: LibraryId;\n flapPanelId?: FlapPanelId;\n queryParams?: Record<string, string> & {\n redirectUrl?: string;\n formInitialValues?: Record<string, Array<AnyPrimitive | IRecordIdentity | ITreeNodeWithRecord>>;\n };\n };\n};\n\nexport type ClosePanelMessage = IMessageBase & {\n type: 'close-panel';\n data: {\n recordId: string;\n where: string;\n recordPanelId: string;\n };\n};\n\nexport type NavigateToIframeMessage = IMessageBase & {\n type: 'navigate-to-iframe';\n data: {\n panel: PanelIFrame;\n destination: {libraryId: LibraryId};\n where: Where;\n recordId: string;\n recordPanelId: string;\n };\n};\n\nexport type MessageToPanelMessage = IMessageBase & {\n type: 'message-to-panel';\n data: {\n type: string;\n target?: string;\n payload: unknown;\n };\n};\n\nexport type OpenFlapPanelMessage = IMessageBase & {\n type: 'open-flap-panel';\n data: {\n flapRecordId: string;\n flapLibraryId: LibraryId;\n flapPanelId: FlapPanelId;\n };\n};\n\nexport type CloseFlapPanelMessage = IMessageBase & {\n type: 'close-flap-panel';\n};\n\nexport type GetUrlMessage = IMessageBase & {\n type: 'get-url';\n id: string;\n data: {\n onGetUrl: (url: string) => void;\n flapParams?: {\n flapRecordId: string;\n flapLibraryId: LibraryId;\n flapPanelId: FlapPanelId;\n };\n panelParams?: {\n recordId: string;\n where: Where;\n recordPanelId: PanelId;\n };\n };\n overrides?: string[];\n};\n\nexport type GetPanelConfigMessage = IMessageBase & {\n type: 'get-panel-config';\n id: string;\n data: {\n panelId?: string;\n onGetPanelConfig: (data: PanelIFrame) => void;\n };\n overrides?: string[];\n};\n\nexport type ExplorerViewChangedMessage = IMessageBase & {\n type: 'explorer-view-changed';\n data: {\n serializedView: SerializedView;\n };\n};\n\nexport type ViewConfigUpdateMessage = IMessageBase & {\n type: 'view-config-update';\n data: {\n targetPanelId: string;\n serializedView: SerializedView;\n };\n};\n\nexport type MessageToParent =\n | ModalConfirmMessage\n | AlertMessage\n | NotificationMessage\n | SimpleMessage\n | RegisterMessage\n | UnregisterMessage\n | NavigateToPanelMessage\n | ClosePanelMessage\n | NavigateToIframeMessage\n | MessageToPanelMessage\n | OpenFlapPanelMessage\n | CloseFlapPanelMessage\n | GetUrlMessage\n | GetPanelConfigMessage\n | ExplorerViewChangedMessage;\n\nexport type MessageFromParent =\n | (IMessageBase & {\n type: 'on-call-callback';\n path: string;\n data: unknown;\n })\n | IsRegisteredMessage\n | ChangeLanguageMessage\n | ViewConfigUpdateMessage;\n\nexport type Message = MessageToParent | MessageFromParent;\n\nexport type MessageHandler<T = Message> = (message: T, dispatch: MessageDispatcher<T>) => void;\nexport type MessageDispatcher<T = Message> = (message: T, frameId?: string) => void;\n\nexport type CallCbFunction = (path: string, data: unknown, frameId: string) => void;\n\nexport type CallbackFunction = (...args: never[]) => void;\nexport type Callbacks = Record<string, Record<string, CallbackFunction>>;\n\nexport type MessageToPanelMessageHandler = (data: MessageToPanelMessage['data']['payload']) => void;\nexport type AddMessageToPanelMessageHandler = (type: string, handler: MessageToPanelMessageHandler) => void;\n\nexport type UnregisterHandlers = () => void;\nexport type RegisterHandlers = (\n iframeRef: RefObject<HTMLIFrameElement>,\n handlers: IUseIFrameMessengerOptions['handlers'],\n) => UnregisterHandlers;\nexport type RegisterNativePanelHandlers = (\n panelId: string,\n handlers: IUseIFrameMessengerOptions['handlers'],\n) => UnregisterHandlers;\nexport type DispatchToNativePanel = (panelId: string, message: Message) => void;\n\nexport interface IUseIFrameMessengerOptions {\n ref?: RefObject<HTMLIFrameElement>;\n id?: string;\n onMessageReceived?: (\n senderWindow: Window | null,\n message: Message,\n panelId: string | null,\n dispatch: MessageDispatcher,\n callCb: CallCbFunction,\n callbacksStore: MutableRefObject<Callbacks>,\n ) => void;\n handlers?: {\n onModalConfirm?: (\n data: ModalConfirmMessage['data'],\n id: string,\n dispatch: MessageDispatcher,\n callCb: CallCbFunction,\n ) => void;\n onAlert?: (data: AlertMessage['data'], id: string, dispatch: MessageDispatcher, callCb: CallCbFunction) => void;\n onNotification?: (\n data: NotificationMessage['data'],\n id: string,\n dispatch: MessageDispatcher,\n callCb: CallCbFunction,\n ) => void;\n onMessage?: (data: unknown, id: string, dispatch: MessageDispatcher, callCb: CallCbFunction) => void;\n onNavigateToPanel?: (data: NavigateToPanelMessage['data']) => void;\n onClosePanel?: (data: ClosePanelMessage['data']) => void;\n onNavigateToIframe?: (data: NavigateToIframeMessage['data']) => void;\n onOpenFlapPanel?: (data: OpenFlapPanelMessage['data']) => void;\n onGetUrl?: (data: GetUrlMessage['data']) => void;\n onGetPanelConfig?: (\n data: GetPanelConfigMessage['data'],\n id: string,\n dispatch: MessageDispatcher,\n callCb: CallCbFunction,\n ) => void;\n onCloseFlapPanel?: () => void;\n onExplorerViewChanged?: (data: ExplorerViewChangedMessage['data']) => void;\n onViewConfigUpdate?: (data: ViewConfigUpdateMessage['data']) => void;\n };\n}\n"]}
@@ -29,4 +29,5 @@ export declare const useIFrameMessenger: (options?: IUseIFrameMessengerOptions)
29
29
  closeFlapPanel: () => void;
30
30
  getPanelConfig: (data: import("./types").GetPanelConfigMessage["data"]) => void;
31
31
  getUrl: (data: import("./types").GetUrlMessage["data"]) => void;
32
+ explorerViewChanged: (data: import("./types").ExplorerViewChangedMessage["data"]) => void;
32
33
  };
@@ -4,7 +4,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
4
4
  // License text available at https://www.gnu.org/licenses/lgpl-3.0.txt
5
5
  import { useCallback, useMemo, useRef } from 'react';
6
6
  import { useIFrameMessenger } from './useIFrameMessenger';
7
- import { initClientHandlers } from './messageHandlers';
7
+ import { encodeMessage, initClientHandlers } from './messageHandlers';
8
8
  import { IFrameMessengerContext } from './iFrameMessengerContext';
9
9
  /**
10
10
  * Singleton Provider for the IFrameMessenger system.
@@ -20,14 +20,32 @@ export const IFrameMessengerProvider = ({ children }) => {
20
20
  // Using RefObject as key (instead of Window) avoids timing issues: contentWindow
21
21
  // may not be available yet when the iframe mounts and registers its handlers.
22
22
  const handlersMap = useRef(new Map());
23
+ // Maps native React panel IDs to their handlers.
24
+ // Same-window postMessage is used as transport: __targetPanelId in the envelope routes to the right entry.
25
+ const nativePanelHandlersMap = useRef(new Map());
23
26
  // Called by useIFrameMessenger for every non-system message.
24
- // Finds the handlers registered for the sender iframe and dispatches the message to them.
27
+ // Finds the handlers registered for the sender and dispatches the message to them.
25
28
  const onMessageReceived = useCallback((senderWindow, message, panelId, dispatch, callCb, callbacksStore) => {
26
29
  // event.source is null when the sender iframe was unmounted before the message
27
30
  // was processed — the browser clears the reference on iframe removal.
28
31
  if (!senderWindow) {
29
32
  return;
30
33
  }
34
+ // Same-window message: dispatched via dispatchToNativePanel.
35
+ // Route to the native panel identified by __targetPanelId.
36
+ if (senderWindow === window) {
37
+ const targetPanelId = message.__targetPanelId;
38
+ if (!targetPanelId) {
39
+ return;
40
+ }
41
+ const handlers = nativePanelHandlersMap.current.get(targetPanelId);
42
+ if (!handlers) {
43
+ return;
44
+ }
45
+ const clientHandlers = initClientHandlers(callCb, { handlers }, callbacksStore);
46
+ clientHandlers(message, dispatch);
47
+ return;
48
+ }
31
49
  let matchedHandlers;
32
50
  for (const [ref, handlers] of handlersMap.current) {
33
51
  if (ref.current?.contentWindow === senderWindow) {
@@ -48,12 +66,16 @@ export const IFrameMessengerProvider = ({ children }) => {
48
66
  const { changeLangInAllFrames } = useIFrameMessenger({ onMessageReceived });
49
67
  const registerHandlers = useCallback((iframeRef, handlers) => {
50
68
  handlersMap.current.set(iframeRef, handlers);
51
- const cleanup = () => {
52
- handlersMap.current.delete(iframeRef);
53
- };
54
- return cleanup;
69
+ return () => handlersMap.current.delete(iframeRef);
70
+ }, []);
71
+ const registerNativePanelHandlers = useCallback((panelId, handlers) => {
72
+ nativePanelHandlersMap.current.set(panelId, handlers);
73
+ return () => nativePanelHandlersMap.current.delete(panelId);
74
+ }, []);
75
+ const dispatchToNativePanel = useCallback((panelId, message) => {
76
+ window.postMessage(encodeMessage({ ...message, __targetPanelId: panelId }), '*');
55
77
  }, []);
56
- const contextValue = useMemo(() => ({ registerHandlers, changeLangInAllFrames }), []);
78
+ const contextValue = useMemo(() => ({ registerHandlers, registerNativePanelHandlers, dispatchToNativePanel, changeLangInAllFrames }), []);
57
79
  return _jsx(IFrameMessengerContext.Provider, { value: contextValue, children: children });
58
80
  };
59
81
  //# sourceMappingURL=useIFrameMessengerContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useIFrameMessengerContext.js","sourceRoot":"","sources":["../../../src/hooks/useIFrameMessenger/useIFrameMessengerContext.tsx"],"names":[],"mappings":";AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAwD,WAAW,EAAE,OAAO,EAAE,MAAM,EAAC,MAAM,OAAO,CAAC;AAC1G,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,kBAAkB,EAAC,MAAM,mBAAmB,CAAC;AAUrD,OAAO,EAAC,sBAAsB,EAAC,MAAM,0BAA0B,CAAC;AAEhE;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,EAAC,QAAQ,EAAwB,EAAE,EAAE;IACzE,uDAAuD;IACvD,iFAAiF;IACjF,8EAA8E;IAC9E,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,GAAG,EAAwE,CAAC,CAAC;IAE5G,6DAA6D;IAC7D,0FAA0F;IAC1F,MAAM,iBAAiB,GAAG,WAAW,CACjC,CACI,YAA2B,EAC3B,OAAgB,EAChB,OAAsB,EACtB,QAA2B,EAC3B,MAAsB,EACtB,cAA2C,EAC7C,EAAE;QACA,+EAA+E;QAC/E,sEAAsE;QACtE,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,OAAO;QACX,CAAC;QAED,IAAI,eAAmE,CAAC;QACxE,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YAChD,IAAI,GAAG,CAAC,OAAO,EAAE,aAAa,KAAK,YAAY,EAAE,CAAC;gBAC9C,eAAe,GAAG,QAAQ,CAAC;gBAC3B,MAAM;YACV,CAAC;QACL,CAAC;QAED,sFAAsF;QACtF,oFAAoF;QACpF,2EAA2E;QAC3E,IAAI,CAAC,eAAe,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QAED,MAAM,eAAe,GACjB,OAAO,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,EAAC,GAAG,OAAO,EAAE,IAAI,EAAE,EAAC,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,EAAC,EAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAEnG,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,EAAE,EAAC,QAAQ,EAAE,eAAe,EAAC,EAAE,cAAc,CAAC,CAAC;QAC/F,cAAc,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC,EACD,EAAE,CACL,CAAC;IAEF,MAAM,EAAC,qBAAqB,EAAC,GAAG,kBAAkB,CAAC,EAAC,iBAAiB,EAAC,CAAC,CAAC;IAExE,MAAM,gBAAgB,GAAqB,WAAW,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE;QAC3E,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAE7C,MAAM,OAAO,GAAG,GAAG,EAAE;YACjB,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC,CAAC;QAEF,OAAO,OAAO,CAAC;IACnB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAC,gBAAgB,EAAE,qBAAqB,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEpF,OAAO,KAAC,sBAAsB,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,YAAG,QAAQ,GAAmC,CAAC;AAC9G,CAAC,CAAC","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {type MutableRefObject, type ReactNode, type RefObject, useCallback, useMemo, useRef} from 'react';\nimport {useIFrameMessenger} from './useIFrameMessenger';\nimport {initClientHandlers} from './messageHandlers';\nimport {\n type Callbacks,\n type CallCbFunction,\n type Message,\n type MessageDispatcher,\n type IUseIFrameMessengerOptions,\n type RegisterHandlers,\n type UnregisterHandlers,\n} from './types';\nimport {IFrameMessengerContext} from './iFrameMessengerContext';\n\n/**\n * Singleton Provider for the IFrameMessenger system.\n * Must be mounted once above all `PanelCustom` instances.\n *\n * Owns a single `window.addEventListener('message')` (via `useIFrameMessenger`)\n * and routes incoming messages to the correct iframe's handlers using `handlersMap`.\n *\n * Each `PanelCustom` registers/deregisters its handlers via `useIFrameMessengerHandlers`.\n */\nexport const IFrameMessengerProvider = ({children}: {children: ReactNode}) => {\n // Maps each iframe's RefObject to its set of handlers.\n // Using RefObject as key (instead of Window) avoids timing issues: contentWindow\n // may not be available yet when the iframe mounts and registers its handlers.\n const handlersMap = useRef(new Map<RefObject<HTMLIFrameElement>, IUseIFrameMessengerOptions['handlers']>());\n\n // Called by useIFrameMessenger for every non-system message.\n // Finds the handlers registered for the sender iframe and dispatches the message to them.\n const onMessageReceived = useCallback(\n (\n senderWindow: Window | null,\n message: Message,\n panelId: string | null,\n dispatch: MessageDispatcher,\n callCb: CallCbFunction,\n callbacksStore: MutableRefObject<Callbacks>,\n ) => {\n // event.source is null when the sender iframe was unmounted before the message\n // was processed — the browser clears the reference on iframe removal.\n if (!senderWindow) {\n return;\n }\n\n let matchedHandlers: IUseIFrameMessengerOptions['handlers'] | undefined;\n for (const [ref, handlers] of handlersMap.current) {\n if (ref.current?.contentWindow === senderWindow) {\n matchedHandlers = handlers;\n break;\n }\n }\n\n // No registered handlers for this sender: either the iframe called unregisterHandlers\n // before its last message was processed (race condition on unmount), or the message\n // originates from an unrelated frame that passed decodeMessage validation.\n if (!matchedHandlers) {\n return;\n }\n\n const enrichedMessage =\n message.type === 'get-panel-config' ? {...message, data: {...message.data, panelId}} : message;\n\n const clientHandlers = initClientHandlers(callCb, {handlers: matchedHandlers}, callbacksStore);\n clientHandlers(enrichedMessage, dispatch);\n },\n [],\n );\n\n const {changeLangInAllFrames} = useIFrameMessenger({onMessageReceived});\n\n const registerHandlers: RegisterHandlers = useCallback((iframeRef, handlers) => {\n handlersMap.current.set(iframeRef, handlers);\n\n const cleanup = () => {\n handlersMap.current.delete(iframeRef);\n };\n\n return cleanup;\n }, []);\n\n const contextValue = useMemo(() => ({registerHandlers, changeLangInAllFrames}), []);\n\n return <IFrameMessengerContext.Provider value={contextValue}>{children}</IFrameMessengerContext.Provider>;\n};\n"]}
1
+ {"version":3,"file":"useIFrameMessengerContext.js","sourceRoot":"","sources":["../../../src/hooks/useIFrameMessenger/useIFrameMessengerContext.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {type MutableRefObject, type ReactNode, type RefObject, useCallback, useMemo, useRef} from 'react';\nimport {useIFrameMessenger} from './useIFrameMessenger';\nimport {encodeMessage, initClientHandlers} from './messageHandlers';\nimport {\n type Callbacks,\n type CallCbFunction,\n type Message,\n type MessageDispatcher,\n type IUseIFrameMessengerOptions,\n type RegisterHandlers,\n type RegisterNativePanelHandlers,\n} from './types';\nimport {IFrameMessengerContext} from './iFrameMessengerContext';\n\n/**\n * Singleton Provider for the IFrameMessenger system.\n * Must be mounted once above all `PanelCustom` instances.\n *\n * Owns a single `window.addEventListener('message')` (via `useIFrameMessenger`)\n * and routes incoming messages to the correct iframe's handlers using `handlersMap`.\n *\n * Each `PanelCustom` registers/deregisters its handlers via `useIFrameMessengerHandlers`.\n */\nexport const IFrameMessengerProvider = ({children}: {children: ReactNode}) => {\n // Maps each iframe's RefObject to its set of handlers.\n // Using RefObject as key (instead of Window) avoids timing issues: contentWindow\n // may not be available yet when the iframe mounts and registers its handlers.\n const handlersMap = useRef(new Map<RefObject<HTMLIFrameElement>, IUseIFrameMessengerOptions['handlers']>());\n\n // Maps native React panel IDs to their handlers.\n // Same-window postMessage is used as transport: __targetPanelId in the envelope routes to the right entry.\n const nativePanelHandlersMap = useRef(new Map<string, IUseIFrameMessengerOptions['handlers']>());\n\n // Called by useIFrameMessenger for every non-system message.\n // Finds the handlers registered for the sender and dispatches the message to them.\n const onMessageReceived = useCallback(\n (\n senderWindow: Window | null,\n message: Message,\n panelId: string | null,\n dispatch: MessageDispatcher,\n callCb: CallCbFunction,\n callbacksStore: MutableRefObject<Callbacks>,\n ) => {\n // event.source is null when the sender iframe was unmounted before the message\n // was processed — the browser clears the reference on iframe removal.\n if (!senderWindow) {\n return;\n }\n\n // Same-window message: dispatched via dispatchToNativePanel.\n // Route to the native panel identified by __targetPanelId.\n if (senderWindow === window) {\n const targetPanelId = message.__targetPanelId;\n if (!targetPanelId) {\n return;\n }\n const handlers = nativePanelHandlersMap.current.get(targetPanelId);\n if (!handlers) {\n return;\n }\n const clientHandlers = initClientHandlers(callCb, {handlers}, callbacksStore);\n clientHandlers(message, dispatch);\n return;\n }\n\n let matchedHandlers: IUseIFrameMessengerOptions['handlers'] | undefined;\n for (const [ref, handlers] of handlersMap.current) {\n if (ref.current?.contentWindow === senderWindow) {\n matchedHandlers = handlers;\n break;\n }\n }\n\n // No registered handlers for this sender: either the iframe called unregisterHandlers\n // before its last message was processed (race condition on unmount), or the message\n // originates from an unrelated frame that passed decodeMessage validation.\n if (!matchedHandlers) {\n return;\n }\n\n const enrichedMessage =\n message.type === 'get-panel-config' ? {...message, data: {...message.data, panelId}} : message;\n\n const clientHandlers = initClientHandlers(callCb, {handlers: matchedHandlers}, callbacksStore);\n clientHandlers(enrichedMessage, dispatch);\n },\n [],\n );\n\n const {changeLangInAllFrames} = useIFrameMessenger({onMessageReceived});\n\n const registerHandlers: RegisterHandlers = useCallback((iframeRef, handlers) => {\n handlersMap.current.set(iframeRef, handlers);\n return () => handlersMap.current.delete(iframeRef);\n }, []);\n\n const registerNativePanelHandlers: RegisterNativePanelHandlers = useCallback((panelId, handlers) => {\n nativePanelHandlersMap.current.set(panelId, handlers);\n return () => nativePanelHandlersMap.current.delete(panelId);\n }, []);\n\n const dispatchToNativePanel = useCallback((panelId: string, message: Message) => {\n window.postMessage(encodeMessage({...message, __targetPanelId: panelId}), '*');\n }, []);\n\n const contextValue = useMemo(\n () => ({registerHandlers, registerNativePanelHandlers, dispatchToNativePanel, changeLangInAllFrames}),\n [],\n );\n\n return <IFrameMessengerContext.Provider value={contextValue}>{children}</IFrameMessengerContext.Provider>;\n};\n"]}
@@ -0,0 +1,14 @@
1
+ import { type IUseIFrameMessengerOptions, type Message } from './types';
2
+ /**
3
+ * Per-panel hook for native React panels (non-iframe).
4
+ * Registers the panel's handlers into the singleton `IFrameMessengerProvider`
5
+ * and cleans them up on unmount.
6
+ *
7
+ * Uses same-window `window.postMessage` as transport, routed via `__targetPanelId`
8
+ * in the message envelope — same protocol as iframe panels, no postMessage cross-origin.
9
+ *
10
+ * Returns `dispatch` to send messages to another panel by its ID.
11
+ */
12
+ export declare const useNativePanelMessengerHandlers: (panelId: string, handlers: IUseIFrameMessengerOptions["handlers"]) => {
13
+ dispatch: (targetPanelId: string, message: Message) => void;
14
+ };
@@ -0,0 +1,22 @@
1
+ // Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06
2
+ // This file is released under LGPL V3
3
+ // License text available at https://www.gnu.org/licenses/lgpl-3.0.txt
4
+ import { useCallback, useContext, useEffect } from 'react';
5
+ import { IFrameMessengerContext } from './iFrameMessengerContext';
6
+ /**
7
+ * Per-panel hook for native React panels (non-iframe).
8
+ * Registers the panel's handlers into the singleton `IFrameMessengerProvider`
9
+ * and cleans them up on unmount.
10
+ *
11
+ * Uses same-window `window.postMessage` as transport, routed via `__targetPanelId`
12
+ * in the message envelope — same protocol as iframe panels, no postMessage cross-origin.
13
+ *
14
+ * Returns `dispatch` to send messages to another panel by its ID.
15
+ */
16
+ export const useNativePanelMessengerHandlers = (panelId, handlers) => {
17
+ const { registerNativePanelHandlers, dispatchToNativePanel } = useContext(IFrameMessengerContext);
18
+ useEffect(() => registerNativePanelHandlers(panelId, handlers), []);
19
+ const dispatch = useCallback((targetPanelId, message) => dispatchToNativePanel(targetPanelId, message), [dispatchToNativePanel]);
20
+ return { dispatch };
21
+ };
22
+ //# sourceMappingURL=useNativePanelMessengerHandlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNativePanelMessengerHandlers.js","sourceRoot":"","sources":["../../../src/hooks/useIFrameMessenger/useNativePanelMessengerHandlers.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,WAAW,EAAE,UAAU,EAAE,SAAS,EAAC,MAAM,OAAO,CAAC;AACzD,OAAO,EAAC,sBAAsB,EAAC,MAAM,0BAA0B,CAAC;AAGhE;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,OAAe,EAAE,QAAgD,EAAE,EAAE;IACjH,MAAM,EAAC,2BAA2B,EAAE,qBAAqB,EAAC,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAEhG,SAAS,CAAC,GAAG,EAAE,CAAC,2BAA2B,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEpE,MAAM,QAAQ,GAAG,WAAW,CACxB,CAAC,aAAqB,EAAE,OAAgB,EAAE,EAAE,CAAC,qBAAqB,CAAC,aAAa,EAAE,OAAO,CAAC,EAC1F,CAAC,qBAAqB,CAAC,CAC1B,CAAC;IAEF,OAAO,EAAC,QAAQ,EAAC,CAAC;AACtB,CAAC,CAAC","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {useCallback, useContext, useEffect} from 'react';\nimport {IFrameMessengerContext} from './iFrameMessengerContext';\nimport {type IUseIFrameMessengerOptions, type Message} from './types';\n\n/**\n * Per-panel hook for native React panels (non-iframe).\n * Registers the panel's handlers into the singleton `IFrameMessengerProvider`\n * and cleans them up on unmount.\n *\n * Uses same-window `window.postMessage` as transport, routed via `__targetPanelId`\n * in the message envelope — same protocol as iframe panels, no postMessage cross-origin.\n *\n * Returns `dispatch` to send messages to another panel by its ID.\n */\nexport const useNativePanelMessengerHandlers = (panelId: string, handlers: IUseIFrameMessengerOptions['handlers']) => {\n const {registerNativePanelHandlers, dispatchToNativePanel} = useContext(IFrameMessengerContext);\n\n useEffect(() => registerNativePanelHandlers(panelId, handlers), []);\n\n const dispatch = useCallback(\n (targetPanelId: string, message: Message) => dispatchToNativePanel(targetPanelId, message),\n [dispatchToNativePanel],\n );\n\n return {dispatch};\n};\n"]}
@@ -15,4 +15,5 @@ export declare const IframeMessengerClientContext: import("react").Context<{
15
15
  closeFlapPanel: () => void;
16
16
  getPanelConfig: (data: import("../useIFrameMessenger/types").GetPanelConfigMessage["data"]) => void;
17
17
  getUrl: (data: import("../useIFrameMessenger/types").GetUrlMessage["data"]) => void;
18
+ explorerViewChanged: (data: import("../useIFrameMessenger/types").ExplorerViewChangedMessage["data"]) => void;
18
19
  }>;
@@ -15,4 +15,5 @@ export declare const useIFrameMessengerClient: () => {
15
15
  closeFlapPanel: () => void;
16
16
  getPanelConfig: (data: import("../useIFrameMessenger/types").GetPanelConfigMessage["data"]) => void;
17
17
  getUrl: (data: import("../useIFrameMessenger/types").GetUrlMessage["data"]) => void;
18
+ explorerViewChanged: (data: import("../useIFrameMessenger/types").ExplorerViewChangedMessage["data"]) => void;
18
19
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leav/ui",
3
- "version": "1.13.0-3e5f362c",
3
+ "version": "1.13.0-679fc681",
4
4
  "description": "Shared React components and hooks",
5
5
  "scripts": {
6
6
  "prepublishOnly": "yarn build",
@@ -25,7 +25,7 @@
25
25
  "repository": "https://github.com/leav-solutions/leav-engine",
26
26
  "devDependencies": {
27
27
  "@apollo/client": "3.14.1",
28
- "@babel/preset-env": "7.29.3",
28
+ "@babel/preset-env": "7.29.5",
29
29
  "@babel/preset-react": "7.28.5",
30
30
  "@graphql-codegen/add": "5.0.3",
31
31
  "@graphql-codegen/cli": "6.3.1",
@@ -37,14 +37,12 @@
37
37
  "@testing-library/react-hooks": "8.0.1",
38
38
  "@testing-library/user-event": "14.6.1",
39
39
  "@total-typescript/ts-reset": "0.6.1",
40
- "@types/dompurify": "3.2.0",
41
40
  "@types/jest": "29.5.14",
42
- "@types/lodash.isequal": "^4",
43
41
  "@types/react": "18.2.14",
44
42
  "@types/react-dom": "18.2.6",
45
43
  "aristid-ds": "15.3.1-3917c51",
46
44
  "babel-jest": "29.7.0",
47
- "graphql": "16.13.2",
45
+ "graphql": "16.14.0",
48
46
  "i18next": "22.5.1",
49
47
  "jest": "29.7.0",
50
48
  "jest-environment-jsdom": "29.7.0",
@@ -56,7 +54,7 @@
56
54
  "ts-jest": "29.4.9",
57
55
  "tsc-alias": "1.8.17",
58
56
  "typescript": "5.9.3",
59
- "vite": "7.3.2"
57
+ "vite": "7.3.3"
60
58
  },
61
59
  "peerDependencies": {
62
60
  "@apollo/client": ">=3.8.1",
@@ -69,8 +67,6 @@
69
67
  },
70
68
  "dependencies": {
71
69
  "@ant-design/icons": "5.6.1",
72
- "@ckeditor/ckeditor5-build-inline": "39.0.2",
73
- "@ckeditor/ckeditor5-react": "6.3.0",
74
70
  "@dnd-kit/core": "6.3.1",
75
71
  "@dnd-kit/sortable": "8.0.0",
76
72
  "@dnd-kit/utilities": "3.2.2",
@@ -80,7 +76,6 @@
80
76
  "dompurify": "3.4.2",
81
77
  "html-react-parser": "4.2.10",
82
78
  "i18next-resources-to-backend": "1.2.1",
83
- "lodash.isequal": "4.5.0",
84
79
  "react-markdown": "5.0.3",
85
80
  "styled-components": "6.0.8",
86
81
  "xlsx": "0.18.5",