@finsemble/finsemble-ui 6.4.0 → 6.5.0-beta.2

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 (218) hide show
  1. package/package.json +19 -18
  2. package/react/actions/smartDesktopDesignerActions.d.ts +6 -2
  3. package/react/actions/smartDesktopDesignerActions.js +2 -0
  4. package/react/actions/smartDesktopDesignerActions.js.map +1 -1
  5. package/react/assets/icons/code-block.svg +15 -0
  6. package/react/components/FinsembleProvider.js.map +1 -1
  7. package/react/components/appCatalog/modules/FDC3.d.ts +1 -1
  8. package/react/components/appCatalog/modules/FDC3.js.map +1 -1
  9. package/react/components/appCatalog/stores/appStore.d.ts +2 -2
  10. package/react/components/appCatalog/stores/appStore.js.map +1 -1
  11. package/react/components/common/Checkbox.js +1 -1
  12. package/react/components/common/Checkbox.js.map +1 -1
  13. package/react/components/common/DropZone.js +3 -1
  14. package/react/components/common/DropZone.js.map +1 -1
  15. package/react/components/common/FinsembleIcon.d.ts +1 -1
  16. package/react/components/common/FinsembleIcon.js +2 -0
  17. package/react/components/common/FinsembleIcon.js.map +1 -1
  18. package/react/components/common/FinsembleSelect.js +1 -1
  19. package/react/components/common/FinsembleSelect.js.map +1 -1
  20. package/react/components/common/Tooltip.js +3 -1
  21. package/react/components/common/Tooltip.js.map +1 -1
  22. package/react/components/common/css/application-list.css +4 -0
  23. package/react/components/common/css/preload-edit-page.css +37 -0
  24. package/react/components/favorites/FavoritesShell.stories.js.map +1 -1
  25. package/react/components/fdc3Resolver/ResolverContainer.js.map +1 -1
  26. package/react/components/legacyControls/FinsembleDnDContext.d.ts +2 -1
  27. package/react/components/legacyControls/FinsembleDnDContext.js +8 -6
  28. package/react/components/legacyControls/FinsembleDnDContext.js.map +1 -1
  29. package/react/components/linker/remoteRedux.d.ts +1 -1
  30. package/react/components/linker/remoteRedux.js.map +1 -1
  31. package/react/components/menu/MenuAutoResizer.js.map +1 -1
  32. package/react/components/menu/MenuPortal.js +19 -0
  33. package/react/components/menu/MenuPortal.js.map +1 -1
  34. package/react/components/notifications/components/notificationsCenter/NotificationsCenter.js.map +1 -1
  35. package/react/components/notifications/components/notificationsToasts/NotificationsToasts.js.map +1 -1
  36. package/react/components/notifications/components/shared/CheckButton.d.ts +1 -1
  37. package/react/components/notifications/components/shared/CheckButton.js.map +1 -1
  38. package/react/components/notifications/components/shared/NotificationCardShell.d.ts +1 -1
  39. package/react/components/notifications/components/shared/NotificationCardShell.js.map +1 -1
  40. package/react/components/notifications/components/shared/OverflowMenu.d.ts +1 -1
  41. package/react/components/notifications/components/shared/OverflowMenu.js.map +1 -1
  42. package/react/components/notifications/components/shared/notificationCard/NotificationCardBodyActions.d.ts +1 -1
  43. package/react/components/notifications/components/shared/notificationCard/NotificationCardBodyActions.js.map +1 -1
  44. package/react/components/notifications/components/shared/notificationCard/NotificationCardBodyShell.d.ts +1 -1
  45. package/react/components/notifications/components/shared/notificationCard/NotificationCardBodyShell.js.map +1 -1
  46. package/react/components/notifications/components/shared/notificationCard/NotificationCardHeaderControls.d.ts +1 -1
  47. package/react/components/notifications/components/shared/notificationCard/NotificationCardHeaderControls.js.map +1 -1
  48. package/react/components/notifications/components/shared/notificationCard/NotificationCardHeaderShell.d.ts +1 -1
  49. package/react/components/notifications/components/shared/notificationCard/NotificationCardHeaderShell.js.map +1 -1
  50. package/react/components/notifications/components/views/CardView.js.map +1 -1
  51. package/react/components/notifications/components/views/ListView.d.ts +1 -1
  52. package/react/components/notifications/components/views/ListView.js.map +1 -1
  53. package/react/components/notifications/components/views/NotificationDetailsView.d.ts +1 -1
  54. package/react/components/notifications/components/views/NotificationDetailsView.js.map +1 -1
  55. package/react/components/notifications/types.d.ts +1 -1
  56. package/react/components/notifications/types.js.map +1 -1
  57. package/react/components/notifications/utils.d.ts +1 -1
  58. package/react/components/notifications/utils.js.map +1 -1
  59. package/react/components/processMonitor/ProcessMonitor.js.map +1 -1
  60. package/react/components/processMonitor/components/ChildWindow.js.map +1 -1
  61. package/react/components/processMonitor/components/ListHeader.d.ts +1 -1
  62. package/react/components/processMonitor/components/ListHeader.js.map +1 -1
  63. package/react/components/processMonitor/stores/ProcessMonitorStore.d.ts +3 -3
  64. package/react/components/processMonitor/stores/ProcessMonitorStore.js.map +1 -1
  65. package/react/components/search/SearchResult.js +4 -3
  66. package/react/components/search/SearchResult.js.map +1 -1
  67. package/react/components/smartDesktopDesigner/AppEditAccess.js.map +1 -1
  68. package/react/components/smartDesktopDesigner/AppEditPage.d.ts +2 -1
  69. package/react/components/smartDesktopDesigner/AppEditPage.js +77 -73
  70. package/react/components/smartDesktopDesigner/AppEditPage.js.map +1 -1
  71. package/react/components/smartDesktopDesigner/Appearance.css +8 -0
  72. package/react/components/smartDesktopDesigner/Application.d.ts +10 -3
  73. package/react/components/smartDesktopDesigner/Application.js +35 -42
  74. package/react/components/smartDesktopDesigner/Application.js.map +1 -1
  75. package/react/components/smartDesktopDesigner/Applications.d.ts +2 -0
  76. package/react/components/smartDesktopDesigner/Applications.js +17 -7
  77. package/react/components/smartDesktopDesigner/Applications.js.map +1 -1
  78. package/react/components/smartDesktopDesigner/EditPreload.d.ts +14 -0
  79. package/react/components/smartDesktopDesigner/EditPreload.js +169 -0
  80. package/react/components/smartDesktopDesigner/EditPreload.js.map +1 -0
  81. package/react/components/smartDesktopDesigner/ItemList.d.ts +17 -0
  82. package/react/components/smartDesktopDesigner/ItemList.js +58 -0
  83. package/react/components/smartDesktopDesigner/ItemList.js.map +1 -0
  84. package/react/components/smartDesktopDesigner/OptionalSettingsView.d.ts +11 -0
  85. package/react/components/smartDesktopDesigner/OptionalSettingsView.js +71 -0
  86. package/react/components/smartDesktopDesigner/OptionalSettingsView.js.map +1 -0
  87. package/react/components/smartDesktopDesigner/Preloads.d.ts +8 -0
  88. package/react/components/smartDesktopDesigner/Preloads.js +26 -0
  89. package/react/components/smartDesktopDesigner/Preloads.js.map +1 -0
  90. package/react/components/smartDesktopDesigner/Publish.js.map +1 -1
  91. package/react/components/smartDesktopDesigner/SmartDesktopDesigner.js.map +1 -1
  92. package/react/components/smartDesktopDesigner/Toolbar.js +5 -5
  93. package/react/components/smartDesktopDesigner/Toolbar.js.map +1 -1
  94. package/react/components/smartDesktopDesigner/common/views.js +18 -0
  95. package/react/components/smartDesktopDesigner/common/views.js.map +1 -1
  96. package/react/components/smartDesktopDesigner/css/appearance.css +3 -0
  97. package/react/components/smartDesktopDesigner/fixtures/apps.d.ts +1 -1
  98. package/react/components/smartDesktopDesigner/fixtures/apps.js +23 -1
  99. package/react/components/smartDesktopDesigner/fixtures/apps.js.map +1 -1
  100. package/react/components/smartDesktopDesigner/fixtures/exportProps.js.map +1 -1
  101. package/react/components/smartDesktopDesigner/fixtures/preloads.d.ts +22 -0
  102. package/react/components/smartDesktopDesigner/fixtures/preloads.js +40 -0
  103. package/react/components/smartDesktopDesigner/fixtures/preloads.js.map +1 -0
  104. package/react/components/smartDesktopDesigner/fixtures/publishProgress.d.ts +1 -1
  105. package/react/components/smartDesktopDesigner/fixtures/publishProgress.js.map +1 -1
  106. package/react/components/smartDesktopDesigner/fixtures/views.js +9 -0
  107. package/react/components/smartDesktopDesigner/fixtures/views.js.map +1 -1
  108. package/react/components/smartDesktopDesigner/stories/AppEditPage.stories.d.ts +1 -1
  109. package/react/components/smartDesktopDesigner/stories/AppEditPage.stories.js +1 -0
  110. package/react/components/smartDesktopDesigner/stories/AppEditPage.stories.js.map +1 -1
  111. package/react/components/smartDesktopDesigner/stories/EditPreload.stories.d.ts +11 -0
  112. package/react/components/smartDesktopDesigner/stories/EditPreload.stories.js +35 -0
  113. package/react/components/smartDesktopDesigner/stories/EditPreload.stories.js.map +1 -0
  114. package/react/components/smartDesktopDesigner/stories/ItemList.stories.d.ts +16 -0
  115. package/react/components/smartDesktopDesigner/stories/{ApplicationList.stories.js → ItemList.stories.js} +26 -26
  116. package/react/components/smartDesktopDesigner/stories/ItemList.stories.js.map +1 -0
  117. package/react/components/smartDesktopDesigner/stories/OptionalSettingsView.stories.d.ts +11 -0
  118. package/react/components/smartDesktopDesigner/stories/OptionalSettingsView.stories.js +28 -0
  119. package/react/components/smartDesktopDesigner/stories/OptionalSettingsView.stories.js.map +1 -0
  120. package/react/components/smartDesktopDesigner/stories/Preloads.stories.d.ts +11 -0
  121. package/react/components/smartDesktopDesigner/stories/Preloads.stories.js +31 -0
  122. package/react/components/smartDesktopDesigner/stories/Preloads.stories.js.map +1 -0
  123. package/react/components/smartDesktopDesigner/stories/SmartDesktopDesigner.stories.js.map +1 -1
  124. package/react/components/smartDesktopDesigner/tests/AppEditPage.spec.js +1099 -258
  125. package/react/components/smartDesktopDesigner/tests/AppEditPage.spec.js.map +1 -1
  126. package/react/components/smartDesktopDesigner/tests/{ApplicationList.spec.d.ts → Application.spec.d.ts} +0 -0
  127. package/react/components/smartDesktopDesigner/tests/Application.spec.js +1496 -0
  128. package/react/components/smartDesktopDesigner/tests/Application.spec.js.map +1 -0
  129. package/react/components/smartDesktopDesigner/tests/Applications.spec.js +3 -3
  130. package/react/components/smartDesktopDesigner/tests/Applications.spec.js.map +1 -1
  131. package/react/components/smartDesktopDesigner/tests/EditPreload.spec.d.ts +1 -0
  132. package/react/components/smartDesktopDesigner/tests/EditPreload.spec.js +61 -0
  133. package/react/components/smartDesktopDesigner/tests/EditPreload.spec.js.map +1 -0
  134. package/react/components/smartDesktopDesigner/tests/ItemList.spec.d.ts +1 -0
  135. package/react/components/smartDesktopDesigner/tests/{ApplicationList.spec.js → ItemList.spec.js} +8 -8
  136. package/react/components/smartDesktopDesigner/tests/ItemList.spec.js.map +1 -0
  137. package/react/components/smartDesktopDesigner/tests/Preloads.spec.d.ts +1 -0
  138. package/react/components/smartDesktopDesigner/tests/Preloads.spec.js +47 -0
  139. package/react/components/smartDesktopDesigner/tests/Preloads.spec.js.map +1 -0
  140. package/react/components/smartDesktopDesigner/tests/SmartDesktopDesigner.spec.js +6 -0
  141. package/react/components/smartDesktopDesigner/tests/SmartDesktopDesigner.spec.js.map +1 -1
  142. package/react/components/toolbar/DragHandle.spec.d.ts +1 -0
  143. package/react/components/toolbar/DragHandle.spec.js +31 -0
  144. package/react/components/toolbar/DragHandle.spec.js.map +1 -0
  145. package/react/components/toolbar/DragHandle.stories.d.ts +13 -0
  146. package/react/components/toolbar/DragHandle.stories.js +39 -0
  147. package/react/components/toolbar/DragHandle.stories.js.map +1 -0
  148. package/react/components/toolbar/advancedAppLauncher/AdvancedAppLauncher.d.ts +1 -1
  149. package/react/components/toolbar/advancedAppLauncher/AdvancedAppLauncher.js.map +1 -1
  150. package/react/components/toolbar/advancedAppLauncher/components/Content.d.ts +1 -1
  151. package/react/components/toolbar/advancedAppLauncher/components/Content.js.map +1 -1
  152. package/react/components/toolbar/advancedAppLauncher/components/FilterSort.js.map +1 -1
  153. package/react/components/toolbar/advancedAppLauncher/components/FoldersList.d.ts +1 -1
  154. package/react/components/toolbar/advancedAppLauncher/components/FoldersList.js.map +1 -1
  155. package/react/components/toolbar/advancedAppLauncher/components/TagsList.d.ts +1 -1
  156. package/react/components/toolbar/advancedAppLauncher/components/TagsList.js.map +1 -1
  157. package/react/components/toolbar/advancedAppLauncher/stores/LauncherStore.d.ts +2 -2
  158. package/react/components/toolbar/advancedAppLauncher/stores/LauncherStore.js.map +1 -1
  159. package/react/components/toolbar/advancedAppLauncher/stores/StoreActions.js.map +1 -1
  160. package/react/components/toolbar/appLauncher/components/componentList.d.ts +2 -2
  161. package/react/components/toolbar/appLauncher/components/componentList.js.map +1 -1
  162. package/react/components/toolbar/appLauncher/stores/appLauncherStore.d.ts +2 -2
  163. package/react/components/toolbar/appLauncher/stores/appLauncherStore.js.map +1 -1
  164. package/react/components/toolbar/dashbar/Dashbar.js +9 -12
  165. package/react/components/toolbar/dashbar/Dashbar.js.map +1 -1
  166. package/react/components/toolbar/workspaceManagementMenu/WorkspaceManagementMenu.d.ts +2 -2
  167. package/react/components/toolbar/workspaceManagementMenu/WorkspaceManagementMenu.js.map +1 -1
  168. package/react/components/toolbar/workspaceManagementMenu/components/Workspace.d.ts +1 -1
  169. package/react/components/toolbar/workspaceManagementMenu/components/Workspace.js.map +1 -1
  170. package/react/components/toolbar/workspaceManagementMenu/components/WorkspaceList.d.ts +1 -1
  171. package/react/components/toolbar/workspaceManagementMenu/components/WorkspaceList.js.map +1 -1
  172. package/react/components/toolbar/workspaceManagementMenu/stores/workspaceManagementMenuStore.d.ts +4 -4
  173. package/react/components/toolbar/workspaceManagementMenu/stores/workspaceManagementMenuStore.js +1 -1
  174. package/react/components/toolbar/workspaceManagementMenu/stores/workspaceManagementMenuStore.js.map +1 -1
  175. package/react/components/userPreferences/components/content/Workspaces.d.ts +1 -1
  176. package/react/components/userPreferences/components/content/Workspaces.js +1 -1
  177. package/react/components/userPreferences/components/content/Workspaces.js.map +1 -1
  178. package/react/components/userPreferences/components/content/notificationViews/NotificationsSourceTypes.js.map +1 -1
  179. package/react/components/userPreferences/components/content/notificationViews/notificationViewsUtils.js.map +1 -1
  180. package/react/components/userPreferences/stores/UserPreferencesStore.d.ts +1 -1
  181. package/react/components/userPreferences/stores/UserPreferencesStore.js.map +1 -1
  182. package/react/components/windowTitleBar/WindowTitleBarShell.d.ts +4 -2
  183. package/react/components/windowTitleBar/WindowTitleBarShell.js +60 -59
  184. package/react/components/windowTitleBar/WindowTitleBarShell.js.map +1 -1
  185. package/react/components/windowTitleBar/components/center/TabList.d.ts +2 -2
  186. package/react/components/windowTitleBar/components/center/TabList.js +3 -0
  187. package/react/components/windowTitleBar/components/center/TabList.js.map +1 -1
  188. package/react/components/windowTitleBar/components/left/LinkerButton.js.map +1 -1
  189. package/react/components/windowTitleBar/components/right/GroupingButton.js.map +1 -1
  190. package/react/components/windowTitleBar/components/right/MaximizeButton.js.map +1 -1
  191. package/react/components/windowTitleBar/components/windowTitle.d.ts +5 -2
  192. package/react/components/windowTitleBar/components/windowTitle.js +93 -89
  193. package/react/components/windowTitleBar/components/windowTitle.js.map +1 -1
  194. package/react/components/windowTitleBar/stores/windowTitleBarStore.d.ts +3 -3
  195. package/react/components/windowTitleBar/stores/windowTitleBarStore.js +213 -217
  196. package/react/components/windowTitleBar/stores/windowTitleBarStore.js.map +1 -1
  197. package/react/hooks/useDashbar.js.map +1 -1
  198. package/react/hooks/useFavoritesShell.js.map +1 -1
  199. package/react/hooks/useNotifications.d.ts +1 -1
  200. package/react/hooks/useNotifications.js.map +1 -1
  201. package/react/reducers/rootReducer.d.ts +11 -3
  202. package/react/reducers/smartDesktopDesignerReducer.js +8 -0
  203. package/react/reducers/smartDesktopDesignerReducer.js.map +1 -1
  204. package/react/store.d.ts +22 -6
  205. package/react/types/fdc3.d.ts +2 -2
  206. package/react/types/fdc3.js.map +1 -1
  207. package/react/types/searchTypes.d.ts +1 -8
  208. package/react/types/searchTypes.js.map +1 -1
  209. package/react/types/smartDesktopDesignerTypes.d.ts +8 -2
  210. package/react/types/smartDesktopDesignerTypes.js.map +1 -1
  211. package/react/types/windowTitleBar.d.ts +1 -1
  212. package/react/types/windowTitleBar.js.map +1 -1
  213. package/react/components/smartDesktopDesigner/ApplicationList.d.ts +0 -16
  214. package/react/components/smartDesktopDesigner/ApplicationList.js +0 -60
  215. package/react/components/smartDesktopDesigner/ApplicationList.js.map +0 -1
  216. package/react/components/smartDesktopDesigner/stories/ApplicationList.stories.d.ts +0 -16
  217. package/react/components/smartDesktopDesigner/stories/ApplicationList.stories.js.map +0 -1
  218. package/react/components/smartDesktopDesigner/tests/ApplicationList.spec.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ResolverContainer.js","sourceRoot":"","sources":["../../../src/components/fdc3Resolver/ResolverContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright 2017 by ChartIQ, Inc.\n * All rights reserved.\n */\nimport React, { useState } from \"react\";\nimport { ResolverDialog } from \"./ResolverDialog\";\nimport { ResolutionList } from \"../../types/fdc3\";\nimport { clients } from \"@finsemble/finsemble-core\";\n\ntype ResolverResolution = clients.Interop.types.ResolverResolution;\n\nconst { name: windowName } = FSBL.Clients.WindowClient.getCurrentWindow();\n\ntype ResolverChoicesType = {\n\tresolutionList: ResolutionList[];\n\toriginatingAppName?: string;\n};\n\nexport const ResolverContainer = () => {\n\tconst [firstLoad, setFirstLoad] = useState(true);\n\tconst [intentRaiser, setIntentRaiser] = useState(\"\");\n\tconst [sendCallback, setSendCallback] = useState<any>(() => () => {});\n\tconst [cancelCallback, setCancelCallback] = useState<any>(() => () => {});\n\tconst [resolutionList, setResolutionList] = useState<ResolutionList[]>([]);\n\n\tconst clearAll = () => {\n\t\tFSBL.FinsembleWindow.getInstance({ name: windowName }, (err: any, win: any) => {\n\t\t\twin.hide(() => {});\n\t\t});\n\t\tsetIntentRaiser(\"\");\n\t\tsetResolutionList([]);\n\t};\n\tconst handleChoices = (choices: ResolverChoicesType) => {\n\t\tsetIntentRaiser(choices.originatingAppName ?? \"\");\n\t\tsetResolutionList(choices.resolutionList);\n\t\tFSBL.FinsembleWindow.getInstance({ name: windowName }, (err: any, win: any) => {\n\t\t\twin.show(() => {});\n\t\t});\n\t};\n\n\t// We want to register as an IntentResolverListener, but we only want to register once\n\t// However, the IntentResovlerListener handler needs to have access to this component's states\n\t// So, this block will register the listener, and then never be called again\n\tif (firstLoad) {\n\t\tsetFirstLoad(false);\n\n\t\tconst handleResolverChoices = (choices: ResolverChoicesType) =>\n\t\t\tnew Promise<ResolverResolution>((resolve, reject) => {\n\t\t\t\thandleChoices(choices);\n\t\t\t\tsetSendCallback(() => (result: object) => {\n\t\t\t\t\tclearAll();\n\t\t\t\t\tresolve(result);\n\t\t\t\t});\n\t\t\t\tsetCancelCallback(() => () => {\n\t\t\t\t\tclearAll();\n\t\t\t\t\treject({ err: \"Cancelled by user\" });\n\t\t\t\t});\n\t\t\t});\n\n\t\tFSBL.internal.interopAdmin.registerUIResolverListener(handleResolverChoices).then(() => {});\n\t\tclearAll();\n\t}\n\n\treturn (\n\t\t<ResolverDialog\n\t\t\tintentRaiser={intentRaiser}\n\t\t\tresolutionList={resolutionList}\n\t\t\tonSend={(selected: any) => {\n\t\t\t\tsendCallback(selected);\n\t\t\t}}\n\t\t\tonCancel={() => {\n\t\t\t\tcancelCallback();\n\t\t\t}}\n\t\t/>\n\t);\n};\n"]}
