Compare commits

...

2 Commits

Author SHA1 Message Date
Sam Nolan
5c23aa12ec Add setting to editor and playground 2022-10-12 14:57:35 +11:00
Sam Nolan
387f28c1c9 Expose number precision setting 2022-10-12 14:45:08 +11:00
10 changed files with 61 additions and 3 deletions

View File

@ -46,6 +46,8 @@ export type SquiggleChartProps = {
/** Whether to show vega actions to the user, so they can copy the chart spec */ /** Whether to show vega actions to the user, so they can copy the chart spec */
distributionChartActions?: boolean; distributionChartActions?: boolean;
enableLocalSettings?: boolean; enableLocalSettings?: boolean;
/** Precision to show numbers */
numberPrecision?: number;
} & (StandaloneExecutionProps | ProjectExecutionProps); } & (StandaloneExecutionProps | ProjectExecutionProps);
// Props needed for a standalone execution // Props needed for a standalone execution
@ -121,6 +123,7 @@ export const SquiggleChart: React.FC<SquiggleChartProps> = React.memo(
height = 200, height = 200,
enableLocalSettings = false, enableLocalSettings = false,
continues = defaultContinues, continues = defaultContinues,
numberPrecision,
} = props; } = props;
const p = React.useMemo(() => { const p = React.useMemo(() => {
@ -151,6 +154,7 @@ export const SquiggleChart: React.FC<SquiggleChartProps> = React.memo(
result={valueToRender} result={valueToRender}
width={width} width={width}
height={height} height={height}
numberPrecision={numberPrecision}
distributionPlotSettings={distributionPlotSettings} distributionPlotSettings={distributionPlotSettings}
chartSettings={chartSettings} chartSettings={chartSettings}
environment={p.getEnvironment()} environment={p.getEnvironment()}

View File

@ -53,6 +53,7 @@ export const SquiggleEditor: React.FC<SquiggleEditorProps> = (props) => {
executionId = 0, executionId = 0,
width, width,
height = 200, height = 200,
numberPrecision,
enableLocalSettings = false, enableLocalSettings = false,
} = props; } = props;
@ -86,6 +87,7 @@ export const SquiggleEditor: React.FC<SquiggleEditorProps> = (props) => {
result={valueToRender} result={valueToRender}
width={width} width={width}
height={height} height={height}
numberPrecision={numberPrecision}
distributionPlotSettings={distributionPlotSettings} distributionPlotSettings={distributionPlotSettings}
chartSettings={chartSettings} chartSettings={chartSettings}
environment={environment ?? defaultEnvironment} environment={environment ?? defaultEnvironment}

View File

@ -278,6 +278,7 @@ export const SquigglePlayground: FC<PlaygroundProps> = ({
diagramStart: 0, diagramStart: 0,
diagramStop: 10, diagramStop: 10,
diagramCount: 20, diagramCount: 20,
numberPrecision: 3,
}, },
}); });
const vars = useWatch({ const vars = useWatch({
@ -332,6 +333,7 @@ export const SquigglePlayground: FC<PlaygroundProps> = ({
result={valueToRender} result={valueToRender}
environment={environment} environment={environment}
height={vars.chartHeight || 150} height={vars.chartHeight || 150}
numberPrecision={vars.numberPrecision}
distributionPlotSettings={{ distributionPlotSettings={{
showSummary: vars.showSummary ?? false, showSummary: vars.showSummary ?? false,
logX: vars.logX ?? false, logX: vars.logX ?? false,

View File

@ -68,9 +68,12 @@ export const ExpressionViewer: React.FC<Props> = ({ value, width }) => {
case SqValueTag.Number: case SqValueTag.Number:
return ( return (
<VariableBox value={value} heading="Number"> <VariableBox value={value} heading="Number">
{() => ( {(settings) => (
<div className="font-semibold text-slate-600"> <div className="font-semibold text-slate-600">
<NumberShower precision={3} number={value.value} /> <NumberShower
precision={settings.numberPrecision}
number={value.value}
/>
</div> </div>
)} )}
</VariableBox> </VariableBox>

View File

@ -38,6 +38,7 @@ const ItemSettingsModal: React.FC<
// this is a mess and should be fixed // this is a mess and should be fixed
showEditor: true, // doesn't matter showEditor: true, // doesn't matter
chartHeight: mergedSettings.height, chartHeight: mergedSettings.height,
numberPrecision: mergedSettings.numberPrecision,
showSummary: mergedSettings.distributionPlotSettings.showSummary, showSummary: mergedSettings.distributionPlotSettings.showSummary,
logX: mergedSettings.distributionPlotSettings.logX, logX: mergedSettings.distributionPlotSettings.logX,
expY: mergedSettings.distributionPlotSettings.expY, expY: mergedSettings.distributionPlotSettings.expY,

View File

@ -29,6 +29,7 @@ export const ViewerContext = React.createContext<ViewerContextShape>({
}, },
environment: defaultEnvironment, environment: defaultEnvironment,
height: 150, height: 150,
numberPrecision: 3,
}), }),
setSettings() {}, setSettings() {},
enableLocalSettings: false, enableLocalSettings: false,

View File

@ -23,6 +23,7 @@ type Props = {
/** Environment for further function executions */ /** Environment for further function executions */
environment: environment; environment: environment;
enableLocalSettings?: boolean; enableLocalSettings?: boolean;
numberPrecision?: number;
}; };
type Settings = { type Settings = {
@ -38,6 +39,7 @@ export const SquiggleViewer: React.FC<Props> = ({
distributionPlotSettings, distributionPlotSettings,
chartSettings, chartSettings,
environment, environment,
numberPrecision = 3,
enableLocalSettings = false, enableLocalSettings = false,
}) => { }) => {
// can't store settings in the state because we don't want to rerender the entire tree on every change // can't store settings in the state because we don't want to rerender the entire tree on every change
@ -74,10 +76,18 @@ export const SquiggleViewer: React.FC<Props> = ({
...(localSettings.environment || {}), ...(localSettings.environment || {}),
}, },
height: localSettings.height || height, height: localSettings.height || height,
numberPrecision: localSettings.numberPrecision || numberPrecision,
}; };
return result; return result;
}, },
[distributionPlotSettings, chartSettings, environment, height, getSettings] [
distributionPlotSettings,
chartSettings,
environment,
height,
getSettings,
numberPrecision,
]
); );
return ( return (

View File

@ -8,6 +8,7 @@ export type LocalItemSettings = {
chartSettings?: Partial<FunctionChartSettings>; chartSettings?: Partial<FunctionChartSettings>;
height?: number; height?: number;
environment?: Partial<environment>; environment?: Partial<environment>;
numberPrecision?: number;
}; };
export type MergedItemSettings = { export type MergedItemSettings = {
@ -15,6 +16,7 @@ export type MergedItemSettings = {
chartSettings: FunctionChartSettings; chartSettings: FunctionChartSettings;
height: number; height: number;
environment: environment; environment: environment;
numberPrecision: number;
}; };
export const locationAsString = (location: SqValueLocation) => export const locationAsString = (location: SqValueLocation) =>

View File

@ -21,6 +21,13 @@ export const viewSettingsSchema = yup.object({}).shape({
diagramStart: yup.number().required().positive().integer().default(0).min(0), diagramStart: yup.number().required().positive().integer().default(0).min(0),
diagramStop: yup.number().required().positive().integer().default(10).min(0), diagramStop: yup.number().required().positive().integer().default(10).min(0),
diagramCount: yup.number().required().positive().integer().default(20).min(2), diagramCount: yup.number().required().positive().integer().default(20).min(2),
numberPrecision: yup
.number()
.required()
.integer()
.positive()
.default(3)
.min(0),
}); });
type FormFields = yup.InferType<typeof viewSettingsSchema>; type FormFields = yup.InferType<typeof viewSettingsSchema>;
@ -57,6 +64,16 @@ export const ViewSettings: React.FC<{
</div> </div>
</HeadedSection> </HeadedSection>
<div className="pt-8">
<HeadedSection title="Number Display Settings">
<InputItem
name="numberPrecision"
type="number"
register={register}
label="Chart Height (in pixels)"
/>
</HeadedSection>
</div>
<div className="pt-8"> <div className="pt-8">
<HeadedSection title="Distribution Display Settings"> <HeadedSection title="Distribution Display Settings">
<div className="space-y-2"> <div className="space-y-2">

View File

@ -0,0 +1,16 @@
import { render } from "@testing-library/react";
import React from "react";
import "@testing-library/jest-dom";
import { SquiggleChart } from "../src/index";
test("Precision", async () => {
const { container: highPrecision } = render(
<SquiggleChart code={"1.25476"} numberPrecision={5} />
);
expect(highPrecision).toHaveTextContent("1.2548");
const { container: lowPrecision } = render(
<SquiggleChart code={"1.25476"} numberPrecision={2} />
);
expect(lowPrecision).toHaveTextContent("1.3");
});