diff --git a/src/js/components/DataTypes/Object.js b/src/js/components/DataTypes/Object.js index 4c7cb93f..06cc3c17 100644 --- a/src/js/components/DataTypes/Object.js +++ b/src/js/components/DataTypes/Object.js @@ -8,6 +8,7 @@ import { JsonObject } from './DataTypes'; import VariableEditor from './../VariableEditor'; import VariableMeta from './../VariableMeta'; import ArrayGroup from './../ArrayGroup'; +import OptimizedArrayGroup from './../OptimizedArrayGroup'; import ObjectName from './../ObjectName'; //attribute store @@ -280,7 +281,8 @@ class RjvObject extends React.PureComponent { groupArraysAfterLength && variable.value.length > groupArraysAfterLength ) { - ObjectComponent = ArrayGroup; + if(props.useOptimizedArray) ObjectComponent = OptimizedArrayGroup; + else ObjectComponent = ArrayGroup; } elements.push( diff --git a/src/js/components/JsonViewer.js b/src/js/components/JsonViewer.js index 5c0278f8..d49570e9 100644 --- a/src/js/components/JsonViewer.js +++ b/src/js/components/JsonViewer.js @@ -1,6 +1,7 @@ import React from 'react'; import JsonObject from './DataTypes/Object'; import ArrayGroup from './ArrayGroup'; +import OptimizedArrayGroup from './OptimizedArrayGroup'; export default class extends React.PureComponent { render = () => { @@ -13,7 +14,8 @@ export default class extends React.PureComponent { props.groupArraysAfterLength && props.src.length > props.groupArraysAfterLength ) { - ObjectComponent = ArrayGroup; + if(props.useOptimizedArray) ObjectComponent = OptimizedArrayGroup; + else ObjectComponent = ArrayGroup; } return ( diff --git a/src/js/components/OptimizedArrayGroup/ArraySubGroup.js b/src/js/components/OptimizedArrayGroup/ArraySubGroup.js new file mode 100644 index 00000000..76947e61 --- /dev/null +++ b/src/js/components/OptimizedArrayGroup/ArraySubGroup.js @@ -0,0 +1,127 @@ +import React from 'react'; + +import { CollapsedArray } from './CollapsedArray'; +import { getArrayGroupState } from './utils'; +import ObjectComponent from '../DataTypes/Object'; +import Theme from '../../themes/getStyle'; + +export class ArraySubGroup extends React.Component { + + constructor(props) { + super(props); + const { height, src, start, expandFirstGroup } = props; + + this.size = Math.pow(10, height); + const groups = Math.ceil(src.length/this.size); + + this.state = { + expanded: [...getArrayGroupState( + start, + expandFirstGroup, + groups, + )] + }; + } + + shouldComponentUpdate(nextProps, nextState) { + if(nextProps.expanded || this.props.expanded) + return true; + + if( + nextProps.start !== this.props.start || + nextProps.src?.length !== this.props.src?.length + ) + return true; + + return false; + } + + render() { + const { + theme, + expanded: parentExpanded, + getExpandedIcon, + toggleCollapsed: toggleParentCollapsed, + src, + height, + namespace, + name, + start, + expandFirstGroup, + rest, + } = this.props + + const toggleCollapsed = i => { + this.setState(prevState => { + const newExpanded = [...prevState.expanded] + newExpanded[i] = !newExpanded[i] + + return { + expanded: newExpanded + }; + }) + } + + return +
+ +
+ {getExpandedIcon(parentExpanded)} +
+ { parentExpanded ? ( + height < 1 ? ( + + ) : this.state.expanded.map((isExpanded, i) => { + const groupStart = i * this.size + + return toggleCollapsed(i)} + rest={rest} + theme={theme} + getExpandedIcon={getExpandedIcon} + namespace={namespace} + expandFirstGroup={expandFirstGroup} + /> + }) + ) : ( + + )} +
+
+ +
+ } +} \ No newline at end of file diff --git a/src/js/components/OptimizedArrayGroup/CollapsedArray.js b/src/js/components/OptimizedArrayGroup/CollapsedArray.js new file mode 100644 index 00000000..08d8d924 --- /dev/null +++ b/src/js/components/OptimizedArrayGroup/CollapsedArray.js @@ -0,0 +1,33 @@ +import React from "react"; + +import Theme from '../../themes/getStyle'; + +export const CollapsedArray = props => { + + const { theme, start, end, onClick } = props; + + return + [ +
+ + {start} + {' - '} + {end} + +
+ ] +
+} \ No newline at end of file diff --git a/src/js/components/OptimizedArrayGroup/index.js b/src/js/components/OptimizedArrayGroup/index.js new file mode 100644 index 00000000..1cdb63f6 --- /dev/null +++ b/src/js/components/OptimizedArrayGroup/index.js @@ -0,0 +1,90 @@ +import React from 'react'; + +import { ArraySubGroup } from './ArraySubGroup' +import VariableMeta from '../VariableMeta'; +import ObjectName from '../ObjectName'; +import Theme from '../../themes/getStyle'; + + +//icons +import { CollapsedIcon, ExpandedIcon } from '../ToggleIcons'; + +//single indent is 5px +const SINGLE_INDENT = 5; + +export default class extends React.PureComponent { + constructor(props) { + super(props); + this.state = { + expanded: !!this.props.expandFirstGroup + }; + } + + toggleCollapsed = () => { + this.setState((prevValue) => { + return { + expanded: !prevValue.expanded + } + }); + } + + getExpandedIcon = (expanded) => { + const { theme, iconStyle } = this.props; + + if (expanded) { + return ; + } + + return ; + } + + render() { + const { + src, + groupArraysAfterLength, + depth, + name, + theme, + jsvRoot, + namespace, + parent_type, + expandFirstGroup, + ...rest + } = this.props; + + let object_padding_left = 0; + + if (!jsvRoot) { + object_padding_left = this.props.indentWidth * SINGLE_INDENT; + } + + const groupingLevels = Math.floor(Math.log10(src.length)); + + return ( +
+ + + + + +
+ ); + } +} diff --git a/src/js/components/OptimizedArrayGroup/utils.js b/src/js/components/OptimizedArrayGroup/utils.js new file mode 100644 index 00000000..8552d633 --- /dev/null +++ b/src/js/components/OptimizedArrayGroup/utils.js @@ -0,0 +1,13 @@ +export function getArrayGroupState(start, expandFirstGroup, groups) { + const expandedArray = [] + for(let i=0; i < groups; i++) { + if(!i && !start && expandFirstGroup) { + expandedArray.push(true) + continue + } + + expandedArray.push(false) + } + + return expandedArray +} \ No newline at end of file