@finsemble/finsemble-ui 6.5.2 → 6.6.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +1 -0
- package/package.json +18 -15
- package/react/actions/smartDesktopDesignerActions.d.ts +3 -3
- package/react/actions/smartDesktopDesignerActions.js.map +1 -1
- package/react/assets/css/finsemble.css +0 -1
- package/react/assets/css/toolbar.css +0 -4
- package/react/assets/css/userPreferences.css +39 -4
- package/react/componentTemplateGenerator.js +1 -1
- package/react/componentTemplateGenerator.js.map +1 -1
- package/react/components/appCatalog/AppCatalogComponent.d.ts +1 -1
- package/react/components/appCatalog/components/Showcase/ImageCarousel.d.ts +3 -3
- package/react/components/appCatalog/components/Showcase/SupportNotes.d.ts +1 -1
- package/react/components/appCatalog/stores/storeActions.d.ts +1 -1
- package/react/components/common/DropdownButton.js.map +1 -1
- package/react/components/common/FileInput.d.ts +2 -1
- package/react/components/common/FileInput.js +2 -2
- package/react/components/common/FileInput.js.map +1 -1
- package/react/components/common/FinsembleToggle.d.ts +3 -1
- package/react/components/common/FinsembleToggle.js +12 -4
- package/react/components/common/FinsembleToggle.js.map +1 -1
- package/react/components/common/ImagePreview.js +1 -1
- package/react/components/common/ImagePreview.js.map +1 -1
- package/react/components/common/TimeSelect.d.ts +16 -0
- package/react/components/common/TimeSelect.js +143 -0
- package/react/components/common/TimeSelect.js.map +1 -0
- package/react/components/common/css/accordion.css +3 -5
- package/react/components/common/css/application-edit-page.css +4 -1
- package/react/components/common/css/time-select.css +8 -0
- package/react/components/common/css/toggle.css +39 -3
- package/react/components/common/helpers.js +1 -0
- package/react/components/common/helpers.js.map +1 -1
- package/react/components/common/stories/FileInput.stories.d.ts +2 -1
- package/react/components/common/stories/FileInput.stories.js +6 -0
- package/react/components/common/stories/FileInput.stories.js.map +1 -1
- package/react/components/common/stories/FinsembleToggle.stories.d.ts +3 -1
- package/react/components/common/stories/FinsembleToggle.stories.js +12 -0
- package/react/components/common/stories/FinsembleToggle.stories.js.map +1 -1
- package/react/components/common/stories/TimeSelect.stories.d.ts +11 -0
- package/react/components/common/stories/TimeSelect.stories.js +20 -0
- package/react/components/common/stories/TimeSelect.stories.js.map +1 -0
- package/react/components/common/tests/Accordion.spec.js +1 -1
- package/react/components/common/tests/Accordion.spec.js.map +1 -1
- package/react/components/common/tests/FileInput.spec.js +8 -1
- package/react/components/common/tests/FileInput.spec.js.map +1 -1
- package/react/components/common/tests/FinsembleSelect.spec.js +1 -1
- package/react/components/common/tests/FinsembleSelect.spec.js.map +1 -1
- package/react/components/common/tests/FinsembleToggle.spec.js +8 -3
- package/react/components/common/tests/FinsembleToggle.spec.js.map +1 -1
- package/react/components/{smartDesktopDesigner/tests/AppEditPage.spec.d.ts → common/tests/TimeSelect.spec.d.ts} +0 -0
- package/react/components/common/tests/TimeSelect.spec.js +71 -0
- package/react/components/common/tests/TimeSelect.spec.js.map +1 -0
- package/react/components/favorites/FavoriteMaker.js.map +1 -1
- package/react/components/favorites/FavoritesShell.spec.js +1 -1
- package/react/components/favorites/FavoritesShell.spec.js.map +1 -1
- package/react/components/fdc3Resolver/ResolverDialog.spec.js +1 -1
- package/react/components/fdc3Resolver/ResolverDialog.spec.js.map +1 -1
- package/react/components/icon/Icon.d.ts +4 -3
- package/react/components/icon/Icon.js +22 -12
- package/react/components/icon/Icon.js.map +1 -1
- package/react/components/legacyControls/tests/FinsembleDialogTextInput.spec.js +1 -1
- package/react/components/legacyControls/tests/FinsembleDialogTextInput.spec.js.map +1 -1
- package/react/components/linker/LinkerMenu.js.map +1 -1
- package/react/components/menu/MenuPortal.js +1 -1
- package/react/components/menu/MenuPortal.js.map +1 -1
- package/react/components/processMonitor/ProcessMonitorTypes.d.ts +4 -11
- package/react/components/processMonitor/ProcessMonitorTypes.js.map +1 -1
- package/react/components/processMonitor/components/ChildWindow.js +5 -10
- package/react/components/processMonitor/components/ChildWindow.js.map +1 -1
- package/react/components/processMonitor/components/ProcessStatistics.js +8 -10
- package/react/components/processMonitor/components/ProcessStatistics.js.map +1 -1
- package/react/components/processMonitor/constants.d.ts +0 -2
- package/react/components/processMonitor/constants.js +0 -2
- package/react/components/processMonitor/constants.js.map +1 -1
- package/react/components/processMonitor/helpers.d.ts +0 -11
- package/react/components/processMonitor/helpers.js +1 -9
- package/react/components/processMonitor/helpers.js.map +1 -1
- package/react/components/processMonitor/stores/ProcessMonitorStore.d.ts +3 -11
- package/react/components/processMonitor/stores/ProcessMonitorStore.js +22 -62
- package/react/components/processMonitor/stores/ProcessMonitorStore.js.map +1 -1
- package/react/components/{smartDesktopDesigner → sdd}/AddApp.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/AddApp.js +0 -0
- package/react/components/sdd/AddApp.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/AppEditAccess.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/AppEditAccess.js +0 -0
- package/react/components/sdd/AppEditAccess.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/AppEditPage.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/AppEditPage.js +7 -1
- package/react/components/sdd/AppEditPage.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/Appearance.css +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/Appearance.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/Appearance.helpers.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/Appearance.helpers.js +0 -0
- package/react/components/sdd/Appearance.helpers.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/Appearance.js +0 -0
- package/react/components/sdd/Appearance.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/Application.d.ts +1 -2
- package/react/components/{smartDesktopDesigner → sdd}/Application.js +37 -39
- package/react/components/sdd/Application.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/Applications.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/Applications.js +2 -2
- package/react/components/sdd/Applications.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/AssetsPage.css +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/AssetsPage.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/AssetsPage.js +0 -0
- package/react/components/sdd/AssetsPage.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/Authentication.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/Authentication.js +1 -1
- package/react/components/sdd/Authentication.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/AuthenticationProviderConfig.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/AuthenticationProviderConfig.js +0 -0
- package/react/components/sdd/AuthenticationProviderConfig.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/Content.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/Content.js +0 -0
- package/react/components/sdd/Content.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/ContentHeader.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/ContentHeader.js +0 -0
- package/react/components/sdd/ContentHeader.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/CurrentView.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/CurrentView.js +0 -0
- package/react/components/sdd/CurrentView.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/EditPreload.d.ts +5 -7
- package/react/components/sdd/EditPreload.js +156 -0
- package/react/components/sdd/EditPreload.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/Export.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/Export.js +0 -0
- package/react/components/sdd/Export.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/ExportCloud.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/ExportCloud.js +0 -0
- package/react/components/sdd/ExportCloud.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/ExportDeployInfo.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/ExportDeployInfo.js +0 -0
- package/react/components/sdd/ExportDeployInfo.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/ExportZip.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/ExportZip.js +0 -0
- package/react/components/sdd/ExportZip.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/GettingStarted.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/GettingStarted.js +0 -0
- package/react/components/sdd/GettingStarted.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/ItemList.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/ItemList.js +0 -0
- package/react/components/sdd/ItemList.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/Navigation.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/Navigation.js +0 -0
- package/react/components/sdd/Navigation.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/OptionalSettingsView.d.ts +1 -3
- package/react/components/sdd/OptionalSettingsView.js +56 -0
- package/react/components/sdd/OptionalSettingsView.js.map +1 -0
- package/react/components/sdd/Preloads.d.ts +6 -0
- package/react/components/sdd/Preloads.js +24 -0
- package/react/components/sdd/Preloads.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/ProjectErrors.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/ProjectErrors.js +0 -0
- package/react/components/sdd/ProjectErrors.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/Publish.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/Publish.js +0 -0
- package/react/components/sdd/Publish.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/PublishProgress.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/PublishProgress.js +0 -0
- package/react/components/sdd/PublishProgress.js.map +1 -0
- package/react/components/sdd/SmartDesktopDesigner.d.ts +29 -0
- package/react/components/sdd/SmartDesktopDesigner.js +122 -0
- package/react/components/sdd/SmartDesktopDesigner.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/ThemePage.css +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/ThemePage.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/ThemePage.js +0 -0
- package/react/components/sdd/ThemePage.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/Themes.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/Themes.js +0 -0
- package/react/components/sdd/Themes.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/Toolbar.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/Toolbar.js +9 -7
- package/react/components/sdd/Toolbar.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/View.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/View.js +0 -0
- package/react/components/sdd/View.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/common/fsbl_functions.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/common/fsbl_functions.js +0 -0
- package/react/components/sdd/common/fsbl_functions.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/common/getCSSVars.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/common/getCSSVars.js +0 -0
- package/react/components/sdd/common/getCSSVars.js.map +1 -0
- package/react/components/sdd/common/setPreloadDefaults.d.ts +1 -0
- package/react/components/sdd/common/setPreloadDefaults.js +21 -0
- package/react/components/sdd/common/setPreloadDefaults.js.map +1 -0
- package/react/components/{smartDesktopDesigner/fixtures → sdd/common}/views.d.ts +0 -0
- package/react/components/sdd/common/views.js +202 -0
- package/react/components/sdd/common/views.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/css/appearance.css +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/css/applications.css +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/css/authentication.css +5 -1
- package/react/components/{smartDesktopDesigner → sdd}/css/buttons.css +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/css/export.css +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/css/getting-started.css +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/css/nav.css +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/css/project-errors.css +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/css/project-header.css +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/css/styles.css +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/css/views.css +0 -1
- package/react/components/{smartDesktopDesigner → sdd}/fixtures/apps.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/fixtures/apps.js +10 -10
- package/react/components/sdd/fixtures/apps.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/fixtures/authenticationProps.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/fixtures/authenticationProps.js +0 -0
- package/react/components/sdd/fixtures/authenticationProps.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/fixtures/configTemplate.d.ts +1 -1
- package/react/components/{smartDesktopDesigner → sdd}/fixtures/configTemplate.js +1 -1
- package/react/components/sdd/fixtures/configTemplate.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/fixtures/exportProps.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/fixtures/exportProps.js +0 -0
- package/react/components/sdd/fixtures/exportProps.js.map +1 -0
- package/react/components/sdd/fixtures/preloads.d.ts +3 -0
- package/react/components/sdd/fixtures/preloads.js +57 -0
- package/react/components/sdd/fixtures/preloads.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/fixtures/projectErrorsProps.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/fixtures/projectErrorsProps.js +0 -0
- package/react/components/sdd/fixtures/projectErrorsProps.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/fixtures/publishProgress.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/fixtures/publishProgress.js +0 -0
- package/react/components/sdd/fixtures/publishProgress.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/fixtures/themeProps.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/fixtures/themeProps.js +0 -0
- package/react/components/sdd/fixtures/themeProps.js.map +1 -0
- package/react/components/sdd/fixtures/views.d.ts +3 -0
- package/react/components/{smartDesktopDesigner → sdd}/fixtures/views.js +0 -0
- package/react/components/sdd/fixtures/views.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/sdd_helpers.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/sdd_helpers.js +0 -0
- package/react/components/sdd/sdd_helpers.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/AppEditPage.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/AppEditPage.stories.js +0 -0
- package/react/components/sdd/stories/AppEditPage.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/Appearance.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/Appearance.stories.js +0 -0
- package/react/components/sdd/stories/Appearance.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/Applications.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/Applications.stories.js +0 -0
- package/react/components/sdd/stories/Applications.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/AssetsPage.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/AssetsPage.stories.js +0 -0
- package/react/components/sdd/stories/AssetsPage.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/Authentication.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/Authentication.stories.js +0 -0
- package/react/components/sdd/stories/Authentication.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/ContentHeader.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/ContentHeader.stories.js +0 -0
- package/react/components/sdd/stories/ContentHeader.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/Export.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/Export.stories.js +0 -0
- package/react/components/sdd/stories/Export.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/ExportCloud.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/ExportCloud.stories.js +0 -0
- package/react/components/sdd/stories/ExportCloud.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/ExportZip.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/ExportZip.stories.js +0 -0
- package/react/components/sdd/stories/ExportZip.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/GettingStarted.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/GettingStarted.stories.js +0 -0
- package/react/components/sdd/stories/GettingStarted.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/ItemList.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/ItemList.stories.js +0 -0
- package/react/components/sdd/stories/ItemList.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/Navigation.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/Navigation.stories.js +0 -0
- package/react/components/sdd/stories/Navigation.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/OptionalSettingsView.stories.d.ts +3 -2
- package/react/components/sdd/stories/OptionalSettingsView.stories.js +27 -0
- package/react/components/sdd/stories/OptionalSettingsView.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/ProjectErrors.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/ProjectErrors.stories.js +0 -0
- package/react/components/sdd/stories/ProjectErrors.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/Publish.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/Publish.stories.js +0 -0
- package/react/components/sdd/stories/Publish.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/PublishProgress.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/PublishProgress.stories.js +0 -0
- package/react/components/sdd/stories/PublishProgress.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/SmartDesktopDesigner.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/SmartDesktopDesigner.stories.js +1 -0
- package/react/components/sdd/stories/SmartDesktopDesigner.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/ThemePage.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/ThemePage.stories.js +0 -0
- package/react/components/sdd/stories/ThemePage.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/Themes.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/Themes.stories.js +0 -0
- package/react/components/sdd/stories/Themes.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/Toolbar.stories.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/stories/Toolbar.stories.js +0 -0
- package/react/components/sdd/stories/Toolbar.stories.js.map +1 -0
- package/react/components/{smartDesktopDesigner/tests/Application.spec.d.ts → sdd/tests/AppEditPage.spec.d.ts} +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/AppEditPage.spec.js +0 -0
- package/react/components/sdd/tests/AppEditPage.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner/tests/Authentication.spec.d.ts → sdd/tests/Application.spec.d.ts} +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/Application.spec.js +13 -31
- package/react/components/sdd/tests/Application.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/Applications.spec.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/Applications.spec.js +0 -0
- package/react/components/sdd/tests/Applications.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner/tests/ContentHeader.spec.d.ts → sdd/tests/Authentication.spec.d.ts} +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/Authentication.spec.js +0 -0
- package/react/components/sdd/tests/Authentication.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner/tests/EditPreload.spec.d.ts → sdd/tests/ContentHeader.spec.d.ts} +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/ContentHeader.spec.js +0 -0
- package/react/components/sdd/tests/ContentHeader.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner/tests/Export.spec.d.ts → sdd/tests/EditPreload.spec.d.ts} +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/EditPreload.spec.js +8 -10
- package/react/components/sdd/tests/EditPreload.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner/tests/ExportZip.spec.d.ts → sdd/tests/Export.spec.d.ts} +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/Export.spec.js +0 -0
- package/react/components/sdd/tests/Export.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner/tests/ItemList.spec.d.ts → sdd/tests/ExportZip.spec.d.ts} +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/ExportZip.spec.js +0 -0
- package/react/components/sdd/tests/ExportZip.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner/tests/Navigation.spec.d.ts → sdd/tests/ItemList.spec.d.ts} +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/ItemList.spec.js +0 -0
- package/react/components/sdd/tests/ItemList.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner/tests/Preloads.spec.d.ts → sdd/tests/Navigation.spec.d.ts} +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/Navigation.spec.js +0 -0
- package/react/components/sdd/tests/Navigation.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner/tests/ProjectErrors.spec.d.ts → sdd/tests/OptionalSettingsView.spec.d.ts} +0 -0
- package/react/components/sdd/tests/OptionalSettingsView.spec.js +22 -0
- package/react/components/sdd/tests/OptionalSettingsView.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner/tests/Publish.spec.d.ts → sdd/tests/ProjectErrors.spec.d.ts} +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/ProjectErrors.spec.js +0 -0
- package/react/components/sdd/tests/ProjectErrors.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner/tests/PublishProgess.spec.d.ts → sdd/tests/Publish.spec.d.ts} +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/Publish.spec.js +0 -0
- package/react/components/sdd/tests/Publish.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner/tests/SmartDesktopDesigner.spec.d.ts → sdd/tests/PublishProgess.spec.d.ts} +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/PublishProgess.spec.js +0 -0
- package/react/components/sdd/tests/PublishProgess.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner/tests/Themes.spec.d.ts → sdd/tests/SmartDesktopDesigner.spec.d.ts} +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/SmartDesktopDesigner.spec.js +1 -1
- package/react/components/sdd/tests/SmartDesktopDesigner.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner/tests/sdd_helpers.spec.d.ts → sdd/tests/Themes.spec.d.ts} +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/Themes.spec.js +0 -0
- package/react/components/sdd/tests/Themes.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/Toolbar.spec.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/Toolbar.spec.js +0 -0
- package/react/components/sdd/tests/Toolbar.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/a11y_helper.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/a11y_helper.js +0 -0
- package/react/components/sdd/tests/a11y_helper.js.map +1 -0
- package/react/components/{userPreferences/tests/ScheduledRestart.spec.d.ts → sdd/tests/sdd_helpers.spec.d.ts} +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/tests/sdd_helpers.spec.js +0 -0
- package/react/components/sdd/tests/sdd_helpers.spec.js.map +1 -0
- package/react/components/{smartDesktopDesigner → sdd}/themeDefinitions.d.ts +0 -0
- package/react/components/{smartDesktopDesigner → sdd}/themeDefinitions.js +0 -0
- package/react/components/sdd/themeDefinitions.js.map +1 -0
- package/react/components/search/SearchBestMatch.js.map +1 -1
- package/react/components/search/SearchProviderResults.d.ts +3 -1
- package/react/components/search/SearchProviderResults.js.map +1 -1
- package/react/components/search/SearchResult.d.ts +3 -1
- package/react/components/search/SearchResult.js +9 -7
- package/react/components/search/SearchResult.js.map +1 -1
- package/react/components/shared/DefaultDropdownButton.js +5 -4
- package/react/components/shared/DefaultDropdownButton.js.map +1 -1
- package/react/components/shared/tests/DefaultDropdownButton.spec.js +9 -0
- package/react/components/shared/tests/DefaultDropdownButton.spec.js.map +1 -1
- package/react/components/singleInputDialog/SingleInputDialog.spec.js +1 -1
- package/react/components/singleInputDialog/SingleInputDialog.spec.js.map +1 -1
- package/react/components/smartDesktopDesigner/SmartDesktopDesigner.d.ts +0 -11
- package/react/components/smartDesktopDesigner/SmartDesktopDesigner.js +2 -116
- package/react/components/smartDesktopDesigner/SmartDesktopDesigner.js.map +1 -1
- package/react/components/smartDesktopDesigner/common/views.js +1 -203
- package/react/components/smartDesktopDesigner/common/views.js.map +1 -1
- package/react/components/toolbar/AutoArrange.js +1 -1
- package/react/components/toolbar/AutoArrange.js.map +1 -1
- package/react/components/toolbar/AutoArrange.spec.d.ts +1 -0
- package/react/components/toolbar/AutoArrange.spec.js +48 -0
- package/react/components/toolbar/AutoArrange.spec.js.map +1 -0
- package/react/components/toolbar/AutoArrange.stories.d.ts +11 -0
- package/react/components/toolbar/AutoArrange.stories.js +21 -0
- package/react/components/toolbar/AutoArrange.stories.js.map +1 -0
- package/react/components/toolbar/SddButton.d.ts +2 -0
- package/react/components/toolbar/SddButton.js +23 -0
- package/react/components/toolbar/SddButton.js.map +1 -0
- package/react/components/toolbar/ToolbarShell.js +4 -1
- package/react/components/toolbar/ToolbarShell.js.map +1 -1
- package/react/components/toolbar/advancedAppLauncher/components/AppActionsMenu.js +2 -1
- package/react/components/toolbar/advancedAppLauncher/components/AppActionsMenu.js.map +1 -1
- package/react/components/toolbar/advancedAppLauncher/components/AppDefinition.d.ts +3 -2
- package/react/components/toolbar/advancedAppLauncher/components/AppDefinition.js.map +1 -1
- package/react/components/toolbar/advancedAppLauncher/stores/StoreActions.js.map +1 -1
- package/react/components/toolbar/appLauncher/AppLauncherMenu.js +15 -4
- package/react/components/toolbar/appLauncher/AppLauncherMenu.js.map +1 -1
- package/react/components/toolbar/appLauncher/components/componentList.js +3 -4
- package/react/components/toolbar/appLauncher/components/componentList.js.map +1 -1
- package/react/components/toolbar/dashbar/Dashbar.js +2 -0
- package/react/components/toolbar/dashbar/Dashbar.js.map +1 -1
- package/react/components/toolbar/workspaceManagementMenu/stores/workspaceManagementMenuStore.js +71 -12
- package/react/components/toolbar/workspaceManagementMenu/stores/workspaceManagementMenuStore.js.map +1 -1
- package/react/components/userPreferences/UserPreferenceTypes.d.ts +3 -2
- package/react/components/userPreferences/UserPreferenceTypes.js.map +1 -1
- package/react/components/userPreferences/components/content/General.d.ts +2 -5
- package/react/components/userPreferences/components/content/General.js +31 -11
- package/react/components/userPreferences/components/content/General.js.map +1 -1
- package/react/components/userPreferences/components/content/Workspaces.d.ts +5 -0
- package/react/components/userPreferences/components/content/Workspaces.js +58 -17
- package/react/components/userPreferences/components/content/Workspaces.js.map +1 -1
- package/react/components/userPreferences/components/general/ScheduledClose.d.ts +10 -0
- package/react/components/userPreferences/components/general/ScheduledClose.js +95 -0
- package/react/components/userPreferences/components/general/ScheduledClose.js.map +1 -0
- package/react/components/userPreferences/stores/UserPreferencesStore.d.ts +6 -2
- package/react/components/userPreferences/stores/UserPreferencesStore.js +19 -3
- package/react/components/userPreferences/stores/UserPreferencesStore.js.map +1 -1
- package/react/components/userPreferences/stories/General.stories.d.ts +6 -2
- package/react/components/userPreferences/stories/ScheduledClose.stories.d.ts +12 -0
- package/react/components/userPreferences/stories/ScheduledClose.stories.js +53 -0
- package/react/components/userPreferences/stories/ScheduledClose.stories.js.map +1 -0
- package/react/components/userPreferences/tests/General.spec.js +4 -17
- package/react/components/userPreferences/tests/General.spec.js.map +1 -1
- package/react/components/userPreferences/tests/ScheduledClose.spec.d.ts +1 -0
- package/react/components/userPreferences/tests/ScheduledClose.spec.js +47 -0
- package/react/components/userPreferences/tests/ScheduledClose.spec.js.map +1 -0
- package/react/components/windowTitleBar/WindowTitleBarShell.d.ts +1 -0
- package/react/components/windowTitleBar/WindowTitleBarShell.js +16 -6
- package/react/components/windowTitleBar/WindowTitleBarShell.js.map +1 -1
- package/react/components/windowTitleBar/components/center/TabList.js +2 -2
- package/react/components/windowTitleBar/components/center/TabList.js.map +1 -1
- package/react/components/windowTitleBar/components/left/LinkerButton.js.map +1 -1
- package/react/components/windowTitleBar/components/windowTitle.js +11 -10
- package/react/components/windowTitleBar/components/windowTitle.js.map +1 -1
- package/react/components/windowTitleBar/stores/windowTitleBarStore.js +12 -9
- package/react/components/windowTitleBar/stores/windowTitleBarStore.js.map +1 -1
- package/react/components/yesNoDialog/Timer.spec.js +1 -1
- package/react/components/yesNoDialog/Timer.spec.js.map +1 -1
- package/react/components/yesNoDialog/YesNoDialog.spec.js +1 -1
- package/react/components/yesNoDialog/YesNoDialog.spec.js.map +1 -1
- package/react/hooks/useSearch.d.ts +2 -1
- package/react/hooks/useSearch.js.map +1 -1
- package/react/hooks/useToolbar.js +6 -0
- package/react/hooks/useToolbar.js.map +1 -1
- package/react/reducers/rootReducer.d.ts +1 -1
- package/react/reducers/smartDesktopDesignerReducer.js +1 -1
- package/react/reducers/smartDesktopDesignerReducer.js.map +1 -1
- package/react/store.d.ts +2 -2
- package/react/types/advancedAppLauncherTypes.d.ts +5 -3
- package/react/types/advancedAppLauncherTypes.js.map +1 -1
- package/react/types/favoriteTypes.d.ts +4 -2
- package/react/types/favoriteTypes.js.map +1 -1
- package/react/types/smartDesktopDesignerTypes.d.ts +9 -1
- package/react/types/smartDesktopDesignerTypes.js.map +1 -1
- package/react/components/smartDesktopDesigner/AddApp.js.map +0 -1
- package/react/components/smartDesktopDesigner/AppEditAccess.js.map +0 -1
- package/react/components/smartDesktopDesigner/AppEditPage.js.map +0 -1
- package/react/components/smartDesktopDesigner/Appearance.helpers.js.map +0 -1
- package/react/components/smartDesktopDesigner/Appearance.js.map +0 -1
- package/react/components/smartDesktopDesigner/Application.js.map +0 -1
- package/react/components/smartDesktopDesigner/Applications.js.map +0 -1
- package/react/components/smartDesktopDesigner/AssetsPage.js.map +0 -1
- package/react/components/smartDesktopDesigner/Authentication.js.map +0 -1
- package/react/components/smartDesktopDesigner/AuthenticationProviderConfig.js.map +0 -1
- package/react/components/smartDesktopDesigner/Content.js.map +0 -1
- package/react/components/smartDesktopDesigner/ContentHeader.js.map +0 -1
- package/react/components/smartDesktopDesigner/CurrentView.js.map +0 -1
- package/react/components/smartDesktopDesigner/EditPreload.js +0 -169
- package/react/components/smartDesktopDesigner/EditPreload.js.map +0 -1
- package/react/components/smartDesktopDesigner/Export.js.map +0 -1
- package/react/components/smartDesktopDesigner/ExportCloud.js.map +0 -1
- package/react/components/smartDesktopDesigner/ExportDeployInfo.js.map +0 -1
- package/react/components/smartDesktopDesigner/ExportZip.js.map +0 -1
- package/react/components/smartDesktopDesigner/GettingStarted.js.map +0 -1
- package/react/components/smartDesktopDesigner/ItemList.js.map +0 -1
- package/react/components/smartDesktopDesigner/Navigation.js.map +0 -1
- package/react/components/smartDesktopDesigner/OptionalSettingsView.js +0 -71
- package/react/components/smartDesktopDesigner/OptionalSettingsView.js.map +0 -1
- package/react/components/smartDesktopDesigner/Preloads.d.ts +0 -8
- package/react/components/smartDesktopDesigner/Preloads.js +0 -26
- package/react/components/smartDesktopDesigner/Preloads.js.map +0 -1
- package/react/components/smartDesktopDesigner/ProjectErrors.js.map +0 -1
- package/react/components/smartDesktopDesigner/Publish.js.map +0 -1
- package/react/components/smartDesktopDesigner/PublishProgress.js.map +0 -1
- package/react/components/smartDesktopDesigner/ThemePage.js.map +0 -1
- package/react/components/smartDesktopDesigner/Themes.js.map +0 -1
- package/react/components/smartDesktopDesigner/Toolbar.js.map +0 -1
- package/react/components/smartDesktopDesigner/View.js.map +0 -1
- package/react/components/smartDesktopDesigner/common/fsbl_functions.js.map +0 -1
- package/react/components/smartDesktopDesigner/common/getCSSVars.js.map +0 -1
- package/react/components/smartDesktopDesigner/fixtures/apps.js.map +0 -1
- package/react/components/smartDesktopDesigner/fixtures/authenticationProps.js.map +0 -1
- package/react/components/smartDesktopDesigner/fixtures/configTemplate.js.map +0 -1
- package/react/components/smartDesktopDesigner/fixtures/exportProps.js.map +0 -1
- package/react/components/smartDesktopDesigner/fixtures/preloads.d.ts +0 -22
- package/react/components/smartDesktopDesigner/fixtures/preloads.js +0 -40
- package/react/components/smartDesktopDesigner/fixtures/preloads.js.map +0 -1
- package/react/components/smartDesktopDesigner/fixtures/projectErrorsProps.js.map +0 -1
- package/react/components/smartDesktopDesigner/fixtures/publishProgress.js.map +0 -1
- package/react/components/smartDesktopDesigner/fixtures/themeProps.js.map +0 -1
- package/react/components/smartDesktopDesigner/fixtures/views.js.map +0 -1
- package/react/components/smartDesktopDesigner/sdd_helpers.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/AppEditPage.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/Appearance.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/Applications.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/AssetsPage.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/Authentication.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/ContentHeader.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/EditPreload.stories.d.ts +0 -11
- package/react/components/smartDesktopDesigner/stories/EditPreload.stories.js +0 -35
- package/react/components/smartDesktopDesigner/stories/EditPreload.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/Export.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/ExportCloud.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/ExportZip.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/GettingStarted.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/ItemList.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/Navigation.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/OptionalSettingsView.stories.js +0 -28
- package/react/components/smartDesktopDesigner/stories/OptionalSettingsView.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/Preloads.stories.d.ts +0 -11
- package/react/components/smartDesktopDesigner/stories/Preloads.stories.js +0 -31
- package/react/components/smartDesktopDesigner/stories/Preloads.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/ProjectErrors.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/Publish.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/PublishProgress.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/SmartDesktopDesigner.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/ThemePage.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/Themes.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/stories/Toolbar.stories.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/AppEditPage.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/Application.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/Applications.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/Authentication.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/ContentHeader.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/EditPreload.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/Export.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/ExportZip.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/ItemList.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/Navigation.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/Preloads.spec.js +0 -47
- package/react/components/smartDesktopDesigner/tests/Preloads.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/ProjectErrors.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/Publish.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/PublishProgess.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/SmartDesktopDesigner.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/Themes.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/Toolbar.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/a11y_helper.js.map +0 -1
- package/react/components/smartDesktopDesigner/tests/sdd_helpers.spec.js.map +0 -1
- package/react/components/smartDesktopDesigner/themeDefinitions.js.map +0 -1
- package/react/components/toolbar/appLauncher/DynamicAppLauncher.d.ts +0 -6
- package/react/components/toolbar/appLauncher/DynamicAppLauncher.js +0 -23
- package/react/components/toolbar/appLauncher/DynamicAppLauncher.js.map +0 -1
- package/react/components/userPreferences/components/general/ScheduledRestart.d.ts +0 -27
- package/react/components/userPreferences/components/general/ScheduledRestart.js +0 -190
- package/react/components/userPreferences/components/general/ScheduledRestart.js.map +0 -1
- package/react/components/userPreferences/tests/ScheduledRestart.spec.js +0 -70
- package/react/components/userPreferences/tests/ScheduledRestart.spec.js.map +0 -1
- package/react/hooks/useWorkspace.d.ts +0 -5
- package/react/hooks/useWorkspace.js +0 -26
- package/react/hooks/useWorkspace.js.map +0 -1
- package/react/types/iconTypes.d.ts +0 -11
- package/react/types/iconTypes.js +0 -2
- package/react/types/iconTypes.js.map +0 -1
- package/react/types/searchTypes.d.ts +0 -22
- package/react/types/searchTypes.js +0 -2
- package/react/types/searchTypes.js.map +0 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { mount, shallow } from "enzyme";
|
|
3
|
+
import { describe, it } from "mocha";
|
|
4
|
+
import { expect } from "chai";
|
|
5
|
+
import { Daily, Weekly } from "../stories/ScheduledClose.stories";
|
|
6
|
+
import { ScheduledClose } from "../components/general/ScheduledClose";
|
|
7
|
+
import { Checkbox } from "../../common/Checkbox";
|
|
8
|
+
import { initFSBL } from "../../common/helpers";
|
|
9
|
+
import sinon from "sinon";
|
|
10
|
+
import { TimeSelect } from "../../common/TimeSelect";
|
|
11
|
+
import DefaultDropdownButton from "../../shared/DefaultDropdownButton";
|
|
12
|
+
describe("<ScheduledClose/>", () => {
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
sinon.restore();
|
|
15
|
+
});
|
|
16
|
+
it("should disable all the dropdowns if Scheduled Restart is off", () => {
|
|
17
|
+
initFSBL(window);
|
|
18
|
+
const wrapper = shallow(React.createElement(ScheduledClose, { getPreferences: () => { }, setPreferences: () => { }, configKey: "", label: "Restart" }));
|
|
19
|
+
expect(wrapper.find(TimeSelect).props().enabled).to.be.false;
|
|
20
|
+
});
|
|
21
|
+
it("should enable all the dropdowns if Scheduled Restart is on", () => {
|
|
22
|
+
initFSBL(window);
|
|
23
|
+
const wrapper = shallow(React.createElement(ScheduledClose, { getPreferences: () => { }, setPreferences: () => { }, configKey: "", label: "Restart" }));
|
|
24
|
+
wrapper.find(Checkbox).at(0).simulate("click");
|
|
25
|
+
expect(wrapper.find(TimeSelect).props().enabled).to.be.true;
|
|
26
|
+
});
|
|
27
|
+
it("should disable all the dropdowns if Scheduled Restart is on and turned off", () => {
|
|
28
|
+
initFSBL(window);
|
|
29
|
+
const wrapper = shallow(React.createElement(ScheduledClose, { getPreferences: () => { }, setPreferences: () => { }, configKey: "", label: "Restart" }));
|
|
30
|
+
wrapper.find(Checkbox).at(0).simulate("click");
|
|
31
|
+
wrapper.find(Checkbox).at(0).simulate("click");
|
|
32
|
+
expect(wrapper.find(TimeSelect).props().enabled).to.be.false;
|
|
33
|
+
});
|
|
34
|
+
it("Should have weekly set with a day dropdown", () => {
|
|
35
|
+
initFSBL(window);
|
|
36
|
+
const wrapper = mount(React.createElement(Weekly, Object.assign({}, Weekly.args)));
|
|
37
|
+
expect(wrapper.find(".finsembleToggle-on").exists()).to.be.false;
|
|
38
|
+
expect(wrapper.find(DefaultDropdownButton).length).to.equal(4);
|
|
39
|
+
});
|
|
40
|
+
it("Should have daily set with only a time dropdown", () => {
|
|
41
|
+
initFSBL(window);
|
|
42
|
+
const wrapper = mount(React.createElement(Daily, Object.assign({}, Daily.args)));
|
|
43
|
+
expect(wrapper.find(".finsembleToggle-off").exists()).to.be.false;
|
|
44
|
+
expect(wrapper.find(DefaultDropdownButton).length).to.equal(3);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=ScheduledClose.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScheduledClose.spec.js","sourceRoot":"","sources":["../../../../src/components/userPreferences/tests/ScheduledClose.spec.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\";\nimport { mount, shallow } from \"enzyme\";\nimport { describe, it } from \"mocha\";\nimport { expect } from \"chai\";\nimport { Daily, Weekly } from \"../stories/ScheduledClose.stories\";\nimport { ScheduledClose, ScheduledCloseProps } from \"../components/general/ScheduledClose\";\nimport { Checkbox } from \"../../common/Checkbox\";\nimport { initFSBL } from \"../../common/helpers\";\nimport sinon from \"sinon\";\nimport { TimeSelect } from \"../../common/TimeSelect\";\nimport DefaultDropdownButton from \"../../shared/DefaultDropdownButton\";\n\ndescribe(\"<ScheduledClose/>\", () => {\n\tafterEach(() => {\n\t\tsinon.restore();\n\t});\n\n\tit(\"should disable all the dropdowns if Scheduled Restart is off\", () => {\n\t\tinitFSBL(window);\n\t\tconst wrapper = shallow(\n\t\t\t<ScheduledClose getPreferences={() => {}} setPreferences={() => {}} configKey={\"\"} label={\"Restart\"} />\n\t\t);\n\t\texpect(wrapper.find(TimeSelect).props().enabled).to.be.false;\n\t});\n\n\tit(\"should enable all the dropdowns if Scheduled Restart is on\", () => {\n\t\tinitFSBL(window);\n\t\tconst wrapper = shallow(\n\t\t\t<ScheduledClose getPreferences={() => {}} setPreferences={() => {}} configKey={\"\"} label={\"Restart\"} />\n\t\t);\n\t\twrapper.find(Checkbox).at(0).simulate(\"click\");\n\t\texpect(wrapper.find(TimeSelect).props().enabled).to.be.true;\n\t});\n\n\tit(\"should disable all the dropdowns if Scheduled Restart is on and turned off\", () => {\n\t\tinitFSBL(window);\n\t\tconst wrapper = shallow(\n\t\t\t<ScheduledClose getPreferences={() => {}} setPreferences={() => {}} configKey={\"\"} label={\"Restart\"} />\n\t\t);\n\t\twrapper.find(Checkbox).at(0).simulate(\"click\");\n\t\twrapper.find(Checkbox).at(0).simulate(\"click\");\n\t\texpect(wrapper.find(TimeSelect).props().enabled).to.be.false;\n\t});\n\n\tit(\"Should have weekly set with a day dropdown\", () => {\n\t\tinitFSBL(window);\n\t\tconst wrapper = mount(<Weekly {...(Weekly.args as ScheduledCloseProps)} />);\n\t\texpect(wrapper.find(\".finsembleToggle-on\").exists()).to.be.false;\n\t\texpect(wrapper.find(DefaultDropdownButton).length).to.equal(4);\n\t});\n\n\tit(\"Should have daily set with only a time dropdown\", () => {\n\t\tinitFSBL(window);\n\t\tconst wrapper = mount(<Daily {...(Daily.args as ScheduledCloseProps)} />);\n\t\texpect(wrapper.find(\".finsembleToggle-off\").exists()).to.be.false;\n\t\texpect(wrapper.find(DefaultDropdownButton).length).to.equal(3);\n\t});\n});\n"]}
|
|
@@ -47,6 +47,7 @@ export declare class WindowTitleBarShell extends React.Component<WindowTitleBarS
|
|
|
47
47
|
onTilingStop(): void;
|
|
48
48
|
onDropHandler(): void;
|
|
49
49
|
onDoubleClick(): void;
|
|
50
|
+
_setOnMouseUpAndDownHandlers(element: HTMLDivElement): void;
|
|
50
51
|
makeDragHandle(fsblHeader: Element, dragHandleCssClass: string): HTMLElement;
|
|
51
52
|
dragHandleBoundsForShowTabs(startingBounds: DOMRect): DOMRect;
|
|
52
53
|
resizeDragHandle(): void;
|
|
@@ -3,7 +3,7 @@ import { WindowTitleBarContext } from "./windowTitleBarContext";
|
|
|
3
3
|
import { storeManager, Actions } from "./stores/windowTitleBarStore";
|
|
4
4
|
import "../../assets/css/finsemble.css";
|
|
5
5
|
import "../../assets/css/windowTitleBar.css";
|
|
6
|
-
import { clone } from "./../
|
|
6
|
+
import { clone } from "./../sdd/Appearance.helpers";
|
|
7
7
|
export class WindowTitleBarShell extends React.Component {
|
|
8
8
|
constructor(props) {
|
|
9
9
|
super(props);
|
|
@@ -193,9 +193,7 @@ export class WindowTitleBarShell extends React.Component {
|
|
|
193
193
|
onDoubleClick() {
|
|
194
194
|
Actions.clickMaximize();
|
|
195
195
|
}
|
|
196
|
-
|
|
197
|
-
let dragHandle = document.createElement("div");
|
|
198
|
-
dragHandle.className = dragHandleCssClass;
|
|
196
|
+
_setOnMouseUpAndDownHandlers(element) {
|
|
199
197
|
let isMousePressed = false;
|
|
200
198
|
const handleMouseDown = (event) => {
|
|
201
199
|
isMousePressed = true;
|
|
@@ -209,8 +207,13 @@ export class WindowTitleBarShell extends React.Component {
|
|
|
209
207
|
isMousePressed = false;
|
|
210
208
|
FSBL.Clients.WindowClient.stopMovingWindow();
|
|
211
209
|
};
|
|
212
|
-
|
|
213
|
-
|
|
210
|
+
element.onmousedown = handleMouseDown;
|
|
211
|
+
element.onmouseup = handleMouseUp;
|
|
212
|
+
}
|
|
213
|
+
makeDragHandle(fsblHeader, dragHandleCssClass) {
|
|
214
|
+
let dragHandle = document.createElement("div");
|
|
215
|
+
dragHandle.className = dragHandleCssClass;
|
|
216
|
+
this._setOnMouseUpAndDownHandlers(dragHandle);
|
|
214
217
|
dragHandle.ondblclick = () => {
|
|
215
218
|
this.onDoubleClick();
|
|
216
219
|
};
|
|
@@ -335,6 +338,13 @@ export class WindowTitleBarShell extends React.Component {
|
|
|
335
338
|
});
|
|
336
339
|
}
|
|
337
340
|
onShowTabsChanged(err, response) {
|
|
341
|
+
if (!response.value) {
|
|
342
|
+
let tabEditor = document.querySelector("div.fsbl-tab-editor");
|
|
343
|
+
if (tabEditor) {
|
|
344
|
+
tabEditor.style.zIndex = "2147483647";
|
|
345
|
+
this._setOnMouseUpAndDownHandlers(tabEditor);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
338
348
|
this.setState({
|
|
339
349
|
showTabs: response.value,
|
|
340
350
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WindowTitleBarShell.js","sourceRoot":"","sources":["../../../src/components/windowTitleBar/WindowTitleBarShell.tsx"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright 2017 by ChartIQ, Inc.\n * All rights reserved.\n */\nimport * as React from \"react\";\nimport { WindowTitleBarContext } from \"./windowTitleBarContext\";\nimport { storeManager, Actions } from \"./stores/windowTitleBarStore\";\nimport \"../../assets/css/finsemble.css\";\nimport \"../../assets/css/windowTitleBar.css\";\nimport { StandardError } from \"@finsemble/finsemble-api/types/types\";\nimport StoreModel from \"@finsemble/finsemble-api/types/clients/StoreModel\";\nimport { TabProperties } from \"../../types/windowTitleBar\";\nimport { clone } from \"./../smartDesktopDesigner/Appearance.helpers\";\n\ninterface WindowTitleBarShellProps {}\n\ninterface WindowTitleBarShellState {\n\ttabs: TabProperties[];\n\tactiveTab: TabProperties;\n\twindowTitle: string;\n\tinitialized: boolean;\n\talwaysOnTop: boolean;\n\tshowTabs: boolean;\n\tminButton: boolean;\n\tmaxButton: boolean;\n\tcloseButton: boolean;\n\tshowShareButton: boolean;\n\tshowLinkerButton: boolean;\n\tisTopRight: boolean;\n\tdockingEnabled: boolean;\n\talwaysOnTopButton: boolean;\n\tallowDragOnCenterRegion: boolean;\n\tdockingIcon: string;\n\thackScrollbar: boolean;\n\tshowDockingTooltip: boolean;\n\tshowTabRegion: boolean;\n\ttabBarBoundingBox: any;\n\tuseDOMBasedMovement: boolean;\n\tdragHandleName: string;\n}\n\nexport class WindowTitleBarShell extends React.Component<WindowTitleBarShellProps, WindowTitleBarShellState> {\n\tstore?: StoreModel;\n\n\tconstructor(props: WindowTitleBarShellProps) {\n\t\tsuper(props);\n\t\tthis.store = undefined;\n\n\t\tthis.bindCorrectContext();\n\t\tthis.state = {\n\t\t\tactiveTab: FSBL.Clients.WindowClient.getWindowIdentifier() as TabProperties,\n\t\t\tallowDragOnCenterRegion: true,\n\t\t\talwaysOnTop: false,\n\t\t\talwaysOnTopButton: false,\n\t\t\tcloseButton: false,\n\t\t\tdockingEnabled: false,\n\t\t\tdockingIcon: \"\",\n\t\t\thackScrollbar: false,\n\t\t\tinitialized: false,\n\t\t\tisTopRight: false,\n\t\t\tmaxButton: false,\n\t\t\tminButton: false,\n\t\t\tshowDockingTooltip: false,\n\t\t\tshowLinkerButton: false,\n\t\t\tshowShareButton: false,\n\t\t\tshowTabs: false,\n\t\t\tshowTabRegion: false,\n\t\t\ttabs: [],\n\t\t\ttabBarBoundingBox: {},\n\t\t\twindowTitle: \"\",\n\t\t\tuseDOMBasedMovement: true,\n\t\t\tdragHandleName: \"fsbl-drag-handle\",\n\t\t};\n\n\t\tfinsembleWindow.isAlwaysOnTop({}, (err, alwaysOnTop: boolean) => {\n\t\t\tthis.setState({ ...this.state, alwaysOnTop });\n\t\t});\n\n\t\tfinsembleWindow.addEventListener(\"alwaysOnTop\", this.alwaysOnTopListener);\n\t}\n\n\talwaysOnTopListener({ data: { alwaysOnTop } }: any) {\n\t\tthis.setState({ ...this.state, alwaysOnTop });\n\t}\n\n\t/**\n\t * This is necessary to make sure that the `this` inside of the callback is correct.\n\t *\n\t * @memberof WindowTitleBar\n\t */\n\tbindCorrectContext() {\n\t\tthis.onTitleChange = this.onTitleChange.bind(this);\n\t\tthis.onShowDockingToolTip = this.onShowDockingToolTip.bind(this);\n\t\tthis.onToggleDockingIcon = this.onToggleDockingIcon.bind(this);\n\t\tthis.onDockingEnabledChanged = this.onDockingEnabledChanged.bind(this);\n\t\tthis.onAlwaysOnTopChanged = this.onAlwaysOnTopChanged.bind(this);\n\t\tthis.showLinkerButton = this.showLinkerButton.bind(this);\n\t\tthis.isTopRight = this.isTopRight.bind(this);\n\t\tthis.allowDragOnCenterRegion = this.allowDragOnCenterRegion.bind(this);\n\t\tthis.disallowDragOnCenterRegion = this.disallowDragOnCenterRegion.bind(this);\n\t\tthis.setDOMBasedMovement = this.setDOMBasedMovement.bind(this);\n\t\tthis.onShareEmitterChanged = this.onShareEmitterChanged.bind(this);\n\t\tthis.onTabsChanged = this.onTabsChanged.bind(this);\n\t\tthis.onShowTabsChanged = this.onShowTabsChanged.bind(this);\n\t\tthis.onTilingStop = this.onTilingStop.bind(this);\n\t\tthis.onTilingStart = this.onTilingStart.bind(this);\n\t\tthis.resizeDragHandle = this.resizeDragHandle.bind(this);\n\t\tthis.onDoubleClick = this.onDoubleClick.bind(this);\n\t\tthis.alwaysOnTopListener = this.alwaysOnTopListener.bind(this);\n\t\tthis.onInitialized = this.onInitialized.bind(this);\n\t}\n\n\tonInitialized(store: StoreModel) {\n\t\tthis.store = store;\n\t\tthis.store.addListeners(\n\t\t\t[\n\t\t\t\t{ field: \"Main.windowTitle\", listener: this.onTitleChange },\n\t\t\t\t{ field: \"Main.showDockingTooltip\", listener: this.onShowDockingToolTip },\n\t\t\t\t{ field: \"Main.dockingIcon\", listener: this.onToggleDockingIcon },\n\t\t\t\t{ field: \"Main.dockingEnabled\", listener: this.onDockingEnabledChanged },\n\t\t\t\t{ field: \"AlwaysOnTop.show\", listener: this.onAlwaysOnTopChanged },\n\t\t\t\t{ field: \"Linker.showLinkerButton\", listener: this.showLinkerButton },\n\t\t\t\t{ field: \"Sharer.emitterEnabled\", listener: this.onShareEmitterChanged },\n\t\t\t\t{ field: \"isTopRight\", listener: this.isTopRight },\n\t\t\t\t{ field: \"tabs\", listener: this.onTabsChanged },\n\t\t\t\t{ field: \"showTabs\", listener: this.onShowTabsChanged },\n\t\t\t\t{ field: \"hackScrollbar\", listener: this.onShowTabsChanged },\n\t\t\t\t{ field: \"Main.useDOMBasedMovement\", listener: this.setDOMBasedMovement },\n\t\t\t],\n\t\t\t() => {}\n\t\t);\n\n\t\tFSBL.Clients.RouterClient.addListener(\"DockingService.startTilingOrTabbing\", this.disallowDragOnCenterRegion);\n\t\tFSBL.Clients.RouterClient.addListener(\"DockingService.stopTilingOrTabbing\", this.allowDragOnCenterRegion);\n\t\tFSBL.Clients.RouterClient.addListener(\"DockingService.cancelTilingOrTabbing\", this.allowDragOnCenterRegion);\n\n\t\tthis.onStoreChange();\n\t\tthis.setState({\n\t\t\tinitialized: true,\n\t\t});\n\t}\n\n\tonStoreChange() {\n\t\tlet activeIdentifier = finsembleWindow.identifier as TabProperties;\n\t\tactiveIdentifier.title = this.store?.getValue({\n\t\t\tfield: \"Main.windowTitle\",\n\t\t});\n\n\t\tthis.setState({\n\t\t\twindowTitle: this.store?.getValue({ field: \"Main.windowTitle\" }),\n\t\t\tminButton: !this.store?.getValue({ field: \"Minimize.hide\" }),\n\t\t\tmaxButton: !this.store?.getValue({ field: \"Maximize.hide\" }),\n\t\t\tcloseButton: !this.store?.getValue({ field: \"Close.hide\" }),\n\t\t\tshowLinkerButton: this.store?.getValue({\n\t\t\t\tfield: \"Linker.showLinkerButton\",\n\t\t\t}),\n\t\t\tshowShareButton: this.store?.getValue({\n\t\t\t\tfield: \"Sharer.emitterEnabled\",\n\t\t\t}),\n\t\t\tisTopRight: this.store?.getValue({ field: \"isTopRight\" }),\n\t\t\talwaysOnTopButton: this.store?.getValue({\n\t\t\t\tfield: \"AlwaysOnTop.show\",\n\t\t\t}),\n\t\t\tshowTabs: this.store?.getValue({ field: \"showTabs\" }),\n\t\t\thackScrollbar: this.store?.getValue({ field: \"hackScrollbar\" }),\n\t\t\ttabs: [activeIdentifier], // array of tabs for this window\n\t\t});\n\t}\n\n\tcomponentDidMount() {\n\t\t// Goal: If a user gets focus into the title bar (if they Alt+Tab or Cmd+Tab into the window),\n\t\t// we want to let get into the rest of the component using the keyboard alone. The UX for\n\t\t// this task will be to seemingly TAB from the title bar into the window, if possible.\n\t\t// Code: If the user presses the \"Tab\" key, move their focus to the browser view\n\t\twindow.addEventListener(\"keydown\", (e) => {\n\t\t\tif (e.key === \"Tab\") {\n\t\t\t\t// This magic moves focus to a browserView, if one exists\n\t\t\t\tfinsembleWindow.focus();\n\t\t\t}\n\t\t});\n\t\tlet header = document.getElementsByClassName(\"fsbl-header\")[0];\n\t\tdocument.body.style.marginTop = window.getComputedStyle(header, null).getPropertyValue(\"height\");\n\t\tthis.resizeDragHandle();\n\t\tthis.hackScrollbar();\n\t\tstoreManager.addInitializedListener(this.onInitialized);\n\t\tstoreManager.initialize();\n\t}\n\n\tcomponentDidUpdate() {\n\t\tthis.resizeDragHandle();\n\t}\n\n\tcomponentWillUnmount() {\n\t\tstoreManager.removeInitializedListener(this.onInitialized);\n\t\tif (this.state.initialized) {\n\t\t\tthis.store?.removeListeners(\n\t\t\t\t[\n\t\t\t\t\t{ field: \"Main.windowTitle\", listener: this.onTitleChange },\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"Main.showDockingTooltip\",\n\t\t\t\t\t\tlistener: this.onShowDockingToolTip,\n\t\t\t\t\t},\n\t\t\t\t\t{ field: \"Main.dockingIcon\", listener: this.onToggleDockingIcon },\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"Main.dockingEnabled\",\n\t\t\t\t\t\tlistener: this.onDockingEnabledChanged,\n\t\t\t\t\t},\n\t\t\t\t\t{ field: \"AlwaysOnTop.show\", listener: this.onAlwaysOnTopChanged },\n\t\t\t\t\t{ field: \"Linker.showLinkerButton\", listener: this.showLinkerButton },\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"Sharer.emitterEnabled\",\n\t\t\t\t\t\tlistener: this.onShareEmitterChanged,\n\t\t\t\t\t},\n\t\t\t\t\t{ field: \"isTopRight\", listener: this.isTopRight },\n\t\t\t\t\t{ field: \"tabs\", listener: this.onTabsChanged },\n\t\t\t\t\t{ field: \"showTabs\", listener: this.onShowTabsChanged },\n\t\t\t\t],\n\t\t\t\t() => {},\n\t\t\t\t() => {}\n\t\t\t);\n\t\t\tFSBL.Clients.RouterClient.removeListener(\"DockingService.startTilingOrTabbing\", this.disallowDragOnCenterRegion);\n\t\t\tFSBL.Clients.RouterClient.removeListener(\"DockingService.stopTilingOrTabbing\", this.allowDragOnCenterRegion);\n\t\t}\n\t}\n\n\tsetDOMBasedMovement(err: StandardError, response: any) {\n\t\tif (response && response.hasOwnProperty(\"value\")) {\n\t\t\tthis.setState(\n\t\t\t\t{\n\t\t\t\t\tuseDOMBasedMovement: response.value,\n\t\t\t\t\tdragHandleName: response.value ? \"fsbl-drag-handle\" : \"fsbl-drag-handle-native-movement\",\n\t\t\t\t},\n\t\t\t\tthis.resizeDragHandle\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * When we are not tiling/tabbing, we want to allow the user to drag the window around via any available space in the tab-region. This function allows that.\n\t */\n\tallowDragOnCenterRegion() {\n\t\tthis.setState({\n\t\t\tallowDragOnCenterRegion: true,\n\t\t});\n\t}\n\n\t/**\n\t * When we are tiling/tabbing, we do not want to allow any window to be dragged around and moved.\n\t */\n\tdisallowDragOnCenterRegion() {\n\t\tthis.setState({\n\t\t\tallowDragOnCenterRegion: false,\n\t\t});\n\t}\n\n\t/**\n\t * When tiling start, we want to find the dragHandler and hide it\n\t */\n\tonTilingStart() {\n\t\tlet dragHandle = document.querySelector(`.${this.state.dragHandleName}`);\n\t\tif (dragHandle) {\n\t\t\tdragHandle.classList.add(\"hidden\");\n\t\t}\n\t}\n\n\t/**\n\t * When tiling stops, we want to find the dragHandler and re-show it\n\t */\n\tonTilingStop() {\n\t\tlet dragHandle = document.querySelector(`.${this.state.dragHandleName}.hidden`);\n\t\tif (dragHandle) {\n\t\t\tdragHandle.classList.remove(\"hidden\");\n\t\t}\n\t}\n\n\t/**\n\t * Called whenever a tab is dropped on a non tab area.\n\t * It won't be called when dropped on a tab that handles handle the event.\n\t */\n\tonDropHandler() {\n\t\tFSBL.Clients.RouterClient.transmit(\"DockingService.cancelTilingOrTabbing\", {});\n\t}\n\n\t/**\n\t * Called when user double clicks on drag handle\n\t */\n\tonDoubleClick() {\n\t\t// Actions.clickMaximize checks the window state\n\t\t// and toggles between maximize and minimize.\n\t\tActions.clickMaximize();\n\t}\n\n\tmakeDragHandle(fsblHeader: Element, dragHandleCssClass: string): HTMLElement {\n\t\tlet dragHandle = document.createElement(\"div\");\n\t\tdragHandle.className = dragHandleCssClass;\n\n\t\t// if do double click it will invoke MouseDown and MouseUp events which could break the window bounds. So wait a 100ms for moving or resizing the window.\n\t\tlet isMousePressed = false;\n\t\tconst handleMouseDown = (event: MouseEvent) => {\n\t\t\tisMousePressed = true;\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (isMousePressed) {\n\t\t\t\t\tFSBL.Clients.WindowClient.startMovingWindow(event);\n\t\t\t\t}\n\t\t\t}, 100);\n\t\t};\n\t\tconst handleMouseUp = () => {\n\t\t\tisMousePressed = false;\n\t\t\tFSBL.Clients.WindowClient.stopMovingWindow();\n\t\t};\n\n\t\tdragHandle.onmousedown = handleMouseDown;\n\t\tdragHandle.onmouseup = handleMouseUp;\n\t\tdragHandle.ondblclick = () => {\n\t\t\tthis.onDoubleClick();\n\t\t};\n\t\tfsblHeader.insertBefore(dragHandle, fsblHeader.firstChild);\n\t\twindow.addEventListener(\"resize\", () => {\n\t\t\tthis.resizeDragHandle();\n\t\t});\n\t\treturn dragHandle;\n\t}\n\n\tdragHandleBoundsForShowTabs(startingBounds: DOMRect): DOMRect {\n\t\t// If there is more than one tab, then the drag area is the padding-left of fsbl-header-right\n\t\t// See .fsbl-tabs-multiple in the css\n\t\tif (this.state.tabs.length > 1) {\n\t\t\tconst headerRight = document.querySelector(\".fsbl-header-right\");\n\t\t\tif (headerRight) {\n\t\t\t\tconst computedStyle = getComputedStyle(headerRight);\n\t\t\t\t// override the bounds.width with the paddingLeft amount\n\t\t\t\treturn {\n\t\t\t\t\t// The spread operator only uses own properties; simply\n\t\t\t\t\t// spreading \"headerRight.getBoundingClientRect()\" will result in an\n\t\t\t\t\t// empty object being spread. Clone the object to be sure all\n\t\t\t\t\t// values are spread\n\t\t\t\t\t...clone(headerRight.getBoundingClientRect()),\n\t\t\t\t\twidth: parseInt(computedStyle.paddingLeft, 10),\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\treturn startingBounds;\n\t\t\t}\n\t\t} else {\n\t\t\t// If tabs are not enabled, then the remained of fsbl-header-center beyond the tabs\n\t\t\t// is the draggable area. This assumes left aligned tabs.\n\t\t\tconst fsblHeaderCenter = document.querySelector(\".fsbl-header-center\");\n\t\t\tconst bounds = fsblHeaderCenter?.getBoundingClientRect() ?? startingBounds;\n\t\t\tconst tabRegionWrapperDiv = fsblHeaderCenter?.querySelector(\".tab-region-wrapper div.fsbl-header-title\");\n\t\t\tif (tabRegionWrapperDiv) {\n\t\t\t\tconst theTabBounds = tabRegionWrapperDiv.getBoundingClientRect();\n\t\t\t\t// Calculate the right portion\n\t\t\t\treturn {\n\t\t\t\t\t...bounds,\n\t\t\t\t\tleft: bounds.left + theTabBounds.width,\n\t\t\t\t\twidth: bounds.width - theTabBounds.width,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\treturn bounds;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * The dragger is an absolutely positioned element that is superimposed on the actual area that we'd like to drag.\n\t * This is necessary due to a bug in Chromium. Effectively, we need the dragger to change its left position and width\n\t * to match the intended drag area. These dimensions can change whenever the header is re-rendered (for instance when\n\t * changing mode from tabbing to non-tabbing). Dimensions can also change when the window itself is resized (due to natural\n\t * css).\n\t *\n\t * Can remove all of the cq-drag and cq-no-drag because Chromium bug is fixed\n\t * Remove fsbl-drag-region, it is no longer needed\n\t * Hide the dragHandle during drop operations, so that it doesn't interfere\n\t */\n\tresizeDragHandle() {\n\t\ttry {\n\t\t\tconst fsblHeader = document.querySelector(\".fsbl-header\");\n\t\t\t// If there isn't an FSBLHeader then there doesn't need to be a drag handle.\n\t\t\tif (!fsblHeader) return;\n\n\t\t\tconst dragHandleCssClass = this.state.useDOMBasedMovement\n\t\t\t\t? \"fsbl-drag-handle\"\n\t\t\t\t: \"fsbl-drag-handle-native-movement\";\n\n\t\t\tconst dragHandleToRemoveClass = this.state.useDOMBasedMovement\n\t\t\t\t? \"fsbl-drag-handle-native-movement\"\n\t\t\t\t: \"fsbl-drag-handle\";\n\n\t\t\t// Create the dragger if it doesn't already exist\n\t\t\tlet dragHandle =\n\t\t\t\t(document.querySelector(`.${dragHandleCssClass}`) as HTMLElement) ??\n\t\t\t\tthis.makeDragHandle(fsblHeader, dragHandleCssClass);\n\n\t\t\t// When the titlebar starts up, useDOMBasedMovement will have a default value that is not the same as the config value\n\t\t\t// When the value from the config propagates down to the UI, we need to make sure the old drag handle is removed in place of the new\n\t\t\tconst dragHandleToRemove = document.querySelector(`.${dragHandleToRemoveClass}`) as HTMLElement;\n\t\t\tif (dragHandleToRemove) dragHandleToRemove.parentNode?.removeChild(dragHandleToRemove);\n\n\t\t\t// Set the height of the dragHandle to match the height of the window title bar\n\t\t\t// Do this every time through the render loop just in case a customer builds a\n\t\t\t// header bar with dynamic height!\n\t\t\tlet bounds = fsblHeader.getBoundingClientRect();\n\n\t\t\tdragHandle.style.height = `${bounds.height - 5}px`; // Subtract 5 pixels from height in order to make room for resize window cursor at top edge of window\n\t\t\tdragHandle.style.marginTop = `${-bounds.height + 5}px`; // Negative margin pulls the drag handle up over the fixed header\n\n\t\t\t// Start logic for determining where to place our dragHandle\n\t\t\tif (this.state.showTabs) {\n\t\t\t\tbounds = this.dragHandleBoundsForShowTabs(bounds);\n\t\t\t} else {\n\t\t\t\t// If tabs are not enabled, then the entire center is the drag area\n\t\t\t\tlet fsblHeaderCenter = document.querySelector(\".fsbl-header-center\");\n\t\t\t\tif (fsblHeaderCenter) bounds = fsblHeaderCenter.getBoundingClientRect();\n\t\t\t}\n\n\t\t\tif (bounds) {\n\t\t\t\tdragHandle.style.left = `${bounds.left}px`;\n\t\t\t\tdragHandle.style.width = `${bounds.width}px`;\n\t\t\t}\n\n\t\t\t// Add an event listener to hide the drag-handler when tiling is started\n\t\t\tFSBL.Clients.RouterClient.addListener(\"DockingService.startTilingOrTabbing\", this.onTilingStart);\n\n\t\t\t// Add an event listener to show the drag-handler when tiling is stopped or cancelled\n\t\t\tFSBL.Clients.RouterClient.addListener(\"DockingService.stopTilingOrTabbing\", this.onTilingStop);\n\t\t\tFSBL.Clients.RouterClient.addListener(\"DockingService.cancelTilingOrTabbing\", this.onTilingStop);\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n\n\t/**\n\t * Whether the component's config allows for the linker.\n\t * @param {} err\n\t * @param {*} response\n\t */\n\tshowLinkerButton(err: StandardError, response: any) {\n\t\tthis.setState({ showLinkerButton: response.value });\n\t}\n\n\t/**\n\t * Whether the window is the top-right-most window in a group of windows. If so, it renders a minimize icon for the whole group.\n\t * @param {} err\n\t * @param {*} response\n\t */\n\tisTopRight(err: StandardError, response: any) {\n\t\tthis.setState({ isTopRight: response.value });\n\t}\n\n\t/**\n\t * @param {*} err\n\t * @param {*} response\n\t */\n\tonTitleChange(err: StandardError, response: any) {\n\t\tlet { tabs } = this.state;\n\t\tlet myIdentifier = FSBL.Clients.WindowClient.getWindowIdentifier();\n\n\t\ttabs = tabs.map((el) => {\n\t\t\tif (!el.windowName && el.name) el.windowName = el.name;\n\t\t\tif (!el.name && el.windowName) el.name = el.windowName;\n\t\t\treturn el;\n\t\t});\n\n\t\tconst myIndex = tabs.findIndex((el: TabProperties) => el.name === myIdentifier.windowName);\n\t\tif (myIndex === -1) return;\n\n\t\tlet myTab = tabs[myIndex] || {};\n\t\tmyTab.title = response.value;\n\t\ttabs.splice(myIndex, 1, myTab);\n\n\t\tthis.setState({\n\t\t\twindowTitle: response.value,\n\t\t\ttabs: tabs,\n\t\t});\n\t}\n\n\t/**\n\t * The next few methods are store change handlers that sync local state with the store's state.\n\t */\n\tonShowDockingToolTip(err: StandardError, response: any) {\n\t\tthis.setState({ showDockingTooltip: response.value });\n\t}\n\n\tonToggleDockingIcon(err: StandardError, response: any) {\n\t\tthis.setState({ dockingIcon: response.value });\n\t}\n\n\tonDockingEnabledChanged(err: StandardError, response: any) {\n\t\tthis.setState({ dockingEnabled: response.value });\n\t}\n\n\tonAlwaysOnTopChanged(err: StandardError, response: any) {\n\t\tthis.setState({ alwaysOnTopButton: response.value });\n\t}\n\n\tonStoreChanged(newState: WindowTitleBarShellState) {\n\t\tthis.setState(newState);\n\t}\n\n\tonShareEmitterChanged(err: StandardError, response: any) {\n\t\tthis.setState({ showShareButton: response.value });\n\t}\n\n\tonTabsChanged(err: StandardError, response: any) {\n\t\tthis.setState({\n\t\t\ttabs: response.value,\n\t\t});\n\t}\n\n\tonShowTabsChanged(err: StandardError, response: any) {\n\t\tthis.setState({\n\t\t\tshowTabs: response.value,\n\t\t});\n\t}\n\n\t// Hack the window's scrollbar so that it displays underneath the header. html.overflow: hidden body.overflow:auto\n\t// This is turned on by default. Set \"Window Manager.hackScrollbar: false\" to turn it off\n\thackScrollbar() {\n\t\tif (this.state.hackScrollbar) {\n\t\t\tconst htmlElement = document.querySelector(\"html\");\n\t\t\tif (htmlElement) htmlElement.style.overflowY = \"hidden\";\n\t\t\tconst bodyElement = document.querySelector(\"body\");\n\t\t\tif (bodyElement) bodyElement.style.overflowY = \"auto\";\n\t\t}\n\t}\n\n\trender() {\n\t\tlet showDockingIcon = !this.state.dockingEnabled ? false : this.state.dockingIcon;\n\t\tlet isGrouped = this.state.dockingIcon == \"ejector\";\n\t\tlet showMinimizeIcon = (isGrouped && this.state.isTopRight) || !isGrouped; // If not in a group or if topright in a group\n\t\tlet tabRegionClasses = \"fsbl-tab-area\";\n\t\tlet headerClasses = \"fsbl-header\";\n\n\t\t// If we're showing tabs, we throw these classes on to modify styles.\n\t\tif (this.state.showTabs) {\n\t\t\theaderClasses = `${headerClasses} fsbl-tabs-enabled`;\n\t\t}\n\t\tif (this.state.tabs.length > 1) {\n\t\t\theaderClasses = `${headerClasses} fsbl-tabs-multiple`;\n\t\t}\n\t\tconst context = {\n\t\t\tshowLinkerButton: this.state.showLinkerButton,\n\t\t\tshowShareButton: this.state.showShareButton,\n\t\t\tshowTabRegion: this.state.showTabs,\n\t\t\tshowMinimizeButton: this.state.minButton && showMinimizeIcon,\n\t\t\tshowMaximizeButton: this.state.maxButton,\n\t\t\tonTabDropped: this.allowDragOnCenterRegion,\n\t\t\tshowDockingButton: showDockingIcon,\n\t\t\tshowCloseButton: this.state.closeButton,\n\t\t\tclassName: tabRegionClasses,\n\t\t\tthisWindowTitle: this.state.windowTitle,\n\t\t\tboundingBox: this.state.tabBarBoundingBox,\n\t\t\tlistenForDragOver: !this.state.allowDragOnCenterRegion,\n\t\t\ttabs: this.state.tabs,\n\t\t\tonTitleUpdated: this.resizeDragHandle,\n\t\t\tshowAlwaysOnTopButton: this.state.alwaysOnTopButton && showMinimizeIcon,\n\t\t\tshowTabs: this.state.showTabs,\n\t\t\talwaysOnTop: this.state.alwaysOnTop,\n\t\t\tuseDOMBasedMovement: this.state.useDOMBasedMovement,\n\t\t};\n\n\t\treturn (\n\t\t\t<div className={headerClasses} onDrop={this.onDropHandler.bind(this)}>\n\t\t\t\t{this.state.initialized && (\n\t\t\t\t\t<WindowTitleBarContext.Provider value={context}>{this.props.children}</WindowTitleBarContext.Provider>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"WindowTitleBarShell.js","sourceRoot":"","sources":["../../../src/components/windowTitleBar/WindowTitleBarShell.tsx"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright 2017 by ChartIQ, Inc.\n * All rights reserved.\n */\nimport * as React from \"react\";\nimport { WindowTitleBarContext } from \"./windowTitleBarContext\";\nimport { storeManager, Actions } from \"./stores/windowTitleBarStore\";\nimport \"../../assets/css/finsemble.css\";\nimport \"../../assets/css/windowTitleBar.css\";\nimport { StandardError } from \"@finsemble/finsemble-api/types/types\";\nimport StoreModel from \"@finsemble/finsemble-api/types/clients/StoreModel\";\nimport { TabProperties } from \"../../types/windowTitleBar\";\nimport { clone } from \"./../sdd/Appearance.helpers\";\n\ninterface WindowTitleBarShellProps {}\n\ninterface WindowTitleBarShellState {\n\ttabs: TabProperties[];\n\tactiveTab: TabProperties;\n\twindowTitle: string;\n\tinitialized: boolean;\n\talwaysOnTop: boolean;\n\tshowTabs: boolean;\n\tminButton: boolean;\n\tmaxButton: boolean;\n\tcloseButton: boolean;\n\tshowShareButton: boolean;\n\tshowLinkerButton: boolean;\n\tisTopRight: boolean;\n\tdockingEnabled: boolean;\n\talwaysOnTopButton: boolean;\n\tallowDragOnCenterRegion: boolean;\n\tdockingIcon: string;\n\thackScrollbar: boolean;\n\tshowDockingTooltip: boolean;\n\tshowTabRegion: boolean;\n\ttabBarBoundingBox: any;\n\tuseDOMBasedMovement: boolean;\n\tdragHandleName: string;\n}\n\nexport class WindowTitleBarShell extends React.Component<WindowTitleBarShellProps, WindowTitleBarShellState> {\n\tstore?: StoreModel;\n\n\tconstructor(props: WindowTitleBarShellProps) {\n\t\tsuper(props);\n\t\tthis.store = undefined;\n\n\t\tthis.bindCorrectContext();\n\t\tthis.state = {\n\t\t\tactiveTab: FSBL.Clients.WindowClient.getWindowIdentifier() as TabProperties,\n\t\t\tallowDragOnCenterRegion: true,\n\t\t\talwaysOnTop: false,\n\t\t\talwaysOnTopButton: false,\n\t\t\tcloseButton: false,\n\t\t\tdockingEnabled: false,\n\t\t\tdockingIcon: \"\",\n\t\t\thackScrollbar: false,\n\t\t\tinitialized: false,\n\t\t\tisTopRight: false,\n\t\t\tmaxButton: false,\n\t\t\tminButton: false,\n\t\t\tshowDockingTooltip: false,\n\t\t\tshowLinkerButton: false,\n\t\t\tshowShareButton: false,\n\t\t\tshowTabs: false,\n\t\t\tshowTabRegion: false,\n\t\t\ttabs: [],\n\t\t\ttabBarBoundingBox: {},\n\t\t\twindowTitle: \"\",\n\t\t\tuseDOMBasedMovement: true,\n\t\t\tdragHandleName: \"fsbl-drag-handle\",\n\t\t};\n\n\t\tfinsembleWindow.isAlwaysOnTop({}, (err, alwaysOnTop: boolean) => {\n\t\t\tthis.setState({ ...this.state, alwaysOnTop });\n\t\t});\n\n\t\tfinsembleWindow.addEventListener(\"alwaysOnTop\", this.alwaysOnTopListener);\n\t}\n\n\talwaysOnTopListener({ data: { alwaysOnTop } }: any) {\n\t\tthis.setState({ ...this.state, alwaysOnTop });\n\t}\n\n\t/**\n\t * This is necessary to make sure that the `this` inside of the callback is correct.\n\t *\n\t * @memberof WindowTitleBar\n\t */\n\tbindCorrectContext() {\n\t\tthis.onTitleChange = this.onTitleChange.bind(this);\n\t\tthis.onShowDockingToolTip = this.onShowDockingToolTip.bind(this);\n\t\tthis.onToggleDockingIcon = this.onToggleDockingIcon.bind(this);\n\t\tthis.onDockingEnabledChanged = this.onDockingEnabledChanged.bind(this);\n\t\tthis.onAlwaysOnTopChanged = this.onAlwaysOnTopChanged.bind(this);\n\t\tthis.showLinkerButton = this.showLinkerButton.bind(this);\n\t\tthis.isTopRight = this.isTopRight.bind(this);\n\t\tthis.allowDragOnCenterRegion = this.allowDragOnCenterRegion.bind(this);\n\t\tthis.disallowDragOnCenterRegion = this.disallowDragOnCenterRegion.bind(this);\n\t\tthis.setDOMBasedMovement = this.setDOMBasedMovement.bind(this);\n\t\tthis.onShareEmitterChanged = this.onShareEmitterChanged.bind(this);\n\t\tthis.onTabsChanged = this.onTabsChanged.bind(this);\n\t\tthis.onShowTabsChanged = this.onShowTabsChanged.bind(this);\n\t\tthis.onTilingStop = this.onTilingStop.bind(this);\n\t\tthis.onTilingStart = this.onTilingStart.bind(this);\n\t\tthis.resizeDragHandle = this.resizeDragHandle.bind(this);\n\t\tthis.onDoubleClick = this.onDoubleClick.bind(this);\n\t\tthis.alwaysOnTopListener = this.alwaysOnTopListener.bind(this);\n\t\tthis.onInitialized = this.onInitialized.bind(this);\n\t}\n\n\tonInitialized(store: StoreModel) {\n\t\tthis.store = store;\n\t\tthis.store.addListeners(\n\t\t\t[\n\t\t\t\t{ field: \"Main.windowTitle\", listener: this.onTitleChange },\n\t\t\t\t{ field: \"Main.showDockingTooltip\", listener: this.onShowDockingToolTip },\n\t\t\t\t{ field: \"Main.dockingIcon\", listener: this.onToggleDockingIcon },\n\t\t\t\t{ field: \"Main.dockingEnabled\", listener: this.onDockingEnabledChanged },\n\t\t\t\t{ field: \"AlwaysOnTop.show\", listener: this.onAlwaysOnTopChanged },\n\t\t\t\t{ field: \"Linker.showLinkerButton\", listener: this.showLinkerButton },\n\t\t\t\t{ field: \"Sharer.emitterEnabled\", listener: this.onShareEmitterChanged },\n\t\t\t\t{ field: \"isTopRight\", listener: this.isTopRight },\n\t\t\t\t{ field: \"tabs\", listener: this.onTabsChanged },\n\t\t\t\t{ field: \"showTabs\", listener: this.onShowTabsChanged },\n\t\t\t\t{ field: \"hackScrollbar\", listener: this.onShowTabsChanged },\n\t\t\t\t{ field: \"Main.useDOMBasedMovement\", listener: this.setDOMBasedMovement },\n\t\t\t],\n\t\t\t() => {}\n\t\t);\n\n\t\tFSBL.Clients.RouterClient.addListener(\"DockingService.startTilingOrTabbing\", this.disallowDragOnCenterRegion);\n\t\tFSBL.Clients.RouterClient.addListener(\"DockingService.stopTilingOrTabbing\", this.allowDragOnCenterRegion);\n\t\tFSBL.Clients.RouterClient.addListener(\"DockingService.cancelTilingOrTabbing\", this.allowDragOnCenterRegion);\n\n\t\tthis.onStoreChange();\n\t\tthis.setState({\n\t\t\tinitialized: true,\n\t\t});\n\t}\n\n\tonStoreChange() {\n\t\tlet activeIdentifier = finsembleWindow.identifier as TabProperties;\n\t\tactiveIdentifier.title = this.store?.getValue({\n\t\t\tfield: \"Main.windowTitle\",\n\t\t});\n\n\t\tthis.setState({\n\t\t\twindowTitle: this.store?.getValue({ field: \"Main.windowTitle\" }),\n\t\t\tminButton: !this.store?.getValue({ field: \"Minimize.hide\" }),\n\t\t\tmaxButton: !this.store?.getValue({ field: \"Maximize.hide\" }),\n\t\t\tcloseButton: !this.store?.getValue({ field: \"Close.hide\" }),\n\t\t\tshowLinkerButton: this.store?.getValue({\n\t\t\t\tfield: \"Linker.showLinkerButton\",\n\t\t\t}),\n\t\t\tshowShareButton: this.store?.getValue({\n\t\t\t\tfield: \"Sharer.emitterEnabled\",\n\t\t\t}),\n\t\t\tisTopRight: this.store?.getValue({ field: \"isTopRight\" }),\n\t\t\talwaysOnTopButton: this.store?.getValue({\n\t\t\t\tfield: \"AlwaysOnTop.show\",\n\t\t\t}),\n\t\t\tshowTabs: this.store?.getValue({ field: \"showTabs\" }),\n\t\t\thackScrollbar: this.store?.getValue({ field: \"hackScrollbar\" }),\n\t\t\ttabs: [activeIdentifier], // array of tabs for this window\n\t\t});\n\t}\n\n\tcomponentDidMount() {\n\t\t// Goal: If a user gets focus into the title bar (if they Alt+Tab or Cmd+Tab into the window),\n\t\t// we want to let get into the rest of the component using the keyboard alone. The UX for\n\t\t// this task will be to seemingly TAB from the title bar into the window, if possible.\n\t\t// Code: If the user presses the \"Tab\" key, move their focus to the browser view\n\t\twindow.addEventListener(\"keydown\", (e) => {\n\t\t\tif (e.key === \"Tab\") {\n\t\t\t\t// This magic moves focus to a browserView, if one exists\n\t\t\t\tfinsembleWindow.focus();\n\t\t\t}\n\t\t});\n\t\tlet header = document.getElementsByClassName(\"fsbl-header\")[0];\n\t\tdocument.body.style.marginTop = window.getComputedStyle(header, null).getPropertyValue(\"height\");\n\t\tthis.resizeDragHandle();\n\t\tthis.hackScrollbar();\n\t\tstoreManager.addInitializedListener(this.onInitialized);\n\t\tstoreManager.initialize();\n\t}\n\n\tcomponentDidUpdate() {\n\t\tthis.resizeDragHandle();\n\t}\n\n\tcomponentWillUnmount() {\n\t\tstoreManager.removeInitializedListener(this.onInitialized);\n\t\tif (this.state.initialized) {\n\t\t\tthis.store?.removeListeners(\n\t\t\t\t[\n\t\t\t\t\t{ field: \"Main.windowTitle\", listener: this.onTitleChange },\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"Main.showDockingTooltip\",\n\t\t\t\t\t\tlistener: this.onShowDockingToolTip,\n\t\t\t\t\t},\n\t\t\t\t\t{ field: \"Main.dockingIcon\", listener: this.onToggleDockingIcon },\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"Main.dockingEnabled\",\n\t\t\t\t\t\tlistener: this.onDockingEnabledChanged,\n\t\t\t\t\t},\n\t\t\t\t\t{ field: \"AlwaysOnTop.show\", listener: this.onAlwaysOnTopChanged },\n\t\t\t\t\t{ field: \"Linker.showLinkerButton\", listener: this.showLinkerButton },\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"Sharer.emitterEnabled\",\n\t\t\t\t\t\tlistener: this.onShareEmitterChanged,\n\t\t\t\t\t},\n\t\t\t\t\t{ field: \"isTopRight\", listener: this.isTopRight },\n\t\t\t\t\t{ field: \"tabs\", listener: this.onTabsChanged },\n\t\t\t\t\t{ field: \"showTabs\", listener: this.onShowTabsChanged },\n\t\t\t\t],\n\t\t\t\t() => {},\n\t\t\t\t() => {}\n\t\t\t);\n\t\t\tFSBL.Clients.RouterClient.removeListener(\"DockingService.startTilingOrTabbing\", this.disallowDragOnCenterRegion);\n\t\t\tFSBL.Clients.RouterClient.removeListener(\"DockingService.stopTilingOrTabbing\", this.allowDragOnCenterRegion);\n\t\t}\n\t}\n\n\tsetDOMBasedMovement(err: StandardError, response: any) {\n\t\tif (response && response.hasOwnProperty(\"value\")) {\n\t\t\tthis.setState(\n\t\t\t\t{\n\t\t\t\t\tuseDOMBasedMovement: response.value,\n\t\t\t\t\tdragHandleName: response.value ? \"fsbl-drag-handle\" : \"fsbl-drag-handle-native-movement\",\n\t\t\t\t},\n\t\t\t\tthis.resizeDragHandle\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * When we are not tiling/tabbing, we want to allow the user to drag the window around via any available space in the tab-region. This function allows that.\n\t */\n\tallowDragOnCenterRegion() {\n\t\tthis.setState({\n\t\t\tallowDragOnCenterRegion: true,\n\t\t});\n\t}\n\n\t/**\n\t * When we are tiling/tabbing, we do not want to allow any window to be dragged around and moved.\n\t */\n\tdisallowDragOnCenterRegion() {\n\t\tthis.setState({\n\t\t\tallowDragOnCenterRegion: false,\n\t\t});\n\t}\n\n\t/**\n\t * When tiling start, we want to find the dragHandler and hide it\n\t */\n\tonTilingStart() {\n\t\tlet dragHandle = document.querySelector(`.${this.state.dragHandleName}`);\n\t\tif (dragHandle) {\n\t\t\tdragHandle.classList.add(\"hidden\");\n\t\t}\n\t}\n\n\t/**\n\t * When tiling stops, we want to find the dragHandler and re-show it\n\t */\n\tonTilingStop() {\n\t\tlet dragHandle = document.querySelector(`.${this.state.dragHandleName}.hidden`);\n\t\tif (dragHandle) {\n\t\t\tdragHandle.classList.remove(\"hidden\");\n\t\t}\n\t}\n\n\t/**\n\t * Called whenever a tab is dropped on a non tab area.\n\t * It won't be called when dropped on a tab that handles handle the event.\n\t */\n\tonDropHandler() {\n\t\tFSBL.Clients.RouterClient.transmit(\"DockingService.cancelTilingOrTabbing\", {});\n\t}\n\n\t/**\n\t * Called when user double clicks on drag handle\n\t */\n\tonDoubleClick() {\n\t\t// Actions.clickMaximize checks the window state\n\t\t// and toggles between maximize and minimize.\n\t\tActions.clickMaximize();\n\t}\n\n\t_setOnMouseUpAndDownHandlers(element: HTMLDivElement) {\n\t\t// if do double click it will invoke MouseDown and MouseUp events which could break the window bounds. So wait a 100ms for moving or resizing the window.\n\t\tlet isMousePressed = false;\n\t\tconst handleMouseDown = (event: MouseEvent) => {\n\t\t\tisMousePressed = true;\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (isMousePressed) {\n\t\t\t\t\tFSBL.Clients.WindowClient.startMovingWindow(event);\n\t\t\t\t}\n\t\t\t}, 100);\n\t\t};\n\t\tconst handleMouseUp = () => {\n\t\t\tisMousePressed = false;\n\t\t\tFSBL.Clients.WindowClient.stopMovingWindow();\n\t\t};\n\n\t\telement.onmousedown = handleMouseDown;\n\t\telement.onmouseup = handleMouseUp;\n\t}\n\n\tmakeDragHandle(fsblHeader: Element, dragHandleCssClass: string): HTMLElement {\n\t\tlet dragHandle = document.createElement(\"div\");\n\t\tdragHandle.className = dragHandleCssClass;\n\t\tthis._setOnMouseUpAndDownHandlers(dragHandle);\n\n\t\tdragHandle.ondblclick = () => {\n\t\t\tthis.onDoubleClick();\n\t\t};\n\t\tfsblHeader.insertBefore(dragHandle, fsblHeader.firstChild);\n\t\twindow.addEventListener(\"resize\", () => {\n\t\t\tthis.resizeDragHandle();\n\t\t});\n\n\t\treturn dragHandle;\n\t}\n\n\tdragHandleBoundsForShowTabs(startingBounds: DOMRect): DOMRect {\n\t\t// If there is more than one tab, then the drag area is the padding-left of fsbl-header-right\n\t\t// See .fsbl-tabs-multiple in the css\n\t\tif (this.state.tabs.length > 1) {\n\t\t\tconst headerRight = document.querySelector(\".fsbl-header-right\");\n\t\t\tif (headerRight) {\n\t\t\t\tconst computedStyle = getComputedStyle(headerRight);\n\t\t\t\t// override the bounds.width with the paddingLeft amount\n\t\t\t\treturn {\n\t\t\t\t\t// The spread operator only uses own properties; simply\n\t\t\t\t\t// spreading \"headerRight.getBoundingClientRect()\" will result in an\n\t\t\t\t\t// empty object being spread. Clone the object to be sure all\n\t\t\t\t\t// values are spread\n\t\t\t\t\t...clone(headerRight.getBoundingClientRect()),\n\t\t\t\t\twidth: parseInt(computedStyle.paddingLeft, 10),\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\treturn startingBounds;\n\t\t\t}\n\t\t} else {\n\t\t\t// If tabs are not enabled, then the remained of fsbl-header-center beyond the tabs\n\t\t\t// is the draggable area. This assumes left aligned tabs.\n\t\t\tconst fsblHeaderCenter = document.querySelector(\".fsbl-header-center\");\n\t\t\tconst bounds = fsblHeaderCenter?.getBoundingClientRect() ?? startingBounds;\n\t\t\tconst tabRegionWrapperDiv = fsblHeaderCenter?.querySelector(\".tab-region-wrapper div.fsbl-header-title\");\n\t\t\tif (tabRegionWrapperDiv) {\n\t\t\t\tconst theTabBounds = tabRegionWrapperDiv.getBoundingClientRect();\n\t\t\t\t// Calculate the right portion\n\t\t\t\treturn {\n\t\t\t\t\t...bounds,\n\t\t\t\t\tleft: bounds.left + theTabBounds.width,\n\t\t\t\t\twidth: bounds.width - theTabBounds.width,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\treturn bounds;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * The dragger is an absolutely positioned element that is superimposed on the actual area that we'd like to drag.\n\t * This is necessary due to a bug in Chromium. Effectively, we need the dragger to change its left position and width\n\t * to match the intended drag area. These dimensions can change whenever the header is re-rendered (for instance when\n\t * changing mode from tabbing to non-tabbing). Dimensions can also change when the window itself is resized (due to natural\n\t * css).\n\t *\n\t * Can remove all of the cq-drag and cq-no-drag because Chromium bug is fixed\n\t * Remove fsbl-drag-region, it is no longer needed\n\t * Hide the dragHandle during drop operations, so that it doesn't interfere\n\t */\n\tresizeDragHandle() {\n\t\ttry {\n\t\t\tconst fsblHeader = document.querySelector(\".fsbl-header\");\n\t\t\t// If there isn't an FSBLHeader then there doesn't need to be a drag handle.\n\t\t\tif (!fsblHeader) return;\n\n\t\t\tconst dragHandleCssClass = this.state.useDOMBasedMovement\n\t\t\t\t? \"fsbl-drag-handle\"\n\t\t\t\t: \"fsbl-drag-handle-native-movement\";\n\n\t\t\tconst dragHandleToRemoveClass = this.state.useDOMBasedMovement\n\t\t\t\t? \"fsbl-drag-handle-native-movement\"\n\t\t\t\t: \"fsbl-drag-handle\";\n\n\t\t\t// Create the dragger if it doesn't already exist\n\t\t\tlet dragHandle =\n\t\t\t\t(document.querySelector(`.${dragHandleCssClass}`) as HTMLElement) ??\n\t\t\t\tthis.makeDragHandle(fsblHeader, dragHandleCssClass);\n\n\t\t\t// When the titlebar starts up, useDOMBasedMovement will have a default value that is not the same as the config value\n\t\t\t// When the value from the config propagates down to the UI, we need to make sure the old drag handle is removed in place of the new\n\t\t\tconst dragHandleToRemove = document.querySelector(`.${dragHandleToRemoveClass}`) as HTMLElement;\n\t\t\tif (dragHandleToRemove) dragHandleToRemove.parentNode?.removeChild(dragHandleToRemove);\n\n\t\t\t// Set the height of the dragHandle to match the height of the window title bar\n\t\t\t// Do this every time through the render loop just in case a customer builds a\n\t\t\t// header bar with dynamic height!\n\t\t\tlet bounds = fsblHeader.getBoundingClientRect();\n\n\t\t\tdragHandle.style.height = `${bounds.height - 5}px`; // Subtract 5 pixels from height in order to make room for resize window cursor at top edge of window\n\t\t\tdragHandle.style.marginTop = `${-bounds.height + 5}px`; // Negative margin pulls the drag handle up over the fixed header\n\n\t\t\t// Start logic for determining where to place our dragHandle\n\t\t\tif (this.state.showTabs) {\n\t\t\t\tbounds = this.dragHandleBoundsForShowTabs(bounds);\n\t\t\t} else {\n\t\t\t\t// If tabs are not enabled, then the entire center is the drag area\n\t\t\t\tlet fsblHeaderCenter = document.querySelector(\".fsbl-header-center\");\n\t\t\t\tif (fsblHeaderCenter) bounds = fsblHeaderCenter.getBoundingClientRect();\n\t\t\t}\n\n\t\t\tif (bounds) {\n\t\t\t\tdragHandle.style.left = `${bounds.left}px`;\n\t\t\t\tdragHandle.style.width = `${bounds.width}px`;\n\t\t\t}\n\n\t\t\t// Add an event listener to hide the drag-handler when tiling is started\n\t\t\tFSBL.Clients.RouterClient.addListener(\"DockingService.startTilingOrTabbing\", this.onTilingStart);\n\n\t\t\t// Add an event listener to show the drag-handler when tiling is stopped or cancelled\n\t\t\tFSBL.Clients.RouterClient.addListener(\"DockingService.stopTilingOrTabbing\", this.onTilingStop);\n\t\t\tFSBL.Clients.RouterClient.addListener(\"DockingService.cancelTilingOrTabbing\", this.onTilingStop);\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n\n\t/**\n\t * Whether the component's config allows for the linker.\n\t * @param {} err\n\t * @param {*} response\n\t */\n\tshowLinkerButton(err: StandardError, response: any) {\n\t\tthis.setState({ showLinkerButton: response.value });\n\t}\n\n\t/**\n\t * Whether the window is the top-right-most window in a group of windows. If so, it renders a minimize icon for the whole group.\n\t * @param {} err\n\t * @param {*} response\n\t */\n\tisTopRight(err: StandardError, response: any) {\n\t\tthis.setState({ isTopRight: response.value });\n\t}\n\n\t/**\n\t * @param {*} err\n\t * @param {*} response\n\t */\n\tonTitleChange(err: StandardError, response: any) {\n\t\tlet { tabs } = this.state;\n\t\tlet myIdentifier = FSBL.Clients.WindowClient.getWindowIdentifier();\n\n\t\ttabs = tabs.map((el) => {\n\t\t\tif (!el.windowName && el.name) el.windowName = el.name;\n\t\t\tif (!el.name && el.windowName) el.name = el.windowName;\n\t\t\treturn el;\n\t\t});\n\n\t\tconst myIndex = tabs.findIndex((el: TabProperties) => el.name === myIdentifier.windowName);\n\t\tif (myIndex === -1) return;\n\n\t\tlet myTab = tabs[myIndex] || {};\n\t\tmyTab.title = response.value;\n\t\ttabs.splice(myIndex, 1, myTab);\n\n\t\tthis.setState({\n\t\t\twindowTitle: response.value,\n\t\t\ttabs: tabs,\n\t\t});\n\t}\n\n\t/**\n\t * The next few methods are store change handlers that sync local state with the store's state.\n\t */\n\tonShowDockingToolTip(err: StandardError, response: any) {\n\t\tthis.setState({ showDockingTooltip: response.value });\n\t}\n\n\tonToggleDockingIcon(err: StandardError, response: any) {\n\t\tthis.setState({ dockingIcon: response.value });\n\t}\n\n\tonDockingEnabledChanged(err: StandardError, response: any) {\n\t\tthis.setState({ dockingEnabled: response.value });\n\t}\n\n\tonAlwaysOnTopChanged(err: StandardError, response: any) {\n\t\tthis.setState({ alwaysOnTopButton: response.value });\n\t}\n\n\tonStoreChanged(newState: WindowTitleBarShellState) {\n\t\tthis.setState(newState);\n\t}\n\n\tonShareEmitterChanged(err: StandardError, response: any) {\n\t\tthis.setState({ showShareButton: response.value });\n\t}\n\n\tonTabsChanged(err: StandardError, response: any) {\n\t\tthis.setState({\n\t\t\ttabs: response.value,\n\t\t});\n\t}\n\n\tonShowTabsChanged(err: StandardError, response: any) {\n\t\t// If we are not showing tabs, then it means that it is a non tabbed window\n\t\t// therefore we need to check whether we have a window title contained in\n\t\t// .div.fsbl-tab-editor so that we can edit it.\n\t\tif (!response.value) {\n\t\t\tlet tabEditor = document.querySelector(\"div.fsbl-tab-editor\") as HTMLDivElement;\n\t\t\tif (tabEditor) {\n\t\t\t\t// we set this z-index value to be slightly higher than the drag handle\n\t\t\t\t// to make the editor dragable AND double-clickcable\n\t\t\t\ttabEditor.style.zIndex = \"2147483647\";\n\t\t\t\t// We add the mousedown and mouseup functions to the tab editor\n\t\t\t\t// so that on a single mouse down it allows the user to drag the\n\t\t\t\t// window on both the .fsbl-drag-handle and the .fsbl-tab-editor\n\t\t\t\tthis._setOnMouseUpAndDownHandlers(tabEditor);\n\t\t\t}\n\t\t}\n\t\tthis.setState({\n\t\t\tshowTabs: response.value,\n\t\t});\n\t}\n\n\t// Hack the window's scrollbar so that it displays underneath the header. html.overflow: hidden body.overflow:auto\n\t// This is turned on by default. Set \"Window Manager.hackScrollbar: false\" to turn it off\n\thackScrollbar() {\n\t\tif (this.state.hackScrollbar) {\n\t\t\tconst htmlElement = document.querySelector(\"html\");\n\t\t\tif (htmlElement) htmlElement.style.overflowY = \"hidden\";\n\t\t\tconst bodyElement = document.querySelector(\"body\");\n\t\t\tif (bodyElement) bodyElement.style.overflowY = \"auto\";\n\t\t}\n\t}\n\n\trender() {\n\t\tlet showDockingIcon = !this.state.dockingEnabled ? false : this.state.dockingIcon;\n\t\tlet isGrouped = this.state.dockingIcon == \"ejector\";\n\t\tlet showMinimizeIcon = (isGrouped && this.state.isTopRight) || !isGrouped; // If not in a group or if topright in a group\n\t\tlet tabRegionClasses = \"fsbl-tab-area\";\n\t\tlet headerClasses = \"fsbl-header\";\n\n\t\t// If we're showing tabs, we throw these classes on to modify styles.\n\t\tif (this.state.showTabs) {\n\t\t\theaderClasses = `${headerClasses} fsbl-tabs-enabled`;\n\t\t}\n\t\tif (this.state.tabs.length > 1) {\n\t\t\theaderClasses = `${headerClasses} fsbl-tabs-multiple`;\n\t\t}\n\t\tconst context = {\n\t\t\tshowLinkerButton: this.state.showLinkerButton,\n\t\t\tshowShareButton: this.state.showShareButton,\n\t\t\tshowTabRegion: this.state.showTabs,\n\t\t\tshowMinimizeButton: this.state.minButton && showMinimizeIcon,\n\t\t\tshowMaximizeButton: this.state.maxButton,\n\t\t\tonTabDropped: this.allowDragOnCenterRegion,\n\t\t\tshowDockingButton: showDockingIcon,\n\t\t\tshowCloseButton: this.state.closeButton,\n\t\t\tclassName: tabRegionClasses,\n\t\t\tthisWindowTitle: this.state.windowTitle,\n\t\t\tboundingBox: this.state.tabBarBoundingBox,\n\t\t\tlistenForDragOver: !this.state.allowDragOnCenterRegion,\n\t\t\ttabs: this.state.tabs,\n\t\t\tonTitleUpdated: this.resizeDragHandle,\n\t\t\tshowAlwaysOnTopButton: this.state.alwaysOnTopButton && showMinimizeIcon,\n\t\t\tshowTabs: this.state.showTabs,\n\t\t\talwaysOnTop: this.state.alwaysOnTop,\n\t\t\tuseDOMBasedMovement: this.state.useDOMBasedMovement,\n\t\t};\n\n\t\treturn (\n\t\t\t<div className={headerClasses} onDrop={this.onDropHandler.bind(this)}>\n\t\t\t\t{this.state.initialized && (\n\t\t\t\t\t<WindowTitleBarContext.Provider value={context}>{this.props.children}</WindowTitleBarContext.Provider>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n}\n"]}
|
|
@@ -115,7 +115,7 @@ export class TabList extends React.Component {
|
|
|
115
115
|
});
|
|
116
116
|
}
|
|
117
117
|
findTabIndex(tab) {
|
|
118
|
-
return this.state.tabs.findIndex((el) => tab.windowName === el.windowName
|
|
118
|
+
return this.state.tabs.findIndex((el) => tab.windowName === el.windowName);
|
|
119
119
|
}
|
|
120
120
|
startDrag(e, windowIdentifier) {
|
|
121
121
|
this.setState({
|
|
@@ -289,7 +289,7 @@ export class TabList extends React.Component {
|
|
|
289
289
|
}
|
|
290
290
|
scrollToTab(tab) {
|
|
291
291
|
let { boundingBox } = this.state;
|
|
292
|
-
let tabIndex = this.state.tabs.findIndex((el) => el.windowName === tab.windowName
|
|
292
|
+
let tabIndex = this.state.tabs.findIndex((el) => el.windowName === tab.windowName);
|
|
293
293
|
if (tabIndex > -1) {
|
|
294
294
|
let leftEdgeOfTab = tabIndex * this.state.tabWidth;
|
|
295
295
|
let rightEdgeOfTab = leftEdgeOfTab + this.state.tabWidth;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabList.js","sourceRoot":"","sources":["../../../../../src/components/windowTitleBar/components/center/TabList.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\";\nimport { StandardError } from \"@finsemble/finsemble-api/types/types\";\nimport Tab from \"./Tab\";\nimport { FinsembleHoverDetector } from \"../../../legacyControls/FinsembleHoverDetector\";\nimport { Store, Actions } from \"../../stores/windowTitleBarStore\";\nimport { Title } from \"../windowTitle\";\nimport _throttle from \"lodash/throttle\";\nimport { TabListProps, TabListState, GetTabWidthParams, TabProperties } from \"../../../../types/windowTitleBar\";\nimport { WindowIdentifier } from \"@finsemble/finsemble-api\";\n\nlet TAB_WIDTH = 300;\n// Next two items are for calculating how large the title should be within a tab.\nconst ICON_AREA = 16;\nconst CLOSE_BUTTON_MARGIN = 12;\nconst MINIMUM_TAB_SIZE = 100;\n\nconst stopTilingOrTabbing = (\n\tparams: {\n\t\tmousePosition?: {\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t};\n\t\taction?: string;\n\t\tallowDropOnSelf?: boolean;\n\t},\n\tcb?: () => void\n) => {\n\tconst transmitAndQueryStop = () => {\n\t\t// docking service has a responder for the query\n\t\tFSBL.Clients.RouterClient.query(\"DockingService.stopTilingOrTabbing\", params, () => {\n\t\t\tcb?.();\n\t\t});\n\t\t// WindowTitleBarShell is listening for transmit events so that it knows when tiling/tabbing has stopped\n\t\tFSBL.Clients.RouterClient.transmit(\"DockingService.stopTilingOrTabbing\", params);\n\t};\n\t// Get the mouse position if not passed in.\n\tif (!params.mousePosition) {\n\t\tfin.desktop.System.getMousePosition((position) => {\n\t\t\tparams.mousePosition = position;\n\t\t\ttransmitAndQueryStop();\n\t\t\t// If allowDropOnSelf is true, it came from a tab/window drop event. Run the callback.\n\t\t\tif (!params.allowDropOnSelf) cb?.();\n\t\t});\n\t} else {\n\t\ttransmitAndQueryStop();\n\t\t// If allowDropOnSelf is true, it came from a tab/window drop event. Run the callback.\n\t\tif (!params.allowDropOnSelf) cb?.();\n\t}\n};\n\nconst isPointInBox = (\n\tpoint: {\n\t\tx: number;\n\t\ty: number;\n\t},\n\tbox: {\n\t\ttop: number;\n\t\tleft: number;\n\t\tbottom?: number;\n\t\tright?: number;\n\t\twidth: number;\n\t\theight: number;\n\t}\n): boolean => {\n\tif (!box.bottom) box.bottom = box.top + box.height;\n\tif (!box.right) box.right = box.left + box.width;\n\treturn point.x > box.left && point.x < box.right && point.y < box.bottom && point.y > box.top;\n};\n\nexport class TabList extends React.Component<TabListProps, TabListState> {\n\tmousePositionOnDragEnd: { x: number; y: number };\n\n\tonWindowResizeThrottled: (this: Window, ev: UIEvent) => any;\n\n\tconstructor(props: TabListProps) {\n\t\tsuper(props);\n\t\tlet initialState = Store.getValues([\"activeTab\", \"tabs\"]);\n\t\tlet activeIdentifier = finsembleWindow.identifier as typeof finsembleWindow.identifier & { title: string };\n\n\t\tif (activeIdentifier) {\n\t\t\tactiveIdentifier.title = finsembleWindow.windowOptions.title;\n\t\t}\n\t\tthis.state = {\n\t\t\ttranslateX: 0,\n\t\t\ttabs: initialState.tabs,\n\t\t\tactiveTab: activeIdentifier as TabProperties,\n\t\t\tboundingBox: {\n\t\t\t\tright: 0,\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0,\n\t\t\t\tbottom: 0,\n\t\t\t\theight: 0,\n\t\t\t\twidth: 0,\n\t\t\t},\n\t\t\tiAmDragging: false,\n\t\t\thoverState: \"false\",\n\t\t\ttabWidth: TAB_WIDTH,\n\t\t\thoveredTabIndex: undefined,\n\t\t};\n\t\tthis.onWindowResizeThrottled = () => {};\n\t\tthis.bindCorrectContext();\n\t\tthis.mousePositionOnDragEnd = {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t};\n\t}\n\n\t/**\n\t * Make sure that _this_ is correct inside of our event handlers.\n\t */\n\tbindCorrectContext() {\n\t\tthis.startDrag = this.startDrag.bind(this);\n\t\tthis.stopDrag = this.stopDrag.bind(this);\n\t\tthis.cancelTabbing = this.cancelTabbing.bind(this);\n\t\tthis.drop = this.drop.bind(this);\n\t\tthis.dragOver = this.dragOver.bind(this);\n\t\tthis.dragLeave = this.dragLeave.bind(this);\n\t\tthis.onMouseWheel = this.onMouseWheel.bind(this);\n\t\tthis.renderTitle = this.renderTitle.bind(this);\n\t\tthis.renderTabs = this.renderTabs.bind(this);\n\t\tthis.findTabIndex = this.findTabIndex.bind(this);\n\t\tthis.setActiveTab = this.setActiveTab.bind(this);\n\t\tthis.onTabAdded = this.onTabAdded.bind(this);\n\t\tthis.onTabClosed = this.onTabClosed.bind(this);\n\t\tthis.setActiveTab = this.setActiveTab.bind(this);\n\t\tthis.onTabsChanged = this.onTabsChanged.bind(this);\n\t\tthis.onTabDraggedOver = this.onTabDraggedOver.bind(this);\n\t\tthis.isTabRegionOverflowing = this.isTabRegionOverflowing.bind(this);\n\t\tthis.onWindowResize = this.onWindowResize.bind(this);\n\t\tthis.onWindowResizeThrottled = _throttle(this.onWindowResize, 100);\n\t\tthis.getTabWidth = this.getTabWidth.bind(this);\n\t\tthis.setTabListTranslateX = this.setTabListTranslateX.bind(this);\n\t\tthis.onTabListTranslateChanged = this.onTabListTranslateChanged.bind(this);\n\t}\n\n\tgetTabWidth(params: GetTabWidthParams = {}) {\n\t\tlet { boundingBox, tabList } = params;\n\t\tif (typeof tabList === \"undefined\") {\n\t\t\ttabList = this.state.tabs;\n\t\t}\n\t\tif (typeof boundingBox === \"undefined\") {\n\t\t\tboundingBox = (this.refs.Me as HTMLElement).getBoundingClientRect();\n\t\t}\n\t\tif (typeof boundingBox.right === \"undefined\") {\n\t\t\treturn TAB_WIDTH;\n\t\t}\n\t\tlet containerWidth = boundingBox.right - boundingBox.left;\n\t\tlet newTabWidth = containerWidth / tabList.length;\n\n\t\treturn newTabWidth < MINIMUM_TAB_SIZE ? MINIMUM_TAB_SIZE : newTabWidth;\n\t}\n\n\t/**\n\t * Resize handler. Calculates the space that the center-region is taking up. May be used to scale tabs proportionally.\n\t */\n\tonWindowResize() {\n\t\tlet bounds = (this.refs.Me as HTMLElement).getBoundingClientRect();\n\t\tthis.setState({\n\t\t\tboundingBox: bounds,\n\t\t\ttabWidth: this.getTabWidth(),\n\t\t});\n\t}\n\n\tfindTabIndex(tab: TabProperties) {\n\t\treturn this.state.tabs.findIndex((el) => tab.windowName === el.windowName && tab.uuid === el.uuid);\n\t}\n\n\t/**\n\t *\n\t * Function that's called when this component fires the onDragStart event, this will start the tiling or tabbing process\n\t *\n\t * @param e The SyntheticEvent created by React when the startdrag event is called\n\t * @memberof windowTitleBar\n\t */\n\tstartDrag(e: React.DragEvent<HTMLDivElement>, windowIdentifier: WindowIdentifier) {\n\t\tthis.setState({\n\t\t\tiAmDragging: true,\n\t\t});\n\t\te.dataTransfer.setData(\"application/fsbl-tab-data\", JSON.stringify(windowIdentifier));\n\t\tFSBL.Clients.RouterClient.transmit(\"DockingService.startTilingOrTabbing\", {\n\t\t\twindowIdentifier,\n\t\t});\n\t}\n\n\t/**\n\t * Called when the react component detects a drop (or stop drag, which is equivalent)\n\t *\n\t * @param e The SyntheticEvent created by React when the stopdrag event is called\n\t * @memberof windowTitleBar\n\t */\n\tstopDrag(e: React.DragEvent<HTMLDivElement>) {\n\t\t// We don't want onDropHandler() in windowTitleBarComponent.jsx\n\t\t// to handle this drop event, so we call event.stopPropagation().\n\t\te.stopPropagation();\n\t\tFSBL.Clients.Logger.system.debug(\"Tab stopDrag.\");\n\t\tthis.mousePositionOnDragEnd = {\n\t\t\tx: e.nativeEvent.screenX,\n\t\t\ty: e.nativeEvent.screenY,\n\t\t};\n\n\t\tconst { boundingBox } = this.state;\n\t\tfinsembleWindow.getBounds((err, bounds) => {\n\t\t\t// We ONLY want to know if we're in the tab region!\n\t\t\tconst tabRegion = {\n\t\t\t\ttop: boundingBox.top + (bounds?.top ?? 0),\n\t\t\t\tbottom: boundingBox.bottom + (bounds?.top ?? 0),\n\t\t\t\tleft: boundingBox.left + (bounds?.left ?? 0),\n\t\t\t\tright: boundingBox.right + (bounds?.left ?? 0),\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0,\n\t\t\t};\n\t\t\tif (!isPointInBox(this.mousePositionOnDragEnd, tabRegion)) {\n\t\t\t\t// allow for a 50ms delay so this message goes after a drop message from a target window if tabbing\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tstopTilingOrTabbing({\n\t\t\t\t\t\tmousePosition: this.mousePositionOnDragEnd,\n\t\t\t\t\t});\n\t\t\t\t}, 50);\n\t\t\t\tthis.setState({\n\t\t\t\t\tiAmDragging: false,\n\t\t\t\t});\n\t\t\t\tthis.onWindowResize();\n\t\t\t} else {\n\t\t\t\t// sometimes a tab gets dropped in a bad spot where no action gets taken and we get stuck in tiling mode\n\t\t\t\t// to make sure nothing bad happens, call cancel after a similar 50ms delay\n\t\t\t\t// If some action was taken, this will be ignored by Finsemble\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tFSBL.Clients.RouterClient.transmit(\"DockingService.cancelTilingOrTabbing\", {\n\t\t\t\t\t\twindowIdentifier: this.state.activeTab,\n\t\t\t\t\t});\n\t\t\t\t}, 50);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Helper function that will pull data from a drop event, parse it, and return it.\n\t * @param {event} e\n\t */\n\textractWindowIdentifier(e: React.DragEvent<HTMLElement>) {\n\t\ttry {\n\t\t\tlet identifier = JSON.parse(e.dataTransfer.getData(\"application/fsbl-tab-data\"));\n\t\t\t// If the \"identifier\" is formed properly, it'll have this properly. Otherwise, it's something else (e.g., share data, image, etc).\n\t\t\tif (typeof identifier.windowName !== \"undefined\") {\n\t\t\t\treturn identifier;\n\t\t\t} else if (identifier.waitForIdentifier) {\n\t\t\t\treturn identifier;\n\t\t\t} else {\n\t\t\t\tFSBL.Clients.Logger.system.error(\n\t\t\t\t\t\"Malformed drop object detected in windowTitleBar. Check tab dropping code. Expected windowIdentifier, got \",\n\t\t\t\t\tidentifier\n\t\t\t\t);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} catch (e2) {\n\t\t\tFSBL.Clients.Logger.system.error(\n\t\t\t\t\"Error in 'extractWindowIdentifier'. Check TabRegion.jsx. Either there was no data in the event, or it was a circular object that caused JSON.parse to fail. Javascript Error:\",\n\t\t\t\te2\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Called when a drop event occurs on the tab region. We (hope) that this came from a tab. Could be a share icon, an image, something else - that's why we check to see if the identifier exists before doing anything.\n\t * @param {event} e\n\t */\n\tdrop(e?: React.DragEvent<HTMLElement>) {\n\t\tlet identifier: any;\n\t\tif (e) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tidentifier = this.extractWindowIdentifier(e);\n\t\t}\n\t\tFSBL.Clients.Logger.system.debug(\"Tab drag drop.\");\n\t\tif (!identifier) return; // the dropped item is not a tab\n\t\tif (this.state.tabs.length === 1 && identifier.windowName === finsembleWindow.name) {\n\t\t\t// The source and destination tabs are the same\n\t\t\t//\n\t\t\t// Cancel the tabbing event\n\t\t\tFSBL.Clients.RouterClient.transmit(\"DockingService.cancelTilingOrTabbing\", {\n\t\t\t\twindowIdentifier: this.state.activeTab,\n\t\t\t});\n\t\t\t// But also set \"iAmDragging\" to false in order to allow other tabs to be dragged in here\n\t\t\tthis.setState({\n\t\t\t\tiAmDragging: false,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tstopTilingOrTabbing({ allowDropOnSelf: true, action: \"tabbing\" }, () => {\n\t\t\tFSBL.Clients.RouterClient.transmit(\"tabbingDragEnd\", { success: true });\n\t\t\tif (identifier && identifier.windowName) {\n\t\t\t\t// Calls a method defined inside of windowTitleBar.jsx.\n\t\t\t\tthis.onTabAdded(identifier, this.state.hoveredTabIndex);\n\t\t\t} else if (identifier && identifier.waitForIdentifier) {\n\t\t\t\tlet subscribeId: { subscribeID: string; topic: string };\n\t\t\t\tlet tabIdentifierSubscriber = (err: StandardError, response: { data: TabProperties }) => {\n\t\t\t\t\tif (!response.data.windowName) return;\n\t\t\t\t\tFSBL.Clients.RouterClient.unsubscribe(subscribeId);\n\t\t\t\t\tthis.onTabAdded(response.data, this.state.hoveredTabIndex);\n\t\t\t\t};\n\t\t\t\tsubscribeId = FSBL.Clients.RouterClient.subscribe(`Finsemble.${identifier.guid}`, tabIdentifierSubscriber);\n\t\t\t} else {\n\t\t\t\tFSBL.Clients.Logger.system.error(\n\t\t\t\t\t\"Unexpected drop event on window title bar. Check the 'drop' method on TabRegion.jsx.\"\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\n\tisTabRegionOverflowing() {\n\t\tlet lastTab = {\n\t\t\tright: this.state.tabs.length * this.state.tabWidth,\n\t\t};\n\t\treturn lastTab.right + this.state.translateX > this.state.boundingBox.right - this.state.boundingBox.left;\n\t}\n\n\t/**\n\t * Event handler for when a user wheels inside of the tab region. We translate the deltaY that the event provides into horizontal movement. The translateX value that we return will be used in the render method below.\n\t * @param {event} e\n\t * This should probably be refactored into separate handlers for scroll and mousewheel to account for the differences in event properties.\n\t */\n\tonMouseWheel(e: React.WheelEvent) {\n\t\te.preventDefault();\n\t\tlet numTabs = this.state.tabs.length;\n\t\tlet translateX = 0;\n\t\t// If there's more than one tab, do some calculations, otherwise we aren't going to scroll this region, no matter how much the user wants us to.\n\t\tif (numTabs > 1) {\n\t\t\tlet currentX = (this.refs.Me as HTMLElement).scrollLeft;\n\t\t\tlet { boundingBox } = this.state;\n\t\t\t// Figure out position of first tab and last tab.\n\t\t\tlet firstTab = {\n\t\t\t\tleft: 0 + boundingBox.left,\n\t\t\t};\n\t\t\tlet lastTab = {\n\t\t\t\tright: numTabs * this.state.tabWidth,\n\t\t\t};\n\t\t\tlet deltaX = this.state.tabWidth / 3;\n\t\t\tif (e.nativeEvent.deltaY < 0) {\n\t\t\t\tdeltaX = 0 - deltaX;\n\t\t\t}\n\t\t\t// Mouses with high sensitivity will cause massive scroll amounts. We don't want to scroll more than one tab's width in a single mouse wheel, otherwise you risk missing a tab.\n\t\t\tif (Math.abs(deltaX) > this.state.tabWidth) {\n\t\t\t\tlet isNegative = false;\n\t\t\t\tif (deltaX < 0) {\n\t\t\t\t\tisNegative = true;\n\t\t\t\t}\n\t\t\t\tdeltaX = isNegative ? 0 - this.state.tabWidth : this.state.tabWidth;\n\t\t\t}\n\n\t\t\t// when we set scrollLeft on the element, this event fires. But there's no actual event. so stop.\n\t\t\tif (!e.nativeEvent.deltaY) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet originalDeltaY = e.nativeEvent.deltaY;\n\t\t\tlet deltaY = originalDeltaY;\n\t\t\tif (Math.abs(originalDeltaY) > this.state.tabWidth / 3) {\n\t\t\t\tdeltaY = this.state.tabWidth / 3;\n\t\t\t\tif (originalDeltaY < 0) {\n\t\t\t\t\tdeltaY = 0 - deltaY;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttranslateX = deltaY + currentX;\n\t\t\tlet newRightForLastTab = lastTab.right + translateX;\n\t\t\tlet newLeftForFirstTab = firstTab.left + translateX;\n\t\t\t// Do not let the left of the first tab move to the right of the left edge of the bounding box.\n\t\t\tif (newLeftForFirstTab < 0) {\n\t\t\t\treturn this.scrollToFirstTab();\n\t\t\t} else if (e.nativeEvent.deltaY < 0 && newRightForLastTab <= boundingBox.right) {\n\t\t\t\t// ONLY IF the user is scrolling from right-to-left (deltaY will be negative). IF they try to do that, do not allow the right edge of the last tab to detach.\n\t\t\t\treturn this.scrollToLastTab();\n\t\t\t}\n\t\t\t// Else, the translation is okay. We're in the middle of our list and the first and last tabs aren't being rendered improperly.\n\t\t\ttranslateX < 0 ? (translateX = 0) : translateX;\n\t\t\tthis.setState({ translateX });\n\t\t}\n\t}\n\n\t/**\n\t * Scrolls to our active tab.\n\t */\n\tscrollToActiveTab() {\n\t\tthis.scrollToTab(this.state.activeTab);\n\t}\n\n\t/**\n\t * Scrolls to the first tab in our list of tabs.\n\t */\n\tscrollToFirstTab() {\n\t\tlet firstTab = this.state.tabs[0];\n\t\tthis.scrollToTab(firstTab);\n\t}\n\n\t/**\n\t * Scrolls to the last tab in our list of tabs\n\t */\n\tscrollToLastTab() {\n\t\tlet lastTab = this.state.tabs[this.state.tabs.length - 1];\n\t\tthis.scrollToTab(lastTab);\n\t}\n\n\t/**\n\t * Function that will horizontally scroll the tab region so that the right edge of the tab lines up with the right edge of the tab region.\n\t * @param {} tab\n\t */\n\tscrollToTab(tab: TabProperties) {\n\t\t// 'BoundingBox' is just the boundingClientRect of the tab region. It is, in essence, the center part of the windowTitleBar.\n\t\tlet { boundingBox } = this.state;\n\n\t\tlet tabIndex = this.state.tabs.findIndex((el) => el.windowName === tab.windowName && el.uuid === tab.uuid);\n\t\tif (tabIndex > -1) {\n\t\t\tlet leftEdgeOfTab = tabIndex * this.state.tabWidth;\n\t\t\tlet rightEdgeOfTab = leftEdgeOfTab + this.state.tabWidth;\n\t\t\tlet translateX = rightEdgeOfTab;\n\t\t\t// Our translation is this: Take the right edge of the bounding box, and subtract the left edge. This gives us the 0 point for the box. Then, we subtract the right edge of the tab. The result is a number that we use to shift the entire element and align the right edge of the tab with the right edge of the bounding box. We also account for the 30 px region on the right.\n\n\t\t\t// If there's no overflow, we don't scroll.\n\t\t\tif (rightEdgeOfTab < boundingBox.right) {\n\t\t\t\ttranslateX = 0;\n\t\t\t} else {\n\t\t\t\t// Our translation is this: Take the right edge of the bounding box, and subtract the left edge. This gives us the 0 point for the box. Then, we subtract the right edge of the tab. The result is a number that we use to shift the entire element and align the right edge of the tab with the right edge of the bounding box.\n\t\t\t\ttranslateX = boundingBox.right - boundingBox.left - rightEdgeOfTab;\n\t\t\t\t// If there's no overflow, we don't scroll.\n\t\t\t\tif (rightEdgeOfTab < boundingBox.right) {\n\t\t\t\t\ttranslateX = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.setTabListTranslateX(translateX);\n\t\t}\n\t}\n\n\tsetTabListTranslateX(translateX: number) {\n\t\tActions.setTabListScrollPosition(translateX);\n\t}\n\n\t/**\n\t * Someone is dragging _something_ over the tab region. We respond by rendering the ghost tab.\n\t * @param {event} e\n\t */\n\tdragOver(e: React.DragEvent) {\n\t\te.preventDefault();\n\t}\n\n\t/**\n\t * Triggered when the user moves their mouse out of the tabRegion after a dragOver event happens. When they leave, we hide our placeholder tab.\n\t * @param {event} e\n\t */\n\tdragLeave(e: React.DragEvent<HTMLDivElement>) {\n\t\tlet boundingRect = this.state.boundingBox;\n\t\tif (!isPointInBox({ x: e.screenX, y: e.screenY }, boundingRect)) {\n\t\t\tthis.setState({\n\t\t\t\thoveredTabIndex: undefined,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Set to a timeout. An event is sent to the RouterClient which will be handled by the drop handler on the window.\n\t * In the event that a drop handler never fires to stop tiling or tabbing, this will take care of it.\n\t *\n\t * @memberof windowTitleBar\n\t */\n\tcancelTabbing() {\n\t\tstopTilingOrTabbing({ allowDropOnSelf: true });\n\t\tthis.onWindowResize();\n\t}\n\n\t/**\n\t * Basically exists just to keep the render method clean. Gives conditional classes to the active tab.\n\t * @param {tab} tab\n\t */\n\tgetTabClasses(tab: TabProperties) {\n\t\tlet classes = \"fsbl-tab\";\n\t\tlet tabIndex = this.findTabIndex(tab);\n\t\tif (tabIndex === this.state.hoveredTabIndex) classes = `${classes} ghost-tab`;\n\t\tif (this.state.activeTab && tab.windowName === this.state.activeTab.windowName) {\n\t\t\tclasses = `${classes} fsbl-active-tab`;\n\t\t}\n\t\treturn classes;\n\t}\n\n\tonTabDraggedOver(e: React.DragEvent<HTMLElement>, tabDraggedOver: TabProperties) {\n\t\te.preventDefault();\n\t\t// Find index of tab.\n\t\tlet tabIndex = this.findTabIndex(tabDraggedOver);\n\t\tthis.setState({\n\t\t\thoveredTabIndex: tabIndex,\n\t\t});\n\t}\n\n\t/**\n\t * OnClick handler for the close button on individual tabs.\n\t * @PLACEHOLDER will interact with tabbing API\n\t * @param {*} tab\n\t */\n\tonTabClosed(identifier: TabProperties) {\n\t\tActions.closeTab(identifier);\n\t}\n\n\t/**\n\t * drop handler for the tab region.\n\t * @param {*} tab\n\t */\n\tonTabAdded(identifier: TabProperties, newIndex: number | undefined) {\n\t\tif (newIndex === -1) {\n\t\t\tnewIndex = undefined;\n\t\t}\n\n\t\tlet myIdentifier = finsembleWindow.identifier as typeof finsembleWindow.identifier & { title: string };\n\t\tif (myIdentifier) {\n\t\t\tmyIdentifier.title = finsembleWindow.windowOptions.title;\n\t\t}\n\t\tif (this.state.tabs.length === 1 && identifier.windowName == myIdentifier.windowName) {\n\t\t\treturn;\n\t\t}\n\t\tif (typeof newIndex === \"number\") {\n\t\t\tActions.reorderTab(identifier, newIndex);\n\t\t}\n\t\tthis.setState({\n\t\t\thoveredTabIndex: undefined,\n\t\t});\n\t}\n\n\t/**\n\t * OnClick handler for individual tabs.\n\t * @PLACEHOLDER will interact with tabbing API\n\t * @param {*} tab\n\t */\n\tsetActiveTab(tab: TabProperties) {\n\t\tActions.setActiveTab(tab);\n\t}\n\n\tonTabsChanged(err: StandardError, response: { value: TabProperties[] }) {\n\t\tlet { value } = response;\n\t\tthis.setState({\n\t\t\ttabs: value,\n\t\t\ttabWidth: this.getTabWidth({ tabList: value }),\n\t\t});\n\t}\n\n\tonTabListTranslateChanged(err: StandardError, response: { value: number }) {\n\t\tlet { value } = response;\n\t\tthis.setState({\n\t\t\ttranslateX: value,\n\t\t});\n\t}\n\n\tUNSAFE_componentWillMount() {\n\t\t// Store.addListener({ field: \"activeTab\" }, this.onActiveTabChanged);\n\t\tStore.addListener({ field: \"tabs\" }, this.onTabsChanged);\n\t\tStore.addListener({ field: \"tabListTranslateX\" }, this.onTabListTranslateChanged);\n\t}\n\n\tcomponentDidMount() {\n\t\twindow.addEventListener(\"resize\", this.onWindowResizeThrottled);\n\t\tlet boundingBox = (this.refs.Me as HTMLElement).getBoundingClientRect();\n\t\tthis.setState({\n\t\t\tboundingBox: boundingBox,\n\t\t\ttabWidth: this.getTabWidth({ boundingBox }),\n\t\t});\n\t}\n\n\tcomponentWillUnmount() {\n\t\t// Store.removeListener({ field: \"activeTab\" }, this.onActiveTabChanged);\n\t\tStore.removeListener({ field: \"tabs\" }, this.onTabsChanged);\n\t\tStore.removeListener({ field: \"tabListTranslateX\" }, this.onTabListTranslateChanged);\n\t\twindow.removeEventListener(\"resize\", this.onWindowResizeThrottled);\n\t}\n\n\thoverAction(newHoverState: string) {\n\t\tthis.setState({ hoverState: newHoverState });\n\t}\n\n\trender() {\n\t\tlet { translateX } = this.state;\n\t\ttranslateX = Math.abs(translateX);\n\t\t// If we have just 1 tab, we render the title. Unless someone is dragging a tab around - in that case, we will render the tab view, even though we only have 1.\n\n\t\tlet componentToRender = \"title\";\n\t\tif (this.state.tabs.length === 1 && this.props.listenForDragOver && !this.state.iAmDragging) {\n\t\t\tcomponentToRender = \"tabs\";\n\t\t}\n\t\tif (this.state.tabs.length > 1) {\n\t\t\tcomponentToRender = \"tabs\";\n\t\t}\n\t\t// Cleanup in case we were translated before closing the second to last tab. This left-aligns the title.\n\t\tif (componentToRender === \"title\") {\n\t\t\ttranslateX = 0;\n\t\t}\n\n\t\tif (this.refs.Me) {\n\t\t\t(this.refs.Me as HTMLElement).scrollLeft = translateX;\n\t\t}\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref=\"Me\"\n\t\t\t\tonDragLeave={this.dragLeave}\n\t\t\t\tclassName={this.props.className}\n\t\t\t\tonWheel={this.onMouseWheel}\n\t\t\t\tonScroll={(e) => {\n\t\t\t\t\tthis.onMouseWheel(e as unknown as React.WheelEvent);\n\t\t\t\t}}\n\t\t\t\tonDrop={this.drop}\n\t\t\t\tonDragOver={this.dragOver}\n\t\t\t>\n\t\t\t\t<div className=\"tab-region-wrapper\">\n\t\t\t\t\t{componentToRender === \"title\" && this.renderTitle()}\n\t\t\t\t\t{componentToRender === \"tabs\" && this.renderTabs()}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t/**\n\t * Function to render the title. Helps keep the render code clean.\n\t */\n\trenderTitle() {\n\t\tconst windowIdentifier: WindowIdentifier = {\n\t\t\twindowName: finsembleWindow.name,\n\t\t\tuuid: finsembleWindow.uuid,\n\t\t};\n\t\treturn (\n\t\t\t<div\n\t\t\t\tdraggable=\"true\"\n\t\t\t\tonDragStart={(e) => {\n\t\t\t\t\tFSBL.Clients.Logger.system.debug(\"Tab drag start - TITLE\");\n\t\t\t\t\tlet activeIdentifier = finsembleWindow.identifier as typeof finsembleWindow.identifier & { title: string };\n\t\t\t\t\tactiveIdentifier.title = finsembleWindow.windowOptions.title;\n\t\t\t\t\tthis.startDrag(e, activeIdentifier);\n\t\t\t\t}}\n\t\t\t\tonDragEnd={this.stopDrag}\n\t\t\t\tdata-hover={this.state.hoverState}\n\t\t\t\tclassName={\"fsbl-header-title\"}\n\t\t\t>\n\t\t\t\t<FinsembleHoverDetector edge=\"top\" hoverAction={this.hoverAction.bind(this)} />\n\t\t\t\t<Title onUpdate={this.props.onTitleUpdated} windowIdentifier={windowIdentifier}></Title>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t/**\n\t * Renders the array of tabs.\n\t * @param {*} props\n\t */\n\trenderTabs() {\n\t\tlet titleWidth = this.state.tabWidth - ICON_AREA - CLOSE_BUTTON_MARGIN;\n\n\t\treturn this.state.tabs.map((tab) => (\n\t\t\t<Tab\n\t\t\t\tdraggable=\"true\"\n\t\t\t\tkey={tab.windowName} // this is a unique identifier for React so it knows when to update the DOM\n\t\t\t\tclassName={this.getTabClasses(tab)}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tthis.setActiveTab(tab);\n\t\t\t\t}}\n\t\t\t\tonDragStart={(e, identifier) => {\n\t\t\t\t\tFSBL.Clients.Logger.system.debug(\"Tab drag - TAB\", identifier.windowName);\n\t\t\t\t\tthis.startDrag(e, identifier);\n\t\t\t\t}}\n\t\t\t\tonDrop={this.drop}\n\t\t\t\tonDragEnd={this.stopDrag}\n\t\t\t\tonTabClose={() => {\n\t\t\t\t\tthis.onTabClosed(tab);\n\t\t\t\t}}\n\t\t\t\tonTabDraggedOver={this.onTabDraggedOver}\n\t\t\t\tlistenForDragOver={this.props.listenForDragOver}\n\t\t\t\ttabWidth={this.state.tabWidth}\n\t\t\t\ttitleWidth={titleWidth}\n\t\t\t\twindowIdentifier={tab}\n\t\t\t/>\n\t\t));\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TabList.js","sourceRoot":"","sources":["../../../../../src/components/windowTitleBar/components/center/TabList.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\";\nimport { StandardError } from \"@finsemble/finsemble-api/types/types\";\nimport Tab from \"./Tab\";\nimport { FinsembleHoverDetector } from \"../../../legacyControls/FinsembleHoverDetector\";\nimport { Store, Actions } from \"../../stores/windowTitleBarStore\";\nimport { Title } from \"../windowTitle\";\nimport _throttle from \"lodash/throttle\";\nimport { TabListProps, TabListState, GetTabWidthParams, TabProperties } from \"../../../../types/windowTitleBar\";\nimport { WindowIdentifier } from \"@finsemble/finsemble-api\";\n\nlet TAB_WIDTH = 300;\n// Next two items are for calculating how large the title should be within a tab.\nconst ICON_AREA = 16;\nconst CLOSE_BUTTON_MARGIN = 12;\nconst MINIMUM_TAB_SIZE = 100;\n\nconst stopTilingOrTabbing = (\n\tparams: {\n\t\tmousePosition?: {\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t};\n\t\taction?: string;\n\t\tallowDropOnSelf?: boolean;\n\t},\n\tcb?: () => void\n) => {\n\tconst transmitAndQueryStop = () => {\n\t\t// docking service has a responder for the query\n\t\tFSBL.Clients.RouterClient.query(\"DockingService.stopTilingOrTabbing\", params, () => {\n\t\t\tcb?.();\n\t\t});\n\t\t// WindowTitleBarShell is listening for transmit events so that it knows when tiling/tabbing has stopped\n\t\tFSBL.Clients.RouterClient.transmit(\"DockingService.stopTilingOrTabbing\", params);\n\t};\n\t// Get the mouse position if not passed in.\n\tif (!params.mousePosition) {\n\t\tfin.desktop.System.getMousePosition((position) => {\n\t\t\tparams.mousePosition = position;\n\t\t\ttransmitAndQueryStop();\n\t\t\t// If allowDropOnSelf is true, it came from a tab/window drop event. Run the callback.\n\t\t\tif (!params.allowDropOnSelf) cb?.();\n\t\t});\n\t} else {\n\t\ttransmitAndQueryStop();\n\t\t// If allowDropOnSelf is true, it came from a tab/window drop event. Run the callback.\n\t\tif (!params.allowDropOnSelf) cb?.();\n\t}\n};\n\nconst isPointInBox = (\n\tpoint: {\n\t\tx: number;\n\t\ty: number;\n\t},\n\tbox: {\n\t\ttop: number;\n\t\tleft: number;\n\t\tbottom?: number;\n\t\tright?: number;\n\t\twidth: number;\n\t\theight: number;\n\t}\n): boolean => {\n\tif (!box.bottom) box.bottom = box.top + box.height;\n\tif (!box.right) box.right = box.left + box.width;\n\treturn point.x > box.left && point.x < box.right && point.y < box.bottom && point.y > box.top;\n};\n\nexport class TabList extends React.Component<TabListProps, TabListState> {\n\tmousePositionOnDragEnd: { x: number; y: number };\n\n\tonWindowResizeThrottled: (this: Window, ev: UIEvent) => any;\n\n\tconstructor(props: TabListProps) {\n\t\tsuper(props);\n\t\tlet initialState = Store.getValues([\"activeTab\", \"tabs\"]);\n\t\tlet activeIdentifier = finsembleWindow.identifier as typeof finsembleWindow.identifier & { title: string };\n\n\t\tif (activeIdentifier) {\n\t\t\tactiveIdentifier.title = finsembleWindow.windowOptions.title;\n\t\t}\n\t\tthis.state = {\n\t\t\ttranslateX: 0,\n\t\t\ttabs: initialState.tabs,\n\t\t\tactiveTab: activeIdentifier as TabProperties,\n\t\t\tboundingBox: {\n\t\t\t\tright: 0,\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0,\n\t\t\t\tbottom: 0,\n\t\t\t\theight: 0,\n\t\t\t\twidth: 0,\n\t\t\t},\n\t\t\tiAmDragging: false,\n\t\t\thoverState: \"false\",\n\t\t\ttabWidth: TAB_WIDTH,\n\t\t\thoveredTabIndex: undefined,\n\t\t};\n\t\tthis.onWindowResizeThrottled = () => {};\n\t\tthis.bindCorrectContext();\n\t\tthis.mousePositionOnDragEnd = {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t};\n\t}\n\n\t/**\n\t * Make sure that _this_ is correct inside of our event handlers.\n\t */\n\tbindCorrectContext() {\n\t\tthis.startDrag = this.startDrag.bind(this);\n\t\tthis.stopDrag = this.stopDrag.bind(this);\n\t\tthis.cancelTabbing = this.cancelTabbing.bind(this);\n\t\tthis.drop = this.drop.bind(this);\n\t\tthis.dragOver = this.dragOver.bind(this);\n\t\tthis.dragLeave = this.dragLeave.bind(this);\n\t\tthis.onMouseWheel = this.onMouseWheel.bind(this);\n\t\tthis.renderTitle = this.renderTitle.bind(this);\n\t\tthis.renderTabs = this.renderTabs.bind(this);\n\t\tthis.findTabIndex = this.findTabIndex.bind(this);\n\t\tthis.setActiveTab = this.setActiveTab.bind(this);\n\t\tthis.onTabAdded = this.onTabAdded.bind(this);\n\t\tthis.onTabClosed = this.onTabClosed.bind(this);\n\t\tthis.setActiveTab = this.setActiveTab.bind(this);\n\t\tthis.onTabsChanged = this.onTabsChanged.bind(this);\n\t\tthis.onTabDraggedOver = this.onTabDraggedOver.bind(this);\n\t\tthis.isTabRegionOverflowing = this.isTabRegionOverflowing.bind(this);\n\t\tthis.onWindowResize = this.onWindowResize.bind(this);\n\t\tthis.onWindowResizeThrottled = _throttle(this.onWindowResize, 100);\n\t\tthis.getTabWidth = this.getTabWidth.bind(this);\n\t\tthis.setTabListTranslateX = this.setTabListTranslateX.bind(this);\n\t\tthis.onTabListTranslateChanged = this.onTabListTranslateChanged.bind(this);\n\t}\n\n\tgetTabWidth(params: GetTabWidthParams = {}) {\n\t\tlet { boundingBox, tabList } = params;\n\t\tif (typeof tabList === \"undefined\") {\n\t\t\ttabList = this.state.tabs;\n\t\t}\n\t\tif (typeof boundingBox === \"undefined\") {\n\t\t\tboundingBox = (this.refs.Me as HTMLElement).getBoundingClientRect();\n\t\t}\n\t\tif (typeof boundingBox.right === \"undefined\") {\n\t\t\treturn TAB_WIDTH;\n\t\t}\n\t\tlet containerWidth = boundingBox.right - boundingBox.left;\n\t\tlet newTabWidth = containerWidth / tabList.length;\n\n\t\treturn newTabWidth < MINIMUM_TAB_SIZE ? MINIMUM_TAB_SIZE : newTabWidth;\n\t}\n\n\t/**\n\t * Resize handler. Calculates the space that the center-region is taking up. May be used to scale tabs proportionally.\n\t */\n\tonWindowResize() {\n\t\tlet bounds = (this.refs.Me as HTMLElement).getBoundingClientRect();\n\t\tthis.setState({\n\t\t\tboundingBox: bounds,\n\t\t\ttabWidth: this.getTabWidth(),\n\t\t});\n\t}\n\n\tfindTabIndex(tab: TabProperties) {\n\t\treturn this.state.tabs.findIndex((el) => tab.windowName === el.windowName);\n\t}\n\n\t/**\n\t *\n\t * Function that's called when this component fires the onDragStart event, this will start the tiling or tabbing process\n\t *\n\t * @param e The SyntheticEvent created by React when the startdrag event is called\n\t * @memberof windowTitleBar\n\t */\n\tstartDrag(e: React.DragEvent<HTMLDivElement>, windowIdentifier: WindowIdentifier) {\n\t\tthis.setState({\n\t\t\tiAmDragging: true,\n\t\t});\n\t\te.dataTransfer.setData(\"application/fsbl-tab-data\", JSON.stringify(windowIdentifier));\n\t\tFSBL.Clients.RouterClient.transmit(\"DockingService.startTilingOrTabbing\", {\n\t\t\twindowIdentifier,\n\t\t});\n\t}\n\n\t/**\n\t * Called when the react component detects a drop (or stop drag, which is equivalent)\n\t *\n\t * @param e The SyntheticEvent created by React when the stopdrag event is called\n\t * @memberof windowTitleBar\n\t */\n\tstopDrag(e: React.DragEvent<HTMLDivElement>) {\n\t\t// We don't want onDropHandler() in windowTitleBarComponent.jsx\n\t\t// to handle this drop event, so we call event.stopPropagation().\n\t\te.stopPropagation();\n\t\tFSBL.Clients.Logger.system.debug(\"Tab stopDrag.\");\n\t\tthis.mousePositionOnDragEnd = {\n\t\t\tx: e.nativeEvent.screenX,\n\t\t\ty: e.nativeEvent.screenY,\n\t\t};\n\n\t\tconst { boundingBox } = this.state;\n\t\tfinsembleWindow.getBounds((err, bounds) => {\n\t\t\t// We ONLY want to know if we're in the tab region!\n\t\t\tconst tabRegion = {\n\t\t\t\ttop: boundingBox.top + (bounds?.top ?? 0),\n\t\t\t\tbottom: boundingBox.bottom + (bounds?.top ?? 0),\n\t\t\t\tleft: boundingBox.left + (bounds?.left ?? 0),\n\t\t\t\tright: boundingBox.right + (bounds?.left ?? 0),\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0,\n\t\t\t};\n\t\t\tif (!isPointInBox(this.mousePositionOnDragEnd, tabRegion)) {\n\t\t\t\t// allow for a 50ms delay so this message goes after a drop message from a target window if tabbing\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tstopTilingOrTabbing({\n\t\t\t\t\t\tmousePosition: this.mousePositionOnDragEnd,\n\t\t\t\t\t});\n\t\t\t\t}, 50);\n\t\t\t\tthis.setState({\n\t\t\t\t\tiAmDragging: false,\n\t\t\t\t});\n\t\t\t\tthis.onWindowResize();\n\t\t\t} else {\n\t\t\t\t// sometimes a tab gets dropped in a bad spot where no action gets taken and we get stuck in tiling mode\n\t\t\t\t// to make sure nothing bad happens, call cancel after a similar 50ms delay\n\t\t\t\t// If some action was taken, this will be ignored by Finsemble\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tFSBL.Clients.RouterClient.transmit(\"DockingService.cancelTilingOrTabbing\", {\n\t\t\t\t\t\twindowIdentifier: this.state.activeTab,\n\t\t\t\t\t});\n\t\t\t\t}, 50);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Helper function that will pull data from a drop event, parse it, and return it.\n\t * @param {event} e\n\t */\n\textractWindowIdentifier(e: React.DragEvent<HTMLElement>) {\n\t\ttry {\n\t\t\tlet identifier = JSON.parse(e.dataTransfer.getData(\"application/fsbl-tab-data\"));\n\t\t\t// If the \"identifier\" is formed properly, it'll have this properly. Otherwise, it's something else (e.g., share data, image, etc).\n\t\t\tif (typeof identifier.windowName !== \"undefined\") {\n\t\t\t\treturn identifier;\n\t\t\t} else if (identifier.waitForIdentifier) {\n\t\t\t\treturn identifier;\n\t\t\t} else {\n\t\t\t\tFSBL.Clients.Logger.system.error(\n\t\t\t\t\t\"Malformed drop object detected in windowTitleBar. Check tab dropping code. Expected windowIdentifier, got \",\n\t\t\t\t\tidentifier\n\t\t\t\t);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} catch (e2) {\n\t\t\tFSBL.Clients.Logger.system.error(\n\t\t\t\t\"Error in 'extractWindowIdentifier'. Check TabRegion.jsx. Either there was no data in the event, or it was a circular object that caused JSON.parse to fail. Javascript Error:\",\n\t\t\t\te2\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Called when a drop event occurs on the tab region. We (hope) that this came from a tab. Could be a share icon, an image, something else - that's why we check to see if the identifier exists before doing anything.\n\t * @param {event} e\n\t */\n\tdrop(e?: React.DragEvent<HTMLElement>) {\n\t\tlet identifier: any;\n\t\tif (e) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tidentifier = this.extractWindowIdentifier(e);\n\t\t}\n\t\tFSBL.Clients.Logger.system.debug(\"Tab drag drop.\");\n\t\tif (!identifier) return; // the dropped item is not a tab\n\t\tif (this.state.tabs.length === 1 && identifier.windowName === finsembleWindow.name) {\n\t\t\t// The source and destination tabs are the same\n\t\t\t//\n\t\t\t// Cancel the tabbing event\n\t\t\tFSBL.Clients.RouterClient.transmit(\"DockingService.cancelTilingOrTabbing\", {\n\t\t\t\twindowIdentifier: this.state.activeTab,\n\t\t\t});\n\t\t\t// But also set \"iAmDragging\" to false in order to allow other tabs to be dragged in here\n\t\t\tthis.setState({\n\t\t\t\tiAmDragging: false,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tstopTilingOrTabbing({ allowDropOnSelf: true, action: \"tabbing\" }, () => {\n\t\t\tFSBL.Clients.RouterClient.transmit(\"tabbingDragEnd\", { success: true });\n\t\t\tif (identifier && identifier.windowName) {\n\t\t\t\t// Calls a method defined inside of windowTitleBar.jsx.\n\t\t\t\tthis.onTabAdded(identifier, this.state.hoveredTabIndex);\n\t\t\t} else if (identifier && identifier.waitForIdentifier) {\n\t\t\t\tlet subscribeId: { subscribeID: string; topic: string };\n\t\t\t\tlet tabIdentifierSubscriber = (err: StandardError, response: { data: TabProperties }) => {\n\t\t\t\t\tif (!response.data.windowName) return;\n\t\t\t\t\tFSBL.Clients.RouterClient.unsubscribe(subscribeId);\n\t\t\t\t\tthis.onTabAdded(response.data, this.state.hoveredTabIndex);\n\t\t\t\t};\n\t\t\t\tsubscribeId = FSBL.Clients.RouterClient.subscribe(`Finsemble.${identifier.guid}`, tabIdentifierSubscriber);\n\t\t\t} else {\n\t\t\t\tFSBL.Clients.Logger.system.error(\n\t\t\t\t\t\"Unexpected drop event on window title bar. Check the 'drop' method on TabRegion.jsx.\"\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\n\tisTabRegionOverflowing() {\n\t\tlet lastTab = {\n\t\t\tright: this.state.tabs.length * this.state.tabWidth,\n\t\t};\n\t\treturn lastTab.right + this.state.translateX > this.state.boundingBox.right - this.state.boundingBox.left;\n\t}\n\n\t/**\n\t * Event handler for when a user wheels inside of the tab region. We translate the deltaY that the event provides into horizontal movement. The translateX value that we return will be used in the render method below.\n\t * @param {event} e\n\t * This should probably be refactored into separate handlers for scroll and mousewheel to account for the differences in event properties.\n\t */\n\tonMouseWheel(e: React.WheelEvent) {\n\t\te.preventDefault();\n\t\tlet numTabs = this.state.tabs.length;\n\t\tlet translateX = 0;\n\t\t// If there's more than one tab, do some calculations, otherwise we aren't going to scroll this region, no matter how much the user wants us to.\n\t\tif (numTabs > 1) {\n\t\t\tlet currentX = (this.refs.Me as HTMLElement).scrollLeft;\n\t\t\tlet { boundingBox } = this.state;\n\t\t\t// Figure out position of first tab and last tab.\n\t\t\tlet firstTab = {\n\t\t\t\tleft: 0 + boundingBox.left,\n\t\t\t};\n\t\t\tlet lastTab = {\n\t\t\t\tright: numTabs * this.state.tabWidth,\n\t\t\t};\n\t\t\tlet deltaX = this.state.tabWidth / 3;\n\t\t\tif (e.nativeEvent.deltaY < 0) {\n\t\t\t\tdeltaX = 0 - deltaX;\n\t\t\t}\n\t\t\t// Mouses with high sensitivity will cause massive scroll amounts. We don't want to scroll more than one tab's width in a single mouse wheel, otherwise you risk missing a tab.\n\t\t\tif (Math.abs(deltaX) > this.state.tabWidth) {\n\t\t\t\tlet isNegative = false;\n\t\t\t\tif (deltaX < 0) {\n\t\t\t\t\tisNegative = true;\n\t\t\t\t}\n\t\t\t\tdeltaX = isNegative ? 0 - this.state.tabWidth : this.state.tabWidth;\n\t\t\t}\n\n\t\t\t// when we set scrollLeft on the element, this event fires. But there's no actual event. so stop.\n\t\t\tif (!e.nativeEvent.deltaY) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet originalDeltaY = e.nativeEvent.deltaY;\n\t\t\tlet deltaY = originalDeltaY;\n\t\t\tif (Math.abs(originalDeltaY) > this.state.tabWidth / 3) {\n\t\t\t\tdeltaY = this.state.tabWidth / 3;\n\t\t\t\tif (originalDeltaY < 0) {\n\t\t\t\t\tdeltaY = 0 - deltaY;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttranslateX = deltaY + currentX;\n\t\t\tlet newRightForLastTab = lastTab.right + translateX;\n\t\t\tlet newLeftForFirstTab = firstTab.left + translateX;\n\t\t\t// Do not let the left of the first tab move to the right of the left edge of the bounding box.\n\t\t\tif (newLeftForFirstTab < 0) {\n\t\t\t\treturn this.scrollToFirstTab();\n\t\t\t} else if (e.nativeEvent.deltaY < 0 && newRightForLastTab <= boundingBox.right) {\n\t\t\t\t// ONLY IF the user is scrolling from right-to-left (deltaY will be negative). IF they try to do that, do not allow the right edge of the last tab to detach.\n\t\t\t\treturn this.scrollToLastTab();\n\t\t\t}\n\t\t\t// Else, the translation is okay. We're in the middle of our list and the first and last tabs aren't being rendered improperly.\n\t\t\ttranslateX < 0 ? (translateX = 0) : translateX;\n\t\t\tthis.setState({ translateX });\n\t\t}\n\t}\n\n\t/**\n\t * Scrolls to our active tab.\n\t */\n\tscrollToActiveTab() {\n\t\tthis.scrollToTab(this.state.activeTab);\n\t}\n\n\t/**\n\t * Scrolls to the first tab in our list of tabs.\n\t */\n\tscrollToFirstTab() {\n\t\tlet firstTab = this.state.tabs[0];\n\t\tthis.scrollToTab(firstTab);\n\t}\n\n\t/**\n\t * Scrolls to the last tab in our list of tabs\n\t */\n\tscrollToLastTab() {\n\t\tlet lastTab = this.state.tabs[this.state.tabs.length - 1];\n\t\tthis.scrollToTab(lastTab);\n\t}\n\n\t/**\n\t * Function that will horizontally scroll the tab region so that the right edge of the tab lines up with the right edge of the tab region.\n\t * @param {} tab\n\t */\n\tscrollToTab(tab: TabProperties) {\n\t\t// 'BoundingBox' is just the boundingClientRect of the tab region. It is, in essence, the center part of the windowTitleBar.\n\t\tlet { boundingBox } = this.state;\n\n\t\tlet tabIndex = this.state.tabs.findIndex((el) => el.windowName === tab.windowName);\n\t\tif (tabIndex > -1) {\n\t\t\tlet leftEdgeOfTab = tabIndex * this.state.tabWidth;\n\t\t\tlet rightEdgeOfTab = leftEdgeOfTab + this.state.tabWidth;\n\t\t\tlet translateX = rightEdgeOfTab;\n\t\t\t// Our translation is this: Take the right edge of the bounding box, and subtract the left edge. This gives us the 0 point for the box. Then, we subtract the right edge of the tab. The result is a number that we use to shift the entire element and align the right edge of the tab with the right edge of the bounding box. We also account for the 30 px region on the right.\n\n\t\t\t// If there's no overflow, we don't scroll.\n\t\t\tif (rightEdgeOfTab < boundingBox.right) {\n\t\t\t\ttranslateX = 0;\n\t\t\t} else {\n\t\t\t\t// Our translation is this: Take the right edge of the bounding box, and subtract the left edge. This gives us the 0 point for the box. Then, we subtract the right edge of the tab. The result is a number that we use to shift the entire element and align the right edge of the tab with the right edge of the bounding box.\n\t\t\t\ttranslateX = boundingBox.right - boundingBox.left - rightEdgeOfTab;\n\t\t\t\t// If there's no overflow, we don't scroll.\n\t\t\t\tif (rightEdgeOfTab < boundingBox.right) {\n\t\t\t\t\ttranslateX = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.setTabListTranslateX(translateX);\n\t\t}\n\t}\n\n\tsetTabListTranslateX(translateX: number) {\n\t\tActions.setTabListScrollPosition(translateX);\n\t}\n\n\t/**\n\t * Someone is dragging _something_ over the tab region. We respond by rendering the ghost tab.\n\t * @param {event} e\n\t */\n\tdragOver(e: React.DragEvent) {\n\t\te.preventDefault();\n\t}\n\n\t/**\n\t * Triggered when the user moves their mouse out of the tabRegion after a dragOver event happens. When they leave, we hide our placeholder tab.\n\t * @param {event} e\n\t */\n\tdragLeave(e: React.DragEvent<HTMLDivElement>) {\n\t\tlet boundingRect = this.state.boundingBox;\n\t\tif (!isPointInBox({ x: e.screenX, y: e.screenY }, boundingRect)) {\n\t\t\tthis.setState({\n\t\t\t\thoveredTabIndex: undefined,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Set to a timeout. An event is sent to the RouterClient which will be handled by the drop handler on the window.\n\t * In the event that a drop handler never fires to stop tiling or tabbing, this will take care of it.\n\t *\n\t * @memberof windowTitleBar\n\t */\n\tcancelTabbing() {\n\t\tstopTilingOrTabbing({ allowDropOnSelf: true });\n\t\tthis.onWindowResize();\n\t}\n\n\t/**\n\t * Basically exists just to keep the render method clean. Gives conditional classes to the active tab.\n\t * @param {tab} tab\n\t */\n\tgetTabClasses(tab: TabProperties) {\n\t\tlet classes = \"fsbl-tab\";\n\t\tlet tabIndex = this.findTabIndex(tab);\n\t\tif (tabIndex === this.state.hoveredTabIndex) classes = `${classes} ghost-tab`;\n\t\tif (this.state.activeTab && tab.windowName === this.state.activeTab.windowName) {\n\t\t\tclasses = `${classes} fsbl-active-tab`;\n\t\t}\n\t\treturn classes;\n\t}\n\n\tonTabDraggedOver(e: React.DragEvent<HTMLElement>, tabDraggedOver: TabProperties) {\n\t\te.preventDefault();\n\t\t// Find index of tab.\n\t\tlet tabIndex = this.findTabIndex(tabDraggedOver);\n\t\tthis.setState({\n\t\t\thoveredTabIndex: tabIndex,\n\t\t});\n\t}\n\n\t/**\n\t * OnClick handler for the close button on individual tabs.\n\t * @PLACEHOLDER will interact with tabbing API\n\t * @param {*} tab\n\t */\n\tonTabClosed(identifier: TabProperties) {\n\t\tActions.closeTab(identifier);\n\t}\n\n\t/**\n\t * drop handler for the tab region.\n\t * @param {*} tab\n\t */\n\tonTabAdded(identifier: TabProperties, newIndex: number | undefined) {\n\t\tif (newIndex === -1) {\n\t\t\tnewIndex = undefined;\n\t\t}\n\n\t\tlet myIdentifier = finsembleWindow.identifier as typeof finsembleWindow.identifier & { title: string };\n\t\tif (myIdentifier) {\n\t\t\tmyIdentifier.title = finsembleWindow.windowOptions.title;\n\t\t}\n\t\tif (this.state.tabs.length === 1 && identifier.windowName == myIdentifier.windowName) {\n\t\t\treturn;\n\t\t}\n\t\tif (typeof newIndex === \"number\") {\n\t\t\tActions.reorderTab(identifier, newIndex);\n\t\t}\n\t\tthis.setState({\n\t\t\thoveredTabIndex: undefined,\n\t\t});\n\t}\n\n\t/**\n\t * OnClick handler for individual tabs.\n\t * @PLACEHOLDER will interact with tabbing API\n\t * @param {*} tab\n\t */\n\tsetActiveTab(tab: TabProperties) {\n\t\tActions.setActiveTab(tab);\n\t}\n\n\tonTabsChanged(err: StandardError, response: { value: TabProperties[] }) {\n\t\tlet { value } = response;\n\t\tthis.setState({\n\t\t\ttabs: value,\n\t\t\ttabWidth: this.getTabWidth({ tabList: value }),\n\t\t});\n\t}\n\n\tonTabListTranslateChanged(err: StandardError, response: { value: number }) {\n\t\tlet { value } = response;\n\t\tthis.setState({\n\t\t\ttranslateX: value,\n\t\t});\n\t}\n\n\tUNSAFE_componentWillMount() {\n\t\t// Store.addListener({ field: \"activeTab\" }, this.onActiveTabChanged);\n\t\tStore.addListener({ field: \"tabs\" }, this.onTabsChanged);\n\t\tStore.addListener({ field: \"tabListTranslateX\" }, this.onTabListTranslateChanged);\n\t}\n\n\tcomponentDidMount() {\n\t\twindow.addEventListener(\"resize\", this.onWindowResizeThrottled);\n\t\tlet boundingBox = (this.refs.Me as HTMLElement).getBoundingClientRect();\n\t\tthis.setState({\n\t\t\tboundingBox: boundingBox,\n\t\t\ttabWidth: this.getTabWidth({ boundingBox }),\n\t\t});\n\t}\n\n\tcomponentWillUnmount() {\n\t\t// Store.removeListener({ field: \"activeTab\" }, this.onActiveTabChanged);\n\t\tStore.removeListener({ field: \"tabs\" }, this.onTabsChanged);\n\t\tStore.removeListener({ field: \"tabListTranslateX\" }, this.onTabListTranslateChanged);\n\t\twindow.removeEventListener(\"resize\", this.onWindowResizeThrottled);\n\t}\n\n\thoverAction(newHoverState: string) {\n\t\tthis.setState({ hoverState: newHoverState });\n\t}\n\n\trender() {\n\t\tlet { translateX } = this.state;\n\t\ttranslateX = Math.abs(translateX);\n\t\t// If we have just 1 tab, we render the title. Unless someone is dragging a tab around - in that case, we will render the tab view, even though we only have 1.\n\n\t\tlet componentToRender = \"title\";\n\t\tif (this.state.tabs.length === 1 && this.props.listenForDragOver && !this.state.iAmDragging) {\n\t\t\tcomponentToRender = \"tabs\";\n\t\t}\n\t\tif (this.state.tabs.length > 1) {\n\t\t\tcomponentToRender = \"tabs\";\n\t\t}\n\t\t// Cleanup in case we were translated before closing the second to last tab. This left-aligns the title.\n\t\tif (componentToRender === \"title\") {\n\t\t\ttranslateX = 0;\n\t\t}\n\n\t\tif (this.refs.Me) {\n\t\t\t(this.refs.Me as HTMLElement).scrollLeft = translateX;\n\t\t}\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref=\"Me\"\n\t\t\t\tonDragLeave={this.dragLeave}\n\t\t\t\tclassName={this.props.className}\n\t\t\t\tonWheel={this.onMouseWheel}\n\t\t\t\tonScroll={(e) => {\n\t\t\t\t\tthis.onMouseWheel(e as unknown as React.WheelEvent);\n\t\t\t\t}}\n\t\t\t\tonDrop={this.drop}\n\t\t\t\tonDragOver={this.dragOver}\n\t\t\t>\n\t\t\t\t<div className=\"tab-region-wrapper\">\n\t\t\t\t\t{componentToRender === \"title\" && this.renderTitle()}\n\t\t\t\t\t{componentToRender === \"tabs\" && this.renderTabs()}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t/**\n\t * Function to render the title. Helps keep the render code clean.\n\t */\n\trenderTitle() {\n\t\tconst windowIdentifier: WindowIdentifier = {\n\t\t\twindowName: finsembleWindow.name,\n\t\t\tuuid: finsembleWindow.uuid,\n\t\t};\n\t\treturn (\n\t\t\t<div\n\t\t\t\tdraggable=\"true\"\n\t\t\t\tonDragStart={(e) => {\n\t\t\t\t\tFSBL.Clients.Logger.system.debug(\"Tab drag start - TITLE\");\n\t\t\t\t\tlet activeIdentifier = finsembleWindow.identifier as typeof finsembleWindow.identifier & { title: string };\n\t\t\t\t\tactiveIdentifier.title = finsembleWindow.windowOptions.title;\n\t\t\t\t\tthis.startDrag(e, activeIdentifier);\n\t\t\t\t}}\n\t\t\t\tonDragEnd={this.stopDrag}\n\t\t\t\tdata-hover={this.state.hoverState}\n\t\t\t\tclassName={\"fsbl-header-title\"}\n\t\t\t>\n\t\t\t\t<FinsembleHoverDetector edge=\"top\" hoverAction={this.hoverAction.bind(this)} />\n\t\t\t\t<Title onUpdate={this.props.onTitleUpdated} windowIdentifier={windowIdentifier}></Title>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t/**\n\t * Renders the array of tabs.\n\t * @param {*} props\n\t */\n\trenderTabs() {\n\t\tlet titleWidth = this.state.tabWidth - ICON_AREA - CLOSE_BUTTON_MARGIN;\n\n\t\treturn this.state.tabs.map((tab) => (\n\t\t\t<Tab\n\t\t\t\tdraggable=\"true\"\n\t\t\t\tkey={tab.windowName} // this is a unique identifier for React so it knows when to update the DOM\n\t\t\t\tclassName={this.getTabClasses(tab)}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tthis.setActiveTab(tab);\n\t\t\t\t}}\n\t\t\t\tonDragStart={(e, identifier) => {\n\t\t\t\t\tFSBL.Clients.Logger.system.debug(\"Tab drag - TAB\", identifier.windowName);\n\t\t\t\t\tthis.startDrag(e, identifier);\n\t\t\t\t}}\n\t\t\t\tonDrop={this.drop}\n\t\t\t\tonDragEnd={this.stopDrag}\n\t\t\t\tonTabClose={() => {\n\t\t\t\t\tthis.onTabClosed(tab);\n\t\t\t\t}}\n\t\t\t\tonTabDraggedOver={this.onTabDraggedOver}\n\t\t\t\tlistenForDragOver={this.props.listenForDragOver}\n\t\t\t\ttabWidth={this.state.tabWidth}\n\t\t\t\ttitleWidth={titleWidth}\n\t\t\t\twindowIdentifier={tab}\n\t\t\t/>\n\t\t));\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkerButton.js","sourceRoot":"","sources":["../../../../../src/components/windowTitleBar/components/left/LinkerButton.tsx"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright 2017 by ChartIQ, Inc.\n * All rights reserved.\n */\nimport React, { useRef, useEffect } from \"react\";\nimport { LinkerGroups } from \"./LinkerGroups\";\nimport { useDispatch, useSelector, Provider } from \"react-redux\";\nimport { actions, LinkerStore, store } from \"../../../linker/remoteRedux\";\nimport { LinkerButton as LinkerButtonDeprecated } from \"./LinkerButtonDeprecated\";\nimport { services, ShowWindowParams } from \"@finsemble/finsemble-api\";\n\ntype SpawnParams = services.window.types.SpawnParams;\n\nconst LinkerButtonIcon = () => (\n\t<svg\n\t\twidth=\"15px\"\n\t\theight=\"15px\"\n\t\tviewBox=\"2 1 13 13\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\txmlnsXlink=\"http://www.w3.org/1999/xlink\"\n\t>\n\t\t<title>Linker</title>\n\t\t<defs>\n\t\t\t<path\n\t\t\t\tid=\"prefix__b\"\n\t\t\t\td=\"M17.925 15.425h-1v-2.5a2.5 2.5 0 0 0-5 0v2.5h-1v-2.5a3.5 3.5 0 1 1 7 0v2.5zm0 2v2.5a3.5 3.5 0 1 1-7 0v-2.5h1v2.5a2.5 2.5 0 0 0 5 0v-2.5h1zm-3.5-4a.5.5 0 0 1 .5.5v5a.5.5 0 0 1-1 0v-5a.5.5 0 0 1 .5-.5z\"\n\t\t\t/>\n\t\t\t<filter id=\"prefix__a\" x=\"-28.6%\" y=\"-7.1%\" width=\"157.1%\" height=\"128.6%\">\n\t\t\t\t<feOffset dy=\"1\" in=\"SourceAlpha\" result=\"shadowOffsetOuter1\" />\n\t\t\t\t<feGaussianBlur in=\"shadowOffsetOuter1\" result=\"shadowBlurOuter1\" stdDeviation=\".5\" />\n\t\t\t\t<feColorMatrix in=\"shadowBlurOuter1\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0\" />\n\t\t\t</filter>\n\t\t</defs>\n\t\t<g transform=\"rotate(45 22.289 4.682)\" fillRule=\"nonzero\" fill=\"none\">\n\t\t\t<use filter=\"url(#prefix__a)\" xlinkHref=\"#prefix__b\" />\n\t\t\t<use xlinkHref=\"#prefix__b\" />\n\t\t</g>\n\t</svg>\n);\n\nconst LinkerButtonRedux: React.FunctionComponent = () => {\n\tconst dispatch = useDispatch();\n\tconst state: LinkerStore = useSelector((currentState: any) => currentState);\n\tconst buttonRef = useRef(null);\n\n\tconst showLinkerWindow = () => {\n\t\t// These action creators can now be imported from finsemble-
|
|
1
|
+
{"version":3,"file":"LinkerButton.js","sourceRoot":"","sources":["../../../../../src/components/windowTitleBar/components/left/LinkerButton.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,OAAO,EAAe,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,YAAY,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAKlF,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,CAC9B,6BACC,KAAK,EAAC,MAAM,EACZ,MAAM,EAAC,MAAM,EACb,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,4BAA4B,EAClC,UAAU,EAAC,8BAA8B;IAEzC,4CAAqB;IACrB;QACC,8BACC,EAAE,EAAC,WAAW,EACd,CAAC,EAAC,yMAAyM,GAC1M;QACF,gCAAQ,EAAE,EAAC,WAAW,EAAC,CAAC,EAAC,QAAQ,EAAC,CAAC,EAAC,OAAO,EAAC,KAAK,EAAC,QAAQ,EAAC,MAAM,EAAC,QAAQ;YACzE,kCAAU,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,aAAa,EAAC,MAAM,EAAC,oBAAoB,GAAG;YAChE,wCAAgB,EAAE,EAAC,oBAAoB,EAAC,MAAM,EAAC,kBAAkB,EAAC,YAAY,EAAC,IAAI,GAAG;YACtF,uCAAe,EAAE,EAAC,kBAAkB,EAAC,MAAM,EAAC,2CAA2C,GAAG,CAClF,CACH;IACP,2BAAG,SAAS,EAAC,yBAAyB,EAAC,QAAQ,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM;QACpE,6BAAK,MAAM,EAAC,iBAAiB,EAAC,SAAS,EAAC,YAAY,GAAG;QACvD,6BAAK,SAAS,EAAC,YAAY,GAAG,CAC3B,CACC,CACN,CAAC;AAEF,MAAM,iBAAiB,GAA4B,GAAG,EAAE;IACvD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAgB,WAAW,CAAC,CAAC,YAAiB,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;IAC5E,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAE/B,MAAM,gBAAgB,GAAG,GAAG,EAAE;;QAE7B,QAAQ,CACP,OAAO,CAAC,eAAe,CAAC;YACvB,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE;gBACR,UAAU,EAAE,eAAe,CAAC,IAAI;aAChC;SACD,CAAC,CACF,CAAC;QAMF,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC;QACvC,IAAI,YAAY,EAAE;YACjB,MAAM,eAAe,GAAG,YAA2B,CAAC;YACpD,MAAM,YAAY,GAAG,CAAC,MAAA,eAAe,CAAC,YAAY,mCAAI,eAAe,CAAC,aAAa,CAAgB,CAAC;YAEpG,MAAM,MAAM,GAAqB;gBAChC,QAAQ,EAAE,UAAU;gBACpB,IAAI,EAAE,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,UAAU,mCAAI,CAAC;gBACnC,GAAG,EAAE,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,YAAY,mCAAI,CAAC;gBACpC,gBAAgB,EAAE,IAAI;gBACtB,eAAe,EAAE,KAAK;aACtB,CAAC;YACF,MAAM,EAAE,GAAG;gBACV,aAAa,EAAE,cAAc;aAC7B,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,mBAAmB,CAAC,eAAe,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;SAC7E;IACF,CAAC,CAAC;IAGF,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;IAOpE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,kBAAkB,EAAE,GAAG,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAExF,OAAO,CACN,0CACE,SAAS,IAAI,CACb,6BAAK,GAAG,EAAE,SAAS,EAAE,KAAK,EAAC,WAAW,EAAC,SAAS,EAAC,eAAe;QAC/D,6BAAK,SAAS,EAAC,uBAAuB,EAAC,OAAO,EAAE,gBAAgB;YAC/D,oBAAC,gBAAgB,OAAG,CACf;QACN,oBAAC,YAAY,OAAG,CACX,CACN,CACC,CACH,CAAC;AACH,CAAC,CAAC;AAQF,MAAM,WAAW,GAAG,GAAG,EAAE;IACxB,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEzD,SAAS,CAAC,GAAG,EAAE;QACd,CAAC,KAAK,IAAI,EAAE;YACX,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC;gBACzD,KAAK,EAAE,yCAAyC;aAChD,CAAC,CAAC;YACH,IAAI,IAAI,EAAE;gBACT,cAAc,CAAC,yBAAyB,CAAC,CAAC;aAC1C;iBAAM;gBACN,cAAc,CAAC,eAAe,CAAC,CAAC;aAChC;QACF,CAAC,CAAC,EAAE,CAAC;IACN,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACN;QACE,WAAW,KAAK,eAAe,IAAI,CACnC,oBAAC,QAAQ,IAAC,KAAK,EAAE,KAAK;YACrB,oBAAC,iBAAiB,OAAG,CACX,CACX;QACA,WAAW,KAAK,yBAAyB,IAAI,oBAAC,sBAAsB,OAAG,CACtE,CACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAA4B,GAAG,EAAE,CAAC,oBAAC,WAAW,OAAG,CAAC","sourcesContent":["/*!\n * Copyright 2017 by ChartIQ, Inc.\n * All rights reserved.\n */\nimport React, { useRef, useEffect } from \"react\";\nimport { LinkerGroups } from \"./LinkerGroups\";\nimport { useDispatch, useSelector, Provider } from \"react-redux\";\nimport { actions, LinkerStore, store } from \"../../../linker/remoteRedux\";\nimport { LinkerButton as LinkerButtonDeprecated } from \"./LinkerButtonDeprecated\";\nimport { services, ShowWindowParams } from \"@finsemble/finsemble-api\";\n\ntype SpawnParams = services.window.types.SpawnParams;\n\nconst LinkerButtonIcon = () => (\n\t<svg\n\t\twidth=\"15px\"\n\t\theight=\"15px\"\n\t\tviewBox=\"2 1 13 13\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\txmlnsXlink=\"http://www.w3.org/1999/xlink\"\n\t>\n\t\t<title>Linker</title>\n\t\t<defs>\n\t\t\t<path\n\t\t\t\tid=\"prefix__b\"\n\t\t\t\td=\"M17.925 15.425h-1v-2.5a2.5 2.5 0 0 0-5 0v2.5h-1v-2.5a3.5 3.5 0 1 1 7 0v2.5zm0 2v2.5a3.5 3.5 0 1 1-7 0v-2.5h1v2.5a2.5 2.5 0 0 0 5 0v-2.5h1zm-3.5-4a.5.5 0 0 1 .5.5v5a.5.5 0 0 1-1 0v-5a.5.5 0 0 1 .5-.5z\"\n\t\t\t/>\n\t\t\t<filter id=\"prefix__a\" x=\"-28.6%\" y=\"-7.1%\" width=\"157.1%\" height=\"128.6%\">\n\t\t\t\t<feOffset dy=\"1\" in=\"SourceAlpha\" result=\"shadowOffsetOuter1\" />\n\t\t\t\t<feGaussianBlur in=\"shadowOffsetOuter1\" result=\"shadowBlurOuter1\" stdDeviation=\".5\" />\n\t\t\t\t<feColorMatrix in=\"shadowBlurOuter1\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0\" />\n\t\t\t</filter>\n\t\t</defs>\n\t\t<g transform=\"rotate(45 22.289 4.682)\" fillRule=\"nonzero\" fill=\"none\">\n\t\t\t<use filter=\"url(#prefix__a)\" xlinkHref=\"#prefix__b\" />\n\t\t\t<use xlinkHref=\"#prefix__b\" />\n\t\t</g>\n\t</svg>\n);\n\nconst LinkerButtonRedux: React.FunctionComponent = () => {\n\tconst dispatch = useDispatch();\n\tconst state: LinkerStore = useSelector((currentState: any) => currentState);\n\tconst buttonRef = useRef(null);\n\n\tconst showLinkerWindow = () => {\n\t\t// These action creators can now be imported from finsemble-api\n\t\tdispatch(\n\t\t\tactions.setActiveWindow({\n\t\t\t\ttype: \"linker/setActiveWindow\",\n\t\t\t\tpayload: {\n\t\t\t\t\twindowName: finsembleWindow.name,\n\t\t\t\t},\n\t\t\t})\n\t\t);\n\n\t\t// The offset parent is needed so that the menu isn't shown relative to the icon.\n\t\t// The HTMLElement.offsetParent read-only property returns a reference to the object which is the closest (nearest in the containment hierarchy) positioned containing element.\n\t\t// Necessary to cast because refs are type \"Element\" (which could be an SVGElement...)\n\n\t\tconst linkerButton = buttonRef.current;\n\t\tif (linkerButton) {\n\t\t\tconst linkerButtonDiv = linkerButton as HTMLElement;\n\t\t\tconst linkerParent = (linkerButtonDiv.offsetParent ?? linkerButtonDiv.parentElement) as HTMLElement;\n\n\t\t\tconst params: ShowWindowParams = {\n\t\t\t\tposition: \"relative\",\n\t\t\t\tleft: linkerParent?.offsetLeft ?? 0,\n\t\t\t\ttop: linkerParent?.offsetHeight ?? 0,\n\t\t\t\tforceOntoMonitor: true,\n\t\t\t\tspawnIfNotFound: false,\n\t\t\t};\n\t\t\tconst wi = {\n\t\t\t\tcomponentType: \"linkerWindow\",\n\t\t\t};\n\t\t\tFSBL.Clients.LauncherClient.toggleWindowOnClick(linkerButtonDiv, wi, params);\n\t\t}\n\t};\n\n\t// If this window is in the list of linker clients then display this button\n\tconst displayMe = state.clients[finsembleWindow.name] !== undefined;\n\n\t// Add keyboard shortcut to launch the Linker Menu\n\t// Using `addBrowserHotkey` so that the linker menu is only launched when the user is focused on the titlebar\n\t// If we had used `addGlobalHotkey`, it would cause a lot of intermittent errors (linker menu would think it\n\t// was launched from the Notifications Center component for some reason, and would display incorrect channel\n\t// information, or float the linker menu in the wrong location. Lots of flakiness.)\n\tFSBL.Clients.HotkeyClient.addBrowserHotkey([\"CommandOrControl\", \"l\"], showLinkerWindow);\n\n\treturn (\n\t\t<>\n\t\t\t{displayMe && (\n\t\t\t\t<div ref={buttonRef} title=\"Link Data\" className=\"linkerSection\">\n\t\t\t\t\t<div className=\"fsbl-icon fsbl-linker\" onClick={showLinkerWindow}>\n\t\t\t\t\t\t<LinkerButtonIcon />\n\t\t\t\t\t</div>\n\t\t\t\t\t<LinkerGroups />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</>\n\t);\n};\n\n/**\n * Picks whether to display the current or deprecated LinkerElement.\n * If config `finsemble.servicesConfig.linker.enabled` is set to true then the deprecated version will be used.\n *\n * This code should be removed once the linkerClient is removed from Finsemble.\n */\nconst WhichLinker = () => {\n\tconst [whichLinker, setWhichLinker] = React.useState(\"\");\n\n\tuseEffect(() => {\n\t\t(async () => {\n\t\t\tconst { data } = await FSBL.Clients.ConfigClient.getValue({\n\t\t\t\tfield: \"finsemble.servicesConfig.linker.enabled\",\n\t\t\t});\n\t\t\tif (data) {\n\t\t\t\tsetWhichLinker(\"LinkerElementDeprecated\");\n\t\t\t} else {\n\t\t\t\tsetWhichLinker(\"LinkerElement\");\n\t\t\t}\n\t\t})();\n\t}, []);\n\n\treturn (\n\t\t<>\n\t\t\t{whichLinker === \"LinkerElement\" && (\n\t\t\t\t<Provider store={store}>\n\t\t\t\t\t<LinkerButtonRedux />\n\t\t\t\t</Provider>\n\t\t\t)}\n\t\t\t{whichLinker === \"LinkerElementDeprecated\" && <LinkerButtonDeprecated />}\n\t\t</>\n\t);\n};\n\nexport const LinkerButton: React.FunctionComponent = () => <WhichLinker />;\n"]}
|