1
+ {"version":3,"file":"ResolverContainer.js","sourceRoot":"","sources":["../../../src/components/fdc3Resolver/ResolverContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright 2017 by ChartIQ, Inc.\n * All rights reserved.\n */\nimport React, { useState } from \"react\";\nimport { ResolverDialog } from \"./ResolverDialog\";\nimport { ResolutionList } from \"../../types/fdc3\";\nimport { clients } from \"@finsemble/finsemble-api\";\n\ntype ResolverResolution = clients.Interop.types.ResolverResolution;\n\nconst { name: windowName } = FSBL.Clients.WindowClient.getCurrentWindow();\n\ntype ResolverChoicesType = {\n\tresolutionList: ResolutionList[];\n\toriginatingAppName?: string;\n};\n\nexport const ResolverContainer = () => {\n\tconst [firstLoad, setFirstLoad] = useState(true);\n\tconst [intentRaiser, setIntentRaiser] = useState(\"\");\n\tconst [sendCallback, setSendCallback] = useState<any>(() => () => {});\n\tconst [cancelCallback, setCancelCallback] = useState<any>(() => () => {});\n\tconst [resolutionList, setResolutionList] = useState<ResolutionList[]>([]);\n\n\tconst clearAll = () => {\n\t\tFSBL.FinsembleWindow.getInstance({ name: windowName }, (err: any, win: any) => {\n\t\t\twin.hide(() => {});\n\t\t});\n\t\tsetIntentRaiser(\"\");\n\t\tsetResolutionList([]);\n\t};\n\tconst handleChoices = (choices: ResolverChoicesType) => {\n\t\tsetIntentRaiser(choices.originatingAppName ?? \"\");\n\t\tsetResolutionList(choices.resolutionList);\n\t\tFSBL.FinsembleWindow.getInstance({ name: windowName }, (err: any, win: any) => {\n\t\t\twin.show(() => {});\n\t\t});\n\t};\n\n\t// We want to register as an IntentResolverListener, but we only want to register once\n\t// However, the IntentResovlerListener handler needs to have access to this component's states\n\t// So, this block will register the listener, and then never be called again\n\tif (firstLoad) {\n\t\tsetFirstLoad(false);\n\n\t\tconst handleResolverChoices = (choices: ResolverChoicesType) =>\n\t\t\tnew Promise<ResolverResolution>((resolve, reject) => {\n\t\t\t\thandleChoices(choices);\n\t\t\t\tsetSendCallback(() => (result: object) => {\n\t\t\t\t\tclearAll();\n\t\t\t\t\tresolve(result);\n\t\t\t\t});\n\t\t\t\tsetCancelCallback(() => () => {\n\t\t\t\t\tclearAll();\n\t\t\t\t\treject({ err: \"Cancelled by user\" });\n\t\t\t\t});\n\t\t\t});\n\n\t\tFSBL.internal.interopAdmin.registerUIResolverListener(handleResolverChoices).then(() => {});\n\t\tclearAll();\n\t}\n\n\treturn (\n\t\t<ResolverDialog\n\t\t\tintentRaiser={intentRaiser}\n\t\t\tresolutionList={resolutionList}\n\t\t\tonSend={(selected: any) => {\n\t\t\t\tsendCallback(selected);\n\t\t\t}}\n\t\t\tonCancel={() => {\n\t\t\t\tcancelCallback();\n\t\t\t}}\n\t\t/>\n\t);\n};\n"]}
@@ -1,4 +1,4 @@
1
- import * as React from "react";
1
+ import React from "react";
2
2
  export declare enum AllowableDnDAxis {
3
3
  x = "x",
4
4
  y = "y"
@@ -20,6 +20,7 @@ declare type FinsembleDnDContextProps = {
20
20
  axis?: AllowableDnDAxis;
21
21
  lockAxis?: AllowableDnDAxis;
22
22
  className?: string;
23
+ metadata?: Record<string, any> | undefined;
23
24
  };
24
25
  export declare const FinsembleDnDContext: React.FunctionComponent<FinsembleDnDContextProps>;
25
26
  export {};
@@ -1,5 +1,5 @@
1
+ import React from "react";
1
2
  import { SortableContainer } from "react-sortable-hoc";
2
- import * as React from "react";
3
3
  var ChevronDirection;
4
4
  (function (ChevronDirection) {
5
5
  ChevronDirection["left"] = "left";
@@ -71,7 +71,7 @@ const ScrollingChevron = (props) => {
71
71
  React.createElement("i", { className: classNames, onClick: scrollFunction })));
72
72
  };
73
73
  export const FinsembleDnDContext = (props) => {
74
- var _a, _b, _c, _d, _e, _f, _g, _h;
74
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
75
75
  const { allowHorizontalScroll } = props;
76
76
  const onDragEnd = (_a = props.onDragEnd) !== null && _a !== void 0 ? _a : defaultOnDragEnd;
77
77
  const onDragBegin = (_b = props.onDragStart) !== null && _b !== void 0 ? _b : defaultOnDragBegin;
@@ -98,6 +98,8 @@ export const FinsembleDnDContext = (props) => {
98
98
  const isOverflowPresent = containerMeasurements.clientWidth !== 0 &&
99
99
  Math.abs(containerMeasurements.clientWidth - containerMeasurements.scrollWidth) > 0;
100
100
  const showChevrons = allowHorizontalScroll && isOverflowPresent;
101
+ const dashbar = (_h = props.metadata) === null || _h === void 0 ? void 0 : _h.dashbar;
102
+ const widgetDividerWidth = (dashbar === null || dashbar === void 0 ? void 0 : dashbar.widgetDividerWidth) || 0;
101
103
  const leftChevronDisabled = !!(showChevrons && containerScrollLeft === 0);
102
104
  const rightChevronDisabled = !!(showChevrons &&
103
105
  containerMeasurements.scrollWidth - containerScrollLeft - containerMeasurements.offsetWidth === 0);
@@ -114,7 +116,7 @@ export const FinsembleDnDContext = (props) => {
114
116
  return;
115
117
  let visibleLeftItem = (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.childNodes[leftItemIndex - 1];
116
118
  if (visibleLeftItem) {
117
- let calculatedFakeItemWidth = scrollHorizontally((_b = visibleLeftItem === null || visibleLeftItem === void 0 ? void 0 : visibleLeftItem.clientWidth) !== null && _b !== void 0 ? _b : chevronScrollDistance, scrollFunctionState, scrollFunctionStateSetters, 1);
119
+ let calculatedFakeItemWidth = scrollHorizontally((_b = (visibleLeftItem === null || visibleLeftItem === void 0 ? void 0 : visibleLeftItem.clientWidth) - widgetDividerWidth) !== null && _b !== void 0 ? _b : chevronScrollDistance, scrollFunctionState, scrollFunctionStateSetters, 1);
118
120
  setFakeItemWidth(calculatedFakeItemWidth);
119
121
  setLeftItemIndex(leftItemIndex - 1);
120
122
  }
@@ -125,7 +127,7 @@ export const FinsembleDnDContext = (props) => {
125
127
  return;
126
128
  let visibleLeftItem = (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.childNodes[leftItemIndex];
127
129
  if (visibleLeftItem) {
128
- let calculatedFakeItemWidth = scrollHorizontally((_b = visibleLeftItem === null || visibleLeftItem === void 0 ? void 0 : visibleLeftItem.clientWidth) !== null && _b !== void 0 ? _b : chevronScrollDistance, scrollFunctionState, scrollFunctionStateSetters, -1);
130
+ let calculatedFakeItemWidth = scrollHorizontally((_b = (visibleLeftItem === null || visibleLeftItem === void 0 ? void 0 : visibleLeftItem.clientWidth) - widgetDividerWidth) !== null && _b !== void 0 ? _b : chevronScrollDistance, scrollFunctionState, scrollFunctionStateSetters, -1);
129
131
  setFakeItemWidth(calculatedFakeItemWidth);
130
132
  setLeftItemIndex(leftItemIndex + 1);
131
133
  }
@@ -133,7 +135,7 @@ export const FinsembleDnDContext = (props) => {
133
135
  const scrollme = (event) => {
134
136
  if (!event.nativeEvent.deltaY)
135
137
  return;
136
- scrollHorizontally(20, scrollFunctionState, scrollFunctionStateSetters, event.nativeEvent.deltaY);
138
+ event.nativeEvent.deltaY < 0 ? scrollToLeft() : scrollToRight();
137
139
  };
138
140
  const doDOMManipulation = () => {
139
141
  if (props.allowHorizontalScroll && containerRef.current)
@@ -160,7 +162,7 @@ export const FinsembleDnDContext = (props) => {
160
162
  }, [SortContainer]);
161
163
  return (React.createElement("div", { id: props.id },
162
164
  showChevrons && (React.createElement(ScrollingChevron, { isDisabled: leftChevronDisabled, chevronDirection: ChevronDirection.left, showToolTip: props.showScrollButtonsTooltip, title: props.leftButtonTooltip, scrollFunction: scrollToLeft })),
163
- React.createElement(SortContainer, { onSortEnd: onDragEnd, onSortStart: onDragBegin, onSortMove: onDragMove, onSortOver: onDragOver, distance: distance, axis: (_h = props.axis) !== null && _h !== void 0 ? _h : AllowableDnDAxis.y, lockAxis: props.lockAxis }, props.children),
165
+ React.createElement(SortContainer, { onSortEnd: onDragEnd, onSortStart: onDragBegin, onSortMove: onDragMove, onSortOver: onDragOver, distance: distance, axis: (_j = props.axis) !== null && _j !== void 0 ? _j : AllowableDnDAxis.y, lockAxis: props.lockAxis }, props.children),
164
166
  showChevrons && (React.createElement(ScrollingChevron, { isDisabled: rightChevronDisabled, chevronDirection: ChevronDirection.right, showToolTip: props.showScrollButtonsTooltip, title: props.rightButtonTooltip, scrollFunction: scrollToRight }))));
165
167
  };
166
168
  //# sourceMappingURL=FinsembleDnDContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FinsembleDnDContext.js","sourceRoot":"","sources":["../../../src/components/legacyControls/FinsembleDnDContext.tsx"],"names":[],"mappings":"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","sourcesContent":["import { SortableContainer } from \"react-sortable-hoc\";\nimport * as React from \"react\";\ntype ScrollFunctionState = {\n\tcontainerScrollLeft: number;\n\tcontainerMeasurements: ContainerMeasurements;\n};\n\ntype ScrollFunctionStateSetters = {\n\tsetScrollLeft: React.Dispatch<React.SetStateAction<number>>;\n};\n\nenum ChevronDirection {\n\tleft = \"left\",\n\tright = \"right\",\n}\n\nexport enum AllowableDnDAxis {\n\tx = \"x\",\n\ty = \"y\",\n}\n\ntype ScrollingChevronProps = {\n\tchevronDirection: ChevronDirection;\n\tisDisabled: boolean;\n\tshowToolTip?: boolean;\n\ttitle?: string;\n\tscrollFunction: React.MouseEventHandler;\n};\n\nconst SORT_CONTAINER_DRAG_DISTANCE = 10;\n\nconst defaultOnDragEnd = () => {\n\tconsole.warn(\"No onDragEnd passed to FinsembleDnDContext\");\n};\n\nconst defaultOnDragBegin = Function.prototype;\nconst defaultOnDrag = Function.prototype;\nconst defaultOnDragOver = Function.prototype;\nconst defaultOnLayoutUpdate = Function.prototype;\n\ntype ContainerMeasurements = {\n\tclientLeft: number;\n\tclientWidth: number;\n\tscrollLeft: number;\n\tscrollWidth: number;\n\toffsetLeft: number;\n\toffsetWidth: number;\n};\n\nconst DEFAULT_CONTAINER_MEASUREMENTS: ContainerMeasurements = {\n\tclientLeft: 0,\n\tclientWidth: 0,\n\tscrollLeft: 0,\n\tscrollWidth: 0,\n\toffsetLeft: 0,\n\toffsetWidth: 0,\n};\n\nconst DEFAULT_CHEVRON_SCROLL_DISTANCE = 60;\n/**\n * Listens for resize events on the DOM and changes whether we should render the scrolling chevrons.\n * @param overflowStateSetter\n */\nconst addResizeHandler = (overflowStateSetter: () => void) => () => {\n\twindow.addEventListener(\"resize\", overflowStateSetter);\n\treturn () => {\n\t\twindow.removeEventListener(\"resize\", overflowStateSetter);\n\t};\n};\n\n/**\n * Scrolls forward or back\n * @param containerRef\n * @param distance How far to move\n * @param state Current scroll state\n * @param stateSetters Scroll state setters\n * @param scrollDir Whether we're scrolling forward or backwards\n * @param deltaY The scroll amount that came from the `wheel` event.\n */\nconst scrollHorizontally = (\n\tdistance: number,\n\tstate: ScrollFunctionState,\n\tstateSetters: ScrollFunctionStateSetters,\n\tscrollDir?: number,\n\tdeltaY?: number\n) => {\n\tconst { setScrollLeft } = stateSetters;\n\tconst { containerScrollLeft, containerMeasurements } = state;\n\n\tif (containerMeasurements.scrollWidth === 0) return;\n\tlet scrollAmount = 0;\n\n\tlet delta = 0;\n\tif (deltaY) {\n\t\tdelta = Math.max(-1, Math.min(1, -deltaY));\n\t} else if (scrollDir) {\n\t\tdelta = Math.max(-1, Math.min(1, scrollDir));\n\t}\n\n\tlet fakeItemWidth = 0;\n\n\t// advance the scroll position 40 px forward or back, depending on the mouse wheel direction.\n\t// eslint-disable-next-line no-mixed-operators\n\tlet newScrollLeft = containerScrollLeft - delta * distance;\n\n\tif (scrollAmount >= distance) {\n\t\treturn fakeItemWidth;\n\t}\n\n\t// See the links inside of the main body of FinsembleDnDContext if offsetLeft/Width are unfamiliar to you\n\tconst rightEdgeOfScrollingViewport =\n\t\tcontainerMeasurements.offsetLeft + containerMeasurements.offsetWidth + newScrollLeft;\n\n\tconst rightMostEdgeOfScrollingArea = containerMeasurements.offsetLeft + containerMeasurements.scrollWidth;\n\n\t// if we've scrolled beyond the right-most edge of the area, calculate the fake item width\n\tif (rightEdgeOfScrollingViewport > rightMostEdgeOfScrollingArea) {\n\t\tfakeItemWidth = newScrollLeft - (containerMeasurements.scrollWidth - containerMeasurements.clientWidth);\n\t}\n\n\t// if we've scrolled past the left-most area, set the scrollLeft to the leftMost edge of the region.\n\tif (newScrollLeft < 0) newScrollLeft = 0;\n\n\tif (newScrollLeft !== containerScrollLeft) {\n\t\tsetScrollLeft(newScrollLeft);\n\t}\n\n\treturn fakeItemWidth;\n};\n\n/**\n * Simple component that renders the left and right chevrons.\n * @param props\n */\nconst ScrollingChevron = (props: ScrollingChevronProps) => {\n\tconst { isDisabled, chevronDirection, showToolTip, title, scrollFunction } = props;\n\n\tconst classNames = `scroll-button ff-chevron-${chevronDirection} ${isDisabled ? \"greyedOut\" : null}`;\n\tconst toolTip = showToolTip ? title : \"\";\n\treturn (\n\t\t<div className=\"chevron-container\" title={toolTip}>\n\t\t\t<i className={classNames} onClick={scrollFunction}></i>\n\t\t</div>\n\t);\n};\n\ntype FinsembleDnDContextProps = {\n\tid?: string;\n\tleftButtonTooltip?: string;\n\trightButtonTooltip?: string;\n\tallowHorizontalScroll?: boolean;\n\tshowScrollButtonsTooltip?: boolean;\n\tchevronScrollDistance?: number;\n\tonDragEnd?: Function;\n\tonDragStart?: Function;\n\tonDragMove?: Function;\n\tonDragOver?: Function;\n\tonLayoutUpdate?: Function;\n\ttransitionDuration?: number;\n\tdistance?: number;\n\taxis?: AllowableDnDAxis;\n\tlockAxis?: AllowableDnDAxis;\n\tclassName?: string;\n};\n\n/**\n * The FinsembleDnDContext allows for all of the Draggable and Droppable components to work.\n * It wraps its children and allows them to do draggy and droppy things.\n * It also allows for horizontal containers to provide scrolling functionality.\n * @param props\n * @param props.id ID for the container that wraps the sortable container\n * @param props.allowHorizontalScroll whether the DND context should allow for horizontal scrolling\n * @param props.showScrollButtonsTooltip\n * @param props.leftButtonTooltip Tooltip for left scroll button\n * @param props.rightButtonTooltip Tooltip for right scroll button\n * @param props.chevronScrollDistance how far clicking the chevrons should push the content forward or backwards\n * @param props.onDragEnd handler for sorting\n * @param props.onDragBegin handler for sorting\n * @param props.onDragOver\n * @param props.onLayoutUpdate handler for rendering. Invokes on useLayoutEffect\n * @param props.distance how far the user has to drag an element to trigger sorting behavior\n * @param props.axis whether to sort vertically or horizontally.\n * @param props.className optional styles to pass the the sortable container\n */\nexport const FinsembleDnDContext: React.FunctionComponent<FinsembleDnDContextProps> = (props) => {\n\tconst { allowHorizontalScroll } = props;\n\tconst onDragEnd = props.onDragEnd ?? defaultOnDragEnd;\n\tconst onDragBegin = props.onDragStart ?? defaultOnDragBegin;\n\tconst onDragMove = props.onDragMove ?? defaultOnDrag;\n\tconst onDragOver = props.onDragOver ?? defaultOnDragOver;\n\t// This is the numberr of pixels that a draggable element has to be dragged before the sorting kicks in.\n\tconst distance = props.distance ?? SORT_CONTAINER_DRAG_DISTANCE;\n\tconst onLayoutUpdate = props.onLayoutUpdate ?? defaultOnLayoutUpdate;\n\n\t// This is the stateful variable that holds the active 'scrollLeft' property for the DOM node\n\t// that's rendered inside of the sort container.\n\tconst [containerScrollLeft, setContainerScrollLeft] = React.useState(0);\n\t// read the comment in doForceUpdate to understand this.\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tconst [forceUpdate, setForceUpdate] = React.useState(0);\n\n\t// Index of current visible left item\n\tconst [leftItemIndex, setLeftItemIndex] = React.useState(0);\n\t// Width of fake right (last) item to align the position of the left item\n\tconst [fakeItemWidth, setFakeItemWidth] = React.useState(0);\n\tconst containerRef = React.useRef<HTMLDivElement>(null);\n\n\t// An object with all of the measurements that we'll need to set chevron visibility.\n\t// If you don't understand client vs offset vs scrollWidth/Left,\n\t// go check out this image https://i.stack.imgur.com/Cl1IA.png\n\t// Here's an interactive version too: https://jsfiddle.net/y8Y32/25/\n\tconst containerMeasurements = containerRef.current\n\t\t? {\n\t\t\t\tclientLeft: containerRef.current.clientLeft,\n\t\t\t\tclientWidth: containerRef.current.clientWidth,\n\t\t\t\toffsetLeft: containerRef.current.offsetLeft,\n\t\t\t\toffsetWidth: containerRef.current.offsetWidth,\n\t\t\t\t// not using the actual container's scrollLeft because it may not have been set yet.\n\t\t\t\t// this uses the scrollLeft we have set in state.\n\t\t\t\tscrollLeft: containerScrollLeft,\n\t\t\t\tscrollWidth: containerRef.current.scrollWidth,\n\t\t }\n\t\t: DEFAULT_CONTAINER_MEASUREMENTS;\n\tconst chevronScrollDistance = props.chevronScrollDistance ?? DEFAULT_CHEVRON_SCROLL_DISTANCE;\n\t// Whether the elements inside of the DND container have overflowed the clientWidth.\n\tconst isOverflowPresent =\n\t\t// Explicitly made this !== 0 instead of just checking whether clientWidth was truthy\n\t\t// so it was clear why this check was here. If it's not clear,\n\t\t// if the clientWidth of the containerRef is 0, we should not have any chevrons. Ever.\n\t\t// A client width of 0 indicates that the Ref's children haven't fully rendered.\n\t\tcontainerMeasurements.clientWidth !== 0 &&\n\t\t// On a monitor that's scaled at 100%, when clientWidth and scrollWidth are the same\n\t\t// there is no overflow present. When monitors are NOT scaled at 100%,\n\t\t// there's a chance that these two numbers are off.\n\t\tMath.abs(containerMeasurements.clientWidth - containerMeasurements.scrollWidth) > 0;\n\n\tconst showChevrons = allowHorizontalScroll && isOverflowPresent;\n\n\t// disabled === 'grayed out' and onClick won't fire. When you've scrolled all the way to the left,\n\t// the left chevron is disabled. If you've scrolled all the way to the right, the right chevron is disabled\n\tconst leftChevronDisabled = !!(showChevrons && containerScrollLeft === 0);\n\tconst rightChevronDisabled = !!(\n\t\tshowChevrons &&\n\t\t/**\n\t\t * This is a calculation that figures out where the right edge of the current viewport is.\n\t\t * It's a little tricky to imagine. So look at this diagram.\n\t\t \t+-------------------------------------------scrollWidth-------------------------------------------+\n\t\t\t\t\t\t\t\t |----------------------------------------------------|\n\t\t\t\t\t\t\t\t |\t\t\t\t\t\t\t\t\t\t\t\t\t |\n\t\t\t+-------------------------------------------------------------------------------------------------+\n\t\t\t|(0) |(200) |(200) |(300)\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | (A) |\n\t\t\t+-------------------------------------------------------------------------------------------------+\n\t\t\t\t\t\t\t\t | \t\t\t\t\t\t\t\t\t\t\t\t\t |\n\t\t\t\t\t\t\t\t +----------------------clientWidth-------------------+ \n\t\t\t\t\t\t\t\t ^ ^\n\t\t\t\t\t\t\t\t | |\n\t\t\t\t\t\t\t\t | |\n\t\t\t\t\t\t\t\t | |\n\t\t\t\t\t\t\t\t + +\n\t\t\t\t\t\t\t\t scrollLeft = 100 scrollRight = 200\n\n\t\t * The numbers in parens are the numbers for the 'scroll box'. We're trying to figure out where the point labeled (A) is located. \n\t\t * \n\t\t * Walking through the calculation, we take the scrollWidth and subtract the scrollLeft. This gives us the right edge of the scroll box.\n\t\t * offsetWidth is effectively the right edge of the element. If the right edge of the scroll box and the right edge of the element are the same number,\n\t\t * then we cannot scroll any further, and the chevron should be disabled.\n\t\t */\n\t\tcontainerMeasurements.scrollWidth - containerScrollLeft - containerMeasurements.offsetWidth === 0\n\t);\n\n\tconst scrollFunctionState = {\n\t\tcontainerScrollLeft,\n\t\tcontainerMeasurements,\n\t};\n\n\tconst scrollFunctionStateSetters = {\n\t\tsetScrollLeft: setContainerScrollLeft,\n\t};\n\n\t/**\n\t * Left Chevron's onClickHandler\n\t */\n\tconst scrollToLeft = () => {\n\t\tif (leftChevronDisabled) return;\n\t\tlet visibleLeftItem = containerRef.current?.childNodes[leftItemIndex - 1] as HTMLDivElement;\n\t\tif (visibleLeftItem) {\n\t\t\tlet calculatedFakeItemWidth = scrollHorizontally(\n\t\t\t\tvisibleLeftItem?.clientWidth ?? chevronScrollDistance,\n\t\t\t\tscrollFunctionState,\n\t\t\t\tscrollFunctionStateSetters,\n\t\t\t\t1\n\t\t\t);\n\t\t\tsetFakeItemWidth(calculatedFakeItemWidth as number);\n\t\t\tsetLeftItemIndex(leftItemIndex - 1);\n\t\t}\n\t};\n\n\t/**\n\t * Right Chevron's onClickHandler\n\t */\n\tconst scrollToRight = () => {\n\t\tif (rightChevronDisabled) return;\n\t\tlet visibleLeftItem = containerRef.current?.childNodes[leftItemIndex] as HTMLDivElement;\n\t\tif (visibleLeftItem) {\n\t\t\tlet calculatedFakeItemWidth = scrollHorizontally(\n\t\t\t\tvisibleLeftItem?.clientWidth ?? chevronScrollDistance,\n\t\t\t\tscrollFunctionState,\n\t\t\t\tscrollFunctionStateSetters,\n\t\t\t\t-1\n\t\t\t);\n\t\t\tsetFakeItemWidth(calculatedFakeItemWidth as number);\n\t\t\tsetLeftItemIndex(leftItemIndex + 1);\n\t\t}\n\t};\n\n\t/**\n\t * \"wheel\" handler. scrolls forward or backwards\n\t * @param event\n\t */\n\tconst scrollme = (event: React.WheelEvent<HTMLDivElement>) => {\n\t\tif (!event.nativeEvent.deltaY) return;\n\t\tscrollHorizontally(20, scrollFunctionState, scrollFunctionStateSetters, event.nativeEvent.deltaY);\n\t};\n\n\tconst doDOMManipulation = () => {\n\t\tif (props.allowHorizontalScroll && containerRef.current) containerRef.current.scrollLeft = containerScrollLeft;\n\t};\n\n\t// This function increments `forceUpdate`, which is a piece of state that's irrelevant to the\n\t// rendering of this component. After a resize, we need to re-measure the DOM so we can figure out if\n\t// the chevrons are necessary. Because no state changes on a resize. the component doesn't rerender.\n\t// This function will change state, which will cause a re-rendering, and the component will be re-measured.\n\tconst doForceUpdate = () => {\n\t\tsetForceUpdate((currentValueOfForceUpdate) => currentValueOfForceUpdate + 1);\n\t};\n\n\t// This function is needed for correct positioning after resizing the window.\n\tconst scrollToInitialState = () => {\n\t\tconst calculatedFakeItemWidth = scrollHorizontally(\n\t\t\tcontainerScrollLeft,\n\t\t\tscrollFunctionState,\n\t\t\tscrollFunctionStateSetters,\n\t\t\t1\n\t\t);\n\t\tsetFakeItemWidth(calculatedFakeItemWidth as number);\n\t\tsetLeftItemIndex(0);\n\t\tsetContainerScrollLeft(0);\n\t};\n\n\t// After every render, set the actual DOM element's scrollLeft to be whatever we calculated during the previous render.\n\tReact.useLayoutEffect(doDOMManipulation);\n\t// after the children change, we need to force an update so that we can re-measure the DOM after the render happens\n\t// without this, adding and removing elements from the DNDContext won't recalculate whether the chevrons should render\n\tReact.useEffect(doForceUpdate, [props.children]);\n\t// Whenever the window resizes, force an update so that the DOM is re-measured.\n\tReact.useEffect(addResizeHandler(doForceUpdate), []);\n\t// Whenever the window resizes, scroll widgets to the left.\n\tReact.useEffect(addResizeHandler(scrollToInitialState), []);\n\n\t/**\n\t * Actual container that provides drag and drop functionality\n\t */\n\tconst SortContainer = SortableContainer((sortableContainerProps: any) => (\n\t\t<div onWheel={scrollme} ref={containerRef} className={props.className}>\n\t\t\t{sortableContainerProps.children}\n\t\t\t{/* fake element for scrolling */}\n\t\t\t<div style={{ width: `${fakeItemWidth}px`, flexShrink: 0 }} />\n\t\t</div>\n\t));\n\n\t// After every render, call onLayoutUpdate function\n\tReact.useLayoutEffect(() => {\n\t\tonLayoutUpdate();\n\t}, [SortContainer]);\n\n\treturn (\n\t\t<div id={props.id}>\n\t\t\t{showChevrons && (\n\t\t\t\t<ScrollingChevron\n\t\t\t\t\tisDisabled={leftChevronDisabled}\n\t\t\t\t\tchevronDirection={ChevronDirection.left}\n\t\t\t\t\tshowToolTip={props.showScrollButtonsTooltip}\n\t\t\t\t\ttitle={props.leftButtonTooltip}\n\t\t\t\t\tscrollFunction={scrollToLeft}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<SortContainer\n\t\t\t\tonSortEnd={onDragEnd}\n\t\t\t\tonSortStart={onDragBegin}\n\t\t\t\tonSortMove={onDragMove}\n\t\t\t\tonSortOver={onDragOver}\n\t\t\t\tdistance={distance}\n\t\t\t\taxis={props.axis ?? AllowableDnDAxis.y}\n\t\t\t\tlockAxis={props.lockAxis}\n\t\t\t>\n\t\t\t\t{props.children}\n\t\t\t</SortContainer>\n\t\t\t{showChevrons && (\n\t\t\t\t<ScrollingChevron\n\t\t\t\t\tisDisabled={rightChevronDisabled}\n\t\t\t\t\tchevronDirection={ChevronDirection.right}\n\t\t\t\t\tshowToolTip={props.showScrollButtonsTooltip}\n\t\t\t\t\ttitle={props.rightButtonTooltip}\n\t\t\t\t\tscrollFunction={scrollToRight}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"]}
1
+ {"version":3,"file":"FinsembleDnDContext.js","sourceRoot":"","sources":["../../../src/components/legacyControls/FinsembleDnDContext.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { SortableContainer } from \"react-sortable-hoc\";\n\ntype ScrollFunctionState = {\n\tcontainerScrollLeft: number;\n\tcontainerMeasurements: ContainerMeasurements;\n};\n\ntype ScrollFunctionStateSetters = {\n\tsetScrollLeft: React.Dispatch<React.SetStateAction<number>>;\n};\n\nenum ChevronDirection {\n\tleft = \"left\",\n\tright = \"right\",\n}\n\nexport enum AllowableDnDAxis {\n\tx = \"x\",\n\ty = \"y\",\n}\n\ntype ScrollingChevronProps = {\n\tchevronDirection: ChevronDirection;\n\tisDisabled: boolean;\n\tshowToolTip?: boolean;\n\ttitle?: string;\n\tscrollFunction: React.MouseEventHandler;\n};\n\nconst SORT_CONTAINER_DRAG_DISTANCE = 10;\n\nconst defaultOnDragEnd = () => {\n\tconsole.warn(\"No onDragEnd passed to FinsembleDnDContext\");\n};\n\nconst defaultOnDragBegin = Function.prototype;\nconst defaultOnDrag = Function.prototype;\nconst defaultOnDragOver = Function.prototype;\nconst defaultOnLayoutUpdate = Function.prototype;\n\ntype ContainerMeasurements = {\n\tclientLeft: number;\n\tclientWidth: number;\n\tscrollLeft: number;\n\tscrollWidth: number;\n\toffsetLeft: number;\n\toffsetWidth: number;\n};\n\nconst DEFAULT_CONTAINER_MEASUREMENTS: ContainerMeasurements = {\n\tclientLeft: 0,\n\tclientWidth: 0,\n\tscrollLeft: 0,\n\tscrollWidth: 0,\n\toffsetLeft: 0,\n\toffsetWidth: 0,\n};\n\nconst DEFAULT_CHEVRON_SCROLL_DISTANCE = 60;\n/**\n * Listens for resize events on the DOM and changes whether we should render the scrolling chevrons.\n * @param overflowStateSetter\n */\nconst addResizeHandler = (overflowStateSetter: () => void) => () => {\n\twindow.addEventListener(\"resize\", overflowStateSetter);\n\treturn () => {\n\t\twindow.removeEventListener(\"resize\", overflowStateSetter);\n\t};\n};\n\n/**\n * Scrolls forward or back\n * @param containerRef\n * @param distance How far to move\n * @param state Current scroll state\n * @param stateSetters Scroll state setters\n * @param scrollDir Whether we're scrolling forward or backwards\n * @param deltaY The scroll amount that came from the `wheel` event.\n */\nconst scrollHorizontally = (\n\tdistance: number,\n\tstate: ScrollFunctionState,\n\tstateSetters: ScrollFunctionStateSetters,\n\tscrollDir?: number,\n\tdeltaY?: number\n) => {\n\tconst { setScrollLeft } = stateSetters;\n\tconst { containerScrollLeft, containerMeasurements } = state;\n\n\tif (containerMeasurements.scrollWidth === 0) return;\n\tlet scrollAmount = 0;\n\n\tlet delta = 0;\n\tif (deltaY) {\n\t\tdelta = Math.max(-1, Math.min(1, -deltaY));\n\t} else if (scrollDir) {\n\t\tdelta = Math.max(-1, Math.min(1, scrollDir));\n\t}\n\n\tlet fakeItemWidth = 0;\n\n\t// advance the scroll position 40 px forward or back, depending on the mouse wheel direction.\n\t// eslint-disable-next-line no-mixed-operators\n\tlet newScrollLeft = containerScrollLeft - delta * distance;\n\n\tif (scrollAmount >= distance) {\n\t\treturn fakeItemWidth;\n\t}\n\n\t// See the links inside of the main body of FinsembleDnDContext if offsetLeft/Width are unfamiliar to you\n\tconst rightEdgeOfScrollingViewport =\n\t\tcontainerMeasurements.offsetLeft + containerMeasurements.offsetWidth + newScrollLeft;\n\n\tconst rightMostEdgeOfScrollingArea = containerMeasurements.offsetLeft + containerMeasurements.scrollWidth;\n\n\t// if we've scrolled beyond the right-most edge of the area, calculate the fake item width\n\tif (rightEdgeOfScrollingViewport > rightMostEdgeOfScrollingArea) {\n\t\tfakeItemWidth = newScrollLeft - (containerMeasurements.scrollWidth - containerMeasurements.clientWidth);\n\t}\n\n\t// if we've scrolled past the left-most area, set the scrollLeft to the leftMost edge of the region.\n\tif (newScrollLeft < 0) newScrollLeft = 0;\n\n\tif (newScrollLeft !== containerScrollLeft) {\n\t\tsetScrollLeft(newScrollLeft);\n\t}\n\n\treturn fakeItemWidth;\n};\n\n/**\n * Simple component that renders the left and right chevrons.\n * @param props\n */\nconst ScrollingChevron = (props: ScrollingChevronProps) => {\n\tconst { isDisabled, chevronDirection, showToolTip, title, scrollFunction } = props;\n\n\tconst classNames = `scroll-button ff-chevron-${chevronDirection} ${isDisabled ? \"greyedOut\" : null}`;\n\tconst toolTip = showToolTip ? title : \"\";\n\treturn (\n\t\t<div className=\"chevron-container\" title={toolTip}>\n\t\t\t<i className={classNames} onClick={scrollFunction}></i>\n\t\t</div>\n\t);\n};\n\ntype FinsembleDnDContextProps = {\n\tid?: string;\n\tleftButtonTooltip?: string;\n\trightButtonTooltip?: string;\n\tallowHorizontalScroll?: boolean;\n\tshowScrollButtonsTooltip?: boolean;\n\tchevronScrollDistance?: number;\n\tonDragEnd?: Function;\n\tonDragStart?: Function;\n\tonDragMove?: Function;\n\tonDragOver?: Function;\n\tonLayoutUpdate?: Function;\n\ttransitionDuration?: number;\n\tdistance?: number;\n\taxis?: AllowableDnDAxis;\n\tlockAxis?: AllowableDnDAxis;\n\tclassName?: string;\n\tmetadata?: Record<string, any> | undefined;\n};\n\n/**\n * The FinsembleDnDContext allows for all of the Draggable and Droppable components to work.\n * It wraps its children and allows them to do draggy and droppy things.\n * It also allows for horizontal containers to provide scrolling functionality.\n * @param props\n * @param props.id ID for the container that wraps the sortable container\n * @param props.allowHorizontalScroll whether the DND context should allow for horizontal scrolling\n * @param props.showScrollButtonsTooltip\n * @param props.leftButtonTooltip Tooltip for left scroll button\n * @param props.rightButtonTooltip Tooltip for right scroll button\n * @param props.chevronScrollDistance how far clicking the chevrons should push the content forward or backwards\n * @param props.onDragEnd handler for sorting\n * @param props.onDragBegin handler for sorting\n * @param props.onDragOver\n * @param props.onLayoutUpdate handler for rendering. Invokes on useLayoutEffect\n * @param props.distance how far the user has to drag an element to trigger sorting behavior\n * @param props.axis whether to sort vertically or horizontally.\n * @param props.className optional styles to pass the the sortable container\n */\nexport const FinsembleDnDContext: React.FunctionComponent<FinsembleDnDContextProps> = (props) => {\n\tconst { allowHorizontalScroll } = props;\n\tconst onDragEnd = props.onDragEnd ?? defaultOnDragEnd;\n\tconst onDragBegin = props.onDragStart ?? defaultOnDragBegin;\n\tconst onDragMove = props.onDragMove ?? defaultOnDrag;\n\tconst onDragOver = props.onDragOver ?? defaultOnDragOver;\n\t// This is the numberr of pixels that a draggable element has to be dragged before the sorting kicks in.\n\tconst distance = props.distance ?? SORT_CONTAINER_DRAG_DISTANCE;\n\tconst onLayoutUpdate = props.onLayoutUpdate ?? defaultOnLayoutUpdate;\n\n\t// This is the stateful variable that holds the active 'scrollLeft' property for the DOM node\n\t// that's rendered inside of the sort container.\n\tconst [containerScrollLeft, setContainerScrollLeft] = React.useState(0);\n\t// read the comment in doForceUpdate to understand this.\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tconst [forceUpdate, setForceUpdate] = React.useState(0);\n\n\t// Index of current visible left item\n\tconst [leftItemIndex, setLeftItemIndex] = React.useState(0);\n\t// Width of fake right (last) item to align the position of the left item\n\tconst [fakeItemWidth, setFakeItemWidth] = React.useState(0);\n\tconst containerRef = React.useRef<HTMLDivElement>(null);\n\n\t// An object with all of the measurements that we'll need to set chevron visibility.\n\t// If you don't understand client vs offset vs scrollWidth/Left,\n\t// go check out this image https://i.stack.imgur.com/Cl1IA.png\n\t// Here's an interactive version too: https://jsfiddle.net/y8Y32/25/\n\tconst containerMeasurements = containerRef.current\n\t\t? {\n\t\t\t\tclientLeft: containerRef.current.clientLeft,\n\t\t\t\tclientWidth: containerRef.current.clientWidth,\n\t\t\t\toffsetLeft: containerRef.current.offsetLeft,\n\t\t\t\toffsetWidth: containerRef.current.offsetWidth,\n\t\t\t\t// not using the actual container's scrollLeft because it may not have been set yet.\n\t\t\t\t// this uses the scrollLeft we have set in state.\n\t\t\t\tscrollLeft: containerScrollLeft,\n\t\t\t\tscrollWidth: containerRef.current.scrollWidth,\n\t\t }\n\t\t: DEFAULT_CONTAINER_MEASUREMENTS;\n\tconst chevronScrollDistance = props.chevronScrollDistance ?? DEFAULT_CHEVRON_SCROLL_DISTANCE;\n\t// Whether the elements inside of the DND container have overflowed the clientWidth.\n\tconst isOverflowPresent =\n\t\t// Explicitly made this !== 0 instead of just checking whether clientWidth was truthy\n\t\t// so it was clear why this check was here. If it's not clear,\n\t\t// if the clientWidth of the containerRef is 0, we should not have any chevrons. Ever.\n\t\t// A client width of 0 indicates that the Ref's children haven't fully rendered.\n\t\tcontainerMeasurements.clientWidth !== 0 &&\n\t\t// On a monitor that's scaled at 100%, when clientWidth and scrollWidth are the same\n\t\t// there is no overflow present. When monitors are NOT scaled at 100%,\n\t\t// there's a chance that these two numbers are off.\n\t\tMath.abs(containerMeasurements.clientWidth - containerMeasurements.scrollWidth) > 0;\n\n\tconst showChevrons = allowHorizontalScroll && isOverflowPresent;\n\n\t// TP - [15/12/2021] - We need to have a way to understand whether this context is wihtin the dashbar use or not.\n\t// Feels odd have specific references here but I can't see a way of doing this differently without\n\t// major refactoring, which is something I don't want to do on something called *legacy* controls\n\tconst dashbar = props.metadata?.dashbar;\n\tconst widgetDividerWidth = dashbar?.widgetDividerWidth || 0;\n\n\t// disabled === 'grayed out' and onClick won't fire. When you've scrolled all the way to the left,\n\t// the left chevron is disabled. If you've scrolled all the way to the right, the right chevron is disabled\n\tconst leftChevronDisabled = !!(showChevrons && containerScrollLeft === 0);\n\tconst rightChevronDisabled = !!(\n\t\tshowChevrons &&\n\t\t/**\n\t\t * This is a calculation that figures out where the right edge of the current viewport is.\n\t\t * It's a little tricky to imagine. So look at this diagram.\n\t\t \t+-------------------------------------------scrollWidth-------------------------------------------+\n\t\t\t\t\t\t\t\t |----------------------------------------------------|\n\t\t\t\t\t\t\t\t |\t\t\t\t\t\t\t\t\t\t\t\t\t |\n\t\t\t+-------------------------------------------------------------------------------------------------+\n\t\t\t|(0) |(200) |(200) |(300)\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | |\n\t\t\t| | | (A) |\n\t\t\t+-------------------------------------------------------------------------------------------------+\n\t\t\t\t\t\t\t\t | \t\t\t\t\t\t\t\t\t\t\t\t\t |\n\t\t\t\t\t\t\t\t +----------------------clientWidth-------------------+ \n\t\t\t\t\t\t\t\t ^ ^\n\t\t\t\t\t\t\t\t | |\n\t\t\t\t\t\t\t\t | |\n\t\t\t\t\t\t\t\t | |\n\t\t\t\t\t\t\t\t + +\n\t\t\t\t\t\t\t\t scrollLeft = 100 scrollRight = 200\n\n\t\t * The numbers in parens are the numbers for the 'scroll box'. We're trying to figure out where the point labeled (A) is located. \n\t\t * \n\t\t * Walking through the calculation, we take the scrollWidth and subtract the scrollLeft. This gives us the right edge of the scroll box.\n\t\t * offsetWidth is effectively the right edge of the element. If the right edge of the scroll box and the right edge of the element are the same number,\n\t\t * then we cannot scroll any further, and the chevron should be disabled.\n\t\t */\n\t\tcontainerMeasurements.scrollWidth - containerScrollLeft - containerMeasurements.offsetWidth === 0\n\t);\n\n\tconst scrollFunctionState = {\n\t\tcontainerScrollLeft,\n\t\tcontainerMeasurements,\n\t};\n\n\tconst scrollFunctionStateSetters = {\n\t\tsetScrollLeft: setContainerScrollLeft,\n\t};\n\n\t/**\n\t * Left Chevron's onClickHandler\n\t */\n\tconst scrollToLeft = () => {\n\t\tif (leftChevronDisabled) return;\n\t\tlet visibleLeftItem = containerRef.current?.childNodes[leftItemIndex - 1] as HTMLDivElement;\n\t\tif (visibleLeftItem) {\n\t\t\tlet calculatedFakeItemWidth = scrollHorizontally(\n\t\t\t\tvisibleLeftItem?.clientWidth - widgetDividerWidth ?? chevronScrollDistance,\n\t\t\t\tscrollFunctionState,\n\t\t\t\tscrollFunctionStateSetters,\n\t\t\t\t1\n\t\t\t);\n\t\t\tsetFakeItemWidth(calculatedFakeItemWidth as number);\n\t\t\tsetLeftItemIndex(leftItemIndex - 1);\n\t\t}\n\t};\n\n\t/**\n\t * Right Chevron's onClickHandler\n\t */\n\tconst scrollToRight = () => {\n\t\tif (rightChevronDisabled) return;\n\t\tlet visibleLeftItem = containerRef.current?.childNodes[leftItemIndex] as HTMLDivElement;\n\t\tif (visibleLeftItem) {\n\t\t\tlet calculatedFakeItemWidth = scrollHorizontally(\n\t\t\t\tvisibleLeftItem?.clientWidth - widgetDividerWidth ?? chevronScrollDistance,\n\t\t\t\tscrollFunctionState,\n\t\t\t\tscrollFunctionStateSetters,\n\t\t\t\t-1\n\t\t\t);\n\t\t\tsetFakeItemWidth(calculatedFakeItemWidth as number);\n\t\t\tsetLeftItemIndex(leftItemIndex + 1);\n\t\t}\n\t};\n\n\t/**\n\t * \"wheel\" handler. scrolls forward or backwards\n\t * @param event\n\t */\n\tconst scrollme = (event: React.WheelEvent<HTMLDivElement>) => {\n\t\tif (!event.nativeEvent.deltaY) return;\n\t\tevent.nativeEvent.deltaY < 0 ? scrollToLeft() : scrollToRight();\n\t};\n\n\tconst doDOMManipulation = () => {\n\t\tif (props.allowHorizontalScroll && containerRef.current) containerRef.current.scrollLeft = containerScrollLeft;\n\t};\n\n\t// This function increments `forceUpdate`, which is a piece of state that's irrelevant to the\n\t// rendering of this component. After a resize, we need to re-measure the DOM so we can figure out if\n\t// the chevrons are necessary. Because no state changes on a resize. the component doesn't rerender.\n\t// This function will change state, which will cause a re-rendering, and the component will be re-measured.\n\tconst doForceUpdate = () => {\n\t\tsetForceUpdate((currentValueOfForceUpdate) => currentValueOfForceUpdate + 1);\n\t};\n\n\t// This function is needed for correct positioning after resizing the window.\n\tconst scrollToInitialState = () => {\n\t\tconst calculatedFakeItemWidth = scrollHorizontally(\n\t\t\tcontainerScrollLeft,\n\t\t\tscrollFunctionState,\n\t\t\tscrollFunctionStateSetters,\n\t\t\t1\n\t\t);\n\t\tsetFakeItemWidth(calculatedFakeItemWidth as number);\n\t\tsetLeftItemIndex(0);\n\t\tsetContainerScrollLeft(0);\n\t};\n\n\t// After every render, set the actual DOM element's scrollLeft to be whatever we calculated during the previous render.\n\tReact.useLayoutEffect(doDOMManipulation);\n\t// after the children change, we need to force an update so that we can re-measure the DOM after the render happens\n\t// without this, adding and removing elements from the DNDContext won't recalculate whether the chevrons should render\n\tReact.useEffect(doForceUpdate, [props.children]);\n\t// Whenever the window resizes, force an update so that the DOM is re-measured.\n\tReact.useEffect(addResizeHandler(doForceUpdate), []);\n\t// Whenever the window resizes, scroll widgets to the left.\n\tReact.useEffect(addResizeHandler(scrollToInitialState), []);\n\n\t/**\n\t * Actual container that provides drag and drop functionality\n\t */\n\tconst SortContainer = SortableContainer((sortableContainerProps: any) => (\n\t\t<div onWheel={scrollme} ref={containerRef} className={props.className}>\n\t\t\t{sortableContainerProps.children}\n\t\t\t{/* fake element for scrolling */}\n\t\t\t<div style={{ width: `${fakeItemWidth}px`, flexShrink: 0 }} />\n\t\t</div>\n\t));\n\n\t// After every render, call onLayoutUpdate function\n\tReact.useLayoutEffect(() => {\n\t\tonLayoutUpdate();\n\t}, [SortContainer]);\n\n\treturn (\n\t\t<div id={props.id}>\n\t\t\t{showChevrons && (\n\t\t\t\t<ScrollingChevron\n\t\t\t\t\tisDisabled={leftChevronDisabled}\n\t\t\t\t\tchevronDirection={ChevronDirection.left}\n\t\t\t\t\tshowToolTip={props.showScrollButtonsTooltip}\n\t\t\t\t\ttitle={props.leftButtonTooltip}\n\t\t\t\t\tscrollFunction={scrollToLeft}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<SortContainer\n\t\t\t\tonSortEnd={onDragEnd}\n\t\t\t\tonSortStart={onDragBegin}\n\t\t\t\tonSortMove={onDragMove}\n\t\t\t\tonSortOver={onDragOver}\n\t\t\t\tdistance={distance}\n\t\t\t\taxis={props.axis ?? AllowableDnDAxis.y}\n\t\t\t\tlockAxis={props.lockAxis}\n\t\t\t>\n\t\t\t\t{props.children}\n\t\t\t</SortContainer>\n\t\t\t{showChevrons && (\n\t\t\t\t<ScrollingChevron\n\t\t\t\t\tisDisabled={rightChevronDisabled}\n\t\t\t\t\tchevronDirection={ChevronDirection.right}\n\t\t\t\t\tshowToolTip={props.showScrollButtonsTooltip}\n\t\t\t\t\ttitle={props.rightButtonTooltip}\n\t\t\t\t\tscrollFunction={scrollToRight}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"]}
@@ -1,5 +1,5 @@
1
1
  import { EnhancedStore } from "@reduxjs/toolkit";
2
- import { services } from "@finsemble/finsemble-core";
2
+ import { services } from "@finsemble/finsemble-api";
3
3
  export declare type LinkerStore = services.Interop.types.LinkerStore;
4
4
  export declare type InteropLinkChannels = services.Interop.modules.linker.InteropLinkChannels;
5
5
  export declare type InteropUnlinkChannels = services.Interop.modules.linker.InteropUnlinkChannels;
@@ -1 +1 @@
1
- {"version":3,"file":"remoteRedux.js","sourceRoot":"","sources":["../../../src/components/linker/remoteRedux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAiB,MAAM,kBAAkB,CAAC;AAQ/E,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;AAE7B,MAAM,YAAY,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC;AAE3C,MAAM,UAAU,GAAgB;IAC/B,OAAO,EAAE,EAAE;IACX,WAAW,EAAE,EAAE;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAyC,cAAc,CAAC;IACzE,cAAc,EAAE,UAAU;IAC1B,OAAO,EAAE,YAAY;IACrB,SAAS,EAAE;QACV,WAAW,CAAC,yBAAyB,CAAC,EAAE,MAAM,EAAE,sCAAsC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;KAC1G;CACD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB,eAAe,EAAE,YAAY,CAA+B,wBAAwB,CAAC;IACrF,YAAY,EAAE,YAAY,CAAsB,qBAAqB,CAAC;IACtE,cAAc,EAAE,YAAY,CAAwB,uBAAuB,CAAC;CAC5E,CAAC","sourcesContent":["import { configureStore, createAction, EnhancedStore } from \"@reduxjs/toolkit\";\nimport { services } from \"@finsemble/finsemble-core\";\n\nexport type LinkerStore = services.Interop.types.LinkerStore;\nexport type InteropLinkChannels = services.Interop.modules.linker.InteropLinkChannels;\nexport type InteropUnlinkChannels = services.Interop.modules.linker.InteropUnlinkChannels;\nexport type InteropLinkerSetActiveWindow = services.Interop.modules.linker.InteropLinkerSetActiveWindow;\n\nconst { remoteRedux } = FSBL;\n\nconst dummyReducer = (state: any) => state;\n\nconst emptyStore: LinkerStore = {\n\tclients: {},\n\tallChannels: [],\n};\n\nexport const store: EnhancedStore<LinkerStore, any, any> = configureStore({\n\tpreloadedState: emptyStore,\n\treducer: dummyReducer,\n\tenhancers: [\n\t\tremoteRedux.remoteReduxClientEnhancer({ server: \"@@finsemble/remoteRedux/InteropStore\", slice: \"linker\" }),\n\t],\n});\n\nexport const actions = {\n\tsetActiveWindow: createAction<InteropLinkerSetActiveWindow>(\"linker/setActiveWindow\"),\n\tlinkChannels: createAction<InteropLinkChannels>(\"linker/linkChannels\"),\n\tunlinkChannels: createAction<InteropUnlinkChannels>(\"linker/unlinkChannels\"),\n};\n"]}
1
+ {"version":3,"file":"remoteRedux.js","sourceRoot":"","sources":["../../../src/components/linker/remoteRedux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAiB,MAAM,kBAAkB,CAAC;AAQ/E,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;AAE7B,MAAM,YAAY,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC;AAE3C,MAAM,UAAU,GAAgB;IAC/B,OAAO,EAAE,EAAE;IACX,WAAW,EAAE,EAAE;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAyC,cAAc,CAAC;IACzE,cAAc,EAAE,UAAU;IAC1B,OAAO,EAAE,YAAY;IACrB,SAAS,EAAE;QACV,WAAW,CAAC,yBAAyB,CAAC,EAAE,MAAM,EAAE,sCAAsC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;KAC1G;CACD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB,eAAe,EAAE,YAAY,CAA+B,wBAAwB,CAAC;IACrF,YAAY,EAAE,YAAY,CAAsB,qBAAqB,CAAC;IACtE,cAAc,EAAE,YAAY,CAAwB,uBAAuB,CAAC;CAC5E,CAAC","sourcesContent":["import { configureStore, createAction, EnhancedStore } from \"@reduxjs/toolkit\";\nimport { services } from \"@finsemble/finsemble-api\";\n\nexport type LinkerStore = services.Interop.types.LinkerStore;\nexport type InteropLinkChannels = services.Interop.modules.linker.InteropLinkChannels;\nexport type InteropUnlinkChannels = services.Interop.modules.linker.InteropUnlinkChannels;\nexport type InteropLinkerSetActiveWindow = services.Interop.modules.linker.InteropLinkerSetActiveWindow;\n\nconst { remoteRedux } = FSBL;\n\nconst dummyReducer = (state: any) => state;\n\nconst emptyStore: LinkerStore = {\n\tclients: {},\n\tallChannels: [],\n};\n\nexport const store: EnhancedStore<LinkerStore, any, any> = configureStore({\n\tpreloadedState: emptyStore,\n\treducer: dummyReducer,\n\tenhancers: [\n\t\tremoteRedux.remoteReduxClientEnhancer({ server: \"@@finsemble/remoteRedux/InteropStore\", slice: \"linker\" }),\n\t],\n});\n\nexport const actions = {\n\tsetActiveWindow: createAction<InteropLinkerSetActiveWindow>(\"linker/setActiveWindow\"),\n\tlinkChannels: createAction<InteropLinkChannels>(\"linker/linkChannels\"),\n\tunlinkChannels: createAction<InteropUnlinkChannels>(\"linker/unlinkChannels\"),\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MenuAutoResizer.js","sourceRoot":"","sources":["../../../src/components/menu/MenuAutoResizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AASpD,MAAM,OAAO,eAAe;IAa3B,YAAY,WAAmB,EAAE,MAAc,EAAE,KAAa,EAAE,YAAoB,QAAQ,EAAE,YAAoB,CAAC;QAClH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAQrE,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAKlE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;YAChD,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,KAAK;YACpB,OAAO,EAAE,IAAI;SACb,CAAC,CAAC;QAGH,UAAU,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,UAAU;QACT,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC5B,CAAC;IAKO,KAAK,CAAC,sBAAsB;QAInC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,MAAM,cAAc,CAAC,EAAE;YAC3D,OAAO;SACP;QACD,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,mBAAmB,CACtD,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,MAAM,EACX,CAAC,EACD,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,SAAS,CACd,CAAC;QAEF,MAAM,MAAM,GAAgB;YAC3B,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,UAAU;YACpB,IAAI,EAAE,IAAI;YACV,GAAG,EAAE,GAAG;YACR,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,MAAM;YACd,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE,aAAa;SAC/B,CAAC;QAOF,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;QAC7F,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;CACD","sourcesContent":["import { calculateDimensions } from \"./menuHelpers\";\nimport { services } from \"@finsemble/finsemble-core\";\n\ntype SpawnParams = services.window.types.SpawnParams;\n\n/**\n * To make sure that MenuPortal.tsx remain small\n * I have isolated the auto resize logic in this class.\n */\nexport class MenuAutoResizer {\n\tprivate width: number;\n\n\tprivate maxHeight: number;\n\n\tprivate childWindow: Window;\n\n\tprivate menuId: string;\n\n\tprivate observer: MutationObserver;\n\n\tprivate minHeight: number;\n\n\tconstructor(childWindow: Window, menuId: string, width: number, maxHeight: number = Infinity, minHeight: number = 0) {\n\t\tthis.width = width;\n\t\tthis.maxHeight = maxHeight;\n\t\tthis.minHeight = minHeight;\n\t\tthis.childWindow = childWindow;\n\t\tthis.menuId = menuId;\n\t\tthis.updateWindowDimensions = this.updateWindowDimensions.bind(this);\n\t\t/* The external window does not have a URL and so its origin\n\t\twill not match the toolbar's origin, in that case\n\t\twe won't have onload, DOMContentLoaded or any other events.\n\t\tThat makes it hard to know when the content are loaded, we cant\n\t\teven inject custom JS as it will be already late.\n\t\tThe only way to know about a DOM change was MutationObserver!\n\t\t*/\n\t\tthis.observer = new MutationObserver(this.updateWindowDimensions);\n\t\t/* Now we watch for any DOM changes in the childWindow\n\t\tKnowing the height of the window contents is crucial for\n\t\tmaking decision about its position (below/above the toolbar).\n\t\t*/\n\t\tthis.observer.observe(this.childWindow.document, {\n\t\t\tchildList: true,\n\t\t\tcharacterData: false,\n\t\t\tsubtree: true,\n\t\t});\n\n\t\t// Initialize the window to the correct height\n\t\tsetTimeout(this.updateWindowDimensions, 0);\n\t}\n\n\tdisconnect() {\n\t\tthis.observer.disconnect();\n\t}\n\n\t/**\n\t * Callback for MutationObserver\n\t */\n\tprivate async updateWindowDimensions() {\n\t\t// If the original menu button has been removed then bypass updating the window dimensions.\n\t\t// Probably the menu itself is in the process of being removed but the mutation observer has\n\t\t// not yet disconnected\n\t\tif (!document.querySelector(`#${this.menuId}-menu-toggle`)) {\n\t\t\treturn;\n\t\t}\n\t\tconst { left, top, height } = await calculateDimensions(\n\t\t\tthis.childWindow,\n\t\t\tthis.menuId,\n\t\t\t0,\n\t\t\tthis.maxHeight,\n\t\t\tthis.minHeight\n\t\t);\n\n\t\tconst params: SpawnParams = {\n\t\t\tmonitor: \"mine\",\n\t\t\tposition: \"absolute\",\n\t\t\tleft: left,\n\t\t\ttop: top,\n\t\t\twidth: this.width,\n\t\t\theight: height,\n\t\t\tsetBoundsOnly: true,\n\t\t\tforceOntoMonitor: \"monitorRect\",\n\t\t};\n\n\t\t/**\n\t\t * See comment in MenuPortal.tsx on why we use showWindow() here instead of childWindow.moveTo()\n\t\t */\n\t\t//this.childWindow.moveTo(left, top);\n\t\t//this.childWindow.resizeTo(this.width, height);\n\t\tFSBL.Clients.LauncherClient.showWindow({ windowName: this.childWindow.window.name }, params);\n\t\tthis.childWindow.document.body.setAttribute(\"resizing\", \"false\");\n\t}\n}\n"]}
1
+ {"version":3,"file":"MenuAutoResizer.js","sourceRoot":"","sources":["../../../src/components/menu/MenuAutoResizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AASpD,MAAM,OAAO,eAAe;IAa3B,YAAY,WAAmB,EAAE,MAAc,EAAE,KAAa,EAAE,YAAoB,QAAQ,EAAE,YAAoB,CAAC;QAClH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAQrE,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAKlE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;YAChD,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,KAAK;YACpB,OAAO,EAAE,IAAI;SACb,CAAC,CAAC;QAGH,UAAU,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,UAAU;QACT,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC5B,CAAC;IAKO,KAAK,CAAC,sBAAsB;QAInC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,MAAM,cAAc,CAAC,EAAE;YAC3D,OAAO;SACP;QACD,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,mBAAmB,CACtD,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,MAAM,EACX,CAAC,EACD,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,SAAS,CACd,CAAC;QAEF,MAAM,MAAM,GAAgB;YAC3B,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,UAAU;YACpB,IAAI,EAAE,IAAI;YACV,GAAG,EAAE,GAAG;YACR,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,MAAM;YACd,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE,aAAa;SAC/B,CAAC;QAOF,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;QAC7F,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;CACD","sourcesContent":["import { calculateDimensions } from \"./menuHelpers\";\nimport { services } from \"@finsemble/finsemble-api\";\n\ntype SpawnParams = services.window.types.SpawnParams;\n\n/**\n * To make sure that MenuPortal.tsx remain small\n * I have isolated the auto resize logic in this class.\n */\nexport class MenuAutoResizer {\n\tprivate width: number;\n\n\tprivate maxHeight: number;\n\n\tprivate childWindow: Window;\n\n\tprivate menuId: string;\n\n\tprivate observer: MutationObserver;\n\n\tprivate minHeight: number;\n\n\tconstructor(childWindow: Window, menuId: string, width: number, maxHeight: number = Infinity, minHeight: number = 0) {\n\t\tthis.width = width;\n\t\tthis.maxHeight = maxHeight;\n\t\tthis.minHeight = minHeight;\n\t\tthis.childWindow = childWindow;\n\t\tthis.menuId = menuId;\n\t\tthis.updateWindowDimensions = this.updateWindowDimensions.bind(this);\n\t\t/* The external window does not have a URL and so its origin\n\t\twill not match the toolbar's origin, in that case\n\t\twe won't have onload, DOMContentLoaded or any other events.\n\t\tThat makes it hard to know when the content are loaded, we cant\n\t\teven inject custom JS as it will be already late.\n\t\tThe only way to know about a DOM change was MutationObserver!\n\t\t*/\n\t\tthis.observer = new MutationObserver(this.updateWindowDimensions);\n\t\t/* Now we watch for any DOM changes in the childWindow\n\t\tKnowing the height of the window contents is crucial for\n\t\tmaking decision about its position (below/above the toolbar).\n\t\t*/\n\t\tthis.observer.observe(this.childWindow.document, {\n\t\t\tchildList: true,\n\t\t\tcharacterData: false,\n\t\t\tsubtree: true,\n\t\t});\n\n\t\t// Initialize the window to the correct height\n\t\tsetTimeout(this.updateWindowDimensions, 0);\n\t}\n\n\tdisconnect() {\n\t\tthis.observer.disconnect();\n\t}\n\n\t/**\n\t * Callback for MutationObserver\n\t */\n\tprivate async updateWindowDimensions() {\n\t\t// If the original menu button has been removed then bypass updating the window dimensions.\n\t\t// Probably the menu itself is in the process of being removed but the mutation observer has\n\t\t// not yet disconnected\n\t\tif (!document.querySelector(`#${this.menuId}-menu-toggle`)) {\n\t\t\treturn;\n\t\t}\n\t\tconst { left, top, height } = await calculateDimensions(\n\t\t\tthis.childWindow,\n\t\t\tthis.menuId,\n\t\t\t0,\n\t\t\tthis.maxHeight,\n\t\t\tthis.minHeight\n\t\t);\n\n\t\tconst params: SpawnParams = {\n\t\t\tmonitor: \"mine\",\n\t\t\tposition: \"absolute\",\n\t\t\tleft: left,\n\t\t\ttop: top,\n\t\t\twidth: this.width,\n\t\t\theight: height,\n\t\t\tsetBoundsOnly: true,\n\t\t\tforceOntoMonitor: \"monitorRect\",\n\t\t};\n\n\t\t/**\n\t\t * See comment in MenuPortal.tsx on why we use showWindow() here instead of childWindow.moveTo()\n\t\t */\n\t\t//this.childWindow.moveTo(left, top);\n\t\t//this.childWindow.resizeTo(this.width, height);\n\t\tFSBL.Clients.LauncherClient.showWindow({ windowName: this.childWindow.window.name }, params);\n\t\tthis.childWindow.document.body.setAttribute(\"resizing\", \"false\");\n\t}\n}\n"]}
@@ -100,6 +100,22 @@ const showHideResizeWindow = async ({ childWindow, keyboardNavigation, show, thi
100
100
  keyboardNavigation.detach();
101
101
  }
102
102
  };
103
+ const closePortal = (element) => {
104
+ const { closeMenu } = useMenu();
105
+ const options = {
106
+ childList: true,
107
+ subtree: true,
108
+ };
109
+ const mutationObserver = new MutationObserver((mutations) => {
110
+ mutations.forEach((mutation) => {
111
+ var _a;
112
+ if ((_a = mutation.removedNodes) === null || _a === void 0 ? void 0 : _a.length)
113
+ closeMenu();
114
+ mutationObserver.disconnect();
115
+ });
116
+ });
117
+ mutationObserver.observe(element, options);
118
+ };
103
119
  export const MenuPortal = ({ show, children }) => {
104
120
  const { thisMenuId, menuHeight, maxHeight, minHeight } = useContext(MenuContext);
105
121
  const [element, setElement] = useState();
@@ -117,6 +133,9 @@ export const MenuPortal = ({ show, children }) => {
117
133
  return () => { };
118
134
  }, [show]);
119
135
  useCreateDropdown({ keyboardNavigation, childWindow, setElement, setChildWindow });
136
+ const toolbar = document.getElementById("Toolbar-tsx");
137
+ if (toolbar)
138
+ closePortal(toolbar);
120
139
  return element ? ReactDOM.createPortal(children, element) : null;
121
140
  };
122
141
  //# sourceMappingURL=MenuPortal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MenuPortal.js","sourceRoot":"","sources":["../../../src/components/menu/MenuPortal.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { MenuContext } from \"./menuContext\";\nimport { calculateDimensions, injectCSS } from \"./menuHelpers\";\nimport { KeyboardNavigation } from \"./keyboardNavigation\";\nimport { MenuAutoResizer } from \"./MenuAutoResizer\";\nimport { useState, useEffect, useContext, useMemo } from \"react\";\nimport { useMenu } from \"../../hooks/useMenu\";\nimport { services, FEA } from \"@finsemble/finsemble-core\";\n\ntype SpawnParams = services.window.types.SpawnParams;\n\n/**\n * Proxy/fake events are needed because when `document.addEventListener` is used inside a component\n * that is rendered inside react portal, `document` will refer to the toolbar's document instead\n * of the childWindow's document. Clicking inside a portal will not therefore capture those events.\n *\n * This code intercepts these events inside the portal and then forwards them to the parent (toolbar).\n */\nconst setupEventForwarding = (newWindow: Window) => {\n\t[\"mouseDown\", \"click\", \"mouseUp\"].forEach((eventName) => {\n\t\tnewWindow.document.addEventListener(eventName, (event) => {\n\t\t\tdocument.dispatchEvent(\n\t\t\t\tnew CustomEvent(`portal:${eventName}`, {\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\t// Devs may need access to the x and y of the cursor\n\t\t\t\t\t\tmouseEvent: new MouseEvent(eventName, event),\n\t\t\t\t\t\t// And possibly the target element\n\t\t\t\t\t\ttarget: event.target,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t);\n\t\t});\n\t});\n\n\t/**\n\t * Proxies keyboard events from the portal up into the parent window.\n\t * instead of e.key, you'll need to access e.detail.key.\n\t */\n\t[\"keyup\", \"keydown\", \"keypress\"].forEach((eventName) => {\n\t\tnewWindow?.document.addEventListener(eventName, (event) => {\n\t\t\tdocument.dispatchEvent(\n\t\t\t\tnew CustomEvent(`portal:${eventName}`, {\n\t\t\t\t\tdetail: new KeyboardEvent(event.type, event),\n\t\t\t\t})\n\t\t\t);\n\t\t});\n\t});\n};\n\n/**\n * The window (opened by window.open) is an empty html document.\n * This function creates a containerDiv for the parent to insert its\n * React DOM. That containerDiv is set through the `setElement()` method\n * which must be passed in.\n *\n * This function also does portal housekeeping such as transferring CSS and window\n * events.\n */\nconst insertWindowContent = ({\n\tnewWindow,\n\tisAutoResizable,\n\tclassName,\n\tsetElement,\n\tmenuHeight,\n}: {\n\tnewWindow: Window;\n\tisAutoResizable: boolean;\n\tclassName?: string;\n\tmenuHeight?: number;\n\tsetElement: React.Dispatch<React.SetStateAction<HTMLElement | undefined>>;\n}) => {\n\t// Set the child window's <html> tag to class \"menu-portal\" for scrollbar styling\n\tnewWindow.document.documentElement.className = \"menu-portal\";\n\tif (isAutoResizable) newWindow.document.body.setAttribute(\"resizing\", \"true\");\n\n\t// Create the element which will hold our react elements and then append it into the child window's body.\n\tconst containerDiv: HTMLElement = document.createElement(\"div\");\n\tnewWindow.document.body.appendChild(containerDiv);\n\n\t// The className that was passed to MenuShell is added to the child window's <body>\n\tclassName?.split(\" \").forEach((name: string) => newWindow!.document.body.classList.add(name));\n\n\t// This will update local state which will cause the parent React Functional Component\n\t// to return a react portal. See comments at the end of this file.\n\tsetElement(containerDiv);\n\n\t// Inject css into the child window's <head>\n\tinjectCSS(newWindow);\n\n\t// THE FOLLOWING IS LIKELY DEPRECATED BUT KEEPING JUST IN CASE\n\t// Place height on the portal.\n\t// inside of the portal, window.outerHeight === 39 (toolbar height).\n\t// Knowing the height of the window is important because some menus use that\n\t// information to force overflow on certain sections of the menu.\n\t(newWindow as any).portalHeight = menuHeight;\n};\n\n/**\n * React hook to create a drop down menu. This hook creates a new window using window.open\n * and assigns it as the childWindow to the MenuPortal. It then uses insertWindowContent()\n * to establish the React/DOM connection with the parent (e.g. Toolbar).\n */\nconst useCreateDropdown = ({\n\tkeyboardNavigation,\n\tsetElement,\n\tchildWindow,\n\tsetChildWindow,\n}: {\n\tkeyboardNavigation: KeyboardNavigation | null;\n\tsetElement: React.Dispatch<React.SetStateAction<HTMLElement | undefined>>;\n\tchildWindow: Window | null;\n\tsetChildWindow: React.Dispatch<React.SetStateAction<Window | null>>;\n}) => {\n\tconst { thisMenuId, menuWidth, menuHeight, className, maxHeight, minHeight } = useContext(MenuContext);\n\tconst { blurMenu } = useMenu();\n\tconst isAutoResizable = !menuHeight;\n\n\t/**\n\t * Initialize the window. This should only run once though it is possible\n\t * to run multiple times if MenuContext changes.\n\t */\n\tuseEffect(() => {\n\t\tlet menuAutoResizer: any = null;\n\n\t\t/**\n\t\t * Initial size and location of the menu is irrelevant because it is hidden.\n\t\t * The menu will be resized and positioned correctly when it is shown.\n\t\t */\n\t\tconst features = `height=1,width=${menuWidth},left=0,top=0,opacity=1`;\n\n\t\t/**\n\t\t * Opens the window which will contain the menu contents. This looks like a browser window open\n\t\t * but actually opens an Electron window which FEA intercepts. FEA uses the `childWindowOptions`\n\t\t * json configuration to determine how to display the window. `childWindowOptions.show` should\n\t\t * be set to `false` otherwise a white window will flash prior to the menu being rendered.\n\t\t *\n\t\t *\n\t\t * The \"/component/toolbar/menu.html\" is just an empty page. It's necessary to reference a real page\n\t\t * rather than about:blank in order that the \"origin\" is correct for the page. Many CSS ui-assets such\n\t\t * as fonts and images are set with relative paths that require a correct origin.\n\t\t *\n\t\t * Note, we append the menu ID for automated testing. This allows Selenium to\n\t\t * uniquely identify each menu.\n\t\t */\n\t\tconst newWindow = window.open(`./menu.html#${thisMenuId}`, undefined, features);\n\t\tsetChildWindow(newWindow);\n\n\t\tif (newWindow) {\n\t\t\tconst onLoad = () => {\n\t\t\t\tinsertWindowContent({ newWindow, isAutoResizable, className, setElement, menuHeight });\n\t\t\t\tsetupEventForwarding(newWindow);\n\t\t\t\t/* Close window when a user clicks away.\n\t\t\t\t\tAre you wondering why not just close the window without calling\n\t\t\t\t\ttoggle? because we want to update the state in the store first\n\t\t\t\t\twhich will cause openMenuId to no longer match the shell id\n\t\t\t\t\tand eventually destroy this component which will cause the window\n\t\t\t\t\tto close (see cleanup function).\n\t\t\t\t*/\n\t\t\t\tnewWindow.addEventListener(\"blur\", blurMenu);\n\n\t\t\t\t// Attach MenuAutoResizer only if the menu doesn't have a fixed height\n\t\t\t\tif (isAutoResizable)\n\t\t\t\t\tmenuAutoResizer = new MenuAutoResizer(newWindow, thisMenuId, menuWidth, maxHeight, minHeight);\n\t\t\t};\n\t\t\tnewWindow.addEventListener(\"load\", onLoad, true);\n\t\t} else {\n\t\t\tFSBL.Clients.Logger.system.error(`MenuPortal error: window.open returned null for \"./menu.html#${thisMenuId}\"`);\n\t\t}\n\n\t\treturn () => {\n\t\t\t// imesner 20210406 childwindow and keyboardNavigation were both null but hadn't closed the window or released global hotkeys\n\t\t\tconst win = childWindow || menuAutoResizer?.childWindow;\n\t\t\tconst keyboardNav = keyboardNavigation || (win as any)?.keyboardNavigation;\n\n\t\t\tkeyboardNav?.detach();\n\n\t\t\tmenuAutoResizer?.disconnect();\n\t\t\twin?.close();\n\t\t\tsetChildWindow(null);\n\t\t};\n\t}, [blurMenu, className, menuWidth, menuHeight, maxHeight, thisMenuId]);\n};\n\n/**\n * Sets visibility, size and location of the window. This can be called numerous times\n * during the lifetime of the MenuPortal.\n */\nconst showHideResizeWindow = async ({\n\tchildWindow,\n\tkeyboardNavigation,\n\tshow,\n\tthisMenuId,\n\tmenuHeight,\n\tmaxHeight,\n\tminHeight,\n}: {\n\tchildWindow: Window;\n\tkeyboardNavigation: KeyboardNavigation | null;\n\tshow: boolean;\n\tthisMenuId: string;\n\tmenuHeight?: number;\n\tmaxHeight: number;\n\tminHeight: number;\n}) => {\n\tconst finWindow: FEA.FEAWindow = childWindow.fin.desktop.Window.getCurrent();\n\tif (show) {\n\t\tconst { left, top, height } = await calculateDimensions(childWindow, thisMenuId, menuHeight, maxHeight, minHeight);\n\n\t\tconst params: SpawnParams = {\n\t\t\tposition: \"absolute\",\n\t\t\tleft: left,\n\t\t\ttop: top,\n\t\t\theight: height,\n\t\t\tforceOntoMonitor: \"monitorRect\",\n\t\t};\n\n\t\tconst { name } = childWindow;\n\n\t\t/**\n\t\t * Use Finsemble to show the window. We might be tempted simply to use childWindow.moveTo() or childWindow.resizeTo()\n\t\t * but those commands limit the child window to a single monitor. We want to position the window relative to the\n\t\t * monitor on which the toolbar currently resides. showWindow() is monitor aware, so by using monitor=\"mine\" we can\n\t\t * ensure that the menu will always open on the same monitor as the toolbar. Since our toolbar has built in logic\n\t\t * to avoid straddling, we can be sure that the menu will never have to guess whether it exists on the left or right\n\t\t * side of the toolbar. Finally, showWindow() forces windows to open entirely on a monitor, so it will slide the\n\t\t * menu to the left or right as necessary to prevent it from straddling.\n\t\t */\n\t\tFSBL.Clients.LauncherClient.showWindow({ windowName: name }, params);\n\n\t\t// Ensures that the menu has keyboard focus for accessibility\n\t\tfinWindow.focus();\n\n\t\t// Ensures that the menu is positioned above any other windows that have setAlwaysOnTop flagged\n\t\tFSBL.FinsembleWindow.getInstance({ name: name }, (e: any, fsblWindow: any) => {\n\t\t\tfsblWindow.setAlwaysOnTop({ alwaysOnTop: true });\n\t\t});\n\n\t\tif (keyboardNavigation) {\n\t\t\t// Why??\n\t\t\t(childWindow as any).keyboardNavigation = keyboardNavigation;\n\t\t\tkeyboardNavigation.attach();\n\t\t}\n\t} else {\n\t\tconst { name } = childWindow;\n\t\tFSBL.FinsembleWindow.getInstance({ name: name }, (e: any, fsblWindow: any) => {\n\t\t\tfsblWindow.setAlwaysOnTop({ alwaysOnTop: false });\n\t\t});\n\n\t\tfinWindow.hide();\n\t\tif (keyboardNavigation) keyboardNavigation.detach();\n\t}\n};\n\nexport const MenuPortal: React.FunctionComponent<{\n\tshow: boolean;\n}> = ({ show, children }) => {\n\tconst { thisMenuId, menuHeight, maxHeight, minHeight } = useContext(MenuContext);\n\n\t// Container div for React portal\n\tconst [element, setElement] = useState<HTMLElement>();\n\tconst [childWindow, setChildWindow] = useState<Window | null>(null);\n\n\t/**\n\t * KeyboardNavigation registers global hotkeys for navigating through a menu with cursor keys.\n\t * Those hotkeys are registered/unregistered based on visibility of the child window.\n\t * The KeyboardNavigation class is a singleton and so is memoized. It is created when the child window is available.\n\t */\n\tconst keyboardNavigation = useMemo(() => {\n\t\tif (childWindow) return new KeyboardNavigation(childWindow, \".menu-item\");\n\t\telse return null;\n\t}, [childWindow]);\n\n\t/**\n\t * Show and hide window. This effect will run whenever the `show` prop changes,\n\t * generally initiated by a click to <MenuToggle>.\n\t */\n\tuseEffect(() => {\n\t\t// If child window isn't yet initialized then no-op\n\t\tif (!childWindow) return;\n\n\t\tshowHideResizeWindow({ childWindow, keyboardNavigation, show, thisMenuId, menuHeight, maxHeight, minHeight });\n\t\treturn () => {};\n\t}, [show]);\n\n\t// Create the dropdown. (if MenuContext changes then the dropdown will be removed and recreated).\n\tuseCreateDropdown({ keyboardNavigation, childWindow, setElement, setChildWindow });\n\n\t// We should only return a react portal when window is ready\n\t// and container div appended to its body\n\t// See Dan abramov comment about this at:\n\t// https://github.com/facebook/react/issues/12355#issuecomment-410996235\n\treturn element ? ReactDOM.createPortal(children, element) : null;\n};\n"]}
1
+ {"version":3,"file":"MenuPortal.js","sourceRoot":"","sources":["../../../src/components/menu/MenuPortal.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { MenuContext } from \"./menuContext\";\nimport { calculateDimensions, injectCSS } from \"./menuHelpers\";\nimport { KeyboardNavigation } from \"./keyboardNavigation\";\nimport { MenuAutoResizer } from \"./MenuAutoResizer\";\nimport { useState, useEffect, useContext, useMemo } from \"react\";\nimport { useMenu } from \"../../hooks/useMenu\";\nimport { services, FEA } from \"@finsemble/finsemble-api\";\n\ntype SpawnParams = services.window.types.SpawnParams;\n\n/**\n * Proxy/fake events are needed because when `document.addEventListener` is used inside a component\n * that is rendered inside react portal, `document` will refer to the toolbar's document instead\n * of the childWindow's document. Clicking inside a portal will not therefore capture those events.\n *\n * This code intercepts these events inside the portal and then forwards them to the parent (toolbar).\n */\nconst setupEventForwarding = (newWindow: Window) => {\n\t[\"mouseDown\", \"click\", \"mouseUp\"].forEach((eventName) => {\n\t\tnewWindow.document.addEventListener(eventName, (event) => {\n\t\t\tdocument.dispatchEvent(\n\t\t\t\tnew CustomEvent(`portal:${eventName}`, {\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\t// Devs may need access to the x and y of the cursor\n\t\t\t\t\t\tmouseEvent: new MouseEvent(eventName, event),\n\t\t\t\t\t\t// And possibly the target element\n\t\t\t\t\t\ttarget: event.target,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t);\n\t\t});\n\t});\n\n\t/**\n\t * Proxies keyboard events from the portal up into the parent window.\n\t * instead of e.key, you'll need to access e.detail.key.\n\t */\n\t[\"keyup\", \"keydown\", \"keypress\"].forEach((eventName) => {\n\t\tnewWindow?.document.addEventListener(eventName, (event) => {\n\t\t\tdocument.dispatchEvent(\n\t\t\t\tnew CustomEvent(`portal:${eventName}`, {\n\t\t\t\t\tdetail: new KeyboardEvent(event.type, event),\n\t\t\t\t})\n\t\t\t);\n\t\t});\n\t});\n};\n\n/**\n * The window (opened by window.open) is an empty html document.\n * This function creates a containerDiv for the parent to insert its\n * React DOM. That containerDiv is set through the `setElement()` method\n * which must be passed in.\n *\n * This function also does portal housekeeping such as transferring CSS and window\n * events.\n */\nconst insertWindowContent = ({\n\tnewWindow,\n\tisAutoResizable,\n\tclassName,\n\tsetElement,\n\tmenuHeight,\n}: {\n\tnewWindow: Window;\n\tisAutoResizable: boolean;\n\tclassName?: string;\n\tmenuHeight?: number;\n\tsetElement: React.Dispatch<React.SetStateAction<HTMLElement | undefined>>;\n}) => {\n\t// Set the child window's <html> tag to class \"menu-portal\" for scrollbar styling\n\tnewWindow.document.documentElement.className = \"menu-portal\";\n\tif (isAutoResizable) newWindow.document.body.setAttribute(\"resizing\", \"true\");\n\n\t// Create the element which will hold our react elements and then append it into the child window's body.\n\tconst containerDiv: HTMLElement = document.createElement(\"div\");\n\tnewWindow.document.body.appendChild(containerDiv);\n\n\t// The className that was passed to MenuShell is added to the child window's <body>\n\tclassName?.split(\" \").forEach((name: string) => newWindow!.document.body.classList.add(name));\n\n\t// This will update local state which will cause the parent React Functional Component\n\t// to return a react portal. See comments at the end of this file.\n\tsetElement(containerDiv);\n\n\t// Inject css into the child window's <head>\n\tinjectCSS(newWindow);\n\n\t// THE FOLLOWING IS LIKELY DEPRECATED BUT KEEPING JUST IN CASE\n\t// Place height on the portal.\n\t// inside of the portal, window.outerHeight === 39 (toolbar height).\n\t// Knowing the height of the window is important because some menus use that\n\t// information to force overflow on certain sections of the menu.\n\t(newWindow as any).portalHeight = menuHeight;\n};\n\n/**\n * React hook to create a drop down menu. This hook creates a new window using window.open\n * and assigns it as the childWindow to the MenuPortal. It then uses insertWindowContent()\n * to establish the React/DOM connection with the parent (e.g. Toolbar).\n */\nconst useCreateDropdown = ({\n\tkeyboardNavigation,\n\tsetElement,\n\tchildWindow,\n\tsetChildWindow,\n}: {\n\tkeyboardNavigation: KeyboardNavigation | null;\n\tsetElement: React.Dispatch<React.SetStateAction<HTMLElement | undefined>>;\n\tchildWindow: Window | null;\n\tsetChildWindow: React.Dispatch<React.SetStateAction<Window | null>>;\n}) => {\n\tconst { thisMenuId, menuWidth, menuHeight, className, maxHeight, minHeight } = useContext(MenuContext);\n\tconst { blurMenu } = useMenu();\n\tconst isAutoResizable = !menuHeight;\n\n\t/**\n\t * Initialize the window. This should only run once though it is possible\n\t * to run multiple times if MenuContext changes.\n\t */\n\tuseEffect(() => {\n\t\tlet menuAutoResizer: any = null;\n\n\t\t/**\n\t\t * Initial size and location of the menu is irrelevant because it is hidden.\n\t\t * The menu will be resized and positioned correctly when it is shown.\n\t\t */\n\t\tconst features = `height=1,width=${menuWidth},left=0,top=0,opacity=1`;\n\n\t\t/**\n\t\t * Opens the window which will contain the menu contents. This looks like a browser window open\n\t\t * but actually opens an Electron window which FEA intercepts. FEA uses the `childWindowOptions`\n\t\t * json configuration to determine how to display the window. `childWindowOptions.show` should\n\t\t * be set to `false` otherwise a white window will flash prior to the menu being rendered.\n\t\t *\n\t\t *\n\t\t * The \"/component/toolbar/menu.html\" is just an empty page. It's necessary to reference a real page\n\t\t * rather than about:blank in order that the \"origin\" is correct for the page. Many CSS ui-assets such\n\t\t * as fonts and images are set with relative paths that require a correct origin.\n\t\t *\n\t\t * Note, we append the menu ID for automated testing. This allows Selenium to\n\t\t * uniquely identify each menu.\n\t\t */\n\t\tconst newWindow = window.open(`./menu.html#${thisMenuId}`, undefined, features);\n\t\tsetChildWindow(newWindow);\n\n\t\tif (newWindow) {\n\t\t\tconst onLoad = () => {\n\t\t\t\tinsertWindowContent({ newWindow, isAutoResizable, className, setElement, menuHeight });\n\t\t\t\tsetupEventForwarding(newWindow);\n\t\t\t\t/* Close window when a user clicks away.\n\t\t\t\t\tAre you wondering why not just close the window without calling\n\t\t\t\t\ttoggle? because we want to update the state in the store first\n\t\t\t\t\twhich will cause openMenuId to no longer match the shell id\n\t\t\t\t\tand eventually destroy this component which will cause the window\n\t\t\t\t\tto close (see cleanup function).\n\t\t\t\t*/\n\t\t\t\tnewWindow.addEventListener(\"blur\", blurMenu);\n\n\t\t\t\t// Attach MenuAutoResizer only if the menu doesn't have a fixed height\n\t\t\t\tif (isAutoResizable)\n\t\t\t\t\tmenuAutoResizer = new MenuAutoResizer(newWindow, thisMenuId, menuWidth, maxHeight, minHeight);\n\t\t\t};\n\t\t\tnewWindow.addEventListener(\"load\", onLoad, true);\n\t\t} else {\n\t\t\tFSBL.Clients.Logger.system.error(`MenuPortal error: window.open returned null for \"./menu.html#${thisMenuId}\"`);\n\t\t}\n\n\t\treturn () => {\n\t\t\t// imesner 20210406 childwindow and keyboardNavigation were both null but hadn't closed the window or released global hotkeys\n\t\t\tconst win = childWindow || menuAutoResizer?.childWindow;\n\t\t\tconst keyboardNav = keyboardNavigation || (win as any)?.keyboardNavigation;\n\n\t\t\tkeyboardNav?.detach();\n\n\t\t\tmenuAutoResizer?.disconnect();\n\t\t\twin?.close();\n\t\t\tsetChildWindow(null);\n\t\t};\n\t}, [blurMenu, className, menuWidth, menuHeight, maxHeight, thisMenuId]);\n};\n\n/**\n * Sets visibility, size and location of the window. This can be called numerous times\n * during the lifetime of the MenuPortal.\n */\nconst showHideResizeWindow = async ({\n\tchildWindow,\n\tkeyboardNavigation,\n\tshow,\n\tthisMenuId,\n\tmenuHeight,\n\tmaxHeight,\n\tminHeight,\n}: {\n\tchildWindow: Window;\n\tkeyboardNavigation: KeyboardNavigation | null;\n\tshow: boolean;\n\tthisMenuId: string;\n\tmenuHeight?: number;\n\tmaxHeight: number;\n\tminHeight: number;\n}) => {\n\tconst finWindow: FEA.FEAWindow = childWindow.fin.desktop.Window.getCurrent();\n\tif (show) {\n\t\tconst { left, top, height } = await calculateDimensions(childWindow, thisMenuId, menuHeight, maxHeight, minHeight);\n\n\t\tconst params: SpawnParams = {\n\t\t\tposition: \"absolute\",\n\t\t\tleft: left,\n\t\t\ttop: top,\n\t\t\theight: height,\n\t\t\tforceOntoMonitor: \"monitorRect\",\n\t\t};\n\n\t\tconst { name } = childWindow;\n\n\t\t/**\n\t\t * Use Finsemble to show the window. We might be tempted simply to use childWindow.moveTo() or childWindow.resizeTo()\n\t\t * but those commands limit the child window to a single monitor. We want to position the window relative to the\n\t\t * monitor on which the toolbar currently resides. showWindow() is monitor aware, so by using monitor=\"mine\" we can\n\t\t * ensure that the menu will always open on the same monitor as the toolbar. Since our toolbar has built in logic\n\t\t * to avoid straddling, we can be sure that the menu will never have to guess whether it exists on the left or right\n\t\t * side of the toolbar. Finally, showWindow() forces windows to open entirely on a monitor, so it will slide the\n\t\t * menu to the left or right as necessary to prevent it from straddling.\n\t\t */\n\t\tFSBL.Clients.LauncherClient.showWindow({ windowName: name }, params);\n\n\t\t// Ensures that the menu has keyboard focus for accessibility\n\t\tfinWindow.focus();\n\n\t\t// Ensures that the menu is positioned above any other windows that have setAlwaysOnTop flagged\n\t\tFSBL.FinsembleWindow.getInstance({ name: name }, (e: any, fsblWindow: any) => {\n\t\t\tfsblWindow.setAlwaysOnTop({ alwaysOnTop: true });\n\t\t});\n\n\t\tif (keyboardNavigation) {\n\t\t\t// Why??\n\t\t\t(childWindow as any).keyboardNavigation = keyboardNavigation;\n\t\t\tkeyboardNavigation.attach();\n\t\t}\n\t} else {\n\t\tconst { name } = childWindow;\n\t\tFSBL.FinsembleWindow.getInstance({ name: name }, (e: any, fsblWindow: any) => {\n\t\t\tfsblWindow.setAlwaysOnTop({ alwaysOnTop: false });\n\t\t});\n\n\t\tfinWindow.hide();\n\t\tif (keyboardNavigation) keyboardNavigation.detach();\n\t}\n};\n\n/**\n * Closes the menu portal if the menu button is removed from the toolbar\n *\n * @param {Node} element - HTML element to observe\n *\n */\nconst closePortal = (element: Node) => {\n\tconst { closeMenu } = useMenu();\n\n\tconst options = {\n\t\tchildList: true,\n\t\tsubtree: true,\n\t};\n\n\t/**\n\t * MutationObserver interface provides the ability to watch for\n\t * changes to the DOM tree using the observe method\n\t */\n\tconst mutationObserver = new MutationObserver((mutations) => {\n\t\tmutations.forEach((mutation) => {\n\t\t\tif (mutation.removedNodes?.length) closeMenu();\n\n\t\t\t// stops the MutationObserver from receiving notification from observer\n\t\t\tmutationObserver.disconnect();\n\t\t});\n\t});\n\n\t// watches for DOM changes\n\tmutationObserver.observe(element, options);\n};\n\nexport const MenuPortal: React.FunctionComponent<{\n\tshow: boolean;\n}> = ({ show, children }) => {\n\tconst { thisMenuId, menuHeight, maxHeight, minHeight } = useContext(MenuContext);\n\n\t// Container div for React portal\n\tconst [element, setElement] = useState<HTMLElement>();\n\tconst [childWindow, setChildWindow] = useState<Window | null>(null);\n\n\t/**\n\t * KeyboardNavigation registers global hotkeys for navigating through a menu with cursor keys.\n\t * Those hotkeys are registered/unregistered based on visibility of the child window.\n\t * The KeyboardNavigation class is a singleton and so is memoized. It is created when the child window is available.\n\t */\n\tconst keyboardNavigation = useMemo(() => {\n\t\tif (childWindow) return new KeyboardNavigation(childWindow, \".menu-item\");\n\t\telse return null;\n\t}, [childWindow]);\n\n\t/**\n\t * Show and hide window. This effect will run whenever the `show` prop changes,\n\t * generally initiated by a click to <MenuToggle>.\n\t */\n\tuseEffect(() => {\n\t\t// If child window isn't yet initialized then no-op\n\t\tif (!childWindow) return;\n\n\t\tshowHideResizeWindow({ childWindow, keyboardNavigation, show, thisMenuId, menuHeight, maxHeight, minHeight });\n\t\treturn () => {};\n\t}, [show]);\n\n\t// Create the dropdown. (if MenuContext changes then the dropdown will be removed and recreated).\n\tuseCreateDropdown({ keyboardNavigation, childWindow, setElement, setChildWindow });\n\n\tconst toolbar = document.getElementById(\"Toolbar-tsx\");\n\n\tif (toolbar) closePortal(toolbar);\n\n\t// We should only return a react portal when window is ready\n\t// and container div appended to its body\n\t// See Dan abramov comment about this at:\n\t// https://github.com/facebook/react/issues/12355#issuecomment-410996235\n\treturn element ? ReactDOM.createPortal(children, element) : null;\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationsCenter.js","sourceRoot":"","sources":["../../../../../src/components/notifications/components/notificationsCenter/NotificationsCenter.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { CSSTransition } from \"react-transition-group\";\nimport ConditionalWrapper from \"../../../shared/ConditionalWrapper\";\n\nimport { ViewMode, SelectionMode } from \"../../constants\";\n\nimport \"../../../../assets/css/notificationsCenter.css\";\n\n// Hooks\nimport useNotifications, {\n\tuseNotificationUI,\n\tgetNotificationConfig,\n\tmoveToToolbarMonitor,\n\tgetOS,\n\tgetFetchHistoryParams,\n} from \"../../../../hooks/useNotifications\";\n\n// Context\nimport { NotificationsContext } from \"../../notificationsContext\";\n\n// Types\nimport { INotificationCenterProps, NotificationCenterControlsProps, NotificationsContextType } from \"../../types\";\n\n// Components\nimport CardView from \"../views/CardView\";\nimport Drawer from \"../drawer/Drawer\";\nimport DrawerControls from \"../drawer/DrawerControls\";\nimport DrawerHeader from \"../drawer/DrawerHeader\";\nimport ListView from \"../views/ListView\";\nimport NotificationDetailsView from \"../views/NotificationDetailsView\";\nimport { services } from \"@finsemble/finsemble-core\";\n\nimport FloatingFocus from \"@q42/floating-focus-a11y\";\n// The package FloatingFocus injects a focus indicator that moves around the page, but only for\n// keyboard users. (Mouse users don't see the indicator.) All that needs to be done is to envoke it.\nnew FloatingFocus();\n// If you want to make changes to the indicator, the styles are being maintained in assets/css/focus.css\n\ntype INotification = services.notification.types.INotification;\ntype IMuteFilter = services.notification.types.IMuteFilter;\n\nconst defaultControls: NotificationCenterControlsProps = {\n\tcontrols: [\n\t\t{\n\t\t\taction: \"all\",\n\t\t\tlabel: \"All\",\n\t\t\trun: (notifications: INotification[]) => notifications,\n\t\t},\n\t\t{\n\t\t\taction: \"unread\",\n\t\t\tlabel: \"Unread\",\n\t\t\trun: (notifications: INotification[]) =>\n\t\t\t\tnotifications.filter((notification: INotification) => !notification.isRead),\n\t\t},\n\t\t{\n\t\t\taction: \"read\",\n\t\t\tlabel: \"Read\",\n\t\t\trun: (notifications: INotification[]) =>\n\t\t\t\tnotifications.filter((notification: INotification) => notification.isRead),\n\t\t},\n\t\t{\n\t\t\taction: \"snoozed\",\n\t\t\tlabel: \"Snoozed\",\n\t\t\trun: (notifications: INotification[]) =>\n\t\t\t\tnotifications.filter((notification: INotification) => notification.isSnoozed),\n\t\t},\n\t],\n\tactive: \"all\",\n};\n\nconst addPoppedInClasses = () => {\n\tdocument.getElementById(\"notifications-center-container\")?.classList.add(\"notifications-popped-in\");\n\tdocument.getElementById(\"FSBLHeader\")?.classList.add(\"notifications-popped-in\");\n};\n\nconst removePoppedInClasses = () => {\n\tdocument.getElementById(\"notifications-center-container\")?.classList.remove(\"notifications-popped-in\");\n\tdocument.getElementById(\"FSBLHeader\")?.classList.remove(\"notifications-popped-in\");\n};\n\nconst storeNotificationsCenterWindowPosition = ({ showCenter, poppedOut, position }: any) => {\n\tFSBL.Clients.StorageClient.save({\n\t\ttopic: \"finsemble.notifications\",\n\t\tkey: \"last.position\",\n\t\tvalue: {\n\t\t\tshowCenter,\n\t\t\tpoppedOut,\n\t\t\tposition,\n\t\t},\n\t});\n};\n\nconst setShowWindowForState = (centerState: any) => {\n\tif (centerState.showCenter) {\n\t\tfinsembleWindow.show({}, () => {\n\t\t\tfinsembleWindow.bringToFront();\n\t\t});\n\t}\n\n\tif (centerState.position) {\n\t\tfinsembleWindow.setBounds(centerState.position);\n\t}\n\n\t// Always on top when popped in\n\tFSBL.Clients.WindowClient.setAlwaysOnTop(!centerState.poppedOut);\n\tstoreNotificationsCenterWindowPosition(centerState);\n};\n\nconst isValidPosition = (bounds: any): boolean =>\n\tbounds &&\n\ttypeof bounds.left !== \"undefined\" &&\n\ttypeof bounds.top !== \"undefined\" &&\n\ttypeof bounds.height !== \"undefined\" &&\n\ttypeof bounds.width !== \"undefined\";\n\nconst LAZY_LOAD_NO_MORE_PAGES = -1;\n\nexport const NotificationsCenter: React.FunctionComponent<INotificationCenterProps> = (props) => {\n\tconst params = { config: { notificationsHistory: { options: { pageSize: 10 } } } };\n\tconst { notifications, setOpaqueClassName, addNotification } = useNotifications(params);\n\tconst [uiState, setUIState] = useNotificationUI();\n\n\tconst config = getNotificationConfig();\n\tconst [isInitialized, setInitialized] = useState(false);\n\tconst [isMac] = useState(getOS() === \"Mac\");\n\tconst nextPageToFetch = useRef(1);\n\n\t// Set up references for use in callbacks to FSBL functions\n\tconst showCenterRef = useRef(false);\n\tconst poppedOutRef = useRef(false);\n\tconst subscriptionMessageRef = useRef<any>({});\n\tconst applicationState = useRef(null);\n\n\tconst checkedNotifications: INotification[] = [];\n\n\tconst [searchString, setSearchString] = useState(\"\");\n\tconst [filteredNotifications, setFilteredNotifications] = useState([...notifications]);\n\tconst [viewMode, setViewMode] = useState<ViewMode>(ViewMode.CARD);\n\tconst [selectionMode, setSelectionMode] = useState<SelectionMode>(SelectionMode.NO_SELECTION);\n\tconst [selectedNotification, setSelectedNotification] = useState<INotification | null>(null);\n\tconst [muteFilters, setMuteFilters] = useState<IMuteFilter[]>([]);\n\tconst [reloadMuteFilters, setReloadMuteFilters] = useState(true);\n\n\tconst dcp: NotificationCenterControlsProps = props.controls ? props.controls : defaultControls;\n\n\tconst [drawerControlProps, setDrawerControlProps] = useState(dcp);\n\tconst notificationsContextValues: NotificationsContextType = {\n\t\tviewMode,\n\t\tsetViewMode,\n\t\tselectionMode,\n\t\tsetSelectionMode,\n\t\tdrawerControlProps,\n\t\tsetDrawerControlProps,\n\t\tselectedNotification,\n\t\tsetSelectedNotification,\n\t\tsearchString,\n\t\tsetSearchString,\n\t\tfilteredNotifications,\n\t\tcheckedNotifications,\n\t\tsetFilteredNotifications,\n\t\tmuteFilters,\n\t\tsetMuteFilters,\n\t};\n\n\tconst togglePoppedStatus = () => {\n\t\tconst poppedOut = !uiState.poppedOut;\n\t\tpoppedOutRef.current = poppedOut;\n\t\tsetUIState({\n\t\t\t...uiState,\n\t\t\tpoppedOut,\n\t\t});\n\t};\n\n\tconst setFullHeight = async (monitorInfo?: any) => {\n\t\tif (!monitorInfo) {\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tfinsembleWindow.getMonitor((monitor: any) => {\n\t\t\t\t\tmonitorInfo = monitor;\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tconst { data } = await finsembleWindow.getBounds();\n\t\tif (data) {\n\t\t\tconst centerWindowPosition = {\n\t\t\t\tleft: monitorInfo.availableRect.right - data.width,\n\t\t\t\ttop: monitorInfo.availableRect.top,\n\t\t\t\theight: monitorInfo.availableRect.height,\n\t\t\t\twidth: data.width,\n\t\t\t};\n\n\t\t\tsetShowWindowForState({\n\t\t\t\tshowCenter: uiState.showCenter,\n\t\t\t\tpoppedOut: poppedOutRef.current,\n\t\t\t\tposition: centerWindowPosition,\n\t\t\t});\n\n\t\t\tfinsembleWindow.setShape([]);\n\t\t}\n\t};\n\n\tconst boundsChangeListener = (event: any) => {\n\t\tif (showCenterRef?.current && !poppedOutRef.current) {\n\t\t\t// Bounds Changed fires when Windows Taskbar + Finsemble Toolbar docking changes\n\t\t\tsetFullHeight();\n\t\t}\n\t\tconst position = {\n\t\t\ttop: event.data.top,\n\t\t\tleft: event.data.left,\n\t\t\theight: event.data.height,\n\t\t\twidth: event.data.width,\n\t\t};\n\n\t\tstoreNotificationsCenterWindowPosition({\n\t\t\tshowCenter: showCenterRef?.current ? showCenterRef.current : false,\n\t\t\tpoppedOut: poppedOutRef.current,\n\t\t\tposition,\n\t\t});\n\t};\n\n\tconst getScrollPercentage = () => {\n\t\tconst maxScroll = document.body.scrollHeight;\n\t\tconst currentScroll = window.innerHeight + window.scrollY;\n\t\treturn currentScroll / maxScroll;\n\t};\n\n\tconst lazyLoadNextPage = async () =>\n\t\tnew Promise<void>(async (resolve) => {\n\t\t\tif (nextPageToFetch.current > 0) {\n\t\t\t\tconst [options, filter] = getFetchHistoryParams(config, params);\n\t\t\t\toptions.pageNumber = nextPageToFetch.current;\n\t\t\t\tconst notificationList = await FSBL.Clients.NotificationClient.fetchHistory(options, filter);\n\t\t\t\tif (notificationList.length) {\n\t\t\t\t\tnextPageToFetch.current = nextPageToFetch.current + 1;\n\t\t\t\t\tfor (const notification of notificationList) {\n\t\t\t\t\t\taddNotification(notification);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Stop fetching after this one\n\t\t\t\t\tnextPageToFetch.current = LAZY_LOAD_NO_MORE_PAGES;\n\t\t\t\t}\n\t\t\t}\n\t\t\tresolve();\n\t\t});\n\n\tconst toggleCenter = async (show: boolean, isTransparent: boolean, poppedOut: boolean) => {\n\t\tif (isTransparent && !isMac) {\n\t\t\tif (poppedOut) {\n\t\t\t\tif (show) {\n\t\t\t\t\tfinsembleWindow.show({}, () => {\n\t\t\t\t\t\tfinsembleWindow.bringToFront();\n\t\t\t\t\t\tfinsembleWindow.setShape([]);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tfinsembleWindow.hide();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (show) {\n\t\t\t\t\tawait moveToToolbarMonitor();\n\t\t\t\t\tawait setFullHeight();\n\t\t\t\t\tfinsembleWindow.show({}, () => {\n\t\t\t\t\t\tfinsembleWindow.bringToFront();\n\t\t\t\t\t\tfinsembleWindow.setShape([]);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tfinsembleWindow.setShape([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]);\n\t\t\t\t\t\tfinsembleWindow.hide();\n\t\t\t\t\t}, 500);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (show) {\n\t\t\t\tif (!poppedOut) {\n\t\t\t\t\tawait moveToToolbarMonitor();\n\t\t\t\t\tawait setFullHeight();\n\t\t\t\t}\n\t\t\t\tfinsembleWindow.show({}, () => {\n\t\t\t\t\tfinsembleWindow.bringToFront();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfinsembleWindow.hide();\n\t\t\t}\n\t\t}\n\t};\n\n\t// When popped out we want to prevent the center to be closed when the close button is clicked (or alt +)\n\tuseEffect(() => {\n\t\tsetOpaqueClassName(!config.isTransparent);\n\n\t\tconst subscriptionId = FSBL.Clients.RouterClient.subscribe(\"Finsemble.Application.State\", (err, response) => {\n\t\t\tapplicationState.current = response.data.state;\n\t\t});\n\n\t\tconst hide = (event: any) => {\n\t\t\tconst publishValue = { ...subscriptionMessageRef.current };\n\t\t\tpublishValue[\"showCenter\"] = false;\n\t\t\tsetUIState(publishValue);\n\t\t\tif (applicationState?.current !== \"closing\") {\n\t\t\t\ttry {\n\t\t\t\t\tevent.cancel();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tFSBL.Clients.Logger.system.error(\"Error cancelling the window close event\", error);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst scrollHandler = () => {\n\t\t\tif (getScrollPercentage() > 0.9) {\n\t\t\t\tlazyLoadNextPage();\n\t\t\t}\n\t\t};\n\n\t\tfinsembleWindow.addEventListener(\"close-requested\", hide);\n\t\tfinsembleWindow.addEventListener(\"bounds-change-end\", boundsChangeListener);\n\t\twindow.addEventListener(\"scroll\", scrollHandler);\n\t\treturn () => {\n\t\t\tFSBL.Clients.RouterClient.unsubscribe(subscriptionId);\n\t\t\tfinsembleWindow.removeEventListener(\"close-requested\", hide);\n\t\t\tfinsembleWindow.removeEventListener(\"bounds-change-end\", boundsChangeListener);\n\t\t\twindow.removeEventListener(\"scroll\", scrollHandler);\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst recursiveLoad = async () => {\n\t\t\t// Cater for the case where there is no scroll bar to trigger lazy load - keep loading until scrollbar or no pages\n\t\t\tawait lazyLoadNextPage();\n\t\t\tif (getScrollPercentage() === 1 && nextPageToFetch.current != LAZY_LOAD_NO_MORE_PAGES) {\n\t\t\t\trecursiveLoad();\n\t\t\t}\n\t\t};\n\n\t\trecursiveLoad();\n\t}, [viewMode, drawerControlProps.active]);\n\n\t// Hook to set up the center state from service data on component start\n\tuseEffect(() => {\n\t\tsubscriptionMessageRef.current = uiState;\n\t\t// Hook can execute before initial pubsub response - waiting for actual values\n\t\tif (!isInitialized && typeof uiState.showCenter !== \"undefined\") {\n\t\t\tif (uiState.poppedOut) {\n\t\t\t\tremovePoppedInClasses();\n\t\t\t} else {\n\t\t\t\taddPoppedInClasses();\n\t\t\t}\n\n\t\t\tif (isValidPosition(uiState.position)) {\n\t\t\t\tsetShowWindowForState({\n\t\t\t\t\tshowCenter: uiState.showCenter,\n\t\t\t\t\tpoppedOut: uiState.poppedOut,\n\t\t\t\t\tposition: uiState.position,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Setup references\n\t\t\tshowCenterRef.current = uiState.showCenter;\n\t\t\tpoppedOutRef.current = uiState.poppedOut;\n\n\t\t\tsetInitialized(true);\n\t\t}\n\t}, [uiState]);\n\n\t// Effect to run when we pop-in or pop-out the notification center\n\tuseEffect(() => {\n\t\tif (isInitialized) {\n\t\t\tpoppedOutRef.current = uiState.poppedOut;\n\t\t\tfinsembleWindow.getMonitor(async (monitorInfo: any) => {\n\t\t\t\tif (uiState.poppedOut) {\n\t\t\t\t\tconst { data } = await finsembleWindow.getBounds();\n\t\t\t\t\tremovePoppedInClasses();\n\n\t\t\t\t\tif (data) {\n\t\t\t\t\t\tconst centerWindowPosition = {\n\t\t\t\t\t\t\tleft: data.left - 25,\n\t\t\t\t\t\t\ttop: data.top + 25,\n\t\t\t\t\t\t\theight: Math.round(monitorInfo.availableRect.height * 0.8),\n\t\t\t\t\t\t\twidth: data.width,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tsetShowWindowForState({\n\t\t\t\t\t\t\tshowCenter: uiState.showCenter,\n\t\t\t\t\t\t\tpoppedOut: uiState.poppedOut,\n\t\t\t\t\t\t\tposition: centerWindowPosition,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\taddPoppedInClasses();\n\t\t\t\t\tsetFullHeight(monitorInfo);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}, [uiState.poppedOut]);\n\n\tuseEffect(() => {\n\t\tif (isInitialized) {\n\t\t\tshowCenterRef.current = uiState.showCenter;\n\t\t\ttoggleCenter(uiState.showCenter, config.isTransparent as boolean, poppedOutRef.current);\n\t\t}\n\t}, [uiState.showCenter]);\n\n\tuseEffect(() => {\n\t\tsetFilteredNotifications([...notifications]);\n\t}, [notifications]);\n\n\tuseEffect(() => {\n\t\tfunction listenMuteStateChanged(error: any) {\n\t\t\tif (error) {\n\t\t\t\tconsole.error(\"FinsembleNotificationsMuteStateChannel: \", error);\n\t\t\t} else {\n\t\t\t\tsetReloadMuteFilters(true);\n\t\t\t}\n\t\t}\n\t\tFSBL.Clients.RouterClient.addListener(\"FinsembleNotificationsMuteStateChannel\", listenMuteStateChanged);\n\t\treturn () => {\n\t\t\tFSBL.Clients.RouterClient.removeListener(\"FinsembleNotificationsMuteStateChannel\", listenMuteStateChanged);\n\t\t};\n\t}, []);\n\n\t// Sets the current active mute filters\n\tuseEffect(() => {\n\t\tasync function loadMuteFilter() {\n\t\t\treturn await FSBL.Clients.NotificationClient.getMuteFilters();\n\t\t}\n\n\t\tloadMuteFilter().then((loadedMuteFilters: IMuteFilter[]) => {\n\t\t\tsetMuteFilters(loadedMuteFilters);\n\t\t\tsetReloadMuteFilters(false);\n\t\t});\n\t}, [reloadMuteFilters]);\n\n\tconst notificationsMainView = () => (\n\t\t<>\n\t\t\t<DrawerHeader poppedOutStatus={uiState.poppedOut} popOutToggle={togglePoppedStatus} />\n\t\t\t<DrawerControls />\n\t\t\t<div className=\"cards-container\">\n\t\t\t\t{viewMode === ViewMode.CARD ? (\n\t\t\t\t\t<CardView notifications={notifications} notificationCard={props.notificationCard} />\n\t\t\t\t) : (\n\t\t\t\t\t<ListView\n\t\t\t\t\t\tnotifications={notifications}\n\t\t\t\t\t\tnotificationHeaderRow={props.notificationHeaderRow}\n\t\t\t\t\t\tnotificationListRow={props.notificationListRow}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n\n\tconst notificationDetailsViewComponent = () => <NotificationDetailsView notification={selectedNotification} />;\n\n\treturn (\n\t\t<ConditionalWrapper\n\t\t\tcondition={(config.isTransparent as boolean) && !uiState.poppedOut && !isMac}\n\t\t\twrapper={(children) => (\n\t\t\t\t<CSSTransition in={uiState.showCenter} timeout={500} classNames=\"drawer\" unmountOnExit>\n\t\t\t\t\t{children}\n\t\t\t\t</CSSTransition>\n\t\t\t)}\n\t\t>\n\t\t\t<NotificationsContext.Provider value={notificationsContextValues}>\n\t\t\t\t<Drawer classNames={uiState.poppedOut ? \"popped-out\" : \"\"}>\n\t\t\t\t\t{selectedNotification ? notificationDetailsViewComponent() : notificationsMainView()}\n\t\t\t\t</Drawer>\n\t\t\t</NotificationsContext.Provider>\n\t\t</ConditionalWrapper>\n\t);\n};\n"]}
1
+ {"version":3,"file":"NotificationsCenter.js","sourceRoot":"","sources":["../../../../../src/components/notifications/components/notificationsCenter/NotificationsCenter.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { CSSTransition } from \"react-transition-group\";\nimport ConditionalWrapper from \"../../../shared/ConditionalWrapper\";\n\nimport { ViewMode, SelectionMode } from \"../../constants\";\n\nimport \"../../../../assets/css/notificationsCenter.css\";\n\n// Hooks\nimport useNotifications, {\n\tuseNotificationUI,\n\tgetNotificationConfig,\n\tmoveToToolbarMonitor,\n\tgetOS,\n\tgetFetchHistoryParams,\n} from \"../../../../hooks/useNotifications\";\n\n// Context\nimport { NotificationsContext } from \"../../notificationsContext\";\n\n// Types\nimport { INotificationCenterProps, NotificationCenterControlsProps, NotificationsContextType } from \"../../types\";\n\n// Components\nimport CardView from \"../views/CardView\";\nimport Drawer from \"../drawer/Drawer\";\nimport DrawerControls from \"../drawer/DrawerControls\";\nimport DrawerHeader from \"../drawer/DrawerHeader\";\nimport ListView from \"../views/ListView\";\nimport NotificationDetailsView from \"../views/NotificationDetailsView\";\nimport { services } from \"@finsemble/finsemble-api\";\n\nimport FloatingFocus from \"@q42/floating-focus-a11y\";\n// The package FloatingFocus injects a focus indicator that moves around the page, but only for\n// keyboard users. (Mouse users don't see the indicator.) All that needs to be done is to envoke it.\nnew FloatingFocus();\n// If you want to make changes to the indicator, the styles are being maintained in assets/css/focus.css\n\ntype INotification = services.notification.types.INotification;\ntype IMuteFilter = services.notification.types.IMuteFilter;\n\nconst defaultControls: NotificationCenterControlsProps = {\n\tcontrols: [\n\t\t{\n\t\t\taction: \"all\",\n\t\t\tlabel: \"All\",\n\t\t\trun: (notifications: INotification[]) => notifications,\n\t\t},\n\t\t{\n\t\t\taction: \"unread\",\n\t\t\tlabel: \"Unread\",\n\t\t\trun: (notifications: INotification[]) =>\n\t\t\t\tnotifications.filter((notification: INotification) => !notification.isRead),\n\t\t},\n\t\t{\n\t\t\taction: \"read\",\n\t\t\tlabel: \"Read\",\n\t\t\trun: (notifications: INotification[]) =>\n\t\t\t\tnotifications.filter((notification: INotification) => notification.isRead),\n\t\t},\n\t\t{\n\t\t\taction: \"snoozed\",\n\t\t\tlabel: \"Snoozed\",\n\t\t\trun: (notifications: INotification[]) =>\n\t\t\t\tnotifications.filter((notification: INotification) => notification.isSnoozed),\n\t\t},\n\t],\n\tactive: \"all\",\n};\n\nconst addPoppedInClasses = () => {\n\tdocument.getElementById(\"notifications-center-container\")?.classList.add(\"notifications-popped-in\");\n\tdocument.getElementById(\"FSBLHeader\")?.classList.add(\"notifications-popped-in\");\n};\n\nconst removePoppedInClasses = () => {\n\tdocument.getElementById(\"notifications-center-container\")?.classList.remove(\"notifications-popped-in\");\n\tdocument.getElementById(\"FSBLHeader\")?.classList.remove(\"notifications-popped-in\");\n};\n\nconst storeNotificationsCenterWindowPosition = ({ showCenter, poppedOut, position }: any) => {\n\tFSBL.Clients.StorageClient.save({\n\t\ttopic: \"finsemble.notifications\",\n\t\tkey: \"last.position\",\n\t\tvalue: {\n\t\t\tshowCenter,\n\t\t\tpoppedOut,\n\t\t\tposition,\n\t\t},\n\t});\n};\n\nconst setShowWindowForState = (centerState: any) => {\n\tif (centerState.showCenter) {\n\t\tfinsembleWindow.show({}, () => {\n\t\t\tfinsembleWindow.bringToFront();\n\t\t});\n\t}\n\n\tif (centerState.position) {\n\t\tfinsembleWindow.setBounds(centerState.position);\n\t}\n\n\t// Always on top when popped in\n\tFSBL.Clients.WindowClient.setAlwaysOnTop(!centerState.poppedOut);\n\tstoreNotificationsCenterWindowPosition(centerState);\n};\n\nconst isValidPosition = (bounds: any): boolean =>\n\tbounds &&\n\ttypeof bounds.left !== \"undefined\" &&\n\ttypeof bounds.top !== \"undefined\" &&\n\ttypeof bounds.height !== \"undefined\" &&\n\ttypeof bounds.width !== \"undefined\";\n\nconst LAZY_LOAD_NO_MORE_PAGES = -1;\n\nexport const NotificationsCenter: React.FunctionComponent<INotificationCenterProps> = (props) => {\n\tconst params = { config: { notificationsHistory: { options: { pageSize: 10 } } } };\n\tconst { notifications, setOpaqueClassName, addNotification } = useNotifications(params);\n\tconst [uiState, setUIState] = useNotificationUI();\n\n\tconst config = getNotificationConfig();\n\tconst [isInitialized, setInitialized] = useState(false);\n\tconst [isMac] = useState(getOS() === \"Mac\");\n\tconst nextPageToFetch = useRef(1);\n\n\t// Set up references for use in callbacks to FSBL functions\n\tconst showCenterRef = useRef(false);\n\tconst poppedOutRef = useRef(false);\n\tconst subscriptionMessageRef = useRef<any>({});\n\tconst applicationState = useRef(null);\n\n\tconst checkedNotifications: INotification[] = [];\n\n\tconst [searchString, setSearchString] = useState(\"\");\n\tconst [filteredNotifications, setFilteredNotifications] = useState([...notifications]);\n\tconst [viewMode, setViewMode] = useState<ViewMode>(ViewMode.CARD);\n\tconst [selectionMode, setSelectionMode] = useState<SelectionMode>(SelectionMode.NO_SELECTION);\n\tconst [selectedNotification, setSelectedNotification] = useState<INotification | null>(null);\n\tconst [muteFilters, setMuteFilters] = useState<IMuteFilter[]>([]);\n\tconst [reloadMuteFilters, setReloadMuteFilters] = useState(true);\n\n\tconst dcp: NotificationCenterControlsProps = props.controls ? props.controls : defaultControls;\n\n\tconst [drawerControlProps, setDrawerControlProps] = useState(dcp);\n\tconst notificationsContextValues: NotificationsContextType = {\n\t\tviewMode,\n\t\tsetViewMode,\n\t\tselectionMode,\n\t\tsetSelectionMode,\n\t\tdrawerControlProps,\n\t\tsetDrawerControlProps,\n\t\tselectedNotification,\n\t\tsetSelectedNotification,\n\t\tsearchString,\n\t\tsetSearchString,\n\t\tfilteredNotifications,\n\t\tcheckedNotifications,\n\t\tsetFilteredNotifications,\n\t\tmuteFilters,\n\t\tsetMuteFilters,\n\t};\n\n\tconst togglePoppedStatus = () => {\n\t\tconst poppedOut = !uiState.poppedOut;\n\t\tpoppedOutRef.current = poppedOut;\n\t\tsetUIState({\n\t\t\t...uiState,\n\t\t\tpoppedOut,\n\t\t});\n\t};\n\n\tconst setFullHeight = async (monitorInfo?: any) => {\n\t\tif (!monitorInfo) {\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tfinsembleWindow.getMonitor((monitor: any) => {\n\t\t\t\t\tmonitorInfo = monitor;\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tconst { data } = await finsembleWindow.getBounds();\n\t\tif (data) {\n\t\t\tconst centerWindowPosition = {\n\t\t\t\tleft: monitorInfo.availableRect.right - data.width,\n\t\t\t\ttop: monitorInfo.availableRect.top,\n\t\t\t\theight: monitorInfo.availableRect.height,\n\t\t\t\twidth: data.width,\n\t\t\t};\n\n\t\t\tsetShowWindowForState({\n\t\t\t\tshowCenter: uiState.showCenter,\n\t\t\t\tpoppedOut: poppedOutRef.current,\n\t\t\t\tposition: centerWindowPosition,\n\t\t\t});\n\n\t\t\tfinsembleWindow.setShape([]);\n\t\t}\n\t};\n\n\tconst boundsChangeListener = (event: any) => {\n\t\tif (showCenterRef?.current && !poppedOutRef.current) {\n\t\t\t// Bounds Changed fires when Windows Taskbar + Finsemble Toolbar docking changes\n\t\t\tsetFullHeight();\n\t\t}\n\t\tconst position = {\n\t\t\ttop: event.data.top,\n\t\t\tleft: event.data.left,\n\t\t\theight: event.data.height,\n\t\t\twidth: event.data.width,\n\t\t};\n\n\t\tstoreNotificationsCenterWindowPosition({\n\t\t\tshowCenter: showCenterRef?.current ? showCenterRef.current : false,\n\t\t\tpoppedOut: poppedOutRef.current,\n\t\t\tposition,\n\t\t});\n\t};\n\n\tconst getScrollPercentage = () => {\n\t\tconst maxScroll = document.body.scrollHeight;\n\t\tconst currentScroll = window.innerHeight + window.scrollY;\n\t\treturn currentScroll / maxScroll;\n\t};\n\n\tconst lazyLoadNextPage = async () =>\n\t\tnew Promise<void>(async (resolve) => {\n\t\t\tif (nextPageToFetch.current > 0) {\n\t\t\t\tconst [options, filter] = getFetchHistoryParams(config, params);\n\t\t\t\toptions.pageNumber = nextPageToFetch.current;\n\t\t\t\tconst notificationList = await FSBL.Clients.NotificationClient.fetchHistory(options, filter);\n\t\t\t\tif (notificationList.length) {\n\t\t\t\t\tnextPageToFetch.current = nextPageToFetch.current + 1;\n\t\t\t\t\tfor (const notification of notificationList) {\n\t\t\t\t\t\taddNotification(notification);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Stop fetching after this one\n\t\t\t\t\tnextPageToFetch.current = LAZY_LOAD_NO_MORE_PAGES;\n\t\t\t\t}\n\t\t\t}\n\t\t\tresolve();\n\t\t});\n\n\tconst toggleCenter = async (show: boolean, isTransparent: boolean, poppedOut: boolean) => {\n\t\tif (isTransparent && !isMac) {\n\t\t\tif (poppedOut) {\n\t\t\t\tif (show) {\n\t\t\t\t\tfinsembleWindow.show({}, () => {\n\t\t\t\t\t\tfinsembleWindow.bringToFront();\n\t\t\t\t\t\tfinsembleWindow.setShape([]);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tfinsembleWindow.hide();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (show) {\n\t\t\t\t\tawait moveToToolbarMonitor();\n\t\t\t\t\tawait setFullHeight();\n\t\t\t\t\tfinsembleWindow.show({}, () => {\n\t\t\t\t\t\tfinsembleWindow.bringToFront();\n\t\t\t\t\t\tfinsembleWindow.setShape([]);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tfinsembleWindow.setShape([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]);\n\t\t\t\t\t\tfinsembleWindow.hide();\n\t\t\t\t\t}, 500);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (show) {\n\t\t\t\tif (!poppedOut) {\n\t\t\t\t\tawait moveToToolbarMonitor();\n\t\t\t\t\tawait setFullHeight();\n\t\t\t\t}\n\t\t\t\tfinsembleWindow.show({}, () => {\n\t\t\t\t\tfinsembleWindow.bringToFront();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfinsembleWindow.hide();\n\t\t\t}\n\t\t}\n\t};\n\n\t// When popped out we want to prevent the center to be closed when the close button is clicked (or alt +)\n\tuseEffect(() => {\n\t\tsetOpaqueClassName(!config.isTransparent);\n\n\t\tconst subscriptionId = FSBL.Clients.RouterClient.subscribe(\"Finsemble.Application.State\", (err, response) => {\n\t\t\tapplicationState.current = response.data.state;\n\t\t});\n\n\t\tconst hide = (event: any) => {\n\t\t\tconst publishValue = { ...subscriptionMessageRef.current };\n\t\t\tpublishValue[\"showCenter\"] = false;\n\t\t\tsetUIState(publishValue);\n\t\t\tif (applicationState?.current !== \"closing\") {\n\t\t\t\ttry {\n\t\t\t\t\tevent.cancel();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tFSBL.Clients.Logger.system.error(\"Error cancelling the window close event\", error);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst scrollHandler = () => {\n\t\t\tif (getScrollPercentage() > 0.9) {\n\t\t\t\tlazyLoadNextPage();\n\t\t\t}\n\t\t};\n\n\t\tfinsembleWindow.addEventListener(\"close-requested\", hide);\n\t\tfinsembleWindow.addEventListener(\"bounds-change-end\", boundsChangeListener);\n\t\twindow.addEventListener(\"scroll\", scrollHandler);\n\t\treturn () => {\n\t\t\tFSBL.Clients.RouterClient.unsubscribe(subscriptionId);\n\t\t\tfinsembleWindow.removeEventListener(\"close-requested\", hide);\n\t\t\tfinsembleWindow.removeEventListener(\"bounds-change-end\", boundsChangeListener);\n\t\t\twindow.removeEventListener(\"scroll\", scrollHandler);\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst recursiveLoad = async () => {\n\t\t\t// Cater for the case where there is no scroll bar to trigger lazy load - keep loading until scrollbar or no pages\n\t\t\tawait lazyLoadNextPage();\n\t\t\tif (getScrollPercentage() === 1 && nextPageToFetch.current != LAZY_LOAD_NO_MORE_PAGES) {\n\t\t\t\trecursiveLoad();\n\t\t\t}\n\t\t};\n\n\t\trecursiveLoad();\n\t}, [viewMode, drawerControlProps.active]);\n\n\t// Hook to set up the center state from service data on component start\n\tuseEffect(() => {\n\t\tsubscriptionMessageRef.current = uiState;\n\t\t// Hook can execute before initial pubsub response - waiting for actual values\n\t\tif (!isInitialized && typeof uiState.showCenter !== \"undefined\") {\n\t\t\tif (uiState.poppedOut) {\n\t\t\t\tremovePoppedInClasses();\n\t\t\t} else {\n\t\t\t\taddPoppedInClasses();\n\t\t\t}\n\n\t\t\tif (isValidPosition(uiState.position)) {\n\t\t\t\tsetShowWindowForState({\n\t\t\t\t\tshowCenter: uiState.showCenter,\n\t\t\t\t\tpoppedOut: uiState.poppedOut,\n\t\t\t\t\tposition: uiState.position,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Setup references\n\t\t\tshowCenterRef.current = uiState.showCenter;\n\t\t\tpoppedOutRef.current = uiState.poppedOut;\n\n\t\t\tsetInitialized(true);\n\t\t}\n\t}, [uiState]);\n\n\t// Effect to run when we pop-in or pop-out the notification center\n\tuseEffect(() => {\n\t\tif (isInitialized) {\n\t\t\tpoppedOutRef.current = uiState.poppedOut;\n\t\t\tfinsembleWindow.getMonitor(async (monitorInfo: any) => {\n\t\t\t\tif (uiState.poppedOut) {\n\t\t\t\t\tconst { data } = await finsembleWindow.getBounds();\n\t\t\t\t\tremovePoppedInClasses();\n\n\t\t\t\t\tif (data) {\n\t\t\t\t\t\tconst centerWindowPosition = {\n\t\t\t\t\t\t\tleft: data.left - 25,\n\t\t\t\t\t\t\ttop: data.top + 25,\n\t\t\t\t\t\t\theight: Math.round(monitorInfo.availableRect.height * 0.8),\n\t\t\t\t\t\t\twidth: data.width,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tsetShowWindowForState({\n\t\t\t\t\t\t\tshowCenter: uiState.showCenter,\n\t\t\t\t\t\t\tpoppedOut: uiState.poppedOut,\n\t\t\t\t\t\t\tposition: centerWindowPosition,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\taddPoppedInClasses();\n\t\t\t\t\tsetFullHeight(monitorInfo);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}, [uiState.poppedOut]);\n\n\tuseEffect(() => {\n\t\tif (isInitialized) {\n\t\t\tshowCenterRef.current = uiState.showCenter;\n\t\t\ttoggleCenter(uiState.showCenter, config.isTransparent as boolean, poppedOutRef.current);\n\t\t}\n\t}, [uiState.showCenter]);\n\n\tuseEffect(() => {\n\t\tsetFilteredNotifications([...notifications]);\n\t}, [notifications]);\n\n\tuseEffect(() => {\n\t\tfunction listenMuteStateChanged(error: any) {\n\t\t\tif (error) {\n\t\t\t\tconsole.error(\"FinsembleNotificationsMuteStateChannel: \", error);\n\t\t\t} else {\n\t\t\t\tsetReloadMuteFilters(true);\n\t\t\t}\n\t\t}\n\t\tFSBL.Clients.RouterClient.addListener(\"FinsembleNotificationsMuteStateChannel\", listenMuteStateChanged);\n\t\treturn () => {\n\t\t\tFSBL.Clients.RouterClient.removeListener(\"FinsembleNotificationsMuteStateChannel\", listenMuteStateChanged);\n\t\t};\n\t}, []);\n\n\t// Sets the current active mute filters\n\tuseEffect(() => {\n\t\tasync function loadMuteFilter() {\n\t\t\treturn await FSBL.Clients.NotificationClient.getMuteFilters();\n\t\t}\n\n\t\tloadMuteFilter().then((loadedMuteFilters: IMuteFilter[]) => {\n\t\t\tsetMuteFilters(loadedMuteFilters);\n\t\t\tsetReloadMuteFilters(false);\n\t\t});\n\t}, [reloadMuteFilters]);\n\n\tconst notificationsMainView = () => (\n\t\t<>\n\t\t\t<DrawerHeader poppedOutStatus={uiState.poppedOut} popOutToggle={togglePoppedStatus} />\n\t\t\t<DrawerControls />\n\t\t\t<div className=\"cards-container\">\n\t\t\t\t{viewMode === ViewMode.CARD ? (\n\t\t\t\t\t<CardView notifications={notifications} notificationCard={props.notificationCard} />\n\t\t\t\t) : (\n\t\t\t\t\t<ListView\n\t\t\t\t\t\tnotifications={notifications}\n\t\t\t\t\t\tnotificationHeaderRow={props.notificationHeaderRow}\n\t\t\t\t\t\tnotificationListRow={props.notificationListRow}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n\n\tconst notificationDetailsViewComponent = () => <NotificationDetailsView notification={selectedNotification} />;\n\n\treturn (\n\t\t<ConditionalWrapper\n\t\t\tcondition={(config.isTransparent as boolean) && !uiState.poppedOut && !isMac}\n\t\t\twrapper={(children) => (\n\t\t\t\t<CSSTransition in={uiState.showCenter} timeout={500} classNames=\"drawer\" unmountOnExit>\n\t\t\t\t\t{children}\n\t\t\t\t</CSSTransition>\n\t\t\t)}\n\t\t>\n\t\t\t<NotificationsContext.Provider value={notificationsContextValues}>\n\t\t\t\t<Drawer classNames={uiState.poppedOut ? \"popped-out\" : \"\"}>\n\t\t\t\t\t{selectedNotification ? notificationDetailsViewComponent() : notificationsMainView()}\n\t\t\t\t</Drawer>\n\t\t\t</NotificationsContext.Provider>\n\t\t</ConditionalWrapper>\n\t);\n};\n"]}