Merge pull request #461 from quantified-uncertainty/show-controls

Allows hiding controls
This commit is contained in:
Sam Nolan 2022-05-02 17:44:09 -04:00 committed by GitHub
commit 74f5dbbbf0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 25 deletions

View File

@ -18,50 +18,33 @@ type DistributionChartProps = {
distribution: Distribution; distribution: Distribution;
width?: number; width?: number;
height: number; height: number;
/** Whether to show the user graph controls (scale etc) */
showControls?: boolean;
}; };
export const DistributionChart: React.FC<DistributionChartProps> = ({ export const DistributionChart: React.FC<DistributionChartProps> = ({
distribution, distribution,
height, height,
width, width,
showControls = false,
}: DistributionChartProps) => { }: DistributionChartProps) => {
let [isLogX, setLogX] = React.useState(false); let [isLogX, setLogX] = React.useState(false);
let [isExpY, setExpY] = React.useState(false); let [isExpY, setExpY] = React.useState(false);
let shape = distribution.pointSet(); let shape = distribution.pointSet();
const [sized, _] = useSize((size) => { const [sized, _] = useSize((size) => {
var disableLog = false;
if (shape.tag === "Ok") { if (shape.tag === "Ok") {
let massBelow0 = let massBelow0 =
shape.value.continuous.some((x) => x.x <= 0) || shape.value.continuous.some((x) => x.x <= 0) ||
shape.value.discrete.some((x) => x.x <= 0); shape.value.discrete.some((x) => x.x <= 0);
if (massBelow0) {
disableLog = true;
}
let spec = buildVegaSpec(isLogX, isExpY); let spec = buildVegaSpec(isLogX, isExpY);
let widthProp = width ? width - 20 : size.width - 10; let widthProp = width ? width - 20 : size.width - 10;
var result = (
<div> // Check whether we should disable the checkbox
<Vega var logCheckbox = (
spec={spec} <CheckBox label="Log X scale" value={isLogX} onChange={setLogX} />
data={{ con: shape.value.continuous, dis: shape.value.discrete }}
width={widthProp}
height={height}
actions={false}
/>
</div>
); );
} else { if (massBelow0) {
var result = ( logCheckbox = (
<ErrorBox heading="Distribution Error">
{distributionErrorToString(shape.value)}
</ErrorBox>
);
}
return (
<>
{result}
<div>
{disableLog ? (
<CheckBox <CheckBox
label="Log X scale" label="Log X scale"
value={isLogX} value={isLogX}
@ -71,13 +54,35 @@ export const DistributionChart: React.FC<DistributionChartProps> = ({
"Your distribution has mass lower than or equal to 0. Log only works on strictly positive values." "Your distribution has mass lower than or equal to 0. Log only works on strictly positive values."
} }
/> />
) : ( );
<CheckBox label="Log X scale" value={isLogX} onChange={setLogX} /> }
)}
var result = (
<div>
<Vega
spec={spec}
data={{ con: shape.value.continuous, dis: shape.value.discrete }}
width={widthProp}
height={height}
actions={false}
/>
{showControls && (
<div>
{logCheckbox}
<CheckBox label="Exp Y scale" value={isExpY} onChange={setExpY} /> <CheckBox label="Exp Y scale" value={isExpY} onChange={setExpY} />
</div> </div>
</> )}
</div>
); );
} else {
var result = (
<ErrorBox heading="Distribution Error">
{distributionErrorToString(shape.value)}
</ErrorBox>
);
}
return result;
}); });
return sized; return sized;
}; };

View File

@ -67,6 +67,8 @@ export interface SquiggleItemProps {
height: number; height: number;
/** Whether to show type information */ /** Whether to show type information */
showTypes?: boolean; showTypes?: boolean;
/** Whether to show users graph controls (scale etc) */
showControls?: boolean;
} }
const SquiggleItem: React.FC<SquiggleItemProps> = ({ const SquiggleItem: React.FC<SquiggleItemProps> = ({
@ -74,6 +76,7 @@ const SquiggleItem: React.FC<SquiggleItemProps> = ({
width, width,
height, height,
showTypes = false, showTypes = false,
showControls = false,
}: SquiggleItemProps) => { }: SquiggleItemProps) => {
switch (expression.tag) { switch (expression.tag) {
case "number": case "number":
@ -100,6 +103,7 @@ const SquiggleItem: React.FC<SquiggleItemProps> = ({
distribution={expression.value} distribution={expression.value}
height={height} height={height}
width={width} width={width}
showControls={showControls}
/> />
</VariableBox> </VariableBox>
); );
@ -185,6 +189,8 @@ export interface SquiggleChartProps {
jsImports?: jsImports; jsImports?: jsImports;
/** Whether to show type information about returns, default false */ /** Whether to show type information about returns, default false */
showTypes?: boolean; showTypes?: boolean;
/** Whether to show graph controls (scale etc)*/
showControls?: boolean;
} }
const ChartWrapper = styled.div` const ChartWrapper = styled.div`
@ -203,6 +209,7 @@ export const SquiggleChart: React.FC<SquiggleChartProps> = ({
jsImports = defaultImports, jsImports = defaultImports,
width, width,
showTypes = false, showTypes = false,
showControls = false,
}: SquiggleChartProps) => { }: SquiggleChartProps) => {
let samplingInputs: samplingParams = { let samplingInputs: samplingParams = {
sampleCount: sampleCount, sampleCount: sampleCount,
@ -224,6 +231,7 @@ export const SquiggleChart: React.FC<SquiggleChartProps> = ({
width={width} width={width}
height={height} height={height}
showTypes={showTypes} showTypes={showTypes}
showControls={showControls}
/> />
); );
} else { } else {

View File

@ -42,6 +42,8 @@ export interface SquiggleEditorProps {
jsImports?: jsImports; jsImports?: jsImports;
/** Whether to show detail about types of the returns, default false */ /** Whether to show detail about types of the returns, default false */
showTypes?: boolean; showTypes?: boolean;
/** Whether to give users access to graph controls */
showControls: boolean;
} }
const Input = styled.div` const Input = styled.div`
@ -64,6 +66,7 @@ export let SquiggleEditor: React.FC<SquiggleEditorProps> = ({
bindings = defaultBindings, bindings = defaultBindings,
jsImports = defaultImports, jsImports = defaultImports,
showTypes = false, showTypes = false,
showControls = false,
}: SquiggleEditorProps) => { }: SquiggleEditorProps) => {
let [expression, setExpression] = React.useState(initialSquiggleString); let [expression, setExpression] = React.useState(initialSquiggleString);
return ( return (
@ -91,6 +94,7 @@ export let SquiggleEditor: React.FC<SquiggleEditorProps> = ({
bindings={bindings} bindings={bindings}
jsImports={jsImports} jsImports={jsImports}
showTypes={showTypes} showTypes={showTypes}
showControls={showControls}
/> />
</div> </div>
); );
@ -149,6 +153,8 @@ export interface SquigglePartialProps {
bindings?: bindings; bindings?: bindings;
/** Variables imported from js */ /** Variables imported from js */
jsImports?: jsImports; jsImports?: jsImports;
/** Whether to give users access to graph controls */
showControls?: boolean;
} }
export let SquigglePartial: React.FC<SquigglePartialProps> = ({ export let SquigglePartial: React.FC<SquigglePartialProps> = ({