diff --git a/src/client/components/facet_results/ApexCharts.js b/src/client/components/facet_results/ApexCharts.js index 646310369aaac51bde3acb4683696a9c6d0e0f61..77d8fe0f6c0bfcb0f3e6e9121bcf8557fdde3311 100644 --- a/src/client/components/facet_results/ApexCharts.js +++ b/src/client/components/facet_results/ApexCharts.js @@ -46,6 +46,7 @@ class ApexChart extends React.Component { this.renderChart() } this.props.fetchData({ + perspectiveID: this.props.perspectiveConfig.id, resultClass: this.state.resultClass, facetClass: this.props.facetClass, facetID: this.props.facetID, @@ -61,6 +62,7 @@ class ApexChart extends React.Component { // check if filters have changed if (this.props.pageType === 'facetResults' && prevProps.facetUpdateID !== this.props.facetUpdateID) { this.props.fetchData({ + perspectiveID: this.props.perspectiveConfig.id, resultClass: this.state.resultClass, facetClass: this.props.facetClass, facetID: this.props.facetID @@ -68,6 +70,7 @@ class ApexChart extends React.Component { } if (prevState.resultClass !== this.state.resultClass) { this.props.fetchData({ + perspectiveID: this.props.perspectiveConfig.id, resultClass: this.state.resultClass, facetClass: this.props.facetClass, facetID: this.props.facetID diff --git a/src/client/components/facet_results/ResultClassRoute.js b/src/client/components/facet_results/ResultClassRoute.js index 056c05dd353457a679dd4c65468dbe0540b4977f..f26f3c0300d0efc77b3525967aa47d00b2af4925 100644 --- a/src/client/components/facet_results/ResultClassRoute.js +++ b/src/client/components/facet_results/ResultClassRoute.js @@ -319,7 +319,8 @@ const ResultClassRoute = props => { limit, optimize, style, - layout, + fitLayout = false, + layout = null, preprocess } = resultClassConfig let networkProps = { @@ -336,9 +337,12 @@ const ResultClassRoute = props => { limit, optimize, style: networkConfig[style], - layout: networkConfig[layout], + fitLayout, preprocess: networkConfig[preprocess] } + if (layout) { + networkProps.layout = networkConfig[layout] + } if (pageType === 'facetResults') { networkProps = { ...networkProps, diff --git a/src/client/components/main_layout/MuiIcon.js b/src/client/components/main_layout/MuiIcon.js index ea5636e2a2fd6b03462435c82e5d6310cef7fce5..5a84acc3f86de4886696bca900c6787d16d2e5c1 100644 --- a/src/client/components/main_layout/MuiIcon.js +++ b/src/client/components/main_layout/MuiIcon.js @@ -14,7 +14,8 @@ import { FormatAlignJustify, ClearAll, OndemandVideo, - KeyboardVoice + KeyboardVoice, + Autorenew } from '@material-ui/icons' import has from 'lodash' @@ -34,7 +35,8 @@ const MuiIcon = props => { FormatAlignJustify: FormatAlignJustify, ClearAll: ClearAll, OndemandVideo: OndemandVideo, - KeyboardVoice: KeyboardVoice + KeyboardVoice: KeyboardVoice, + Autorenew: Autorenew } if (has(MuiIcons, props.iconName)) { const MuiIconComponent = MuiIcons[props.iconName] diff --git a/src/client/library_configs/Cytoscape.js/NetworkConfig.js b/src/client/library_configs/Cytoscape.js/NetworkConfig.js index e804afd8d9e1fd844d57742dc90097f768fe7dee..d3044ad96869bdb24d93743b4e55eeebf7d3309f 100644 --- a/src/client/library_configs/Cytoscape.js/NetworkConfig.js +++ b/src/client/library_configs/Cytoscape.js/NetworkConfig.js @@ -1,3 +1,9 @@ +const maxEdgeWidth = 8 + +const constrainWidth = width => { + return (width ? (width < maxEdgeWidth ? width : maxEdgeWidth) : 1) +} + // https://js.cytoscape.org/#style export const cytoscapeStyle = [ { @@ -52,40 +58,143 @@ export const coseLayout = { minTemp: 1.0 } +// preprocess by pagerank export const preprocess = elements => { - const vals = elements.edges.map(ele => ele.data.weight) - const valmax = Math.max(...vals) - const valmin = Math.min(...vals) - const wmax = 6.0 - const wmin = 1.0 - const a = (wmax - wmin) / (valmax - valmin) - const b = wmin - valmin * (wmax - wmin) / (valmax - valmin) - elements.edges.forEach((ele, i) => { ele.data.weight = vals[i] * a + b }) + // edges + let arr = elements.edges.map(ele => ele.data.weight) + + // edge width + let res = (new ValueScaler(1.0, maxEdgeWidth)).fitTransform(arr) + elements.edges.forEach((ele, i) => { ele.data.weight = res[i] }) + + // console.log(elements.nodes) + // nodes + arr = elements.nodes.map(ele => ele.data.pagerank) + + // node size + res = (new ColorScaler('6px', '24px')).fitTransform(arr) + elements.nodes.forEach((ele, i) => { ele.data.size = res[i] }) + + // label size + res = (new ValueScaler(8, 12)).fitTransform(arr) + elements.nodes.forEach((ele, i) => { ele.data.font_size = res[i] }) + + elements.nodes.forEach(ele => { + if (ele.data.distance === 0) { + ele.data.size = '16px' + ele.data.color = 'black' + ele.data.font_size = 12.0 + // console.log('Found') + } + }) } -export const preprocessPeopleNetwork = elements => { +// preprocessRelationNetwork +export const preprocessRelationNetwork = elements => { preprocess(elements) // nodes const arr = elements.nodes.map(ele => ele.data.distance) // node size - let res = (new ColorScaler('26px', '12px')).fitTransform(arr) + let res = (new ColorScaler('24px', '6px')).fitTransform(arr) elements.nodes.forEach((ele, i) => { ele.data.size = res[i] }) // label size res = (new ValueScaler(12, 8)).fitTransform(arr) elements.nodes.forEach((ele, i) => { ele.data.font_size = res[i] }) +} + +// preprocess for person/connections +export const preprocessConnections = elements => { + // edges + let arr = elements.edges.map(ele => ele.data.weight) + + // edge width + let res = (new ValueScaler(1.0, 4.0)).fitTransform(arr) + elements.edges.forEach((ele, i) => { ele.data.weight = res[i] }) + + const maxlength = 60 + elements.edges.forEach(ele => { + const st = ele.data.prefLabel + ele.data.prefLabel = st.length > maxlength ? st.substring(0, maxlength - 3) + '...' : st + }) + // nodes by distance to ego + arr = elements.nodes.map(ele => ele.data.distance) + + // node size + res = (new ColorScaler('24px', '6px')).fitTransform(arr) + elements.nodes.forEach((ele, i) => { ele.data.size = res[i] }) - // node color - // res = (new ColorScaler('rgb(255, 0, 0)', 'rgb(0, 0, 255)')).fitTransform(arr) - // elements.nodes.forEach((ele, i) => { ele.data.color = res[i] }) + // label size + res = (new ValueScaler(12, 8)).fitTransform(arr) + elements.nodes.forEach((ele, i) => { ele.data.font_size = res[i] }) + + elements.nodes.forEach(ele => { ele.data.color = (ele.data.distance < 1) ? 'red' : 'blue' }) + + elements.nodes.forEach(ele => { + if (ele.data.distance === 0) { + ele.data.size = '16px' + ele.data.color = 'black' + ele.data.font_size = 12.0 + // console.log('Found') + } + }) } -const maxEdgeWidth = 8 +// preprocess by ego node distance +export const preprocessDistance = elements => { + // edges + let arr = elements.edges.map(ele => ele.data.weight) -const constrainWidth = width => { - return (width ? (width < maxEdgeWidth ? width : maxEdgeWidth) : 1) + // edge width + let res = (new ValueScaler(1.0, maxEdgeWidth)).fitTransform(arr) + elements.edges.forEach((ele, i) => { ele.data.weight = res[i] }) + + // console.log(elements.nodes) + // nodes + arr = elements.nodes.map(ele => ele.data.distance) + + // node size + res = (new ColorScaler('24px', '6px')).fitTransform(arr) + elements.nodes.forEach((ele, i) => { ele.data.size = res[i] }) + + // label size + res = (new ValueScaler(16, 8)).fitTransform(arr) + elements.nodes.forEach((ele, i) => { ele.data.font_size = res[i] }) +} + +export const preprocessPointCloud = elements => { + const nodes = elements.nodes.map(ob => { + return { + data: ob.data, + position: { + x: 360 * parseFloat(ob.data.x), + y: 360 * parseFloat(ob.data.y) + } + } + }) + elements.nodes = nodes + elements.edges = [] +} + +export const preprocessFamilytree = elements => { + // console.log(elements.nodes) + const nodes = elements.nodes.map(ob => { + if (ob.data.distance === 0) { + ob.data.size = '24px' + ob.data.color = 'black' + // console.log('Found') + } + return { + data: ob.data, + position: { + x: 800 * parseFloat(ob.data.x), + y: 600 * parseFloat(ob.data.y) + } + } + }) + elements.nodes = nodes } class ValueScaler {