From 250fd993afbc6ce72e52197b05eeaf29107f3c3c Mon Sep 17 00:00:00 2001 From: Dennis Collaris <d.a.c.collaris@uu.nl> Date: Mon, 24 Mar 2025 16:55:20 +0000 Subject: [PATCH] fix: VSCode problems --- .vscode/settings.json | 10 ++ eslint.config.js | 2 +- src/App.tsx | 24 ++-- src/app/navbar/navbar.tsx | 10 +- src/app/onboarding/onboarding.tsx | 6 +- src/app/onboarding/tooltip.tsx | 1 - src/app/onboarding/use-cases/index.tsx | 2 +- src/config/colors.ts | 2 +- src/config/styling/variables.css | 1 - src/lib/components/DataTypeIcon/index.tsx | 3 +- .../components/DesignGuides/styleGuide.mdx | 1 + .../accordion/accordion.stories.tsx | 5 +- src/lib/components/accordion/index.tsx | 2 +- src/lib/components/buttons/Button.tsx | 2 +- src/lib/components/buttons/button.stories.tsx | 1 - .../components/buttons/buttons.module.scss | 13 +- src/lib/components/buttons/overview.mdx | 135 +++++++++++++----- .../components/charts/Axis/axis.stories.tsx | 3 +- src/lib/components/charts/Axis/index.tsx | 2 +- .../charts/barplot/barplot.stories.tsx | 1 - src/lib/components/charts/barplot/index.tsx | 6 +- .../colorLegendCat/colorLegendCat.stories.tsx | 1 - .../colorLegendSeqDiv.stories.tsx | 1 - .../charts/colorLegendSeqDiv/index.tsx | 2 +- src/lib/components/charts/heatmap1D/index.tsx | 4 +- .../charts/indicatorGraph/index.tsx | 4 +- .../components/charts/scatterplotD3/index.tsx | 8 +- .../scatterplotD3/scatterplot.stories.tsx | 3 +- .../charts/scatterplot_pixi/index.tsx | 2 +- .../scatterplot_pixi/scatterplot.stories.tsx | 3 +- src/lib/components/color-mode/index.tsx | 8 +- .../colorLegendDropdown.stories.tsx | 2 +- .../colorComponents/colorDropdown/index.tsx | 6 +- .../colorLegend/colorLegendSeqDiv.stories.tsx | 1 - .../colorComponents/colorLegend/index.tsx | 2 +- .../colorPicker/colorPicker.stories.tsx | 9 +- .../colorComponents/colorPicker/index.tsx | 2 +- src/lib/components/controls/index.tsx | 2 +- .../components/dropdowns/Dropdown.stories.tsx | 4 +- src/lib/components/dropdowns/index.tsx | 4 +- .../errorBoundary/ErrorBoundary.tsx | 4 +- .../featureFlags/FeatureEnabled.tsx | 2 +- .../components/featureFlags/featureFlags.ts | 2 +- src/lib/components/featureFlags/index.ts | 2 +- src/lib/components/icon/icon.stories.tsx | 2 +- src/lib/components/icon/index.tsx | 3 +- src/lib/components/index.ts | 10 +- src/lib/components/info/index.tsx | 2 +- src/lib/components/info/info.stories.tsx | 2 +- src/lib/components/inputs/BooleanInput.tsx | 2 +- src/lib/components/inputs/CheckboxInput.tsx | 2 +- src/lib/components/inputs/DropdownInput.tsx | 6 +- src/lib/components/inputs/EmailInput.tsx | 2 +- src/lib/components/inputs/NumberInput.tsx | 6 +- src/lib/components/inputs/RadioInput.tsx | 2 +- src/lib/components/inputs/SliderInput.tsx | 8 +- src/lib/components/inputs/TextInput.tsx | 8 +- src/lib/components/inputs/TimeInput.tsx | 2 +- .../components/inputs/ToggleSwitchInput.tsx | 4 +- .../components/inputs/checkbox.stories.tsx | 7 +- .../components/inputs/dropdown.stories.tsx | 3 +- src/lib/components/inputs/index.tsx | 14 +- src/lib/components/inputs/number.stories.tsx | 5 +- src/lib/components/inputs/radio.stories.tsx | 2 +- src/lib/components/inputs/slider.stories.tsx | 3 +- src/lib/components/inputs/text.stories.tsx | 5 +- src/lib/components/inputs/time.stories.tsx | 2 +- .../inputs/toggleSwitch.stories.tsx | 3 +- src/lib/components/layout/Dialog.tsx | 18 +-- src/lib/components/layout/Popover.tsx | 20 +-- src/lib/components/layout/Resizable.tsx | 10 +- src/lib/components/layout/dialog.stories.tsx | 4 +- src/lib/components/layout/index.ts | 2 +- src/lib/components/layout/panel.stories.tsx | 2 - src/lib/components/layout/popover.stories.tsx | 4 +- .../nodeDetails/NodeDetails.stories.tsx | 2 +- src/lib/components/pills/Pill.tsx | 6 +- src/lib/components/pills/PillHandle.tsx | 2 +- .../components/pills/stories/pill.stories.tsx | 3 +- .../pills/stories/pillEntity.stories.tsx | 3 +- .../pills/stories/pillLogic.stories.tsx | 3 +- .../pills/stories/pillRelation.stories.tsx | 3 +- src/lib/components/popover/Popover.tsx | 25 ++-- .../components/popover/PopoverProvider.tsx | 2 +- .../components/popover/popover.stories.tsx | 14 +- .../selectors/entityPillSelector.stories.tsx | 1 - .../selectors/entityPillSelector.tsx | 6 +- src/lib/components/selectors/textAndIcon.tsx | 4 +- .../components/tableUI/TableUI.stories.tsx | 2 +- src/lib/components/tableUI/TableUI.tsx | 5 +- src/lib/components/tabs/Tab.tsx | 2 +- .../components/textEditor/ErrorHandler.tsx | 2 - src/lib/components/textEditor/Placeholder.tsx | 2 - src/lib/components/textEditor/TextEditor.tsx | 14 +- .../components/textEditor/VariableNode.tsx | 3 +- .../plugins/InsertVariablesPlugin.tsx | 4 +- .../textEditor/plugins/PreviewPlugin.tsx | 17 ++- .../textEditor/plugins/SaveButtonPlugin.tsx | 2 +- .../textEditor/plugins/StateChangePlugin.tsx | 4 +- .../textEditor/plugins/ToolbarPlugin.tsx | 1 - .../textEditor/textEditor.stories.tsx | 6 +- src/lib/components/tooltip/Tooltip.tsx | 27 ++-- .../components/tooltip/tooltip.stories.tsx | 5 +- src/lib/data-access/api/eventBus.tsx | 82 +++++------ src/lib/data-access/api/index.ts | 2 +- src/lib/data-access/broker/broker.tsx | 2 +- src/lib/data-access/broker/index.ts | 2 +- src/lib/data-access/broker/wsProject.ts | 2 +- src/lib/data-access/broker/wsQuery.ts | 2 +- src/lib/data-access/broker/wsState.ts | 4 +- .../data-access/security/dashboardAlerts.tsx | 4 +- .../security/useAuthentication.tsx | 29 ++-- src/lib/data-access/store/authSlice.ts | 2 +- .../store/authorizationResourcesSlice.ts | 2 +- .../store/authorizationUsersSlice.ts | 2 +- ...QueryResultSlice.ts => graphQuerySlice.ts} | 14 +- src/lib/data-access/store/hooks.ts | 62 ++++---- src/lib/data-access/store/index.ts | 6 +- .../data-access/store/insightSharingSlice.ts | 2 +- src/lib/data-access/store/interactionSlice.ts | 2 +- src/lib/data-access/store/mlSlice.ts | 2 +- src/lib/data-access/store/projectSlice.ts | 2 +- src/lib/data-access/store/schemaSlice.spec.ts | 2 +- src/lib/data-access/store/schemaSlice.ts | 6 +- src/lib/data-access/store/sessionSlice.ts | 16 +-- src/lib/data-access/store/store.spec.ts | 2 +- src/lib/data-access/store/store.ts | 20 +-- .../data-access/store/visualizationSlice.ts | 4 +- src/lib/graph-layout/cytoscapeLayouts.ts | 2 +- src/lib/graph-layout/dagreLayout.ts | 2 +- src/lib/graph-layout/graphology.spec.ts | 3 +- src/lib/graph-layout/graphologyLayouts.ts | 2 +- src/lib/graph-layout/index.ts | 6 +- src/lib/graph-layout/layout.ts | 2 +- .../graph-layout/layoutCreatorUsecase.spec.ts | 2 +- src/lib/graph-layout/layoutCreatorUsecase.ts | 4 +- src/lib/graph-layout/listLayouts.ts | 2 +- src/lib/graph-layout/mockdataLayout.spec.ts | 2 +- src/lib/index.ts | 2 +- src/lib/insight-sharing/FormInsight.tsx | 8 +- src/lib/insight-sharing/InsightDialog.tsx | 14 +- .../insight-sharing/components/AddItem.tsx | 14 +- .../insight-sharing/components/Sidebar.tsx | 9 +- .../components/StartScreen.tsx | 1 - src/lib/inspector/InspectorPanel.tsx | 8 +- src/lib/inspector/ResultInspector.tsx | 6 +- src/lib/inspector/SelectionConfig.tsx | 4 +- src/lib/management/Explorations.tsx | 1 - src/lib/management/ManagementDialog.tsx | 12 +- src/lib/management/ManagementTrigger.tsx | 8 +- src/lib/management/Members.tsx | 10 +- src/lib/management/Overview.tsx | 6 +- src/lib/management/Settings.tsx | 2 - src/lib/management/Workspace.tsx | 7 +- src/lib/management/database/DatabaseForm.tsx | 6 +- src/lib/management/database/DatabaseLine.tsx | 22 ++- src/lib/management/database/Databases.tsx | 85 +++++------ .../management/database/MockSaveStates.tsx | 3 +- .../management/database/UpsertDatabase.tsx | 8 +- .../management/database/useHandleDatabase.ts | 20 +-- src/lib/management/index.ts | 2 +- src/lib/mock-data/geo-json/index.tsx | 4 +- src/lib/mock-data/index.ts | 2 +- .../query-result/bigMockQueryResults.json | 2 +- src/lib/mock-data/query-result/mockData.ts | 11 +- .../query-result/mockMobilityQueryResult.json | 2 +- .../schema/big2ndChamberSchemaRaw.ts | 2 +- .../mock-data/schema/fincenWithAttributes.ts | 2 +- src/lib/mock-data/schema/index.ts | 18 ++- src/lib/mock-data/schema/mock-data.spec.ts | 18 ++- .../schema/moviesSchemaWithAttributes.ts | 2 +- .../schema/northwindWithAttributes.ts | 2 +- .../schema/recommendationsWithAttributes.ts | 2 +- .../mock-data/schema/slackWithAttributes.ts | 2 +- .../mock-data/schema/typesMockSchemaRaw.ts | 2 +- src/lib/querybuilder/index.ts | 2 +- .../querybuilder/model/graphology/utils.ts | 22 +-- src/lib/querybuilder/model/index.ts | 2 +- src/lib/querybuilder/model/reactflow/model.ts | 4 +- src/lib/querybuilder/model/reactflow/utils.ts | 2 +- .../querybuilder/panel/ManualQueryDialog.tsx | 2 +- src/lib/querybuilder/panel/QueryBuilder.tsx | 12 +- .../panel/QueryBuilderContextMenu.tsx | 14 +- .../panel/QueryBuilderDispatcher.tsx | 4 +- .../querybuilder/panel/QueryBuilderNav.tsx | 29 ++-- .../QueryBuilderLogicPillsPanel.tsx | 8 +- .../QueryBuilderRelatedNodesPanel.tsx | 10 +- .../panel/querysidepanel/QueryMLDialog.tsx | 7 +- .../panel/querysidepanel/QuerySettings.tsx | 9 +- .../panel/schemaquerybuilder.stories.tsx | 8 +- .../stories/querybuilder-simple.stories.tsx | 4 +- .../querybuilder-single-entity.stories.tsx | 4 +- ...erybuilder-single-relationship.stories.tsx | 4 +- .../querybuilder/panel/utils/connectorDrop.ts | 2 +- src/lib/querybuilder/pills/FilterHandle.tsx | 2 +- .../pills/customFlowLines/connectionDrag.tsx | 1 - .../pills/customFlowPills/edge-line.tsx | 1 - .../entitypill/QueryEntityPill.tsx | 10 +- .../customFlowPills/logicpill/LogicInput.tsx | 2 +- .../logicpill/QueryLogicPill.tsx | 12 +- .../relationpill/QueryRelationPill.tsx | 19 ++- .../querybuilder/pills/dragging/dragPill.ts | 2 +- .../pills/pillattributes/PillAttributes.tsx | 10 +- .../pillattributes/PillAttributesItem.tsx | 8 +- src/lib/schema/model/graphology.ts | 2 +- .../LayoutDescription/SchemaLayoutConfig.tsx | 6 +- src/lib/schema/panel/Schema.tsx | 10 +- src/lib/schema/panel/SchemaList.tsx | 21 +-- src/lib/schema/panel/SchemaSettings.tsx | 4 +- src/lib/schema/panel/schema.stories.tsx | 2 +- src/lib/schema/pills/edges/NodeEdge.tsx | 2 +- src/lib/schema/pills/edges/SelfEdge.tsx | 2 +- .../pills/nodes/SchemaPopUp/SchemaPopUp.tsx | 8 +- .../pills/nodes/entity/SchemaEntityPill.tsx | 4 +- .../nodes/entity/SchemaListEntityPill.tsx | 4 +- ...attribute-analytics-popup-menu.stories.tsx | 4 +- .../popup/attribute-analytics-popup-menu.tsx | 3 +- .../node-quality-relation-popup.stories.tsx | 3 +- ...attribute-analytics-popup-menu.stories.tsx | 5 +- .../attribute-analytics-popup-menu.tsx | 3 +- .../popup/popupmenus/filterbar.stories.tsx | 3 +- .../nodes/popup/popupmenus/filterbar.tsx | 2 +- .../node-quality-entity-popup.stories.tsx | 3 +- .../popupmenus/node-quality-entity-popup.tsx | 1 - .../node-quality-relation-popup.stories.tsx | 3 +- .../node-quality-relation-popup.tsx | 1 - .../popup/popupmenus/searchbar.stories.tsx | 3 +- .../nodes/relation/SchemaListRelationPill.tsx | 4 +- .../nodes/relation/SchemaRelationPill.tsx | 12 +- .../schema/schema-utils/flowUtils.test.tsx | 10 +- src/lib/schema/schema-utils/index.ts | 4 +- .../schema-utils/schemaUsecases.spec.ts | 2 +- src/lib/schema/schema-utils/schemaUsecases.ts | 6 +- .../schema/schema-utils/schemaUtils.spec.ts | 2 +- src/lib/sidebar/index.tsx | 5 +- src/lib/sidebar/search/NestedItem.tsx | 2 - src/lib/sidebar/search/SearchBar.tsx | 8 +- src/lib/vis/common/types.ts | 9 +- src/lib/vis/components/VisualizationPanel.tsx | 30 ++-- .../vis/components/VisualizationTabBar.tsx | 12 +- .../vis/components/config/SelectionConfig.tsx | 3 +- .../components/config/VisualizationConfig.tsx | 18 +-- .../config/VisualizationSettings.tsx | 6 +- src/lib/vis/components/config/components.tsx | 2 +- src/lib/vis/components/config/index.tsx | 4 +- src/lib/vis/views/NoData.tsx | 2 +- src/lib/vis/views/Querying.tsx | 1 - src/lib/vis/views/Recommender.tsx | 6 +- src/lib/vis/views/index.tsx | 2 +- .../arcplotvis/arcplotvis.spec.tsx | 3 +- .../visualizations/arcplotvis/arcplotvis.tsx | 21 ++- .../arcplotvis/arcplotvis.types.ts | 6 +- .../arcplotvis/components/arcplotd3links.tsx | 1 - src/lib/vis/visualizations/index.tsx | 8 +- .../mapvis/components/ActionBar.tsx | 1 - .../mapvis/components/Attribution.tsx | 2 - .../mapvis/components/MapDataInspector.tsx | 8 +- .../mapvis/components/MapSettings.tsx | 6 +- .../mapvis/components/SearchBar.tsx | 4 +- .../visualizations/mapvis/components/index.ts | 2 +- .../mapvis/hooks/useCoordinateLookup.tsx | 6 +- .../mapvis/hooks/useSelectionLayer.tsx | 2 +- .../choropleth-layer/ChoroplethLayer.tsx | 29 ++-- .../choropleth-layer/ChoroplethOptions.tsx | 7 +- .../mapvis/layers/heatmap-layer/HeatLayer.tsx | 4 +- .../layers/heatmap-layer/HeatLayerOptions.tsx | 6 +- .../visualizations/mapvis/layers/index.tsx | 12 +- .../layers/nodelink-layer/NodeLinkLayer.tsx | 31 ++-- .../layers/nodelink-layer/NodeLinkOptions.tsx | 10 +- .../visualizations/mapvis/mapvis.stories.tsx | 2 +- src/lib/vis/visualizations/mapvis/mapvis.tsx | 30 ++-- .../vis/visualizations/mapvis/mapvis.types.ts | 2 +- src/lib/vis/visualizations/mapvis/utils.ts | 3 +- .../matrixvis/components/BitmapTextLabel.ts | 4 +- .../components/ColumnGraphicsComponent.tsx | 4 +- .../components/ColumnSpriteComponent.tsx | 8 +- .../matrixvis/components/MatrixExport.tsx | 7 +- .../matrixvis/components/MatrixPixi.tsx | 111 +++++++------- .../components/ReorderingManager.tsx | 28 ++-- .../matrixvis/matrix.stories.tsx | 6 +- .../visualizations/matrixvis/matrixvis.tsx | 12 +- .../nodelinkvis/components/NLExport.tsx | 7 +- .../nodelinkvis/components/NLForce.tsx | 25 ---- .../components/NLMachineLearning.tsx | 4 +- .../nodelinkvis/components/NLPixi.tsx | 16 +-- .../nodelinkvis/components/NLPopup.tsx | 4 +- .../nodelinkvis/components/query2NL.tsx | 4 +- .../nodelinkvis/components/utils.tsx | 2 +- .../nodelinkvis/nodelinkvis.stories.tsx | 7 +- .../nodelinkvis/nodelinkvis.tsx | 22 +-- .../paohvis/components/HyperRangeBlock.tsx | 34 ++--- .../paohvis/components/RowLabels.tsx | 25 ++-- .../paohvis/paohvis.stories.tsx | 12 +- .../vis/visualizations/paohvis/paohvis.tsx | 20 +-- src/lib/vis/visualizations/paohvis/types.ts | 2 +- .../paohvis/utils/AttributesFilterUseCase.tsx | 6 +- .../paohvis/utils/dataProcessing.tsx | 4 +- .../visualizations/paohvis/utils/utils.tsx | 18 +-- .../rawjsonvis/rawjsonvis.spec.tsx | 3 +- .../rawjsonvis/rawjsonvis.stories.tsx | 7 +- .../visualizations/rawjsonvis/rawjsonvis.tsx | 8 +- .../components/EdgesLayer.tsx | 4 +- .../components/Scatterplot.tsx | 28 ++-- .../semanticsubstratesvis/components/types.ts | 2 +- .../semanticsubstratesvis/components/utils.ts | 6 +- .../configPanel/SemSubsConfigPanel.tsx | 14 +- .../semanticsubstratesvis.stories.tsx | 6 +- .../semanticsubstratesvis.tsx | 34 ++--- .../semanticsubstratesvis/utils.ts | 4 +- .../tablevis/components/Table.tsx | 6 +- .../tablevis/tablevis.stories.tsx | 4 +- .../vis/visualizations/tablevis/tablevis.tsx | 2 +- src/lib/vis/visualizations/vis0D/Vis0D.tsx | 12 +- .../visualizations/vis0D/vis0D.stories.tsx | 2 +- src/lib/vis/visualizations/vis1D/Vis1D.tsx | 12 +- .../vis1D/components/CustomChartPlotly.tsx | 2 +- .../vis1D/components/MakePlot.ts | 2 +- .../visualizations/vis1D/vis1D.stories.tsx | 2 +- src/main.tsx | 11 +- tailwind.config.ts | 7 +- tsconfig.app.json | 4 +- tsconfig.node.json | 4 +- vitest.config.js | 2 +- 323 files changed, 1219 insertions(+), 1308 deletions(-) create mode 100644 .vscode/settings.json rename src/lib/data-access/store/{graphQueryResultSlice.ts => graphQuerySlice.ts} (96%) delete mode 100644 src/lib/vis/visualizations/nodelinkvis/components/NLForce.tsx diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..ea90b7e0f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "typescript.validate.enable": true, + "typescript.tsserver.experimental.enableProjectDiagnostics": true, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll": "always", + "source.organizeImports": "always", + "source.sortMembers": "always" + } +} diff --git a/eslint.config.js b/eslint.config.js index 20b1b622a..daccc7a34 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,7 +1,7 @@ import js from '@eslint/js'; -import globals from 'globals'; import reactHooks from 'eslint-plugin-react-hooks'; import reactRefresh from 'eslint-plugin-react-refresh'; +import globals from 'globals'; import tseslint from 'typescript-eslint'; export default tseslint.config( diff --git a/src/App.tsx b/src/App.tsx index 5cb3ae631..9c708c7e6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,22 +1,22 @@ -import { useEffect, useState } from 'react'; -import { useActiveQuery, useAppDispatch, useAuthCache, useML, useSessionCache } from '@/lib/data-access/store'; -import { addError, setCurrentTheme } from '@/lib/data-access/store/configSlice'; -import { resetGraphQueryResults, queryingBackend } from '@/lib/data-access/store/graphQueryResultSlice'; +import { ErrorBoundary } from '@/lib/components/errorBoundary'; import { FrozenOverlay, Resizable } from '@/lib/components/layout'; -import { DashboardAlerts } from '@/lib/data-access/security/dashboardAlerts'; import { EventBus } from '@/lib/data-access/api/eventBus'; import { URLParams, setParam } from '@/lib/data-access/api/url'; -import { VisualizationPanel } from '@/lib/vis'; +import { Broker, wsQueryRequest } from '@/lib/data-access/broker'; +import { DashboardAlerts } from '@/lib/data-access/security/dashboardAlerts'; +import { useActiveQuery, useAppDispatch, useAuthCache, useML, useSessionCache } from '@/lib/data-access/store'; +import { addError, setCurrentTheme } from '@/lib/data-access/store/configSlice'; +import { queryingBackend, resetGraphQueryResults } from '@/lib/data-access/store/graphQuerySlice'; +import { InsightDialog } from '@/lib/insight-sharing'; +import { InspectorPanel } from '@/lib/inspector'; import { QueryBuilder } from '@/lib/querybuilder'; +import { Schema } from '@/lib/schema/panel'; import { SideNavTab, Sidebar } from '@/lib/sidebar'; -import { InspectorPanel } from '@/lib/inspector'; import { SearchBar } from '@/lib/sidebar/search/SearchBar'; -import { Schema } from '@/lib/schema/panel'; -import { InsightDialog } from '@/lib/insight-sharing'; -import { Broker, wsQueryRequest } from '@/lib/data-access/broker'; -import { ErrorBoundary } from '@/lib/components/errorBoundary'; -import { Onboarding } from './app/onboarding/onboarding'; +import { VisualizationPanel } from '@/lib/vis'; +import { useEffect, useState } from 'react'; import { Navbar } from './app/navbar/navbar'; +import { Onboarding } from './app/onboarding/onboarding'; export type App = { load?: string; diff --git a/src/app/navbar/navbar.tsx b/src/app/navbar/navbar.tsx index 230411c2c..25823d3b3 100644 --- a/src/app/navbar/navbar.tsx +++ b/src/app/navbar/navbar.tsx @@ -10,14 +10,14 @@ /* The comment above was added so the code coverage wouldn't count this file towards code coverage. * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ -import React, { useState, useRef, useEffect } from 'react'; -import GpLogo from './gp-logo'; import { getEnvVariable } from '@/config'; -import { useAuthentication, useAuthCache, Button, DropdownItem, useAppDispatch, useActiveSaveState } from '@/lib'; +import { Button, DropdownItem, useActiveSaveState, useAppDispatch, useAuthCache, useAuthentication } from '@/lib'; import { FeatureEnabled } from '@/lib/components/featureFlags'; -import { Popover, PopoverTrigger, PopoverContent } from '@/lib/components/popover'; -import { ManagementViews, ManagementTrigger } from '@/lib/management'; +import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/popover'; import { addError } from '@/lib/data-access/store/configSlice'; +import { ManagementTrigger, ManagementViews } from '@/lib/management'; +import { useEffect, useRef, useState } from 'react'; +import GpLogo from './gp-logo'; export const Navbar = () => { const dispatch = useAppDispatch(); diff --git a/src/app/onboarding/onboarding.tsx b/src/app/onboarding/onboarding.tsx index f904cd63f..2906e67e7 100644 --- a/src/app/onboarding/onboarding.tsx +++ b/src/app/onboarding/onboarding.tsx @@ -1,9 +1,9 @@ -import React, { useState, useEffect } from 'react'; +import { Button } from '@/lib/components/buttons'; +import { useEffect, useState } from 'react'; import Joyride, { ACTIONS, EVENTS, STATUS, Step } from 'react-joyride'; import { useLocation } from 'react-router-dom'; -import { Button } from '@/lib/components/buttons'; -import { useCases } from './use-cases'; import { OnboardingTooltip } from './tooltip'; +import { useCases } from './use-cases'; interface OnboardingState { run?: boolean; diff --git a/src/app/onboarding/tooltip.tsx b/src/app/onboarding/tooltip.tsx index 9c74c1fde..a0efa188a 100644 --- a/src/app/onboarding/tooltip.tsx +++ b/src/app/onboarding/tooltip.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { TooltipRenderProps } from 'react-joyride'; const OnboardingTooltip = (props: TooltipRenderProps) => { diff --git a/src/app/onboarding/use-cases/index.tsx b/src/app/onboarding/use-cases/index.tsx index 1805d31db..f64d3030d 100644 --- a/src/app/onboarding/use-cases/index.tsx +++ b/src/app/onboarding/use-cases/index.tsx @@ -1,5 +1,5 @@ -import { generalScript } from './general'; import { fraudScript } from './fraud'; +import { generalScript } from './general'; export const useCases = { general: generalScript, diff --git a/src/config/colors.ts b/src/config/colors.ts index a9a1615c7..c26d37340 100644 --- a/src/config/colors.ts +++ b/src/config/colors.ts @@ -132,7 +132,7 @@ export const visualizationColors = { '#212326', '#151719', ], - } + }, }, GPSelected: { title: 'Selected', diff --git a/src/config/styling/variables.css b/src/config/styling/variables.css index 6e243e7d8..4f02332ac 100644 --- a/src/config/styling/variables.css +++ b/src/config/styling/variables.css @@ -108,7 +108,6 @@ --clr-cat-12: var(--clr-neutral-50); --clr-cat-13: var(--clr-neutral-50); --clr-cat-14: var(--clr-neutral-50); - } @media (prefers-color-scheme: dark) { diff --git a/src/lib/components/DataTypeIcon/index.tsx b/src/lib/components/DataTypeIcon/index.tsx index 6b5bdc26e..8f626b006 100644 --- a/src/lib/components/DataTypeIcon/index.tsx +++ b/src/lib/components/DataTypeIcon/index.tsx @@ -1,5 +1,4 @@ -import React from 'react'; -import { SchemaAttributeTypes } from '../../schema'; +import { SchemaAttributeTypes } from 'ts-common'; const IconMap: Record<SchemaAttributeTypes, string> = { float: 'icon-[carbon--string-integer]', diff --git a/src/lib/components/DesignGuides/styleGuide.mdx b/src/lib/components/DesignGuides/styleGuide.mdx index 84309a9ba..6781b6b14 100644 --- a/src/lib/components/DesignGuides/styleGuide.mdx +++ b/src/lib/components/DesignGuides/styleGuide.mdx @@ -32,6 +32,7 @@ Style files can be found in: ```jsx <div className="text-primary-500 border-secondary-200 hover:bg-accent-100"></div> ``` + In "dark-mode" the colors will automatically be inverted. If you want to override If you want to have a separate color for dark mode, you can use the "dark:" prefix. E.g.: diff --git a/src/lib/components/accordion/accordion.stories.tsx b/src/lib/components/accordion/accordion.stories.tsx index bb0c2b067..de538a5c7 100644 --- a/src/lib/components/accordion/accordion.stories.tsx +++ b/src/lib/components/accordion/accordion.stories.tsx @@ -1,6 +1,5 @@ -import React from 'react'; -import { StoryObj, Meta } from '@storybook/react'; -import { Accordion, AccordionItem, AccordionHead, AccordionBody } from '.'; +import { Meta, StoryObj } from '@storybook/react'; +import { Accordion, AccordionBody, AccordionHead, AccordionItem } from '.'; import { EntityPill, RelationPill } from '../pills'; export default { diff --git a/src/lib/components/accordion/index.tsx b/src/lib/components/accordion/index.tsx index ee5fbd542..eec3bf5df 100644 --- a/src/lib/components/accordion/index.tsx +++ b/src/lib/components/accordion/index.tsx @@ -1,4 +1,4 @@ -import React, { useState, ReactElement } from 'react'; +import React, { ReactElement, useState } from 'react'; import { Button } from '../buttons'; type AccordionProps = { diff --git a/src/lib/components/buttons/Button.tsx b/src/lib/components/buttons/Button.tsx index 107559d85..404941775 100644 --- a/src/lib/components/buttons/Button.tsx +++ b/src/lib/components/buttons/Button.tsx @@ -1,7 +1,7 @@ import React, { useMemo } from 'react'; -import styles from './buttons.module.scss'; import { Icon } from '../icon'; import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip'; +import styles from './buttons.module.scss'; export type ButtonProps = { as?: 'button' | 'a' | 'div'; diff --git a/src/lib/components/buttons/button.stories.tsx b/src/lib/components/buttons/button.stories.tsx index 869a4ab38..2eaa48424 100644 --- a/src/lib/components/buttons/button.stories.tsx +++ b/src/lib/components/buttons/button.stories.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { Button } from '.'; diff --git a/src/lib/components/buttons/buttons.module.scss b/src/lib/components/buttons/buttons.module.scss index 9ef8f2ce3..a28e90bee 100644 --- a/src/lib/components/buttons/buttons.module.scss +++ b/src/lib/components/buttons/buttons.module.scss @@ -39,8 +39,8 @@ } .btn-icon-only { line-height: 1; - padding-left: 0!important; - padding-right: 0!important; + padding-left: 0 !important; + padding-right: 0 !important; } .btn-2xl { @apply text-lg min-h-11 min-w-11 px-3.5 py-2.5 gap-2 rounded; @@ -71,7 +71,8 @@ @apply ring-primary-400 hover:ring-primary-500; --btn-color: var(--clr-pri--600); --focus-shadow-clr: var(--clr-pri--500); - &:hover, &:focus { + &:hover, + &:focus { --btn-color: var(--clr-pri--500); --btn-color-light-hover: var(--clr-pri--600); } @@ -80,7 +81,8 @@ .btn-secondary { @apply ring-secondary-400 hover:ring-secondary-500; --btn-color: var(--clr-sec--700); - &:hover, &:focus { + &:hover, + &:focus { --btn-color: var(--clr-sec--800); --btn-color-light-hover: var(--clr-sec--700); } @@ -89,7 +91,8 @@ @apply ring-danger-400 hover:ring-danger-500; --btn-color: var(--clr-dang--600); --focus-shadow-clr: var(--clr-dang--500); - &:hover, &:focus { + &:hover, + &:focus { --btn-color: var(--clr-dang--500); --btn-color-light-hover: var(--clr-dang--600); } diff --git a/src/lib/components/buttons/overview.mdx b/src/lib/components/buttons/overview.mdx index 1ebc20ede..1a0021bb0 100644 --- a/src/lib/components/buttons/overview.mdx +++ b/src/lib/components/buttons/overview.mdx @@ -13,30 +13,33 @@ A button is used a lot in GP. ### Variants and types - <div className="grid grid-cols-2 gap-4 py-4"> - <div className="flex flex-col gap-3"> - <Button variantType="primary" variant="solid" label="Solid" onClick={() => alert('Button clicked')} /> - <Button variantType="primary" variant="outline" label="Outline" onClick={() => alert('Button clicked')} /> - <Button variantType="primary" variant="ghost" label="Ghost" onClick={() => alert('Button clicked')} /> - </div> - <div className="flex flex-col gap-3"> - <Button variantType="secondary" variant="solid" label="Solid" onClick={() => alert('Button clicked')} /> - <Button variantType="secondary" variant="outline" label="Outline" onClick={() => alert('Button clicked')} /> - <Button variantType="secondary" variant="ghost" label="Ghost" onClick={() => alert('Button clicked')} /> - </div> - <div className="flex flex-col gap-3"> - <Button variantType="danger" variant="solid" label="Solid" onClick={() => alert('Button clicked')} /> - <Button variantType="danger" variant="outline" label="Outline" onClick={() => alert('Button clicked')} /> - <Button variantType="danger" variant="ghost" label="Ghost" onClick={() => alert('Button clicked')} /> - </div> - <div className="flex flex-col gap-3"> - <Button variantType="primary" variant="solid" label="Solid disabled" onClick={() => alert('Button clicked')} disabled /> - <Button variantType="secondary" variant="outline" label="Outline disabled" onClick={() => alert('Button clicked')} disabled /> - <Button variantType="danger" variant="ghost" label="Ghost disabled" onClick={() => alert('Button clicked')} disabled /> - </div> +{' '} + +<div className="grid grid-cols-2 gap-4 py-4"> + <div className="flex flex-col gap-3"> + <Button variantType="primary" variant="solid" label="Solid" onClick={() => alert('Button clicked')} /> + <Button variantType="primary" variant="outline" label="Outline" onClick={() => alert('Button clicked')} /> + <Button variantType="primary" variant="ghost" label="Ghost" onClick={() => alert('Button clicked')} /> + </div> + <div className="flex flex-col gap-3"> + <Button variantType="secondary" variant="solid" label="Solid" onClick={() => alert('Button clicked')} /> + <Button variantType="secondary" variant="outline" label="Outline" onClick={() => alert('Button clicked')} /> + <Button variantType="secondary" variant="ghost" label="Ghost" onClick={() => alert('Button clicked')} /> + </div> + <div className="flex flex-col gap-3"> + <Button variantType="danger" variant="solid" label="Solid" onClick={() => alert('Button clicked')} /> + <Button variantType="danger" variant="outline" label="Outline" onClick={() => alert('Button clicked')} /> + <Button variantType="danger" variant="ghost" label="Ghost" onClick={() => alert('Button clicked')} /> </div> + <div className="flex flex-col gap-3"> + <Button variantType="primary" variant="solid" label="Solid disabled" onClick={() => alert('Button clicked')} disabled /> + <Button variantType="secondary" variant="outline" label="Outline disabled" onClick={() => alert('Button clicked')} disabled /> + <Button variantType="danger" variant="ghost" label="Ghost disabled" onClick={() => alert('Button clicked')} disabled /> + </div> +</div> ### With Icon + <div className="grid gap-4"> <div className="flex flex-row gap-3"> <Button variantType="primary" variant="solid" label="leading (default)" iconComponent="icon-[ic--baseline-add]" /> @@ -46,26 +49,94 @@ A button is used a lot in GP. </div> ### Sizes - <div className="grid gap-4"> + +{' '} + +<div className="grid gap-4"> <div className="flex flex-row gap-3"> - <Button variantType="primary" size="2xl" label="2xl size" iconComponent="icon-[ic--baseline-expand]" onClick={() => alert('Button clicked')} /> - <Button variantType="primary" size="xl" label="xl size" iconComponent="icon-[ic--baseline-expand]" onClick={() => alert('Button clicked')} /> - <Button variantType="primary" size="lg" label="lg size" iconComponent="icon-[ic--baseline-expand]" onClick={() => alert('Button clicked')} /> - <Button variantType="primary" size="md" label="md size (default)" iconComponent="icon-[ic--baseline-expand]" onClick={() => alert('Button clicked')} /> - <Button variantType="primary" size="sm" label="sm size" iconComponent="icon-[ic--baseline-expand]" onClick={() => alert('Button clicked')} /> - <Button variantType="primary" size="xs" label="xs size" iconComponent="icon-[ic--baseline-expand]" onClick={() => alert('Button clicked')} /> - <Button variantType="primary" size="2xs" label="2xs size" iconComponent="icon-[ic--baseline-expand]" onClick={() => alert('Button clicked')} /> - <Button variantType="primary" size="3xs" label="3xs size" iconComponent="icon-[ic--baseline-expand]" onClick={() => alert('Button clicked')} /> + <Button + variantType="primary" + size="2xl" + label="2xl size" + iconComponent="icon-[ic--baseline-expand]" + onClick={() => alert('Button clicked')} + /> + <Button + variantType="primary" + size="xl" + label="xl size" + iconComponent="icon-[ic--baseline-expand]" + onClick={() => alert('Button clicked')} + /> + <Button + variantType="primary" + size="lg" + label="lg size" + iconComponent="icon-[ic--baseline-expand]" + onClick={() => alert('Button clicked')} + /> + <Button + variantType="primary" + size="md" + label="md size (default)" + iconComponent="icon-[ic--baseline-expand]" + onClick={() => alert('Button clicked')} + /> + <Button + variantType="primary" + size="sm" + label="sm size" + iconComponent="icon-[ic--baseline-expand]" + onClick={() => alert('Button clicked')} + /> + <Button + variantType="primary" + size="xs" + label="xs size" + iconComponent="icon-[ic--baseline-expand]" + onClick={() => alert('Button clicked')} + /> + <Button + variantType="primary" + size="2xs" + label="2xs size" + iconComponent="icon-[ic--baseline-expand]" + onClick={() => alert('Button clicked')} + /> + <Button + variantType="primary" + size="3xs" + label="3xs size" + iconComponent="icon-[ic--baseline-expand]" + onClick={() => alert('Button clicked')} + /> </div> </div> ### Other + <div className="grid gap-4"> <div className="flex flex-row gap-3"> <Button variantType="primary" variant="outline" size="xs" label="Rounded" rounded onClick={() => alert('Button clicked')} /> <Button variantType="primary" iconComponent="icon-[ic--baseline-add]" size="xs" rounded onClick={() => alert('Button clicked')} /> - <Button variantType="primary" variant="outline" iconComponent="icon-[ic--baseline-add]" iconPosition="trailing" label="Label and icon" size="2xs" rounded onClick={() => alert('Button clicked')} /> - <Button variantType="primary" variant="ghost" iconComponent="icon-[ic--baseline-add]" size="3xs" rounded onClick={() => alert('Button clicked')} /> + <Button + variantType="primary" + variant="outline" + iconComponent="icon-[ic--baseline-add]" + iconPosition="trailing" + label="Label and icon" + size="2xs" + rounded + onClick={() => alert('Button clicked')} + /> + <Button + variantType="primary" + variant="ghost" + iconComponent="icon-[ic--baseline-add]" + size="3xs" + rounded + onClick={() => alert('Button clicked')} + /> </div> <div> <Button block variantType="primary" size="xl" label="Block" onClick={() => alert('Button clicked')} /> diff --git a/src/lib/components/charts/Axis/axis.stories.tsx b/src/lib/components/charts/Axis/axis.stories.tsx index f672fe09d..1f45cdf11 100644 --- a/src/lib/components/charts/Axis/axis.stories.tsx +++ b/src/lib/components/charts/Axis/axis.stories.tsx @@ -1,8 +1,7 @@ // BarPlot.stories.tsx -import React from 'react'; import { Meta } from '@storybook/react'; -import AxisComponent from '.'; import { scaleLinear } from 'd3'; +import AxisComponent from '.'; export default { title: 'Visual charts/Charts/Axis', diff --git a/src/lib/components/charts/Axis/index.tsx b/src/lib/components/charts/Axis/index.tsx index db98bf5be..410fda823 100644 --- a/src/lib/components/charts/Axis/index.tsx +++ b/src/lib/components/charts/Axis/index.tsx @@ -1,5 +1,5 @@ -import React, { useEffect, useRef } from 'react'; import * as d3 from 'd3'; +import React, { useEffect, useRef } from 'react'; export type AxisComponentProps = { scale: d3.AxisScale<number | { valueOf(): number }>; diff --git a/src/lib/components/charts/barplot/barplot.stories.tsx b/src/lib/components/charts/barplot/barplot.stories.tsx index 4c3cea848..b9622d53d 100644 --- a/src/lib/components/charts/barplot/barplot.stories.tsx +++ b/src/lib/components/charts/barplot/barplot.stories.tsx @@ -1,5 +1,4 @@ // BarPlot.stories.tsx -import React from 'react'; import { Meta } from '@storybook/react'; import { BarPlot } from '.'; diff --git a/src/lib/components/charts/barplot/index.tsx b/src/lib/components/charts/barplot/index.tsx index ef65bdea3..b1c7ee6be 100644 --- a/src/lib/components/charts/barplot/index.tsx +++ b/src/lib/components/charts/barplot/index.tsx @@ -1,7 +1,7 @@ -import React, { useEffect, useMemo, useRef, useState } from 'react'; -import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@/lib/components/tooltip'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/lib/components/tooltip'; +import { parseValue } from '@/lib/data-access/store/graphQuerySlice'; import { axisLeft, bin, extent, format, max, range, scaleBand, scaleLinear, select } from 'd3'; -import { parseValue } from '@/lib/data-access/store/graphQueryResultSlice'; +import { useEffect, useMemo, useRef, useState } from 'react'; export type BarPlotProps = { data: { category: string; count: number }[]; diff --git a/src/lib/components/charts/colorLegendCat/colorLegendCat.stories.tsx b/src/lib/components/charts/colorLegendCat/colorLegendCat.stories.tsx index 2c4e2a0de..c85bcfc34 100644 --- a/src/lib/components/charts/colorLegendCat/colorLegendCat.stories.tsx +++ b/src/lib/components/charts/colorLegendCat/colorLegendCat.stories.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { Meta } from '@storybook/react'; import ColorLegendCat from '.'; diff --git a/src/lib/components/charts/colorLegendSeqDiv/colorLegendSeqDiv.stories.tsx b/src/lib/components/charts/colorLegendSeqDiv/colorLegendSeqDiv.stories.tsx index 9d83cc515..b3608eb5d 100644 --- a/src/lib/components/charts/colorLegendSeqDiv/colorLegendSeqDiv.stories.tsx +++ b/src/lib/components/charts/colorLegendSeqDiv/colorLegendSeqDiv.stories.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { Meta } from '@storybook/react'; import { ColorLegendSeqDiv } from '.'; diff --git a/src/lib/components/charts/colorLegendSeqDiv/index.tsx b/src/lib/components/charts/colorLegendSeqDiv/index.tsx index b1639467c..d811ddd09 100644 --- a/src/lib/components/charts/colorLegendSeqDiv/index.tsx +++ b/src/lib/components/charts/colorLegendSeqDiv/index.tsx @@ -1,5 +1,5 @@ import { axisBottom, scaleLinear, select } from 'd3'; -import React, { useEffect, useRef } from 'react'; +import { useEffect, useRef } from 'react'; export type ColorLegendSeqDivProps = { colors: string[]; diff --git a/src/lib/components/charts/heatmap1D/index.tsx b/src/lib/components/charts/heatmap1D/index.tsx index 51a93ef78..082c5898d 100644 --- a/src/lib/components/charts/heatmap1D/index.tsx +++ b/src/lib/components/charts/heatmap1D/index.tsx @@ -1,6 +1,6 @@ +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/lib/components/tooltip'; +import { bin, extent, range, scaleQuantize, select } from 'd3'; import { useEffect, useMemo, useRef, useState } from 'react'; -import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@/lib/components/tooltip'; -import { bin, extent, range, select, scaleQuantize } from 'd3'; import { visualizationColors } from 'ts-common'; export type heatmap1DProps = { diff --git a/src/lib/components/charts/indicatorGraph/index.tsx b/src/lib/components/charts/indicatorGraph/index.tsx index 871fe5573..f38ee902d 100644 --- a/src/lib/components/charts/indicatorGraph/index.tsx +++ b/src/lib/components/charts/indicatorGraph/index.tsx @@ -1,6 +1,6 @@ -import { useEffect, useMemo, useRef, useState } from 'react'; -import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@/lib/components/tooltip'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/lib/components/tooltip'; import { scaleLinear, select } from 'd3'; +import { useEffect, useMemo, useRef, useState } from 'react'; export type IndicatorGraphProps = { data: number; diff --git a/src/lib/components/charts/scatterplotD3/index.tsx b/src/lib/components/charts/scatterplotD3/index.tsx index faed9556c..e49016323 100644 --- a/src/lib/components/charts/scatterplotD3/index.tsx +++ b/src/lib/components/charts/scatterplotD3/index.tsx @@ -1,5 +1,5 @@ -import React, { useEffect, useRef } from 'react'; import * as d3 from 'd3'; +import React, { useEffect, useRef } from 'react'; export interface ScatterplotProps { data: regionData; @@ -74,7 +74,7 @@ const Scatterplot: React.FC<ScatterplotProps> = ({ data, visualConfig, xScale, o const simulation = d3 .forceSimulation<DataPointXY>(dataCircles) .force('x', d3.forceX(d => xScale(d.x!)).strength(4)) - .force('y', d3.forceY(d => yScale(0.0)).strength(0.1)) + .force('y', d3.forceY(() => yScale(0.0)).strength(0.1)) .force('collide', d3.forceCollide(radius * 1.25).strength(0.5)); const circles = groupMargin @@ -82,8 +82,8 @@ const Scatterplot: React.FC<ScatterplotProps> = ({ data, visualConfig, xScale, o .data(dataCircles) .enter() .append('circle') - .attr('class', (d, i) => `${data.idData[i]}`) - .attr('cx', (d, i) => xScale(d.x)) + .attr('class', (_, i) => `${data.idData[i]}`) + .attr('cx', d => xScale(d.x)) .attr('cy', d => yScale(d.y)) .attr('r', radius) .attr('stroke', 'gray') diff --git a/src/lib/components/charts/scatterplotD3/scatterplot.stories.tsx b/src/lib/components/charts/scatterplotD3/scatterplot.stories.tsx index fdda32dc2..7e47709df 100644 --- a/src/lib/components/charts/scatterplotD3/scatterplot.stories.tsx +++ b/src/lib/components/charts/scatterplotD3/scatterplot.stories.tsx @@ -1,7 +1,6 @@ -import React from 'react'; import { Meta } from '@storybook/react'; -import Scatterplot, { VisualRegionConfig, regionData, DataPoint } from '.'; import { scaleLinear } from 'd3'; +import Scatterplot, { DataPoint, VisualRegionConfig, regionData } from '.'; const Component: Meta<typeof Scatterplot> = { title: 'Visual charts/Charts/ScatterplotD3', diff --git a/src/lib/components/charts/scatterplot_pixi/index.tsx b/src/lib/components/charts/scatterplot_pixi/index.tsx index 3b78477bb..829b5d4f3 100644 --- a/src/lib/components/charts/scatterplot_pixi/index.tsx +++ b/src/lib/components/charts/scatterplot_pixi/index.tsx @@ -1,6 +1,6 @@ -import React, { useEffect, useRef } from 'react'; import * as d3 from 'd3'; import * as PIXI from 'pixi.js'; +import React, { useEffect, useRef } from 'react'; export interface ScatterplotProps { data: regionData; diff --git a/src/lib/components/charts/scatterplot_pixi/scatterplot.stories.tsx b/src/lib/components/charts/scatterplot_pixi/scatterplot.stories.tsx index b191cde24..84babc987 100644 --- a/src/lib/components/charts/scatterplot_pixi/scatterplot.stories.tsx +++ b/src/lib/components/charts/scatterplot_pixi/scatterplot.stories.tsx @@ -1,8 +1,7 @@ // Scatterplot.stories.tsx -import React from 'react'; import { Meta } from '@storybook/react'; -import Scatterplot, { VisualRegionConfig, regionData, DataPoint } from '.'; import { scaleLinear } from 'd3'; +import Scatterplot, { DataPoint, VisualRegionConfig, regionData } from '.'; const Component: Meta<typeof Scatterplot> = { title: 'Visual charts/Charts/ScatterplotPIXI', diff --git a/src/lib/components/color-mode/index.tsx b/src/lib/components/color-mode/index.tsx index 749710828..89e2b156c 100644 --- a/src/lib/components/color-mode/index.tsx +++ b/src/lib/components/color-mode/index.tsx @@ -1,8 +1,8 @@ -import React, { useEffect } from 'react'; -import { Button } from '../buttons'; -import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../components/tooltip'; -import { setTheme, Theme } from '@/lib/data-access/store/configSlice'; import { useAppDispatch, useConfig } from '@/lib/data-access/store'; +import { setTheme, Theme } from '@/lib/data-access/store/configSlice'; +import { useEffect } from 'react'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../components/tooltip'; +import { Button } from '../buttons'; const ColorMode = () => { const config = useConfig(); diff --git a/src/lib/components/colorComponents/colorDropdown/colorLegendDropdown.stories.tsx b/src/lib/components/colorComponents/colorDropdown/colorLegendDropdown.stories.tsx index 2451064d3..7658ecb79 100644 --- a/src/lib/components/colorComponents/colorDropdown/colorLegendDropdown.stories.tsx +++ b/src/lib/components/colorComponents/colorDropdown/colorLegendDropdown.stories.tsx @@ -1,5 +1,5 @@ -import React, { useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; +import { useState } from 'react'; import DropdownColorLegend from '.'; const Component: Meta<typeof DropdownColorLegend> = { diff --git a/src/lib/components/colorComponents/colorDropdown/index.tsx b/src/lib/components/colorComponents/colorDropdown/index.tsx index e617a8760..0803b9a95 100644 --- a/src/lib/components/colorComponents/colorDropdown/index.tsx +++ b/src/lib/components/colorComponents/colorDropdown/index.tsx @@ -1,7 +1,7 @@ -import React, { useState } from 'react'; -import { DropdownTrigger, DropdownContainer, DropdownItemContainer } from '@/lib/components/dropdowns'; -import ColorLegend from '../colorLegend/index.js'; import { dataColors } from '@/config'; +import { DropdownContainer, DropdownItemContainer, DropdownTrigger } from '@/lib/components/dropdowns'; +import { useState } from 'react'; +import ColorLegend from '../colorLegend/index.js'; type TailwindColor = { colors: string | { [key: number]: string }; diff --git a/src/lib/components/colorComponents/colorLegend/colorLegendSeqDiv.stories.tsx b/src/lib/components/colorComponents/colorLegend/colorLegendSeqDiv.stories.tsx index 1e7cc8a2c..1adbdcec1 100644 --- a/src/lib/components/colorComponents/colorLegend/colorLegendSeqDiv.stories.tsx +++ b/src/lib/components/colorComponents/colorLegend/colorLegendSeqDiv.stories.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { Meta } from '@storybook/react'; import ColorLegend from '.'; diff --git a/src/lib/components/colorComponents/colorLegend/index.tsx b/src/lib/components/colorComponents/colorLegend/index.tsx index 8b527e81d..080e1ce6c 100644 --- a/src/lib/components/colorComponents/colorLegend/index.tsx +++ b/src/lib/components/colorComponents/colorLegend/index.tsx @@ -1,5 +1,5 @@ import { axisBottom, scaleLinear, select } from 'd3'; -import React, { useEffect, useRef } from 'react'; +import { useEffect, useRef } from 'react'; export type ColorLegendProps = { colors: { [key: number]: string }; diff --git a/src/lib/components/colorComponents/colorPicker/colorPicker.stories.tsx b/src/lib/components/colorComponents/colorPicker/colorPicker.stories.tsx index ca51c8978..4d6139acc 100644 --- a/src/lib/components/colorComponents/colorPicker/colorPicker.stories.tsx +++ b/src/lib/components/colorComponents/colorPicker/colorPicker.stories.tsx @@ -1,5 +1,6 @@ -import React, { useState } from 'react'; +import { nodeColorRGB } from '@/lib/vis/visualizations/mapvis/utils'; import type { Meta, StoryObj } from '@storybook/react'; +import { useState } from 'react'; import { ColorPicker } from '.'; const Component: Meta<typeof ColorPicker> = { @@ -13,10 +14,10 @@ export default Component; type Story = StoryObj<typeof Component>; -export const ColorPickerStory: Story = (args: any) => { - const [value, setValue] = useState<[number, number, number]>([251, 150, 55]); +export const ColorPickerStory: Story = () => { + const [value, setValue] = useState<number>(0); - return <ColorPicker value={value} onChange={setValue} />; + return <ColorPicker value={nodeColorRGB(value)} onChange={setValue} />; }; ColorPickerStory.args = {}; diff --git a/src/lib/components/colorComponents/colorPicker/index.tsx b/src/lib/components/colorComponents/colorPicker/index.tsx index f74bff712..650a6f395 100644 --- a/src/lib/components/colorComponents/colorPicker/index.tsx +++ b/src/lib/components/colorComponents/colorPicker/index.tsx @@ -1,5 +1,5 @@ import { visualizationColors } from '@/config'; -import { Popover, PopoverTrigger, PopoverContent } from '@/lib/components/layout/Popover'; +import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/layout/Popover'; type Props = { value: [number, number, number]; diff --git a/src/lib/components/controls/index.tsx b/src/lib/components/controls/index.tsx index a28c32b41..8fb1cbc07 100644 --- a/src/lib/components/controls/index.tsx +++ b/src/lib/components/controls/index.tsx @@ -1,4 +1,4 @@ -import React, { ReactNode } from 'react'; +import { ReactNode } from 'react'; type Props = { children: ReactNode; diff --git a/src/lib/components/dropdowns/Dropdown.stories.tsx b/src/lib/components/dropdowns/Dropdown.stories.tsx index 371f96269..9dcbc1c1d 100644 --- a/src/lib/components/dropdowns/Dropdown.stories.tsx +++ b/src/lib/components/dropdowns/Dropdown.stories.tsx @@ -1,10 +1,10 @@ /* eslint-disable react-hooks/rules-of-hooks */ // Dropdown.stories.tsx -import React, { useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; -import { DropdownContainer, DropdownTrigger, DropdownItemContainer, DropdownItem } from './index'; +import { useState } from 'react'; import { Icon } from '../icon'; +import { DropdownContainer, DropdownItem, DropdownItemContainer, DropdownTrigger } from './index'; const metaDropdown: Meta<typeof DropdownContainer> = { component: DropdownContainer, diff --git a/src/lib/components/dropdowns/index.tsx b/src/lib/components/dropdowns/index.tsx index d18577ba2..804b7cd4c 100644 --- a/src/lib/components/dropdowns/index.tsx +++ b/src/lib/components/dropdowns/index.tsx @@ -1,6 +1,6 @@ -import React, { useState, useRef, ReactNode } from 'react'; +import { Popover, PopoverContent, PopoverOptions, PopoverTrigger } from '@/lib/components/popover'; +import React, { ReactNode, useRef, useState } from 'react'; import { Icon } from '../icon'; -import { PopoverContent, PopoverTrigger, Popover, PopoverOptions } from '@/lib/components/popover'; export const DropdownContainer = ({ children, ...props }: { children: React.ReactNode } & PopoverOptions) => { return ( diff --git a/src/lib/components/errorBoundary/ErrorBoundary.tsx b/src/lib/components/errorBoundary/ErrorBoundary.tsx index 41d9f5c7e..e13290e1e 100644 --- a/src/lib/components/errorBoundary/ErrorBoundary.tsx +++ b/src/lib/components/errorBoundary/ErrorBoundary.tsx @@ -1,7 +1,7 @@ -import React, { Component, ErrorInfo, ReactNode } from 'react'; -import { Button } from '../buttons'; import { useAppDispatch } from '@/lib/data-access'; import { addInfo } from '@/lib/data-access/store/configSlice'; +import { Component, ErrorInfo, ReactNode } from 'react'; +import { Button } from '../buttons'; interface ErrorBoundaryProps { children: ReactNode; diff --git a/src/lib/components/featureFlags/FeatureEnabled.tsx b/src/lib/components/featureFlags/FeatureEnabled.tsx index 75ba6e0b2..9998ecda5 100644 --- a/src/lib/components/featureFlags/FeatureEnabled.tsx +++ b/src/lib/components/featureFlags/FeatureEnabled.tsx @@ -1,5 +1,5 @@ -import { canViewFeature, FeatureFlagName } from '.'; import { ReactNode } from 'react'; +import { canViewFeature, FeatureFlagName } from '.'; export function FeatureEnabled({ featureFlag, children }: { featureFlag: FeatureFlagName; children: ReactNode }) { return canViewFeature(featureFlag) ? children : null; diff --git a/src/lib/components/featureFlags/featureFlags.ts b/src/lib/components/featureFlags/featureFlags.ts index 0463406f0..e2ea91740 100644 --- a/src/lib/components/featureFlags/featureFlags.ts +++ b/src/lib/components/featureFlags/featureFlags.ts @@ -1,4 +1,4 @@ -import { getEnvVariable, EnvVarKey } from '@/config'; +import { EnvVarKey, getEnvVariable } from '@/config'; const getFeatureVariable = (flagId: EnvVarKey): boolean => { // TODO: move feature flag storage to database instead of env variables diff --git a/src/lib/components/featureFlags/index.ts b/src/lib/components/featureFlags/index.ts index 20f816cf1..b4e54f764 100644 --- a/src/lib/components/featureFlags/index.ts +++ b/src/lib/components/featureFlags/index.ts @@ -1,2 +1,2 @@ -export * from './featureFlags'; export * from './FeatureEnabled'; +export * from './featureFlags'; diff --git a/src/lib/components/icon/icon.stories.tsx b/src/lib/components/icon/icon.stories.tsx index fb79f1775..fb5821530 100644 --- a/src/lib/components/icon/icon.stories.tsx +++ b/src/lib/components/icon/icon.stories.tsx @@ -1,5 +1,5 @@ -import { StoryObj, Meta } from '@storybook/react'; import { Icon, sizesArray } from '@/lib/components/icon'; +import { Meta, StoryObj } from '@storybook/react'; /** * # Icon Component diff --git a/src/lib/components/icon/index.tsx b/src/lib/components/icon/index.tsx index f208efb30..fbface6a3 100644 --- a/src/lib/components/icon/index.tsx +++ b/src/lib/components/icon/index.tsx @@ -1,5 +1,4 @@ -import React, { ReactElement, ReactNode } from 'react'; -import { SVGProps } from 'react'; +import React, { ReactElement, ReactNode, SVGProps } from 'react'; // Define Sizes and IconProps types export const sizesArray = [8, 10, 12, 14, 16, 20, 24, 28, 32, 36, 40, 48, 56] as const; diff --git a/src/lib/components/index.ts b/src/lib/components/index.ts index ed9def1ff..6811af1cc 100644 --- a/src/lib/components/index.ts +++ b/src/lib/components/index.ts @@ -8,13 +8,13 @@ export * from './forms'; export * from './icon'; export * from './info'; export * from './inputs'; -export * from './pagination'; -export * from './tooltip'; +export * from './layout'; export * from './Legend'; export * from './LoadingSpinner'; export * from './nodeDetails'; -export * from './Popup'; -export * from './popover'; -export * from './layout'; +export * from './pagination'; export * from './pills'; +export * from './popover'; +export * from './Popup'; export * from './tabs'; +export * from './tooltip'; diff --git a/src/lib/components/info/index.tsx b/src/lib/components/info/index.tsx index d091ffcb4..8e83ef381 100644 --- a/src/lib/components/info/index.tsx +++ b/src/lib/components/info/index.tsx @@ -1,5 +1,5 @@ import { Icon, Sizes } from '@/lib/components/icon'; -import { Tooltip, TooltipContent, TooltipTrigger, TooltipProvider } from '@/lib/components/tooltip'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/lib/components/tooltip'; type Props = { tooltip: string; diff --git a/src/lib/components/info/info.stories.tsx b/src/lib/components/info/info.stories.tsx index b036825dd..c23128bfc 100644 --- a/src/lib/components/info/info.stories.tsx +++ b/src/lib/components/info/info.stories.tsx @@ -1,5 +1,5 @@ -import { StoryObj, Meta } from '@storybook/react'; import { sizesArray } from '@/lib/components/icon'; +import { Meta, StoryObj } from '@storybook/react'; import Info from '.'; export default { diff --git a/src/lib/components/inputs/BooleanInput.tsx b/src/lib/components/inputs/BooleanInput.tsx index 49d4821cf..d4e6aa3a7 100644 --- a/src/lib/components/inputs/BooleanInput.tsx +++ b/src/lib/components/inputs/BooleanInput.tsx @@ -1,5 +1,5 @@ import Info from '../info'; -import { Tooltip, TooltipTrigger, TooltipContent } from '../tooltip'; +import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip'; import { BooleanProps } from './types'; export const BooleanInput = ({ label, value, onChange, tooltip, info, size, required, className }: BooleanProps) => { diff --git a/src/lib/components/inputs/CheckboxInput.tsx b/src/lib/components/inputs/CheckboxInput.tsx index 1160390cd..1322f0f63 100644 --- a/src/lib/components/inputs/CheckboxInput.tsx +++ b/src/lib/components/inputs/CheckboxInput.tsx @@ -1,4 +1,4 @@ -import { Tooltip, TooltipTrigger, TooltipContent } from '../tooltip'; +import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip'; import { CheckboxProps } from './types'; export const CheckboxInput = ({ label, value, options, onChange, tooltip, disabled }: CheckboxProps) => { diff --git a/src/lib/components/inputs/DropdownInput.tsx b/src/lib/components/inputs/DropdownInput.tsx index 1159c4a76..3337eac70 100644 --- a/src/lib/components/inputs/DropdownInput.tsx +++ b/src/lib/components/inputs/DropdownInput.tsx @@ -1,9 +1,9 @@ import React, { useEffect, useRef } from 'react'; -import { DropdownContainer, DropdownTrigger, DropdownItemContainer, DropdownItem } from '../dropdowns'; +import { DropdownContainer, DropdownItem, DropdownItemContainer, DropdownTrigger } from '../dropdowns'; import Info from '../info'; -import { Tooltip, TooltipTrigger, TooltipContent } from '../tooltip'; -import { DropdownProps } from './types'; +import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip'; import { TextInput } from './TextInput'; +import { DropdownProps } from './types'; function parsedValue(item: number | string | { [key: string]: string }, key: boolean = false) { switch (typeof item) { diff --git a/src/lib/components/inputs/EmailInput.tsx b/src/lib/components/inputs/EmailInput.tsx index a8f534609..bccab45b5 100644 --- a/src/lib/components/inputs/EmailInput.tsx +++ b/src/lib/components/inputs/EmailInput.tsx @@ -1,6 +1,6 @@ +import { Button, Input } from '@/lib/components'; import { useState } from 'react'; import { EmailProps } from './types'; -import { Button, Input } from '@/lib/components'; export const EmailInput = ({ placeholder, diff --git a/src/lib/components/inputs/NumberInput.tsx b/src/lib/components/inputs/NumberInput.tsx index d53eea620..5833b3678 100644 --- a/src/lib/components/inputs/NumberInput.tsx +++ b/src/lib/components/inputs/NumberInput.tsx @@ -1,9 +1,9 @@ -import React, { useState, useEffect } from 'react'; +import React, { useEffect, useState } from 'react'; import { Button } from '../buttons'; import Info from '../info'; -import { TooltipProvider, Tooltip, TooltipTrigger, TooltipContent } from '../tooltip'; -import { NumberProps } from './types'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../tooltip'; import styles from './inputs.module.scss'; +import { NumberProps } from './types'; export const NumberInput = ({ label, diff --git a/src/lib/components/inputs/RadioInput.tsx b/src/lib/components/inputs/RadioInput.tsx index ebdbf9841..a4aabe157 100644 --- a/src/lib/components/inputs/RadioInput.tsx +++ b/src/lib/components/inputs/RadioInput.tsx @@ -1,4 +1,4 @@ -import { Tooltip, TooltipTrigger, TooltipContent } from '../tooltip'; +import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip'; import { RadioProps } from './types'; export const RadioInput = ({ label, value, options, onChange, tooltip }: RadioProps) => { diff --git a/src/lib/components/inputs/SliderInput.tsx b/src/lib/components/inputs/SliderInput.tsx index 4f79c25c7..6647a02df 100644 --- a/src/lib/components/inputs/SliderInput.tsx +++ b/src/lib/components/inputs/SliderInput.tsx @@ -1,7 +1,7 @@ -import { Tooltip, TooltipTrigger, TooltipContent } from '../tooltip'; -import { SliderProps } from './types'; -import styles from './slider.module.scss'; import { useState } from 'react'; +import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip'; +import styles from './slider.module.scss'; +import { SliderProps } from './types'; export const SliderInput = ({ label, @@ -45,7 +45,7 @@ export const SliderInput = ({ onChange(parseFloat(e.target.value)); } }} - onMouseUp={e => { + onMouseUp={() => { if (onChangeConfirmed) { onChangeConfirmed(currentValue); } diff --git a/src/lib/components/inputs/TextInput.tsx b/src/lib/components/inputs/TextInput.tsx index 27bda5363..42a8ad0ad 100644 --- a/src/lib/components/inputs/TextInput.tsx +++ b/src/lib/components/inputs/TextInput.tsx @@ -1,8 +1,8 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import Info from '../info'; -import { Tooltip, TooltipTrigger, TooltipContent } from '../tooltip'; -import { TextProps } from './types'; +import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip'; import styles from './inputs.module.scss'; +import { TextProps } from './types'; export const TextInput = ({ label, @@ -23,7 +23,7 @@ export const TextInput = ({ className, ...props }: TextProps) => { - const [isValid, setIsValid] = React.useState<boolean>(true); + const [isValid, setIsValid] = useState<boolean>(true); const handleInputChange = (inputValue: string) => { if (required && validate) { diff --git a/src/lib/components/inputs/TimeInput.tsx b/src/lib/components/inputs/TimeInput.tsx index e5958d2c9..f55efa163 100644 --- a/src/lib/components/inputs/TimeInput.tsx +++ b/src/lib/components/inputs/TimeInput.tsx @@ -1,4 +1,4 @@ -import { Tooltip, TooltipTrigger, TooltipContent } from '../tooltip'; +import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip'; import { TimeProps } from './types'; export const TimeInput = ({ label, value, onChange, tooltip, showTimezone = true }: TimeProps) => { diff --git a/src/lib/components/inputs/ToggleSwitchInput.tsx b/src/lib/components/inputs/ToggleSwitchInput.tsx index e0a4e6973..879bc8342 100644 --- a/src/lib/components/inputs/ToggleSwitchInput.tsx +++ b/src/lib/components/inputs/ToggleSwitchInput.tsx @@ -1,5 +1,5 @@ -import { useState, useEffect } from 'react'; -import { Tooltip, TooltipTrigger, TooltipContent } from '../tooltip'; +import { useEffect, useState } from 'react'; +import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip'; import { ToggleSwitchProps } from './types'; export const ToggleSwitchInput = ({ label, classText, value, tooltip, onChange, position, className }: ToggleSwitchProps) => { diff --git a/src/lib/components/inputs/checkbox.stories.tsx b/src/lib/components/inputs/checkbox.stories.tsx index 686deb844..9fad80576 100644 --- a/src/lib/components/inputs/checkbox.stories.tsx +++ b/src/lib/components/inputs/checkbox.stories.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { CheckboxInput } from './CheckboxInput'; @@ -17,7 +16,7 @@ export const CheckboxInputStory: Story = { type: 'checkbox', label: 'Checkbox component', options: ['Option 1', 'Option 2'], - onChange: value => {}, + onChange: () => {}, }, }; @@ -27,7 +26,7 @@ export const CheckboxInputStoryDisabled: Story = { label: 'Checkbox component (all disabled)', options: ['Option 1', 'Option 2'], disabled: [true, true], - onChange: value => {}, + onChange: () => {}, }, }; @@ -37,6 +36,6 @@ export const CheckboxInputStoryPartiallyDisabled: Story = { label: 'Checkbox component (partially disabled)', options: ['Option 1', 'Option 2'], disabled: [true, false], - onChange: value => {}, + onChange: () => {}, }, }; diff --git a/src/lib/components/inputs/dropdown.stories.tsx b/src/lib/components/inputs/dropdown.stories.tsx index afecde9fe..a97c6acc8 100644 --- a/src/lib/components/inputs/dropdown.stories.tsx +++ b/src/lib/components/inputs/dropdown.stories.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { DropdownInput } from './DropdownInput'; @@ -18,6 +17,6 @@ export const DropdownInputStory: Story = { label: 'Select component', options: ['Option 1', 'Option 2'], disabled: true, - onChange: value => {}, + onChange: () => {}, }, }; diff --git a/src/lib/components/inputs/index.tsx b/src/lib/components/inputs/index.tsx index 7adc08750..806b75e7b 100644 --- a/src/lib/components/inputs/index.tsx +++ b/src/lib/components/inputs/index.tsx @@ -1,25 +1,25 @@ import { BooleanInput } from './BooleanInput'; import { CheckboxInput } from './CheckboxInput'; import { DropdownInput } from './DropdownInput'; +import { EmailInput } from './EmailInput'; import { NumberInput } from './NumberInput'; import { RadioInput } from './RadioInput'; import { SliderInput } from './SliderInput'; import { TextInput } from './TextInput'; import { TimeInput } from './TimeInput'; import { ToggleSwitchInput } from './ToggleSwitchInput'; -import { EmailInput } from './EmailInput'; import { - InputProps, - SliderProps, - TextProps, + BooleanProps, CheckboxProps, DropdownProps, - RadioProps, - BooleanProps, + EmailProps, + InputProps, NumberProps, + RadioProps, + SliderProps, + TextProps, TimeProps, ToggleSwitchProps, - EmailProps, } from './types'; export const Input = (props: InputProps) => { diff --git a/src/lib/components/inputs/number.stories.tsx b/src/lib/components/inputs/number.stories.tsx index 8b3a8aeba..ad0ba6133 100644 --- a/src/lib/components/inputs/number.stories.tsx +++ b/src/lib/components/inputs/number.stories.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { NumberInput } from './NumberInput'; @@ -18,7 +17,7 @@ export const NumberInputStory: Story = { label: 'Number input', placeholder: 'Put here a number', required: true, - onChange: value => {}, + onChange: () => {}, }, }; @@ -31,6 +30,6 @@ export const RequiredNumberInputStory: Story = { validate: value => { return value.length > 0; }, - onChange: value => {}, + onChange: () => {}, }, }; diff --git a/src/lib/components/inputs/radio.stories.tsx b/src/lib/components/inputs/radio.stories.tsx index 43a265348..1e1171494 100644 --- a/src/lib/components/inputs/radio.stories.tsx +++ b/src/lib/components/inputs/radio.stories.tsx @@ -1,5 +1,5 @@ -import React, { useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; +import { useState } from 'react'; import { RadioInput } from './RadioInput'; const Component: Meta<typeof RadioInput> = { diff --git a/src/lib/components/inputs/slider.stories.tsx b/src/lib/components/inputs/slider.stories.tsx index 8f2f5e3eb..a2b26f9f6 100644 --- a/src/lib/components/inputs/slider.stories.tsx +++ b/src/lib/components/inputs/slider.stories.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { SliderInput } from './SliderInput'; @@ -22,6 +21,6 @@ export const SliderInputStory: Story = { unit: 'px', value: 50, showValue: true, - onChange: value => {}, + onChange: () => {}, }, }; diff --git a/src/lib/components/inputs/text.stories.tsx b/src/lib/components/inputs/text.stories.tsx index 5b61233eb..e9dcccd3b 100644 --- a/src/lib/components/inputs/text.stories.tsx +++ b/src/lib/components/inputs/text.stories.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { TextInput } from './TextInput'; @@ -18,7 +17,7 @@ export const TextInputStory: Story = { label: 'Text input', placeholder: 'Put here some text', required: true, - onChange: value => {}, + onChange: () => {}, }, }; @@ -31,6 +30,6 @@ export const RequiredTextInputStory: Story = { validate: value => { return value.length > 0; }, - onChange: value => {}, + onChange: () => {}, }, }; diff --git a/src/lib/components/inputs/time.stories.tsx b/src/lib/components/inputs/time.stories.tsx index d36fa84be..e91d3dd6b 100644 --- a/src/lib/components/inputs/time.stories.tsx +++ b/src/lib/components/inputs/time.stories.tsx @@ -1,5 +1,5 @@ -import React, { useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; +import { useState } from 'react'; import { TimeInput } from './TimeInput'; const Component: Meta<typeof TimeInput> = { diff --git a/src/lib/components/inputs/toggleSwitch.stories.tsx b/src/lib/components/inputs/toggleSwitch.stories.tsx index 48a39a385..57af717f8 100644 --- a/src/lib/components/inputs/toggleSwitch.stories.tsx +++ b/src/lib/components/inputs/toggleSwitch.stories.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { ToggleSwitchInput } from './ToggleSwitchInput'; @@ -17,6 +16,6 @@ export const ToggleSwitchInputStory: Story = { type: 'toggle', label: 'Toggle Switch component', value: false, - onChange: value => {}, + onChange: () => {}, }, }; diff --git a/src/lib/components/layout/Dialog.tsx b/src/lib/components/layout/Dialog.tsx index 345fef11b..ea1ce519b 100644 --- a/src/lib/components/layout/Dialog.tsx +++ b/src/lib/components/layout/Dialog.tsx @@ -1,16 +1,16 @@ -import * as React from 'react'; import { - useFloating, + FloatingFocusManager, + FloatingOverlay, + FloatingPortal, useClick, useDismiss, - useRole, + useFloating, + useId, useInteractions, useMergeRefs, - FloatingPortal, - FloatingFocusManager, - FloatingOverlay, - useId, + useRole, } from '@floating-ui/react'; +import * as React from 'react'; import { Button, ButtonProps } from '../buttons'; interface DialogOptions { @@ -109,7 +109,7 @@ export const DialogTrigger = React.forwardRef<HTMLElement, React.HTMLProps<HTMLE const ref = useMergeRefs([context.data.refs.setReference, propRef, childrenRef]); // `asChild` allows the user to pass any element as the anchor - if (asChild && React.isValidElement(children)) { + if (asChild && React.isValidElement(children) && children.props != null) { return React.cloneElement( children, context.interactions.getReferenceProps({ @@ -117,7 +117,7 @@ export const DialogTrigger = React.forwardRef<HTMLElement, React.HTMLProps<HTMLE ...props, ...children.props, 'data-state': context.open ? 'open' : 'closed', - }), + } as any), // Any because data-state is not an HTML property. ); } diff --git a/src/lib/components/layout/Popover.tsx b/src/lib/components/layout/Popover.tsx index 7454f80c2..a21476fa0 100644 --- a/src/lib/components/layout/Popover.tsx +++ b/src/lib/components/layout/Popover.tsx @@ -1,20 +1,20 @@ -import * as React from 'react'; import { - useFloating, autoUpdate, - offset, flip, + FloatingFocusManager, + FloatingPortal, + offset, + Placement, shift, useClick, useDismiss, - useRole, + useFloating, + useId, useInteractions, useMergeRefs, - Placement, - FloatingPortal, - FloatingFocusManager, - useId, + useRole, } from '@floating-ui/react'; +import * as React from 'react'; export interface PopoverOptions { initialOpen?: boolean; @@ -142,14 +142,14 @@ export const PopoverTrigger = React.forwardRef<HTMLElement, React.HTMLProps<HTML const cursorClass = disabled ? 'cursor-not-allowed' : 'cursor-pointer'; // `asChild` allows the user to pass any element as the anchor - if (asChild && React.isValidElement(children)) { + if (asChild && React.isValidElement(children) && children.props != null) { return React.cloneElement( children, context.interactions.getReferenceProps({ ref, ...props, ...children.props, - className: `${children.props.className || ''} ${cursorClass}`, + className: `${(children.props as React.HTMLProps<HTMLElement>).className ?? ''} ${cursorClass}`, //'data-state': context.open ? 'open' : 'closed', }), ); diff --git a/src/lib/components/layout/Resizable.tsx b/src/lib/components/layout/Resizable.tsx index 762266c05..2dfbe9599 100644 --- a/src/lib/components/layout/Resizable.tsx +++ b/src/lib/components/layout/Resizable.tsx @@ -72,7 +72,7 @@ export const Resizable = ({ } }, [ref.current, windowSize]); - function onMouseDown(e: React.MouseEvent<HTMLDivElement, MouseEvent>) { + function onMouseDown() { setDragging(true); window.addEventListener('mouseup', onMouseUp); } @@ -106,14 +106,14 @@ export const Resizable = ({ } } } - function onTouchStart(e: React.TouchEvent<HTMLDivElement>) { + function onTouchStart() { setDragging(true); } - function onTouchMove(e: React.TouchEvent<HTMLDivElement>) {} - function onTouchEnd(e: React.TouchEvent<HTMLDivElement>) { + function onTouchMove() {} + function onTouchEnd() { setDragging(false); } - function onTouchCancel(e: React.TouchEvent<HTMLDivElement>) { + function onTouchCancel() { setDragging(false); } diff --git a/src/lib/components/layout/dialog.stories.tsx b/src/lib/components/layout/dialog.stories.tsx index c66bee3e6..9736d894e 100644 --- a/src/lib/components/layout/dialog.stories.tsx +++ b/src/lib/components/layout/dialog.stories.tsx @@ -1,9 +1,9 @@ // Dialog.stories.tsx /* eslint-disable react-hooks/rules-of-hooks */ -import React, { useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; -import { Dialog, DialogTrigger, DialogContent, DialogHeading, DialogDescription, DialogClose } from './Dialog'; +import { useState } from 'react'; +import { Dialog, DialogClose, DialogContent, DialogDescription, DialogHeading, DialogTrigger } from './Dialog'; const metaDialog: Meta<typeof Dialog> = { component: Dialog, diff --git a/src/lib/components/layout/index.ts b/src/lib/components/layout/index.ts index e2a065262..d64927efb 100644 --- a/src/lib/components/layout/index.ts +++ b/src/lib/components/layout/index.ts @@ -1,4 +1,4 @@ export * from './Dialog'; +export * from './FrozenOverlay'; export * from './Panel'; export * from './Resizable'; -export * from './FrozenOverlay'; diff --git a/src/lib/components/layout/panel.stories.tsx b/src/lib/components/layout/panel.stories.tsx index 8ccb22c5c..48fcae5eb 100644 --- a/src/lib/components/layout/panel.stories.tsx +++ b/src/lib/components/layout/panel.stories.tsx @@ -1,6 +1,4 @@ // Panel.stories.tsx - -import React from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { Panel } from './Panel'; diff --git a/src/lib/components/layout/popover.stories.tsx b/src/lib/components/layout/popover.stories.tsx index 4580b243c..dad407648 100644 --- a/src/lib/components/layout/popover.stories.tsx +++ b/src/lib/components/layout/popover.stories.tsx @@ -1,10 +1,10 @@ // Popover.stories.tsx /* eslint-disable react-hooks/rules-of-hooks */ -import React, { useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; -import { Popover, PopoverTrigger, PopoverContent, PopoverHeading, PopoverDescription, PopoverClose } from './Popover'; +import { useState } from 'react'; import { Icon } from '../icon'; +import { Popover, PopoverClose, PopoverContent, PopoverDescription, PopoverHeading, PopoverTrigger } from './Popover'; const metaPopover: Meta<typeof Popover> = { component: Popover, title: 'Components/Layout/Popover', diff --git a/src/lib/components/nodeDetails/NodeDetails.stories.tsx b/src/lib/components/nodeDetails/NodeDetails.stories.tsx index 9ebc14c60..a83688634 100644 --- a/src/lib/components/nodeDetails/NodeDetails.stories.tsx +++ b/src/lib/components/nodeDetails/NodeDetails.stories.tsx @@ -1,7 +1,7 @@ -import type { Meta, StoryObj } from '@storybook/react'; import { NodeDetails, NodeDetailsProps } from '@/lib/components/nodeDetails'; import { SchemaPopUp, SchemaPopUpProps } from '@/lib/schema/pills/nodes/SchemaPopUp/SchemaPopUp'; import { NLPopUp, NLPopUpProps } from '@/lib/vis/visualizations/nodelinkvis/components/NLPopup'; +import type { Meta, StoryObj } from '@storybook/react'; const meta: Meta<typeof NodeDetails> = { component: NodeDetails, diff --git a/src/lib/components/pills/Pill.tsx b/src/lib/components/pills/Pill.tsx index be1bab662..511973f6e 100644 --- a/src/lib/components/pills/Pill.tsx +++ b/src/lib/components/pills/Pill.tsx @@ -1,9 +1,9 @@ import React, { useContext, useState } from 'react'; -import { pillWidth, pillHeight, pillXPadding, pillInnerMargin, topLineHeight, pillBorderWidth, pillAttributesPadding } from './pill.const'; import { Position } from 'reactflow'; -import { PillHandle } from './PillHandle'; -import { PillContext } from './PillContext'; import { QueryRelationDirection } from 'ts-common'; +import { pillAttributesPadding, pillBorderWidth, pillHeight, pillInnerMargin, pillWidth, pillXPadding, topLineHeight } from './pill.const'; +import { PillContext } from './PillContext'; +import { PillHandle } from './PillHandle'; export type PillI = { onHovered?: (hovered: boolean) => void; diff --git a/src/lib/components/pills/PillHandle.tsx b/src/lib/components/pills/PillHandle.tsx index ff27a3c29..ea2a0f51e 100644 --- a/src/lib/components/pills/PillHandle.tsx +++ b/src/lib/components/pills/PillHandle.tsx @@ -1,6 +1,6 @@ import React, { useContext, useMemo } from 'react'; import { Position } from 'reactflow'; -import { pillHeight, pillWidth, topLineHeight, pillBorderWidth } from './pill.const'; +import { pillBorderWidth, pillHeight, pillWidth, topLineHeight } from './pill.const'; import { PillContext } from './PillContext'; export const PillHandle = (props: { diff --git a/src/lib/components/pills/stories/pill.stories.tsx b/src/lib/components/pills/stories/pill.stories.tsx index 20c3c21d1..50250c5fe 100644 --- a/src/lib/components/pills/stories/pill.stories.tsx +++ b/src/lib/components/pills/stories/pill.stories.tsx @@ -1,6 +1,5 @@ -import React from 'react'; -import { Meta } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; import { Pill } from '../Pill'; diff --git a/src/lib/components/pills/stories/pillEntity.stories.tsx b/src/lib/components/pills/stories/pillEntity.stories.tsx index 2ee0f8e12..9bca9774f 100644 --- a/src/lib/components/pills/stories/pillEntity.stories.tsx +++ b/src/lib/components/pills/stories/pillEntity.stories.tsx @@ -1,6 +1,5 @@ -import React from 'react'; -import { Meta } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; import { EntityPill } from '../Pill'; diff --git a/src/lib/components/pills/stories/pillLogic.stories.tsx b/src/lib/components/pills/stories/pillLogic.stories.tsx index 5ef1affd2..969cd09d2 100644 --- a/src/lib/components/pills/stories/pillLogic.stories.tsx +++ b/src/lib/components/pills/stories/pillLogic.stories.tsx @@ -1,6 +1,5 @@ -import React from 'react'; -import { Meta } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; import { LogicPill } from '../Pill'; diff --git a/src/lib/components/pills/stories/pillRelation.stories.tsx b/src/lib/components/pills/stories/pillRelation.stories.tsx index 535c07b97..4d84fa314 100644 --- a/src/lib/components/pills/stories/pillRelation.stories.tsx +++ b/src/lib/components/pills/stories/pillRelation.stories.tsx @@ -1,6 +1,5 @@ -import React from 'react'; -import { Meta } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; import { RelationPill } from '../Pill'; diff --git a/src/lib/components/popover/Popover.tsx b/src/lib/components/popover/Popover.tsx index 1fe5c6fdd..e40db1e87 100644 --- a/src/lib/components/popover/Popover.tsx +++ b/src/lib/components/popover/Popover.tsx @@ -1,26 +1,25 @@ -import React, { useEffect } from 'react'; +import { Button, usePopoverGlobalContext } from '@/lib'; +import type { Alignment, Placement } from '@floating-ui/react'; import { - useFloating, + arrow, autoUpdate, - offset, flip, - shift, + FloatingArrow, + FloatingPortal, hide, - arrow, + offset, + shift, useClick, - useHover, - useFocus, useDismiss, - useRole, + useFloating, + useFocus, + useHover, useInteractions, useMergeRefs, - FloatingPortal, - FloatingArrow, + useRole, } from '@floating-ui/react'; -import type { Placement, Alignment } from '@floating-ui/react'; -import { Button } from '@/lib'; +import React, { useEffect } from 'react'; import { v4 as uuidv4 } from 'uuid'; -import { usePopoverGlobalContext } from '@/lib'; export interface PopoverOptions { id?: string; diff --git a/src/lib/components/popover/PopoverProvider.tsx b/src/lib/components/popover/PopoverProvider.tsx index b20952dd7..cc92d65c5 100644 --- a/src/lib/components/popover/PopoverProvider.tsx +++ b/src/lib/components/popover/PopoverProvider.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from 'react'; +import React, { useEffect, useState } from 'react'; interface PopoverGlobalContextProps { openPopover: (id: string) => void; diff --git a/src/lib/components/popover/popover.stories.tsx b/src/lib/components/popover/popover.stories.tsx index 3309a6bd1..de31d7bac 100644 --- a/src/lib/components/popover/popover.stories.tsx +++ b/src/lib/components/popover/popover.stories.tsx @@ -1,6 +1,6 @@ // Popover.stories.tsx +import { Popover, PopoverContent, PopoverProvider, PopoverTrigger } from '@/lib'; import { Meta, StoryObj } from '@storybook/react'; -import { Popover, PopoverTrigger, PopoverContent, PopoverProvider } from '@/lib'; export default { title: 'Components/Popover', @@ -31,14 +31,6 @@ export default { control: 'boolean', description: 'Show a close button on the popover', }, - delayOpen: { - control: 'number', - description: 'Delay (hover/focus trigger only) before the popover opens (ms)', - }, - delayClose: { - control: 'number', - description: 'Delay (hover/focus trigger only) before the popover closes (ms)', - }, id: { control: { disable: true }, description: 'Unique identifier to manage multiple popovers, can be set manually else auto-generated', @@ -56,12 +48,10 @@ export default { description: 'Initial state of the popover', }, children: { table: { disable: true } }, - boundaryElement: { table: { disable: true } }, interactive: { table: { disable: true } }, delay: { table: { disable: true } }, onOpenChange: { table: { disable: true } }, open: { table: { disable: true } }, - initialOpen: { table: { disable: true } }, }, } as Meta<typeof Popover>; @@ -112,8 +102,6 @@ export const Default: Story = { activation: 'click', showArrow: true, showCloseButton: false, - delayOpen: 500, - delayClose: 150, initialOpen: false, }, }; diff --git a/src/lib/components/selectors/entityPillSelector.stories.tsx b/src/lib/components/selectors/entityPillSelector.stories.tsx index 33ef2c2b1..e2c1ea039 100644 --- a/src/lib/components/selectors/entityPillSelector.stories.tsx +++ b/src/lib/components/selectors/entityPillSelector.stories.tsx @@ -1,4 +1,3 @@ -import React, { useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { EntityPillSelector } from './entityPillSelector'; diff --git a/src/lib/components/selectors/entityPillSelector.tsx b/src/lib/components/selectors/entityPillSelector.tsx index 3604dbc8a..efdd47230 100644 --- a/src/lib/components/selectors/entityPillSelector.tsx +++ b/src/lib/components/selectors/entityPillSelector.tsx @@ -1,7 +1,7 @@ -import React, { useState } from 'react'; -import { Button } from '../buttons'; import { EntityPill } from '@/lib/components/pills/Pill'; -import { DropdownContainer, DropdownItemContainer, DropdownTrigger, DropdownItem } from '../dropdowns'; +import { useState } from 'react'; +import { Button } from '../buttons'; +import { DropdownContainer, DropdownItem, DropdownItemContainer, DropdownTrigger } from '../dropdowns'; export type EntityPillSelectorProps = { selectedNode?: string; diff --git a/src/lib/components/selectors/textAndIcon.tsx b/src/lib/components/selectors/textAndIcon.tsx index 90523fd04..8946d573b 100644 --- a/src/lib/components/selectors/textAndIcon.tsx +++ b/src/lib/components/selectors/textAndIcon.tsx @@ -1,6 +1,6 @@ -import React, { useState } from 'react'; -import { DropdownTrigger, DropdownContainer, DropdownItemContainer } from '@/lib/components/dropdowns'; +import { DropdownContainer, DropdownItemContainer, DropdownTrigger } from '@/lib/components/dropdowns'; import { Icon } from '@/lib/components/icon'; +import { useState } from 'react'; type DropdownTextAndIconProps = { value: any; diff --git a/src/lib/components/tableUI/TableUI.stories.tsx b/src/lib/components/tableUI/TableUI.stories.tsx index 07311f9dd..577bcde32 100644 --- a/src/lib/components/tableUI/TableUI.stories.tsx +++ b/src/lib/components/tableUI/TableUI.stories.tsx @@ -1,5 +1,5 @@ -import React, { useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; +import { useState } from 'react'; import { TableUI } from './TableUI'; // Import the TableUI component from the correct path const metaTableUI: Meta<typeof TableUI> = { diff --git a/src/lib/components/tableUI/TableUI.tsx b/src/lib/components/tableUI/TableUI.tsx index 8caf318f9..0675c9e69 100644 --- a/src/lib/components/tableUI/TableUI.tsx +++ b/src/lib/components/tableUI/TableUI.tsx @@ -1,6 +1,6 @@ -import React, { useState } from 'react'; import { Button } from '@/lib/components/buttons'; import { Input } from '@/lib/components/inputs'; +import { useState } from 'react'; interface FieldConfig<T> { key: keyof T; @@ -87,10 +87,11 @@ export const TableUI = <T extends Record<string, any>>({ data, fieldConfigs, dro label="" options={dropdownOptions[field.key.toString()] || []} value={editItem ? editItem[field.key] : ''} - onChange={value => handleInputChange(field.key, value.toString())} + onChange={value => handleInputChange(field.key, value?.toString() ?? '')} /> ) : ( <Input + label="" type="text" size="xs" value={editItem ? editItem[field.key] : ''} diff --git a/src/lib/components/tabs/Tab.tsx b/src/lib/components/tabs/Tab.tsx index b9c1f9fe4..62f6eb5ec 100644 --- a/src/lib/components/tabs/Tab.tsx +++ b/src/lib/components/tabs/Tab.tsx @@ -1,5 +1,5 @@ -import React, { forwardRef } from 'react'; import { ButtonProps } from '@/lib/components/buttons'; +import React, { forwardRef } from 'react'; type TabTypes = 'inline' | 'rounded' | 'simple'; diff --git a/src/lib/components/textEditor/ErrorHandler.tsx b/src/lib/components/textEditor/ErrorHandler.tsx index a05e9c355..96c743d0b 100644 --- a/src/lib/components/textEditor/ErrorHandler.tsx +++ b/src/lib/components/textEditor/ErrorHandler.tsx @@ -1,5 +1,3 @@ -import React from 'react'; - // TODO: remove type any export function ErrorHandler(error: any) { console.error(error); diff --git a/src/lib/components/textEditor/Placeholder.tsx b/src/lib/components/textEditor/Placeholder.tsx index dbe71297b..8e2ba6168 100644 --- a/src/lib/components/textEditor/Placeholder.tsx +++ b/src/lib/components/textEditor/Placeholder.tsx @@ -1,5 +1,3 @@ -import React from 'react'; - export function Placeholder({ placeholder }: { placeholder?: string }) { return placeholder && <div className="absolute inset-0 pointer-events-none flex p-3 text-secondary-400">{placeholder}</div>; } diff --git a/src/lib/components/textEditor/TextEditor.tsx b/src/lib/components/textEditor/TextEditor.tsx index 9aae96b54..0a5a2f151 100644 --- a/src/lib/components/textEditor/TextEditor.tsx +++ b/src/lib/components/textEditor/TextEditor.tsx @@ -1,17 +1,17 @@ -import { useEffect, useRef, useCallback } from 'react'; import { LexicalComposer } from '@lexical/react/LexicalComposer'; -import { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin'; +import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'; import { ContentEditable } from '@lexical/react/LexicalContentEditable'; import { LexicalErrorBoundary } from '@lexical/react/LexicalErrorBoundary'; +import { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin'; import { SerializedEditorState } from 'lexical'; -import { ToolbarPlugin } from './plugins/ToolbarPlugin'; -import { PreviewPlugin } from './plugins/PreviewPlugin'; -import { InsertVariablesPlugin } from './plugins/InsertVariablesPlugin'; +import { useEffect, useRef } from 'react'; import { ErrorHandler } from './ErrorHandler'; import { Placeholder } from './Placeholder'; -import { VariableNode } from './VariableNode'; -import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'; +import { InsertVariablesPlugin } from './plugins/InsertVariablesPlugin'; +import { PreviewPlugin } from './plugins/PreviewPlugin'; import { EditorButtonPlugin } from './plugins/SaveButtonPlugin'; +import { ToolbarPlugin } from './plugins/ToolbarPlugin'; +import { VariableNode } from './VariableNode'; type TextEditorProps = { children: React.ReactNode; diff --git a/src/lib/components/textEditor/VariableNode.tsx b/src/lib/components/textEditor/VariableNode.tsx index bd499248c..231b7d9db 100644 --- a/src/lib/components/textEditor/VariableNode.tsx +++ b/src/lib/components/textEditor/VariableNode.tsx @@ -1,5 +1,6 @@ -import type { NodeKey, LexicalEditor, DOMExportOutput, SerializedLexicalNode, Spread } from 'lexical'; +import type { DOMExportOutput, LexicalEditor, NodeKey, SerializedLexicalNode, Spread } from 'lexical'; import { DecoratorNode, EditorConfig } from 'lexical'; +import { JSX } from 'react'; export enum VariableType { statistic = 'statistic', diff --git a/src/lib/components/textEditor/plugins/InsertVariablesPlugin.tsx b/src/lib/components/textEditor/plugins/InsertVariablesPlugin.tsx index cbcb1e141..eefe6d83e 100644 --- a/src/lib/components/textEditor/plugins/InsertVariablesPlugin.tsx +++ b/src/lib/components/textEditor/plugins/InsertVariablesPlugin.tsx @@ -1,8 +1,8 @@ +import { Input } from '@/lib/components/inputs'; +import { useGraphQueryResult, useVisualization } from '@/lib/data-access'; import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'; import { $getSelection, type BaseSelection } from 'lexical'; -import { Input } from '@/lib/components/inputs'; import { VariableNode, VariableType } from '../VariableNode'; -import { useGraphQueryResult, useVisualization } from '@/lib/data-access'; interface InsertVariablesPluginProps { variableOptions: string[]; diff --git a/src/lib/components/textEditor/plugins/PreviewPlugin.tsx b/src/lib/components/textEditor/plugins/PreviewPlugin.tsx index 98b27a522..4092dba11 100644 --- a/src/lib/components/textEditor/plugins/PreviewPlugin.tsx +++ b/src/lib/components/textEditor/plugins/PreviewPlugin.tsx @@ -1,14 +1,13 @@ -import { JSX, RefObject } from 'react'; -import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'; +import { useGraphQuery, useVisualization } from '@/lib/data-access'; +import { VisualizationSettingsType } from '@/lib/vis/common'; +import { preparePlotData } from '@/lib/vis/visualizations/vis1D/components/MakePlot'; +import { Vis1DProps, getAttributeValues } from '@/lib/vis/visualizations/vis1D/model'; import { $generateHtmlFromNodes } from '@lexical/html'; +import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'; +import { JSX, RefObject } from 'react'; import { VariableType } from '../VariableNode'; -import { useVisualization, useGraphQueryResult } from '@/lib/data-access'; -import { VisualizationSettingsType } from '@/lib/vis/common'; - // @ts-expect-error missing import import { newPlot, toImage } from 'plotly.js/dist/plotly'; -import { Vis1DProps, getAttributeValues } from '@/lib/vis/visualizations/vis1D/model'; -import { preparePlotData } from '@/lib/vis/visualizations/vis1D/components/MakePlot'; export function PreviewPlugin({ contentEditable }: { contentEditable: RefObject<HTMLDivElement | null> }): JSX.Element { const [editor] = useLexicalComposerContext(); @@ -23,7 +22,7 @@ export function PreviewPlugin({ contentEditable }: { contentEditable: RefObject< }); } - const result = useGraphQueryResult(); + const result = useGraphQuery(); /* const getAttributeValues = useCallback( @@ -56,7 +55,7 @@ export function PreviewPlugin({ contentEditable }: { contentEditable: RefObject< switch (type) { case VariableType.statistic: { const [nodeType, feature, statistic] = name.split(' • '); - const node = result.metaData?.nodes.types[nodeType]; + const node = result.graph.metaData?.nodes.types[nodeType]; const attribute = node?.attributes[feature].statistics as any; if (attribute == null) return ''; const value = attribute[statistic]; diff --git a/src/lib/components/textEditor/plugins/SaveButtonPlugin.tsx b/src/lib/components/textEditor/plugins/SaveButtonPlugin.tsx index e87d5f77f..5b611dc00 100644 --- a/src/lib/components/textEditor/plugins/SaveButtonPlugin.tsx +++ b/src/lib/components/textEditor/plugins/SaveButtonPlugin.tsx @@ -1,6 +1,6 @@ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'; -import { Button, ButtonProps } from '../../buttons'; import { SerializedEditorState } from 'lexical'; +import { Button, ButtonProps } from '../../buttons'; export function EditorButtonPlugin( props: { diff --git a/src/lib/components/textEditor/plugins/StateChangePlugin.tsx b/src/lib/components/textEditor/plugins/StateChangePlugin.tsx index bf3f902de..0415dea4c 100644 --- a/src/lib/components/textEditor/plugins/StateChangePlugin.tsx +++ b/src/lib/components/textEditor/plugins/StateChangePlugin.tsx @@ -1,6 +1,6 @@ -import React, { useEffect } from 'react'; import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'; -import { LexicalEditor, EditorState } from 'lexical'; +import { EditorState, LexicalEditor } from 'lexical'; +import { useEffect } from 'react'; export function MyOnChangePlugin({ onChange }: { onChange: (val: EditorState, editor: LexicalEditor) => void }) { const [editor] = useLexicalComposerContext(); diff --git a/src/lib/components/textEditor/plugins/ToolbarPlugin.tsx b/src/lib/components/textEditor/plugins/ToolbarPlugin.tsx index 27a8859bc..f8e5579da 100644 --- a/src/lib/components/textEditor/plugins/ToolbarPlugin.tsx +++ b/src/lib/components/textEditor/plugins/ToolbarPlugin.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'; import { FORMAT_TEXT_COMMAND } from 'lexical'; import { Button } from '../../buttons'; diff --git a/src/lib/components/textEditor/textEditor.stories.tsx b/src/lib/components/textEditor/textEditor.stories.tsx index e4b1a01f8..ec4388bd2 100644 --- a/src/lib/components/textEditor/textEditor.stories.tsx +++ b/src/lib/components/textEditor/textEditor.stories.tsx @@ -1,9 +1,9 @@ -import { useState } from 'react'; +import { configureStore } from '@reduxjs/toolkit'; import type { Meta, StoryObj } from '@storybook/react'; -import { TextEditor } from '.'; import { EditorState } from 'lexical'; +import { useState } from 'react'; import { Provider } from 'react-redux'; -import { configureStore } from '@reduxjs/toolkit'; +import { TextEditor } from '.'; import { graphQueryResultSlice, visualizationSlice } from '../../../lib/data-access/store'; const Mockstore = configureStore({ diff --git a/src/lib/components/tooltip/Tooltip.tsx b/src/lib/components/tooltip/Tooltip.tsx index 5198f6b71..38f29e5cd 100644 --- a/src/lib/components/tooltip/Tooltip.tsx +++ b/src/lib/components/tooltip/Tooltip.tsx @@ -1,24 +1,25 @@ -import * as React from 'react'; +import { useControllableState } from '@/lib/components/primitives/useControllableState'; +import type { Placement } from '@floating-ui/react'; import { - useFloating, + arrow, autoUpdate, - offset, flip, - shift, + FloatingArrow, + FloatingDelayGroup, + FloatingPortal, hide, - arrow, - useHover, - useFocus, + offset, + shift, + useDelayGroup, useDismiss, - useRole, + useFloating, + useFocus, + useHover, useInteractions, useMergeRefs, - FloatingPortal, - FloatingArrow, + useRole, } from '@floating-ui/react'; -import type { Placement } from '@floating-ui/react'; -import { useDelayGroup, FloatingDelayGroup } from '@floating-ui/react'; -import { useControllableState } from '@/lib/components/primitives/useControllableState'; +import * as React from 'react'; interface TooltipOptions { initialOpen?: boolean; diff --git a/src/lib/components/tooltip/tooltip.stories.tsx b/src/lib/components/tooltip/tooltip.stories.tsx index 5b8d63a8b..dd261c4a2 100644 --- a/src/lib/components/tooltip/tooltip.stories.tsx +++ b/src/lib/components/tooltip/tooltip.stories.tsx @@ -1,5 +1,5 @@ +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/lib'; import { Meta, StoryObj } from '@storybook/react'; -import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@/lib'; export default { title: 'Components/Tooltip', @@ -15,7 +15,8 @@ export default { parameters: { docs: { description: { - component: 'The **Tooltip** component provides contextual information when users hover over an element. It supports various customization options, including delay, placement, and arrow display.', + component: + 'The **Tooltip** component provides contextual information when users hover over an element. It supports various customization options, including delay, placement, and arrow display.', }, }, }, diff --git a/src/lib/data-access/api/eventBus.tsx b/src/lib/data-access/api/eventBus.tsx index 48ac34255..f69b48a40 100644 --- a/src/lib/data-access/api/eventBus.tsx +++ b/src/lib/data-access/api/eventBus.tsx @@ -1,64 +1,62 @@ import { - useAuthentication, - useAuthCache, + readInSchemaFromBackend, + resetGraphQueryResults, + useActiveQuery, + useActiveSaveState, useAppDispatch, - useSessionCache, + useAuthCache, + useAuthentication, + useML, useQuerybuilderHash, - readInSchemaFromBackend, + useSessionCache, useVisualization, wsSchemaRequest, - wsSchemaSubscription, wsSchemaStatsRequest, - useML, - useActiveQuery, - useActiveSaveState, - resetGraphQueryResults, + wsSchemaSubscription, } from '@/lib/data-access'; import { Broker, wsQueryCountSubscription, wsQueryErrorSubscription, wsQueryRequest, wsQuerySubscription } from '@/lib/data-access/broker'; -import { addInfo } from '@/lib/data-access/store/configSlice'; +import { addError, addInfo } from '@/lib/data-access/store/configSlice'; import { setMLResult } from '@/lib/data-access/store/mlSlice'; +import { isEqual } from 'lodash-es'; import { useEffect } from 'react'; import { + AbortedError, + GraphQueryTranslationResultMessage, + LinkPredictionInstance, + SaveState, + Schema, + allMLTypes, + wsReturnKey, +} from 'ts-common'; +import { + DatabaseStatus, + nilUUID, wsGetState, + wsGetStateSubscription, wsGetStates, - wsUpdateState, - nilUUID, wsGetStatesSubscription, - wsDeleteStateSubscription, - wsGetStateSubscription, - wsTestSaveStateConnectionSubscription, - DatabaseStatus, wsTestSaveStateConnection, + wsTestSaveStateConnectionSubscription, + wsUpdateState, } from '../broker/wsState'; +import { wsReconnectSubscription, wsUserGetPolicy } from '../broker/wsUser'; +import { authorized, setSessionID } from '../store/authSlice'; +import { abortedBackend, asyncSetNewGraphQueryResult, queryingBackend, setNewGraphQueryCountResult } from '../store/graphQuerySlice'; +import { unSelect } from '../store/interactionSlice'; +import { clearSchema, setSchemaAttributeInformation, setSchemaLoading, setSchemaState } from '../store/schemaSlice'; import { addSaveState, - testedSaveState, - updateSaveStateList, - updateSelectedSaveState, - setFetchingSaveStates, + selectSaveState, setActiveQueryID, + setFetchingSaveStates, setQueryState, setQuerybuilderNodes, - selectSaveState, + testedSaveState, + updateSaveStateList, + updateSelectedSaveState, } from '../store/sessionSlice'; -import { URLParams, getParam, setParam } from './url'; import { VisState, setVisualizationState } from '../store/visualizationSlice'; -import { isEqual } from 'lodash-es'; -import { clearSchema, setSchemaAttributeInformation, setSchemaLoading, setSchemaState } from '../store/schemaSlice'; -import { addError } from '@/lib/data-access/store/configSlice'; -import { unSelect } from '../store/interactionSlice'; -import { wsReconnectSubscription, wsUserGetPolicy } from '../broker/wsUser'; -import { authorized, setSessionID } from '../store/authSlice'; -import { abortedBackend, asyncSetNewGraphQueryResult, queryingBackend, setNewGraphQueryCountResult } from '../store/graphQueryResultSlice'; -import { - SaveState, - allMLTypes, - AbortedError, - LinkPredictionInstance, - GraphQueryTranslationResultMessage, - wsReturnKey, - Schema, -} from 'ts-common'; +import { URLParams, getParam } from './url'; export const EventBus = (props: { onRunQuery: (useCached: boolean) => void; onAuthorized: () => void }) => { const { login } = useAuthentication(); @@ -314,12 +312,6 @@ export const EventBus = (props: { onRunQuery: (useCached: boolean) => void; onAu }), ); - unsubs.push(wsDeleteStateSubscription(data => {})); - - // Broker.instance().subscribe((response: TestDatabaseConnectionResponse) => { - // if (response && response.status === 'success') dispatch(testedSaveState(response.saveStateID)); - // }, 'tested_connection'); - login(); // Setup cleanup @@ -337,7 +329,7 @@ export const EventBus = (props: { onRunQuery: (useCached: boolean) => void; onAu useEffect(() => { if (activeSS && activeSS.id in session.testedSaveState) { console.log('Query State Hash Updated', queryHash, activeSS.id); - wsUpdateState(activeSS, ({ data, status }) => { + wsUpdateState(activeSS, ({ data }) => { // if (status === 'unchanged') { // TODO: check if this is needed, but for now removed so that the query is always sent, solving issue with changing ss // console.log('State unchanged, not updating'); diff --git a/src/lib/data-access/api/index.ts b/src/lib/data-access/api/index.ts index f57cc72bf..3f75bb516 100644 --- a/src/lib/data-access/api/index.ts +++ b/src/lib/data-access/api/index.ts @@ -1,2 +1,2 @@ -export * from '../broker/wsState'; export * from '../broker/wsSchema'; +export * from '../broker/wsState'; diff --git a/src/lib/data-access/broker/broker.tsx b/src/lib/data-access/broker/broker.tsx index 04ae34075..53d0c048d 100644 --- a/src/lib/data-access/broker/broker.tsx +++ b/src/lib/data-access/broker/broker.tsx @@ -5,9 +5,9 @@ */ import { getEnvVariable } from '@/config'; -import { UseIsAuthorizedState } from '../store/authSlice'; import { ResponseCallback, ResponseCallbackParamsData, WsMessageBackend2Frontend, WsMessageBody, wsReturnKeyWithML } from 'ts-common'; import { v4 as uuidv4 } from 'uuid'; +import { UseIsAuthorizedState } from '../store/authSlice'; let keepAlivePing: ReturnType<typeof setInterval>; diff --git a/src/lib/data-access/broker/index.ts b/src/lib/data-access/broker/index.ts index 1ca07b467..cc270a286 100644 --- a/src/lib/data-access/broker/index.ts +++ b/src/lib/data-access/broker/index.ts @@ -1,4 +1,4 @@ export * from './broker'; -export * from './wsState'; export * from './wsQuery'; export * from './wsSchema'; +export * from './wsState'; diff --git a/src/lib/data-access/broker/wsProject.ts b/src/lib/data-access/broker/wsProject.ts index c74de8ee0..441801d51 100644 --- a/src/lib/data-access/broker/wsProject.ts +++ b/src/lib/data-access/broker/wsProject.ts @@ -1,6 +1,6 @@ +import { ResponseCallback, SaveState, WsFrontendCall, wsKeys, wsReturnKey, wsSubKeys } from 'ts-common'; import { ProjectModel, ProjectRequest } from 'ts-common/src/model/webSocket/project'; import { Broker } from './broker'; -import { ResponseCallback, SaveState, WsFrontendCall, wsKeys, wsReturnKey, wsSubKeys } from 'ts-common'; type GetProjectResponse = (data: ProjectModel, status: string) => void; type GetProjectsResponse = (data: ProjectModel[], status: string) => void; diff --git a/src/lib/data-access/broker/wsQuery.ts b/src/lib/data-access/broker/wsQuery.ts index 880ccae4b..0f7f96f20 100644 --- a/src/lib/data-access/broker/wsQuery.ts +++ b/src/lib/data-access/broker/wsQuery.ts @@ -1,7 +1,7 @@ // All database related API calls -import { Broker } from './broker'; import { ML, Query, ResponseCallback, WsFrontendCall, wsKeys, wsReturnKey, wsSubKeys } from 'ts-common'; +import { Broker } from './broker'; export const wsQueryRequest: WsFrontendCall<{ saveStateID: string; diff --git a/src/lib/data-access/broker/wsState.ts b/src/lib/data-access/broker/wsState.ts index 10028798d..78ce63066 100644 --- a/src/lib/data-access/broker/wsState.ts +++ b/src/lib/data-access/broker/wsState.ts @@ -1,4 +1,3 @@ -import { Broker } from './broker'; import { PartialSaveState, ResponseCallback, @@ -10,6 +9,7 @@ import { wsSubKeys, } from 'ts-common'; import { DatabaseInfo, DatabaseType } from 'ts-common/src/model/webSocket/dbConnection'; +import { Broker } from './broker'; export const databaseProtocolMapping: Record<DatabaseType, string[]> = { [DatabaseType.Memgraph]: ['bolt://'], @@ -118,7 +118,7 @@ export const wsUpdateState: WsFrontendCall<SaveState, wsReturnKey.saveState> = ( export const wsTestDatabaseConnection: WsFrontendCall<DatabaseInfo, wsReturnKey.testedConnection> = (dbConnection, callback) => { if (!dbConnection) { console.warn('dbConnection is undefined on wsTestDatabaseConnection'); - if (callback) callback({ data: { status: 'fail', saveStateID: '' }, status: 'error', defaultCallback: () => {} }); + if (callback) callback({ data: { status: 'fail', saveStateID: '' }, status: 'error', defaultCallback: () => {}, callID: '-' }); return; } Broker.instance().sendMessage( diff --git a/src/lib/data-access/security/dashboardAlerts.tsx b/src/lib/data-access/security/dashboardAlerts.tsx index 1cb3a88e7..5d9f0f8be 100644 --- a/src/lib/data-access/security/dashboardAlerts.tsx +++ b/src/lib/data-access/security/dashboardAlerts.tsx @@ -1,8 +1,8 @@ -import React, { ReactNode, useEffect, useImperativeHandle, useRef } from 'react'; +import { ReactNode, useEffect, useImperativeHandle, useRef } from 'react'; import { useImmer } from 'use-immer'; +import { Icon } from '../../components'; import { useAppDispatch, useConfig } from '../store'; import { removeLastError, removeLastInfo, removeLastSuccess, removeLastWarning } from '../store/configSlice'; -import { Icon } from '../../components'; type Message = { message: ReactNode; diff --git a/src/lib/data-access/security/useAuthentication.tsx b/src/lib/data-access/security/useAuthentication.tsx index d5abb6015..d6c5805bb 100644 --- a/src/lib/data-access/security/useAuthentication.tsx +++ b/src/lib/data-access/security/useAuthentication.tsx @@ -1,10 +1,9 @@ import { getEnvVariable } from '@/config'; -import { useAppDispatch, useSessionCache } from '../store'; -import { authenticated } from '../store/authSlice'; -import { addInfo, addError } from '../store/configSlice'; import { wsShareSaveState } from '../api'; import { getParam, URLParams } from '../api/url'; -import { UserAuthenticationHeader } from 'ts-common'; +import { useAppDispatch, useSessionCache } from '../store'; +import { authenticated } from '../store/authSlice'; +import { addError, addInfo } from '../store/configSlice'; const domain = getEnvVariable('BACKEND_URL'); const userURI = getEnvVariable('BACKEND_USER'); @@ -76,23 +75,23 @@ export const useAuthentication = () => { }, ], }, - async data => { + ({ data }) => { if (!data) { dispatch(addError('Failed to share link')); resolve(false); } else { // Authorization done, now just copy the link const shareUrl = window.location.href; - const copied = await copyToClipboard(shareUrl); - - if (copied) { - dispatch(addInfo('Link copied to clipboard!')); - resolve(true); - } else { - console.warn('Failed to copy link to clipboard'); - dispatch(addError('Failed to copy link to clipboard')); - resolve(false); - } + copyToClipboard(shareUrl).then(copied => { + if (copied) { + dispatch(addInfo('Link copied to clipboard!')); + resolve(true); + } else { + console.warn('Failed to copy link to clipboard'); + dispatch(addError('Failed to copy link to clipboard')); + resolve(false); + } + }); } }, ); diff --git a/src/lib/data-access/store/authSlice.ts b/src/lib/data-access/store/authSlice.ts index e9051c434..4cb543ea8 100644 --- a/src/lib/data-access/store/authSlice.ts +++ b/src/lib/data-access/store/authSlice.ts @@ -1,7 +1,7 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; -import type { RootState } from './store'; import { cloneDeep } from 'lodash-es'; import { UserAuthorizationHeaders } from 'ts-common'; +import type { RootState } from './store'; export const UserAuthorizationHeadersDefaults: UserAuthorizationHeaders = { savestate: { diff --git a/src/lib/data-access/store/authorizationResourcesSlice.ts b/src/lib/data-access/store/authorizationResourcesSlice.ts index c5e757c9a..1b68bc031 100644 --- a/src/lib/data-access/store/authorizationResourcesSlice.ts +++ b/src/lib/data-access/store/authorizationResourcesSlice.ts @@ -1,6 +1,6 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; -import type { RootState } from './store'; import { PolicyResourcesState } from 'ts-common'; +import type { RootState } from './store'; //TODO !FIXME: add middleware to fetch resources from backend const initialState: PolicyResourcesState = { diff --git a/src/lib/data-access/store/authorizationUsersSlice.ts b/src/lib/data-access/store/authorizationUsersSlice.ts index 3e7f72ed1..014240c05 100644 --- a/src/lib/data-access/store/authorizationUsersSlice.ts +++ b/src/lib/data-access/store/authorizationUsersSlice.ts @@ -1,6 +1,6 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; -import type { RootState } from './store'; import { UserPolicy } from 'ts-common'; +import type { RootState } from './store'; export interface PolicyUsersState { users: UserPolicy[]; diff --git a/src/lib/data-access/store/graphQueryResultSlice.ts b/src/lib/data-access/store/graphQuerySlice.ts similarity index 96% rename from src/lib/data-access/store/graphQueryResultSlice.ts rename to src/lib/data-access/store/graphQuerySlice.ts index fb04f9948..7fadc07b7 100755 --- a/src/lib/data-access/store/graphQueryResultSlice.ts +++ b/src/lib/data-access/store/graphQuerySlice.ts @@ -1,6 +1,6 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; -import type { AppDispatch, RootState } from './store'; import { GraphQueryCountResultFromBackend, GraphQueryResultMetaFromBackend, NodeAttributes, QueryStatusResult } from 'ts-common'; +import type { AppDispatch, RootState } from './store'; export type UniqueEdge = { attributes: NodeAttributes; source: string; @@ -132,11 +132,11 @@ export const asyncSetNewGraphQueryResult = async ( }; // Other code such as selectors can use the imported `RootState` type -export const selectGraphQuery = (state: RootState) => state.graphQueryResult; -export const selectGraphQueryResult = (state: RootState) => state.graphQueryResult.graph; -export const selectGraphQueryResultNodes = (state: RootState) => state.graphQueryResult.graph.nodes; -export const selectGraphQueryResultLinks = (state: RootState) => state.graphQueryResult.graph.edges; -export const selectGraphQueryResultMetaData = (state: RootState) => state.graphQueryResult.graph.metaData; -export const selectGraphQueryCounts = (state: RootState) => state.graphQueryResult.graphCounts; +export const selectGraphQuery = (state: RootState) => state.graphQuery; +export const selectGraphQueryResult = (state: RootState) => state.graphQuery.graph; +export const selectGraphQueryResultNodes = (state: RootState) => state.graphQuery.graph.nodes; +export const selectGraphQueryResultLinks = (state: RootState) => state.graphQuery.graph.edges; +export const selectGraphQueryResultMetaData = (state: RootState) => state.graphQuery.graph.metaData; +export const selectGraphQueryCounts = (state: RootState) => state.graphQuery.graphCounts; export default graphQueryResultSlice.reducer; diff --git a/src/lib/data-access/store/hooks.ts b/src/lib/data-access/store/hooks.ts index 7c5f7b80f..e9fd8d796 100644 --- a/src/lib/data-access/store/hooks.ts +++ b/src/lib/data-access/store/hooks.ts @@ -1,3 +1,4 @@ +import { ConfigStateI, configState } from '@/lib/data-access/store/configSlice'; import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'; import { GraphQueryResult, @@ -5,46 +6,43 @@ import { selectGraphQueryCounts, selectGraphQueryResult, selectGraphQueryResultMetaData, -} from './graphQueryResultSlice'; -import { schemaGraph, selectSchemaLayout, schemaSettingsState, schemaStatsState, SchemaSliceI, schema } from './schemaSlice'; -import type { RootState, AppDispatch } from './store'; -import { ConfigStateI, configState } from '@/lib/data-access/store/configSlice'; +} from './graphQuerySlice'; +import { SchemaSliceI, schema, schemaGraph, schemaSettingsState, schemaStatsState, selectSchemaLayout } from './schemaSlice'; +import type { AppDispatch, RootState } from './store'; -import { activeSaveState, activeSaveStateQuery, selectQuerybuilderHash, SessionCacheI, sessionCacheState } from './sessionSlice'; -import { AuthSliceState, authState } from './authSlice'; -import { visualizationState, VisState, visualizationActive } from './visualizationSlice'; -import { allMLEnabled, selectML } from './mlSlice'; -import { - searchResultState, - searchResultData, - searchResultSchema, - searchResultQB, - recentSearches, - SearchCategoryMapI, - CategoryDataI, -} from './searchResultSlice'; -import { SchemaGraph } from '../../schema'; -import { SelectionStateI, FocusStateI, focusState, selectionState } from './interactionSlice'; -import { VisualizationSettingsType } from '../../vis/common'; -import { PolicyUsersState, selectPolicyState } from './authorizationUsersSlice'; -import { selectResourcesPolicyState } from './authorizationResourcesSlice'; -import { selectInsights } from './insightSharingSlice'; import { - PolicyResourcesState, + GraphQueryCountResultFromBackend, + GraphQueryResultMetaFromBackend, + GraphStatistics, InsightModel, ML, - GraphStatistics, - SaveState, - SaveStateAuthorizationHeaders, + PolicyResourcesState, Query, - SchemaSettings, - SchemaGraphStats, SaveStateWithAuthorization, - GraphQueryResultMetaFromBackend, - GraphQueryCountResultFromBackend, + SchemaGraphStats, + SchemaSettings, } from 'ts-common'; -import { ProjectState, selectProject } from './projectSlice'; import { AllLayoutAlgorithms } from 'ts-common/src/model/layouts'; +import { SchemaGraph } from '../../schema'; +import { VisualizationSettingsType } from '../../vis/common'; +import { selectResourcesPolicyState } from './authorizationResourcesSlice'; +import { PolicyUsersState, selectPolicyState } from './authorizationUsersSlice'; +import { AuthSliceState, authState } from './authSlice'; +import { selectInsights } from './insightSharingSlice'; +import { FocusStateI, SelectionStateI, focusState, selectionState } from './interactionSlice'; +import { allMLEnabled, selectML } from './mlSlice'; +import { ProjectState, selectProject } from './projectSlice'; +import { + CategoryDataI, + SearchCategoryMapI, + recentSearches, + searchResultData, + searchResultQB, + searchResultSchema, + searchResultState, +} from './searchResultSlice'; +import { SessionCacheI, activeSaveState, activeSaveStateQuery, selectQuerybuilderHash, sessionCacheState } from './sessionSlice'; +import { VisState, visualizationActive, visualizationState } from './visualizationSlice'; // Use throughout your app instead of plain `useDispatch` and `useSelector` export const useAppDispatch: () => AppDispatch = useDispatch; diff --git a/src/lib/data-access/store/index.ts b/src/lib/data-access/store/index.ts index aaca74348..20d869b88 100644 --- a/src/lib/data-access/store/index.ts +++ b/src/lib/data-access/store/index.ts @@ -1,8 +1,8 @@ -export * from './store'; export * from './hooks'; +export * from './store'; -export { setSchema, readInSchemaFromBackend, schemaSlice, selectSchemaLayout } from './schemaSlice'; +export * from './graphQuerySlice'; export { mlSlice } from './mlSlice'; +export { readInSchemaFromBackend, schemaSlice, selectSchemaLayout, setSchema } from './schemaSlice'; export { searchResultSlice } from './searchResultSlice'; export { visualizationSlice } from './visualizationSlice'; -export * from './graphQueryResultSlice'; diff --git a/src/lib/data-access/store/insightSharingSlice.ts b/src/lib/data-access/store/insightSharingSlice.ts index b8ab09bc7..2033e508a 100644 --- a/src/lib/data-access/store/insightSharingSlice.ts +++ b/src/lib/data-access/store/insightSharingSlice.ts @@ -1,6 +1,6 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; -import { RootState } from '../store'; import { InsightModel } from 'ts-common'; +import { RootState } from '../store'; type InsightState = { insights: InsightModel[]; diff --git a/src/lib/data-access/store/interactionSlice.ts b/src/lib/data-access/store/interactionSlice.ts index 43e1b56b2..4a7c1dfb9 100644 --- a/src/lib/data-access/store/interactionSlice.ts +++ b/src/lib/data-access/store/interactionSlice.ts @@ -1,6 +1,6 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { EdgeQueryResult, NodeQueryResult } from 'ts-common'; import type { RootState } from './store'; -import { NodeQueryResult, EdgeQueryResult } from 'ts-common'; export type HoverStateI = { [id: string]: any }; diff --git a/src/lib/data-access/store/mlSlice.ts b/src/lib/data-access/store/mlSlice.ts index 47761ecf4..96715d3f1 100644 --- a/src/lib/data-access/store/mlSlice.ts +++ b/src/lib/data-access/store/mlSlice.ts @@ -1,6 +1,6 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; -import type { RootState } from './store'; import { ML, MLTypes } from 'ts-common'; +import type { RootState } from './store'; /**************************************************************** */ diff --git a/src/lib/data-access/store/projectSlice.ts b/src/lib/data-access/store/projectSlice.ts index efbf972ad..1d5bea403 100644 --- a/src/lib/data-access/store/projectSlice.ts +++ b/src/lib/data-access/store/projectSlice.ts @@ -1,6 +1,6 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; -import { RootState } from './store'; import { ProjectModel } from 'ts-common/src/model/webSocket/project'; +import { RootState } from './store'; export interface ProjectState { projects: { [id: number]: ProjectModel }; diff --git a/src/lib/data-access/store/schemaSlice.spec.ts b/src/lib/data-access/store/schemaSlice.spec.ts index 7d37c3860..192b6a28e 100644 --- a/src/lib/data-access/store/schemaSlice.spec.ts +++ b/src/lib/data-access/store/schemaSlice.spec.ts @@ -1,5 +1,5 @@ import { MultiGraph } from 'graphology'; -import { assert, describe, expect, it } from 'vitest'; +import { describe, expect, it } from 'vitest'; describe('SchemaSlice Tests', () => { it('should make a graphology graph', () => { diff --git a/src/lib/data-access/store/schemaSlice.ts b/src/lib/data-access/store/schemaSlice.ts index 1d194f6d2..b96e94886 100644 --- a/src/lib/data-access/store/schemaSlice.ts +++ b/src/lib/data-access/store/schemaSlice.ts @@ -1,10 +1,10 @@ import { Layouts } from '@/lib/graph-layout'; -import { createSlice, PayloadAction } from '@reduxjs/toolkit'; -import { SchemaUtils } from '../../schema/schema-utils'; -import type { RootState } from './store'; import { SchemaGraph, SchemaGraphology } from '@/lib/schema'; +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { Schema, SchemaGraphStats, SchemaReturnFormat, SchemaSettings } from 'ts-common'; +import { SchemaUtils } from '../../schema/schema-utils'; import { wsUpdateSchemaSettings } from '../api'; +import type { RootState } from './store'; /**************************************************************** */ diff --git a/src/lib/data-access/store/sessionSlice.ts b/src/lib/data-access/store/sessionSlice.ts index 23b894c98..e6247f734 100644 --- a/src/lib/data-access/store/sessionSlice.ts +++ b/src/lib/data-access/store/sessionSlice.ts @@ -1,10 +1,9 @@ +import { QueryMultiGraphology } from '@/lib/querybuilder'; import { createSlice, PayloadAction } from '@reduxjs/toolkit'; -import type { RootState } from './store'; -import { DatabaseStatus } from '../broker/wsState'; -import { getParam, setParam, URLParams } from '../api/url'; -import { cloneDeep, isEqual } from 'lodash-es'; +import { MultiGraph } from 'graphology'; +import { isEqual } from 'lodash-es'; +import objectHash from 'object-hash'; import { - CountQueryResultFromBackend, defaultGraph, Query, QueryBuilderSettings, @@ -12,14 +11,13 @@ import { QueryMultiGraph, QueryState, QueryUnionType, - SaveState, SaveStateAuthorizationHeaders, SaveStateWithAuthorization, } from 'ts-common'; -import { QueryMultiGraphology } from '@/lib/querybuilder'; -import { MultiGraph } from 'graphology'; -import objectHash from 'object-hash'; +import { getParam, setParam, URLParams } from '../api/url'; import { wsUpdateQueryOrder } from '../broker/wsQuery'; +import { DatabaseStatus } from '../broker/wsState'; +import type { RootState } from './store'; /** Message format of the error message from the backend */ export type ErrorMessage = { diff --git a/src/lib/data-access/store/store.spec.ts b/src/lib/data-access/store/store.spec.ts index 3346fd37d..3e78912e1 100644 --- a/src/lib/data-access/store/store.spec.ts +++ b/src/lib/data-access/store/store.spec.ts @@ -1,4 +1,4 @@ -import { assert, describe, expect, it } from 'vitest'; +import { describe, expect, it } from 'vitest'; describe('sharedDataAccessStore', () => { it('should work', () => { diff --git a/src/lib/data-access/store/store.ts b/src/lib/data-access/store/store.ts index 383de67f8..ed5a513aa 100644 --- a/src/lib/data-access/store/store.ts +++ b/src/lib/data-access/store/store.ts @@ -1,21 +1,21 @@ import { configureStore } from '@reduxjs/toolkit'; -import graphQueryResultSlice from './graphQueryResultSlice'; -import schemaSlice from './schemaSlice'; -import configSlice from './configSlice'; -import sessionSlice from './sessionSlice'; +import policyPermissionSlice from './authorizationResourcesSlice'; +import policyUsersSlice from './authorizationUsersSlice'; import authSlice from './authSlice'; +import configSlice from './configSlice'; +import graphQuerySlice from './graphQuerySlice'; +import insightSharingSlice from './insightSharingSlice'; +import interactionSlice from './interactionSlice'; import mlSlice from './mlSlice'; +import projectSlice from './projectSlice'; +import schemaSlice from './schemaSlice'; import searchResultSlice from './searchResultSlice'; +import sessionSlice from './sessionSlice'; import visualizationSlice from './visualizationSlice'; -import interactionSlice from './interactionSlice'; -import policyUsersSlice from './authorizationUsersSlice'; -import policyPermissionSlice from './authorizationResourcesSlice'; -import insightSharingSlice from './insightSharingSlice'; -import projectSlice from './projectSlice'; export const store = configureStore({ reducer: { - graphQueryResult: graphQueryResultSlice, + graphQuery: graphQuerySlice, schema: schemaSlice, sessionCache: sessionSlice, auth: authSlice, diff --git a/src/lib/data-access/store/visualizationSlice.ts b/src/lib/data-access/store/visualizationSlice.ts index 4bcb31f44..7838937e7 100644 --- a/src/lib/data-access/store/visualizationSlice.ts +++ b/src/lib/data-access/store/visualizationSlice.ts @@ -1,8 +1,8 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; -import type { RootState } from './store'; -import { VisualizationSettingsType } from '../../vis/common'; import { isEqual } from 'lodash-es'; import { v4 as uuidv4 } from 'uuid'; +import { VisualizationSettingsType } from '../../vis/common'; +import type { RootState } from './store'; export type VisStateSettings = VisualizationSettingsType[]; export type VisState = { diff --git a/src/lib/graph-layout/cytoscapeLayouts.ts b/src/lib/graph-layout/cytoscapeLayouts.ts index a1873c202..d52062333 100644 --- a/src/lib/graph-layout/cytoscapeLayouts.ts +++ b/src/lib/graph-layout/cytoscapeLayouts.ts @@ -1,10 +1,10 @@ import cytoscape from 'cytoscape'; import Graph from 'graphology'; import { Attributes } from 'graphology-types'; +import { CytoscapeLayoutAlgorithms } from 'ts-common/src/model/layouts'; import { Layout } from './layout'; import { ILayoutFactory } from './layoutCreatorUsecase'; import { LayoutAlgorithm } from './types'; -import { CytoscapeLayoutAlgorithms } from 'ts-common/src/model/layouts'; export type CytoscapeProvider = 'Cytoscape'; diff --git a/src/lib/graph-layout/dagreLayout.ts b/src/lib/graph-layout/dagreLayout.ts index 4e1738f62..d15840d9b 100644 --- a/src/lib/graph-layout/dagreLayout.ts +++ b/src/lib/graph-layout/dagreLayout.ts @@ -1,8 +1,8 @@ import Graph from 'graphology'; import { Attributes } from 'graphology-types'; +import { DagreLayoutAlgorithms } from 'ts-common/src/model/layouts'; import { Layout } from './layout'; import { ILayoutFactory } from './layoutCreatorUsecase'; -import { DagreLayoutAlgorithms } from 'ts-common/src/model/layouts'; export type DagreProvider = 'Dagre'; diff --git a/src/lib/graph-layout/graphology.spec.ts b/src/lib/graph-layout/graphology.spec.ts index c7707747b..f987d7edb 100644 --- a/src/lib/graph-layout/graphology.spec.ts +++ b/src/lib/graph-layout/graphology.spec.ts @@ -1,6 +1,5 @@ -import Graph, { UndirectedGraph } from 'graphology'; import { MultiGraph } from 'graphology'; -import { assert, describe, expect, it } from 'vitest'; +import { describe, expect, it } from 'vitest'; describe('graphology connection', () => { it('should create a graphology graph', () => { diff --git a/src/lib/graph-layout/graphologyLayouts.ts b/src/lib/graph-layout/graphologyLayouts.ts index 0039f82b9..8867f29ee 100644 --- a/src/lib/graph-layout/graphologyLayouts.ts +++ b/src/lib/graph-layout/graphologyLayouts.ts @@ -4,10 +4,10 @@ import forceAtlas2, { ForceAtlas2Settings } from 'graphology-layout-forceatlas2' import FA2Layout from 'graphology-layout-forceatlas2/worker'; import noverlap from 'graphology-layout-noverlap'; import { Attributes } from 'graphology-types'; +import { GraphologyLayoutAlgorithms } from 'ts-common/src/model/layouts'; import { Layout } from './layout'; import { ILayoutFactory } from './layoutCreatorUsecase'; import { LayoutAlgorithm } from './types'; -import { GraphologyLayoutAlgorithms } from 'ts-common/src/model/layouts'; export type GraphologyProvider = 'Graphology'; diff --git a/src/lib/graph-layout/index.ts b/src/lib/graph-layout/index.ts index 026bf8653..0ef5b7625 100644 --- a/src/lib/graph-layout/index.ts +++ b/src/lib/graph-layout/index.ts @@ -1,5 +1,5 @@ -export * from './types'; -export * from './layout'; -export * from './graphologyLayouts'; export * from './cytoscapeLayouts'; +export * from './graphologyLayouts'; +export * from './layout'; export * from './layoutCreatorUsecase'; +export * from './types'; diff --git a/src/lib/graph-layout/layout.ts b/src/lib/graph-layout/layout.ts index dd0301d58..0f9cdf371 100644 --- a/src/lib/graph-layout/layout.ts +++ b/src/lib/graph-layout/layout.ts @@ -1,6 +1,6 @@ /* eslint-disable no-prototype-builtins */ import Graph from 'graphology'; -import { Providers, LayoutAlgorithm } from './types'; +import { LayoutAlgorithm, Providers } from './types'; export abstract class Layout<provider extends Providers> { protected graph: Graph | null = null; diff --git a/src/lib/graph-layout/layoutCreatorUsecase.spec.ts b/src/lib/graph-layout/layoutCreatorUsecase.spec.ts index 97c520f63..6934ce628 100644 --- a/src/lib/graph-layout/layoutCreatorUsecase.spec.ts +++ b/src/lib/graph-layout/layoutCreatorUsecase.spec.ts @@ -1,4 +1,4 @@ -import { assert, describe, expect, it, test } from 'vitest'; +import { describe, it } from 'vitest'; // import 'vitest-canvas-mock'; describe('LayoutFactory Graphology Libraries', () => { diff --git a/src/lib/graph-layout/layoutCreatorUsecase.ts b/src/lib/graph-layout/layoutCreatorUsecase.ts index 36128f63c..3fab72168 100644 --- a/src/lib/graph-layout/layoutCreatorUsecase.ts +++ b/src/lib/graph-layout/layoutCreatorUsecase.ts @@ -1,11 +1,11 @@ import { AllLayoutAlgorithms, - GraphologyLayoutAlgorithms, CytoscapeLayoutAlgorithms, + GraphologyLayoutAlgorithms, ListLayoutAlgorithms, } from 'ts-common/src/model/layouts'; import { CytoscapeFactory } from './cytoscapeLayouts'; -import { DagreFactory, DagreLayouts } from './dagreLayout'; +import { DagreFactory } from './dagreLayout'; import { GraphologyFactory } from './graphologyLayouts'; import { ListLayoutFactory } from './listLayouts'; import { AlgorithmToLayoutProvider } from './types'; diff --git a/src/lib/graph-layout/listLayouts.ts b/src/lib/graph-layout/listLayouts.ts index 65abeaafb..bbca151fa 100644 --- a/src/lib/graph-layout/listLayouts.ts +++ b/src/lib/graph-layout/listLayouts.ts @@ -1,9 +1,9 @@ import Graph from 'graphology'; import { Attributes } from 'graphology-types'; +import { ListLayoutAlgorithms } from 'ts-common/src/model/layouts'; import { Layout } from './layout'; import { ILayoutFactory } from './layoutCreatorUsecase'; import { LayoutAlgorithm } from './types'; -import { ListLayoutAlgorithms } from 'ts-common/src/model/layouts'; export type ListLayoutProvider = 'ListLayout'; diff --git a/src/lib/graph-layout/mockdataLayout.spec.ts b/src/lib/graph-layout/mockdataLayout.spec.ts index d8a1bd890..5f7866824 100644 --- a/src/lib/graph-layout/mockdataLayout.spec.ts +++ b/src/lib/graph-layout/mockdataLayout.spec.ts @@ -1,4 +1,4 @@ -import { assert, describe, expect, it } from 'vitest'; +import { expect, it } from 'vitest'; // import { // movieSchema, diff --git a/src/lib/index.ts b/src/lib/index.ts index eae28d420..db08aa2fd 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -1,7 +1,7 @@ export * from './components'; export * from './data-access'; export * from './graph-layout'; +export * from './inspector'; export * from './querybuilder'; export * from './schema'; export * from './vis'; -export * from './inspector'; diff --git a/src/lib/insight-sharing/FormInsight.tsx b/src/lib/insight-sharing/FormInsight.tsx index b71320d82..7c35ddedf 100644 --- a/src/lib/insight-sharing/FormInsight.tsx +++ b/src/lib/insight-sharing/FormInsight.tsx @@ -1,10 +1,10 @@ -import { useEffect, useState } from 'react'; -import { TextEditor } from '@/lib/components/textEditor'; -import { useAppDispatch, useSessionCache, useActiveSaveState } from '@/lib/data-access'; import { Button, Input } from '@/lib/components'; +import { TextEditor } from '@/lib/components/textEditor'; +import { useActiveSaveState, useAppDispatch, useSessionCache } from '@/lib/data-access'; import { addError } from '@/lib/data-access/store/configSlice'; import { SerializedEditorState } from 'lexical'; -import { InsightModel, InsightConditionMapReverse, InsightConditionMap } from 'ts-common'; +import { useEffect, useState } from 'react'; +import { InsightConditionMap, InsightConditionMapReverse, InsightModel } from 'ts-common'; type Props = { insight: InsightModel; diff --git a/src/lib/insight-sharing/InsightDialog.tsx b/src/lib/insight-sharing/InsightDialog.tsx index 0b5dbeb1c..cbb6870f8 100644 --- a/src/lib/insight-sharing/InsightDialog.tsx +++ b/src/lib/insight-sharing/InsightDialog.tsx @@ -1,14 +1,14 @@ -import React, { useMemo, useState } from 'react'; +import { useMemo, useState } from 'react'; +import { InsightModel, InsightRequest } from 'ts-common'; +import { useAppDispatch, useInsights } from '..'; import { Dialog, DialogContent } from '../components'; -import { MonitorType, Sidebar } from './components/Sidebar'; +import { wsCreateInsight, wsDeleteInsight, wsUpdateInsight } from '../data-access/broker/wsInsightSharing'; +import { addError, addSuccess } from '../data-access/store/configSlice'; +import { addInsight, deleteInsight, updateInsight } from '../data-access/store/insightSharingSlice'; import { AddItem } from './components/AddItem'; -import { useAppDispatch, useInsights } from '..'; +import { MonitorType, Sidebar } from './components/Sidebar'; import { StartScreen } from './components/StartScreen'; import { FormInsight } from './FormInsight'; -import { wsCreateInsight, wsDeleteInsight, wsUpdateInsight } from '../data-access/broker/wsInsightSharing'; -import { addInsight, deleteInsight, updateInsight } from '../data-access/store/insightSharingSlice'; -import { addSuccess, addError } from '../data-access/store/configSlice'; -import { InsightModel, InsightRequest } from 'ts-common'; type Props = { open: boolean; diff --git a/src/lib/insight-sharing/components/AddItem.tsx b/src/lib/insight-sharing/components/AddItem.tsx index d59b11662..698fe243f 100644 --- a/src/lib/insight-sharing/components/AddItem.tsx +++ b/src/lib/insight-sharing/components/AddItem.tsx @@ -1,11 +1,11 @@ -import React, { useState } from 'react'; -import { Input, Button } from '../../components'; -import { MonitorType as InsightType, MonitorType } from './Sidebar'; -import { useAppDispatch, useSessionCache } from '../../data-access'; -import { addInsight } from '../../data-access/store/insightSharingSlice'; -import { wsCreateInsight } from '../../data-access/broker/wsInsightSharing'; import { addError, addSuccess } from '@/lib/data-access/store/configSlice'; +import { useState } from 'react'; import { InsightRequest } from 'ts-common'; +import { Button, Input } from '../../components'; +import { useAppDispatch, useSessionCache } from '../../data-access'; +import { wsCreateInsight } from '../../data-access/broker/wsInsightSharing'; +import { addInsight } from '../../data-access/store/insightSharingSlice'; +import { MonitorType as InsightType, MonitorType } from './Sidebar'; type Props = { setAdding: (val: false | MonitorType) => void; @@ -41,7 +41,7 @@ export function AddItem(props: Props) { alarmMode: 'disabled', }; - wsCreateInsight(newInsight, (data: any, status: string) => { + wsCreateInsight(newInsight, ({ data, status }) => { if (status === 'success') { dispatch(addInsight(data)); props.setActive(data.id); diff --git a/src/lib/insight-sharing/components/Sidebar.tsx b/src/lib/insight-sharing/components/Sidebar.tsx index 3cdefb473..786581376 100644 --- a/src/lib/insight-sharing/components/Sidebar.tsx +++ b/src/lib/insight-sharing/components/Sidebar.tsx @@ -1,11 +1,10 @@ -import React, { useEffect } from 'react'; +import { addError } from '@/lib/data-access/store/configSlice'; +import { useEffect } from 'react'; import { Button } from '../../components'; import { Accordion, AccordionBody, AccordionHead, AccordionItem } from '../../components/accordion'; -import { useAppDispatch, useInsights } from '../../data-access'; -import { setInsights } from '../../data-access/store/insightSharingSlice'; -import { useSessionCache } from '../../data-access'; +import { useAppDispatch, useInsights, useSessionCache } from '../../data-access'; import { wsGetInsights } from '../../data-access/broker/wsInsightSharing'; -import { addError } from '@/lib/data-access/store/configSlice'; +import { setInsights } from '../../data-access/store/insightSharingSlice'; export type MonitorType = 'report' | 'alert'; diff --git a/src/lib/insight-sharing/components/StartScreen.tsx b/src/lib/insight-sharing/components/StartScreen.tsx index 377ad49d9..49a22745e 100644 --- a/src/lib/insight-sharing/components/StartScreen.tsx +++ b/src/lib/insight-sharing/components/StartScreen.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { Button, Icon } from '../../components'; import { MonitorType } from './Sidebar'; diff --git a/src/lib/inspector/InspectorPanel.tsx b/src/lib/inspector/InspectorPanel.tsx index 1e09c93ec..363c79dcc 100644 --- a/src/lib/inspector/InspectorPanel.tsx +++ b/src/lib/inspector/InspectorPanel.tsx @@ -1,10 +1,10 @@ -import React, { useMemo } from 'react'; -import { Button, Panel } from '../components'; +import { Tab, Tabs } from '@/lib/components/tabs'; import { useFocus, useSelection } from '@/lib/data-access'; import { resultSetFocus } from '@/lib/data-access/store/interactionSlice'; -import { useDispatch } from 'react-redux'; -import { Tab, Tabs } from '@/lib/components/tabs'; import { VisualizationSettings } from '@/lib/vis/components/config/VisualizationSettings'; +import { useMemo } from 'react'; +import { useDispatch } from 'react-redux'; +import { Button, Panel } from '../components'; import ResultInspector from './ResultInspector'; export function InspectorPanel() { diff --git a/src/lib/inspector/ResultInspector.tsx b/src/lib/inspector/ResultInspector.tsx index d9154b294..16f87ec77 100644 --- a/src/lib/inspector/ResultInspector.tsx +++ b/src/lib/inspector/ResultInspector.tsx @@ -1,8 +1,8 @@ -import React, { useEffect, useRef } from 'react'; -import { select, scaleLinear } from 'd3'; +import { visualizationColors } from '@/config'; import { useAppDispatch, useGraphQueryResult, useGraphQueryResultMeta, useSelection } from '@/lib/data-access'; import { resultSetSelection } from '@/lib/data-access/store/interactionSlice'; -import { visualizationColors } from '@/config'; +import { scaleLinear, select } from 'd3'; +import React, { useEffect, useRef } from 'react'; import { SelectionConfig } from './SelectionConfig'; export default function ResultInspector() { diff --git a/src/lib/inspector/SelectionConfig.tsx b/src/lib/inspector/SelectionConfig.tsx index 69af0d64f..938946ef8 100644 --- a/src/lib/inspector/SelectionConfig.tsx +++ b/src/lib/inspector/SelectionConfig.tsx @@ -1,8 +1,8 @@ +import { ATTRIBUTE_MAX_CHARACTERS } from '@/config'; +import { unSelect } from '@/lib/data-access/store/interactionSlice'; import React from 'react'; import { useDispatch } from 'react-redux'; import { Button, EntityPill, RelationPill, useSelection } from '..'; -import { unSelect } from '@/lib/data-access/store/interactionSlice'; -import { ATTRIBUTE_MAX_CHARACTERS } from '@/config'; export const SelectionConfig = () => { const dispatch = useDispatch(); diff --git a/src/lib/management/Explorations.tsx b/src/lib/management/Explorations.tsx index deadcebd0..fb353a980 100644 --- a/src/lib/management/Explorations.tsx +++ b/src/lib/management/Explorations.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { Button } from '../components'; type Props = { diff --git a/src/lib/management/ManagementDialog.tsx b/src/lib/management/ManagementDialog.tsx index 372802205..30a4905ba 100644 --- a/src/lib/management/ManagementDialog.tsx +++ b/src/lib/management/ManagementDialog.tsx @@ -1,11 +1,11 @@ -import React, { useState } from 'react'; -import { Settings } from './Settings'; -import { Overview } from './Overview'; -import { Members } from './Members'; -import { UpsertDatabase } from './database'; +import { useState } from 'react'; +import { SaveState } from 'ts-common'; import { Button, Dialog, DialogContent, useAppDispatch, useAuthCache, useSessionCache } from '..'; import { addInfo } from '../data-access/store/configSlice'; -import { SaveState } from 'ts-common'; +import { Members } from './Members'; +import { Overview } from './Overview'; +import { Settings } from './Settings'; +import { UpsertDatabase } from './database'; type Props = { open: boolean; diff --git a/src/lib/management/ManagementTrigger.tsx b/src/lib/management/ManagementTrigger.tsx index 356f3f5e5..1f58782c1 100644 --- a/src/lib/management/ManagementTrigger.tsx +++ b/src/lib/management/ManagementTrigger.tsx @@ -1,10 +1,10 @@ -import React, { useState, useEffect, useCallback } from 'react'; +import { Tooltip, TooltipContent, TooltipTrigger } from '@/lib/components/tooltip'; +import { useEffect, useState } from 'react'; +import { DatabaseStatus, Icon, LoadingSpinner, nilUUID, TooltipProvider, useAppDispatch, useSchemaGraph, useSessionCache } from '..'; import { addError } from '../data-access/store/configSlice'; -import { clearQB, selectSaveState } from '../data-access/store/sessionSlice'; import { clearSchema } from '../data-access/store/schemaSlice'; +import { clearQB, selectSaveState } from '../data-access/store/sessionSlice'; import { ManagementDialog, ManagementViews } from './ManagementDialog'; -import { DatabaseStatus, Icon, LoadingSpinner, nilUUID, TooltipProvider, useAppDispatch, useSchemaGraph, useSessionCache } from '..'; -import { Tooltip, TooltipContent, TooltipTrigger } from '@/lib/components/tooltip'; type Props = { managementOpen: boolean; diff --git a/src/lib/management/Members.tsx b/src/lib/management/Members.tsx index cd7ab4332..a42f633bc 100644 --- a/src/lib/management/Members.tsx +++ b/src/lib/management/Members.tsx @@ -1,12 +1,12 @@ -import React, { useState } from 'react'; +import React from 'react'; +import { useDispatch } from 'react-redux'; +import { UserPolicy } from 'ts-common'; +import { Icon } from '..'; import { Button } from '../components/buttons'; import { useDialogContext } from '../components/layout/Dialog'; +import { TableUI } from '../components/tableUI/TableUI'; import { useUsersPolicy } from '../data-access/store'; -import { useDispatch } from 'react-redux'; -import { Icon } from '..'; import { setUsersPolicy } from '../data-access/store/authorizationUsersSlice'; -import { TableUI } from '../components/tableUI/TableUI'; -import { UserPolicy } from 'ts-common'; interface UserManagementContentProps { onConfirm?: (users: { name: string; email: string; type: string }[]) => void; diff --git a/src/lib/management/Overview.tsx b/src/lib/management/Overview.tsx index 32076ba3b..c619d7b86 100644 --- a/src/lib/management/Overview.tsx +++ b/src/lib/management/Overview.tsx @@ -1,8 +1,8 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; +import { SaveState } from 'ts-common'; +import { Tab, Tabs } from '../components/tabs'; import { ManagementViews } from './ManagementDialog'; -import { Tabs, Tab } from '../components/tabs'; import { Workspace } from './Workspace'; -import { SaveState } from 'ts-common'; type Props = { onClose: () => void; diff --git a/src/lib/management/Settings.tsx b/src/lib/management/Settings.tsx index 02987b9e6..d40951fbe 100644 --- a/src/lib/management/Settings.tsx +++ b/src/lib/management/Settings.tsx @@ -1,5 +1,3 @@ -import React from 'react'; - export function Settings() { return ( <div className="flex items-start w-full h-full p-6"> diff --git a/src/lib/management/Workspace.tsx b/src/lib/management/Workspace.tsx index 02bfc4500..4cc7d4c04 100644 --- a/src/lib/management/Workspace.tsx +++ b/src/lib/management/Workspace.tsx @@ -1,10 +1,9 @@ -import React, { useState } from 'react'; +import { SaveState } from 'ts-common'; import { useAppDispatch, useProjects, useSessionCache } from '..'; +import { Breadcrumb } from '../components/breadcrumb/Breadcrumb'; +import { setCurrentProject, setPath } from '../data-access/store/projectSlice'; import { Databases } from './database'; import { ManagementViews } from './ManagementDialog'; -import { SaveState } from 'ts-common'; -import { Breadcrumb } from '../components/breadcrumb/Breadcrumb'; -import { setPath, setCurrentProject } from '../data-access/store/projectSlice'; type Props = { onClose: () => void; diff --git a/src/lib/management/database/DatabaseForm.tsx b/src/lib/management/database/DatabaseForm.tsx index 7e234f2b3..0bb74884a 100644 --- a/src/lib/management/database/DatabaseForm.tsx +++ b/src/lib/management/database/DatabaseForm.tsx @@ -1,7 +1,7 @@ -import React, { useEffect, useState } from 'react'; -import { databaseProtocolMapping, Input, nilUUID } from '../..'; -import { PartialSaveState, SaveState } from 'ts-common'; +import { useEffect, useState } from 'react'; +import { PartialSaveState } from 'ts-common'; import { DatabaseType, DatabaseTypeArray } from 'ts-common/src/model/webSocket/dbConnection'; +import { databaseProtocolMapping, Input } from '../..'; export const INITIAL_SAVE_STATE: PartialSaveState = { name: 'Untitled', diff --git a/src/lib/management/database/DatabaseLine.tsx b/src/lib/management/database/DatabaseLine.tsx index a9974020b..115c85fce 100644 --- a/src/lib/management/database/DatabaseLine.tsx +++ b/src/lib/management/database/DatabaseLine.tsx @@ -1,27 +1,21 @@ import { - Icon, Button, + DropdownItem, + Icon, Popover, - PopoverTrigger, PopoverContent, - DropdownItem, - TooltipProvider, + PopoverTrigger, Tooltip, - TooltipTrigger, TooltipContent, + TooltipProvider, + TooltipTrigger, } from '@/lib/components'; import { Heatmap1D } from '@/lib/components/charts/heatmap1D'; import { IndicatorGraph } from '@/lib/components/charts/indicatorGraph'; -import { wsDeleteState, nilUUID, useSessionCache, useAppDispatch, useActiveQuery, useGraphQueryCounts } from '@/lib/data-access'; +import { useActiveQuery, useAppDispatch, useGraphQueryCounts, useSessionCache, wsDeleteState } from '@/lib/data-access'; import { clearSchema } from '@/lib/data-access/store/schemaSlice'; -import { selectSaveState, clearQB, deleteSaveState } from '@/lib/data-access/store/sessionSlice'; -import { - CountQueryResultFromBackend, - GraphQueryCountResultFromBackend, - GraphQueryResultMetaFromBackend, - Query, - SaveState, -} from 'ts-common'; +import { clearQB, deleteSaveState, selectSaveState } from '@/lib/data-access/store/sessionSlice'; +import { CountQueryResultFromBackend, GraphQueryCountResultFromBackend, Query, SaveState } from 'ts-common'; // Update props to include missing functions and optional sharing flag. interface DatabaseLineProps { diff --git a/src/lib/management/database/Databases.tsx b/src/lib/management/database/Databases.tsx index 2f5c71f81..f048ab161 100644 --- a/src/lib/management/database/Databases.tsx +++ b/src/lib/management/database/Databases.tsx @@ -1,26 +1,14 @@ -import { useMemo, useState, useEffect } from 'react'; -import { - Button, - Icon, - nilUUID, - useActiveQuery, - useAppDispatch, - useAuthCache, - useAuthentication, - useGraphQueryResult, - useProjects, - useSessionCache, - wsDeleteState, -} from '../..'; -import { clearQB, deleteSaveState } from '../../data-access/store/sessionSlice'; +import { useEffect, useMemo, useState } from 'react'; +import { SaveState } from 'ts-common'; +import { Button, Icon, nilUUID, useAppDispatch, useAuthCache, useAuthentication, useProjects, useSessionCache, wsDeleteState } from '../..'; import { clearSchema } from '../../data-access/store/schemaSlice'; +import { clearQB, deleteSaveState } from '../../data-access/store/sessionSlice'; import { useHandleDatabase } from './useHandleDatabase'; -import { SaveState } from 'ts-common'; // --- Add the imports for project functionality --- -import { addProject, setCurrentProject, setProjects, deleteProject, addToPath } from '../../data-access/store/projectSlice'; import { wsCreateProject, wsDeleteProject, wsGetProjects } from '@/lib/data-access/broker/wsProject'; import { Dialog, DialogContent, Input } from '../..'; // For the new-project dialog +import { addProject, addToPath, deleteProject, setCurrentProject, setProjects } from '../../data-access/store/projectSlice'; import { DatabaseLine } from './DatabaseLine'; type Props = { @@ -252,38 +240,37 @@ export function Databases({ onClose, saveStates, changeActive, setSelectedSaveSt onSelect={() => { if (key !== session.currentSaveState) { onClose(); - } - }} - onUpdate={() => { - changeActive('update'); - setSelectedSaveState(saveStates[key]); - }} - onClone={() => { - databaseHandler.submitDatabaseChange( - { ...saveStates[key], name: saveStates[key].name + ' (copy)', id: nilUUID }, - 'add', - true, - () => {}, - ); - setSelectedSaveState(saveStates[key]); - }} - onDelete={() => { - if (session.currentSaveState === key) { - dispatch(clearQB()); - dispatch(clearSchema()); - } - wsDeleteState({ saveStateID: key }); - dispatch(deleteSaveState(key)); - }} - onShare={async () => { - setSharing(true); - await auth.shareLink(); - setSharing(false); - }} - showDifferentiation={showDifferentiation} - showQueries={showQueries} - /> - + } + }} + onUpdate={() => { + changeActive('update'); + setSelectedSaveState(saveStates[key]); + }} + onClone={() => { + databaseHandler.submitDatabaseChange( + { ...saveStates[key], name: saveStates[key].name + ' (copy)', id: nilUUID }, + 'add', + true, + () => {}, + ); + setSelectedSaveState(saveStates[key]); + }} + onDelete={() => { + if (session.currentSaveState === key) { + dispatch(clearQB()); + dispatch(clearSchema()); + } + wsDeleteState({ saveStateID: key }); + dispatch(deleteSaveState(key)); + }} + onShare={async () => { + setSharing(true); + await auth.shareLink(); + setSharing(false); + }} + showDifferentiation={showDifferentiation} + showQueries={showQueries} + /> ))} </tbody> </table> diff --git a/src/lib/management/database/MockSaveStates.tsx b/src/lib/management/database/MockSaveStates.tsx index 08d4e5de9..adbfd612f 100644 --- a/src/lib/management/database/MockSaveStates.tsx +++ b/src/lib/management/database/MockSaveStates.tsx @@ -1,7 +1,6 @@ -import React from 'react'; -import { nilUUID } from '../../data-access/broker'; import { SaveState } from 'ts-common'; import { DatabaseType } from 'ts-common/src/model/webSocket/dbConnection'; +import { nilUUID } from '../../data-access/broker'; export type SaveStateSampleI = SaveState & { subtitle: string; diff --git a/src/lib/management/database/UpsertDatabase.tsx b/src/lib/management/database/UpsertDatabase.tsx index 98220840b..28989fcde 100644 --- a/src/lib/management/database/UpsertDatabase.tsx +++ b/src/lib/management/database/UpsertDatabase.tsx @@ -1,11 +1,11 @@ -import React, { useEffect, useRef, useState } from 'react'; -import { useAuthCache, nilUUID } from '../../data-access'; +import { useEffect, useRef, useState } from 'react'; +import { PartialSaveState, SaveState } from 'ts-common'; +import { Icon } from '../..'; import { Button } from '../../components/buttons'; +import { nilUUID, useAuthCache } from '../../data-access'; import { DatabaseForm, INITIAL_SAVE_STATE } from './DatabaseForm'; import { SampleDatabaseSelector } from './MockSaveStates'; -import { Icon } from '../..'; import { useHandleDatabase } from './useHandleDatabase'; -import { PartialSaveState, SaveState } from 'ts-common'; export const UpsertDatabase = (props: { onClose(): void; diff --git a/src/lib/management/database/useHandleDatabase.ts b/src/lib/management/database/useHandleDatabase.ts index 7f9512ce9..1179928fe 100644 --- a/src/lib/management/database/useHandleDatabase.ts +++ b/src/lib/management/database/useHandleDatabase.ts @@ -1,18 +1,18 @@ +import { wsAddQuery, wsUpdateQuery } from '@/lib/data-access/broker'; +import { addError } from '@/lib/data-access/store/configSlice'; +import { useState } from 'react'; +import { PartialSaveState, SaveState, SaveStateWithAuthorization } from 'ts-common'; import { - wsTestDatabaseConnection, - wsCreateState, - wsUpdateState, - useAuthCache, + DatabaseStatus, useAppDispatch, + useAuthCache, useProjects, - DatabaseStatus, + wsCreateState, + wsTestDatabaseConnection, + wsUpdateState, } from '../../data-access'; -import { useState } from 'react'; -import { addSaveState, selectSaveState, testedSaveState } from '../../data-access/store/sessionSlice'; import { setSchemaLoading } from '../../data-access/store/schemaSlice'; -import { PartialSaveState, SaveState, SaveStateWithAuthorization } from 'ts-common'; -import { addError } from '@/lib/data-access/store/configSlice'; -import { wsAddQuery, wsUpdateQuery } from '@/lib/data-access/broker'; +import { addSaveState, selectSaveState, testedSaveState } from '../../data-access/store/sessionSlice'; export type ConnectionStatus = { updating: boolean; diff --git a/src/lib/management/index.ts b/src/lib/management/index.ts index 90a09e7d3..e53d2f309 100644 --- a/src/lib/management/index.ts +++ b/src/lib/management/index.ts @@ -1,2 +1,2 @@ -export * from './ManagementTrigger'; export * from './ManagementDialog'; +export * from './ManagementTrigger'; diff --git a/src/lib/mock-data/geo-json/index.tsx b/src/lib/mock-data/geo-json/index.tsx index d558cf124..02c03aa10 100644 --- a/src/lib/mock-data/geo-json/index.tsx +++ b/src/lib/mock-data/geo-json/index.tsx @@ -1,6 +1,6 @@ +export { default as europeData } from './europe.json'; +export { default as netherlands } from './netherlands.json'; export { default as netherlandsData } from './netherlands_provinces.json'; export { default as netherlandsTownshipsData } from './netherlands_townships.json'; -export { default as europeData } from './europe.json'; export { default as usaData } from './usa.json'; export { default as worldData } from './world.json'; -export { default as netherlands } from './netherlands.json'; diff --git a/src/lib/mock-data/index.ts b/src/lib/mock-data/index.ts index 84a325edf..962510a2a 100644 --- a/src/lib/mock-data/index.ts +++ b/src/lib/mock-data/index.ts @@ -1,2 +1,2 @@ -export * from './schema'; export * from './query-result'; +export * from './schema'; diff --git a/src/lib/mock-data/query-result/bigMockQueryResults.json b/src/lib/mock-data/query-result/bigMockQueryResults.json index e0f90b1f0..65a92d62e 100644 --- a/src/lib/mock-data/query-result/bigMockQueryResults.json +++ b/src/lib/mock-data/query-result/bigMockQueryResults.json @@ -107993,4 +107993,4 @@ "label": "airports" } ] -} \ No newline at end of file +} diff --git a/src/lib/mock-data/query-result/mockData.ts b/src/lib/mock-data/query-result/mockData.ts index 100680ec2..5d9b25d91 100644 --- a/src/lib/mock-data/query-result/mockData.ts +++ b/src/lib/mock-data/query-result/mockData.ts @@ -1,4 +1,4 @@ -import { graphQueryBackend2graphQuery } from 'ts-common'; +import { getGraphStatistics, graphQueryBackend2graphQuery } from 'ts-common'; const mockDataArray = [ 'big2ndChamberQueryResult', @@ -22,13 +22,10 @@ export type MockDataI = (typeof mockDataArray)[number]; export const loadMockData = async (fileName: MockDataI) => { const filename = `./${fileName.replace('_', '/')}.json`; const json = await import(filename /* @vite-ignore */); - const { nodes, edges, metaData } = graphQueryBackend2graphQuery(json.default); + const result = graphQueryBackend2graphQuery(json.default); return { - data: { - nodes, - edges, - }, - graphMetadata: metaData, + data: result, + graphMetadata: getGraphStatistics(result), }; }; diff --git a/src/lib/mock-data/query-result/mockMobilityQueryResult.json b/src/lib/mock-data/query-result/mockMobilityQueryResult.json index c19bf3bda..63c52b964 100644 --- a/src/lib/mock-data/query-result/mockMobilityQueryResult.json +++ b/src/lib/mock-data/query-result/mockMobilityQueryResult.json @@ -17516,4 +17516,4 @@ "label": "rides" } ] -} \ No newline at end of file +} diff --git a/src/lib/mock-data/schema/big2ndChamberSchemaRaw.ts b/src/lib/mock-data/schema/big2ndChamberSchemaRaw.ts index a0d8bf1f4..7340b46ba 100644 --- a/src/lib/mock-data/schema/big2ndChamberSchemaRaw.ts +++ b/src/lib/mock-data/schema/big2ndChamberSchemaRaw.ts @@ -1,5 +1,5 @@ -import { SchemaUtils } from '../../../lib/schema/schema-utils'; import { SchemaReturnFormat } from 'ts-common'; +import { SchemaUtils } from '../../../lib/schema/schema-utils'; export const big2ndChamberSchemaRaw: SchemaReturnFormat = { nodes: [ diff --git a/src/lib/mock-data/schema/fincenWithAttributes.ts b/src/lib/mock-data/schema/fincenWithAttributes.ts index 1a78f4818..b705ed1d7 100644 --- a/src/lib/mock-data/schema/fincenWithAttributes.ts +++ b/src/lib/mock-data/schema/fincenWithAttributes.ts @@ -1,5 +1,5 @@ -import { SchemaUtils } from '../../../lib/schema/schema-utils'; import { SchemaReturnFormat } from 'ts-common'; +import { SchemaUtils } from '../../../lib/schema/schema-utils'; export const fincenWithAttributesRaw: SchemaReturnFormat = { nodes: [ diff --git a/src/lib/mock-data/schema/index.ts b/src/lib/mock-data/schema/index.ts index aa115b368..0c209fcc0 100644 --- a/src/lib/mock-data/schema/index.ts +++ b/src/lib/mock-data/schema/index.ts @@ -1,15 +1,13 @@ -export * from './simpleRaw'; +export * from './big2ndChamberSchemaRaw'; +export * from './fincenWithAttributes'; +export * from './marieBoucherSampleSchemaRaw'; export * from './moviesSchemaRaw'; export * from './moviesSchemaWithAttributes'; export * from './northwindSchemaRaw'; -export * from './twitterSchemaRaw'; -export * from './big2ndChamberSchemaRaw'; -export * from './typesMockSchemaRaw'; -export * from './simpleAirportRaw'; -export * from './recommendationsWithAttributes'; export * from './northwindWithAttributes'; -export * from './slackWithAttributes'; -export * from './fincenWithAttributes'; -export * from './marieBoucherSampleSchemaRaw'; -export * from './marieBoucherSampleSchemaRaw'; +export * from './recommendationsWithAttributes'; export * from './simpleAirportRaw'; +export * from './simpleRaw'; +export * from './slackWithAttributes'; +export * from './twitterSchemaRaw'; +export * from './typesMockSchemaRaw'; diff --git a/src/lib/mock-data/schema/mock-data.spec.ts b/src/lib/mock-data/schema/mock-data.spec.ts index 0817e82df..48d00bec1 100644 --- a/src/lib/mock-data/schema/mock-data.spec.ts +++ b/src/lib/mock-data/schema/mock-data.spec.ts @@ -1,9 +1,15 @@ -import { assert, describe, expect, it, test } from 'vitest'; - -import { movieSchemaRaw, movieSchema } from '..'; -import { northWindSchema, northwindSchemaRaw } from '..'; -import { simpleSchema, simpleSchemaRaw } from '..'; -import { twitterSchema, twitterSchemaRaw } from '..'; +import { describe, expect, it } from 'vitest'; + +import { + movieSchema, + movieSchemaRaw, + northWindSchema, + northwindSchemaRaw, + simpleSchema, + simpleSchemaRaw, + twitterSchema, + twitterSchemaRaw, +} from '..'; describe('MockData Tests', () => { it('should have raw data available movie', () => { diff --git a/src/lib/mock-data/schema/moviesSchemaWithAttributes.ts b/src/lib/mock-data/schema/moviesSchemaWithAttributes.ts index 78bcd6fd1..b4874766f 100644 --- a/src/lib/mock-data/schema/moviesSchemaWithAttributes.ts +++ b/src/lib/mock-data/schema/moviesSchemaWithAttributes.ts @@ -1,5 +1,5 @@ -import { SchemaUtils } from '../../../lib/schema/schema-utils'; import { SchemaReturnFormat } from 'ts-common'; +import { SchemaUtils } from '../../../lib/schema/schema-utils'; export const movieSchemaWithAttributesRaw: SchemaReturnFormat = { nodes: [ diff --git a/src/lib/mock-data/schema/northwindWithAttributes.ts b/src/lib/mock-data/schema/northwindWithAttributes.ts index 5a9ac1d77..9d44fc4e6 100644 --- a/src/lib/mock-data/schema/northwindWithAttributes.ts +++ b/src/lib/mock-data/schema/northwindWithAttributes.ts @@ -1,5 +1,5 @@ -import { SchemaUtils } from '../../../lib/schema/schema-utils'; import { SchemaReturnFormat } from 'ts-common'; +import { SchemaUtils } from '../../../lib/schema/schema-utils'; export const northWindWithAttributesRaw: SchemaReturnFormat = { nodes: [ diff --git a/src/lib/mock-data/schema/recommendationsWithAttributes.ts b/src/lib/mock-data/schema/recommendationsWithAttributes.ts index b3755ceb8..c5b39606a 100644 --- a/src/lib/mock-data/schema/recommendationsWithAttributes.ts +++ b/src/lib/mock-data/schema/recommendationsWithAttributes.ts @@ -1,5 +1,5 @@ -import { SchemaUtils } from '../../../lib/schema/schema-utils'; import { SchemaReturnFormat } from 'ts-common'; +import { SchemaUtils } from '../../../lib/schema/schema-utils'; export const recommendationsWithAttributesRaw: SchemaReturnFormat = { nodes: [ diff --git a/src/lib/mock-data/schema/slackWithAttributes.ts b/src/lib/mock-data/schema/slackWithAttributes.ts index 65285703f..93369d509 100644 --- a/src/lib/mock-data/schema/slackWithAttributes.ts +++ b/src/lib/mock-data/schema/slackWithAttributes.ts @@ -1,5 +1,5 @@ -import { SchemaUtils } from '../../../lib/schema/schema-utils'; import { SchemaReturnFormat } from 'ts-common'; +import { SchemaUtils } from '../../../lib/schema/schema-utils'; export const slackWithAttributesRaw: SchemaReturnFormat = { nodes: [ diff --git a/src/lib/mock-data/schema/typesMockSchemaRaw.ts b/src/lib/mock-data/schema/typesMockSchemaRaw.ts index 8aa3ba305..1c7fdac34 100644 --- a/src/lib/mock-data/schema/typesMockSchemaRaw.ts +++ b/src/lib/mock-data/schema/typesMockSchemaRaw.ts @@ -1,5 +1,5 @@ -import { SchemaUtils } from '../../../lib/schema/schema-utils'; import { SchemaReturnFormat } from 'ts-common'; +import { SchemaUtils } from '../../../lib/schema/schema-utils'; export const typesMockSchemaRaw: SchemaReturnFormat = { nodes: [ diff --git a/src/lib/querybuilder/index.ts b/src/lib/querybuilder/index.ts index 2f0c103f1..c4fb59694 100644 --- a/src/lib/querybuilder/index.ts +++ b/src/lib/querybuilder/index.ts @@ -1,7 +1,7 @@ import { QueryBuilder } from './panel'; +export * from './model'; export * from './panel'; export * from './pills'; -export * from './model'; export default QueryBuilder; diff --git a/src/lib/querybuilder/model/graphology/utils.ts b/src/lib/querybuilder/model/graphology/utils.ts index 5e1adb664..f259c21b1 100644 --- a/src/lib/querybuilder/model/graphology/utils.ts +++ b/src/lib/querybuilder/model/graphology/utils.ts @@ -1,22 +1,22 @@ -import Graph, { MultiGraph } from 'graphology'; -import { Attributes as GAttributes, Attributes } from 'graphology-types'; +import { MultiGraph } from 'graphology'; +import { Attributes, Attributes as GAttributes } from 'graphology-types'; -import { checkForMetaAttributes } from './metaAttributes'; import { - QueryGraphNodes, - QueryGraphEdges, - SchemaAttribute, - QueryGraphEdgeHandle, EntityNodeAttributes, - RelationNodeAttributes, + Handles, + InputNodeTypeTypes, LogicNodeAttributes, + QueryElementTypes, + QueryGraphEdgeHandle, + QueryGraphEdges, QueryGraphEdgesOpt, + QueryGraphNodes, + RelationNodeAttributes, + SchemaAttribute, SchemaAttributeTypes, - Handles, - InputNodeTypeTypes, XYPosition, } from 'ts-common'; -import { QueryElementTypes } from 'ts-common'; +import { checkForMetaAttributes } from './metaAttributes'; /** monospace fontsize table */ const widthPerFontsize = { diff --git a/src/lib/querybuilder/model/index.ts b/src/lib/querybuilder/model/index.ts index 140b156ec..0799002f9 100644 --- a/src/lib/querybuilder/model/index.ts +++ b/src/lib/querybuilder/model/index.ts @@ -1,4 +1,4 @@ -import { QueryGraphEdgeHandle, NodeAttribute, QueryElementTypes, InputNodeType, Handles } from 'ts-common'; +import { Handles, InputNodeType, NodeAttribute, QueryElementTypes, QueryGraphEdgeHandle } from 'ts-common'; import { SchemaReactflowNode } from './reactflow'; export * from './graphology'; diff --git a/src/lib/querybuilder/model/reactflow/model.ts b/src/lib/querybuilder/model/reactflow/model.ts index 20f52bd25..66992495b 100644 --- a/src/lib/querybuilder/model/reactflow/model.ts +++ b/src/lib/querybuilder/model/reactflow/model.ts @@ -3,8 +3,8 @@ * Utrecht University within the Software Project course. * © Copyright Utrecht University (Department of Information and Computing Sciences) */ -import { Edge as ReactEdge, NodeProps } from 'reactflow'; -import { EntityNodeAttributes, RelationNodeAttributes, LogicNodeAttributes, EntityData, RelationData, LogicData } from 'ts-common'; +import { NodeProps, Edge as ReactEdge } from 'reactflow'; +import { EntityData, EntityNodeAttributes, LogicData, LogicNodeAttributes, RelationData, RelationNodeAttributes } from 'ts-common'; import { QueryElementTypes } from 'ts-common/src/model/reactflow'; /** List of possible query element types */ diff --git a/src/lib/querybuilder/model/reactflow/utils.ts b/src/lib/querybuilder/model/reactflow/utils.ts index 9e6bb41f1..337cea0ec 100644 --- a/src/lib/querybuilder/model/reactflow/utils.ts +++ b/src/lib/querybuilder/model/reactflow/utils.ts @@ -1,5 +1,5 @@ import Graph from 'graphology'; -import { Node, Edge } from 'reactflow'; +import { Edge, Node } from 'reactflow'; import { toHandleId } from '..'; // Takes the querybuilder graph as an input and creates react flow elements for them. diff --git a/src/lib/querybuilder/panel/ManualQueryDialog.tsx b/src/lib/querybuilder/panel/ManualQueryDialog.tsx index 8467e08f0..d29cd2516 100644 --- a/src/lib/querybuilder/panel/ManualQueryDialog.tsx +++ b/src/lib/querybuilder/panel/ManualQueryDialog.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { Button } from '../../components'; type ManualQueryDialogProps = { diff --git a/src/lib/querybuilder/panel/QueryBuilder.tsx b/src/lib/querybuilder/panel/QueryBuilder.tsx index 2cc8c1633..5472d36c6 100644 --- a/src/lib/querybuilder/panel/QueryBuilder.tsx +++ b/src/lib/querybuilder/panel/QueryBuilder.tsx @@ -7,6 +7,8 @@ import { useSchemaGraph, useSearchResultQB, } from '@/lib/data-access/store'; +import { setQuerybuilderGraphology, toQuerybuilderGraphology } from '@/lib/data-access/store/sessionSlice'; +import html2canvas from 'html2canvas'; import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import ReactFlow, { Background, @@ -22,6 +24,7 @@ import ReactFlow, { isNode, useReactFlow, } from 'reactflow'; +import { AllLogicMap, QueryElementTypes, defaultGraph, isLogicHandle } from 'ts-common'; import { Dialog, DialogContent } from '../../components/layout/Dialog'; import { addError } from '../../data-access/store/configSlice'; import { toSchemaGraphology } from '../../data-access/store/schemaSlice'; @@ -31,15 +34,12 @@ import { ConnectionDragLine, ConnectionLine, QueryEntityPill, QueryRelationPill import { QueryLogicPill } from '../pills/customFlowPills/logicpill/QueryLogicPill'; import { dragPillStarted, movePillTo } from '../pills/dragging/dragPill'; import styles from './querybuilder.module.scss'; +import { QueryBuilderContextMenu } from './QueryBuilderContextMenu'; +import { QueryBuilderDispatcherContext } from './QueryBuilderDispatcher'; +import { QueryBuilderNav, QueryBuilderToggleSettings } from './QueryBuilderNav'; import { QueryBuilderLogicPillsPanel } from './querysidepanel/QueryBuilderLogicPillsPanel'; import { QueryBuilderRelatedNodesPanel } from './querysidepanel/QueryBuilderRelatedNodesPanel'; import { ConnectingNodeDataI } from './utils/connectorDrop'; -import { QueryBuilderDispatcherContext } from './QueryBuilderDispatcher'; -import { QueryBuilderNav, QueryBuilderToggleSettings } from './QueryBuilderNav'; -import html2canvas from 'html2canvas'; -import { QueryBuilderContextMenu } from './QueryBuilderContextMenu'; -import { QueryElementTypes, AllLogicMap, isLogicHandle, defaultGraph } from 'ts-common'; -import { setQuerybuilderGraphology, toQuerybuilderGraphology } from '@/lib/data-access/store/sessionSlice'; export type QueryBuilderProps = { onRunQuery?: (useCached: boolean) => void; diff --git a/src/lib/querybuilder/panel/QueryBuilderContextMenu.tsx b/src/lib/querybuilder/panel/QueryBuilderContextMenu.tsx index edba4258b..2be58481a 100644 --- a/src/lib/querybuilder/panel/QueryBuilderContextMenu.tsx +++ b/src/lib/querybuilder/panel/QueryBuilderContextMenu.tsx @@ -1,16 +1,16 @@ -import { useMemo, useState, useEffect } from 'react'; -import { Popover, PopoverTrigger, DropdownItemContainer, DropdownItem, Input, Icon } from '@/lib/components'; -import { ReactFlowInstance, Node } from 'reactflow'; -import { useActiveQuery, useAppDispatch, useQuerybuilderHash } from '../..'; -import { isEqual } from 'lodash-es'; -import { getDataTypeIcon } from '../../components/DataTypeIcon'; -import { QueryUnionType, NodeAttribute, defaultGraph, QueryRelationDirection } from 'ts-common'; +import { DropdownItem, DropdownItemContainer, Icon, Input, Popover, PopoverTrigger } from '@/lib/components'; import { attributeShownToggle, setQuerybuilderGraphology, setQueryUnionType, toQuerybuilderGraphology, } from '@/lib/data-access/store/sessionSlice'; +import { isEqual } from 'lodash-es'; +import { useEffect, useMemo, useState } from 'react'; +import { Node, ReactFlowInstance } from 'reactflow'; +import { defaultGraph, NodeAttribute, QueryRelationDirection, QueryUnionType } from 'ts-common'; +import { useActiveQuery, useAppDispatch, useQuerybuilderHash } from '../..'; +import { getDataTypeIcon } from '../../components/DataTypeIcon'; export const QueryBuilderContextMenu = (props: { open: boolean; diff --git a/src/lib/querybuilder/panel/QueryBuilderDispatcher.tsx b/src/lib/querybuilder/panel/QueryBuilderDispatcher.tsx index aa3995713..2aec54c94 100644 --- a/src/lib/querybuilder/panel/QueryBuilderDispatcher.tsx +++ b/src/lib/querybuilder/panel/QueryBuilderDispatcher.tsx @@ -1,6 +1,6 @@ -import React, { createContext } from 'react'; -import { SchemaReactflowLogicNode } from '../model'; +import { createContext } from 'react'; import { OnConnectStartParams } from 'reactflow'; +import { SchemaReactflowLogicNode } from '../model'; export const QueryBuilderDispatcherContext = createContext<{ openLogicPillUpdate: (node: SchemaReactflowLogicNode) => void; diff --git a/src/lib/querybuilder/panel/QueryBuilderNav.tsx b/src/lib/querybuilder/panel/QueryBuilderNav.tsx index 6f313f0d6..c1499855b 100644 --- a/src/lib/querybuilder/panel/QueryBuilderNav.tsx +++ b/src/lib/querybuilder/panel/QueryBuilderNav.tsx @@ -1,29 +1,24 @@ +import { Button, ControlContainer, Input, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/lib/components'; +import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/popover'; +import { Tab, Tabs } from '@/lib/components/tabs'; +import { addError } from '@/lib/data-access/store/configSlice'; +import objectHash from 'object-hash'; import { useEffect, useMemo, useRef, useState } from 'react'; -import { ControlContainer, TooltipProvider, Tooltip, TooltipTrigger, Button, TooltipContent, Input } from '@/lib/components'; -import { Popover, PopoverTrigger, PopoverContent } from '@/lib/components/popover'; -import { useActiveQuery, useActiveSaveState, - useAppDispatch, - useGraphQuery, - useGraphQueryCounts, - useGraphQueryResult, - useML} from '../../data-access'; +import Sortable from 'sortablejs'; +import { useActiveQuery, useActiveSaveState, useAppDispatch, useGraphQuery, useML } from '../../data-access'; +import { wsAddQuery, wsDeleteQuery, wsManualQueryRequest, wsUpdateQuery } from '../../data-access/broker'; import { + addNewQuery, clearQB, - setQuerybuilderSettings, removeQueryByID, + reorderQueryState, setActiveQueryID, + setQuerybuilderSettings, setQueryName, - addNewQuery, - reorderQueryState, } from '../../data-access/store/sessionSlice'; +import { ManualQueryDialog } from './ManualQueryDialog'; import { QueryMLDialog } from './querysidepanel/QueryMLDialog'; import { QuerySettings } from './querysidepanel/QuerySettings'; -import { ManualQueryDialog } from './ManualQueryDialog'; -import { wsAddQuery, wsDeleteQuery, wsManualQueryRequest, wsUpdateQuery } from '../../data-access/broker'; -import { Tabs, Tab } from '@/lib/components/tabs'; -import { addError } from '@/lib/data-access/store/configSlice'; -import Sortable from 'sortablejs'; -import objectHash from 'object-hash'; export type QueryBuilderToggleSettings = 'settings' | 'ml' | 'logic' | 'relatedNodes' | undefined; diff --git a/src/lib/querybuilder/panel/querysidepanel/QueryBuilderLogicPillsPanel.tsx b/src/lib/querybuilder/panel/querysidepanel/QueryBuilderLogicPillsPanel.tsx index 6639c97d1..93e5f2d2d 100644 --- a/src/lib/querybuilder/panel/querysidepanel/QueryBuilderLogicPillsPanel.tsx +++ b/src/lib/querybuilder/panel/querysidepanel/QueryBuilderLogicPillsPanel.tsx @@ -1,10 +1,10 @@ +import { setQuerybuilderGraphology, toQuerybuilderGraphology } from '@/lib/data-access/store/sessionSlice'; import { useState } from 'react'; -import { SchemaReactflowLogicNode, toHandleData } from '../../model'; -import { ConnectingNodeDataI } from '../utils/connectorDrop'; import { useDispatch } from 'react-redux'; +import { AllLogicDescriptions, AllLogicMap, defaultGraph, QueryElementTypes } from 'ts-common'; import { Button, Icon, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, useActiveQuery } from '../../..'; -import { QueryElementTypes, AllLogicDescriptions, AllLogicMap, defaultGraph } from 'ts-common'; -import { setQuerybuilderGraphology, toQuerybuilderGraphology } from '@/lib/data-access/store/sessionSlice'; +import { SchemaReactflowLogicNode, toHandleData } from '../../model'; +import { ConnectingNodeDataI } from '../utils/connectorDrop'; export const QueryBuilderLogicPillsPanel = (props: { reactFlowWrapper: HTMLDivElement | null; diff --git a/src/lib/querybuilder/panel/querysidepanel/QueryBuilderRelatedNodesPanel.tsx b/src/lib/querybuilder/panel/querysidepanel/QueryBuilderRelatedNodesPanel.tsx index bed25f905..4ab741b5e 100644 --- a/src/lib/querybuilder/panel/querysidepanel/QueryBuilderRelatedNodesPanel.tsx +++ b/src/lib/querybuilder/panel/querysidepanel/QueryBuilderRelatedNodesPanel.tsx @@ -1,11 +1,11 @@ -import { useMemo, useState } from 'react'; -import { ConnectingNodeDataI } from '../utils/connectorDrop'; import { useActiveQuery, useActiveSaveState, useSchemaGraph } from '@/lib/data-access'; -import { useDispatch } from 'react-redux'; import { toSchemaGraphology } from '@/lib/data-access/store/schemaSlice'; -import { SchemaNode, QueryElementTypes, Handles, SchemaEdge, defaultGraph } from 'ts-common'; -import { toHandleData } from '../../model'; import { setQuerybuilderGraphology, toQuerybuilderGraphology } from '@/lib/data-access/store/sessionSlice'; +import { useMemo, useState } from 'react'; +import { useDispatch } from 'react-redux'; +import { Handles, QueryElementTypes, SchemaEdge, SchemaNode, defaultGraph } from 'ts-common'; +import { toHandleData } from '../../model'; +import { ConnectingNodeDataI } from '../utils/connectorDrop'; export const QueryBuilderRelatedNodesPanel = (props: { reactFlowWrapper: HTMLDivElement | null; diff --git a/src/lib/querybuilder/panel/querysidepanel/QueryMLDialog.tsx b/src/lib/querybuilder/panel/querysidepanel/QueryMLDialog.tsx index c82f1dc26..68123a36f 100644 --- a/src/lib/querybuilder/panel/querysidepanel/QueryMLDialog.tsx +++ b/src/lib/querybuilder/panel/querysidepanel/QueryMLDialog.tsx @@ -1,4 +1,6 @@ -import React from 'react'; +import { FeatureEnabled } from '@/lib/components/featureFlags'; +import { FormBody, FormTitle } from '@/lib/components/forms'; +import { Input } from '@/lib/components/inputs'; import { useAppDispatch, useML } from '@/lib/data-access'; import { setCentralityEnabled, @@ -6,9 +8,6 @@ import { setLinkPredictionEnabled, setShortestPathEnabled, } from '@/lib/data-access/store/mlSlice'; -import { FormBody, FormTitle } from '@/lib/components/forms'; -import { Input } from '@/lib/components/inputs'; -import { FeatureEnabled } from '@/lib/components/featureFlags'; export const QueryMLDialog = () => { const dispatch = useAppDispatch(); diff --git a/src/lib/querybuilder/panel/querysidepanel/QuerySettings.tsx b/src/lib/querybuilder/panel/querysidepanel/QuerySettings.tsx index b8c1104f2..878d7944d 100644 --- a/src/lib/querybuilder/panel/querysidepanel/QuerySettings.tsx +++ b/src/lib/querybuilder/panel/querysidepanel/QuerySettings.tsx @@ -1,12 +1,11 @@ -import { useEffect } from 'react'; -import React from 'react'; -import { Layouts } from '@/lib/graph-layout'; -import { Input } from '@/lib/components/inputs'; import { FormActions } from '@/lib/components'; +import { Input } from '@/lib/components/inputs'; import { useActiveQuery, useAppDispatch } from '@/lib/data-access'; import { addWarning } from '@/lib/data-access/store/configSlice'; -import { QueryBuilderSettings, defaultQuery } from 'ts-common'; import { setQuerybuilderSettings } from '@/lib/data-access/store/sessionSlice'; +import { Layouts } from '@/lib/graph-layout'; +import React, { useEffect } from 'react'; +import { QueryBuilderSettings, defaultQuery } from 'ts-common'; export const QuerySettings = React.forwardRef<HTMLDivElement, object>((props, ref) => { const activeQuery = useActiveQuery(); diff --git a/src/lib/querybuilder/panel/schemaquerybuilder.stories.tsx b/src/lib/querybuilder/panel/schemaquerybuilder.stories.tsx index 96a023d28..9ef063420 100644 --- a/src/lib/querybuilder/panel/schemaquerybuilder.stories.tsx +++ b/src/lib/querybuilder/panel/schemaquerybuilder.stories.tsx @@ -1,12 +1,12 @@ -import { Meta } from '@storybook/react'; -import { Provider } from 'react-redux'; import { setSchema, store } from '@/lib/data-access/store'; import { setQuerybuilderGraph } from '@/lib/data-access/store/sessionSlice'; -import { SchemaUtils } from '../../../lib/schema/schema-utils'; -import { Schema } from '@/lib/schema/panel'; import { movieSchemaRaw } from '@/lib/mock-data'; import { QueryBuilder } from '@/lib/querybuilder'; import { QueryMultiGraphology } from '@/lib/querybuilder/model/graphology/utils'; +import { Schema } from '@/lib/schema/panel'; +import { Meta } from '@storybook/react'; +import { Provider } from 'react-redux'; +import { SchemaUtils } from '../../../lib/schema/schema-utils'; const SchemaAndQueryBuilder = () => { return ( diff --git a/src/lib/querybuilder/panel/stories/querybuilder-simple.stories.tsx b/src/lib/querybuilder/panel/stories/querybuilder-simple.stories.tsx index 1a1b040d2..0d58b55bd 100644 --- a/src/lib/querybuilder/panel/stories/querybuilder-simple.stories.tsx +++ b/src/lib/querybuilder/panel/stories/querybuilder-simple.stories.tsx @@ -2,10 +2,10 @@ import { setSchema, store } from '@/lib/data-access/store'; import { setQuerybuilderGraph } from '@/lib/data-access/store/sessionSlice'; import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; -import QueryBuilder from '../QueryBuilder'; -import { QueryMultiGraphology } from '../../model'; import { QueryElementTypes } from 'ts-common'; import { SchemaUtils } from '../../../schema/schema-utils'; +import { QueryMultiGraphology } from '../../model'; +import QueryBuilder from '../QueryBuilder'; const Component: Meta<typeof QueryBuilder> = { component: QueryBuilder, diff --git a/src/lib/querybuilder/panel/stories/querybuilder-single-entity.stories.tsx b/src/lib/querybuilder/panel/stories/querybuilder-single-entity.stories.tsx index 3b382ac7b..659fb23fb 100644 --- a/src/lib/querybuilder/panel/stories/querybuilder-single-entity.stories.tsx +++ b/src/lib/querybuilder/panel/stories/querybuilder-single-entity.stories.tsx @@ -2,9 +2,9 @@ import { store } from '@/lib/data-access/store'; import { setQuerybuilderGraph } from '@/lib/data-access/store/sessionSlice'; import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; -import QueryBuilder from '../QueryBuilder'; -import { QueryMultiGraphology } from '../../model'; import { QueryElementTypes } from 'ts-common'; +import { QueryMultiGraphology } from '../../model'; +import QueryBuilder from '../QueryBuilder'; const Component: Meta<typeof QueryBuilder> = { component: QueryBuilder, diff --git a/src/lib/querybuilder/panel/stories/querybuilder-single-relationship.stories.tsx b/src/lib/querybuilder/panel/stories/querybuilder-single-relationship.stories.tsx index a24430b3a..170f4d3c9 100644 --- a/src/lib/querybuilder/panel/stories/querybuilder-single-relationship.stories.tsx +++ b/src/lib/querybuilder/panel/stories/querybuilder-single-relationship.stories.tsx @@ -2,9 +2,9 @@ import { store } from '@/lib/data-access/store'; import { setQuerybuilderGraph } from '@/lib/data-access/store/sessionSlice'; import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; -import QueryBuilder from '../QueryBuilder'; -import { QueryMultiGraphology } from '../../model'; import { QueryElementTypes } from 'ts-common'; +import { QueryMultiGraphology } from '../../model'; +import QueryBuilder from '../QueryBuilder'; const Component: Meta<typeof QueryBuilder> = { component: QueryBuilder, diff --git a/src/lib/querybuilder/panel/utils/connectorDrop.ts b/src/lib/querybuilder/panel/utils/connectorDrop.ts index 169bd8f44..c4e5d49e8 100644 --- a/src/lib/querybuilder/panel/utils/connectorDrop.ts +++ b/src/lib/querybuilder/panel/utils/connectorDrop.ts @@ -1,5 +1,5 @@ import { OnConnectStartParams, XYPosition } from 'reactflow'; -import { NodeAttribute, QueryGraphNodes } from '../../model'; +import { NodeAttribute, QueryGraphNodes } from 'ts-common'; export type ConnectingNodeDataI = { params: OnConnectStartParams; diff --git a/src/lib/querybuilder/pills/FilterHandle.tsx b/src/lib/querybuilder/pills/FilterHandle.tsx index fb128e241..4f6aaf334 100644 --- a/src/lib/querybuilder/pills/FilterHandle.tsx +++ b/src/lib/querybuilder/pills/FilterHandle.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useMemo } from 'react'; import { Connection, Handle, HandleProps, Position, useNodeId, useStore } from 'reactflow'; -import { toHandleData, toHandleId } from '../model'; import { Handles, QueryGraphEdgeHandle } from 'ts-common'; +import { toHandleData, toHandleId } from '../model'; const selector = (s: any) => ({ nodeInternals: s.nodeInternals, diff --git a/src/lib/querybuilder/pills/customFlowLines/connectionDrag.tsx b/src/lib/querybuilder/pills/customFlowLines/connectionDrag.tsx index f9e33c02c..4e6d561da 100644 --- a/src/lib/querybuilder/pills/customFlowLines/connectionDrag.tsx +++ b/src/lib/querybuilder/pills/customFlowLines/connectionDrag.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { ConnectionLineComponentProps } from 'reactflow'; /** diff --git a/src/lib/querybuilder/pills/customFlowPills/edge-line.tsx b/src/lib/querybuilder/pills/customFlowPills/edge-line.tsx index 24dc37962..65dd7afc1 100644 --- a/src/lib/querybuilder/pills/customFlowPills/edge-line.tsx +++ b/src/lib/querybuilder/pills/customFlowPills/edge-line.tsx @@ -8,7 +8,6 @@ /* The comment above was added so the code coverage wouldn't count this file towards code coverage. * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ -import React from 'react'; import { EdgeProps, getSmoothStepPath, Position } from 'reactflow'; import { Handles } from 'ts-common'; diff --git a/src/lib/querybuilder/pills/customFlowPills/entitypill/QueryEntityPill.tsx b/src/lib/querybuilder/pills/customFlowPills/entitypill/QueryEntityPill.tsx index 75b78fda9..565243246 100644 --- a/src/lib/querybuilder/pills/customFlowPills/entitypill/QueryEntityPill.tsx +++ b/src/lib/querybuilder/pills/customFlowPills/entitypill/QueryEntityPill.tsx @@ -1,11 +1,11 @@ -import React, { useMemo, useRef } from 'react'; import { EntityPill } from '@/lib/components/pills'; -import { SchemaReactflowEntityNode, toHandleId } from '../../../model'; -import { PillAttributes } from '../../pillattributes/PillAttributes'; +import { useActiveQuery } from '@/lib/data-access'; import { uniqBy } from 'lodash-es'; -import { useUpdateNodeInternals, Handle, Position } from 'reactflow'; +import React, { useMemo, useRef } from 'react'; +import { Handle, Position } from 'reactflow'; import { QueryUnionType } from 'ts-common'; -import { useActiveQuery } from '@/lib/data-access'; +import { SchemaReactflowEntityNode, toHandleId } from '../../../model'; +import { PillAttributes } from '../../pillattributes/PillAttributes'; /** * Component to render an entity flow element diff --git a/src/lib/querybuilder/pills/customFlowPills/logicpill/LogicInput.tsx b/src/lib/querybuilder/pills/customFlowPills/logicpill/LogicInput.tsx index ff2e048f7..4505a485e 100644 --- a/src/lib/querybuilder/pills/customFlowPills/logicpill/LogicInput.tsx +++ b/src/lib/querybuilder/pills/customFlowPills/logicpill/LogicInput.tsx @@ -1,6 +1,6 @@ import { Input } from '@/lib/components'; import { DropdownInput } from '@/lib/components/inputs/DropdownInput'; -import React, { useRef, useEffect } from 'react'; +import React, { useEffect, useRef } from 'react'; interface LogicInputProps { value: string; diff --git a/src/lib/querybuilder/pills/customFlowPills/logicpill/QueryLogicPill.tsx b/src/lib/querybuilder/pills/customFlowPills/logicpill/QueryLogicPill.tsx index ac61eeb03..f600d9f6c 100644 --- a/src/lib/querybuilder/pills/customFlowPills/logicpill/QueryLogicPill.tsx +++ b/src/lib/querybuilder/pills/customFlowPills/logicpill/QueryLogicPill.tsx @@ -1,14 +1,14 @@ +import { LogicPill } from '@/lib/components'; +import { DropdownTrigger } from '@/lib/components/dropdowns'; import { useActiveQuery, useAppDispatch, useGraphQueryResultMeta } from '@/lib/data-access'; +import { setQuerybuilderGraphology, toQuerybuilderGraphology } from '@/lib/data-access/store/sessionSlice'; +import { SchemaReactflowLogicNode, toHandleId } from '@/lib/querybuilder/model'; import { useContext, useEffect, useMemo, useRef, useState } from 'react'; import { Handle, Position } from 'reactflow'; -import { LogicInput } from './LogicInput'; -import { LogicPill } from '@/lib/components'; +import { CategoricalStats, defaultGraph, Handles, InputNode, InputNodeTypeTypes, LogicNodeAttributes } from 'ts-common'; import { QueryBuilderDispatcherContext } from '../../../panel/QueryBuilderDispatcher'; -import { DropdownTrigger } from '@/lib/components/dropdowns'; -import { SchemaReactflowLogicNode, toHandleId } from '@/lib/querybuilder/model'; -import { LogicNodeAttributes, InputNodeTypeTypes, InputNode, Handles, CategoricalStats, defaultGraph } from 'ts-common'; import { styleHandleMap } from '../../utils'; -import { setQuerybuilderGraphology, toQuerybuilderGraphology } from '@/lib/data-access/store/sessionSlice'; +import { LogicInput } from './LogicInput'; export function QueryLogicPill(node: SchemaReactflowLogicNode) { const dispatch = useAppDispatch(); diff --git a/src/lib/querybuilder/pills/customFlowPills/relationpill/QueryRelationPill.tsx b/src/lib/querybuilder/pills/customFlowPills/relationpill/QueryRelationPill.tsx index 20a7159f9..8aefa5a30 100644 --- a/src/lib/querybuilder/pills/customFlowPills/relationpill/QueryRelationPill.tsx +++ b/src/lib/querybuilder/pills/customFlowPills/relationpill/QueryRelationPill.tsx @@ -1,17 +1,14 @@ -import { memo, useState, useMemo, useEffect } from 'react'; -import { SchemaReactflowRelationNode, toHandleId } from '../../../model'; +import { RelationPill } from '@/lib/components'; +import { pillWidth } from '@/lib/components/pills/pill.const'; import { useActiveQuery, useAppDispatch } from '@/lib/data-access'; import { addWarning } from '@/lib/data-access/store/configSlice'; -import { PillAttributes } from '../../pillattributes/PillAttributes'; -import { Button, DropdownContainer, DropdownTrigger, RelationPill, DropdownItemContainer, DropdownItem, Input } from '@/lib/components'; -import { Icon } from '@/lib/components/icon'; -import { PopoverContext } from '@/lib/components/layout/Popover'; -import { Handle, Position } from 'reactflow'; -import { pillWidth } from '@/lib/components/pills/pill.const'; -import { isEqual } from 'lodash-es'; -import { getDataTypeIcon } from '@/lib/components/DataTypeIcon'; -import { RelationNodeAttributes, NodeAttribute, QueryUnionType, defaultGraph } from 'ts-common'; import { attributeShownToggle, setQuerybuilderGraphology, toQuerybuilderGraphology } from '@/lib/data-access/store/sessionSlice'; +import { isEqual } from 'lodash-es'; +import { memo, useEffect, useMemo, useState } from 'react'; +import { Handle, Position } from 'reactflow'; +import { NodeAttribute, QueryUnionType, defaultGraph } from 'ts-common'; +import { SchemaReactflowRelationNode, toHandleId } from '../../../model'; +import { PillAttributes } from '../../pillattributes/PillAttributes'; export const QueryRelationPill = memo((node: SchemaReactflowRelationNode) => { const data = node.data; diff --git a/src/lib/querybuilder/pills/dragging/dragPill.ts b/src/lib/querybuilder/pills/dragging/dragPill.ts index 3ee0967fc..8337020f4 100644 --- a/src/lib/querybuilder/pills/dragging/dragPill.ts +++ b/src/lib/querybuilder/pills/dragging/dragPill.ts @@ -1,9 +1,9 @@ import { MultiGraph } from 'graphology'; +import { XYPosition } from 'ts-common'; import { DragAttibutePillStopped, DragAttributePill, DragAttributePillStarted } from './dragAttribute'; import { DragAttributesAlong } from './dragAttributesAlong'; import { DragEntityPill, DragEntityPillStarted, DragEntityPillStopped } from './dragEntity'; import { DragRelationPill, DragRelationPillStarted, DragRelationPillStopped } from './dragRelation'; -import { XYPosition } from 'ts-common'; export function dragPillStarted(id: string, nodes: MultiGraph) { switch (nodes.getNodeAttribute(id, 'type')) { diff --git a/src/lib/querybuilder/pills/pillattributes/PillAttributes.tsx b/src/lib/querybuilder/pills/pillattributes/PillAttributes.tsx index ec7e6b71e..76fc1c33a 100644 --- a/src/lib/querybuilder/pills/pillattributes/PillAttributes.tsx +++ b/src/lib/querybuilder/pills/pillattributes/PillAttributes.tsx @@ -1,10 +1,10 @@ -import { useMemo, useState } from 'react'; -import { SchemaReactflowEntityNode, SchemaReactflowRelationNode } from '../../model'; -import { isEqual } from 'lodash-es'; -import { PillAttributesItem } from './PillAttributesItem'; import { getDataTypeIcon } from '@/lib/components/DataTypeIcon'; -import { NodeAttribute, QueryGraphEdges, QueryUnionType } from 'ts-common'; import { useActiveQuery } from '@/lib/data-access'; +import { isEqual } from 'lodash-es'; +import { useMemo } from 'react'; +import { NodeAttribute, QueryGraphEdges, QueryUnionType } from 'ts-common'; +import { SchemaReactflowEntityNode, SchemaReactflowRelationNode } from '../../model'; +import { PillAttributesItem } from './PillAttributesItem'; type PillAttributesProps = { node: SchemaReactflowEntityNode | SchemaReactflowRelationNode; diff --git a/src/lib/querybuilder/pills/pillattributes/PillAttributesItem.tsx b/src/lib/querybuilder/pills/pillattributes/PillAttributesItem.tsx index 62ef62985..8d08d95da 100644 --- a/src/lib/querybuilder/pills/pillattributes/PillAttributesItem.tsx +++ b/src/lib/querybuilder/pills/pillattributes/PillAttributesItem.tsx @@ -1,11 +1,11 @@ -import { useContext } from 'react'; -import { SchemaReactflowEntityNode, SchemaReactflowRelationNode, handleDataFromReactflowToDataId, toHandleId } from '../../model'; -import { Handle, Position } from 'reactflow'; import { PillHandle } from '@/lib/components/pills/PillHandle'; import { pillAttributesPadding } from '@/lib/components/pills/pill.const'; +import { useContext } from 'react'; +import { Handle, Position } from 'reactflow'; +import { NodeAttribute, QueryUnionType } from 'ts-common'; import { Button } from '../../..'; +import { SchemaReactflowEntityNode, SchemaReactflowRelationNode, handleDataFromReactflowToDataId, toHandleId } from '../../model'; import { QueryBuilderDispatcherContext } from '../../panel/QueryBuilderDispatcher'; -import { NodeAttribute, QueryUnionType } from 'ts-common'; type PillAttributesItemProps = { attribute: NodeAttribute; diff --git a/src/lib/schema/model/graphology.ts b/src/lib/schema/model/graphology.ts index 696fd2ba2..9d094ebc2 100644 --- a/src/lib/schema/model/graphology.ts +++ b/src/lib/schema/model/graphology.ts @@ -1,5 +1,5 @@ import { MultiGraph } from 'graphology'; -import { Attributes as GAttributes, NodeEntry, EdgeEntry, SerializedGraph } from 'graphology-types'; +import { EdgeEntry, Attributes as GAttributes, NodeEntry, SerializedGraph } from 'graphology-types'; import { SchemaNode } from 'ts-common'; /** Attribute type, consist of a name */ diff --git a/src/lib/schema/panel/LayoutDescription/SchemaLayoutConfig.tsx b/src/lib/schema/panel/LayoutDescription/SchemaLayoutConfig.tsx index 773616c18..3494bd136 100644 --- a/src/lib/schema/panel/LayoutDescription/SchemaLayoutConfig.tsx +++ b/src/lib/schema/panel/LayoutDescription/SchemaLayoutConfig.tsx @@ -1,10 +1,10 @@ +import { Layouts } from '@/lib/graph-layout'; +import { CircleIcon } from '@/lib/schema/panel/LayoutDescription/iconsLayout/CircleIcon'; +import { DagreIcon } from '@/lib/schema/panel/LayoutDescription/iconsLayout/DagreIcon'; import { GridIcon } from '@/lib/schema/panel/LayoutDescription/iconsLayout/GridIcon'; import { ListIntersectIcon } from '@/lib/schema/panel/LayoutDescription/iconsLayout/ListIntersect'; import { ListIntersectNodesEdgesFirstIcon } from '@/lib/schema/panel/LayoutDescription/iconsLayout/ListIntersectNodesFirst'; -import { CircleIcon } from '@/lib/schema/panel/LayoutDescription/iconsLayout/CircleIcon'; -import { DagreIcon } from '@/lib/schema/panel/LayoutDescription/iconsLayout/DagreIcon'; import { ListIntersectRelationshipsFirst } from '@/lib/schema/panel/LayoutDescription/iconsLayout/ListIntersectRelationshipsFirst'; -import { Layouts } from '@/lib/graph-layout'; export type IconSize = 'sm' | 'md' | 'lg'; diff --git a/src/lib/schema/panel/Schema.tsx b/src/lib/schema/panel/Schema.tsx index 814466fac..d3a2cf2b3 100644 --- a/src/lib/schema/panel/Schema.tsx +++ b/src/lib/schema/panel/Schema.tsx @@ -1,11 +1,12 @@ +import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/popover'; import { SmartBezierEdge, SmartStepEdge, SmartStraightEdge } from '@tisoap/react-flow-smart-edge'; import React, { useEffect, useMemo, useRef, useState } from 'react'; import { useDispatch } from 'react-redux'; import ReactFlow, { Edge, MiniMap, Node, ReactFlowInstance, ReactFlowProvider, useEdgesState, useNodesState } from 'reactflow'; import 'reactflow/dist/style.css'; +import { AllLayoutAlgorithms } from 'ts-common/src/model/layouts'; import { Icon, Panel, TooltipProvider } from '../../components'; import { Button } from '../../components/buttons'; -import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/popover'; import { Tooltip, TooltipContent, TooltipTrigger } from '../../components/tooltip/Tooltip'; import { useActiveSaveState, @@ -18,16 +19,15 @@ import { import { setSchemaLoading, toSchemaGraphology } from '../../data-access/store/schemaSlice'; import { AlgorithmToLayoutProvider, LayoutFactory } from '../../graph-layout'; import { ConnectionDragLine, ConnectionLine } from '../../querybuilder'; +import { NodeEdge } from '../pills/edges/NodeEdge'; +import { SelfEdge } from '../pills/edges/SelfEdge'; import { SchemaEntityPill } from '../pills/nodes/entity/SchemaEntityPill'; import { SchemaListEntityPill } from '../pills/nodes/entity/SchemaListEntityPill'; import { SchemaListRelationPill } from '../pills/nodes/relation/SchemaListRelationPill'; import { SchemaRelationPill } from '../pills/nodes/relation/SchemaRelationPill'; import { schemaExpandRelation, schemaGraphology2Reactflow } from '../schema-utils'; -import { SchemaSettings } from './SchemaSettings'; -import { NodeEdge } from '../pills/edges/NodeEdge'; -import { SelfEdge } from '../pills/edges/SelfEdge'; import { SchemaLayoutConfig } from './LayoutDescription/SchemaLayoutConfig'; -import { AllLayoutAlgorithms } from 'ts-common/src/model/layouts'; +import { SchemaSettings } from './SchemaSettings'; interface Props { content?: string; diff --git a/src/lib/schema/panel/SchemaList.tsx b/src/lib/schema/panel/SchemaList.tsx index 108b77899..ab881b693 100644 --- a/src/lib/schema/panel/SchemaList.tsx +++ b/src/lib/schema/panel/SchemaList.tsx @@ -1,23 +1,24 @@ -import React, { useEffect, useMemo, useRef, useState } from 'react'; +import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/popover'; +import { Tooltip, TooltipContent, TooltipTrigger } from '@/lib/components/tooltip'; import { SmartBezierEdge, SmartStepEdge, SmartStraightEdge } from '@tisoap/react-flow-smart-edge'; -import ReactFlow, { Edge, Node, ReactFlowInstance, ReactFlowProvider, useEdgesState, useNodesState, MiniMap } from 'reactflow'; +import React, { useEffect, useMemo, useRef, useState } from 'react'; +import { useDispatch } from 'react-redux'; +import ReactFlow, { Edge, MiniMap, Node, ReactFlowInstance, ReactFlowProvider, useEdgesState, useNodesState } from 'reactflow'; import 'reactflow/dist/style.css'; +import { AllLayoutAlgorithms } from 'ts-common/src/model/layouts'; +import { Panel } from '../../components'; import { Button } from '../../components/buttons'; import { useSchemaGraph, useSchemaSettings, useSearchResultSchema } from '../../data-access'; +import { resultSetFocus } from '../../data-access/store/interactionSlice'; import { toSchemaGraphology } from '../../data-access/store/schemaSlice'; +import { AlgorithmToLayoutProvider, LayoutFactory } from '../../graph-layout'; +import { ConnectionDragLine, ConnectionLine } from '../../querybuilder'; import { NodeEdge } from '../pills/edges/NodeEdge'; import { SelfEdge } from '../pills/edges/SelfEdge'; import { SchemaEntityPill } from '../pills/nodes/entity/SchemaEntityPill'; import { SchemaRelationPill } from '../pills/nodes/relation/SchemaRelationPill'; -import { SchemaSettings } from './SchemaSettings'; -import { AlgorithmToLayoutProvider, AllLayoutAlgorithms, LayoutFactory } from '../../graph-layout'; -import { ConnectionLine, ConnectionDragLine } from '../../querybuilder'; import { schemaExpandRelation, schemaGraphology2Reactflow } from '../schema-utils'; -import { Panel } from '../../components'; -import { Tooltip, TooltipContent, TooltipTrigger } from '@/lib/components/tooltip'; -import { resultSetFocus } from '../../data-access/store/interactionSlice'; -import { useDispatch } from 'react-redux'; -import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/popover'; +import { SchemaSettings } from './SchemaSettings'; interface Props { content?: string; diff --git a/src/lib/schema/panel/SchemaSettings.tsx b/src/lib/schema/panel/SchemaSettings.tsx index 653be1b4e..221ad7657 100644 --- a/src/lib/schema/panel/SchemaSettings.tsx +++ b/src/lib/schema/panel/SchemaSettings.tsx @@ -1,5 +1,5 @@ -import { Icon, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent } from '@/lib/components'; -import { Popover, PopoverTrigger, PopoverContent } from '@/lib/components/layout/Popover'; +import { Icon, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/lib/components'; +import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/layout/Popover'; import { useState } from 'react'; import { Input } from '../../components/inputs'; import { useAppDispatch, useSchemaSettings, useSessionCache } from '../../data-access'; diff --git a/src/lib/schema/panel/schema.stories.tsx b/src/lib/schema/panel/schema.stories.tsx index d0ef51cd7..3f9427389 100644 --- a/src/lib/schema/panel/schema.stories.tsx +++ b/src/lib/schema/panel/schema.stories.tsx @@ -1,9 +1,9 @@ import { schemaSlice, setSchema } from '@/lib/data-access/store'; import { movieSchemaRaw, northwindSchemaRaw, twitterSchemaRaw } from '@/lib/mock-data'; -import { SchemaUtils } from '../../../lib/schema/schema-utils'; import { configureStore } from '@reduxjs/toolkit'; import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; +import { SchemaUtils } from '../../../lib/schema/schema-utils'; import { Schema } from './Schema'; const Component: Meta<typeof Schema> = { diff --git a/src/lib/schema/pills/edges/NodeEdge.tsx b/src/lib/schema/pills/edges/NodeEdge.tsx index b55170e30..f76488952 100644 --- a/src/lib/schema/pills/edges/NodeEdge.tsx +++ b/src/lib/schema/pills/edges/NodeEdge.tsx @@ -8,7 +8,7 @@ /* The comment above was added so the code coverage wouldn't count this file towards code coverage. * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; import { EdgeProps } from 'reactflow'; import { getCenter } from '../../schema-utils'; /** diff --git a/src/lib/schema/pills/edges/SelfEdge.tsx b/src/lib/schema/pills/edges/SelfEdge.tsx index 1f409cbcc..5961e7924 100644 --- a/src/lib/schema/pills/edges/SelfEdge.tsx +++ b/src/lib/schema/pills/edges/SelfEdge.tsx @@ -8,8 +8,8 @@ /* The comment above was added so the code coverage wouldn't count this file towards code coverage. * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ -import React, { useEffect } from 'react'; import { getCenter } from '@/lib/schema/schema-utils'; +import { useEffect } from 'react'; import { EdgeProps } from 'reactflow'; /** diff --git a/src/lib/schema/pills/nodes/SchemaPopUp/SchemaPopUp.tsx b/src/lib/schema/pills/nodes/SchemaPopUp/SchemaPopUp.tsx index 008bf1030..968f3c04d 100644 --- a/src/lib/schema/pills/nodes/SchemaPopUp/SchemaPopUp.tsx +++ b/src/lib/schema/pills/nodes/SchemaPopUp/SchemaPopUp.tsx @@ -1,7 +1,7 @@ -import React from 'react'; -import { Icon } from '@/lib/components/icon'; -import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@/lib/components/tooltip'; import { getDataTypeIcon } from '@/lib/components/DataTypeIcon'; +import { Icon } from '@/lib/components/icon'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/lib/components/tooltip'; +import React from 'react'; const formatNumber = (number: number) => { return number.toLocaleString('de-DE'); @@ -51,7 +51,7 @@ export const SchemaPopUp: React.FC<SchemaPopUpProps> = ({ data, numberOfElements <Icon component={<Icon component={getDataTypeIcon(v)} size={24} />} size={24} /> </span> </TooltipTrigger> - <TooltipContent side="right"> + <TooltipContent> <div className="max-w-[18rem] break-all line-clamp-6"> {v !== undefined && (typeof v !== 'object' || Array.isArray(v)) && v != '' ? v : 'noData'} </div> diff --git a/src/lib/schema/pills/nodes/entity/SchemaEntityPill.tsx b/src/lib/schema/pills/nodes/entity/SchemaEntityPill.tsx index 94681bbea..0734db976 100644 --- a/src/lib/schema/pills/nodes/entity/SchemaEntityPill.tsx +++ b/src/lib/schema/pills/nodes/entity/SchemaEntityPill.tsx @@ -1,12 +1,12 @@ import { EntityPill } from '@/lib/components'; -import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/popover'; import { NodeDetails } from '@/lib/components/nodeDetails'; +import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/popover'; import { useActiveSaveState, useSchemaStats } from '@/lib/data-access'; import React, { useEffect, useMemo, useRef, useState } from 'react'; import { Handle, NodeProps, Position, useViewport } from 'reactflow'; +import { QueryElementTypes, SchemaNode } from 'ts-common'; import { SchemaReactflowNodeWithFunctions } from '../../../model/reactflow'; import { SchemaPopUp } from '../SchemaPopUp/SchemaPopUp'; -import { QueryElementTypes, SchemaNode } from 'ts-common'; export const SchemaEntityPill = React.memo(({ id, selected, data }: NodeProps<SchemaReactflowNodeWithFunctions>) => { const [openPopupLocation, setOpenPopupLocation] = useState<{ x: number; y: number } | null>(null); diff --git a/src/lib/schema/pills/nodes/entity/SchemaListEntityPill.tsx b/src/lib/schema/pills/nodes/entity/SchemaListEntityPill.tsx index e2e1edda9..2a077f340 100644 --- a/src/lib/schema/pills/nodes/entity/SchemaListEntityPill.tsx +++ b/src/lib/schema/pills/nodes/entity/SchemaListEntityPill.tsx @@ -1,12 +1,12 @@ import { EntityPill } from '@/lib/components'; -import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/popover'; import { NodeDetails } from '@/lib/components/nodeDetails'; +import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/popover'; import { useActiveSaveState, useSchemaStats } from '@/lib/data-access'; import React, { useEffect, useMemo, useRef, useState } from 'react'; import { Handle, NodeProps, Position, useViewport } from 'reactflow'; +import { QueryElementTypes, SchemaNode } from 'ts-common'; import { SchemaReactflowNodeWithFunctions } from '../../../model/reactflow'; import { SchemaPopUp } from '../SchemaPopUp/SchemaPopUp'; -import { QueryElementTypes, SchemaNode } from 'ts-common'; export const SchemaListEntityPill = React.memo(({ id, selected, data }: NodeProps<SchemaReactflowNodeWithFunctions>) => { const [openPopupLocation, setOpenPopupLocation] = useState<{ x: number; y: number } | null>(null); diff --git a/src/lib/schema/pills/nodes/popup/attribute-analytics-popup-menu.stories.tsx b/src/lib/schema/pills/nodes/popup/attribute-analytics-popup-menu.stories.tsx index aa7578c41..253a4bbfc 100644 --- a/src/lib/schema/pills/nodes/popup/attribute-analytics-popup-menu.stories.tsx +++ b/src/lib/schema/pills/nodes/popup/attribute-analytics-popup-menu.stories.tsx @@ -1,10 +1,10 @@ -import { Meta, StoryObj } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta, StoryObj } from '@storybook/react'; import { Provider } from 'react-redux'; import { ReactFlowProvider } from 'reactflow'; -import { AttributeAnalyticsPopupMenu } from './attribute-analytics-popup-menu'; import { AttributeCategory, NodeType } from '../../../model/reactflow'; +import { AttributeAnalyticsPopupMenu } from './attribute-analytics-popup-menu'; const Component: Meta<typeof AttributeAnalyticsPopupMenu> = { /* 👇 The title prop is optional. diff --git a/src/lib/schema/pills/nodes/popup/attribute-analytics-popup-menu.tsx b/src/lib/schema/pills/nodes/popup/attribute-analytics-popup-menu.tsx index 3ade99455..843bb3bb7 100644 --- a/src/lib/schema/pills/nodes/popup/attribute-analytics-popup-menu.tsx +++ b/src/lib/schema/pills/nodes/popup/attribute-analytics-popup-menu.tsx @@ -8,9 +8,8 @@ /* The comment above was added so the code coverage wouldn't count this file towards code coverage. * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ -import React from 'react'; -import { AttributeAnalyticsData } from '../../../model/reactflow'; import { NodeProps } from 'reactflow'; +import { AttributeAnalyticsData } from '../../../model/reactflow'; import './attribute-analytics-popup-menu.module.scss'; /** diff --git a/src/lib/schema/pills/nodes/popup/node-quality-relation-popup.stories.tsx b/src/lib/schema/pills/nodes/popup/node-quality-relation-popup.stories.tsx index 95739f5e3..30328810d 100644 --- a/src/lib/schema/pills/nodes/popup/node-quality-relation-popup.stories.tsx +++ b/src/lib/schema/pills/nodes/popup/node-quality-relation-popup.stories.tsx @@ -1,6 +1,5 @@ -import React from 'react'; -import { Meta } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; import { ReactFlowProvider } from 'reactflow'; diff --git a/src/lib/schema/pills/nodes/popup/popupmenus/attribute-analytics-popup-menu.stories.tsx b/src/lib/schema/pills/nodes/popup/popupmenus/attribute-analytics-popup-menu.stories.tsx index 7c776eed0..b0aaf197f 100644 --- a/src/lib/schema/pills/nodes/popup/popupmenus/attribute-analytics-popup-menu.stories.tsx +++ b/src/lib/schema/pills/nodes/popup/popupmenus/attribute-analytics-popup-menu.stories.tsx @@ -1,11 +1,10 @@ -import React from 'react'; -import { Meta, StoryObj } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta, StoryObj } from '@storybook/react'; import { Provider } from 'react-redux'; import { ReactFlowProvider } from 'reactflow'; -import { AttributeAnalyticsPopupMenu } from './attribute-analytics-popup-menu'; import { AttributeCategory, NodeType } from '../../../../model/reactflow'; +import { AttributeAnalyticsPopupMenu } from './attribute-analytics-popup-menu'; const Component: Meta<typeof AttributeAnalyticsPopupMenu> = { /* 👇 The title prop is optional. diff --git a/src/lib/schema/pills/nodes/popup/popupmenus/attribute-analytics-popup-menu.tsx b/src/lib/schema/pills/nodes/popup/popupmenus/attribute-analytics-popup-menu.tsx index 7f891fcb3..bf6f14b31 100644 --- a/src/lib/schema/pills/nodes/popup/popupmenus/attribute-analytics-popup-menu.tsx +++ b/src/lib/schema/pills/nodes/popup/popupmenus/attribute-analytics-popup-menu.tsx @@ -9,9 +9,8 @@ * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ -import React from 'react'; -import { AttributeAnalyticsData } from '../../../../model/reactflow'; import { NodeProps } from 'reactflow'; +import { AttributeAnalyticsData } from '../../../../model/reactflow'; /** * AttributeAnalyticsPopupMenuNode is the node that represents the popup menu that shows the attribute analytics for an entity or relation diff --git a/src/lib/schema/pills/nodes/popup/popupmenus/filterbar.stories.tsx b/src/lib/schema/pills/nodes/popup/popupmenus/filterbar.stories.tsx index bc37fce97..b8ee44c89 100644 --- a/src/lib/schema/pills/nodes/popup/popupmenus/filterbar.stories.tsx +++ b/src/lib/schema/pills/nodes/popup/popupmenus/filterbar.stories.tsx @@ -1,6 +1,5 @@ -import React from 'react'; -import { Meta } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; import { Filter } from './filterbar'; diff --git a/src/lib/schema/pills/nodes/popup/popupmenus/filterbar.tsx b/src/lib/schema/pills/nodes/popup/popupmenus/filterbar.tsx index 14dabe1f8..ecc7e01bf 100644 --- a/src/lib/schema/pills/nodes/popup/popupmenus/filterbar.tsx +++ b/src/lib/schema/pills/nodes/popup/popupmenus/filterbar.tsx @@ -9,7 +9,7 @@ * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ -import React, { useState } from 'react'; +import { useState } from 'react'; import { AttributeAnalyticsData, AttributeCategory } from '../../../../model/reactflow'; /** The typing for the props of the filter bar. */ diff --git a/src/lib/schema/pills/nodes/popup/popupmenus/node-quality-entity-popup.stories.tsx b/src/lib/schema/pills/nodes/popup/popupmenus/node-quality-entity-popup.stories.tsx index 0f499192a..28968a488 100644 --- a/src/lib/schema/pills/nodes/popup/popupmenus/node-quality-entity-popup.stories.tsx +++ b/src/lib/schema/pills/nodes/popup/popupmenus/node-quality-entity-popup.stories.tsx @@ -1,6 +1,5 @@ -import React from 'react'; -import { Meta } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; import { ReactFlowProvider } from 'reactflow'; import { NodeQualityEntityPopupNode } from './node-quality-entity-popup'; diff --git a/src/lib/schema/pills/nodes/popup/popupmenus/node-quality-entity-popup.tsx b/src/lib/schema/pills/nodes/popup/popupmenus/node-quality-entity-popup.tsx index 6a98b386f..8d3d9b164 100644 --- a/src/lib/schema/pills/nodes/popup/popupmenus/node-quality-entity-popup.tsx +++ b/src/lib/schema/pills/nodes/popup/popupmenus/node-quality-entity-popup.tsx @@ -9,7 +9,6 @@ * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ -import React from 'react'; import { NodeProps } from 'reactflow'; import { NodeQualityDataForEntities } from '../../../../model/reactflow'; diff --git a/src/lib/schema/pills/nodes/popup/popupmenus/node-quality-relation-popup.stories.tsx b/src/lib/schema/pills/nodes/popup/popupmenus/node-quality-relation-popup.stories.tsx index 5e993c9ca..cfe73e9b9 100644 --- a/src/lib/schema/pills/nodes/popup/popupmenus/node-quality-relation-popup.stories.tsx +++ b/src/lib/schema/pills/nodes/popup/popupmenus/node-quality-relation-popup.stories.tsx @@ -1,6 +1,5 @@ -import React from 'react'; -import { Meta } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; import { ReactFlowProvider } from 'reactflow'; import { NodeQualityRelationPopupNode } from './node-quality-relation-popup'; diff --git a/src/lib/schema/pills/nodes/popup/popupmenus/node-quality-relation-popup.tsx b/src/lib/schema/pills/nodes/popup/popupmenus/node-quality-relation-popup.tsx index 545f071a0..11fcfaeb6 100644 --- a/src/lib/schema/pills/nodes/popup/popupmenus/node-quality-relation-popup.tsx +++ b/src/lib/schema/pills/nodes/popup/popupmenus/node-quality-relation-popup.tsx @@ -9,7 +9,6 @@ * We do not test components/renderfunctions/styling files. * See testing plan for more details.*/ -import React from 'react'; import { NodeProps } from 'reactflow'; import { NodeQualityDataForRelations } from '../../../../model/reactflow'; diff --git a/src/lib/schema/pills/nodes/popup/popupmenus/searchbar.stories.tsx b/src/lib/schema/pills/nodes/popup/popupmenus/searchbar.stories.tsx index b4977b137..c993c4b0d 100644 --- a/src/lib/schema/pills/nodes/popup/popupmenus/searchbar.stories.tsx +++ b/src/lib/schema/pills/nodes/popup/popupmenus/searchbar.stories.tsx @@ -1,6 +1,5 @@ -import React from 'react'; -import { Meta } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; import { Search } from './searchbar'; diff --git a/src/lib/schema/pills/nodes/relation/SchemaListRelationPill.tsx b/src/lib/schema/pills/nodes/relation/SchemaListRelationPill.tsx index c0d8aaf5c..04c7926d3 100644 --- a/src/lib/schema/pills/nodes/relation/SchemaListRelationPill.tsx +++ b/src/lib/schema/pills/nodes/relation/SchemaListRelationPill.tsx @@ -3,11 +3,11 @@ import React, { useEffect, useMemo, useRef, useState } from 'react'; import { Handle, NodeProps, Position, useViewport } from 'reactflow'; import { SchemaReactflowRelationWithFunctions } from '../../../model/reactflow'; -import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/popover'; import { NodeDetails } from '@/lib/components/nodeDetails'; +import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/popover'; import { useActiveSaveState, useSchemaStats } from '@/lib/data-access'; +import { QueryElementTypes, SchemaEdge } from 'ts-common'; import { SchemaPopUp } from '../SchemaPopUp/SchemaPopUp'; -import { SchemaEdge, QueryElementTypes } from 'ts-common'; export const SchemaListRelationPill = React.memo(({ id, selected, data, ...props }: NodeProps<SchemaReactflowRelationWithFunctions>) => { const [openPopupLocation, setOpenPopupLocation] = useState<{ x: number; y: number } | null>(null); diff --git a/src/lib/schema/pills/nodes/relation/SchemaRelationPill.tsx b/src/lib/schema/pills/nodes/relation/SchemaRelationPill.tsx index 74a092707..3749cb640 100644 --- a/src/lib/schema/pills/nodes/relation/SchemaRelationPill.tsx +++ b/src/lib/schema/pills/nodes/relation/SchemaRelationPill.tsx @@ -1,12 +1,12 @@ -import React, { useState, useRef, useEffect, useMemo } from 'react'; -import { Handle, Position, NodeProps, useViewport } from 'reactflow'; -import { SchemaReactflowRelationWithFunctions } from '../../../model/reactflow'; -import { SchemaEdge, QueryElementTypes } from 'ts-common'; import { RelationPill } from '@/lib/components'; -import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/popover'; import { NodeDetails } from '@/lib/components/nodeDetails'; -import { SchemaPopUp } from '../SchemaPopUp/SchemaPopUp'; +import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/popover'; import { useActiveSaveState, useSchemaStats } from '@/lib/data-access'; +import React, { useEffect, useMemo, useRef, useState } from 'react'; +import { Handle, NodeProps, Position, useViewport } from 'reactflow'; +import { QueryElementTypes, SchemaEdge } from 'ts-common'; +import { SchemaReactflowRelationWithFunctions } from '../../../model/reactflow'; +import { SchemaPopUp } from '../SchemaPopUp/SchemaPopUp'; export const SchemaRelationPill = React.memo(({ id, selected, data, ...props }: NodeProps<SchemaReactflowRelationWithFunctions>) => { const [openPopupLocation, setOpenPopupLocation] = useState<{ x: number; y: number } | null>(null); diff --git a/src/lib/schema/schema-utils/flowUtils.test.tsx b/src/lib/schema/schema-utils/flowUtils.test.tsx index d6c66c1ae..3e5a9b191 100644 --- a/src/lib/schema/schema-utils/flowUtils.test.tsx +++ b/src/lib/schema/schema-utils/flowUtils.test.tsx @@ -1,16 +1,16 @@ -import { describe, it, expect, beforeEach } from 'vitest'; +import { describe, expect, it } from 'vitest'; import { Position } from 'reactflow'; import { - doBoxesOverlap, - makeBoundingBox, - getCenter, - capitalizeFirstLetter, calcWidthEntityNodeBox, calcWidthRelationNodeBox, calculateAttributeQuality, calculateEntityQuality, calculateRelationQuality, + capitalizeFirstLetter, + doBoxesOverlap, + getCenter, + makeBoundingBox, numberPredicates, } from './flowUtils'; diff --git a/src/lib/schema/schema-utils/index.ts b/src/lib/schema/schema-utils/index.ts index 5bb45e678..481fc4e13 100644 --- a/src/lib/schema/schema-utils/index.ts +++ b/src/lib/schema/schema-utils/index.ts @@ -1,3 +1,3 @@ -export * from './schemaUtils'; -export * from './schemaUsecases'; export * from './flowUtils'; +export * from './schemaUsecases'; +export * from './schemaUtils'; diff --git a/src/lib/schema/schema-utils/schemaUsecases.spec.ts b/src/lib/schema/schema-utils/schemaUsecases.spec.ts index 2e4957141..c1d8544c9 100644 --- a/src/lib/schema/schema-utils/schemaUsecases.spec.ts +++ b/src/lib/schema/schema-utils/schemaUsecases.spec.ts @@ -1,8 +1,8 @@ +import { SchemaReturnFormat } from 'ts-common'; import { describe, expect, it, test } from 'vitest'; import { movieSchemaRaw, northwindSchemaRaw, simpleSchemaRaw, twitterSchemaRaw } from '../../mock-data/schema'; import { SchemaGraphology } from '../model'; import { SchemaUtils } from './schemaUtils'; -import { SchemaReturnFormat } from 'ts-common'; describe('SchemaUsecases', () => { test.each([{ data: simpleSchemaRaw }, { data: movieSchemaRaw }, { data: northwindSchemaRaw }, { data: twitterSchemaRaw }])( diff --git a/src/lib/schema/schema-utils/schemaUsecases.ts b/src/lib/schema/schema-utils/schemaUsecases.ts index 486cab28d..c5df274be 100644 --- a/src/lib/schema/schema-utils/schemaUsecases.ts +++ b/src/lib/schema/schema-utils/schemaUsecases.ts @@ -1,9 +1,9 @@ -import { SchemaReactflowNodeWithFunctions, SchemaReactflowRelationWithFunctions } from '../model/reactflow'; import Graph from 'graphology'; import { Attributes } from 'graphology-types'; -import { MarkerType, Edge, Node } from 'reactflow'; -import { SchemaGraphology } from '../model'; +import { Edge, MarkerType, Node } from 'reactflow'; import { QueryElementTypes } from 'ts-common'; +import { SchemaGraphology } from '../model'; +import { SchemaReactflowNodeWithFunctions, SchemaReactflowRelationWithFunctions } from '../model/reactflow'; //TODO does not belong here; maybe should go into the GraphPolarisThemeProvider diff --git a/src/lib/schema/schema-utils/schemaUtils.spec.ts b/src/lib/schema/schema-utils/schemaUtils.spec.ts index 44bd644b9..8725ebaf8 100644 --- a/src/lib/schema/schema-utils/schemaUtils.spec.ts +++ b/src/lib/schema/schema-utils/schemaUtils.spec.ts @@ -1,5 +1,5 @@ +import { describe, expect, it } from 'vitest'; import { SchemaUtils } from './schemaUtils'; -import { assert, describe, expect, it } from 'vitest'; describe('Schema Utils', () => { it('should expose a class SchemaUtils', () => { diff --git a/src/lib/sidebar/index.tsx b/src/lib/sidebar/index.tsx index 341e16e64..ccc0df1b0 100644 --- a/src/lib/sidebar/index.tsx +++ b/src/lib/sidebar/index.tsx @@ -1,8 +1,7 @@ -import React from 'react'; -import { Button, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../components'; -import ColorMode from '../components/color-mode'; import { FeatureEnabled } from '@/lib/components/featureFlags'; import { useActiveSaveState } from '..'; +import { Button, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../components'; +import ColorMode from '../components/color-mode'; export type SideNavTab = 'Schema' | 'Search' | undefined; diff --git a/src/lib/sidebar/search/NestedItem.tsx b/src/lib/sidebar/search/NestedItem.tsx index 14eec0c33..9cc376a6e 100644 --- a/src/lib/sidebar/search/NestedItem.tsx +++ b/src/lib/sidebar/search/NestedItem.tsx @@ -1,5 +1,3 @@ -import React from 'react'; - type NestedItemProps = { keyName: string; value: Record<string, any>; diff --git a/src/lib/sidebar/search/SearchBar.tsx b/src/lib/sidebar/search/SearchBar.tsx index 191d3347e..f85cd4b3b 100644 --- a/src/lib/sidebar/search/SearchBar.tsx +++ b/src/lib/sidebar/search/SearchBar.tsx @@ -1,4 +1,6 @@ -import React, { useRef, useState, useEffect } from 'react'; +import { useEffect, useRef, useState } from 'react'; +import { defaultGraph } from 'ts-common'; +import { Button, Panel, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../components'; import { AppDispatch, useActiveQuery, @@ -15,10 +17,8 @@ import { addSearchResultQueryBuilder, addSearchResultSchema, } from '../../data-access/store/searchResultSlice'; -import { filterData } from './similarity'; -import { Button, Panel, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../components'; import { NestedItem } from './NestedItem'; -import { QueryMultiGraph, defaultGraph } from 'ts-common'; +import { filterData } from './similarity'; const SIMILARITY_THRESHOLD = 0.7; diff --git a/src/lib/vis/common/types.ts b/src/lib/vis/common/types.ts index 26c13879e..6877aff7b 100644 --- a/src/lib/vis/common/types.ts +++ b/src/lib/vis/common/types.ts @@ -1,8 +1,7 @@ -import { FC } from 'react'; -import { GraphQueryResult } from '../../data-access/store/graphQueryResultSlice'; +import React from 'react'; +import { EdgeQueryResult, GraphStatistics, ML, NodeQueryResult, XYPosition } from 'ts-common'; +import type { AppDispatch, GraphQueryResult } from '../../data-access'; import { SchemaGraph } from '../../schema'; -import type { AppDispatch } from '../../data-access'; -import { ML, GraphStatistics, NodeQueryResult, EdgeQueryResult, XYPosition } from 'ts-common'; export type VisualizationSettingsType = { uuid?: string; // unique identifier for the visualization @@ -13,7 +12,7 @@ export type VisualizationSettingsType = { export type VISComponentType<T = object> = { component: React.FC<VisualizationPropTypes<T>>; - settingsComponent: FC<VisualizationSettingsPropTypes<T>>; + settingsComponent: React.FC<VisualizationSettingsPropTypes<T>>; settings: T; exportImage: () => void; }; diff --git a/src/lib/vis/components/VisualizationPanel.tsx b/src/lib/vis/components/VisualizationPanel.tsx index a8781866e..d5b0700df 100644 --- a/src/lib/vis/components/VisualizationPanel.tsx +++ b/src/lib/vis/components/VisualizationPanel.tsx @@ -1,25 +1,15 @@ -import React, { Suspense, useEffect, useState } from 'react'; -import { - useActiveQuery, - useActiveSaveState, - useAppDispatch, - useGraphQuery, - useGraphQueryResult, - useGraphQueryResultMeta, - useML, - useSchemaGraph, - useVisualization, -} from '@/lib/data-access'; -import VisualizationTabBar from './VisualizationTabBar'; -import { Recommender, NoData, Querying } from '../views'; -import { resultSetFocus, resultSetSelection, unSelect } from '../../data-access/store/interactionSlice'; -import { updateVisualization, addVisualization } from '../../data-access/store/visualizationSlice'; -import { VisualizationPropTypes, VISComponentType } from '../common'; +import { PopoverProvider } from '@/lib'; +import { useActiveSaveState, useAppDispatch, useGraphQuery, useML, useSchemaGraph, useVisualization } from '@/lib/data-access'; +import React, { useEffect, useState } from 'react'; +import { EdgeQueryResult, NodeQueryResult } from 'ts-common'; import { ErrorBoundary } from '../../components/errorBoundary'; -import { addError } from '../../data-access/store/configSlice'; import { canViewFeature } from '../../components/featureFlags'; -import { NodeQueryResult, EdgeQueryResult } from 'ts-common'; -import { PopoverProvider } from '@/lib'; +import { addError } from '../../data-access/store/configSlice'; +import { resultSetFocus, resultSetSelection, unSelect } from '../../data-access/store/interactionSlice'; +import { addVisualization, updateVisualization } from '../../data-access/store/visualizationSlice'; +import { VISComponentType, VisualizationPropTypes } from '../common'; +import { NoData, Querying, Recommender } from '../views'; +import VisualizationTabBar from './VisualizationTabBar'; type PromiseFunc = () => Promise<{ default: VISComponentType<any> }>; export const Visualizations: Record<string, PromiseFunc> = { diff --git a/src/lib/vis/components/VisualizationTabBar.tsx b/src/lib/vis/components/VisualizationTabBar.tsx index d916fab93..8beb831b4 100644 --- a/src/lib/vis/components/VisualizationTabBar.tsx +++ b/src/lib/vis/components/VisualizationTabBar.tsx @@ -1,8 +1,10 @@ -import { useState, useEffect, useRef } from 'react'; +import { Tab, Tabs } from '@/lib/components'; +import { resultSetFocus } from '@/lib/data-access/store/interactionSlice'; +import { useEffect, useRef, useState } from 'react'; +import Sortable from 'sortablejs'; import { Button, DropdownContainer, DropdownItem, DropdownItemContainer, DropdownTrigger, Input } from '../../components'; -import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../components/tooltip'; import { ControlContainer } from '../../components/controls'; -import { Tabs, Tab } from '@/lib/components'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../components/tooltip'; import { useActiveSaveState, useAppDispatch, useVisualization } from '../../data-access'; import { addVisualization, @@ -11,11 +13,9 @@ import { setActiveVisualization, updateActiveVisualizationAttributes, } from '../../data-access/store/visualizationSlice'; +import { VisualizationSettingsType } from '../common'; import { VisualizationsConfig } from './config'; import { Visualizations } from './VisualizationPanel'; -import Sortable from 'sortablejs'; -import { VisualizationSettingsType } from '../common'; -import { resultSetFocus } from '@/lib/data-access/store/interactionSlice'; export default function VisualizationTabBar(props: { fullSize: () => void; exportImage: () => void; handleSelect: () => void }) { const { activeVisualizationIndex, openVisualizationArray } = useVisualization(); diff --git a/src/lib/vis/components/config/SelectionConfig.tsx b/src/lib/vis/components/config/SelectionConfig.tsx index cf1c464e2..72360bad9 100644 --- a/src/lib/vis/components/config/SelectionConfig.tsx +++ b/src/lib/vis/components/config/SelectionConfig.tsx @@ -1,8 +1,7 @@ +import { unSelect } from '@/lib/data-access/store/interactionSlice'; import React from 'react'; -import { SelectionStateI, unSelect } from '@/lib/data-access/store/interactionSlice'; import { useDispatch } from 'react-redux'; import { Button, EntityPill, useSelection } from '../../..'; -import { SettingsHeader } from './components'; export const SelectionConfig = () => { const selection = useSelection(); diff --git a/src/lib/vis/components/config/VisualizationConfig.tsx b/src/lib/vis/components/config/VisualizationConfig.tsx index d4d9051b6..dd31b05ec 100644 --- a/src/lib/vis/components/config/VisualizationConfig.tsx +++ b/src/lib/vis/components/config/VisualizationConfig.tsx @@ -1,12 +1,12 @@ -import { JsonIconSm, JsonIconMd, JsonIconLg } from '../../icons/JsonIcon'; -import { MatrixIconSm, MatrixIconMd, MatrixIconLg } from '../../icons/MatrixIcon'; -import { MapIconSm, MapIconMd, MapIconLg } from '../../icons/MapIcon'; -import { NodeLinkIconSm, NodeLinkIconMd, NodeLinkIconLg } from '../../icons/NodeLinkIcon'; -import { PaohIconSm, PaohIconMd, PaohIconLg } from '../../icons/PaohIcon'; -import { SemSubsIconSm, SemSubsIconMd, SemSubsIconLg } from '../../icons/SemSubsIcon'; -import { TableIconSm, TableIconMd, TableIconLg } from '../../icons/TableIcon'; -import { Vis0DIconSm, Vis0DIconMd, Vis0DIconLg } from '../../icons/Vis0DIcon'; -import { Vis1DIconSm, Vis1DIconMd, Vis1DIconLg } from '../../icons/Vis1DIcon'; +import { JsonIconLg, JsonIconMd, JsonIconSm } from '../../icons/JsonIcon'; +import { MapIconLg, MapIconMd, MapIconSm } from '../../icons/MapIcon'; +import { MatrixIconLg, MatrixIconMd, MatrixIconSm } from '../../icons/MatrixIcon'; +import { NodeLinkIconLg, NodeLinkIconMd, NodeLinkIconSm } from '../../icons/NodeLinkIcon'; +import { PaohIconLg, PaohIconMd, PaohIconSm } from '../../icons/PaohIcon'; +import { SemSubsIconLg, SemSubsIconMd, SemSubsIconSm } from '../../icons/SemSubsIcon'; +import { TableIconLg, TableIconMd, TableIconSm } from '../../icons/TableIcon'; +import { Vis0DIconLg, Vis0DIconMd, Vis0DIconSm } from '../../icons/Vis0DIcon'; +import { Vis1DIconLg, Vis1DIconMd, Vis1DIconSm } from '../../icons/Vis1DIcon'; export type IconSize = 'sm' | 'md' | 'lg'; diff --git a/src/lib/vis/components/config/VisualizationSettings.tsx b/src/lib/vis/components/config/VisualizationSettings.tsx index ee602bfe5..c039f8066 100644 --- a/src/lib/vis/components/config/VisualizationSettings.tsx +++ b/src/lib/vis/components/config/VisualizationSettings.tsx @@ -1,8 +1,8 @@ -import React, { Suspense, useEffect, useMemo, useState } from 'react'; -import { Input, Visualizations, useAppDispatch, useGraphQueryResultMeta, useVisualization } from '../../..'; -import { SettingsHeader } from './components'; import { updateActiveVisualizationAttributes } from '@/lib/data-access/store/visualizationSlice'; +import React, { Suspense, useEffect, useMemo, useState } from 'react'; +import { Visualizations, useAppDispatch, useGraphQueryResultMeta, useVisualization } from '../../..'; import { VisualizationSettingsPropTypes, VisualizationSettingsType } from '../../common'; +import { SettingsHeader } from './components'; export function VisualizationSettings(props: { className?: string }) { // const manager = VisualizationManager(); diff --git a/src/lib/vis/components/config/components.tsx b/src/lib/vis/components/config/components.tsx index 6f704987c..b48eb97e1 100644 --- a/src/lib/vis/components/config/components.tsx +++ b/src/lib/vis/components/config/components.tsx @@ -1,4 +1,4 @@ -import React, { ReactNode } from 'react'; +import { ReactNode } from 'react'; type SettingsContainerProps = { children: ReactNode; diff --git a/src/lib/vis/components/config/index.tsx b/src/lib/vis/components/config/index.tsx index 6d8c900cc..7c962a752 100644 --- a/src/lib/vis/components/config/index.tsx +++ b/src/lib/vis/components/config/index.tsx @@ -1,3 +1,3 @@ -export { VisualizationSettings as VisualizationConfigPanel } from './VisualizationSettings'; -export { VisualizationsConfig } from './VisualizationConfig'; export { SettingsContainer, SettingsHeader } from './components'; +export { VisualizationsConfig } from './VisualizationConfig'; +export { VisualizationSettings as VisualizationConfigPanel } from './VisualizationSettings'; diff --git a/src/lib/vis/views/NoData.tsx b/src/lib/vis/views/NoData.tsx index 8d30fdcb7..d0c0d79f8 100644 --- a/src/lib/vis/views/NoData.tsx +++ b/src/lib/vis/views/NoData.tsx @@ -1,5 +1,5 @@ -import { Button } from '../../components'; import { useActiveQuery, useGraphQuery, useSessionCache } from '@/lib/data-access'; +import { Button } from '../../components'; export function NoData() { const activeQuery = useActiveQuery(); diff --git a/src/lib/vis/views/Querying.tsx b/src/lib/vis/views/Querying.tsx index d466a33ae..98b479f8e 100644 --- a/src/lib/vis/views/Querying.tsx +++ b/src/lib/vis/views/Querying.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { LoadingSpinner } from '../../components'; export function Querying() { diff --git a/src/lib/vis/views/Recommender.tsx b/src/lib/vis/views/Recommender.tsx index f1c6f5045..0c85db13d 100644 --- a/src/lib/vis/views/Recommender.tsx +++ b/src/lib/vis/views/Recommender.tsx @@ -1,10 +1,10 @@ -import { useState, useRef } from 'react'; +import { resultSetFocus } from '@/lib/data-access/store/interactionSlice'; +import { useRef, useState } from 'react'; import Info from '../../components/info'; -import { addVisualization } from '../../data-access/store/visualizationSlice'; import { useActiveSaveState, useAppDispatch } from '../../data-access'; +import { addVisualization } from '../../data-access/store/visualizationSlice'; import { Visualizations } from '../components/VisualizationPanel'; import { VisualizationsConfig } from '../components/config/VisualizationConfig'; -import { resultSetFocus } from '@/lib/data-access/store/interactionSlice'; export function Recommender() { const dispatch = useAppDispatch(); diff --git a/src/lib/vis/views/index.tsx b/src/lib/vis/views/index.tsx index d16d4d610..20a8ab576 100644 --- a/src/lib/vis/views/index.tsx +++ b/src/lib/vis/views/index.tsx @@ -1,3 +1,3 @@ export { NoData } from './NoData'; -export { Recommender } from './Recommender'; export { Querying } from './Querying'; +export { Recommender } from './Recommender'; diff --git a/src/lib/vis/visualizations/arcplotvis/arcplotvis.spec.tsx b/src/lib/vis/visualizations/arcplotvis/arcplotvis.spec.tsx index 338394ddb..aa7054d2c 100644 --- a/src/lib/vis/visualizations/arcplotvis/arcplotvis.spec.tsx +++ b/src/lib/vis/visualizations/arcplotvis/arcplotvis.spec.tsx @@ -1,5 +1,4 @@ -import { render } from '@testing-library/react'; -import { assert, describe, expect, it } from 'vitest'; +import { describe, expect, it } from 'vitest'; //import RawJSONVis from './rawjsonvis'; diff --git a/src/lib/vis/visualizations/arcplotvis/arcplotvis.tsx b/src/lib/vis/visualizations/arcplotvis/arcplotvis.tsx index faf5b7fa7..fb50837fa 100644 --- a/src/lib/vis/visualizations/arcplotvis/arcplotvis.tsx +++ b/src/lib/vis/visualizations/arcplotvis/arcplotvis.tsx @@ -1,9 +1,8 @@ import { Input } from '@/lib/components/inputs'; -import { Edge, Node } from '@/lib/data-access'; -import { GraphStatistics } from '@/lib/statistics'; import { SettingsContainer } from '@/lib/vis/components/config'; import { scaleOrdinal, schemeCategory10, select, selectAll } from 'd3'; import React, { useEffect, useMemo, useRef } from 'react'; +import { NodeQueryResult } from 'ts-common'; import { VISComponentType, VisualizationPropTypes, VisualizationSettingsPropTypes } from '../../common'; import { ArcEdge, ArcNode } from './arcplotvis.types'; import ArcVisLine from './components/arcplotd3line'; @@ -57,7 +56,7 @@ export const ArcPlotVis = React.memo(({ data, settings, graphMetadata }: Visuali }; }, []); - const getNodeOrdering = (node: Node, index: number) => { + const getNodeOrdering = (node: NodeQueryResult, index: number) => { if (!settings.ordering) throw new Error('No ordering selected in settings: ' + settings.toString()); const OFFSET = 15; @@ -75,7 +74,7 @@ export const ArcPlotVis = React.memo(({ data, settings, graphMetadata }: Visuali } }; - function getNodeLabel(node: Node): string { + function getNodeLabel(node: NodeQueryResult): string { if (!settings.labelattribute) throw new Error('No label attribute selected in settings: ' + settings.toString()); switch (settings.labelattribute.toLowerCase()) { @@ -91,7 +90,7 @@ export const ArcPlotVis = React.memo(({ data, settings, graphMetadata }: Visuali } } - function getNodeSize(node: Node): number { + function getNodeSize(node: NodeQueryResult): number { if (!settings.sizeAttributeSelector) throw new Error('No label attribute selected in settings: ' + settings.toString()); return Math.random() * 10; @@ -110,10 +109,10 @@ export const ArcPlotVis = React.memo(({ data, settings, graphMetadata }: Visuali } const [dataNodes, dataLinks] = useMemo(() => { - const color = scaleOrdinal(schemeCategory10).domain(data.nodes.map(node => node.label)); - const colorScale = scaleOrdinal(schemeCategory10).domain(data.edges.map(edge => edge.attributes.Type as string)); + const color = scaleOrdinal(schemeCategory10).domain(data.graph.nodes.map(node => node.label)); + const colorScale = scaleOrdinal(schemeCategory10).domain(data.graph.edges.map(edge => edge.attributes.Type as string)); - const dataNodes = data.nodes.map((node, index) => { + const dataNodes = data.graph.nodes.map((node, index) => { const x = getNodeOrdering(node, index); return { ...node, @@ -125,7 +124,7 @@ export const ArcPlotVis = React.memo(({ data, settings, graphMetadata }: Visuali } as ArcNode; }) as ArcNode[]; - const dataLinks = data.edges.map((edge: Edge) => { + const dataLinks = data.graph.edges.map(edge => { const fromNode = dataNodes.find((node: ArcNode) => node._id === edge.from); const toNode = dataNodes.find((node: ArcNode) => node._id === edge.to); // const fromNode = dataNodes.find((node: ArcNode) => node._id === edge.from); @@ -246,7 +245,7 @@ export const ArcPlotVis = React.memo(({ data, settings, graphMetadata }: Visuali ); }); -const ArcPlotVisSettings = ({ settings, graphMetadata, updateSettings }: VisualizationSettingsPropTypes<ArcVisProps>) => { +const ArcPlotVisSettings = ({ settings, updateSettings }: VisualizationSettingsPropTypes<ArcVisProps>) => { return ( <SettingsContainer> <Input @@ -254,7 +253,7 @@ const ArcPlotVisSettings = ({ settings, graphMetadata, updateSettings }: Visuali label="Select an Ordering" value={settings.ordering} options={['Group', 'Frequency', 'Name']} - onChange={val => updateSettings({ ordering: val.toString() })} + onChange={val => updateSettings({ ordering: val?.toString() })} /> <Input type="dropdown" diff --git a/src/lib/vis/visualizations/arcplotvis/arcplotvis.types.ts b/src/lib/vis/visualizations/arcplotvis/arcplotvis.types.ts index eada2a7ae..4ad1c0875 100644 --- a/src/lib/vis/visualizations/arcplotvis/arcplotvis.types.ts +++ b/src/lib/vis/visualizations/arcplotvis/arcplotvis.types.ts @@ -1,13 +1,13 @@ -import { Edge, Node } from '@/lib/data-access'; +import { EdgeQueryResult, NodeQueryResult } from 'ts-common'; -export type ArcEdge = Edge & { +export type ArcEdge = EdgeQueryResult & { x1: number; x2: number; thickness: number; fill: string; }; -export type ArcNode = Node & { +export type ArcNode = NodeQueryResult & { x: number; y: number; size: number; diff --git a/src/lib/vis/visualizations/arcplotvis/components/arcplotd3links.tsx b/src/lib/vis/visualizations/arcplotvis/components/arcplotd3links.tsx index 3804064fd..29983ca37 100644 --- a/src/lib/vis/visualizations/arcplotvis/components/arcplotd3links.tsx +++ b/src/lib/vis/visualizations/arcplotvis/components/arcplotd3links.tsx @@ -1,7 +1,6 @@ import { ArcEdge, ArcNode } from '../arcplotvis.types'; import { arc, select, selectAll } from 'd3'; -import { config } from 'process'; import React from 'react'; import { configStyle } from '../arcplotvis'; diff --git a/src/lib/vis/visualizations/index.tsx b/src/lib/vis/visualizations/index.tsx index ca8bf58d6..e4aea884e 100644 --- a/src/lib/vis/visualizations/index.tsx +++ b/src/lib/vis/visualizations/index.tsx @@ -1,8 +1,8 @@ -export * from './rawjsonvis'; +export * from './matrixvis/matrixvis'; export * from './nodelinkvis/nodelinkvis'; export * from './paohvis/paohvis'; -export * from './tablevis/tablevis'; -export * from './matrixvis/matrixvis'; +export * from './rawjsonvis'; export * from './semanticsubstratesvis/semanticsubstratesvis'; -export * from './vis1D/Vis1D'; +export * from './tablevis/tablevis'; export * from './vis0D/Vis0D'; +export * from './vis1D/Vis1D'; diff --git a/src/lib/vis/visualizations/mapvis/components/ActionBar.tsx b/src/lib/vis/visualizations/mapvis/components/ActionBar.tsx index 99720ef04..e166e7967 100644 --- a/src/lib/vis/visualizations/mapvis/components/ActionBar.tsx +++ b/src/lib/vis/visualizations/mapvis/components/ActionBar.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { Icon } from '@/lib/components'; import { BoundingBoxType } from '../mapvis.types'; import { SearchBar } from './SearchBar'; diff --git a/src/lib/vis/visualizations/mapvis/components/Attribution.tsx b/src/lib/vis/visualizations/mapvis/components/Attribution.tsx index 3ed032f0d..d6c77c2d8 100644 --- a/src/lib/vis/visualizations/mapvis/components/Attribution.tsx +++ b/src/lib/vis/visualizations/mapvis/components/Attribution.tsx @@ -1,5 +1,3 @@ -import React from 'react'; - export function Attribution() { return ( <div className="absolute right-0 bottom-0 p-1 bg-secondary-200 bg-opacity-75 text-xs"> diff --git a/src/lib/vis/visualizations/mapvis/components/MapDataInspector.tsx b/src/lib/vis/visualizations/mapvis/components/MapDataInspector.tsx index 234665cfc..2f93ad314 100644 --- a/src/lib/vis/visualizations/mapvis/components/MapDataInspector.tsx +++ b/src/lib/vis/visualizations/mapvis/components/MapDataInspector.tsx @@ -1,8 +1,6 @@ -import React from 'react'; -import { NodeType } from '../../nodelinkvis/types'; -import { GeoJsonType } from '../mapvis.types'; -import { SearchResultType } from '../mapvis.types'; import { PopoverProvider } from '@/lib/components'; +import { NodeType } from '../../nodelinkvis/types'; +import { GeoJsonType, SearchResultType } from '../mapvis.types'; export type NodelinkPopupProps = { type: 'node' | 'area' | 'location'; @@ -93,7 +91,7 @@ export const MapDataInspector = (props: NodelinkPopupProps) => { const { type, data } = props; return ( - <PopoverProvider delay={100}> + <PopoverProvider> <div className="text-[0.9rem] min-w-[10rem]"> <div className="p-0"> <div className="px-2.5 text-[0.8rem]"> diff --git a/src/lib/vis/visualizations/mapvis/components/MapSettings.tsx b/src/lib/vis/visualizations/mapvis/components/MapSettings.tsx index 35576773a..8e98ffb98 100644 --- a/src/lib/vis/visualizations/mapvis/components/MapSettings.tsx +++ b/src/lib/vis/visualizations/mapvis/components/MapSettings.tsx @@ -1,8 +1,8 @@ -import React, { useEffect, useMemo } from 'react'; -import { SettingsContainer } from '../../../components/config'; -import { layerSettings, LayerTypes, layerTypes } from '../layers'; +import { useEffect, useMemo } from 'react'; import { Input } from '../../../..'; import { VisualizationSettingsPropTypes } from '../../../common'; +import { SettingsContainer } from '../../../components/config'; +import { layerSettings, LayerTypes, layerTypes } from '../layers'; import { MapProps } from '../mapvis'; import { LayerSettingsType } from '../mapvis.types'; diff --git a/src/lib/vis/visualizations/mapvis/components/SearchBar.tsx b/src/lib/vis/visualizations/mapvis/components/SearchBar.tsx index c5dd5766f..2c4cd4479 100644 --- a/src/lib/vis/visualizations/mapvis/components/SearchBar.tsx +++ b/src/lib/vis/visualizations/mapvis/components/SearchBar.tsx @@ -1,7 +1,7 @@ -import React, { useState } from 'react'; import { Button, Input } from '@/lib/components'; import { useAppDispatch } from '@/lib/data-access'; import { addError } from '@/lib/data-access/store/configSlice'; +import React, { useState } from 'react'; import { BoundingBoxType } from '../mapvis.types'; interface SearchBarProps { @@ -37,7 +37,7 @@ export const SearchBar: React.FC<SearchBarProps> = ({ onSearch }) => { return ( <div className="absolute bottom-0 left-1/2 transform -translate-x-1/2 z-50 m-1 p-2 bg-light shadow-md rounded w-full max-w-xl"> <div className="flex gap-2 items-center"> - <Input type="text" size="xs" value={query} onChange={value => setQuery(value)} /> + <Input label="" type="text" size="xs" value={query} onChange={value => setQuery(value)} /> <Button label="Search" size="xs" onClick={handleSearch} disabled={isLoading} /> </div> </div> diff --git a/src/lib/vis/visualizations/mapvis/components/index.ts b/src/lib/vis/visualizations/mapvis/components/index.ts index ca9aded7f..8e11a3a3c 100644 --- a/src/lib/vis/visualizations/mapvis/components/index.ts +++ b/src/lib/vis/visualizations/mapvis/components/index.ts @@ -1,4 +1,4 @@ export * from './ActionBar'; export * from './Attribution'; -export * from './MapSettings'; export * from './MapDataInspector.tsx'; +export * from './MapSettings'; diff --git a/src/lib/vis/visualizations/mapvis/hooks/useCoordinateLookup.tsx b/src/lib/vis/visualizations/mapvis/hooks/useCoordinateLookup.tsx index be8565732..ef5cfa79e 100644 --- a/src/lib/vis/visualizations/mapvis/hooks/useCoordinateLookup.tsx +++ b/src/lib/vis/visualizations/mapvis/hooks/useCoordinateLookup.tsx @@ -1,8 +1,8 @@ import { useMemo } from 'react'; -import { LocationInfo, Coordinate } from '../mapvis.types'; -import { Node } from '@/lib/data-access'; +import { NodeQueryResult } from 'ts-common'; +import { Coordinate, LocationInfo } from '../mapvis.types'; -export const useCoordinateLookup = (nodes: Node[], locationSettings: Record<string, LocationInfo>) => { +export const useCoordinateLookup = (nodes: NodeQueryResult[], locationSettings: Record<string, LocationInfo>) => { return useMemo(() => { return nodes.reduce( (acc, node) => { diff --git a/src/lib/vis/visualizations/mapvis/hooks/useSelectionLayer.tsx b/src/lib/vis/visualizations/mapvis/hooks/useSelectionLayer.tsx index a9c2bd37b..9114c876c 100644 --- a/src/lib/vis/visualizations/mapvis/hooks/useSelectionLayer.tsx +++ b/src/lib/vis/visualizations/mapvis/hooks/useSelectionLayer.tsx @@ -1,5 +1,5 @@ -import { useMemo } from 'react'; import { SelectionLayer } from '@deck.gl-community/editable-layers'; +import { useMemo } from 'react'; export const useSelectionLayer = (selectingRectangle: boolean, layerIds: string[], onSelect: (pickingInfos: any[]) => void) => { return useMemo(() => { diff --git a/src/lib/vis/visualizations/mapvis/layers/choropleth-layer/ChoroplethLayer.tsx b/src/lib/vis/visualizations/mapvis/layers/choropleth-layer/ChoroplethLayer.tsx index 303f46b78..32786373d 100644 --- a/src/lib/vis/visualizations/mapvis/layers/choropleth-layer/ChoroplethLayer.tsx +++ b/src/lib/vis/visualizations/mapvis/layers/choropleth-layer/ChoroplethLayer.tsx @@ -1,10 +1,9 @@ -import React from 'react'; -import { CompositeLayer, Layer } from 'deck.gl'; import { ArcLayer, GeoJsonLayer } from '@deck.gl/layers'; -import { netherlands } from '../../../../../mock-data/geo-json'; -import { Node, LayerProps, CompositeLayerType, Coordinate } from '../../mapvis.types'; -import { geoCentroid, geoContains } from 'd3'; import * as d3 from 'd3'; +import { geoCentroid, geoContains } from 'd3'; +import { CompositeLayer, Layer } from 'deck.gl'; +import { netherlands } from '../../../../../mock-data/geo-json'; +import { CompositeLayerType, Coordinate, LayerProps, Node } from '../../mapvis.types'; const colorScales: Record<string, any> = { green: d3.interpolateGreens, @@ -22,7 +21,7 @@ export class ChoroplethLayer extends CompositeLayer<CompositeLayerType> { super(props); } - updateState({ props, oldProps, changeFlags }: { props: any; oldProps: any; context: any; changeFlags: any }) { + updateState({ props, changeFlags }: { props: any; oldProps: any; context: any; changeFlags: any }) { if (changeFlags.dataChanged) { const geojsonData = this.concatData(netherlands, props.data.nodes); this.setState({ geojsonData }); @@ -86,19 +85,19 @@ export class ChoroplethLayer extends CompositeLayer<CompositeLayerType> { break; case 'Edge count': - updateMinMax(data.edges.filter(edge => nodes.includes(edge.from) && nodes.includes(edge.to)).length); + updateMinMax(data.graph.edges.filter(edge => nodes.includes(edge.from) && nodes.includes(edge.to)).length); break; case 'Incoming edges': - updateMinMax(data.edges.filter(edge => nodes.includes(edge.to)).length); + updateMinMax(data.graph.edges.filter(edge => nodes.includes(edge.to)).length); break; case 'Outgoing edges': - updateMinMax(data.edges.filter(edge => nodes.includes(edge.from)).length); + updateMinMax(data.graph.edges.filter(edge => nodes.includes(edge.from)).length); break; case 'Connected edges': - updateMinMax(data.edges.filter(edge => nodes.includes(edge.from) || nodes.includes(edge.to)).length); + updateMinMax(data.graph.edges.filter(edge => nodes.includes(edge.from) || nodes.includes(edge.to)).length); break; case 'Attribute': @@ -131,16 +130,16 @@ export class ChoroplethLayer extends CompositeLayer<CompositeLayerType> { return this.getColorFromScale(nodes.length); case 'Edge count': - return this.getColorFromScale(data.edges.filter(edge => nodes.includes(edge.from) && nodes.includes(edge.to)).length); + return this.getColorFromScale(data.graph.edges.filter(edge => nodes.includes(edge.from) && nodes.includes(edge.to)).length); case 'Incoming edges': - return this.getColorFromScale(data.edges.filter(edge => nodes.includes(edge.to)).length); + return this.getColorFromScale(data.graph.edges.filter(edge => nodes.includes(edge.to)).length); case 'Outgoing edges': - return this.getColorFromScale(data.edges.filter(edge => nodes.includes(edge.from)).length); + return this.getColorFromScale(data.graph.edges.filter(edge => nodes.includes(edge.from)).length); case 'Connected edges': - return this.getColorFromScale(data.edges.filter(edge => nodes.includes(edge.from) || nodes.includes(edge.to)).length); + return this.getColorFromScale(data.graph.edges.filter(edge => nodes.includes(edge.from) || nodes.includes(edge.to)).length); case 'Attribute': return [0, 0, 0]; @@ -180,7 +179,7 @@ export class ChoroplethLayer extends CompositeLayer<CompositeLayerType> { if (hoverObject && layerSettings.enableBrushing) { const nodes = (hoverObject as { properties?: { nodes: string[] } }).properties?.nodes ?? []; if (nodes) { - const filteredEdges = data.edges.filter(edge => nodes.includes(edge.from) || nodes.includes(edge.to)); + const filteredEdges = data.graph.edges.filter(edge => nodes.includes(edge.from) || nodes.includes(edge.to)); // @ts-expect-error d3 types are not up to date const centroid = geoCentroid(hoverObject); diff --git a/src/lib/vis/visualizations/mapvis/layers/choropleth-layer/ChoroplethOptions.tsx b/src/lib/vis/visualizations/mapvis/layers/choropleth-layer/ChoroplethOptions.tsx index 1bdf127ee..313c3518e 100644 --- a/src/lib/vis/visualizations/mapvis/layers/choropleth-layer/ChoroplethOptions.tsx +++ b/src/lib/vis/visualizations/mapvis/layers/choropleth-layer/ChoroplethOptions.tsx @@ -1,9 +1,8 @@ -import React, { useEffect } from 'react'; -import { ColorPicker } from '@/lib/components/colorComponents/colorPicker'; -import { MapProps } from '../../mapvis'; import { DropdownColorLegend, EntityPill, Input, RelationPill } from '@/lib/components'; -import { LayerSettingsComponentType } from '../../mapvis.types'; import { Accordion, AccordionBody, AccordionHead, AccordionItem } from '@/lib/components/accordion'; +import { useEffect } from 'react'; +import { MapProps } from '../../mapvis'; +import { LayerSettingsComponentType } from '../../mapvis.types'; const areaColoringStrategies = ['Node count', 'Edge count', 'Incoming edges', 'Outgoing edges', 'Connected edges', 'Attribute']; diff --git a/src/lib/vis/visualizations/mapvis/layers/heatmap-layer/HeatLayer.tsx b/src/lib/vis/visualizations/mapvis/layers/heatmap-layer/HeatLayer.tsx index db7e7a7d9..8e48ba007 100644 --- a/src/lib/vis/visualizations/mapvis/layers/heatmap-layer/HeatLayer.tsx +++ b/src/lib/vis/visualizations/mapvis/layers/heatmap-layer/HeatLayer.tsx @@ -1,7 +1,5 @@ -import React from 'react'; import { CompositeLayer, HeatmapLayer, Layer } from 'deck.gl'; import { CompositeLayerType, LayerProps } from '../../mapvis.types'; -import { Node } from '@/lib/data-access'; export class HeatLayer extends CompositeLayer<CompositeLayerType> { static type = 'heatmap'; @@ -27,7 +25,7 @@ export class HeatLayer extends CompositeLayer<CompositeLayerType> { this._layers[layerId] = new HeatmapLayer<Node>({ id: layerId, - data: data.nodes.filter((node: Node) => node.label === label), + data: data.graph.nodes.filter(node => node.label === label), visible: !layerSettings.nodes[label].hidden, getPosition: (d: any) => getNodeLocation(d._id), getWeight: (d: any) => layerSettings.nodes[label].size, diff --git a/src/lib/vis/visualizations/mapvis/layers/heatmap-layer/HeatLayerOptions.tsx b/src/lib/vis/visualizations/mapvis/layers/heatmap-layer/HeatLayerOptions.tsx index 04986eb83..4683af96e 100644 --- a/src/lib/vis/visualizations/mapvis/layers/heatmap-layer/HeatLayerOptions.tsx +++ b/src/lib/vis/visualizations/mapvis/layers/heatmap-layer/HeatLayerOptions.tsx @@ -1,8 +1,8 @@ -import React, { useEffect } from 'react'; -import { MapProps } from '../../mapvis'; import { EntityPill, Input } from '@/lib/components'; -import { LayerSettingsComponentType } from '../../mapvis.types'; import { Accordion, AccordionBody, AccordionHead, AccordionItem } from '@/lib/components/accordion'; +import { useEffect } from 'react'; +import { MapProps } from '../../mapvis'; +import { LayerSettingsComponentType } from '../../mapvis.types'; export function HeatLayerOptions({ settings, diff --git a/src/lib/vis/visualizations/mapvis/layers/index.tsx b/src/lib/vis/visualizations/mapvis/layers/index.tsx index 92360935c..27952f5e0 100644 --- a/src/lib/vis/visualizations/mapvis/layers/index.tsx +++ b/src/lib/vis/visualizations/mapvis/layers/index.tsx @@ -1,13 +1,13 @@ +import { BitmapLayer, TileLayer } from 'deck.gl'; +import { MAP_PROVIDER } from '../config'; +import { MapProps } from '../mapvis'; +import { LayerSettingsComponentType } from '../mapvis.types'; import { ChoroplethLayer } from './choropleth-layer/ChoroplethLayer'; +import { ChoroplethOptions } from './choropleth-layer/ChoroplethOptions'; import { HeatLayer } from './heatmap-layer/HeatLayer'; +import { HeatLayerOptions } from './heatmap-layer/HeatLayerOptions'; import { NodeLinkLayer } from './nodelink-layer/NodeLinkLayer'; import { NodeLinkOptions } from './nodelink-layer/NodeLinkOptions'; -import { HeatLayerOptions } from './heatmap-layer/HeatLayerOptions'; -import { ChoroplethOptions } from './choropleth-layer/ChoroplethOptions'; -import { TileLayer, BitmapLayer } from 'deck.gl'; -import { MapProps } from '../mapvis'; -import { LayerSettingsComponentType } from '../mapvis.types'; -import { MAP_PROVIDER } from '../config'; export type LayerTypes = 'nodelink' | 'heatmap' | 'choropleth'; diff --git a/src/lib/vis/visualizations/mapvis/layers/nodelink-layer/NodeLinkLayer.tsx b/src/lib/vis/visualizations/mapvis/layers/nodelink-layer/NodeLinkLayer.tsx index c400cb4e2..c26e1738a 100644 --- a/src/lib/vis/visualizations/mapvis/layers/nodelink-layer/NodeLinkLayer.tsx +++ b/src/lib/vis/visualizations/mapvis/layers/nodelink-layer/NodeLinkLayer.tsx @@ -1,11 +1,10 @@ -import { CompositeLayer, Layer, Viewport } from 'deck.gl'; -import { LineLayer, ScatterplotLayer, TextLayer, SolidPolygonLayer } from '@deck.gl/layers'; -import { CompositeLayerType, Coordinate, LayerProps, EDGE_COLOR_DEFAULT } from '../../mapvis.types'; import { BrushingExtension, CollisionFilterExtension } from '@deck.gl/extensions'; -import { scaleLinear, ScaleLinear, color, interpolateRgb } from 'd3'; -import { nodeColorRGB } from '../../utils'; +import { LineLayer, ScatterplotLayer, SolidPolygonLayer, TextLayer } from '@deck.gl/layers'; +import { color, interpolateRgb, scaleLinear, ScaleLinear } from 'd3'; +import { CompositeLayer, Layer, Viewport } from 'deck.gl'; import { CategoricalStats, EdgeQueryResult, NodeQueryResult } from 'ts-common'; -import { MapEdgeData } from '../../mapvis.types'; +import { CompositeLayerType, Coordinate, EDGE_COLOR_DEFAULT, LayerProps, MapEdgeData } from '../../mapvis.types'; +import { nodeColorRGB } from '../../utils'; import { getCategories } from './NodeLinkOptions'; interface ColorScales { @@ -129,7 +128,7 @@ export class NodeLinkLayer extends CompositeLayer<CompositeLayerType> { const brushingExtension = new BrushingExtension(); const collisionFilter = new CollisionFilterExtension(); - const nodeLocations = data.nodes.reduce((acc: Record<string, Coordinate>, node: NodeQueryResult) => { + const nodeLocations = data.graph.nodes.reduce((acc: Record<string, Coordinate>, node: NodeQueryResult) => { const pos = getNodeLocation(node._id); if (pos && (pos[0] !== 0 || pos[1] !== 0)) { acc[node._id] = pos; @@ -137,7 +136,7 @@ export class NodeLinkLayer extends CompositeLayer<CompositeLayerType> { return acc; }, {}); - const hiddenNodes = new Set(data.nodes.filter(node => layerSettings.nodes[node.label]?.hidden).map(node => node._id)); + const hiddenNodes = new Set(data.graph.nodes.filter(node => layerSettings.nodes[node.label]?.hidden).map(node => node._id)); const showArrows = layerSettings?.showArrows; graphMetadata.edges.labels.forEach((label: string) => { @@ -167,7 +166,7 @@ export class NodeLinkLayer extends CompositeLayer<CompositeLayerType> { ay /= amag; } - const nodeTo = data.nodes.find(n => n._id == edge.to)!; + const nodeTo = data.graph.nodes.find(n => n._id == edge.to)!; const nodeRadius = wtz * getNodeSize(nodeTo, label); if (wtx - wsx != 0) wtx -= (nodeRadius / amag) * (wtx - wsx); @@ -210,7 +209,7 @@ export class NodeLinkLayer extends CompositeLayer<CompositeLayerType> { }; } }; - const edgeData = data.edges.flatMap(parseEdge).filter(edge => { + const edgeData = data.graph.edges.flatMap(parseEdge).filter(edge => { return edge != null && edge.from && edge.to && !edge.hidden; }); @@ -275,7 +274,7 @@ export class NodeLinkLayer extends CompositeLayer<CompositeLayerType> { getWidth: 1, getSourcePosition: d => d.from, getTargetPosition: d => d.to, - getColor: d => [0, 0, 0], + getColor: () => [0, 0, 0], }); } @@ -283,7 +282,7 @@ export class NodeLinkLayer extends CompositeLayer<CompositeLayerType> { const layerId = `${label}-nodes-scatterplot`; const textLayerId = `${label}-label-target`; - const nodes = data.nodes.filter(node => nodeLocations[node._id] && node.label === label); + const nodes = data.graph.nodes.filter(node => nodeLocations[node._id] && node.label === label); this._layers[layerId] = new ScatterplotLayer({ id: layerId, @@ -321,7 +320,7 @@ export class NodeLinkLayer extends CompositeLayer<CompositeLayerType> { stroked: true, updateTriggers: { getIcon: [selected], - getRadius: [layerSettings?.nodes[label]?.size, data.edges], + getRadius: [layerSettings?.nodes[label]?.size, data.graph.edges], getFillColor: [this.state.colorScales], }, }); @@ -352,7 +351,7 @@ export class NodeLinkLayer extends CompositeLayer<CompositeLayerType> { function getNodeSize(d: NodeQueryResult, label: string) { const baseSize = layerSettings?.nodes[label]?.size ?? 40; - const relationCount = data.edges.reduce((acc, edge) => { + const relationCount = data.graph.edges.reduce((acc, edge) => { if (edge.from === d._id || edge.to === d._id) { return acc + ((edge.attributes?.Count as number) ?? (edge.attributes?.count as number) ?? 1); } @@ -422,7 +421,7 @@ export class NodeLinkLayer extends CompositeLayer<CompositeLayerType> { const layerSettings = settings?.[NodeLinkLayer.type]; const edgeSettings = layerSettings?.edges?.[label] || {}; - const edges = data.edges.filter( + const edges = data.graph.edges.filter( (edge: EdgeQueryResult) => nodeLocations[edge.from] && nodeLocations[edge.to] && edge.to != edge.from && edge.label === label && !edgeSettings.hidden, ); @@ -432,7 +431,7 @@ export class NodeLinkLayer extends CompositeLayer<CompositeLayerType> { data: edges, getPosition: (d: EdgeQueryResult) => getEdgeLocation(d, this.context.viewport), getText: (d: EdgeQueryResult) => String(getEdgeLabel(d, edgeSettings)) || '', - getSize: (d: EdgeQueryResult) => 12, + getSize: () => 12, getAlignmentBaseline: 'center', getColor: EDGE_COLOR_DEFAULT, outlineColor: [255, 255, 255, 128], diff --git a/src/lib/vis/visualizations/mapvis/layers/nodelink-layer/NodeLinkOptions.tsx b/src/lib/vis/visualizations/mapvis/layers/nodelink-layer/NodeLinkOptions.tsx index 425bcee6f..ab24bde61 100644 --- a/src/lib/vis/visualizations/mapvis/layers/nodelink-layer/NodeLinkOptions.tsx +++ b/src/lib/vis/visualizations/mapvis/layers/nodelink-layer/NodeLinkOptions.tsx @@ -1,12 +1,12 @@ -import React, { useEffect } from 'react'; -import { ColorPicker } from '@/lib/components/colorComponents/colorPicker'; import { DropdownColorLegend, EntityPill, Input, RelationPill } from '@/lib/components'; -import { MapProps } from '../../mapvis'; -import { LayerSettingsComponentType, EDGE_COLOR_DEFAULT } from '../../mapvis.types'; -import { nodeColorRGB } from '../../utils'; import { Accordion, AccordionBody, AccordionHead, AccordionItem } from '@/lib/components/accordion'; +import { ColorPicker } from '@/lib/components/colorComponents/colorPicker'; import { isEqual } from 'lodash-es'; +import { useEffect } from 'react'; import { GraphStatistics } from 'ts-common'; +import { MapProps } from '../../mapvis'; +import { EDGE_COLOR_DEFAULT, LayerSettingsComponentType } from '../../mapvis.types'; +import { nodeColorRGB } from '../../utils'; const defaultNodeSettings = (index: number) => ({ color: index, diff --git a/src/lib/vis/visualizations/mapvis/mapvis.stories.tsx b/src/lib/vis/visualizations/mapvis/mapvis.stories.tsx index f8bf22a81..851a0913a 100644 --- a/src/lib/vis/visualizations/mapvis/mapvis.stories.tsx +++ b/src/lib/vis/visualizations/mapvis/mapvis.stories.tsx @@ -2,8 +2,8 @@ import { configureStore } from '@reduxjs/toolkit'; import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; import { graphQueryResultSlice, schemaSlice, visualizationSlice } from '../../../data-access/store'; -import MapComponent from './mapvis'; import { mockData } from '../../../mock-data/query-result/mockData'; +import MapComponent from './mapvis'; const Mockstore = configureStore({ reducer: { diff --git a/src/lib/vis/visualizations/mapvis/mapvis.tsx b/src/lib/vis/visualizations/mapvis/mapvis.tsx index ee0cefed3..c9f0eafe4 100644 --- a/src/lib/vis/visualizations/mapvis/mapvis.tsx +++ b/src/lib/vis/visualizations/mapvis/mapvis.tsx @@ -1,20 +1,20 @@ -import React, { useEffect, useCallback, useState, useRef, forwardRef, RefObject, useImperativeHandle } from 'react'; -import DeckGL from '@deck.gl/react'; +import { getEnvVariable } from '@/config'; +import { NodeDetails } from '@/lib/components/nodeDetails'; +import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/popover'; import { CompositeLayer, FlyToInterpolator, MapViewState, WebMercatorViewport } from '@deck.gl/core'; -import { CompositeLayerType, Coordinate, LayerSettingsType, LocationInfo, SearchResultType } from './mapvis.types'; -import { VISComponentType, VisualizationPropTypes } from '../../common'; -import { layerTypes, createBaseMap, LayerTypes } from './layers'; +import DeckGL from '@deck.gl/react'; import { geoCentroid } from 'd3'; -import { Attribution, ActionBar, MapDataInspector, MapSettings } from './components'; -import { useSelectionLayer, useCoordinateLookup } from './hooks'; -import { NodeDetails } from '@/lib/components/nodeDetails'; -import { Popover, PopoverContent, PopoverProvider, PopoverTrigger } from '@/lib/components/popover'; -import { isGeoJsonType, nodeColorHex, rgbToHex } from './utils'; -import { NodeType } from '../nodelinkvis/types'; -import { ChoroplethLayer } from './layers/choropleth-layer/ChoroplethLayer'; +import React, { forwardRef, RefObject, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react'; import { Map } from 'react-map-gl'; -import { getEnvVariable } from '@/config'; import { NodeQueryResult } from 'ts-common'; +import { VISComponentType, VisualizationPropTypes } from '../../common'; +import { NodeType } from '../nodelinkvis/types'; +import { ActionBar, Attribution, MapDataInspector, MapSettings } from './components'; +import { useCoordinateLookup, useSelectionLayer } from './hooks'; +import { createBaseMap, layerTypes, LayerTypes } from './layers'; +import { ChoroplethLayer } from './layers/choropleth-layer/ChoroplethLayer'; +import { CompositeLayerType, Coordinate, LayerSettingsType, LocationInfo, SearchResultType } from './mapvis.types'; +import { isGeoJsonType, nodeColorHex, rgbToHex } from './utils'; export type MapProps = { layer: LayerTypes; @@ -46,7 +46,7 @@ export const MapVis = forwardRef((props: VisualizationPropTypes<MapProps>, refEx const [isSearching, setIsSearching] = useState<boolean>(false); const [searchResult, setSearchResult] = useState<SearchResultType | undefined>(undefined); - const coordinateLookup = useCoordinateLookup(props.data.nodes, props.settings.location); + const coordinateLookup = useCoordinateLookup(props.data.graph.nodes, props.settings.location); const [shouldExport, setShouldExport] = useState<boolean>(false); const captureImage = () => { @@ -254,7 +254,7 @@ export const MapVis = forwardRef((props: VisualizationPropTypes<MapProps>, refEx // If the feature contains node IDs, handle selecting the corresponding nodes const ids = object.properties.nodes; if (ids && ids.length > 0) { - const nodes = props.data.nodes.filter(node => ids.includes(node._id)); + const nodes = props.data.graph.nodes.filter(node => ids.includes(node._id)); props.handleSelect({ nodes: [...nodes] }); } } diff --git a/src/lib/vis/visualizations/mapvis/mapvis.types.ts b/src/lib/vis/visualizations/mapvis/mapvis.types.ts index 60f20aefc..5707be522 100644 --- a/src/lib/vis/visualizations/mapvis/mapvis.types.ts +++ b/src/lib/vis/visualizations/mapvis/mapvis.types.ts @@ -1,7 +1,7 @@ import { CompositeLayer } from 'deck.gl'; +import { GraphStatistics, NodeQueryResult } from 'ts-common'; import { VisualizationPropTypes, VisualizationSettingsType } from '../../common'; import { MapProps } from './mapvis'; -import { GraphStatistics, NodeQueryResult } from 'ts-common'; export type Coordinate = [number, number]; diff --git a/src/lib/vis/visualizations/mapvis/utils.ts b/src/lib/vis/visualizations/mapvis/utils.ts index b5fe310f0..6d8c1fdb2 100644 --- a/src/lib/vis/visualizations/mapvis/utils.ts +++ b/src/lib/vis/visualizations/mapvis/utils.ts @@ -1,7 +1,6 @@ import { visualizationColors } from '@/config'; import { NodeType } from '../nodelinkvis/types'; -import { GeoJsonType } from './mapvis.types'; -import { SearchResultType } from './mapvis.types'; +import { GeoJsonType, SearchResultType } from './mapvis.types'; export function nodeColorRGB(num?: number): [number, number, number] { const colorVal = nodeColorHex(num); diff --git a/src/lib/vis/visualizations/matrixvis/components/BitmapTextLabel.ts b/src/lib/vis/visualizations/matrixvis/components/BitmapTextLabel.ts index c82ba9e7d..033858106 100644 --- a/src/lib/vis/visualizations/matrixvis/components/BitmapTextLabel.ts +++ b/src/lib/vis/visualizations/matrixvis/components/BitmapTextLabel.ts @@ -7,12 +7,12 @@ export class BitmapTextLabel extends BitmapText { constructor(label: string) { super(label, { - fontName: BitmapTextLabel.LABEL_FONT_FAMILY, + fontFamily: BitmapTextLabel.LABEL_FONT_FAMILY, fontSize: BitmapTextLabel.LABEL_FONT_SIZE, align: 'right', - tint: BitmapTextLabel.LABEL_COLOR, }); + this.tint = BitmapTextLabel.LABEL_COLOR; this.rotation = (Math.PI * 3) / 2; this.eventMode = 'none'; this.name = 'Text_' + label; diff --git a/src/lib/vis/visualizations/matrixvis/components/ColumnGraphicsComponent.tsx b/src/lib/vis/visualizations/matrixvis/components/ColumnGraphicsComponent.tsx index 71482d948..d41b56ec6 100644 --- a/src/lib/vis/visualizations/matrixvis/components/ColumnGraphicsComponent.tsx +++ b/src/lib/vis/visualizations/matrixvis/components/ColumnGraphicsComponent.tsx @@ -1,9 +1,9 @@ -import { Edge } from '@/lib/data-access'; import { Graphics } from 'pixi.js'; +import { EdgeQueryResult } from 'ts-common'; export const createColumn = ( orderRow: string[], - edgesForThisColumn: Edge[], + edgesForThisColumn: EdgeQueryResult[], visMapping: any[], // TODO type cellWidth: number, cellHeight: number, diff --git a/src/lib/vis/visualizations/matrixvis/components/ColumnSpriteComponent.tsx b/src/lib/vis/visualizations/matrixvis/components/ColumnSpriteComponent.tsx index 13bc7b4a3..6612c26a7 100644 --- a/src/lib/vis/visualizations/matrixvis/components/ColumnSpriteComponent.tsx +++ b/src/lib/vis/visualizations/matrixvis/components/ColumnSpriteComponent.tsx @@ -1,12 +1,12 @@ -import { Edge, Node } from '@/lib/data-access'; import { dataColors, tailwindColors } from '@/config'; import { Sprite, Texture } from 'pixi.js'; +import { EdgeQueryResult, NodeQueryResult } from 'ts-common'; export const createColumn = ( id: number, - nodesCol: Node[], - nodesRow: Node[], - edges: Edge[], + nodesCol: NodeQueryResult[], + nodesRow: NodeQueryResult[], + edges: EdgeQueryResult[], colorScale: any, cellWidth: number, cellHeight: number, diff --git a/src/lib/vis/visualizations/matrixvis/components/MatrixExport.tsx b/src/lib/vis/visualizations/matrixvis/components/MatrixExport.tsx index e6907ecc3..fb05e4102 100644 --- a/src/lib/vis/visualizations/matrixvis/components/MatrixExport.tsx +++ b/src/lib/vis/visualizations/matrixvis/components/MatrixExport.tsx @@ -1,9 +1,8 @@ -import React from 'react'; import jsPDF from 'jspdf'; -import { Container, IRenderer } from 'pixi.js'; +import { Container, Renderer } from 'pixi.js'; /** Exports the nodelink diagram as a pdf for downloading. */ -async function exportToPDF(renderer: IRenderer, stage: Container): Promise<void> { +async function exportToPDF(renderer: Renderer, stage: Container): Promise<void> { const b = await renderer.extract.canvas(stage).convertToBlob?.({ type: 'image/png' }); if (!b) return; const pdf = new jsPDF(); @@ -16,7 +15,7 @@ async function exportToPDF(renderer: IRenderer, stage: Container): Promise<void> } /** Exports the nodelink diagram as a png for downloading. */ -async function exportToPNG(renderer: IRenderer, stage: Container): Promise<void> { +async function exportToPNG(renderer: Renderer, stage: Container): Promise<void> { const b = await renderer.extract.canvas(stage).convertToBlob?.({ type: 'image/png' }); if (b) { const a = document.createElement('a'); diff --git a/src/lib/vis/visualizations/matrixvis/components/MatrixPixi.tsx b/src/lib/vis/visualizations/matrixvis/components/MatrixPixi.tsx index b27ac1c46..071ee397e 100644 --- a/src/lib/vis/visualizations/matrixvis/components/MatrixPixi.tsx +++ b/src/lib/vis/visualizations/matrixvis/components/MatrixPixi.tsx @@ -1,35 +1,36 @@ -import { Edge, GraphQueryResult, Node, useML } from '@/lib/data-access'; import { dataColors, visualizationColors } from '@/config'; +import { GraphQueryResult } from '@/lib/data-access'; import { Viewport } from 'pixi-viewport'; -import { Application, ColorSource, Container, FederatedPointerEvent, Graphics, PointData, Point, Text } from 'pixi.js'; -import { useEffect, useRef, useState, useMemo, useImperativeHandle, forwardRef } from 'react'; +import { Application, ColorSource, Container, FederatedPointerEvent, Graphics, Point, PointData, Text, Ticker } from 'pixi.js'; +import { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'; import { LinkType, NodeType } from '../types'; import { NLPopup } from './MatrixPopup'; import { Actions, Interpolations } from 'pixi-actions'; +import { useConfig } from '@/lib/data-access/store'; +import { Theme } from '@/lib/data-access/store/configSlice'; import Color from 'color'; -import { createColumn } from './ColumnGraphicsComponent'; -import { ReorderingManager } from './ReorderingManager'; import { - select, - selectAll, + axisLeft, + axisTop, + easeCubicOut, range, - scaleLinear, scaleBand, + scaleLinear, + select, + selectAll, + type Axis, + type BaseType, type ScaleBand, - axisTop, - axisLeft, - easeCubicOut, type Selection, - type BaseType, - type Axis, } from 'd3'; -import { MatrixVisProps } from '../matrixvis'; -import { Theme } from '@/lib/data-access/store/configSlice'; -import { useConfig } from '@/lib/data-access/store'; import html2canvas from 'html2canvas'; import { Target } from 'pixi-actions/dist/actions/TargetedAction'; +import { EdgeQueryResult, NodeQueryResult } from 'ts-common'; +import { MatrixVisProps } from '../matrixvis'; +import { createColumn } from './ColumnGraphicsComponent'; +import { ReorderingManager } from './ReorderingManager'; const styleMatrixSize = 50; @@ -40,7 +41,7 @@ type Props = { highlightNodes: NodeType[]; currentShortestPathEdges?: LinkType[]; highlightedLinks?: LinkType[]; - graph?: GraphQueryResult; + result?: GraphQueryResult; settings: MatrixVisProps; }; @@ -63,11 +64,11 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { const globalConfig = useConfig(); useEffect(() => { - if (props.graph && internalRef.current && imperative.current) { + if (props.result && internalRef.current && imperative.current) { if (isSetup.current === false) setup(); else update(); } - }, [props.graph, globalConfig.theme]); + }, [props.result, globalConfig.theme]); let columnOrder: string[] = []; let rowOrder: string[] = []; @@ -76,12 +77,11 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { const [popups, setPopups] = useState<{ node: NodeType; pos: PointData }[]>([]); // const [columnOrder, setColumnOrder] = useState<string[]>([]); - const viewport = useRef<Viewport>(); + const viewport = useRef<Viewport>(null); const internalRef = useRef<HTMLDivElement>(null); const canvas = useRef<HTMLCanvasElement>(null); const svg = useRef<SVGSVGElement>(null); const isSetup = useRef(false); - const ml = useML(); const app = useMemo( () => @@ -161,7 +161,7 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { viewport.current.screenHeight = height; } - if (props.graph) { + if (props.result) { setup(); } app?.render(); @@ -210,16 +210,16 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { const update = (forceClear = false) => { setPopups([]); - if (!props.graph || !internalRef.current) return; + if (!props.result || !internalRef.current) return; - if (props.graph) { + if (props.result) { if (forceClear) { columnsContainer.removeChildren(); } } }; - const onHoverColumn = (event: any, currentNode: Node | null | undefined) => { + const onHoverColumn = (event: any, currentNode?: NodeQueryResult) => { if (Actions.actions.length > 0) { // Don't hover if reorder animation are running, causes glitches. return; @@ -239,9 +239,9 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { }); event.currentTarget.alpha = 1; - if (!props.graph) return; + if (!props.result) return; - const edgesForThisColumn = props.graph.edges.filter(edge => { + const edgesForThisColumn = props.result.graph.edges.filter(edge => { return edge.from === currentNode._id || edge.to === currentNode._id; }); @@ -290,7 +290,7 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { .call(axisColumns); }; - const reorderRows = (edges: Edge[], rowOrder: string[], columnOrder: string[]) => { + const reorderRows = (edges: EdgeQueryResult[], rowOrder: string[], columnOrder: string[]) => { if (Actions.actions.length > 0) { // Don't reorder if previous animation is still running, causes glitches. return; @@ -299,7 +299,7 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { // Rearrange rows columnsContainer.removeChildren(); setupColumns(edges, columnOrder, rowOrder); - const cols = columnOrder.flatMap(x => props.graph?.nodes.filter(n => n._id == x) ?? []); + const cols = columnOrder.flatMap(x => props.result?.graph.nodes.filter(n => n._id == x) ?? []); setupColumnInteractivity(cols); // Animate row axis @@ -317,7 +317,7 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { }; const setup = () => { - if (!props.graph) throw Error('Graph is undefined; setup not possible'); + if (!props.result) throw Error('Graph is undefined; setup not possible'); if (svg.current != null) { select(svg.current).selectAll('*').remove(); @@ -341,26 +341,26 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { viewport.current.addChild(columnsContainer); - const groupByType = props.graph.nodes.reduce( - (group: any, node: Node) => { + const groupByType = props.result.graph.nodes.reduce( + (group: any, node: NodeQueryResult) => { if (!group[node.label]) group[node.label] = []; group[node.label].push(node); return group; }, - {} as { [key: string]: Node[] }, + {} as { [key: string]: NodeQueryResult[] }, ); // order groupByType by size const ordered = Object.entries(groupByType).sort((a: any[], b: any[]) => b[1].length - a[1].length); - let cols = [] as Node[]; - let rows = [] as Node[]; + let cols = [] as NodeQueryResult[]; + let rows = [] as NodeQueryResult[]; if (ordered.length == 2) { - cols = ordered[0][1] as Node[]; - rows = ordered[1][1] as Node[]; + cols = ordered[0][1] as NodeQueryResult[]; + rows = ordered[1][1] as NodeQueryResult[]; } else if (ordered.length == 1) { - cols = ordered[0][1] as Node[]; - rows = ordered[0][1] as Node[]; + cols = ordered[0][1] as NodeQueryResult[]; + rows = ordered[0][1] as NodeQueryResult[]; } else { // show text that there are no nodes on the viewport const finalTextSize = 25; @@ -379,12 +379,15 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { columnOrder = range(0, cols.length).map(d => cols[d]._id); rowOrder = range(0, rows.length).map(d => rows[d]._id); - const reorderingManager = new ReorderingManager(props.graph); + const reorderingManager = new ReorderingManager(props.result); const newOrdering = reorderingManager.reorderMatrix('count', columnOrder, rowOrder); columnOrder = newOrdering.columnOrder; rowOrder = newOrdering.rowOrder; - config.cellWidth = Math.max((size?.width || 1000) / props.graph.nodes.length, (size?.height || 1000) / props.graph.nodes.length); + config.cellWidth = Math.max( + (size?.width || 1000) / props.result.graph.nodes.length, + (size?.height || 1000) / props.result.graph.nodes.length, + ); config.cellHeight = config.cellWidth; setupVisualizationEncodingMapping(props.settings); @@ -399,12 +402,12 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { .style('pointer-events', 'none'); } - setupColumns(props.graph.edges, columnOrder, rowOrder); + setupColumns(props.result.graph.edges, columnOrder, rowOrder); setupColumnAxis(columnOrder, cols[0].label); setupColumnInteractivity(cols); setupRowAxis(rowOrder, rows[0].label); - console.debug('setup matrixvis with graph:', props.graph); + console.debug('setup matrixvis with graph:', props.result); // activate plugins viewport.current.drag().pinch().wheel().animate({}).decelerate({ friction: 0.75 }); @@ -419,7 +422,7 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { let scaleRows: ScaleBand<string>; const setupVisualizationEncodingMapping = (settings: MatrixVisProps) => { - if (!props.graph) throw new Error('Graph is undefined; cannot setup matrix'); + if (!props.result) throw new Error('Graph is undefined; cannot setup matrix'); const visMapping = []; // TODO type const colorNeutralString = globalConfig.theme === Theme.dark ? dataColors.neutral['80'] : dataColors.neutral['15']; @@ -462,7 +465,7 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { config.visMapping = visMapping; }; - function setupColumns(edges: Edge[], columnOrder: string[], rowOrder: string[]) { + function setupColumns(edges: EdgeQueryResult[], columnOrder: string[], rowOrder: string[]) { const visMapping = config.visMapping[0]; if (!visMapping) throw new Error('Cannot setup matrix without visMapping'); @@ -485,7 +488,7 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { } } - const setupColumnInteractivity = (cols: Node[]) => { + const setupColumnInteractivity = (cols: NodeQueryResult[]) => { for (let j = 0; j < columnsContainer.children.length; j++) { const oneColumn = columnsContainer.children[j]; oneColumn.interactive = true; @@ -495,7 +498,7 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { onHoverColumn(event, col); }); oneColumn.on('pointerout', event => { - onHoverColumn(event, null); + onHoverColumn(event, undefined); }); } }; @@ -518,9 +521,9 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { // Click handler for reordering columns const axisTopHandle = internalRef.current?.querySelector(`.axisTop`) as HTMLDivElement; axisTopHandle.addEventListener('click', () => { - if (!props.graph) throw new Error('Graph is undefined; cannot reorder matrix'); + if (!props.result) throw new Error('Graph is undefined; cannot reorder matrix'); - const reorderingManager = new ReorderingManager(props.graph); + const reorderingManager = new ReorderingManager(props.result); const newOrdering = reorderingManager.reorderMatrix('count', columnOrder, rowOrder); columnOrder = newOrdering.columnOrder.reverse(); @@ -616,10 +619,10 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { // Click handler for reordering columns const axisLeftHandle = internalRef.current?.querySelector(`.axisLeft`) as HTMLDivElement; axisLeftHandle.addEventListener('click', () => { - if (!props.graph) throw new Error('Graph is undefined; cannot reorder matrix'); + if (!props.result) throw new Error('Graph is undefined; cannot reorder matrix'); rowOrder = shuffle(rowOrder); - reorderRows(props?.graph.edges, rowOrder, columnOrder); + reorderRows(props?.result.graph.edges, rowOrder, columnOrder); }); // Create d3 axis object @@ -671,11 +674,11 @@ export const MatrixPixi = forwardRef((props: Props, refExternal) => { } }; - const tick = (delta: number) => { - if (props.graph) { + const tick = (ticker: Ticker) => { + if (props.result) { updateColumnAxis(); updateRowAxis(); - Actions.tick(delta / 60); + Actions.tick(ticker.deltaMS / 60); } }; diff --git a/src/lib/vis/visualizations/matrixvis/components/ReorderingManager.tsx b/src/lib/vis/visualizations/matrixvis/components/ReorderingManager.tsx index 3162c29dc..172cbe9a1 100644 --- a/src/lib/vis/visualizations/matrixvis/components/ReorderingManager.tsx +++ b/src/lib/vis/visualizations/matrixvis/components/ReorderingManager.tsx @@ -3,10 +3,10 @@ import * as reorder from 'reorder.js'; export class ReorderingManager { private leafOrder = reorder.optimal_leaf_order().distance(reorder.distance.manhattan); - graph: GraphQueryResult; + result: GraphQueryResult; constructor(graph: GraphQueryResult) { - this.graph = graph; + this.result = graph; } private computeNameOrder = (columnOrder: string[], rowOrder: string[]) => { @@ -22,7 +22,7 @@ export class ReorderingManager { for (let i = 0; i < columnOrder.length; i++) { const oneColumn = columnOrder[i]; - const edgesForThisColumn = this.graph.edges.filter(edge => { + const edgesForThisColumn = this.result.graph.edges.filter(edge => { return edge.from === oneColumn || edge.to === oneColumn; }); @@ -31,7 +31,7 @@ export class ReorderingManager { for (let j = 0; j < rowOrder.length; j++) { const oneRow = rowOrder[j]; - const edgesForThisRow = this.graph.edges.filter(edge => { + const edgesForThisRow = this.result.graph.edges.filter(edge => { return edge.from === oneRow || edge.to === oneRow; }); @@ -48,7 +48,7 @@ export class ReorderingManager { }; private computeLeaforder = (columnOrder: string[], rowOrder: string[]) => { - const adjacency: number[][] = this.constructAdjacencyMatrix(this.graph, columnOrder, rowOrder); + const adjacency: number[][] = this.constructAdjacencyMatrix(this.result, columnOrder, rowOrder); const order = this.leafOrder.reorder(adjacency).map(i => columnOrder[i]); @@ -61,7 +61,7 @@ export class ReorderingManager { const adjacency: number[][] = []; for (let i = 0; i < columnOrder.length; i++) { const oneColumn = columnOrder[i]; - const edgesForThisColumn = graph.edges.filter(edge => { + const edgesForThisColumn = graph.graph.edges.filter(edge => { return edge.from === oneColumn || edge.to === oneColumn; }); @@ -85,7 +85,7 @@ export class ReorderingManager { private computeBarycenter = (columnOrder: string[], rowOrder: string[]) => { const reorderAny = reorder as any; - const reorderGraph = this.getReorderJSGraph(this.graph, columnOrder, rowOrder); + const reorderGraph = this.getReorderJSGraph(this.result, columnOrder, rowOrder); const barycenter = reorderAny.barycenter_order(reorderGraph); const improved = reorderAny.adjacent_exchange(reorderGraph, barycenter[0], barycenter[1]); @@ -98,10 +98,10 @@ export class ReorderingManager { return { columnOrder: columnOrderSorted, rowOrder: rowOrderSorted }; }; - private getReorderJSGraph = (graph: GraphQueryResult, columnOrder: string[], rowOrder: string[]) => { + private getReorderJSGraph = (result: GraphQueryResult, columnOrder: string[], rowOrder: string[]) => { const reorderAny = reorder as any; - const nodesTemp = graph.nodes.map( + const nodesTemp = result.graph.nodes.map( node => ({ ...node, @@ -113,7 +113,7 @@ export class ReorderingManager { const nodes = columnOrder.map(id => nodesTemp.find(node => node.id === id)); const graphReorderJs = reorderAny.graph().nodes(nodes); - const edges = graph.edges.map(edge => { + const edges = result.graph.edges.map(edge => { const source = nodes.find(node => node.id === edge.from); const target = nodes.find(node => node.id === edge.to); @@ -135,7 +135,7 @@ export class ReorderingManager { private computeRCM = (columnOrder: string[], rowOrder: string[]) => { const reorderAny = reorder as any; - const reorderGraph = this.getReorderJSGraph(this.graph, columnOrder, rowOrder); + const reorderGraph = this.getReorderJSGraph(this.result, columnOrder, rowOrder); const order = reorderAny.reverse_cuthill_mckee_order(reorderGraph); const columnOrderSorted = order.map((i: number) => columnOrder[i]).filter((a: string) => columnOrder.includes(a)); @@ -148,7 +148,7 @@ export class ReorderingManager { private computeSpectal = (columnOrder: string[], rowOrder: string[]) => { const reorderAny = reorder as any; - const reorderGraph = this.getReorderJSGraph(this.graph, columnOrder, rowOrder); + const reorderGraph = this.getReorderJSGraph(this.result, columnOrder, rowOrder); const order = reorderAny.spectral_order(reorderGraph); const columnOrderSorted = order.map((i: number) => columnOrder[i]).filter((a: string) => columnOrder.includes(a)); @@ -161,7 +161,7 @@ export class ReorderingManager { private computeBFS = (columnOrder: string[], rowOrder: string[]) => { const reorderAny = reorder as any; - const reorderGraph = this.getReorderJSGraph(this.graph, columnOrder, rowOrder); + const reorderGraph = this.getReorderJSGraph(this.result, columnOrder, rowOrder); const order = reorderAny.bfs_order(reorderGraph); @@ -176,7 +176,7 @@ export class ReorderingManager { private computePCA = (columnOrder: string[], rowOrder: string[]) => { const reorderAny = reorder as any; - const columnOrderUnSorted = columnOrder.map((id: string) => this.graph.nodes.find(node => node._id === id)); + const columnOrderUnSorted = columnOrder.map((id: string) => this.result.graph.nodes.find(node => node._id === id)); const order = reorderAny.pca_order(columnOrderUnSorted); const columnOrderSorted = order.map((i: number) => columnOrder[i]); diff --git a/src/lib/vis/visualizations/matrixvis/matrix.stories.tsx b/src/lib/vis/visualizations/matrixvis/matrix.stories.tsx index 4e5e67971..6837522dc 100644 --- a/src/lib/vis/visualizations/matrixvis/matrix.stories.tsx +++ b/src/lib/vis/visualizations/matrixvis/matrix.stories.tsx @@ -1,10 +1,10 @@ -import { Meta } from '@storybook/react'; +import { configSlice } from '@/lib/data-access/store/configSlice'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; -import { mockData } from '../../../mock-data'; import { graphQueryResultSlice, schemaSlice, visualizationSlice } from '../../../data-access/store'; +import { mockData } from '../../../mock-data'; import MatrixVisComponent from './matrixvis'; -import { configSlice } from '@/lib/data-access/store/configSlice'; const Component: Meta<typeof MatrixVisComponent.component> = { title: 'Visualizations/MatrixVis', diff --git a/src/lib/vis/visualizations/matrixvis/matrixvis.tsx b/src/lib/vis/visualizations/matrixvis/matrixvis.tsx index b79c6fdf1..821380653 100644 --- a/src/lib/vis/visualizations/matrixvis/matrixvis.tsx +++ b/src/lib/vis/visualizations/matrixvis/matrixvis.tsx @@ -1,11 +1,11 @@ -import React, { useEffect, useRef, useState, useImperativeHandle, forwardRef } from 'react'; +import { Input } from '@/lib/components/inputs'; +import { SettingsContainer } from '@/lib/vis/components/config'; +import React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react'; import { useImmer } from 'use-immer'; import { GraphQueryResult } from '../../../data-access/store'; -import { LinkType, NodeType } from './types'; +import { VISComponentType, VisualizationPropTypes, VisualizationSettingsPropTypes } from '../../common'; import { MatrixPixi } from './components/MatrixPixi'; -import { VisualizationPropTypes, VISComponentType, VisualizationSettingsPropTypes } from '../../common'; -import { Input } from '@/lib/components/inputs'; -import { SettingsContainer } from '@/lib/vis/components/config'; +import { LinkType, NodeType } from './types'; export interface MatrixVisProps { marks: string; @@ -52,7 +52,7 @@ const MatrixVis = forwardRef<MatrixVisHandle, VisualizationPropTypes<MatrixVisPr <div className="h-full w-full overflow-hidden" ref={ref}> <MatrixPixi ref={matrixPixiRef} - graph={graph} + result={graph} highlightNodes={highlightNodes} highlightedLinks={highlightedLinks} settings={settings} diff --git a/src/lib/vis/visualizations/nodelinkvis/components/NLExport.tsx b/src/lib/vis/visualizations/nodelinkvis/components/NLExport.tsx index e6907ecc3..fb05e4102 100644 --- a/src/lib/vis/visualizations/nodelinkvis/components/NLExport.tsx +++ b/src/lib/vis/visualizations/nodelinkvis/components/NLExport.tsx @@ -1,9 +1,8 @@ -import React from 'react'; import jsPDF from 'jspdf'; -import { Container, IRenderer } from 'pixi.js'; +import { Container, Renderer } from 'pixi.js'; /** Exports the nodelink diagram as a pdf for downloading. */ -async function exportToPDF(renderer: IRenderer, stage: Container): Promise<void> { +async function exportToPDF(renderer: Renderer, stage: Container): Promise<void> { const b = await renderer.extract.canvas(stage).convertToBlob?.({ type: 'image/png' }); if (!b) return; const pdf = new jsPDF(); @@ -16,7 +15,7 @@ async function exportToPDF(renderer: IRenderer, stage: Container): Promise<void> } /** Exports the nodelink diagram as a png for downloading. */ -async function exportToPNG(renderer: IRenderer, stage: Container): Promise<void> { +async function exportToPNG(renderer: Renderer, stage: Container): Promise<void> { const b = await renderer.extract.canvas(stage).convertToBlob?.({ type: 'image/png' }); if (b) { const a = document.createElement('a'); diff --git a/src/lib/vis/visualizations/nodelinkvis/components/NLForce.tsx b/src/lib/vis/visualizations/nodelinkvis/components/NLForce.tsx deleted file mode 100644 index da577fb37..000000000 --- a/src/lib/vis/visualizations/nodelinkvis/components/NLForce.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { forceCenter, forceCollide, forceLink, forceManyBody, forceRadial, forceSimulation } from 'd3'; -import { GraphType, EdgeType, NodeType } from '../types'; - -export const simulation = forceSimulation<NodeType, EdgeType>(); - -/** StartSimulation starts the d3 forcelink simulation. This has to be called after the simulation is initialized. */ -export function startSimulation(graph: GraphType, windowSize: { width: number; height: number }): void { - simulation - .alpha(2) - .alphaDecay(0.02) - .force( - 'link', - forceLink<NodeType, EdgeType>() - .id((d: any) => d.id) - .strength((link, i, links) => (link.mlEdge ? 0.001 : 1)) - .distance(25), - ) - .force('charge', forceManyBody().strength(-4).distanceMax(200).distanceMin(0)) - .force('center', forceCenter(windowSize.width / 2, windowSize.height / 2).strength(0.02)) - .force('collide', forceCollide().strength(0.2).radius(15).iterations(1)) // Force that avoids circle overlapping - .force('attract', forceRadial(50, windowSize.width / 2, windowSize.height / 2).strength(0.002)); - simulation.nodes(graph.nodes); - simulation.force<d3.ForceLink<NodeType, EdgeType>>('link')?.links(graph.edges); - simulation.alphaTarget(0).restart(); -} diff --git a/src/lib/vis/visualizations/nodelinkvis/components/NLMachineLearning.tsx b/src/lib/vis/visualizations/nodelinkvis/components/NLMachineLearning.tsx index 78d97ec4a..d517168ed 100644 --- a/src/lib/vis/visualizations/nodelinkvis/components/NLMachineLearning.tsx +++ b/src/lib/vis/visualizations/nodelinkvis/components/NLMachineLearning.tsx @@ -1,6 +1,6 @@ import { useState } from 'react'; -import { GraphType, EdgeType, NodeType } from '../types'; -import { ML } from '../../../../data-access/store/mlSlice'; +import { ML } from 'ts-common'; +import { EdgeType, GraphType, NodeType } from '../types'; export function processLinkPrediction(ml: ML, graph: GraphType): GraphType { if (ml === undefined || ml.linkPrediction === undefined) return graph; diff --git a/src/lib/vis/visualizations/nodelinkvis/components/NLPixi.tsx b/src/lib/vis/visualizations/nodelinkvis/components/NLPixi.tsx index 1394937d1..5922624db 100644 --- a/src/lib/vis/visualizations/nodelinkvis/components/NLPixi.tsx +++ b/src/lib/vis/visualizations/nodelinkvis/components/NLPixi.tsx @@ -1,8 +1,10 @@ -import { Popover, PopoverContent, PopoverTrigger, PopoverProvider } from '@/lib/components/popover'; +import { dataColors, visualizationColors } from '@/config'; +import { canViewFeature } from '@/lib/components/featureFlags'; import { NodeDetails } from '@/lib/components/nodeDetails'; +import { Popover, PopoverContent, PopoverTrigger } from '@/lib/components/popover'; import { useConfig } from '@/lib/data-access/store'; import { Theme } from '@/lib/data-access/store/configSlice'; -import { dataColors, visualizationColors } from '@/config'; +import { useAsyncMemo } from '@/utils'; import { MultiGraph } from 'graphology'; import { Viewport } from 'pixi-viewport'; import { @@ -18,16 +20,14 @@ import { type StrokeStyle, } from 'pixi.js'; import { forwardRef, RefObject, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'; +import { AllLayoutAlgorithms } from 'ts-common/src/model/layouts'; import { useML, useSearchResultData } from '../../../../data-access'; import { GraphologyForceAtlas2Webworker, LayoutFactory, Layouts, LayoutTypes } from '../../../../graph-layout'; import { NodelinkVisProps } from '../nodelinkvis'; -import { GraphType, GraphTypeD3, EdgeType, EdgeTypeD3, NodeType, NodeTypeD3 } from '../types'; +import { EdgeType, EdgeTypeD3, GraphType, GraphTypeD3, NodeType, NodeTypeD3 } from '../types'; +import { ForceEdgeBundling, type Point } from './edgeBundling'; import { NLPopUp } from './NLPopup'; import { nodeColor, nodeColorHex } from './utils'; -import { useAsyncMemo } from '@/utils'; -import { ForceEdgeBundling, type Point } from './edgeBundling'; -import { canViewFeature } from '@/lib/components/featureFlags'; -import { AllLayoutAlgorithms } from 'ts-common/src/model/layouts'; type Props = { onClick: (event?: { node: NodeTypeD3; pos: PointData }) => void; @@ -1156,8 +1156,6 @@ export const NLPixi = forwardRef((props: Props, refExternal) => { // } // }); - // force.startSimulation(props.graph, ref.current.getBoundingClientRect()); - // force.simulation.on('tick', () => {}); layoutState.current = 'reset'; if (forceClear || layoutAlgorithm.current.algorithm !== config.LAYOUT_ALGORITHM) setupLayout(forceClear); } diff --git a/src/lib/vis/visualizations/nodelinkvis/components/NLPopup.tsx b/src/lib/vis/visualizations/nodelinkvis/components/NLPopup.tsx index c7caf031b..b298e7921 100644 --- a/src/lib/vis/visualizations/nodelinkvis/components/NLPopup.tsx +++ b/src/lib/vis/visualizations/nodelinkvis/components/NLPopup.tsx @@ -1,6 +1,6 @@ -import React, { useState } from 'react'; -import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/lib/components/tooltip'; import { ATTRIBUTE_MAX_CHARACTERS } from '@/config'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/lib/components/tooltip'; +import React, { useState } from 'react'; const formatNumber = (number: number) => { if (String(number).length <= 4) return number; diff --git a/src/lib/vis/visualizations/nodelinkvis/components/query2NL.tsx b/src/lib/vis/visualizations/nodelinkvis/components/query2NL.tsx index e3a7fb358..20f958e82 100644 --- a/src/lib/vis/visualizations/nodelinkvis/components/query2NL.tsx +++ b/src/lib/vis/visualizations/nodelinkvis/components/query2NL.tsx @@ -3,10 +3,10 @@ * Utrecht University within the Software Project course. * © Copyright Utrecht University (Department of Information and Computing Sciences) */ -import { GraphType, EdgeType as EdgeType, NodeType } from '../types'; +import { EdgeQueryResult, GraphQueryResultMetaFromBackend, ML, NodeQueryResult } from 'ts-common'; import { GraphQueryResult } from '../../../../data-access/store'; +import { EdgeType, GraphType, NodeType } from '../types'; import { processML } from './NLMachineLearning'; -import { EdgeQueryResult, GraphQueryResultMetaFromBackend, ML, NodeQueryResult } from 'ts-common'; /** ResultNodeLinkParserUseCase implements methods to parse and translate websocket messages from the backend into a GraphType. */ /** diff --git a/src/lib/vis/visualizations/nodelinkvis/components/utils.tsx b/src/lib/vis/visualizations/nodelinkvis/components/utils.tsx index 942013f4b..7ad7507c3 100644 --- a/src/lib/vis/visualizations/nodelinkvis/components/utils.tsx +++ b/src/lib/vis/visualizations/nodelinkvis/components/utils.tsx @@ -1,5 +1,5 @@ import { visualizationColors } from '@/config'; -import { GraphType, EdgeType, NodeType } from '../types'; +import { EdgeType, GraphType, NodeType } from '../types'; /** * Colour is a function that takes a string of a number and returns a number of a color out of the d3 color scheme. diff --git a/src/lib/vis/visualizations/nodelinkvis/nodelinkvis.stories.tsx b/src/lib/vis/visualizations/nodelinkvis/nodelinkvis.stories.tsx index 1249c3f21..87bd1d615 100644 --- a/src/lib/vis/visualizations/nodelinkvis/nodelinkvis.stories.tsx +++ b/src/lib/vis/visualizations/nodelinkvis/nodelinkvis.stories.tsx @@ -1,11 +1,10 @@ -import React from 'react'; -import { Meta } from '@storybook/react'; -import { graphQueryResultSlice, schemaSlice, visualizationSlice, searchResultSlice } from '../../../data-access/store'; +import { configSlice } from '@/lib/data-access/store/configSlice'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; +import { graphQueryResultSlice, schemaSlice, searchResultSlice, visualizationSlice } from '../../../data-access/store'; import { mockData } from '../../../mock-data'; import { NodeLinkComponent } from './nodelinkvis'; -import { configSlice } from '@/lib/data-access/store/configSlice'; const Mockstore = configureStore({ reducer: { diff --git a/src/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx b/src/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx index 3ebff7d4e..0e093296f 100644 --- a/src/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx +++ b/src/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx @@ -1,18 +1,18 @@ -import React, { useEffect, useRef, useState, forwardRef, useImperativeHandle, useMemo } from 'react'; -import { GraphType, EdgeType, NodeType, NodeTypeD3 } from './types'; -import { NLPixi } from './components/NLPixi'; -import { parseQueryResult } from './components/query2NL'; +import { canViewFeature } from '@/lib/components/featureFlags'; +import { Input } from '@/lib/components/inputs'; +import { EntityPill } from '@/lib/components/pills/Pill'; +import { SettingsContainer } from '@/lib/vis/components/config'; +import { type PointData } from 'pixi.js'; +import React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react'; +import { ML, NodeQueryResult } from 'ts-common'; import { useImmer } from 'use-immer'; import { setShortestPathSource, setShortestPathTarget } from '../../../data-access/store/mlSlice'; import { Layouts, LayoutTypes } from '../../../graph-layout/types'; -import { Input } from '@/lib/components/inputs'; -import { SettingsContainer } from '@/lib/vis/components/config'; -import { EntityPill } from '@/lib/components/pills/Pill'; +import { VISComponentType, VisualizationPropTypes, VisualizationSettingsPropTypes } from '../../common'; +import { NLPixi } from './components/NLPixi'; +import { parseQueryResult } from './components/query2NL'; import { nodeColorHex } from './components/utils'; -import { NodeQueryResult, ML } from 'ts-common'; -import { type PointData } from 'pixi.js'; -import { VisualizationPropTypes, VISComponentType, VisualizationSettingsPropTypes } from '../../common'; -import { canViewFeature } from '@/lib/components/featureFlags'; +import { EdgeType, GraphType, NodeType, NodeTypeD3 } from './types'; // For backwards compatibility with older saveStates, we migrate information from settings.nodes to settings.location // FIXME: this can be removed once all systems have updated their saveStates. diff --git a/src/lib/vis/visualizations/paohvis/components/HyperRangeBlock.tsx b/src/lib/vis/visualizations/paohvis/components/HyperRangeBlock.tsx index 2bfd53a0e..1297dd142 100644 --- a/src/lib/vis/visualizations/paohvis/components/HyperRangeBlock.tsx +++ b/src/lib/vis/visualizations/paohvis/components/HyperRangeBlock.tsx @@ -1,9 +1,9 @@ -import React, { useEffect, useState, useMemo } from 'react'; -import { CustomLine } from './CustomLine'; -import { LinesHyperEdges, PaohvisDataPaginated, RowInformation } from '../types'; import { Icon } from '@/lib/components/icon'; -import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@/lib/components/tooltip'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/lib/components/tooltip'; +import React, { useEffect, useMemo, useState } from 'react'; +import { LinesHyperEdges, PaohvisDataPaginated, RowInformation } from '../types'; import { getClosestSize } from '../utils/utils'; +import { CustomLine } from './CustomLine'; interface HyperEdgeRangesBlockProps { dataModel: PaohvisDataPaginated; @@ -109,7 +109,6 @@ export const HyperEdgeRangesBlock: React.FC<HyperEdgeRangesBlockProps> = ({ return ( <> <g key={'hyperEdgeInformationTop'} className="hyperEdgeInformation"> - <g key={'hyperEdgeLinesRows'} transform={`translate(${rowLabelColumnWidth},${yOffset + rowHeight})`}> {[...Array(numRows)].map((_, i) => ( <React.Fragment key={`horizontalLineRows-${i}`}> @@ -119,8 +118,8 @@ export const HyperEdgeRangesBlock: React.FC<HyperEdgeRangesBlockProps> = ({ className={`horizontalLineRowsTop-${i} fill-secondary-300`} x1={0} x2={dataModel.pageData.hyperEdgeRanges.length * rowHeight} - y1={-yOffset-rowHeight} - y2={-yOffset-rowHeight} + y1={-yOffset - rowHeight} + y2={-yOffset - rowHeight} strokeWidth={0.025 * rowHeight} /> )} @@ -148,7 +147,7 @@ export const HyperEdgeRangesBlock: React.FC<HyperEdgeRangesBlockProps> = ({ </React.Fragment> ))} </g> - + <g key={'hyperEdgeInformation'} className="hyperEdgeInformation text-columns " @@ -165,7 +164,7 @@ export const HyperEdgeRangesBlock: React.FC<HyperEdgeRangesBlockProps> = ({ {columnHeaderInformation.map((row, index) => ( <Tooltip key={'tooltip-col-' + index}> <TooltipTrigger asChild> - <g key={'text-col-' + index} transform={'translate(' + (accumulatedWidthHeaders[index]) + ',0)'}> + <g key={'text-col-' + index} transform={'translate(' + accumulatedWidthHeaders[index] + ',0)'}> {row.data[indexRows] !== undefined && row.data[indexRows] !== '' && (typeof row.data[indexRows] !== 'object' || Array.isArray(row.data[indexRows])) ? ( @@ -184,12 +183,7 @@ export const HyperEdgeRangesBlock: React.FC<HyperEdgeRangesBlockProps> = ({ </foreignObject> </> ) : ( - <rect - width={row.width} - height={rowHeight} - fill={'url(#diagonal-lines)'} - strokeWidth={0} - ></rect> + <rect width={row.width} height={rowHeight} fill={'url(#diagonal-lines)'} strokeWidth={0}></rect> )} </g> </TooltipTrigger> @@ -274,12 +268,18 @@ export const HyperEdgeRangesBlock: React.FC<HyperEdgeRangesBlockProps> = ({ </g> ))} </g> - + {dataModel.pageData.hyperEdgeRanges.map((hyperEdgeRange, indexHyperEdgeRange) => ( <React.Fragment key={indexHyperEdgeRange}> <g className={'hyperEdgeBlockLinesRef hyperEdgeLines-col-' + indexHyperEdgeRange} - transform={'translate(' + (rowLabelColumnWidth + indexHyperEdgeRange * rowHeight) + ',' + (widthColumns + rowHeight) + ')rotate(-90,0,0)'} + transform={ + 'translate(' + + (rowLabelColumnWidth + indexHyperEdgeRange * rowHeight) + + ',' + + (widthColumns + rowHeight) + + ')rotate(-90,0,0)' + } > <CustomLine x1={-rowHeight * numRows} diff --git a/src/lib/vis/visualizations/paohvis/components/RowLabels.tsx b/src/lib/vis/visualizations/paohvis/components/RowLabels.tsx index 0e4129798..790825349 100644 --- a/src/lib/vis/visualizations/paohvis/components/RowLabels.tsx +++ b/src/lib/vis/visualizations/paohvis/components/RowLabels.tsx @@ -1,9 +1,9 @@ -import React, { useEffect, useState, useMemo } from 'react'; -import { CustomLine } from './CustomLine'; +import { Icon } from '@/lib/components/icon'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/lib/components/tooltip'; +import React, { useEffect, useMemo, useState } from 'react'; import { RowInformation } from '../types'; import { getClosestSize } from '../utils/utils'; -import { Icon } from '@/lib/components/icon'; -import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@/lib/components/tooltip'; +import { CustomLine } from './CustomLine'; interface RowLabelsProps { dataRows: RowInformation; @@ -90,8 +90,8 @@ export const RowLabels = ({ return ( <> <g key={'rowLabelsInformation'} className="rowLabelsInformation"> - - {dataRows[0] && dataRows[0].data.map((rowLabel, indexRows) => ( + {dataRows[0] && + dataRows[0].data.map((rowLabel, indexRows) => ( <g key={'parent_' + indexRows}> <g key={'content_' + indexRows} transform={'translate(0,' + (yOffset + rowHeight + indexRows * rowHeight) + ')'}> <g className={'rowsLabel row-' + indexRows} onMouseEnter={onMouseEnterRowLabels} onMouseLeave={onMouseLeaveRowLabels}> @@ -120,12 +120,7 @@ export const RowLabels = ({ </foreignObject> </> ) : ( - <rect - width={row.width} - height={rowHeight} - fill={'url(#diagonal-lines)'} - strokeWidth={0} - ></rect> + <rect width={row.width} height={rowHeight} fill={'url(#diagonal-lines)'} strokeWidth={0}></rect> )} </g> </TooltipTrigger> @@ -166,7 +161,7 @@ export const RowLabels = ({ <g key={'content_rectangleGrid' + indexRows} - transform={'translate(' + (accumulatedWidthHeadersTotalValue) + ',' + (yOffset + rowHeight + indexRows * rowHeight) + ')'} + transform={'translate(' + accumulatedWidthHeadersTotalValue + ',' + (yOffset + rowHeight + indexRows * rowHeight) + ')'} > <rect width={rowHeight * numColumns} @@ -184,7 +179,7 @@ export const RowLabels = ({ <g key={'gHeadersRows-' + indexRows} className={`headersRows-${row.header} cursor-pointer group`} - transform={'translate(' + accumulatedWidthHeaders[indexRows] + ',' + (yOffset) + ')'} + transform={'translate(' + accumulatedWidthHeaders[indexRows] + ',' + yOffset + ')'} onClick={event => { handleClickHeaderSorting(event); }} @@ -225,7 +220,6 @@ export const RowLabels = ({ </div> </foreignObject> )} - </g> <CustomLine key={'row-verticalLines-' + indexRows} @@ -239,7 +233,6 @@ export const RowLabels = ({ </g> ))} </g> - </g> </> ); diff --git a/src/lib/vis/visualizations/paohvis/paohvis.stories.tsx b/src/lib/vis/visualizations/paohvis/paohvis.stories.tsx index 9e54e748c..2e42fce8b 100644 --- a/src/lib/vis/visualizations/paohvis/paohvis.stories.tsx +++ b/src/lib/vis/visualizations/paohvis/paohvis.stories.tsx @@ -1,14 +1,8 @@ -import { Meta } from '@storybook/react'; -import { graphQueryResultSlice, schemaSlice, visualizationSlice } from '../../../data-access/store'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; -import { - big2ndChamberSchemaRaw, - marieBoucherSampleSchemaRaw, - simpleSchemaAirportRaw, - mockData, - recommendationsWithAttributesRaw, -} from '../../../mock-data'; +import { graphQueryResultSlice, schemaSlice, visualizationSlice } from '../../../data-access/store'; +import { marieBoucherSampleSchemaRaw, mockData, recommendationsWithAttributesRaw, simpleSchemaAirportRaw } from '../../../mock-data'; import PaohVisComponent from './paohvis'; const Mockstore = configureStore({ diff --git a/src/lib/vis/visualizations/paohvis/paohvis.tsx b/src/lib/vis/visualizations/paohvis/paohvis.tsx index c8d86b1aa..08d957248 100644 --- a/src/lib/vis/visualizations/paohvis/paohvis.tsx +++ b/src/lib/vis/visualizations/paohvis/paohvis.tsx @@ -1,23 +1,23 @@ -import React, { useEffect, useRef, useState, useMemo, forwardRef, useImperativeHandle } from 'react'; -import { PaohvisDataPaginated, RowInformation, LinesHyperEdges } from './types'; +import React, { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'; +import { LinesHyperEdges, PaohvisDataPaginated, RowInformation } from './types'; import { parseQueryResult } from './utils/dataProcessing'; -import { RowLabels } from './components/RowLabels'; import { HyperEdgeRangesBlock } from './components/HyperRangeBlock'; +import { RowLabels } from './components/RowLabels'; -import { sortRowInformation, sortIndices, intersectionElements } from './utils/utils'; import { select, selectAll } from 'd3'; +import { intersectionElements, sortIndices, sortRowInformation } from './utils/utils'; -import { SettingsContainer } from '@/lib/vis/components/config'; -import { Input } from '@/lib/components/inputs'; -import { VisualizationPropTypes, VISComponentType, VisualizationSettingsPropTypes } from '../../common'; +import { Accordion, AccordionBody, AccordionHead, AccordionItem } from '@/lib/components/accordion'; import { Button } from '@/lib/components/buttons'; +import { Input } from '@/lib/components/inputs'; import { EntityPill } from '@/lib/components/pills/Pill'; -import { cloneDeep } from 'lodash-es'; -import { useImmer } from 'use-immer'; -import { Accordion, AccordionBody, AccordionHead, AccordionItem } from '@/lib/components/accordion'; +import { SettingsContainer } from '@/lib/vis/components/config'; import html2canvas from 'html2canvas'; +import { cloneDeep } from 'lodash-es'; import { NodeQueryResult } from 'ts-common'; +import { useImmer } from 'use-immer'; +import { VISComponentType, VisualizationPropTypes, VisualizationSettingsPropTypes } from '../../common'; export interface PaohVisHandle { exportImageInternal: () => void; diff --git a/src/lib/vis/visualizations/paohvis/types.ts b/src/lib/vis/visualizations/paohvis/types.ts index 20c0ddc18..8cc0b3b02 100644 --- a/src/lib/vis/visualizations/paohvis/types.ts +++ b/src/lib/vis/visualizations/paohvis/types.ts @@ -3,7 +3,7 @@ * Utrecht University within the Software Project course. * © Copyright Utrecht University (Department of Information and Computing Sciences) */ -import { EdgeQueryResult, NodeQueryResult, NodeAttributes } from '@/lib/data-access/store/graphQueryResultSlice'; +import { EdgeQueryResult, NodeAttributes, NodeQueryResult } from 'ts-common'; /** The data that is needed to make the complete Paohvis table. */ export type PaohvisData = { diff --git a/src/lib/vis/visualizations/paohvis/utils/AttributesFilterUseCase.tsx b/src/lib/vis/visualizations/paohvis/utils/AttributesFilterUseCase.tsx index ace875b1d..0b9764355 100644 --- a/src/lib/vis/visualizations/paohvis/utils/AttributesFilterUseCase.tsx +++ b/src/lib/vis/visualizations/paohvis/utils/AttributesFilterUseCase.tsx @@ -4,11 +4,11 @@ * © Copyright Utrecht University (Department of Information and Computing Sciences) */ -import { FilterInfo, PaohvisFilters } from '../types'; -import { AxisType, isNotInGroup } from './ResultNodeLinkParserUseCase'; -import { boolPredicates, numberPredicates, textPredicates } from '../models/FilterPredicates'; import { cloneDeep } from 'lodash-es'; import { EdgeQueryResult, NodeQueryResult } from 'ts-common'; +import { boolPredicates, numberPredicates, textPredicates } from '../models/FilterPredicates'; +import { FilterInfo, PaohvisFilters } from '../types'; +import { AxisType, isNotInGroup } from './ResultNodeLinkParserUseCase'; /** This is used to filter the data for Paohvis. */ export default class AttributeFilterUsecase { diff --git a/src/lib/vis/visualizations/paohvis/utils/dataProcessing.tsx b/src/lib/vis/visualizations/paohvis/utils/dataProcessing.tsx index 99e2827ef..b5a6a14e5 100644 --- a/src/lib/vis/visualizations/paohvis/utils/dataProcessing.tsx +++ b/src/lib/vis/visualizations/paohvis/utils/dataProcessing.tsx @@ -1,9 +1,9 @@ +import { GraphQueryResult } from '@/lib/data-access'; import { EdgeQueryResult, NodeQueryResult } from 'ts-common'; import { PaohVisProps } from '../paohvis'; -import { PaohvisData, HyperEdgeRange, HyperEdgeI } from '../types'; +import { HyperEdgeI, HyperEdgeRange, PaohvisData } from '../types'; import AttributeFilterUsecase, { getIds } from './AttributesFilterUseCase'; import { countRepetition } from './utils'; -import { GraphQueryResult } from '@/lib/data-access'; type AugmentedNode = NodeQueryResult & { reduced_ids: string[]; diff --git a/src/lib/vis/visualizations/paohvis/utils/utils.tsx b/src/lib/vis/visualizations/paohvis/utils/utils.tsx index f5d277f76..1dd6ccf70 100644 --- a/src/lib/vis/visualizations/paohvis/utils/utils.tsx +++ b/src/lib/vis/visualizations/paohvis/utils/utils.tsx @@ -1,18 +1,18 @@ -import { SchemaAttribute, SchemaGraph } from '../../../../schema'; +import { Sizes, sizesArray } from '@/lib/components/icon'; +import { group } from 'd3'; +import { MultiGraph } from 'graphology'; +import { NodeQueryResult, SchemaAttribute } from 'ts-common'; +import { SchemaGraph } from '../../../../schema'; import { AttributeNames, - EntitiesFromSchema, - RelationsFromSchema, ConnectionFromTo, - IdConnections, + Data2RenderI, + EntitiesFromSchema, GraphData, + IdConnections, + RelationsFromSchema, RowInformation, - Data2RenderI, } from '../types'; -import { MultiGraph } from 'graphology'; -import { NodeQueryResult } from '@/lib/data-access/store/graphQueryResultSlice'; -import { group } from 'd3'; -import { Sizes, sizesArray } from '@/lib/components/icon'; /** * Takes a schema result and calculates all the entity names, and relation names and attribute names per entity. diff --git a/src/lib/vis/visualizations/rawjsonvis/rawjsonvis.spec.tsx b/src/lib/vis/visualizations/rawjsonvis/rawjsonvis.spec.tsx index 338394ddb..aa7054d2c 100644 --- a/src/lib/vis/visualizations/rawjsonvis/rawjsonvis.spec.tsx +++ b/src/lib/vis/visualizations/rawjsonvis/rawjsonvis.spec.tsx @@ -1,5 +1,4 @@ -import { render } from '@testing-library/react'; -import { assert, describe, expect, it } from 'vitest'; +import { describe, expect, it } from 'vitest'; //import RawJSONVis from './rawjsonvis'; diff --git a/src/lib/vis/visualizations/rawjsonvis/rawjsonvis.stories.tsx b/src/lib/vis/visualizations/rawjsonvis/rawjsonvis.stories.tsx index 76d77a6cd..6bafd3ce5 100644 --- a/src/lib/vis/visualizations/rawjsonvis/rawjsonvis.stories.tsx +++ b/src/lib/vis/visualizations/rawjsonvis/rawjsonvis.stories.tsx @@ -1,11 +1,10 @@ -import React from 'react'; -import { Meta } from '@storybook/react'; -import { graphQueryResultSlice, schemaSlice, visualizationSlice } from '../../../data-access/store'; +import { configSlice } from '@/lib/data-access/store/configSlice'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; +import { graphQueryResultSlice, schemaSlice, visualizationSlice } from '../../../data-access/store'; import { mockData } from '../../../mock-data'; import RawJSONComponent from './rawjsonvis'; -import { configSlice } from '@/lib/data-access/store/configSlice'; const Mockstore = configureStore({ reducer: { diff --git a/src/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx b/src/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx index 7f57799ec..4f01855b1 100644 --- a/src/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx +++ b/src/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx @@ -1,10 +1,10 @@ -import React, { useState, useEffect } from 'react'; -import ReactJSONView, { ThemeKeys } from 'react-json-view'; -import { VisualizationPropTypes, VISComponentType, VisualizationSettingsPropTypes } from '../../common'; -import { SettingsContainer } from '@/lib/vis/components/config'; import { Input } from '@/lib/components/inputs'; import { useConfig } from '@/lib/data-access/store'; import { Theme } from '@/lib/data-access/store/configSlice'; +import { SettingsContainer } from '@/lib/vis/components/config'; +import React, { useEffect, useState } from 'react'; +import ReactJSONView, { ThemeKeys } from 'react-json-view'; +import { VISComponentType, VisualizationPropTypes, VisualizationSettingsPropTypes } from '../../common'; export interface RawJSONVisProps { theme: string; diff --git a/src/lib/vis/visualizations/semanticsubstratesvis/components/EdgesLayer.tsx b/src/lib/vis/visualizations/semanticsubstratesvis/components/EdgesLayer.tsx index 0eae441f6..9f21147cf 100644 --- a/src/lib/vis/visualizations/semanticsubstratesvis/components/EdgesLayer.tsx +++ b/src/lib/vis/visualizations/semanticsubstratesvis/components/EdgesLayer.tsx @@ -1,5 +1,5 @@ -import React, { useRef, useMemo } from 'react'; -import { DataConnection, VisualRegionConfig, VisualEdgesConfig, DataPoint } from './types'; +import React, { useMemo, useRef } from 'react'; +import { DataConnection, DataPoint, VisualEdgesConfig, VisualRegionConfig } from './types'; export type EdgesLayerProps = { dataConnections: DataConnection[]; diff --git a/src/lib/vis/visualizations/semanticsubstratesvis/components/Scatterplot.tsx b/src/lib/vis/visualizations/semanticsubstratesvis/components/Scatterplot.tsx index a133f2b7e..064edf678 100644 --- a/src/lib/vis/visualizations/semanticsubstratesvis/components/Scatterplot.tsx +++ b/src/lib/vis/visualizations/semanticsubstratesvis/components/Scatterplot.tsx @@ -1,27 +1,27 @@ -import React, { useEffect, useRef, useState, useMemo } from 'react'; +import { Icon } from '@/lib/components/icon'; +import { EntityPill } from '@/lib/components/pills/Pill'; import { - select, - scaleBand, + Axis, axisBottom, - scaleLinear, - forceX, - forceY, + axisLeft, brush, forceCollide, - format, - axisLeft, forceSimulation, - Axis, + forceX, + forceY, + format, NumberValue, - Selection, + scaleBand, ScaleBand, + scaleLinear, ScaleLinear, + select, + Selection, } from 'd3'; -import { VisualRegionConfig, RegionData, DataPoint, DataPointXY } from './types'; -import { calcTextWidth } from './utils'; -import { Icon } from '@/lib/components/icon'; -import { EntityPill } from '@/lib/components/pills/Pill'; +import React, { useEffect, useMemo, useRef, useState } from 'react'; import { noDataRange } from '../utils'; +import { DataPoint, DataPointXY, RegionData, VisualRegionConfig } from './types'; +import { calcTextWidth } from './utils'; export type ScatterplotProps = { data: RegionData; diff --git a/src/lib/vis/visualizations/semanticsubstratesvis/components/types.ts b/src/lib/vis/visualizations/semanticsubstratesvis/components/types.ts index 3eeabad67..007d09d49 100644 --- a/src/lib/vis/visualizations/semanticsubstratesvis/components/types.ts +++ b/src/lib/vis/visualizations/semanticsubstratesvis/components/types.ts @@ -1,4 +1,4 @@ -import { NodeAttributes } from '@/lib/data-access/store/graphQueryResultSlice'; +import { NodeAttributes } from 'ts-common'; export interface NodesGraphology { key: string; diff --git a/src/lib/vis/visualizations/semanticsubstratesvis/components/utils.ts b/src/lib/vis/visualizations/semanticsubstratesvis/components/utils.ts index 9b116909a..a6b145701 100644 --- a/src/lib/vis/visualizations/semanticsubstratesvis/components/utils.ts +++ b/src/lib/vis/visualizations/semanticsubstratesvis/components/utils.ts @@ -1,8 +1,8 @@ -import { UserSelection, RegionData, AugmentedNodeAttributes, connectionFromTo, IdConnections, edgeVisibility } from './types'; -import { extent } from 'd3'; -import { RefObject } from 'react'; import { visualizationColors } from '@/config'; +import { extent } from 'd3'; import { MultiGraph } from 'graphology'; +import { RefObject } from 'react'; +import { AugmentedNodeAttributes, connectionFromTo, edgeVisibility, IdConnections, RegionData, UserSelection } from './types'; export function findConnectionsNodes( queryIDs: string[], diff --git a/src/lib/vis/visualizations/semanticsubstratesvis/configPanel/SemSubsConfigPanel.tsx b/src/lib/vis/visualizations/semanticsubstratesvis/configPanel/SemSubsConfigPanel.tsx index 4a59fe19b..dc9a8777c 100644 --- a/src/lib/vis/visualizations/semanticsubstratesvis/configPanel/SemSubsConfigPanel.tsx +++ b/src/lib/vis/visualizations/semanticsubstratesvis/configPanel/SemSubsConfigPanel.tsx @@ -1,10 +1,10 @@ -import React, { useState, useEffect } from 'react'; +import { Input } from '@/lib/components'; import { Button } from '@/lib/components/buttons'; import { Icon } from '@/lib/components/icon'; -import { DataFromPanel, DataPanelConfig } from '../components/types'; import { EntityPillSelector } from '@/lib/components/selectors/entityPillSelector'; -import { Input } from '@/lib/components'; +import React, { useEffect, useState } from 'react'; import { CategoricalStats, GraphStatistics } from 'ts-common'; +import { DataFromPanel, DataPanelConfig } from '../components/types'; export type SemSubsConfigPanelProps = { dataFromPanel: DataFromPanel; @@ -186,7 +186,7 @@ export const SemSubsConfigPanel: React.FC<SemSubsConfigPanelProps> = ({ value={data.xAxisSelected || 'None'} disabled={!data.entitySelected} options={stateConfigPanelOptions.xAxisSelectedOptions.map(option => option || 'None')} - onChange={(option: string | number) => { + onChange={option => { onUpdateData({ xAxisSelected: String(option) }); }} /> @@ -202,7 +202,7 @@ export const SemSubsConfigPanel: React.FC<SemSubsConfigPanelProps> = ({ disabled={!data.entitySelected} value={data.yAxisSelected || 'None'} options={stateConfigPanelOptions.yAxisSelectedOptions.map(option => option || 'None')} - onChange={(option: string | number) => { + onChange={option => { onUpdateData({ yAxisSelected: String(option) }); }} /> @@ -216,7 +216,7 @@ export const SemSubsConfigPanel: React.FC<SemSubsConfigPanelProps> = ({ disabled={!data.entitySelected} value={data.attributeSelected || 'None'} options={stateConfigPanelOptions.attributeSelectedOptions.map(option => option || 'None')} - onChange={(option: string | number) => { + onChange={option => { onUpdateData({ attributeSelected: String(option) }); }} /> @@ -231,7 +231,7 @@ export const SemSubsConfigPanel: React.FC<SemSubsConfigPanelProps> = ({ label="Value" value={data.attributeValueSelected || 'None'} options={stateConfigPanelOptions.attributeValueSelectedOptions.map(option => option || 'None')} - onChange={(option: string | number) => { + onChange={option => { onUpdateData({ attributeValueSelected: String(option) }); }} /> diff --git a/src/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.stories.tsx b/src/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.stories.tsx index f1c02cb5d..bcbebdedc 100644 --- a/src/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.stories.tsx +++ b/src/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.stories.tsx @@ -1,9 +1,9 @@ -import { Meta } from '@storybook/react'; -import { SemSubstrVisComponent } from './semanticsubstratesvis'; -import { graphQueryResultSlice, schemaSlice, visualizationSlice } from '../../../data-access/store'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; +import { graphQueryResultSlice, schemaSlice, visualizationSlice } from '../../../data-access/store'; import { mockData } from '../../../mock-data'; +import { SemSubstrVisComponent } from './semanticsubstratesvis'; const Mockstore = configureStore({ reducer: { diff --git a/src/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.tsx b/src/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.tsx index 8040a78bb..e0cb441de 100644 --- a/src/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.tsx +++ b/src/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.tsx @@ -1,31 +1,31 @@ -import React, { useRef, useState, useMemo, useEffect, forwardRef, useImperativeHandle } from 'react'; -import { Scatterplot, KeyedScatterplotProps } from './components/Scatterplot'; -import { SettingsContainer } from '@/lib/vis/components/config'; import { Button } from '@/lib/components/buttons'; +import { SettingsContainer } from '@/lib/vis/components/config'; import { select, selectAll } from 'd3'; -import { VisualizationPropTypes, VISComponentType, VisualizationSettingsPropTypes } from '../../common'; -import { findConnectionsNodes, getRegionData, setExtension, filterArray, getUniqueValues } from './components/utils'; +import html2canvas from 'html2canvas'; import { cloneDeep, isEqual } from 'lodash-es'; +import React, { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'; +import { VISComponentType, VisualizationPropTypes, VisualizationSettingsPropTypes } from '../../common'; +import { KeyedScatterplotProps, Scatterplot } from './components/Scatterplot'; import { - UserSelection, - RegionData, - DataPanelConfig, - AugmentedNodeAttributes, - VisualEdgesConfig, - connectionFromTo, AugmentedEdgeAttributes, - DataPoint, + AugmentedNodeAttributes, DataFromPanel, + DataPanelConfig, + DataPoint, + RegionData, + UserSelection, + VisualEdgesConfig, VisualRegionConfig, + connectionFromTo, } from './components/types'; -import html2canvas from 'html2canvas'; +import { filterArray, findConnectionsNodes, getRegionData, getUniqueValues, setExtension } from './components/utils'; -import EdgesLayer, { KeyedEdgesLayerProps } from './components/EdgesLayer'; import { MultiGraph } from 'graphology'; -import { buildGraphology, config, numColorsCategorical, marginAxis, isColorCircleFix, noDataRange } from './utils'; -import { SemSubsConfigPanel } from './configPanel'; -import { nodeColorHex } from './components/utils'; import { NodeQueryResult } from 'ts-common'; +import EdgesLayer, { KeyedEdgesLayerProps } from './components/EdgesLayer'; +import { nodeColorHex } from './components/utils'; +import { SemSubsConfigPanel } from './configPanel'; +import { buildGraphology, config, isColorCircleFix, marginAxis, noDataRange, numColorsCategorical } from './utils'; export interface VisSemanticSubstratesHandle { exportImageInternal: () => void; diff --git a/src/lib/vis/visualizations/semanticsubstratesvis/utils.ts b/src/lib/vis/visualizations/semanticsubstratesvis/utils.ts index be9c46c30..0bad406d3 100644 --- a/src/lib/vis/visualizations/semanticsubstratesvis/utils.ts +++ b/src/lib/vis/visualizations/semanticsubstratesvis/utils.ts @@ -1,7 +1,7 @@ import { visualizationColors } from '@/config'; import { MultiGraph } from 'graphology'; +import { NodeQueryResult } from 'ts-common'; import { GraphData } from './components/types'; -import { NodeQueryResult } from '@/lib/data-access/store/graphQueryResultSlice'; export const noDataRange = [-1, 1]; export const noSelection = 'None'; @@ -77,4 +77,4 @@ if (isColorCircleFix) { const marginAxis = 0.2; -export { buildGraphology, numColorsCategorical, config, marginAxis }; +export { buildGraphology, config, marginAxis, numColorsCategorical }; diff --git a/src/lib/vis/visualizations/tablevis/components/Table.tsx b/src/lib/vis/visualizations/tablevis/components/Table.tsx index 231530877..55d86add1 100644 --- a/src/lib/vis/visualizations/tablevis/components/Table.tsx +++ b/src/lib/vis/visualizations/tablevis/components/Table.tsx @@ -1,8 +1,8 @@ -import React, { useState, useEffect, useRef } from 'react'; -import { Pagination } from '@/lib/components/pagination'; -import { BarPlot } from '@/lib/components/charts/barplot'; import { Icon } from '@/lib/components'; +import { BarPlot } from '@/lib/components/charts/barplot'; +import { Pagination } from '@/lib/components/pagination'; import { group } from 'd3'; +import { useEffect, useRef, useState } from 'react'; import { NodeAttributes, SchemaAttributeTypes } from 'ts-common'; export type AugmentedNodeAttributes = { attribute: NodeAttributes; type: Record<string, SchemaAttributeTypes> }; diff --git a/src/lib/vis/visualizations/tablevis/tablevis.stories.tsx b/src/lib/vis/visualizations/tablevis/tablevis.stories.tsx index 05803ab89..9f4c7b576 100644 --- a/src/lib/vis/visualizations/tablevis/tablevis.stories.tsx +++ b/src/lib/vis/visualizations/tablevis/tablevis.stories.tsx @@ -1,7 +1,7 @@ -import { Meta } from '@storybook/react'; -import { graphQueryResultSlice, schemaSlice, visualizationSlice } from '../../../data-access/store'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; +import { graphQueryResultSlice, schemaSlice, visualizationSlice } from '../../../data-access/store'; import { big2ndChamberSchemaRaw, mockData, typesMockSchemaRaw } from '../../../mock-data'; import { simpleSchemaAirportRaw } from '../../../mock-data/schema/simpleAirportRaw'; import TableComponent from './tablevis'; diff --git a/src/lib/vis/visualizations/tablevis/tablevis.tsx b/src/lib/vis/visualizations/tablevis/tablevis.tsx index 7b5e19e91..55191bc3a 100644 --- a/src/lib/vis/visualizations/tablevis/tablevis.tsx +++ b/src/lib/vis/visualizations/tablevis/tablevis.tsx @@ -6,9 +6,9 @@ import { useSearchResultData } from '@/lib/data-access'; import { SettingsContainer } from '@/lib/vis/components/config'; import html2canvas from 'html2canvas'; import React, { forwardRef, useEffect, useImperativeHandle, useMemo, useRef } from 'react'; +import styles from '../../../components/buttons/buttons.module.scss'; import { VISComponentType, VisualizationPropTypes, VisualizationSettingsPropTypes } from '../../common'; import { AugmentedNodeAttributes, Table } from './components/Table'; -import styles from '../../../components/buttons/buttons.module.scss'; export interface TableVisHandle { exportImageInternal: () => void; diff --git a/src/lib/vis/visualizations/vis0D/Vis0D.tsx b/src/lib/vis/visualizations/vis0D/Vis0D.tsx index 32143bc2a..f26cf383e 100644 --- a/src/lib/vis/visualizations/vis0D/Vis0D.tsx +++ b/src/lib/vis/visualizations/vis0D/Vis0D.tsx @@ -1,11 +1,11 @@ -import React, { useRef, useImperativeHandle, forwardRef, useEffect, useState, Fragment } from 'react'; -import { VisualizationPropTypes, VISComponentType, VisualizationSettingsPropTypes } from '../../common'; -import { SettingsContainer } from '@/lib/vis/components/config'; -import html2canvas from 'html2canvas'; +import { Button } from '@/lib/components/buttons'; import { Input } from '@/lib/components/inputs'; import { EntityPill, RelationPill } from '@/lib/components/pills/Pill'; -import { Button } from '@/lib/components/buttons'; -import { useActiveQuery, useActiveSaveState, useQuerybuilderHash } from '@/lib/data-access'; +import { useActiveQuery, useActiveSaveState } from '@/lib/data-access'; +import { SettingsContainer } from '@/lib/vis/components/config'; +import html2canvas from 'html2canvas'; +import React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react'; +import { VISComponentType, VisualizationPropTypes, VisualizationSettingsPropTypes } from '../../common'; export interface Vis0DProps { title: string; selectedEntity: string; diff --git a/src/lib/vis/visualizations/vis0D/vis0D.stories.tsx b/src/lib/vis/visualizations/vis0D/vis0D.stories.tsx index b7f4c9b28..d1915d37f 100644 --- a/src/lib/vis/visualizations/vis0D/vis0D.stories.tsx +++ b/src/lib/vis/visualizations/vis0D/vis0D.stories.tsx @@ -1,5 +1,5 @@ -import { Meta } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; import { graphQueryResultSlice, schemaSlice, visualizationSlice } from '../../../data-access/store'; import Vis0DComponent from './Vis0D'; diff --git a/src/lib/vis/visualizations/vis1D/Vis1D.tsx b/src/lib/vis/visualizations/vis1D/Vis1D.tsx index 54dbba72c..11b50ef5e 100644 --- a/src/lib/vis/visualizations/vis1D/Vis1D.tsx +++ b/src/lib/vis/visualizations/vis1D/Vis1D.tsx @@ -1,13 +1,13 @@ -import React, { useState, useRef, useMemo, useImperativeHandle, forwardRef, useEffect } from 'react'; -import { VisualizationPropTypes, VISComponentType, VisualizationSettingsPropTypes } from '../../common'; +import { Button } from '@/lib/components/buttons'; +import { Input } from '@/lib/components/inputs'; +import { EntityPill } from '@/lib/components/pills/Pill'; import { SettingsContainer } from '@/lib/vis/components/config'; import html2canvas from 'html2canvas'; +import React, { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'; +import { VISComponentType, VisualizationPropTypes, VisualizationSettingsPropTypes } from '../../common'; import { CustomChartPlotly } from './components/CustomChartPlotly'; -import { Input } from '@/lib/components/inputs'; -import { EntityPill } from '@/lib/components/pills/Pill'; -import { Button } from '@/lib/components/buttons'; -import { Vis1DVisHandle, Vis1DProps, getAttributeValues, vis1DHistogramAggregationOptions } from './model'; import { plotTypeOptions, preparePlotData } from './components/MakePlot'; +import { Vis1DProps, Vis1DVisHandle, getAttributeValues, vis1DHistogramAggregationOptions } from './model'; const defaultSettings: Vis1DProps = { plotType: 'bar', diff --git a/src/lib/vis/visualizations/vis1D/components/CustomChartPlotly.tsx b/src/lib/vis/visualizations/vis1D/components/CustomChartPlotly.tsx index 28ab5bf1b..b1629956e 100644 --- a/src/lib/vis/visualizations/vis1D/components/CustomChartPlotly.tsx +++ b/src/lib/vis/visualizations/vis1D/components/CustomChartPlotly.tsx @@ -1,4 +1,4 @@ -import React, { useRef, useEffect, useState } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import Plot from 'react-plotly.js'; import { PreparePlot } from './MakePlot'; diff --git a/src/lib/vis/visualizations/vis1D/components/MakePlot.ts b/src/lib/vis/visualizations/vis1D/components/MakePlot.ts index 6640edf24..e9ff20a42 100644 --- a/src/lib/vis/visualizations/vis1D/components/MakePlot.ts +++ b/src/lib/vis/visualizations/vis1D/components/MakePlot.ts @@ -1,4 +1,4 @@ -import { scaleQuantize, scaleOrdinal } from 'd3'; +import { scaleOrdinal, scaleQuantize } from 'd3'; import { PlotType } from 'plotly.js'; import { visualizationColors } from 'ts-common'; import { Vis1DHistogramAggregation, vis1DHistogramAggregationOptions } from '../model'; diff --git a/src/lib/vis/visualizations/vis1D/vis1D.stories.tsx b/src/lib/vis/visualizations/vis1D/vis1D.stories.tsx index 89b0750dc..5421c3201 100644 --- a/src/lib/vis/visualizations/vis1D/vis1D.stories.tsx +++ b/src/lib/vis/visualizations/vis1D/vis1D.stories.tsx @@ -1,5 +1,5 @@ -import { Meta } from '@storybook/react'; import { configureStore } from '@reduxjs/toolkit'; +import { Meta } from '@storybook/react'; import { Provider } from 'react-redux'; import { graphQueryResultSlice, schemaSlice, visualizationSlice } from '../../../data-access/store'; import Vis1DComponent from './Vis1D'; diff --git a/src/main.tsx b/src/main.tsx index 79a2d7f4c..c685661a5 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,12 +1,11 @@ -import React from 'react'; +import { ErrorBoundary } from '@/lib/components/errorBoundary'; +import { store } from '@/lib/data-access/store'; +import * as Sentry from '@sentry/react'; import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; -import { App } from './App'; -import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'; import { Provider } from 'react-redux'; -import * as Sentry from '@sentry/react'; -import { store } from '@/lib/data-access/store'; -import { ErrorBoundary } from '@/lib/components/errorBoundary'; +import { Route, BrowserRouter as Router, Routes } from 'react-router-dom'; +import { App } from './App'; import { getEnvVariable } from './config'; import './main.css'; diff --git a/tailwind.config.ts b/tailwind.config.ts index 7c5761011..61afc4e1c 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -1,14 +1,13 @@ -import type { Config } from 'tailwindcss'; -import * as defaultTheme from 'tailwindcss/defaultTheme'; +import { addDynamicIconSelectors } from '@iconify/tailwind'; import typography from '@tailwindcss/typography'; import daisyui from 'daisyui'; import daisyTheme from 'daisyui/src/theming/themes'; +import * as defaultTheme from 'tailwindcss/defaultTheme'; import { tailwindColors } from './src/config/colors'; -import { addDynamicIconSelectors } from '@iconify/tailwind'; export default { content: ['./index.html', 'src/**/*.{js,ts,jsx,tsx,mdx}', '../../libs/*/lib/**/*.{js,ts,jsx,tsx,mdx}'], - darkMode: ['class', '.dark-mode'], // setting the dark mode class is important for the dark mode to work + darkMode: ['class', '.dark-mode'], // setting the dark mode class is important for the dark mode to work theme: { borderRadius: { none: 0, diff --git a/tsconfig.app.json b/tsconfig.app.json index 2ef1d8e46..a783d5002 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -19,8 +19,8 @@ /* Linting */ "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, + "noUnusedLocals": false, + "noUnusedParameters": false, "noFallthroughCasesInSwitch": true, "noUncheckedSideEffectImports": true, diff --git a/tsconfig.node.json b/tsconfig.node.json index 687368ad1..f3cae258e 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -15,8 +15,8 @@ /* Linting */ "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, + "noUnusedLocals": false, + "noUnusedParameters": false, "noFallthroughCasesInSwitch": true, "noUncheckedSideEffectImports": true, diff --git a/vitest.config.js b/vitest.config.js index 79286a985..2b0e1b5ed 100644 --- a/vitest.config.js +++ b/vitest.config.js @@ -1,5 +1,5 @@ -import { configDefaults, defineConfig } from 'vitest/config'; import path from 'path'; +import { configDefaults, defineConfig } from 'vitest/config'; export default defineConfig({ test: { -- GitLab