diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index b3699e023145ee54f284835814870ffc0dd47707..3c254f20dfcda8bc981d86791615ae3e11763176 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -20,6 +20,7 @@ "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, + "incremental": true, "baseUrl": ".", "types": ["vite/client"], "paths": { @@ -31,7 +32,16 @@ "reselect": ["./node_modules/reselect"] } }, - "exclude": ["node_modules", "public", "dist", "build"], + "exclude": [ + "dist", + "build", + "node_modules", + "public", + "vitest.setup.ts", // excludes Vitest setup file + "tailwind.config.js", // excludes Tailwind CSS configuration file + "postcss.config.js", // excludes PostCSS configuration file + "tsconfig.tsbuildinfo" // excludes TypeScript build info file + ], "include": ["vite.config.ts", "../../libs/shared/lib/**/*", "../../libs/config/src/**/*", "src/**/*"], "files": ["vite.config.ts"], "references": [{ "path": "./tsconfig.node.json" }] diff --git a/libs/shared/lib/data-access/store/visualizationSlice.ts b/libs/shared/lib/data-access/store/visualizationSlice.ts index 2b21a8796aa66291e7be866dcf1632faa6388215..c5b1d281c4207ab828f8b45bb885db3327853f1c 100644 --- a/libs/shared/lib/data-access/store/visualizationSlice.ts +++ b/libs/shared/lib/data-access/store/visualizationSlice.ts @@ -1,6 +1,6 @@ import { createSelector, createSlice, PayloadAction } from '@reduxjs/toolkit'; import type { RootState } from './store'; -import { globalConfigSchemaTypes, localConfigSchemaType } from '../../vis/Types'; +import { globalConfigSchemaTypes, localConfigSchemaType } from '../../vis/types'; import { isEqual } from 'lodash-es'; export enum Visualizations { diff --git a/libs/shared/lib/vis/index.tsx b/libs/shared/lib/vis/index.tsx index 6cbdbd9c09955dc799f97ffabd0254b4be5fb2c0..30215155e35cf32c33604aa9fc2611059ba4481a 100644 --- a/libs/shared/lib/vis/index.tsx +++ b/libs/shared/lib/vis/index.tsx @@ -8,7 +8,7 @@ import { useVisualizationSettings, useVisualizationState, } from '@graphpolaris/shared/lib/data-access/store/hooks'; -import { localConfigPropTypes, globalConfigPropTypes, VISComponentType } from './Types'; +import { localConfigPropTypes, globalConfigPropTypes, VISComponentType } from './types'; import { MatrixVisComponent, NodeLinkComponent, PaohVisComponent, RawJSONComponent, TableComponent } from './visualizations'; // export * from './rawjsonvis'; @@ -27,60 +27,58 @@ export const Visualizations = { MatrixVis: MatrixVisComponent, }; -export const createVisualizationComponent = () => { - return () => { - const dispatch = useAppDispatch(); - const vis = useVisualizationState(); - const settings = useVisualizationSettings(); - const graphQueryResult = useGraphQueryResult(); - const schema = useSchemaGraph(); - const ml = useML(); +export const VisualizationComponent = () => { + const dispatch = useAppDispatch(); + const vis = useVisualizationState(); + const settings = useVisualizationSettings(); + const graphQueryResult = useGraphQueryResult(); + const schema = useSchemaGraph(); + const ml = useML(); - const VisualizationComponent: VISComponentType = Visualizations[vis.activeVisualization]; + const VisualizationComponent: VISComponentType = Visualizations[vis.activeVisualization]; - useEffect(() => { - if (VisualizationComponent) { - dispatch(addVisualization({ id: VisualizationComponent.displayName, settings: VisualizationComponent.localConfigSchema })); - } - }, [dispatch, VisualizationComponent]); - - if (!VisualizationComponent) { - return <div className="w-full h-full flex items-center justify-center">Visualization not found</div>; + useEffect(() => { + if (VisualizationComponent) { + dispatch(addVisualization({ id: VisualizationComponent.displayName, settings: VisualizationComponent.localConfigSchema })); } + }, [dispatch, VisualizationComponent]); + + if (!VisualizationComponent) { + return <div className="w-full h-full flex items-center justify-center">Visualization not found</div>; + } - const globalConfig: globalConfigPropTypes = - settings.general && - Object.keys(settings.general).reduce((propsObject, val) => { - return { - ...propsObject, - [val]: vis.settings.general[val].value, - }; - }, {}); + const globalConfig: globalConfigPropTypes = + settings.general && + Object.keys(settings.general).reduce((propsObject, val) => { + return { + ...propsObject, + [val]: vis.settings.general[val].value, + }; + }, {}); - const displayName = vis.activeVisualization as keyof typeof Visualizations; + const displayName = vis.activeVisualization as keyof typeof Visualizations; - const localConfig: localConfigPropTypes<typeof displayName> = - settings[vis.activeVisualization] && - (Object.keys(settings[vis.activeVisualization]).reduce((propsObject, val) => { - return { - ...propsObject, - [val]: vis.settings[vis.activeVisualization][val].value, - }; - }, {}) as localConfigPropTypes<typeof displayName>); + const localConfig: localConfigPropTypes<typeof displayName> = + settings[vis.activeVisualization] && + (Object.keys(settings[vis.activeVisualization]).reduce((propsObject, val) => { + return { + ...propsObject, + [val]: vis.settings[vis.activeVisualization][val].value, + }; + }, {}) as localConfigPropTypes<typeof displayName>); - return ( - localConfig && ( - <div className="w-full h-full"> - <VisualizationComponent.VIS - data={graphQueryResult} - schema={schema} - ml={ml} - dispatch={dispatch} - globalConfig={globalConfig} - localConfig={localConfig} - /> - </div> - ) - ); - }; + return ( + localConfig && ( + <div className="w-full h-full"> + <VisualizationComponent.VIS + data={graphQueryResult} + schema={schema} + ml={ml} + dispatch={dispatch} + globalConfig={globalConfig} + localConfig={localConfig} + /> + </div> + ) + ); }; diff --git a/libs/shared/lib/vis/panel/dialog.tsx b/libs/shared/lib/vis/panel/dialog.tsx index f2559879d11734bb4069627fcb39d85c1b477518..5902931be45b358bd6b4eeeeb90371be6997fb9c 100644 --- a/libs/shared/lib/vis/panel/dialog.tsx +++ b/libs/shared/lib/vis/panel/dialog.tsx @@ -4,7 +4,7 @@ import { DialogProps } from '@graphpolaris/shared/lib/components/Dialog'; import { useAppDispatch, useVisualizationState } from '@graphpolaris/shared/lib/data-access'; import { updateGeneralSettings, updateVisualizationSettings } from '@graphpolaris/shared/lib/data-access/store/visualizationSlice'; import Input from '@graphpolaris/shared/lib/components/inputs'; -import { globalConfigSchemaTypes, localConfigSchemaType } from '@graphpolaris/shared/lib/vis/Types'; +import { globalConfigSchemaTypes, localConfigSchemaType } from '@graphpolaris/shared/lib/vis/types'; export default function VisualizationDialog(props: DialogProps) { const dispatch = useAppDispatch(); @@ -24,7 +24,7 @@ export default function VisualizationDialog(props: DialogProps) { updateVisualizationSettings({ id: vis.activeVisualization, settings: settingsSpecific, - }) + }), ); } }, [settingsSpecific]); diff --git a/libs/shared/lib/vis/panel/visualization.tsx b/libs/shared/lib/vis/panel/visualization.tsx index 6457f891e207941032f2b52e1343108518a405a5..504d09ddc800d18aeecd0619479dff49eac78b96 100644 --- a/libs/shared/lib/vis/panel/visualization.tsx +++ b/libs/shared/lib/vis/panel/visualization.tsx @@ -5,7 +5,7 @@ import { Visualizations, setActiveVisualization } from '@graphpolaris/shared/lib import { DropdownItem, DropdownItemContainer } from '@graphpolaris/shared/lib/components/dropdowns'; import ControlContainer from '@graphpolaris/shared/lib/components/controls'; import { Button } from '@graphpolaris/shared/lib/components/buttons'; -import { createVisualizationComponent } from '../'; +import { VisualizationComponent } from '../'; import VisualizationDialog from './dialog'; export const VisualizationPanel = () => { @@ -16,9 +16,6 @@ export const VisualizationPanel = () => { const [visDropdownOpen, setVisDropdownOpen] = useState<boolean>(false); const [showVisSettings, setShowVisSettings] = useState<boolean>(false); - const createVisComponent = createVisualizationComponent(); - const visualizationInstance = createVisComponent(); - return ( <div className="vis-panel h-full w-full overflow-y-auto" style={graphQueryResult.nodes.length === 0 ? { overflow: 'hidden' } : {}}> <VisualizationDialog open={showVisSettings} onClose={() => setShowVisSettings(false)} /> @@ -70,7 +67,9 @@ export const VisualizationPanel = () => { {query.nodes.length > 0 ? <p>Query resulted in empty dataset</p> : <p>Query for data to visualize</p>} </div> ) : ( - <div className="w-full h-full">{visualizationInstance}</div> + <div className="w-full h-full"> + <VisualizationComponent /> + </div> )} </div> ); diff --git a/libs/shared/lib/vis/Types.tsx b/libs/shared/lib/vis/types.ts similarity index 84% rename from libs/shared/lib/vis/Types.tsx rename to libs/shared/lib/vis/types.ts index 4c66c45b7920a3cc7c095fcc9704e91a336ce994..ef3523875ffe9b3ca2b2d0c423503bec4d8a6616 100644 --- a/libs/shared/lib/vis/Types.tsx +++ b/libs/shared/lib/vis/types.ts @@ -24,18 +24,18 @@ export type localConfigSchemaType = { export type localConfigPropTypes<T extends keyof typeof Visualizations> = T extends 'TableVis' ? TableProps : T extends 'PaohVis' - ? PaohVisProps - : T extends 'RawJSONVis' - ? RawJSONVisProps - : T extends 'SemanticSubstrates' - ? SemanticSubstratesProps - : T extends 'NodeLinkVis' - ? NodeLinkProps - : never; + ? PaohVisProps + : T extends 'RawJSONVis' + ? RawJSONVisProps + : T extends 'SemanticSubstrates' + ? SemanticSubstratesProps + : T extends 'NodeLinkVis' + ? NodeLinkProps + : never; export type VISComponentType = { displayName: string; - VIS: FC<any>; + VIS: any; localConfigSchema: localConfigSchemaType; }; diff --git a/libs/shared/lib/vis/visualizations/mapvis/mapvis.tsx b/libs/shared/lib/vis/visualizations/mapvis/mapvis.tsx index 4a49bb17f7679f65b15709a66525fa06f4cde83d..65dd5a40bb6f4d8b655dc409cc831ff6d74ea0e1 100644 --- a/libs/shared/lib/vis/visualizations/mapvis/mapvis.tsx +++ b/libs/shared/lib/vis/visualizations/mapvis/mapvis.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { MapPanel, LayerPanel } from './components'; import GraphModel from './graphModel'; import { GraphType, Layer } from './Types'; -import { VISComponentType, VisualizationPropTypes, localConfigSchemaType } from '../../Types'; +import { VISComponentType, VisualizationPropTypes, localConfigSchemaType } from '../../types'; export type MapProps = {}; diff --git a/libs/shared/lib/vis/visualizations/matrix/components/MatrixPixi.tsx b/libs/shared/lib/vis/visualizations/matrix/components/MatrixPixi.tsx index 772898d3c0d12499e28bf878ac7f31d75971f194..4ed2df8868f9bcf76f87614567b70feedf1ddf1d 100644 --- a/libs/shared/lib/vis/visualizations/matrix/components/MatrixPixi.tsx +++ b/libs/shared/lib/vis/visualizations/matrix/components/MatrixPixi.tsx @@ -23,7 +23,7 @@ import { NLPopup } from './MatrixPopup'; import { Actions, Interpolations } from 'pixi-actions'; import Color from 'color'; -import { localConfigSchemaType } from '../../../Types'; +import { localConfigSchemaType } from '../../../types'; import { createColumn } from './ColumnGraphicsComponent'; import { ReorderingManager } from './ReorderingManager'; import { TextLabel } from './TextLabel'; @@ -161,7 +161,7 @@ export const MatrixPixi = (props: Props) => { function onButtonDown(event: FederatedPointerEvent) { console.log( - event.currentTarget + event.currentTarget, // graph.nodes.find((node) => node.id === event.currentTarget.name) ); } @@ -247,7 +247,7 @@ export const MatrixPixi = (props: Props) => { if (columnTextPositions.length !== columnPositions.length) throw new Error( - 'columnTextPositions and columnPositions have different length ' + columnTextPositions.length + ' / ' + columnPositions.length + 'columnTextPositions and columnPositions have different length ' + columnTextPositions.length + ' / ' + columnPositions.length, ); for (let i = 0; i < columns.length; i++) { @@ -273,7 +273,7 @@ export const MatrixPixi = (props: Props) => { rowOrder: string[], colorScale: any, cellWidth: number, - cellHeight: number + cellHeight: number, ) => { const rows = rowsLabelLayer.children; let rowPositions: Point[] = []; @@ -323,11 +323,14 @@ export const MatrixPixi = (props: Props) => { viewport.current.addChild(columnLayer); - const groupByType = props.graph.nodes.reduce((group: any, node: Node) => { - if (!group[node.label]) group[node.label] = []; - group[node.label].push(node); - return group; - }, {} as { [key: string]: Node[] }); + const groupByType = props.graph.nodes.reduce( + (group: any, node: Node) => { + if (!group[node.label]) group[node.label] = []; + group[node.label].push(node); + return group; + }, + {} as { [key: string]: Node[] }, + ); // order groupByType by size const ordered = Object.entries(groupByType).sort((a: any[], b: any[]) => b[1].length - a[1].length); @@ -565,7 +568,7 @@ export const MatrixPixi = (props: Props) => { oneColumn.alpha = 0; Actions.sequence( Actions.delay(j * 0.005 * Math.random()), - Actions.fadeIn(oneColumn, config.ANIMATION_DURATION, Interpolations.pow2out) + Actions.fadeIn(oneColumn, config.ANIMATION_DURATION, Interpolations.pow2out), ).play(); } else { oneColumn.alpha = 1; @@ -668,7 +671,7 @@ export const MatrixPixi = (props: Props) => { textLabel.alpha = 0; Actions.sequence( Actions.delay(i * 0.005 * Math.random()), - Actions.fadeIn(textLabel, config.ANIMATION_DURATION, Interpolations.pow2out) + Actions.fadeIn(textLabel, config.ANIMATION_DURATION, Interpolations.pow2out), ).play(); } else { textLabel.alpha = 1; diff --git a/libs/shared/lib/vis/visualizations/matrix/matrixvis.tsx b/libs/shared/lib/vis/visualizations/matrix/matrixvis.tsx index 8f1e9032b9948e97a6416c949921a5bc2f68fb86..5bfd89dcc74f775b02257d020d62fa26b9164b17 100644 --- a/libs/shared/lib/vis/visualizations/matrix/matrixvis.tsx +++ b/libs/shared/lib/vis/visualizations/matrix/matrixvis.tsx @@ -4,7 +4,7 @@ import { GraphQueryResult, useGraphQueryResult } from '../../../data-access/stor import { ML } from '../../../data-access/store/mlSlice'; import { LinkType, NodeType } from './Types'; import { MatrixPixi } from './components/MatrixPixi'; -import { VisualizationPropTypes, VISComponentType, localConfigSchemaType } from '../../Types'; +import { VisualizationPropTypes, VISComponentType, localConfigSchemaType } from '../../types'; interface Props { loading?: boolean; @@ -22,7 +22,7 @@ export const MatrixVis = React.memo(({ data, ml, dispatch, localConfig }: Visual useEffect(() => { if (data) { setGraph( - data + data, // parseQueryResult(graphQueryResult, ml, { // defaultX: (ref.current?.clientWidth || 1000) / 2, // defaultY: (ref.current?.clientHeight || 1000) / 2, @@ -63,3 +63,4 @@ export const MatrixVisComponent: VISComponentType = { VIS: MatrixVis, localConfigSchema: localConfigSchema, }; +export default MatrixVisComponent; diff --git a/libs/shared/lib/vis/visualizations/nodelink/nodelinkvis.tsx b/libs/shared/lib/vis/visualizations/nodelink/nodelinkvis.tsx index 827c543fd1f22e34489fb05ca9ae802c40f9aaaf..b7274128576aa480816090b2bf939e886f30781a 100644 --- a/libs/shared/lib/vis/visualizations/nodelink/nodelinkvis.tsx +++ b/libs/shared/lib/vis/visualizations/nodelink/nodelinkvis.tsx @@ -5,7 +5,7 @@ import { NLPixi } from './components/NLPixi'; import { parseQueryResult } from './components/query2NL'; import { useImmer } from 'use-immer'; import { ML, setShortestPathSource, setShortestPathTarget } from '../../../data-access/store/mlSlice'; -import { VisualizationPropTypes, VISComponentType } from '../../Types'; +import { VisualizationPropTypes, VISComponentType } from '../../types'; export interface NodeLinkProps {} @@ -45,7 +45,7 @@ export const NodeLinkVis = React.memo(({ data, ml, dispatch }: VisualizationProp parseQueryResult(data, ml, { defaultX: (ref.current?.clientWidth || 1000) / 2, defaultY: (ref.current?.clientHeight || 1000) / 2, - }) + }), ); } }, [data, ml]); diff --git a/libs/shared/lib/vis/visualizations/paohvis/paohvis.tsx b/libs/shared/lib/vis/visualizations/paohvis/paohvis.tsx index 59c6653b650ba5742aa735fab22e7f9101945416..915e793f0fb388ff87c2c1a86a4429698b3f62ad 100644 --- a/libs/shared/lib/vis/visualizations/paohvis/paohvis.tsx +++ b/libs/shared/lib/vis/visualizations/paohvis/paohvis.tsx @@ -27,7 +27,7 @@ import { HyperEdgeRange } from './components/HyperEdgesRange'; import ToPaohvisDataParserUseCase from './utils/ToPaohvisDataParserUsecase'; import MakePaohvisMenu from './components/MakePaohvisMenu'; import { RowLabelColumn } from './components/RowLabelColumn'; -import { VISComponentType } from '../../Types'; +import { VISComponentType } from '../../types'; type PaohvisViewModelState = { rowHeight: number; @@ -132,7 +132,7 @@ export const PaohVis = (props: PaohVisProps) => { entityOrRelationType: string, attribute: string, predicate: string, - compareValue: string + compareValue: string, ): void { const attributeName: string = attribute.split(':')[0]; const attributeType: string = attribute.split(':')[1]; @@ -373,7 +373,7 @@ export const PaohVis = (props: PaohVisProps) => { relationName: string, isEntityVerticalEqualToRelationFrom: boolean, chosenAttribute: Attribute, - nodeOrder: PaohvisNodeOrder + nodeOrder: PaohvisNodeOrder, ): void { setViewModel((draft) => { draft.entityVertical = entityVertical; @@ -564,7 +564,7 @@ export const PaohVis = (props: PaohVisProps) => { gapBetweenRanges={props.gapBetweenRanges} onMouseEnter={onMouseEnterHyperEdge} onMouseLeave={onMouseLeaveHyperEdge} - /> + />, ); colOffset += hyperEdgeRange.hyperEdges.length; }); diff --git a/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx b/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx index 3bfc68c491ec2bb51af804698f20a0276d791bee..a4deeeec0131a7f386e56cfe14655945c326a4cd 100644 --- a/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx +++ b/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx @@ -1,6 +1,6 @@ import React, { useEffect } from 'react'; import ReactJSONView from 'react-json-view'; -import { VisualizationPropTypes, VISComponentType } from '../../Types'; +import { VisualizationPropTypes, VISComponentType } from '../../types'; export interface RawJSONVisProps {} @@ -35,3 +35,5 @@ export const RawJSONComponent: VISComponentType = { VIS: RawJSONVis, localConfigSchema: localConfigSchema, }; + +export default RawJSONComponent; diff --git a/libs/shared/lib/vis/visualizations/table_vis/tableVis.tsx b/libs/shared/lib/vis/visualizations/table_vis/tableVis.tsx index cfa411105c83b5a3a03a03d2381bd71564cb864a..f8ca400e5965c137b61556a0d39b001f18e06e48 100644 --- a/libs/shared/lib/vis/visualizations/table_vis/tableVis.tsx +++ b/libs/shared/lib/vis/visualizations/table_vis/tableVis.tsx @@ -1,7 +1,7 @@ import React, { useMemo, useRef } from 'react'; import { Table, AugmentedNodeAttributes } from './components/Table'; import { SchemaAttribute } from '../../../schema'; -import { VisualizationPropTypes, VISComponentType, localConfigSchemaType } from '../../Types'; +import { VisualizationPropTypes, VISComponentType, localConfigSchemaType } from '../../types'; export type TableProps = { showBarplot: boolean; @@ -26,7 +26,7 @@ export const TableVis = ({ data, schema, localConfig }: VisualizationPropTypes<t type: Object.fromEntries(types.map((t) => [t.name, t.type])), }; }), - [data.nodes] + [data.nodes], ); return ( @@ -59,3 +59,4 @@ export const TableComponent: VISComponentType = { VIS: TableVis, localConfigSchema: localConfigSchema, }; +export default TableComponent; diff --git a/libs/shared/tsconfig.json b/libs/shared/tsconfig.json index 42051d2258490585640ab28d0dd68c98e7e373a5..e2ac4877f4cb9b4e9d80b082b8b6d6cbc7de47c9 100644 --- a/libs/shared/tsconfig.json +++ b/libs/shared/tsconfig.json @@ -22,6 +22,7 @@ "resolveJsonModule": true, "noEmit": true, "baseUrl": ".", + "incremental": true, "noImplicitOverride": false, "paths": { "@graphpolaris/shared/lib/*": ["./lib/*"], @@ -33,7 +34,16 @@ }, "types": ["node", "vite/client"] }, - "exclude": ["dist", "build", "node_modules"], + "exclude": [ + "dist", + "build", + "node_modules", + "public", + "vitest.setup.ts", // excludes Vitest setup file + "tailwind.config.js", // excludes Tailwind CSS configuration file + "postcss.config.js", // excludes PostCSS configuration file + "tsconfig.tsbuildinfo" // excludes TypeScript build info file + ], "include": ["src", "lib", "../../libs/config/src/**/*"], "references": [{ "path": "./tsconfig.node.json" }] }